state machine, error handling, and twinkling led

This commit is contained in:
yul 2022-05-30 19:34:27 +02:00
parent a94c55d4a6
commit b21b8dbf2d
2 changed files with 33 additions and 112 deletions

View File

@ -18,6 +18,7 @@
#include <string.h>
#include "uart_commands.h"
#include "timer.h"
error_code status;
@ -66,7 +67,10 @@ int is_code_valid(){
if(is_error == ok){
return 1;
}
else return 0;
else{
set_colour(RED);//code invalid, red led
return 0;
}
}
int is_b_pressed(){
@ -99,9 +103,12 @@ void launch_program(){
void manage_bootloader(){
cmd.argv = (char**)argvs;
while(1){
int var = 1;
char digit;
while(var){
uart_receive_command(buff);
uart_parse_command(buff, &cmd);
set_colour(GREEN);
if ((state == S1) && (strncmp("GETID", cmd.argv[0], 5)==0)){
uart_commands_getid(&status);
@ -137,11 +144,16 @@ void manage_bootloader(){
uart_send_ok();
uart_send("bla\r\n", 5);//putting bla here so OK will show up
//removing bla for the moment will make ok not show up
var = 0;
LPC_GPIO2->FIOCLR0 = 0xff;
launch_program();
}else{
state = S2;
uart_send_err();
//flash LED red
set_colour(RED);
itoa(is_error, &digit, 10);
uart_send(&digit, 1);
//flash LED red, and stays in the bootloader mode
}
}else {
uart_send_cmd_illeg();
@ -150,11 +162,8 @@ void manage_bootloader(){
}
int main(void) {
//verify b is pressed
//checksum is correct (
//bootloader_init();
uart_init(115200);
LPC_GPIO0->FIODIR &=~(1<<19); //do I really need this line?
timer_0();
if(is_b_pressed() == 0){
if(is_code_valid()){
launch_program();

View File

@ -9,100 +9,6 @@ char CMD_ILLEGAL[13] = "CMD_ILLEGAL\r\n";
void digit_to_str(char* str, uint32_t number, int base){
itoa(number,str,16);
}
/*
void digit_to_str(char* str, uint32_t number, int base){
char tmp_char[32];
uint32_t tmp = number;
int tmp_counter = 0;
for(int i = 0; i<32; i++);
switch (tmp & 15)
{
case 0:
tmp_char[tmp_counter] = '0';
tmp_counter++;
tmp=tmp/base;
break;
case 1:
tmp_char[tmp_counter] = '1';
tmp_counter++;
tmp=tmp/base;
break;
case 2:
tmp_char[tmp_counter] = '2';
tmp_counter++;
tmp=tmp/base;
break;
case 3:
tmp_char[tmp_counter] = '3';
tmp_counter++;
tmp=tmp/base;
break;
case 4:
tmp_char[tmp_counter] = '4';
tmp_counter++;
tmp=tmp/base;
break;
case 5:
tmp_char[tmp_counter] = '5';
tmp_counter++;
tmp=tmp/base;
break;
case 6:
tmp_char[tmp_counter] = '6';
tmp_counter++;
tmp=tmp/base;
break;
case 7:
tmp_char[tmp_counter] = '7';
tmp_counter++;
tmp=tmp/base;
break;
case 8:
tmp_char[tmp_counter] = '8';
tmp_counter++;
tmp=tmp/base;
break;
case 9:
tmp_char[tmp_counter] = '9';
tmp_counter++;
tmp=tmp/base;
break;
case 10:
tmp_char[tmp_counter] = 'a';
tmp_counter++;
tmp=tmp/base;
break;
case 11:
tmp_char[tmp_counter] = 'b';
tmp_counter++;
tmp=tmp/base;
break;
case 12:
tmp_char[tmp_counter] = 'c';
tmp_counter++;
tmp=tmp/base;
break;
case 13:
tmp_char[tmp_counter] = 'd';
tmp_counter++;
tmp=tmp/base;
break;
case 14:
tmp_char[tmp_counter] = 'e';
tmp_counter++;
tmp=tmp/base;
break;
case 15:
tmp_char[tmp_counter] = 'f';
tmp_counter++;
tmp=tmp/base;
break;
}
for(int i = 0; i<tmp_counter; i++){
str[i] = tmp_char[tmp_counter-i];
}
str[tmp_counter] = '\0';
}*/
void uart_commands_getid(error_code* status){
@ -117,30 +23,36 @@ void uart_commands_getid(error_code* status){
uart_send_ok();
uart_send(hex, strlen(hex));
uart_send("\r\n", 2);
}
}else{
uart_send_err();
}
}
void uart_commands_getserial(error_code* status){
//char hex[40] = "0x8005018af27a5225a541628f50020c0\r\n";
char digit;
char hex[40];
uint32_t res[4];
iap_read_serial(status, res);
digit_to_str(hex+2, res[0], 16);
hex[0]='0';
hex[1]='x';
if(*status == 0){
if(*status != ok){
uart_send_err();
itoa(*status, &digit, 10);
uart_send(&digit, 1);
}
if(*status == ok){
uart_send_ok();
uart_send(hex, strlen(hex));
digit_to_str(hex, res[1], 16);
uart_send(hex, strlen(hex));
digit_to_str(hex, res[2], 16);
uart_send(hex, strlen(hex));
digit_to_str(hex, res[3], 16);
uart_send(hex, strlen(hex));
uart_send("\r\n", 2);
}
digit_to_str(hex, res[1], 16);
uart_send(hex, strlen(hex));
digit_to_str(hex, res[2], 16);
uart_send(hex, strlen(hex));
digit_to_str(hex, res[3], 16);
uart_send(hex, strlen(hex));
uart_send("\r\n", 2);
//sprintf(hex, "0x%x%x%x%x\r\n", res[0], res[1], res[2], res[3]);
}
crc_t uart_commands_prog(error_code* status, int size){