diff --git a/EmbeddedSystemsTHM/CLI.c b/EmbeddedSystemsTHM/CLI.c new file mode 100644 index 0000000..57e22e6 --- /dev/null +++ b/EmbeddedSystemsTHM/CLI.c @@ -0,0 +1,331 @@ +//================================================================================================================================ +// Includes +//================================================================================================================================ +#include +#include +#include +#include "string.h" + +#include "CLI.h" +#include "Taster.h" +#include "Timer.h" +#include "Led.h" + + +//================================================================================================================================ +// defines +//================================================================================================================================ +#define COUNT_COMMANDS ( sizeof(command) / sizeof(command[0]) ) + + + +#define CHAR_DEL 0x7F +#define CHAR_BACKSPACE 0x08 +#define CHAR_CR 0x0D +#define CHAR_LF 0x0A +#define CHAR_ESC 0x1B + +#define NEXT_LINE (char*)"\r\n" +#define CURSOR (char*)">>" + +//================================================================================================================================ +// Lokale Variablen +//================================================================================================================================ +uint16_t g_startMS; +static char data[200]; // Zwischenspeicher für die Befehlsdecodierung +static char rs232_buffer[50]; +static uint8_t pointer=0; // Zeiger zu obiger Variable +static void (*callback_function)(char _data) = NULL; // Funktionszeiger auf eine Funktion, welche die Daten entgegen nimmt, +// und auf der Ausgabeschnittstelle ausgibt. +//================================================================================================================================ +// Lokale Functionen +//================================================================================================================================ +static void run_cmd(char *_data); +static char* get_next(char *_data); +static char to_uppercase (char _data); +static void print_char (char _data); +static void print_string (char* _data); + +// Funktionen für Befehlsdecoder +static void cmd_help(const char* _data); +static void cmd_taster(const char* _data); +static void cmd_led_on(const char* _data); +static void cmd_led_off(const char* _data); +static void cmd_alert(const char* _data); + +//================================================================================================================================ +// command-Tabelle +//================================================================================================================================ +const struct { + const char cmd[20]; + void (*funktion)(const char* _data); + const char info[40]; +} command[] PROGMEM = { + {"HELP", &cmd_help, "Display this Help Menu"}, + {"BUTTON", &cmd_taster, "Current State of the Buttons"}, + {"LED_ON $LED", &cmd_led_on, "Turn on the LED on position $LED"}, + {"LED_OFF $LED", &cmd_led_off, "Turn off the LED on position $LED"}, + {"ALERT", &cmd_alert, "RING THE ALTER!!!"}, +}; + +//================================================================================================================================ +// Funktion: line_interpreter_init +// Initialisierung des Line-Interpreters. +// Parameter: _ptr: Zeiger auf die Funktion, welche die einzelne Zeichen auf der Konsole ausgeben kann. +// Rückgabewert: keine +//================================================================================================================================ +void line_interpreter_init(void (*_ptr)(char _data)){ + callback_function = _ptr; +} + + +//================================================================================================================================ +// Funktion: line_interpreter_get_data +// Dieser Funktion werden die Daten von der RS232 Schnittstelle übergeben. In dieser Funktion werden die Empfangen +// Zeichen zu einer Zeichenkette zusammengefügt, und wenn die ein Carryage-Return empfangen wurde, wird die +// Zeichenkette an den Decoder übergeben. +// Parameter: _char: Empfangenes Zeichen +// Rückgabewert: keine +//================================================================================================================================ +void line_interpreter_get_data(char _char){ + + switch (_char){ + case CHAR_BACKSPACE: + case CHAR_DEL: + if (pointer > 0){ + pointer--; // Zeichen aus Zeichenkette entfernen + print_char (CHAR_BACKSPACE); + print_char (' '); + print_char (CHAR_BACKSPACE); + } + break; + case CHAR_CR: // Enter wurde gedrückt, + data[pointer] = 0; // Terminate String; + print_string(NEXT_LINE); + if (pointer>0){ // Wenn mindestens ein Zeichen empfangen wurde dann + run_cmd (data); // Empfangene Zeichenkette Ausweten + pointer = 0; + } + print_string (CURSOR); + break; + default: // Normales Zeichen empfangen. + _char = to_uppercase(_char); // Kleinbuchstaben zu Großbuchstaben wandeln + print_char(_char); // Empfangenes Zeichen Ausgeben + data[pointer++] = _char; // Empfangenes Zeichen in Zwischenspeicher speichern. + break; + }//end switch +} + +//================================================================================================================================ +// Funktion: Ausfuehren +// Diese Funktion überprüft das erste Wort in der Zeichenkette mit der Command-Tabelle und wenn es eine Über- +// einstimmung gibt, wird die entsprechende Funktion aufgerufen. +// Parameter: _string: Auszuwertende Zeichenkette +// Rückgabewert: keine +//================================================================================================================================ +static void run_cmd (char *_string){ + char *temp = 0; + uint8_t i; + void (*temp_func)(char* const _string); + + temp = get_next(data); + + for (i=0; i='a') && (_char<='x') ){ + _char -= 'a' - 'A'; + } + return _char; +} + + +//================================================================================================================================ +// Funktion: print_char +// Ausgabe eines Zeichens auf der Konsole. +// Parameter: _data: Zeichen, welches an die Callbackfunktion übergeben werden soll. +// Rückgabewert: keine +//================================================================================================================================ +static void print_char (char _data){ + + + + if (callback_function != NULL){ + callback_function(_data); + } +} + + +//================================================================================================================================ +// Funktion: print_string +// Ausgabe eines Strings auf der Konsole. +// Parameter: _data: Zeichenkette +// Rückgabewert: keine +//================================================================================================================================ +static void print_string (char* _data){ + for(uint8_t i=0; i<200; i++) { + if(_data[i] == 0){ + break; + } + print_char(_data[i]); + } + +} + + +//================================================================================================================================ +// Funktion: cmd_temp +// Hilfe Funktion. Gibt die Hilfe Tabelle aus. +// Parameter: _data: Zeichenkette mit Parametern des Befehls +// Rückgabewert: keine +//================================================================================================================================ +static void cmd_help(const char* _data){ + for (uint8_t i=0; i= 250){ + g_startMS = Timer_getTick(); + + print_string("ALERT!!!"); + + if(!isOn){ + isOn = 1; + Led6_On(); + Led7_On(); + Led8_On(); + } else { + isOn = 0; + Led6_Off(); + Led7_Off(); + Led8_Off(); + } + } + } +} + + diff --git a/EmbeddedSystemsTHM/EmbeddedSystemsTHM.cproj b/EmbeddedSystemsTHM/EmbeddedSystemsTHM.cproj index 71c367d..aece552 100644 --- a/EmbeddedSystemsTHM/EmbeddedSystemsTHM.cproj +++ b/EmbeddedSystemsTHM/EmbeddedSystemsTHM.cproj @@ -151,6 +151,12 @@ + + compile + + + compile + compile @@ -184,10 +190,10 @@ compile - + compile - + compile diff --git a/EmbeddedSystemsTHM/cli.h b/EmbeddedSystemsTHM/cli.h new file mode 100644 index 0000000..5e667f5 --- /dev/null +++ b/EmbeddedSystemsTHM/cli.h @@ -0,0 +1,8 @@ + +#ifndef CLI_H_ +#define CLI_H_ + +extern void line_interpreter_init(void (*_ptr)(char _data)); +extern void line_interpreter_get_data(char _d); + +#endif /* CLI_H_ */ \ No newline at end of file diff --git a/EmbeddedSystemsTHM/main.c b/EmbeddedSystemsTHM/main.c index e3d6d07..1da0759 100644 --- a/EmbeddedSystemsTHM/main.c +++ b/EmbeddedSystemsTHM/main.c @@ -11,6 +11,7 @@ #include "Tasks.h" #include "StopLight.h" #include "UART.h" +#include "CLI.h" #include #define F_CPU 1000000 #include @@ -18,35 +19,44 @@ /* function declarations */ void buttonTest (void); +uint16_t g_startMS; -/* functions */ int main (void) { sei(); /* Initialize the LEDs, Buttons, etc. */ - //Led_init(); - //Taster_init(); - //Timer_init(); - //initTasks(); - - //uart_init(); - uart_init_isr(); - + Timer_init(); + Taster_init(); + Led_init(); + uart_init(); + line_interpreter_init(uart_send_byte); + uart_send_string("Welcome to the ATmega1284P CLI. Type HELP to display all options.\r\n"); while (1) - { + { + /* UART Standalone Test */ + /* + if(uart_data_available()){ + char data[500]; + data[0] = uart_get_data(); + uart_send_isr(data); + } + */ + + if(uart_data_available()){ + line_interpreter_get_data(uart_get_data()); + } + //buttonTest(); //runningLight(); //blinkLedWithTimer(); //runStopLightTask1(); //runStopLightTask2(); - - //uart_send ("Hello World\n"); - uart_send_isr ("Hello World\n"); - + //uart_send ("uart_send: Hello World\n"); + } }