TELECOMMAND MANAGER V1

Dependencies:   mbed SLCD mbed-rtos

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
+}