Files
AVR/AVR Working Controller/AVRCommandDecoder.cpp

640 lines
14 KiB
C++

#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#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", "unk", "DTS", "unk", "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;
}