-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
141 lines (116 loc) · 3.2 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
* Simple Parsing Command from Serial for ATMEGA328
*
* Created: 06/2022 12:48:10
* Author : Valdir Noll, Dr. Eng.
* Mechatronics - IFSC - Florianopolis/BR
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include "serial.h"
extern volatile char RxIsComplete;
extern unsigned char cmd[CMD_MAX_LENGHT];
extern unsigned char cmd_updated[CMD_MAX_LENGHT];
#define NEWLINE 13
#define LED PORTB5
enum commands {LED_ON, LED_OFF, LED_BLINK, HELP, STOP_FUNCTION, INVALID};
enum commands CMD = STOP_FUNCTION;
#define CMD_LED_ON "led-on"
#define CMD_LED_OFF "led-off"
#define CMD_LED_BLINK "led-blink"
#define CMD_HELP "help"
#define CMD_DO_NOTHING "stop"
void menu()
{
USART_Transmit("---------------------------------------\r");
USART_Transmit("| command | description |\r");
USART_Transmit("---------------------------------------\r");
USART_Transmit("| <led-on> | LED on B5 pin |\r");
USART_Transmit("| <led-off> | LED Off B5 pin |\r");
USART_Transmit("| <led-blink> | LED blink B5 @ 1Hz |\r");
USART_Transmit("| <help> | Repeat this menu |\r");
USART_Transmit("---------------------------------------\r\r");
USART_Transmit("cmd: ");
}
enum commands discoveryCommand(char *c)
{
if (strcmp(c,CMD_HELP)==0) return HELP;
if (strcmp(c,CMD_LED_ON)==0) return LED_ON;
if (strcmp(c,CMD_LED_OFF)==0) return LED_OFF;
if (strcmp(c,CMD_LED_BLINK)==0) return LED_BLINK;
if (strcmp(c,CMD_DO_NOTHING)==0) return STOP_FUNCTION;
return INVALID;
}
void setup()
{
DDRB |= (1<<LED);
PORTB &= ~(1<<LED);
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);
UBRR0H = (BAUD_PRESCALE >> 8);
UBRR0L = BAUD_PRESCALE;
sei();
menu();
}
int main (void)
{
enum commands cmd_local, cmd_local_last;
enum main_sequence {WAIT_RX_COMPLETE, DECODER_FUNCTION, EXECUTE_FUNCTION_LOOP};
enum main_sequence SEQUENCE = WAIT_RX_COMPLETE;
cmd_local = STOP_FUNCTION;
cmd_local_last = cmd_local;
setup();
while (1)
{
switch (SEQUENCE)
{
case WAIT_RX_COMPLETE:
if (RxIsComplete) {
RxIsComplete = false;
SEQUENCE = DECODER_FUNCTION;
}
break;
case DECODER_FUNCTION:
cmd_local_last = cmd_local;
cmd_local = discoveryCommand(cmd_updated);
if (cmd_local == INVALID){
USART_Transmit("\r--> Command Invalidated <--");
USART_Transmit("\rcmd: ");
} else USART_Transmit("\rcmd: ");
SEQUENCE = EXECUTE_FUNCTION_LOOP;
break;
case EXECUTE_FUNCTION_LOOP:
switch(cmd_local)
{
case HELP:
USARTCharTransmit(NEWLINE);
menu();
cmd_local = cmd_local_last;
break;
case LED_ON:
PORTB |= (1<<LED);
cmd_local = STOP_FUNCTION;
break;
case LED_OFF:
PORTB &= ~( 1<<LED);
cmd_local = STOP_FUNCTION;
break;
case LED_BLINK:
PORTB ^= (1<<LED);
_delay_ms(1000);
break;
case STOP_FUNCTION:
// do-nothing
break;
case INVALID:
cmd_local = cmd_local_last;
break;
}
if (RxIsComplete) SEQUENCE = WAIT_RX_COMPLETE;
break;
}
}
}
}