uart_commands.c etc.: added mode change command

This commit is contained in:
Christian Kroll 2014-08-28 03:07:37 +02:00
parent 09ce8f22b3
commit 937d9da592
5 changed files with 98 additions and 30 deletions

View File

@ -67,6 +67,12 @@ void display_loop(){
// mcuf_serial_mode();
mode = setjmp(newmode_jmpbuf);
#ifdef JOYSTICK_SUPPORT
// in case we get here via mode jump, we (re)enable joystick queries
waitForFire = 1;
#endif
oldOldmode = oldMode;
#ifdef JOYSTICK_SUPPORT
@ -301,26 +307,26 @@ void display_loop(){
#endif
#ifdef MENU_SUPPORT
case 42:
case 0xFDu:
mode = 1;
break;
case 43:
case 0xFEu:
menu();
mode = oldOldmode;
break;
#else
case 42:
case 0xFDu:
#ifdef JOYSTICK_SUPPORT
if (JOYISFIRE)
mode = 43;
mode = 0xFEu;
else
#endif
mode = 1;
break;
case 43:
case 0xFEu:
#ifdef JOYSTICK_SUPPORT
waitForFire = 0; // avoid circular jumps
while (JOYISFIRE); // wait until user released the fire button
@ -363,7 +369,7 @@ void display_loop(){
#endif
#ifdef ANIMATION_OFF
case 0xFF:
case 0xFFu:
off();
break;
#endif
@ -375,6 +381,7 @@ void display_loop(){
reverseMode = 0;
}
}
break;
}
}
}

View File

