2015-08-03 07:19:11 +02:00
|
|
|
#include "commonservices.h"
|
|
|
|
#include <gpio.h>
|
|
|
|
#include <ccconfig.h>
|
|
|
|
#include <eagle_soc.h>
|
2016-08-23 08:05:07 +02:00
|
|
|
#include "esp82xxutil.h"
|
2015-08-03 07:19:11 +02:00
|
|
|
#include <DFT32.h>
|
|
|
|
#include <embeddednf.h>
|
|
|
|
#include <embeddedout.h>
|
|
|
|
|
|
|
|
extern volatile uint8_t sounddata[];
|
|
|
|
extern volatile uint16_t soundhead;
|
|
|
|
|
|
|
|
|
2018-11-30 13:01:36 +01:00
|
|
|
#define CONFIGURABLES 19 //(plus1)
|
2015-08-07 05:55:53 +02:00
|
|
|
|
|
|
|
|
|
|
|
struct SaveLoad
|
|
|
|
{
|
2018-11-30 13:01:36 +01:00
|
|
|
uint16_t configs[CONFIGURABLES];
|
|
|
|
uint16_t SaveLoadKey; //Must be 0xaa to be valid.
|
2015-08-07 05:55:53 +02:00
|
|
|
} settings;
|
2015-08-03 07:19:11 +02:00
|
|
|
|
2017-06-22 05:43:11 +02:00
|
|
|
struct CCSettings CCS;
|
|
|
|
|
2018-11-30 13:01:36 +01:00
|
|
|
uint16_t gConfigDefaults[CONFIGURABLES] = { 0, 6, 1, 2, 3, 4, 7, 4, 2, 80, 64, 12, 15, NUM_LIN_LEDS, 1, 0, 16, 0, 0 };
|
2015-08-03 07:19:11 +02:00
|
|
|
|
2018-11-18 21:27:29 +01:00
|
|
|
uint16_t * gConfigurables[CONFIGURABLES] = { &CCS.gROOT_NOTE_OFFSET, &CCS.gDFTIIR, &CCS.gFUZZ_IIR_BITS, &CCS.gFILTER_BLUR_PASSES,
|
2017-06-22 05:43:11 +02:00
|
|
|
&CCS.gSEMIBITSPERBIN, &CCS.gMAX_JUMP_DISTANCE, &CCS.gMAX_COMBINE_DISTANCE, &CCS.gAMP_1_IIR_BITS,
|
|
|
|
&CCS.gAMP_2_IIR_BITS, &CCS.gMIN_AMP_FOR_NOTE, &CCS.gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR, &CCS.gNOTE_FINAL_AMP,
|
2018-11-30 13:01:36 +01:00
|
|
|
&CCS.gNERF_NOTE_PORP, &CCS.gUSE_NUM_LIN_LEDS, &CCS.gCOLORCHORD_ACTIVE, &CCS.gCOLORCHORD_OUTPUT_DRIVER, &CCS.gINITIAL_AMP, &CCS.gLED_DRIVER_MODE, 0 };
|
2015-08-03 07:19:11 +02:00
|
|
|
|
2015-08-07 05:55:53 +02:00
|
|
|
char * gConfigurableNames[CONFIGURABLES] = { "gROOT_NOTE_OFFSET", "gDFTIIR", "gFUZZ_IIR_BITS", "gFILTER_BLUR_PASSES",
|
2015-08-03 07:19:11 +02:00
|
|
|
"gSEMIBITSPERBIN", "gMAX_JUMP_DISTANCE", "gMAX_COMBINE_DISTANCE", "gAMP_1_IIR_BITS",
|
|
|
|
"gAMP_2_IIR_BITS", "gMIN_AMP_FOR_NOTE", "gMINIMUM_AMP_FOR_NOTE_TO_DISAPPEAR", "gNOTE_FINAL_AMP",
|
2018-11-30 13:01:36 +01:00
|
|
|
"gNERF_NOTE_PORP", "gUSE_NUM_LIN_LEDS", "gCOLORCHORD_ACTIVE", "gCOLORCHORD_OUTPUT_DRIVER", "gINITIAL_AMP", "gLED_DRIVER_MODE", 0 };
|
2015-08-07 05:55:53 +02:00
|
|
|
|
|
|
|
void ICACHE_FLASH_ATTR CustomStart( )
|
|
|
|
{
|
|
|
|
int i;
|
2018-11-18 21:36:21 +01:00
|
|
|
spi_flash_read( CCCONFIG_ADDRESS, (uint32*)&settings, sizeof( settings ) );
|
2017-06-22 05:43:11 +02:00
|
|
|
if( settings.SaveLoadKey == 0xaa )
|
|
|
|
{
|
|
|
|
for( i = 0; i < CONFIGURABLES; i++ )
|
|
|
|
{
|
|
|
|
if( gConfigurables[i] )
|
|
|
|
{
|
|
|
|
*gConfigurables[i] = settings.configs[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2015-08-07 05:55:53 +02:00
|
|
|
{
|
2017-06-22 05:43:11 +02:00
|
|
|
for( i = 0; i < CONFIGURABLES; i++ )
|
2015-08-07 05:55:53 +02:00
|
|
|
{
|
2017-06-22 05:43:11 +02:00
|
|
|
if( gConfigurables[i] )
|
|
|
|
{
|
|
|
|
*gConfigurables[i] = gConfigDefaults[i];
|
|
|
|
}
|
2015-08-07 05:55:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-08-03 07:19:11 +02:00
|
|
|
|
|
|
|
int ICACHE_FLASH_ATTR CustomCommand(char * buffer, int retsize, char *pusrdata, unsigned short len)
|
|
|
|
{
|
|
|
|
char * buffend = buffer;
|
|
|
|
|
|
|
|
switch( pusrdata[1] )
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
case 'b': case 'B': //bins
|
|
|
|
{
|
|
|
|
int i;
|
2016-08-23 08:05:07 +02:00
|
|
|
int whichSel = ParamCaptureAndAdvanceInt( );
|
2015-08-03 07:19:11 +02:00
|
|
|
|
|
|
|
uint16_t * which = 0;
|
2015-08-07 05:55:53 +02:00
|
|
|
uint16_t qty = FIXBINS;
|
2015-08-03 07:19:11 +02:00
|
|
|
switch( whichSel )
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
which = embeddedbins32; break;
|
|
|
|
case 1:
|
|
|
|
which = fuzzed_bins; break;
|
|
|
|
case 2:
|
2015-08-07 05:55:53 +02:00
|
|
|
qty = FIXBPERO;
|
2015-08-03 07:19:11 +02:00
|
|
|
which = folded_bins; break;
|
|
|
|
default:
|
|
|
|
buffend += ets_sprintf( buffend, "!CB" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CB%d\t%d\t", whichSel, qty );
|
2015-08-03 07:19:11 +02:00
|
|
|
for( i = 0; i < FIXBINS; i++ )
|
|
|
|
{
|
|
|
|
uint16_t samp = which[i];
|
|
|
|
*(buffend++) = tohex1( samp>>12 );
|
|
|
|
*(buffend++) = tohex1( samp>>8 );
|
|
|
|
*(buffend++) = tohex1( samp>>4 );
|
|
|
|
*(buffend++) = tohex1( samp>>0 );
|
|
|
|
}
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-07 05:55:53 +02:00
|
|
|
case 'l': case 'L': //LEDs
|
|
|
|
{
|
|
|
|
int i, it = 0;
|
2017-06-22 05:43:11 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CL\t%d\t", USE_NUM_LIN_LEDS );
|
|
|
|
uint16_t toledsvals = USE_NUM_LIN_LEDS*3;
|
2015-08-07 05:55:53 +02:00
|
|
|
if( toledsvals > 600 ) toledsvals = 600;
|
|
|
|
for( i = 0; i < toledsvals; i++ )
|
|
|
|
{
|
|
|
|
uint8_t samp = ledOut[it++];
|
|
|
|
*(buffend++) = tohex1( samp>>4 );
|
|
|
|
*(buffend++) = tohex1( samp&0x0f );
|
|
|
|
}
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-03 07:19:11 +02:00
|
|
|
case 'm': case 'M': //Oscilloscope
|
|
|
|
{
|
|
|
|
int i, it = soundhead;
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CM\t512\t" );
|
2015-08-03 07:19:11 +02:00
|
|
|
for( i = 0; i < 512; i++ )
|
|
|
|
{
|
|
|
|
uint8_t samp = sounddata[it++];
|
|
|
|
it = it & (HPABUFFSIZE-1);
|
|
|
|
*(buffend++) = tohex1( samp>>4 );
|
|
|
|
*(buffend++) = tohex1( samp&0x0f );
|
|
|
|
}
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 'n': case 'N': //Notes
|
|
|
|
{
|
|
|
|
int i;
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CN\t%d\t", MAXNOTES );
|
2015-08-03 07:19:11 +02:00
|
|
|
for( i = 0; i < MAXNOTES; i++ )
|
|
|
|
{
|
|
|
|
uint16_t dat;
|
|
|
|
dat = note_peak_freqs[i];
|
|
|
|
*(buffend++) = tohex1( dat>>4 );
|
|
|
|
*(buffend++) = tohex1( dat>>0 );
|
|
|
|
dat = note_peak_amps[i];
|
|
|
|
*(buffend++) = tohex1( dat>>12 );
|
|
|
|
*(buffend++) = tohex1( dat>>8 );
|
|
|
|
*(buffend++) = tohex1( dat>>4 );
|
|
|
|
*(buffend++) = tohex1( dat>>0 );
|
|
|
|
dat = note_peak_amps2[i];
|
|
|
|
*(buffend++) = tohex1( dat>>12 );
|
|
|
|
*(buffend++) = tohex1( dat>>8 );
|
|
|
|
*(buffend++) = tohex1( dat>>4 );
|
|
|
|
*(buffend++) = tohex1( dat>>0 );
|
|
|
|
dat = note_jumped_to[i];
|
|
|
|
*(buffend++) = tohex1( dat>>4 );
|
|
|
|
*(buffend++) = tohex1( dat>>0 );
|
|
|
|
}
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-07 05:55:53 +02:00
|
|
|
case 's': case 'S':
|
|
|
|
{
|
|
|
|
switch (pusrdata[2] )
|
|
|
|
{
|
|
|
|
|
|
|
|
case 'd': case 'D':
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for( i = 0; i < CONFIGURABLES-1; i++ )
|
|
|
|
{
|
|
|
|
if( gConfigurables[i] )
|
|
|
|
*gConfigurables[i] = gConfigDefaults[i];
|
|
|
|
}
|
|
|
|
buffend += ets_sprintf( buffend, "CD" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 'r': case 'R':
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for( i = 0; i < CONFIGURABLES-1; i++ )
|
|
|
|
{
|
|
|
|
if( gConfigurables[i] )
|
|
|
|
*gConfigurables[i] = settings.configs[i];
|
|
|
|
}
|
|
|
|
buffend += ets_sprintf( buffend, "CSR" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 's': case 'S':
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for( i = 0; i < CONFIGURABLES-1; i++ )
|
|
|
|
{
|
|
|
|
if( gConfigurables[i] )
|
|
|
|
settings.configs[i] = *gConfigurables[i];
|
|
|
|
}
|
2017-06-22 05:55:03 +02:00
|
|
|
settings.SaveLoadKey = 0xAA;
|
2015-08-07 05:55:53 +02:00
|
|
|
|
|
|
|
EnterCritical();
|
|
|
|
ets_intr_lock();
|
2018-11-18 21:36:21 +01:00
|
|
|
spi_flash_erase_sector( CCCONFIG_ADDRESS/4096 );
|
|
|
|
spi_flash_write( CCCONFIG_ADDRESS, (uint32*)&settings, ((sizeof( settings )-1)&(~0xf))+0x10 );
|
2015-08-07 05:55:53 +02:00
|
|
|
ets_intr_unlock();
|
|
|
|
ExitCritical();
|
|
|
|
|
|
|
|
buffend += ets_sprintf( buffend, "CS" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
buffend += ets_sprintf( buffend, "!CS" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-03 07:19:11 +02:00
|
|
|
|
|
|
|
case 'v': case 'V': //ColorChord Values
|
|
|
|
{
|
|
|
|
if( pusrdata[2] == 'R' || pusrdata[2] == 'r' )
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CVR\t" );
|
2015-08-03 07:19:11 +02:00
|
|
|
|
|
|
|
i = 0;
|
|
|
|
while( gConfigurableNames[i] )
|
|
|
|
{
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "%s=%d\t", gConfigurableNames[i], *gConfigurables[i] );
|
2015-08-03 07:19:11 +02:00
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "rBASE_FREQ=%d\trDFREQ=%d\trOCTAVES=%d\trFIXBPERO=%d\trNOTERANGE=%d\trSORT_NOTES=%d\t",
|
2015-08-07 05:55:53 +02:00
|
|
|
(int)BASE_FREQ, (int)DFREQ, (int)OCTAVES, (int)FIXBPERO, (int)(NOTERANGE),(int)SORT_NOTES );
|
2016-08-23 08:05:07 +02:00
|
|
|
buffend += ets_sprintf( buffend, "rMAXNOTES=%d\trNUM_LIN_LEDS=%d\trLIN_WRAPAROUND=%d\trLIN_WRAPAROUND=%d\t",
|
2015-08-07 05:55:53 +02:00
|
|
|
(int)MAXNOTES, (int)NUM_LIN_LEDS, (int)LIN_WRAPAROUND, (int)LIN_WRAPAROUND );
|
|
|
|
|
2015-08-03 07:19:11 +02:00
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
else if( pusrdata[2] == 'W' || pusrdata[2] == 'w' )
|
|
|
|
{
|
2016-08-23 08:05:07 +02:00
|
|
|
parameters+=2;
|
|
|
|
char * name = ParamCaptureAndAdvance();
|
|
|
|
int val = ParamCaptureAndAdvanceInt();
|
|
|
|
int i = 0;
|
2016-08-23 08:07:14 +02:00
|
|
|
|
2015-08-03 07:19:11 +02:00
|
|
|
do
|
|
|
|
{
|
|
|
|
while( gConfigurableNames[i] )
|
|
|
|
{
|
2016-08-23 08:05:07 +02:00
|
|
|
if( strcmp( name, gConfigurableNames[i] ) == 0 )
|
2015-08-03 07:19:11 +02:00
|
|
|
{
|
2016-08-23 08:05:07 +02:00
|
|
|
*gConfigurables[i] = val;
|
2015-08-03 07:19:11 +02:00
|
|
|
buffend += ets_sprintf( buffend, "CVW" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
} while( 0 );
|
|
|
|
|
|
|
|
buffend += ets_sprintf( buffend, "!CV" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
buffend += ets_sprintf( buffend, "!CV" );
|
|
|
|
return buffend-buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|