added state machine

This commit is contained in:
yul 2022-05-30 17:50:19 +02:00
parent 917aa733ff
commit a94c55d4a6
3 changed files with 36 additions and 6 deletions

View File

@ -21,12 +21,22 @@
error_code status;
enum States
{
S1,
S2,
S3
};
/*
is_even_assembly:
ldr sp, [r0]
ret
*/
enum States state = S1;
char* argvs[3][10];
cmd_t cmd;
@ -92,36 +102,49 @@ void manage_bootloader(){
while(1){
uart_receive_command(buff);
uart_parse_command(buff, &cmd);
if (strncmp("GETID", cmd.argv[0], 5)==0){
if ((state == S1) && (strncmp("GETID", cmd.argv[0], 5)==0)){
uart_commands_getid(&status);
}else if(strncmp("GETSE", cmd.argv[0], 5)==0){
}else if((state == S1) && (strncmp("GETSE", cmd.argv[0], 5)==0)){
uart_commands_getserial(&status);
}else if(strncmp("PROG", cmd.argv[0], 4)==0){
}else if((state == S1) && (strncmp("PROG", cmd.argv[0], 4)==0)){
crc_prog = uart_string_to_int(cmd.argv[3]);
total_size = uart_string_to_int(cmd.argv[2]);
offset = uart_string_to_int(cmd.argv[1]);
write_app_info(&crc_prog, (unsigned int *)&total_size);
crc_data = uart_commands_prog(&status, total_size);
if(status == ok){
state = S2;
}
offset_pointer = offset;
}else if(strcmp("DATA", cmd.argv[0])==0){
}else if(((state == S2) || (state = S3)) && (strcmp("DATA", cmd.argv[0])==0)){
int size = uart_string_to_int(cmd.argv[1]);
crc_t local_checksum = uart_string_to_int(cmd.argv[2]);
uart_commands_data(&status, size, &crc_data, local_checksum, offset_pointer);
if(status == 0) offset_pointer += size;
if(status == ok){
offset_pointer += size;
state = S3;
}else{
state = S2;
}
}else if(strncmp("CHECK", cmd.argv[0], 5)==0){
}else if((state == S3) && (strncmp("CHECK", cmd.argv[0], 5)==0)){
error_code is_error = uart_commands_check(crc_prog, crc_data);
if(is_error == ok){
state = S1;
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
launch_program();
}else{
state = S2;
uart_send_err();
//flash LED red
}
}else {
uart_send_cmd_illeg();
}
}
}

View File

@ -4,6 +4,7 @@ static uint8_t data[1024];
char OK[5] = "OK\r\n";
char ERR[6] = "ERR\r\n";
char CMD_ILLEGAL[13] = "CMD_ILLEGAL\r\n";
void digit_to_str(char* str, uint32_t number, int base){
itoa(number,str,16);
@ -245,3 +246,7 @@ void uart_send_ok(){
void uart_send_err(){
uart_send(ERR, 6);
}
void uart_send_cmd_illeg(){
uart_send(CMD_ILLEGAL, 13);
}

View File

@ -37,6 +37,8 @@ void uart_send_ok();
void uart_send_err();
void uart_send_cmd_illeg();
void digit_to_str(char* str, uint32_t number, int base);