diff --git a/AVR Working Controller/AVR.cpp b/AVR Working Controller/AVR.cpp index 8a1d185..269ddfc 100644 --- a/AVR Working Controller/AVR.cpp +++ b/AVR Working Controller/AVR.cpp @@ -11,6 +11,7 @@ #include #include #include "SerialPort\SerialPort.h" +#include "AVRCommandDecoder.h" enum { @@ -251,57 +252,6 @@ bool ProcessSerialReceive(void); void EnumerateComPorts(); unsigned long Hex2Dec(uint8_t *p, int dig); -// Helpers to convert status codes to text -const char *BusyToText(uint8_t val); -const char *WarnToText(uint8_t val); -const char *PlaybackToText(uint8_t val); -const char *FsToText(uint8_t val); -const char *OffMatrixDiscreteText(uint8_t val); -const char *OffMatrixDiscreteAutoText(uint8_t val); -const char *ReleaseWaitText(uint8_t val); -const char *NotTunedTunedText(uint8_t val); -const char *InputModeText(uint8_t val); -const char *PresetNumberText(uint8_t val); -const char *OSDFullShortOffText(uint8_t val); -const char *SleepTimerText(uint8_t val); -const char *InputText(uint8_t val); -const char *ZonePower(uint8_t val); -const char *VolumeDB(uint8_t val); -const char *PM10dbText(uint8_t val); -const char *M20P0dbText(uint8_t val); -const char *BalanceText(uint8_t val); -const char *ZeroTo160msText(uint8_t val); -const char *ZeroTo5msText(uint8_t val); -const char *ZeroTo30msText(uint8_t val); -const char *AutoLastText(uint8_t val); -const char *M4To0Text(uint8_t val); -const char *M5toP5Text(uint8_t val); -const char *OffAutoText(uint8_t val); -const char *MaxStdMinText(uint8_t val); -const char *VarFixText(uint8_t val); -const char *Mode1Mode2Text(uint8_t val); -const char *LSNText(uint8_t val); -const char *LLSSNText(uint8_t val); -const char *YesNoneText(uint8_t val); -const char *SwfrMainBothText(uint8_t val); -const char *LrFrNoneText(uint8_t val); -const char *CenterMainText(uint8_t val); -const char *SwfrMainText(uint8_t val); -const char *SurrMainText(uint8_t val); -const char *SixEightText(uint8_t val); -const char *CrossOverText(uint8_t val); -const char *OffDolbyDspText(uint8_t val); -const char *OffOn2OnMultiText(uint8_t val); -const char *M10P10dbText(uint8_t val); - -const char *ProgramName(uint8_t val); -const char *OffOnText(uint8_t val); -const char *FMAMText(uint8_t val); -const char *PresetLabelText(uint8_t val); -const char *MainSubAllText(uint8_t val); -const char *WhichZoneText(uint8_t val); -const char *Norm10dbDownText(uint8_t val); -const char *MainZoneBText(uint8_t val); @@ -358,6 +308,8 @@ typedef struct { Message_T TxMsg; } UserCmd_T; +// Runtime commands from the keyboard to send to the AVR +// const UserCmd_T UserCommands[] = { { 'R', "Ready", {"\x11" "000" "\x03", 5 } }, { 'P', "Power On", {"\x02" "07A1D" "\x03", 7} }, @@ -390,16 +342,6 @@ typedef struct { const char *(*fncValueToText)(uint8_t rDat); } MessageHandler_T; -void RxSystemReport( uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); -void RxWarningReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); -void RxPlaybackReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); -void RxFsReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); - -void RxPowerStatus( uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); - -void RxMasterVolStatus(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); -void RxProgramStatus(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen); - // rCmd: 2-ASCII Hex Bytes converted to uint8_t // configOffset: offset into avrStatus.config.DTxx @@ -526,80 +468,6 @@ const MessageHandler_T MessageHandlers[] = { }; -// RCMD 00 -// -void RxSystemReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - //SetData(&avrStatus.config.DT8, pMessage + 5, 2); - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "System Report: %s\n", BusyToText(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 01 -// -void RxWarningReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - //SetData(&avrStatus.config.DT8, pMessage + 5, 2); - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Warning Report: %s\n", WarnToText(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 10 -void RxPlaybackReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Playback Report: %s\n", PlaybackToText(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 11 -void RxFsReport(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Fs Report: %s\n", FsToText(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 20 -void RxPowerStatus(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - //SetData(&avrStatus.config.DT8, pMessage + 5, 2); - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Zone Power: %s\n", ZonePower(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 26 -void RxMasterVolStatus(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Vol: %s\n", VolumeDB(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} - -// RCMD 28 -void RxProgramStatus(uint8_t rCmd, uint8_t rDat, uint8_t *pMessage, uint32_t msgLen) { - (void)rCmd, pMessage, msgLen; - char buf[MAXTEXTLEN]; - sprintf_s(buf, MAXTEXTLEN, "Vol: %s\n", ProgramName(rDat)); - Console_Write(buf); - Console_ScrollBottomRegion(scrollTop, scrollBot); - //ShowAllStatusInfo(); -} int CS_KeyHit() { int h = _kbhit(); @@ -806,631 +674,6 @@ static void PCMessage(const char *msg, int len, uint8_t **src, const char * (fnc } -const char * BusyToText(uint8_t val) { - static char buf[16]; - if (val == 0) { - strcpy_s(buf, sizeof(buf), "OK"); - } else if (val == 1) { - strcpy_s(buf, sizeof(buf), "BUSY"); - } else { - sprintf_s(buf, sizeof(buf), "0x%02X ?", (unsigned char)val); - } - return buf; -} - -const char * WarnToText(uint8_t val) { - static char buf[16]; - if (val == 0) { - strcpy_s(buf, sizeof(buf), "OK"); - } else if (val == 1) { - strcpy_s(buf, sizeof(buf), "BUSY"); - } else { - sprintf_s(buf, sizeof(buf), "0x%02X ?", (unsigned char)val); - } - return buf; -} - -const char *PlaybackToText(uint8_t val) { - static char buf[60]; - const char *playbackList[] = { - /* 0 */ "6Ch Input", - /* 1 */ "Analog", - /* 2 */ "PCM", - /* 3 */ "DD (except 2/0)", - /* 4 */ "DD (2/0)", - /* 5 */ "DD Karaoke", - /* 6 */ "DD EX", - /* 7 */ "DTS", - /* 8 */ "DTS ES", - /* 9 */ "Other Digital", - /* A */ "DTS Analog Mute", - /* B */ "DTS Discrete", - /* C */ "Other than AAC 2/0", - /* D */ "AAC 2/0", - }; - if (val < sizeof(playbackList)/sizeof(playbackList[0])) - strcpy_s(buf, sizeof(buf), playbackList[val]); - else - sprintf_s(buf, sizeof(buf), "0x%04X ?", val); - return buf; -} - -const char *FsToText(uint8_t val) { - static char buf[60]; - const char *fsList[] = { - /* 0 */ "Analog", - /* 1 */ "32 kHz", - /* 2 */ "44.1 kHz", - /* 3 */ "48 kHz", - /* 4 */ "64 kHz", - /* 5 */ "88.2 kHz", - /* 6 */ "96 kHz", - /* 7 */ "unknown", - /* 8 */ "128.0 kHz unk", - /* 9 */ "176.4 kHz unk", - /* A */ "192.0 kHz unk", - }; - if (val < sizeof(fsList) / sizeof(fsList[0])) - strcpy_s(buf, sizeof(buf), fsList[val]); - else - sprintf_s(buf, sizeof(buf), "0x%04X ?", val); - return buf; -} - - - -const char * OffOnText(uint8_t val) { - static char buf[16]; - if (val == 0) { - strcpy_s(buf, sizeof(buf), "Off"); - } else if (val == 1) { - strcpy_s(buf, sizeof(buf), "On"); - } else { - sprintf_s(buf, sizeof(buf), "0x%04X ?", val); - } - return buf; -} - -const char *YesNoneText(uint8_t val) { - static const char *buf[] = { - "Yes", "None", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *OffMatrixDiscreteText(uint8_t val) { - static const char *buf[] = { - "Off", "Matrix On", "Discrete On", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *OffMatrixDiscreteAutoText(uint8_t val) { - static const char *buf[] = { - "Off", "Matrix On", "Discrete On", "Auto", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *ReleaseWaitText(uint8_t val) { - static const char *buf[] = { - "Release", "Wait", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *NotTunedTunedText(uint8_t val) { - static const char *buf[] = { - "Not Tuned", "Tuned", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *InputModeText(uint8_t val) { - static const char *buf[] = { - "Auto", "DTS", "Analog", "Analog Only", "AAC", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *SwfrMainBothText(uint8_t val) { - static const char *buf[] = { - "Subwoofer", "Main", "Both", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *LrFrNoneText(uint8_t val) { - static const char *buf[] = { - "L-R", "F-R", "None", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *CenterMainText(uint8_t val) { - static const char *buf[] = { - "Center", "Main", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *SwfrMainText(uint8_t val) { - static const char *buf[] = { - "Subwoofer", "Main", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *SurrMainText(uint8_t val) { - static const char *buf[] = { - "Surround", "Main", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *SixEightText(uint8_t val) { - static const char *buf[] = { - "6 Ch", "8 Ch", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *CrossOverText(uint8_t val) { - static char buf[16]; - static const uint8_t Hz[] = { - 40, 60, 80, 90, 100, 110, 120, 160, 200, 0 - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - sprintf_s(buf, sizeof(buf), "%d Hz", Hz[val]); - return buf; -} - -const char *OffDolbyDspText(uint8_t val) { - static const char *buf[] = { - "Off", "Dolby", "DSP" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *OffOn2OnMultiText(uint8_t val) { - static const char *buf[] = { - "Off", "On (2 Ch)", "On (Multi)" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - - -const char *Norm10dbDownText(uint8_t val) { - static const char *buf[] = { - "Normal", "-10 db", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *MainZoneBText(uint8_t val) { - static const char *buf[] = { - "Main", "Zone B", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - - -const char *FMAMText(uint8_t val) { - static const char *buf[] = { - "FM", "AM", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *AutoLastText(uint8_t val) { - static const char *buf[] = { - "Auto", "Last", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *OSDFullShortOffText(uint8_t val) { - static const char *buf[] = { - "Full", "Short", "Off", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *SleepTimerText(uint8_t val) { - static const char *buf[] = { - "120 min", "90 min", "60 min", "30 min", "Off", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *PresetLabelText(uint8_t val) { - static const char *buf[] = { - "A", "B", "C", "D", "E", "F", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *PresetNumberText(uint8_t val) { - static const char *buf[] = { - "1", "2", "3", "4", "5", "6", "7", "8", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *MainSubAllText(uint8_t val) { - static const char *buf[] = { - "Main", "Sub", "All", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *WhichZoneText(uint8_t val) { - static const char *buf[] = { - "All", "Zone 1", "Zone 2", "Zone 3", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *OffAutoText(uint8_t val) { - static const char *buf[] = { - "Off", "Auto", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *MaxStdMinText(uint8_t val) { - static const char *buf[] = { - "Max", "Std", "Min", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *VarFixText(uint8_t val) { - static const char *buf[] = { - "Var", "Fix", "Unk" - }; - if (val >= sizeof(buf)/sizeof(buf[0])) - val = sizeof(buf)/sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *LSNText(uint8_t val) { - static const char *buf[] = { - "Large", "Small", "None", "Unk" - }; - if (val >= sizeof(buf)/sizeof(buf[0])) - val = sizeof(buf)/sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *LLSSNText(uint8_t val) { - static const char *buf[] = { - "Large x 2", "Large x1", "Small x 2", "Small x 1", "None", "Unk" - }; - if (val >= sizeof(buf)/sizeof(buf[0])) - val = sizeof(buf)/sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *Mode1Mode2Text(uint8_t val) { - static const char *buf[] = { - "Mode 1", "Mode 2", "Unk" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *ZonePower(uint8_t val) { - static char buf[60]; - const char *powerList[8] = { - /* 0 */ "All Off (Main, Zone 2, Zone 3)", - /* 1 */ "All On (Main, Zone 2, Zone 3)", - /* 2 */ "Main On | Zone 2 Off | Zone 3 Off", - /* 3 */ "Main Off | Zone 2 On | Zone 3 On ", - /* 4 */ "Main On | Zone 2 On | Zone 3 Off", - /* 5 */ "Main On | Zone 2 Off | Zone 3 Off", - /* 6 */ "Main Off | Zone 2 On | Zone 3 On ", - /* 7 */ "Main Off | Zone 2 Off | Zone 3 On ", - }; - if (val < 8) - strcpy_s(buf, sizeof(buf), powerList[val]); - else - sprintf_s(buf, sizeof(buf), "0x%04X ?", val); - return buf; -} - -const char * InputText(uint8_t val) { - const char *buf[] = { - "0:Phono", "1:CD", "2:Tuner", "3:CD-R", "4:MD-Tape", "5:DVD", "6:D-TV", "7:Cable", "8:unk", - "9:VCR1", "A:VCR2", "B:unk", "C:V-Aux", "D:unk", "E:unk", "F:unk", - "6 Ch 0:Phono", "6 Ch 1:CD", "6 Ch 2:Tuner", "6 Ch 3:CD-R", "6 Ch 4:MD-Tape", "6 Ch 5:DVD", "6 Ch 6:D-TV", "6 Ch 7:Cable", "6 Ch 8:unk", - "6 Ch 9:VCR1", "6 Ch A:VCR2", "6 Ch B:unk", "6 Ch C:V-Aux", "6 Ch D:unk", "6 Ch E:unk", "6 Ch F:unk", - "unknown" - }; - if (val >= sizeof(buf) / sizeof(buf[0])) - val = sizeof(buf) / sizeof(buf[0]) - 1; - return buf[val]; -} - -const char *ProgramName(uint8_t val) { - static char returnBuf[MAXTEXTLEN] = ""; - - returnBuf[0] = '\0'; - if (val & 0x80) { - strcpy_s(returnBuf, MAXTEXTLEN, "STRAIGHT "); - } - val &= 0x7F; // Not accommodating the other variants yet - const char *nameList[] = { - "Hall A (HALL1)", - "Hall B", - "Hall C", - "unk", - "Hall C", - "Hall E", - "Live Concert (HALL2)", - "unk", - "Tokyo", - "Freiburg (CHURCH)", - "Royaumont", - "unk", - "Village Gate", - "Village Vanguard", - "The Bottom Line (JAZZ)", - "unk", - "The Roxy Theater (ROCK)", - "Warehouse Loft", - "Arena", - "unk", - "Disco", - "Party", - "Game", - "7 Ch Stereo", - "Pop/Rock (Music Video)", - "DJ", - "unk", - "unk", - "Opera", - "Pavillion", - "unk", - "unk", - "Mono Movie", - "Variety Sports", - "unk", - "unk", - "Spectacre", - "Sci - Fi", - "unk", - "unk", - "Adventure", - "General", - "unk", - "unk", - "Normal", - "Enhanced", - "unk", - "unk", - "PLII Movie", - "PLII Music", - "Neo: 6 Movie", - "Neo: 6 Music", - "STEREO A 2CH Stereo", - "STEREO B 2CH Direct Stereo" - "THX A Cinema", - "THX B Music", - }; - if (val < sizeof(nameList)) { - strcat_s(returnBuf, MAXTEXTLEN, nameList[val]); - } else { - strcpy_s(returnBuf, MAXTEXTLEN, "huh?"); - } - return returnBuf; -} - - - -// VolumeDB -// -// Convert the communication units of volume into db -// -// Piecewise -// for values 0 to 199 -// db = 0.5634 x - 112.11 -// for values 200 to 255 -// db = 0.5 x - 99.5 -// Single Linear -// db = 0.5574 x - 111.45 -// -const char *VolumeDB(uint8_t val) { - static char buf[16]; - float m, b; - - if (val < 200) { - m = 0.5634f; - b = -112.11f; - } else { - m = 0.5f; - b = -99.5f; - } - float db = m * val + b; - sprintf_s(buf, sizeof(buf), "%+5.1f db", db); - return buf; -} - -const char *PM10dbText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val < 0x14 || val > 0x3C) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = -10.0f; - float db = m * (val - 0x14) + b; - sprintf_s(buf, sizeof(buf), "%+5.1f db", db); - } - return buf; -} - -const char *M20P0dbText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val > 0x28) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = -20.0f; - float db = m * (val) + b; - sprintf_s(buf, sizeof(buf), "%+5.1f db", db); - } - return buf; -} - -const char *M10P10dbText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val < 0x14 || val > 0x3C) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = -10.0f; - float db = m * (val - 0x14) + b; - sprintf_s(buf, sizeof(buf), "%+5.1f db", db); - } - return buf; -} - -const char *BalanceText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val > 0x28) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = -20.0f; - float lcr = m * (val + b); - sprintf_s(buf, sizeof(buf), "%+3.1f L-C-R", lcr); - } - return buf; -} - -const char *M4To0Text(uint8_t val) { - static char buf[16]; - - if (val > 0x04) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - sprintf_s(buf, sizeof(buf), "%u", (int8_t)val - 4); - } - return buf; -} - -const char *M5toP5Text(uint8_t val) { - static char buf[16]; - - if (val > 0x0A) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - sprintf_s(buf, sizeof(buf), "%+d", (int8_t)val - 5); - } - return buf; -} - -const char *ZeroTo160msText(uint8_t val) { - static char buf[16]; - - if (val > 0xA0) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - sprintf_s(buf, sizeof(buf), "%u ms", val); - } - return buf; -} - -const char *ZeroTo5msText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val > 0x0A) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = 0; - float delay = m * (val + b); - sprintf_s(buf, sizeof(buf), "%+3.1f ms", delay); - } - return buf; -} -const char *ZeroTo30msText(uint8_t val) { - static char buf[16]; - float m, b; - - if (val > 0x3C) { - sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); - } else { - m = 0.5f; - b = 0; - float delay = m * (val + b); - sprintf_s(buf, sizeof(buf), "%+3.1f ms", delay); - } - return buf; -} void ShowAllStatusInfo(void) { diff --git a/AVR Working Controller/AVR.vcxproj b/AVR Working Controller/AVR.vcxproj index 8f8db47..f693c09 100644 --- a/AVR Working Controller/AVR.vcxproj +++ b/AVR Working Controller/AVR.vcxproj @@ -126,9 +126,11 @@ + + diff --git a/AVR Working Controller/AVR.vcxproj.filters b/AVR Working Controller/AVR.vcxproj.filters index 36f1f0f..5cedb8e 100644 --- a/AVR Working Controller/AVR.vcxproj.filters +++ b/AVR Working Controller/AVR.vcxproj.filters @@ -21,10 +21,16 @@ Source Files + + Source Files + Source Files + + Source Files + \ No newline at end of file diff --git a/AVR Working Controller/AVRCommandDecoder.cpp b/AVR Working Controller/AVRCommandDecoder.cpp new file mode 100644 index 0000000..b71a14c --- /dev/null +++ b/AVR Working Controller/AVRCommandDecoder.cpp @@ -0,0 +1,639 @@ + + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include "AVRCommandDecoder.h" + +// This has to be "big enough" for any of the text conversions +// +constexpr auto TEXTBUFLEN = 50; + +const char *BusyToText(uint8_t val) { + static char buf[16]; + if (val == 0) { + strcpy_s(buf, sizeof(buf), "OK"); + } else if (val == 1) { + strcpy_s(buf, sizeof(buf), "BUSY"); + } else { + sprintf_s(buf, sizeof(buf), "0x%02X ?", (unsigned char)val); + } + return buf; +} + +const char *WarnToText(uint8_t val) { + static char buf[16]; + if (val == 0) { + strcpy_s(buf, sizeof(buf), "OK"); + } else if (val == 1) { + strcpy_s(buf, sizeof(buf), "BUSY"); + } else { + sprintf_s(buf, sizeof(buf), "0x%02X ?", (unsigned char)val); + } + return buf; +} + +const char *PlaybackToText(uint8_t val) { + static char buf[60]; + const char *playbackList[] = { + /* 0 */ "6Ch Input", + /* 1 */ "Analog", + /* 2 */ "PCM", + /* 3 */ "DD (except 2/0)", + /* 4 */ "DD (2/0)", + /* 5 */ "DD Karaoke", + /* 6 */ "DD EX", + /* 7 */ "DTS", + /* 8 */ "DTS ES", + /* 9 */ "Other Digital", + /* A */ "DTS Analog Mute", + /* B */ "DTS Discrete", + /* C */ "Other than AAC 2/0", + /* D */ "AAC 2/0", + }; + if (val < sizeof(playbackList) / sizeof(playbackList[0])) + strcpy_s(buf, sizeof(buf), playbackList[val]); + else + sprintf_s(buf, sizeof(buf), "0x%04X ?", val); + return buf; +} + +const char *FsToText(uint8_t val) { + static char buf[60]; + const char *fsList[] = { + /* 0 */ "Analog", + /* 1 */ "32 kHz", + /* 2 */ "44.1 kHz", + /* 3 */ "48 kHz", + /* 4 */ "64 kHz", + /* 5 */ "88.2 kHz", + /* 6 */ "96 kHz", + /* 7 */ "unknown", + /* 8 */ "128.0 kHz unk", + /* 9 */ "176.4 kHz unk", + /* A */ "192.0 kHz unk", + }; + if (val < sizeof(fsList) / sizeof(fsList[0])) + strcpy_s(buf, sizeof(buf), fsList[val]); + else + sprintf_s(buf, sizeof(buf), "0x%04X ?", val); + return buf; +} + + + +const char *OffOnText(uint8_t val) { + static char buf[16]; + if (val == 0) { + strcpy_s(buf, sizeof(buf), "Off"); + } else if (val == 1) { + strcpy_s(buf, sizeof(buf), "On"); + } else { + sprintf_s(buf, sizeof(buf), "0x%04X ?", val); + } + return buf; +} + +const char *YesNoneText(uint8_t val) { + static const char *buf[] = { + "Yes", "None", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *OffMatrixDiscreteText(uint8_t val) { + static const char *buf[] = { + "Off", "Matrix On", "Discrete On", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *OffMatrixDiscreteAutoText(uint8_t val) { + static const char *buf[] = { + "Off", "Matrix On", "Discrete On", "Auto", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *ReleaseWaitText(uint8_t val) { + static const char *buf[] = { + "Release", "Wait", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *NotTunedTunedText(uint8_t val) { + static const char *buf[] = { + "Not Tuned", "Tuned", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *InputModeText(uint8_t val) { + static const char *buf[] = { + "Auto", "DTS", "Analog", "Analog Only", "AAC", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *SwfrMainBothText(uint8_t val) { + static const char *buf[] = { + "Subwoofer", "Main", "Both", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *LrFrNoneText(uint8_t val) { + static const char *buf[] = { + "L-R", "F-R", "None", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *CenterMainText(uint8_t val) { + static const char *buf[] = { + "Center", "Main", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *SwfrMainText(uint8_t val) { + static const char *buf[] = { + "Subwoofer", "Main", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *SurrMainText(uint8_t val) { + static const char *buf[] = { + "Surround", "Main", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *SixEightText(uint8_t val) { + static const char *buf[] = { + "6 Ch", "8 Ch", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *CrossOverText(uint8_t val) { + static char buf[16]; + static const uint8_t Hz[] = { + 40, 60, 80, 90, 100, 110, 120, 160, 200, 0 + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + sprintf_s(buf, sizeof(buf), "%d Hz", Hz[val]); + return buf; +} + +const char *OffDolbyDspText(uint8_t val) { + static const char *buf[] = { + "Off", "Dolby", "DSP" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *OffOn2OnMultiText(uint8_t val) { + static const char *buf[] = { + "Off", "On (2 Ch)", "On (Multi)" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + + +const char *Norm10dbDownText(uint8_t val) { + static const char *buf[] = { + "Normal", "-10 db", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *MainZoneBText(uint8_t val) { + static const char *buf[] = { + "Main", "Zone B", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + + +const char *FMAMText(uint8_t val) { + static const char *buf[] = { + "FM", "AM", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *AutoLastText(uint8_t val) { + static const char *buf[] = { + "Auto", "Last", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *OSDFullShortOffText(uint8_t val) { + static const char *buf[] = { + "Full", "Short", "Off", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *SleepTimerText(uint8_t val) { + static const char *buf[] = { + "120 min", "90 min", "60 min", "30 min", "Off", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *PresetLabelText(uint8_t val) { + static const char *buf[] = { + "A", "B", "C", "D", "E", "F", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *PresetNumberText(uint8_t val) { + static const char *buf[] = { + "1", "2", "3", "4", "5", "6", "7", "8", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *MainSubAllText(uint8_t val) { + static const char *buf[] = { + "Main", "Sub", "All", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *WhichZoneText(uint8_t val) { + static const char *buf[] = { + "All", "Zone 1", "Zone 2", "Zone 3", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *OffAutoText(uint8_t val) { + static const char *buf[] = { + "Off", "Auto", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *MaxStdMinText(uint8_t val) { + static const char *buf[] = { + "Max", "Std", "Min", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *VarFixText(uint8_t val) { + static const char *buf[] = { + "Var", "Fix", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *LSNText(uint8_t val) { + static const char *buf[] = { + "Large", "Small", "None", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *LLSSNText(uint8_t val) { + static const char *buf[] = { + "Large x 2", "Large x1", "Small x 2", "Small x 1", "None", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *Mode1Mode2Text(uint8_t val) { + static const char *buf[] = { + "Mode 1", "Mode 2", "Unk" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *ZonePower(uint8_t val) { + static char buf[60]; + const char *powerList[8] = { + /* 0 */ "All Off (Main, Zone 2, Zone 3)", + /* 1 */ "All On (Main, Zone 2, Zone 3)", + /* 2 */ "Main On | Zone 2 Off | Zone 3 Off", + /* 3 */ "Main Off | Zone 2 On | Zone 3 On ", + /* 4 */ "Main On | Zone 2 On | Zone 3 Off", + /* 5 */ "Main On | Zone 2 Off | Zone 3 Off", + /* 6 */ "Main Off | Zone 2 On | Zone 3 On ", + /* 7 */ "Main Off | Zone 2 Off | Zone 3 On ", + }; + if (val < 8) + strcpy_s(buf, sizeof(buf), powerList[val]); + else + sprintf_s(buf, sizeof(buf), "0x%04X ?", val); + return buf; +} + +const char *InputText(uint8_t val) { + const char *buf[] = { + "0:Phono", "1:CD", "2:Tuner", "3:CD-R", "4:MD-Tape", "5:DVD", "6:D-TV", "7:Cable", "8:unk", + "9:VCR1", "A:VCR2", "B:unk", "C:V-Aux", "D:unk", "E:unk", "F:unk", + "6 Ch 0:Phono", "6 Ch 1:CD", "6 Ch 2:Tuner", "6 Ch 3:CD-R", "6 Ch 4:MD-Tape", "6 Ch 5:DVD", "6 Ch 6:D-TV", "6 Ch 7:Cable", "6 Ch 8:unk", + "6 Ch 9:VCR1", "6 Ch A:VCR2", "6 Ch B:unk", "6 Ch C:V-Aux", "6 Ch D:unk", "6 Ch E:unk", "6 Ch F:unk", + "unknown" + }; + if (val >= sizeof(buf) / sizeof(buf[0])) + val = sizeof(buf) / sizeof(buf[0]) - 1; + return buf[val]; +} + +const char *ProgramName(uint8_t val) { + static char returnBuf[TEXTBUFLEN] = ""; + + returnBuf[0] = '\0'; + if (val & 0x80) { + strcpy_s(returnBuf, TEXTBUFLEN, "STRAIGHT "); + } + val &= 0x7F; // Not accommodating the other variants yet + const char *nameList[] = { + "Hall A (HALL1)", + "Hall B", + "Hall C", + "unk", + "Hall C", + "Hall E", + "Live Concert (HALL2)", + "unk", + "Tokyo", + "Freiburg (CHURCH)", + "Royaumont", + "unk", + "Village Gate", + "Village Vanguard", + "The Bottom Line (JAZZ)", + "unk", + "The Roxy Theater (ROCK)", + "Warehouse Loft", + "Arena", + "unk", + "Disco", + "Party", + "Game", + "7 Ch Stereo", + "Pop/Rock (Music Video)", + "DJ", + "unk", + "unk", + "Opera", + "Pavillion", + "unk", + "unk", + "Mono Movie", + "Variety Sports", + "unk", + "unk", + "Spectacre", + "Sci - Fi", + "unk", + "unk", + "Adventure", + "General", + "unk", + "unk", + "Normal", + "Enhanced", + "unk", + "unk", + "PLII Movie", + "PLII Music", + "Neo: 6 Movie", + "Neo: 6 Music", + "STEREO A 2CH Stereo", + "STEREO B 2CH Direct Stereo" + "THX A Cinema", + "THX B Music", + }; + if (val < sizeof(nameList)) { + strcat_s(returnBuf, TEXTBUFLEN, nameList[val]); + } else { + strcpy_s(returnBuf, TEXTBUFLEN, "huh?"); + } + return returnBuf; +} + + + +// VolumeDB +// +// Convert the communication units of volume into db +// +// Piecewise +// for values 0 to 199 +// db = 0.5634 x - 112.11 +// for values 200 to 255 +// db = 0.5 x - 99.5 +// Single Linear +// db = 0.5574 x - 111.45 +// +const char *VolumeDB(uint8_t val) { + static char buf[16]; + float m, b; + + if (val < 200) { + m = 0.5634f; + b = -112.11f; + } else { + m = 0.5f; + b = -99.5f; + } + float db = m * val + b; + sprintf_s(buf, sizeof(buf), "%+5.1f db", db); + return buf; +} + +const char *PM10dbText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val < 0x14 || val > 0x3C) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = -10.0f; + float db = m * (val - 0x14) + b; + sprintf_s(buf, sizeof(buf), "%+5.1f db", db); + } + return buf; +} + +const char *M20P0dbText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val > 0x28) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = -20.0f; + float db = m * (val)+b; + sprintf_s(buf, sizeof(buf), "%+5.1f db", db); + } + return buf; +} + +const char *M10P10dbText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val < 0x14 || val > 0x3C) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = -10.0f; + float db = m * (val - 0x14) + b; + sprintf_s(buf, sizeof(buf), "%+5.1f db", db); + } + return buf; +} + +const char *BalanceText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val > 0x28) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = -20.0f; + float lcr = m * (val + b); + sprintf_s(buf, sizeof(buf), "%+3.1f L-C-R", lcr); + } + return buf; +} + +const char *M4To0Text(uint8_t val) { + static char buf[16]; + + if (val > 0x04) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + sprintf_s(buf, sizeof(buf), "%u", (int8_t)val - 4); + } + return buf; +} + +const char *M5toP5Text(uint8_t val) { + static char buf[16]; + + if (val > 0x0A) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + sprintf_s(buf, sizeof(buf), "%+d", (int8_t)val - 5); + } + return buf; +} + +const char *ZeroTo160msText(uint8_t val) { + static char buf[16]; + + if (val > 0xA0) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + sprintf_s(buf, sizeof(buf), "%u ms", val); + } + return buf; +} + +const char *ZeroTo5msText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val > 0x0A) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = 0; + float delay = m * (val + b); + sprintf_s(buf, sizeof(buf), "%+3.1f ms", delay); + } + return buf; +} +const char *ZeroTo30msText(uint8_t val) { + static char buf[16]; + float m, b; + + if (val > 0x3C) { + sprintf_s(buf, sizeof(buf), "%02X OOR ?", val); + } else { + m = 0.5f; + b = 0; + float delay = m * (val + b); + sprintf_s(buf, sizeof(buf), "%+3.1f ms", delay); + } + return buf; +} diff --git a/AVR Working Controller/AVRCommandDecoder.h b/AVR Working Controller/AVRCommandDecoder.h new file mode 100644 index 0000000..e3346fc --- /dev/null +++ b/AVR Working Controller/AVRCommandDecoder.h @@ -0,0 +1,55 @@ +#pragma once + + +// Helpers to convert status codes to text +const char *BusyToText(uint8_t val); +const char *WarnToText(uint8_t val); +const char *PlaybackToText(uint8_t val); +const char *FsToText(uint8_t val); +const char *OffMatrixDiscreteText(uint8_t val); +const char *OffMatrixDiscreteAutoText(uint8_t val); +const char *ReleaseWaitText(uint8_t val); +const char *NotTunedTunedText(uint8_t val); +const char *InputModeText(uint8_t val); +const char *PresetNumberText(uint8_t val); +const char *OSDFullShortOffText(uint8_t val); +const char *SleepTimerText(uint8_t val); +const char *InputText(uint8_t val); +const char *ZonePower(uint8_t val); +const char *VolumeDB(uint8_t val); +const char *PM10dbText(uint8_t val); +const char *M20P0dbText(uint8_t val); +const char *BalanceText(uint8_t val); +const char *ZeroTo160msText(uint8_t val); +const char *ZeroTo5msText(uint8_t val); +const char *ZeroTo30msText(uint8_t val); +const char *AutoLastText(uint8_t val); +const char *M4To0Text(uint8_t val); +const char *M5toP5Text(uint8_t val); +const char *OffAutoText(uint8_t val); +const char *MaxStdMinText(uint8_t val); +const char *VarFixText(uint8_t val); +const char *Mode1Mode2Text(uint8_t val); +const char *LSNText(uint8_t val); +const char *LLSSNText(uint8_t val); +const char *YesNoneText(uint8_t val); +const char *SwfrMainBothText(uint8_t val); +const char *LrFrNoneText(uint8_t val); +const char *CenterMainText(uint8_t val); +const char *SwfrMainText(uint8_t val); +const char *SurrMainText(uint8_t val); +const char *SixEightText(uint8_t val); +const char *CrossOverText(uint8_t val); +const char *OffDolbyDspText(uint8_t val); +const char *OffOn2OnMultiText(uint8_t val); +const char *M10P10dbText(uint8_t val); + +const char *ProgramName(uint8_t val); +const char *OffOnText(uint8_t val); +const char *FMAMText(uint8_t val); +const char *PresetLabelText(uint8_t val); +const char *MainSubAllText(uint8_t val); +const char *WhichZoneText(uint8_t val); +const char *Norm10dbDownText(uint8_t val); +const char *MainZoneBText(uint8_t val); +