mirror of
https://github.com/RfidResearchGroup/ChameleonMini.git
synced 2026-05-12 11:20:37 -07:00
374 lines
8.9 KiB
C
374 lines
8.9 KiB
C
|
|
#include "Commands.h"
|
|
#include <stdio.h>
|
|
#include <avr/pgmspace.h>
|
|
#include "XModem.h"
|
|
#include "../Settings.h"
|
|
#include "../Chameleon-Mini.h"
|
|
#include "../LUFA/Version.h"
|
|
#include "../Configuration.h"
|
|
#include "../Random.h"
|
|
#include "../Memory.h"
|
|
#include "../System.h"
|
|
#include "../Button.h"
|
|
#include "../AntennaLevel.h"
|
|
|
|
extern const PROGMEM CommandEntryType CommandTable[];
|
|
|
|
CommandStatusIdType CommandGetVersion(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR(
|
|
"Chameleon-Mini %S using LUFA %S compiled with AVR-GCC %S"
|
|
), PSTR(CHAMELEON_MINI_VERSION_STRING), PSTR(LUFA_VERSION_STRING), PSTR(__VERSION__)
|
|
);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetConfig(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE,
|
|
PSTR("%s"), ActiveConfiguration.ConfigurationName);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
|
|
}
|
|
|
|
CommandStatusIdType CommandSetConfig(const char* InParam)
|
|
{
|
|
if (ConfigurationSetByName(InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecConfig(char* OutMessage)
|
|
{
|
|
ConfigurationGetList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetUid(char* OutParam)
|
|
{
|
|
uint8_t UidBuffer[COMMAND_UID_BUFSIZE];
|
|
uint16_t UidSize = ActiveConfiguration.UidSize;
|
|
|
|
ApplicationGetUid(UidBuffer);
|
|
|
|
BufferToHexString(OutParam, TERMINAL_BUFFER_SIZE,
|
|
UidBuffer, UidSize);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetUid(const char* InParam)
|
|
{
|
|
uint8_t UidBuffer[COMMAND_UID_BUFSIZE];
|
|
uint16_t UidSize = ActiveConfiguration.UidSize;
|
|
|
|
if (strcmp_P(InParam, PSTR(COMMAND_UID_RANDOM)) == 0) {
|
|
/* Load with random bytes */
|
|
for (uint8_t i=0; i<UidSize; i++) {
|
|
UidBuffer[i] = RandomGetByte();
|
|
}
|
|
} else {
|
|
/* Convert to Bytes */
|
|
if (HexStringToBuffer(UidBuffer, sizeof(UidBuffer), InParam) != UidSize) {
|
|
/* Malformed input. Abort */
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
ApplicationSetUid(UidBuffer);
|
|
|
|
return COMMAND_INFO_OK_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetReadOnly(char* OutParam)
|
|
{
|
|
if (ActiveConfiguration.ReadOnly) {
|
|
OutParam[0] = COMMAND_CHAR_TRUE;
|
|
} else {
|
|
OutParam[0] = COMMAND_CHAR_FALSE;
|
|
}
|
|
|
|
OutParam[1] = '\0';
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetReadOnly(const char* InParam)
|
|
{
|
|
if (InParam[1] == '\0') {
|
|
if (InParam[0] == COMMAND_CHAR_TRUE) {
|
|
ActiveConfiguration.ReadOnly = true;
|
|
return COMMAND_INFO_OK_ID;
|
|
} else if (InParam[0] == COMMAND_CHAR_FALSE) {
|
|
ActiveConfiguration.ReadOnly = false;
|
|
return COMMAND_INFO_OK_ID;
|
|
}
|
|
}
|
|
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandExecUpload(char* OutMessage)
|
|
{
|
|
XModemReceive(MemoryUploadBlock);
|
|
return COMMAND_INFO_XMODEM_WAIT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandExecDownload(char* OutMessage)
|
|
{
|
|
XModemSend(MemoryDownloadBlock);
|
|
return COMMAND_INFO_XMODEM_WAIT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandExecReset(char* OutMessage)
|
|
{
|
|
USB_Detach();
|
|
USB_Disable();
|
|
|
|
SystemReset();
|
|
|
|
return COMMAND_INFO_OK_ID;
|
|
}
|
|
|
|
#ifdef SUPPORT_FIRMWARE_UPGRADE
|
|
CommandStatusIdType CommandExecUpgrade(char* OutMessage)
|
|
{
|
|
USB_Detach();
|
|
USB_Disable();
|
|
|
|
SystemEnterBootloader();
|
|
|
|
return COMMAND_INFO_OK_ID;
|
|
}
|
|
#endif
|
|
|
|
CommandStatusIdType CommandGetMemSize(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.MemorySize);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetUidSize(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE, PSTR("%u"), ActiveConfiguration.UidSize);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandExecButton(char* OutMessage)
|
|
{
|
|
ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetButton(char* OutParam)
|
|
{
|
|
ButtonGetActionByName(BUTTON_PRESS_SHORT, OutParam, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetButton(const char* InParam)
|
|
{
|
|
if (ButtonSetActionByName(BUTTON_PRESS_SHORT, InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecButtonLong(char* OutMessage)
|
|
{
|
|
ButtonGetActionList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetButtonLong(char* OutParam)
|
|
{
|
|
ButtonGetActionByName(BUTTON_PRESS_LONG, OutParam, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetButtonLong(const char* InParam)
|
|
{
|
|
if (ButtonSetActionByName(BUTTON_PRESS_LONG, InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecLedGreen(char* OutMessage)
|
|
{
|
|
LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetLedGreen(char* OutParam)
|
|
{
|
|
LEDGetFuncByName(LED_GREEN, OutParam, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetLedGreen(const char* InParam)
|
|
{
|
|
if (LEDSetFuncByName(LED_GREEN, InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecLedRed(char* OutMessage)
|
|
{
|
|
LEDGetFuncList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetLedRed(char* OutParam)
|
|
{
|
|
LEDGetFuncByName(LED_RED, OutParam, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetLedRed(const char* InParam)
|
|
{
|
|
if (LEDSetFuncByName(LED_RED, InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecLogMode(char* OutMessage)
|
|
{
|
|
/* Get list of log modes */
|
|
LogGetModeList(OutMessage, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetLogMode(char* OutParam)
|
|
{
|
|
/* Get Logmode */
|
|
LogGetModeByName(OutParam, TERMINAL_BUFFER_SIZE);
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetLogMode(const char* InParam)
|
|
{
|
|
if (LogSetModeByName(InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecLogMem(char* OutMessage)
|
|
{
|
|
snprintf_P(OutMessage, TERMINAL_BUFFER_SIZE,
|
|
PSTR("%S,%S"), PSTR(COMMAND_LOGMEM_LOADBIN), PSTR(COMMAND_LOGMEM_CLEAR) );
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetLogMem(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE,
|
|
PSTR("%u"), LogMemFree());
|
|
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetLogMem(const char* InParam)
|
|
{
|
|
if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_LOADBIN)) == 0) {
|
|
XModemSend(LogMemLoadBlock);
|
|
return COMMAND_INFO_XMODEM_WAIT_ID;
|
|
} else if (strcmp_P(InParam, PSTR(COMMAND_LOGMEM_CLEAR)) == 0) {
|
|
LogMemClear();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandGetSetting(char* OutParam)
|
|
{
|
|
SettingsGetActiveByName(OutParam, TERMINAL_BUFFER_SIZE);
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandSetSetting(const char* InParam)
|
|
{
|
|
if (SettingsSetActiveByName(InParam)) {
|
|
SettingsSave();
|
|
return COMMAND_INFO_OK_ID;
|
|
} else {
|
|
return COMMAND_ERR_INVALID_PARAM_ID;
|
|
}
|
|
}
|
|
|
|
CommandStatusIdType CommandExecClear(char* OutParam)
|
|
{
|
|
MemoryClear();
|
|
return COMMAND_INFO_OK_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandExecHelp(char* OutMessage)
|
|
{
|
|
const CommandEntryType* EntryPtr = CommandTable;
|
|
uint16_t ByteCount = TERMINAL_BUFFER_SIZE - 1; /* Account for '\0' */
|
|
|
|
while(strcmp_P(COMMAND_LIST_END, EntryPtr->Command) != 0) {
|
|
const char* CommandName = EntryPtr->Command;
|
|
char c;
|
|
|
|
while( (c = pgm_read_byte(CommandName)) != '\0' && ByteCount > 32) {
|
|
*OutMessage++ = c;
|
|
CommandName++;
|
|
ByteCount--;
|
|
}
|
|
|
|
*OutMessage++ = ',';
|
|
ByteCount--;
|
|
|
|
EntryPtr++;
|
|
}
|
|
|
|
*--OutMessage = '\0';
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|
|
|
|
CommandStatusIdType CommandGetRssi(char* OutParam)
|
|
{
|
|
snprintf_P(OutParam, TERMINAL_BUFFER_SIZE,
|
|
PSTR("%5u mV"), AntennaLevelGet());
|
|
|
|
|
|
return COMMAND_INFO_OK_WITH_TEXT_ID;
|
|
}
|