@ -62,7 +62,7 @@ int win;
void wait(unsigned int ms) {
if (waitForFire) {
if (fakeport & 0x01) {
longjmp(newmode_jmpbuf, 43);
longjmp(newmode_jmpbuf, 0xFEu);
}
}

View File

@ -455,7 +455,7 @@ void wait(int ms)
{
if (fakeport & 0x01)
{
longjmp(newmode_jmpbuf, 43);
longjmp(newmode_jmpbuf, 0xFEu);
}
}

View File

@ -1,4 +1,5 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
@ -30,21 +31,27 @@ extern volatile unsigned char reverseMode;
char const UART_STR_NOTIMPL[] PROGMEM = "\r\nnot implemented";
#endif
char const UART_STR_BACKSPACE[] PROGMEM = "\033[D \033[D";
char const UART_STR_PROMPT[] PROGMEM = "\r\n> ";
char const UART_STR_ERROR[] PROGMEM = "\r\ntransmission error";
char const UART_STR_UNKNOWN[] PROGMEM = "\r\nunknown command";
char const UART_STR_TOOLONG[] PROGMEM = "\r\ncommand to long";
char const UART_STR_HELP[] PROGMEM = "\r\nallowed commands: erase help "
"msg next prev reset scroll";
char const UART_STR_BACKSPACE[] PROGMEM = "\033[D \033[D";
char const UART_STR_PROMPT[] PROGMEM = "\r\n> ";
char const UART_STR_MODE[] PROGMEM = "\r\n%d";
char const UART_STR_MODE_ERROR[] PROGMEM = "\r\nRange is between 0 and 255.";
char const UART_STR_GAME_ERROR[] PROGMEM = "\r\nNo mode change during games.";
char const UART_STR_UART_ERROR[] PROGMEM = "\r\nTransmission error.";
char const UART_STR_UNKNOWN[] PROGMEM = "\r\nUnknown command or syntax "
"error.";
char const UART_STR_TOOLONG[] PROGMEM = "\r\nCommand is to long.";
char const UART_STR_HELP[] PROGMEM = "\r\nAllowed commands: erase help "
"mode msg next prev reset scroll";
char const UART_CMD_ERASE[] PROGMEM = "erase";
char const UART_CMD_HELP[] PROGMEM = "help";
char const UART_CMD_MSG[] PROGMEM = "msg ";
char const UART_CMD_NEXT[] PROGMEM = "next";
char const UART_CMD_PREV[] PROGMEM = "prev";
char const UART_CMD_RESET[] PROGMEM = "reset";
char const UART_CMD_SCROLL[] PROGMEM = "scroll ";
char const UART_CMD_ERASE[] PROGMEM = "erase";
char const UART_CMD_HELP[] PROGMEM = "help";
char const UART_CMD_MODE[] PROGMEM = "mode";
char const UART_CMD_MODE_ARG[] PROGMEM = "mode ";
char const UART_CMD_MSG[] PROGMEM = "msg ";
char const UART_CMD_NEXT[] PROGMEM = "next";
char const UART_CMD_PREV[] PROGMEM = "prev";
char const UART_CMD_RESET[] PROGMEM = "reset";
char const UART_CMD_SCROLL[] PROGMEM = "scroll ";
bool g_uartcmd_permit_processing = 1;
@ -124,12 +131,17 @@ static void uartcmd_scroll_message(void) {
* As long there's no game active, jump to the next animation.
*/
static void uartcmd_next_anim(void) {
uart_puts_p(UART_STR_PROMPT);
uartcmd_clear_buffer();
#ifdef JOYSTICK_SUPPORT
if (waitForFire)
if (waitForFire) {
#endif
uart_puts_p(UART_STR_PROMPT);
uartcmd_clear_buffer();
longjmp(newmode_jmpbuf, mode);
#ifdef JOYSTICK_SUPPORT
} else {
uart_puts_p(UART_STR_GAME_ERROR);
}
#endif
}
@ -137,19 +149,63 @@ static void uartcmd_next_anim(void) {
* As long there's no game active, jump to the previous animation.
*/
static void uartcmd_prev_anim(void) {
uart_puts_p(UART_STR_PROMPT);
uartcmd_clear_buffer();
#ifdef JOYSTICK_SUPPORT
if (waitForFire) {
reverseMode = mode - 2;
#endif
reverseMode = mode - 2;
uart_puts_p(UART_STR_PROMPT);
uartcmd_clear_buffer();
longjmp(newmode_jmpbuf, mode - 2);
#ifdef JOYSTICK_SUPPORT
} else {
uart_puts_p(UART_STR_GAME_ERROR);
}
#endif
}
/**
* Outputs current mode number via UART.
*/
static void uartcmd_print_mode(void) {
char mode_output[6] = "";
snprintf_P(mode_output, 6, UART_STR_MODE, mode - 1);
uart_puts(mode_output);
}
/**
* Retrieves desired mode number from command line and switches to that mode.
*/
static void uartcmd_read_mode(void) {
int res = 0;
for (uint8_t i = 5; (i < 8) && (g_rx_buffer[i] != 0); ++i) {
if (isdigit(g_rx_buffer[i])) {
res = res * 10 + g_rx_buffer[i] - '0';
} else {
res = UINT8_MAX + 1;
break;
}
}
if ((res <= UINT8_MAX) && (g_rx_buffer[8] == 0)) {
#ifdef JOYSTICK_SUPPORT
if (waitForFire) {
#endif
uart_puts_p(UART_STR_PROMPT);
uartcmd_clear_buffer();
longjmp(newmode_jmpbuf, res);
#ifdef JOYSTICK_SUPPORT
} else {
uart_puts_p(UART_STR_GAME_ERROR);
}
#endif
} else {
uart_puts_p(UART_STR_MODE_ERROR);
}
}
/**
* Perform a MCU reset by triggering the watchdog.
*/
@ -197,7 +253,7 @@ static bool uartcmd_read_until_enter(void) {
case UART_PARITY_ERROR:
case UART_BUFFER_OVERFLOW:
uartcmd_clear_buffer();
uart_puts_p(UART_STR_ERROR);
uart_puts_p(UART_STR_UART_ERROR);
uart_puts_p(UART_STR_PROMPT);
break;
@ -225,6 +281,11 @@ void uartcmd_process(void) {
uartcmd_erase_eeprom();
} else if (!strncmp_P(g_rx_buffer, UART_CMD_HELP, UART_BUFFER_SIZE)) {
uart_puts_p(UART_STR_HELP);
} else if (!strncmp_P(g_rx_buffer, UART_CMD_MODE, UART_BUFFER_SIZE) ||
!strncmp_P(g_rx_buffer, UART_CMD_MODE_ARG, UART_BUFFER_SIZE)) {
uartcmd_print_mode();
} else if (!strncmp_P(g_rx_buffer, UART_CMD_MODE_ARG, 5)) {
uartcmd_read_mode();
} else if (!strncmp_P(g_rx_buffer, UART_CMD_MSG, 4)) {
uartcmd_simple_message();
} else if (!strncmp_P(g_rx_buffer, UART_CMD_NEXT, UART_BUFFER_SIZE)) {

View File

@ -57,7 +57,7 @@ void wait(int ms){
//PORTJOYGND &= ~(1<<BITJOY0);
//PORTJOYGND &= ~(1<<BITJOY1);
if (JOYISFIRE) {
longjmp(newmode_jmpbuf, 43);
longjmp(newmode_jmpbuf, 0xFEu);
}
}
#endif