TELECOMMAND MANAGER V1
Dependencies: mbed SLCD mbed-rtos
Diff: main.cpp
- Revision:
- 8:cb93c1d3209a
- Parent:
- 7:e71ecfe3a340
- Child:
- 9:934fdce72b3d
- Child:
- 10:024c2ef51cb1
--- a/main.cpp Mon Jul 06 05:00:29 2015 +0000 +++ b/main.cpp Mon Jul 13 10:21:45 2015 +0000 @@ -1,12 +1,11 @@ #include "mbed.h" -#include "rtos.h" #define ENDL "\r" << endl #include "SLCD.h" SLCD lcd; -#define TIMEOUT_LIMIT 1 -#define MAX_NUM_LIST 4 +#define RX_TIMEOUT_LIMIT 2 +#define PASS_TIME_LIMIT 1200 Serial PC(USBTX, USBRX); Serial rx1m(PTE0, PTE1); @@ -17,89 +16,164 @@ #include "Structures.h" struct data_list{ - char val; + unsigned char val; struct data_list* next; }; namespace VAR_SPACE{ - TC_list *Head_node1; - TC_list *Head_node2; + TC_list *Head_node = NULL; + TC_list *last_node = NULL; - bool rx_emergency = false; - + int rx_state = 0; /* - * 0 : idle - * 1 : RCV_TC running - * 2 : RCV_TC handled, MNG_TM_TC running - */ - + 0 : idle + 1 : executing normal + 2 : executing obosc + 3 : idle 2 : obosc received incorrectly + */ + struct data_list *head_data; - struct data_list *data_node; + data_list *data_node; struct data_list *rx_new_node; - - Thread *Com_mng_tc_thread; + + bool new_tc_received = false; + bool execute_obosc = false; + } -Timer rx_timer; -bool data_received = false; +Timeout rx_timeout; +bool pass_over = false; +bool first_time = true; +Timeout pass_time; -#include "mbed.h" #include "crc.h" +#include "SND_TM.h" #include "COM_RCV_TC.h" -#include "SND_TM.h" #include "MNG_TC.h" -void rx_read(){ +void after_pass(){ + pass_time.detach(); + pass_over = true; +} + +void after_receive(void){ + rx_timeout.detach(); + VAR_SPACE::rx_new_node->val = 0x00; + + VAR_SPACE::new_tc_received = true; + + if(first_time){ + first_time = false; + pass_time.attach(&after_pass, PASS_TIME_LIMIT); + } +} + +void rx_read() { //~ store value VAR_SPACE::rx_new_node->val = rx1m.getc(); //~ allocate new node - VAR_SPACE::rx_new_node->next = new struct data_list; + VAR_SPACE::rx_new_node->next = new data_list; VAR_SPACE::rx_new_node = VAR_SPACE::rx_new_node->next; VAR_SPACE::rx_new_node->next = NULL; - rx_timer.reset(); - data_received = true; + rx_timeout.attach(&after_receive, RX_TIMEOUT_LIMIT); +} + +void reset_all(){ + printf("resetting all\r\n"); + // reset MNG_TC + MNG_TC::init(); + TC_list *tcp = VAR_SPACE::Head_node; + while(tcp != NULL){ + TC_list *temp = tcp->next_TC; + delete tcp; + tcp = temp; + } + + // reset COM_RCV_TC +// handle reset + + // reset data linked list + data_list *dataptr = VAR_SPACE::head_data; + while( dataptr != NULL ){ + data_list *temp = dataptr->next; + delete dataptr; + dataptr = temp; + } + VAR_SPACE::head_data = new data_list; + VAR_SPACE::rx_new_node = VAR_SPACE::head_data; } int main(){ + printf("welcome to mng_tm_tc\r\n"); ledr = 1; PC.baud(9600); - // rx stuff rx1m.baud(1200); rx1m.attach(&rx_read); VAR_SPACE::head_data = new data_list; + VAR_SPACE::head_data->next = NULL; VAR_SPACE::rx_new_node = VAR_SPACE::head_data; - VAR_SPACE::rx_new_node->next = NULL; + + MNG_TC::init(); + + lcd.printf("0"); + + struct data_list *hehe = VAR_SPACE::head_data; + while( hehe != NULL ){ + printf("%x ", hehe->val); + hehe = hehe->next; + } + printf("\r\n"); while(true){ - - if(data_received && ( rx_timer.read() >= TIMEOUT_LIMIT ) ){ - if( (VAR_SPACE::Com_mng_tc_thread->get_state() == Thread::Inactive) || - (VAR_SPACE::Com_mng_tc_thread->get_state() == Thread::WaitingDelay) ){ - // inactive or osWaitForever - delete VAR_SPACE::Com_mng_tc_thread; - VAR_SPACE::Com_mng_tc_thread = new Thread( MNG_MAIN ); + ledg = !ledg; + if( VAR_SPACE::new_tc_received ){ + VAR_SPACE::new_tc_received = false; + struct data_list *haha = VAR_SPACE::head_data; + unsigned int count = 0; + while( haha != NULL ){ + ++count; +// printf("%x ", haha->val); + haha = haha->next; + } + printf("\t count = %u \r\n", count); + printf("new tc received : state = %u\r\n", VAR_SPACE::rx_state); + if( VAR_SPACE::rx_state == 0 ){ + VAR_SPACE::data_node = VAR_SPACE::head_data; + COM_RCV_TC::rx_rcv_tc(); + MNG_TC::start_with(); + if( MNG_TC::check_for_missing_TC() ){ + printf("everything pass\r\n"); + VAR_SPACE::rx_state = 1; + MNG_TC::execute_TC(); + } + } + else if( VAR_SPACE::rx_state == 3 ){ + VAR_SPACE::data_node = VAR_SPACE::head_data; + COM_RCV_TC::rx_rcv_tc(); + MNG_TC::start_with(); + if( MNG_TC::check_for_missing_TC() ){ + VAR_SPACE::execute_obosc = true; + VAR_SPACE::rx_state = 2; + MNG_TC::execute_TC(); + } } else{ - VAR_SPACE::rx_emergency = true; - - RCV_TC RcvClass( VAR_SPACE::Head_node2 ); - MNG_TC manager2( VAR_SPACE::Head_node2 ); - - manager2.update_valid_TC(); - manager2.decode_TC(); - manager2.execute_urgent(); - - VAR_SPACE::rx_emergency = false; + // invalid state in main found reset + reset_all(); } } - - ledg = !ledg; - Thread::wait(1000); + if(pass_over){ + pass_over = false; + first_time = true; + // pass got over reset all + reset_all(); + //also consider frame_no + } } -} \ No newline at end of file +}