app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

Revision:
15:7c2e70c36b98
Parent:
13:a436ba0b78e8
Parent:
14:bd909277eb13
Child:
16:f2661759714c
--- a/main.cpp	Tue Mar 07 04:37:39 2017 +0000
+++ b/main.cpp	Tue Mar 07 04:54:45 2017 +0000
@@ -1,68 +1,30 @@
+#include "CRC16.h"
 #include "mbed.h"
 #include "rtos.h"
-#include "bit.h"
-#include "uart.h"
-
-const float HALF_PERIOD = 0.05; // secondes
-
-Serial pc(USBTX, USBRX, 9600);
-DigitalIn in(p14);
-DigitalOut out(p13);
+#include <vector>
+using std::vector;
+DigitalIn in(p30);
 Thread ThreadLecture;
+const int PREAMBULE = 0b01010101;
+const int START = 0b01111110;
+const int END = 0b01111110;
+Serial pc(USBTX, USBRX);
+DigitalOut out(p8);
 
 bool transmit = false;      //faux pour le debut de demi-periode d'envoie d'un bit, vrai pour la 2ème demi-periode
 char trame_sent[80];        //tableau de la trame à envoyer
 uint8_t byte_sent_pos,      //position de l'octet dans le tableau d'envoi
         bit_sent,           //position du bit de l'octet en cours d'envoi (du MSB au LSB) 7..0
         trame_length;       //longueur de la trame complete
-//test
 
-bool clockTick = false;
-  
-extern "C" void RIT_IRQHandler(void) {
-    //clear flag
-    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
-    
-    //bIsHalfPeriod = !bIsHalfPeriod;
-}
-
-void p14_interrupt()
-{    
-    // On turn off les interrupts de lecture une fois qu'on a détecter un message
-    //uart.attach(NULL, uart.RxIrq);
-
-    // On envoie le signal au thread de lecture
-    ThreadLecture.signal_set(1);
-};
-
-void read()
-{
-    while(true) 
-    {
-        // Attente passive d'un message entrant
-        //uart.attach(&p14_interrupt, uart.RxIrq);
-        ThreadLecture.signal_wait(1);
-        
-        // Lis le message. Retourne une exception si il y a une erreur
-        //vector<char> message = uart_read(uart);
-        
-        //if (!message.empty())
-        //{
-            // Affiche le message à l'écran
-            //pc.printf(&message[0], message.size());
-        //}
-    }
-};
-
-void rit_init()
+void initTimers()
 {
     //Timer 1 (match)
     LPC_SC->PCLKSEL0 |= (1 << 4);           // pclk = cclk timer1
     LPC_SC->PCONP |= (1 << 2);              // timer1 power on
-    LPC_TIM1->MR0 = CLOCKS_TO_SECOND / 100; // 10 ms
+    LPC_TIM1->MR0 = 960000;                 // 100 ms
     LPC_TIM1->MCR = 3;                      // interrupt and reset control
-                                            // Interrupt & reset timer on match
-    LPC_TIM1->EMR = (3 << 4);
+    LPC_TIM1->EMR = (3 << 4);               // Interrupt & reset timer on match
     NVIC_EnableIRQ(TIMER1_IRQn);            // enable timer interrupt
     LPC_TIM1->TCR = 1;                      // enable Timer
  
@@ -75,10 +37,54 @@
     LPC_TIM2->TCR |= (1 << 1);              // reset timer
     LPC_TIM2->TCR &= ~(1 << 1);             // release reset
     LPC_TIM2->IR = 0xFFFFFFFF;              // clear interrupt register
-    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture on 2.0
+    LPC_TIM2->CCR |= 0x0000007;             // enable rising-edge and falling-edge capture
     NVIC_EnableIRQ(TIMER2_IRQn);            // enable timer interrupt
     LPC_TIM2->TCR = 1;                      // start Timer
-};
+}
+
+bool bTimer1 = false;
+extern "C" void TIMER1_IRQHandler()
+{
+    if ((LPC_TIM1->IR & 0x01) == 0x01)
+    {
+        bTimer1 = !bTimer1;
+        
+        LPC_TIM1->IR |= 1 << 0; // clear
+    }
+}
+
+int sumClocks = 0;
+int PeriodLength = 0;
+bool bReceivedFirstBit = false;
+extern "C" void TIMER2_IRQHandler()
+{
+    if (PeriodLength > 0)
+    {
+        if (LPC_TIM2->CR0 >= PeriodLength*1.5 || (sumClocks + LPC_TIM2->CR0) >= PeriodLength*1.5)
+        {
+            sumClocks = 0;
+            
+            ThreadLecture.signal_set(1);
+        }
+        else
+        {
+            sumClocks += LPC_TIM2->CR0;
+        }
+    }
+    else if (bReceivedFirstBit)
+    {
+        PeriodLength = LPC_TIM2->CR0 / 2;
+        ThreadLecture.signal_set(1);
+    }
+    else
+    {
+        bReceivedFirstBit = true;
+        ThreadLecture.signal_set(1);
+    }
+    
+    LPC_TIM2->TC = 0;
+    LPC_TIM2->IR |= 0xFFFFFFFF; // clear
+}
 
 bool codeManchester(bool bit, bool clock)
 {
@@ -87,18 +93,18 @@
 
 void send_data()
 {
-    out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), clockTick);  // Encodage Manchester
-    if(clockTick)
+    out = codeManchester(((trame_sent[byte_sent_pos] >> bit_sent) & 0x01), bTimer1);  // Encodage Manchester
+    if(bTimer1)
     {
         bit_sent--;
     }
-    clockTick = !clockTick;       //varier entre la 1ere et 2eme partie de demi-periode
+    bTimer1 = !bTimer1;       //varier entre la 1ere et 2eme partie de demi-periode
     if (bit_sent < 0) {     //Si l'octet a ete envoye
         bit_sent = 7;       //remettre la position initiale pour le prochain octet
         byte_sent_pos++;    //incrementer l'octet
         if (byte_sent_pos >= trame_length) {  //Si la trame a ete envoyee
             byte_sent_pos = 0;
-            clockTick = false;
+            bTimer1 = false;
         }
     }
 }
@@ -149,21 +155,37 @@
 {
     byte_sent_pos = 0;
     bit_sent = 7;
-    clockTick = false;
+    bTimer1 = false;
     //TODO start interrupt timer 1 
     //LPC_RIT->MCR = 1;                      //Permettre les interruption du MAT
     //LPC_RIT->MR0 = LPC_RIT->TC + HALF_PERIOD;  //Faire une interruption a la prochaine demi-periode
 }
 
+void read()
+{
+    char byte;
+    vector<char> bytes;
+    char shift = 0;
+    while (true)
+    {
+        ThreadLecture.signal_wait(1);
+        
+        byte = (byte << 1) + in;
+        
+        shift++;
+        if (shift == 8)
+        {
+            bytes.push_back(byte);
+            shift = 0;
+        }
+    }
+}
+
 int main() {
-    rit_init();
-    
+    LPC_PINCON->PINSEL0 |= (3 << 8); // pin30
+    initTimers();
     ThreadLecture.start(read);
     
     while(true) {
-        get_text();
-        write();
-        //uart.printf("12345");
-        wait_ms(100);
     }
 };
\ No newline at end of file