desloges-libioulle / Mbed 2 deprecated app4_clockless

Dependencies:   mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
libv2001
Date:
Mon Mar 06 21:35:31 2017 +0000
Parent:
0:fc7bc75ace9b
Commit message:
Final Version

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Mon Mar 06 19:55:58 2017 +0000
+++ b/main.cpp	Mon Mar 06 21:35:31 2017 +0000
@@ -6,24 +6,34 @@
 
 Serial pc(USBTX, USBRX);
 
-DigitalOut led1(LED1);
+DigitalOut led1(LED1); // Error Led
+DigitalOut led2(LED2); // Still Alive Answer
+DigitalOut led3(LED3); // Short Message
+DigitalOut led4(LED4); // Long Message
 DigitalOut dataOut(p11);
 InterruptIn dataIn(p12);
+InterruptIn btn1(p15);
+InterruptIn btn2(p14);
+
 
 Thread sender;
 Thread receiver;
 
+
+bool detectingPreambule = false;
+bool dataInState = false;
+
 uint32_t elapsed;
 uint32_t dataToggleT[7];
 int dataInToggleCount = 0;
 
 uint32_t elapsedMin, elapsedMax;
 
+bool reading = false;
+bool bitReceived = false;
 bool clkUp = false;
-
 bool shortMessageRequested = false;
 bool longMessageRequested = false;
-
 bool stillAliveRequested = false;
 int stillAliveCounter = 10;
 
@@ -47,7 +57,6 @@
         LPC_TIM2->IR |= 1 << 0;         // Clear MR0 interrupt flag
         clkUp = !clkUp;
         sender.signal_set(SIGNAL_CLK_TOGGLE);
-        led1 = !led1;
     }
 }
 
@@ -55,7 +64,7 @@
 {
     LPC_SC->PCLKSEL1 |=1<<12;       //pclk = cclk timer2
     LPC_SC->PCONP |=1<<22;          //timer2 power on
-    LPC_TIM2->MR0 = 960000;         //10 msec
+    LPC_TIM2->MR0 = 96000;         //10 msec
     LPC_TIM2->MCR = 3;              //interrupt and reset control
     //3 = Interrupt & reset timer2 on match
     //1 = Interrupt only, no reset of timer0
@@ -68,6 +77,8 @@
     elapsed = LPC_TIM0->TC;
     LPC_TIM0->TC = 0;
     
+    dataInState = true;
+    
     dataToggleT[dataInToggleCount] = elapsed;
     dataInToggleCount = (dataInToggleCount + 1) % 7;
     if (elapsed < elapsedMin){
@@ -80,7 +91,9 @@
 void DataInFall(){
     elapsed = LPC_TIM0->TC;
     LPC_TIM0->TC = 0;
-
+    
+    dataInState = false;
+    
     dataToggleT[dataInToggleCount] = elapsed;
     dataInToggleCount = (dataInToggleCount + 1) % 7;
     if (elapsed < elapsedMin){
@@ -90,6 +103,14 @@
     }
 }
 
+void ShortMessageInt(){
+    shortMessageRequested = true;
+}
+
+void LongMessageInt(){
+    longMessageRequested = true;
+}
+
 // *************************
 //         Sender
 // *************************
@@ -159,7 +180,7 @@
         int i = 0; 
         buffer[0] = 0;
         while (i < length){
-            buffer[0] = buffer[0] + 1;
+            buffer[0] = (length - i) > (MAX_LENGTH - 1) ? buffer[0] + 1 : 0xFF;
             int subLength = (length - i) > (MAX_LENGTH - 1) ? MAX_LENGTH - 1: length - i;
             memcpy(&buffer[1],&msg[i],subLength);
             SendFrame(buffer, subLength + 1, TYPE_DATA|FLAG_QUESTION);
@@ -229,7 +250,7 @@
         uint32_t delta = dataToggleT[0];
         uint32_t tempMin = (uint32_t) ((float)delta * 0.9f);
         uint32_t tempMax = (uint32_t) ((float)delta * 1.1f);
-        bool success = true;
+        bool success = !dataInState;
         for (int i = 1; i < 7 && success; ++i){
             if (dataToggleT[i] > tempMax || dataToggleT[i] < tempMin){
                 success = false;
@@ -262,6 +283,7 @@
     WaitForPreambule();
     data = ReadByte();
     if (data != START){
+        //pc.printf("Bad Start Byte %02X\r\n", data);
         return false;
     }
     
@@ -282,11 +304,13 @@
     hisDiggest = (hisDiggest << 8) | ReadByte();
     
     if(myDiggest != hisDiggest){
+        //pc.printf("Bad Diggest %04X, %04X\r\n", myDiggest, hisDiggest);
         return false;
     }
     
     data = ReadByte();
     if (data != END){
+        //pc.printf("Bad End Byte %02X\r\n", data);
         return false;
     }
     return true;
@@ -297,16 +321,26 @@
         stillAliveRequested = true;
     } else {
         stillAliveCounter = 10;
-        pc.printf("The other device is still alive!!!\r\n");
+        //pc.printf("The other device is still alive!!!\r\n");
+        led2 = !led2;
     }
 }
 
 void HandleDataFrame(char * frame){
     char frag = frame[FRAGMENTATION_IDX];
-    char msg[MAX_LENGTH];
-    msg[frame[LENGTH_IDX] - 1] = 0;
-    memcpy(msg, &frame[FRAGMENTATION_IDX + 1], frame[LENGTH_IDX] - 1);
-    pc.printf("Message %d: %s \r\n",frag,msg);
+    
+    if (frag == 0x00){
+        led3 = !led3;
+    } else if (frag != 0xFF){
+        led4 = 1;
+    } else {
+        led4 = 0;
+    }
+    
+    //char msg[MAX_LENGTH];
+    //msg[frame[LENGTH_IDX] - 1] = 0;
+    //memcpy(msg, &frame[FRAGMENTATION_IDX + 1], frame[LENGTH_IDX] - 1);
+    //pc.printf("Message %d: %s \r\n",frag,msg);
 }
 
 void HandleFrame(char * frame){
@@ -319,7 +353,7 @@
         HandleDataFrame(frame);
         break;
     default:
-        pc.printf("Unknown Frame Type : %02X\r\n", frame[TYPE_FLAG_IDX]);
+        //pc.printf("Unknown Frame Type : %02X\r\n", frame[TYPE_FLAG_IDX]);
         break;
     }
 }
@@ -328,9 +362,11 @@
     char frame[80];
     while(true){
         if(!readFrame(frame)){
-            pc.printf("Error while receiving frame\r\n");
+            //pc.printf("Error while receiving frame\r\n");
+            led1 = 1;
             continue;
         }
+        led1 = 0;
         HandleFrame(frame);
     }
 }
@@ -348,6 +384,9 @@
     dataIn.rise(DataInRise);
     dataIn.fall(DataInFall);
     
+    btn1.rise(&ShortMessageInt);
+    btn2.rise(&LongMessageInt);
+    
     sender.start(SenderMain);
     receiver.start(ReceiverMain);