summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jonas Gunz <himself@jonasgunz.de> 2021-06-04 23:49:40 +0200
committerGravatar Jonas Gunz <himself@jonasgunz.de> 2021-06-04 23:49:40 +0200
commitda3ebb99ab95e659f2dc3e51fd1182258878011c (patch)
treeebb9d6b06d34374ea4c258014ab848fadad85fcf
parent27321e05de35b494c2b282652e1c40a18435b68b (diff)
downloadanalog_instruments-da3ebb99ab95e659f2dc3e51fd1182258878011c.tar.gz
command parser
-rw-r--r--src/cmd.c86
-rw-r--r--src/cmd.h28
-rw-r--r--src/main.c13
-rw-r--r--src/uart.c6
-rw-r--r--src/uart.h7
5 files changed, 137 insertions, 3 deletions
diff --git a/src/cmd.c b/src/cmd.c
new file mode 100644
index 0000000..43b9bfc
--- /dev/null
+++ b/src/cmd.c
@@ -0,0 +1,86 @@
+/*
+ * src/cmd.c
+ * (c) 2021 Jonas Gunz <himself@jonasgunz.de>
+ * License: All rights reserved.
+ */
+
+#include "cmd.h"
+
+struct {
+ uint8_t state;
+ uint8_t cmd;
+ uint8_t argv[_CMD_MAX_ARGC];
+} cmd_state;
+
+const struct {
+ char literal;
+ void (*fkt)(uint8_t[]);
+ uint8_t argc;
+} cmd[_CMD_CNT] = {
+ {0,cmd_err,0},
+ {'p',cmd_set_pwm,2}
+};
+
+void cmd_init() {
+ cmd_state.state = 0;
+ cmd_state.cmd = 0;
+}
+
+void cmd_tick(char _c) {
+ uint8_t i;
+
+ if(_c == '\r') {
+ /* if cmd is not cmd_err and argc do not match */
+ if( cmd_state.cmd && cmd[cmd_state.cmd].argc != cmd_state.state - 1 ) {
+ /* set cmd_err to _ERR_ARGC */
+ cmd_state.cmd = 0;
+ cmd_state.argv[0] = _ERR_ARGC;
+ }
+
+ (*cmd[cmd_state.cmd].fkt)(cmd_state.argv);
+ cmd_state.state = 0;
+ cmd_state.cmd = 0;
+ return;
+ }
+
+ if(!cmd_state.state) {
+ cmd_state.state = 1;
+ for( i=0; i<_CMD_CNT; i++ ) {
+ if( _c != cmd[i].literal )
+ continue;
+
+ cmd_state.cmd = i;
+ return;
+ }
+
+ cmd_state.cmd = 0;
+ cmd_state.argv[0] = _ERR_CMD;
+ }
+
+ /* Check, if maximum argc is reached */
+ if (cmd_state.state >= _CMD_MAX_ARGC) {
+ cmd_state.cmd = 0;
+ cmd_state.argv[0] = _ERR_ARGC;
+ }
+
+ cmd_state.argv[ (cmd_state.state++) - 1 ] = _c;
+}
+
+void cmd_set_pwm(uint8_t _argv[]) {
+ uart_putchar(_argv[0]);
+ uart_putchar(_argv[1]);
+}
+
+void cmd_err( uint8_t _argv[] ) {
+ switch(_argv[0]) {
+ case _ERR_ARGC:
+ uart_putstring("E:ARG\r\n");
+ break;
+ case _ERR_CMD:
+ uart_putstring("E:CMD\r\n");
+ break;
+ default:
+ uart_putstring("E\r\n");
+
+ }
+}
diff --git a/src/cmd.h b/src/cmd.h
new file mode 100644
index 0000000..c547f6e
--- /dev/null
+++ b/src/cmd.h
@@ -0,0 +1,28 @@
+/*
+ * src/cmd.h
+ * (c) 2021 Jonas Gunz <himself@jonasgunz.de>
+ * License: All rights reserved.
+ */
+
+#ifndef _CMD_H_
+#define _CMD_H_
+
+#include <stdint.h>
+
+#include "uart.h"
+
+#define _CMD_CNT 2
+#define _CMD_MAX_ARGC 4
+
+#define _ERR_CMD 1
+#define _ERR_ARGC 2
+
+void cmd_init();
+
+void cmd_tick(char _c);
+
+void cmd_set_pwm(uint8_t _argv[]);
+
+void cmd_err(uint8_t _argv[]);
+
+#endif
diff --git a/src/main.c b/src/main.c
index a73e7ef..131b483 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,8 +1,15 @@
+/*
+ * src/main.c
+ * (c) 2021 Jonas Gunz <himself@jonasgunz.de>
+ * License: All rights reserved.
+ */
+
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include "uart.h"
+#include "cmd.h"
uint8_t t0_ovf_cnt = 0;
@@ -48,16 +55,20 @@ int main(void) {
/* Uart */
uart_init();
+
+ cmd_init();
/* Go! */
sei();
+ uart_putstring("START\r\n");
+
while(1){
if( uart_getchar(&c) )
continue;
uart_putchar(c);
- pb0_thresh = c;
+ cmd_tick(c);
}
return 0;
diff --git a/src/uart.c b/src/uart.c
index 0b65e30..4431be2 100644
--- a/src/uart.c
+++ b/src/uart.c
@@ -73,3 +73,9 @@ uint8_t uart_getchar(char *_c) {
return 0;
}
+
+void uart_putstring(char *_s) {
+ do {
+ uart_putchar(*_s);
+ } while(*(_s++));
+}
diff --git a/src/uart.h b/src/uart.h
index c709487..b2eac64 100644
--- a/src/uart.h
+++ b/src/uart.h
@@ -5,7 +5,8 @@
*/
/*
- * Interrupt controlled UART
+ * Interrupt controlled UART with
+ * ringbuffers to TX and RX
*/
#ifndef _UART_H_
@@ -17,7 +18,7 @@
#include <string.h>
#ifndef BAUD
-#warning BAUD "BAUD not defined. Dafaulting to 9600"
+#warning "BAUD not defined. Dafaulting to 9600"
#define BAUD 9600
#endif
@@ -33,4 +34,6 @@ uint8_t uart_putchar(char _c);
uint8_t uart_getchar(char *_c);
+void uart_putstring(char *_s);
+
#endif