Add CRC16 library

Dependencies:   CRC16 mbed-rtos mbed

Fork of S5info_APP4 by Éric Bisson

Files at this revision

API Documentation at this revision

Comitter:
JoeyDionne
Date:
Tue Mar 07 00:31:52 2017 +0000
Parent:
8:177b2370528b
Commit message:
Write code

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 177b2370528b -r edf45585032a main.cpp
--- a/main.cpp	Mon Mar 06 20:06:54 2017 +0000
+++ b/main.cpp	Tue Mar 07 00:31:52 2017 +0000
@@ -19,15 +19,26 @@
 InterruptIn read_pin(p14);
 Thread* thread;
 
+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
+
 bool bIsHalfPeriod = false;
-  
-extern "C" void RIT_IRQHandler(void) {
-    //clear flag
-    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
-    
-    myled1 = !myled1;
-    bIsHalfPeriod = !bIsHalfPeriod;
-}
+
+//TODO (Erase when not usefull anymore, timer handling read and write)
+/*extern "C" void TIMER2_IRQHandler (void)
+{
+    if((LPC_TIM2->IR & 0x01) == 0x01) { //Si il y a interruption par le MAT
+        LPC_TIM2->IR &= ~(1 << 0);      //Nettoyer le drapeau de l'interruption du MR0
+        send_data();
+    }
+    else if (((LPC_TIM2->IR >> 4) & 0x01) == 0x01) {    //Si il y a interruption du CAP
+        LPC_TIM2->IR &= ~(1 << 4);                      //Nettoyer le drapeau de l'interruption du CR0
+        receive_data();
+    }
+}*/
 
 void p14_interrupt()
 {    
@@ -66,6 +77,107 @@
     NVIC_EnableIRQ(RIT_IRQn);
 };
 
+/*TODO Initialisation des paramettres du TIMER 2*/
+/*
+void timer2_init(void)
+{
+    LPC_SC->PCLKSEL1 |=1<<12;       //pclk = cclk timer2
+    LPC_SC->PCONP |=1<<22;          //timer2 power on
+    //LPC_TIM2->MR0 = PERIOD;
+    //LPC_TIM2->MCR = 0;            //interrupt and reset control
+                                    //3 = Interrupt & reset timer2 on match
+                                    //1 = Interrupt only, no reset of timer0
+    LPC_TIM2->CCR = 5;              //5 = Interrupt on rising edge
+                                    //6 = Interrupt on falling edge
+                                    //7 = Interrupt rising or falling edge
+                                    
+    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer2 interrupt
+    LPC_TIM2->TCR = 1;              //enable Timer2
+    //pc.printf("\n\rTimer set");
+}*/
+
+void send_data()
+{
+    if (!transmit) { //Si on est dans la premiere demi-periode d'envoie
+        if (((trame_sent[byte_sent_pos] >> bit_sent) & 0x01) == 1) { //Verifier le bit à envoyer et preparer la prochaine interruption pour prendre sa valeur
+            LPC_RIT->EMR |= 1 << 5;
+            LPC_RIT->EMR &= ~(1 << 4);
+        } else {
+            LPC_RIT->EMR |= 1 << 4;
+            LPC_RIT->EMR &= ~(1 << 5);
+        }
+    } else {        //Si on est dans la 2eme demi-periode d'envoie, toggle a la prochaine interruption
+        LPC_RIT->EMR |= 3 << 4;
+        bit_sent--;
+    }
+    transmit = !transmit;       //varier entre la 1ere et 2eme partie de demi-periode
+    LPC_RIT->MR0 += HALF_PERIOD;    //preparer la prochaine interruption a une demi-periode plus loin
+    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
+            LPC_RIT->MCR &= 0;             //desactiver les interruptions du MAT
+            LPC_RIT->EMR &= ~(3 << 4);     //remettre a zero le registre EMR (00 pour rien faire, 01 pour mettre a 1, 10 pour mettre a 0 et 11 pour toggle)
+            byte_sent_pos = 0;
+            transmit = false;
+        }
+    }
+}
+
+void get_text()
+{
+    CRC16 *myCRC = new CRC16();
+    
+    trame_sent[0] = 0x55;    //Preambule
+    trame_sent[1] = 0x7E;    //Start
+    trame_sent[2] = 0x00;    //Type + Flag mis a 0x00
+    
+    pc.printf("\n\rYour text : ");
+    int count = 0;
+    char c = 0x00;
+    char text[73];
+    while(c != 0x0D && count < 73) { //Tant que c'est different de '\r' et un maximum de 33 caractères 
+        c = pc.getc();
+        trame_sent[count + 4] = c;   //Ajouter les caractères tapés au clavier dans le message
+        text[count] = c;
+        pc.putc(c);
+        count++;
+    }
+    trame_sent[3] = (char)count;     //Longueur du message (Max 33 caractères)
+    
+    unsigned short resultCRC = myCRC->calculateCRC16(text,count);     
+    trame_sent[count + 4] = (resultCRC >> 8) & 0xFF;
+    trame_sent[count + 5] = resultCRC & 0xFF;
+    
+    trame_sent[count + 6] = 0x7E;    //End
+    trame_length = count + 6;        //Longueur de la trame
+    
+}
+
+void write()
+{
+    byte_sent_pos = 0;
+    bit_sent = 7;
+    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
+}
+
+extern "C" void RIT_IRQHandler(void) {
+    //clear flag
+    LPC_RIT->RICTRL |= bit0; //write 1 to clear bit
+    
+    //Write
+    if((LPC_TIM2->IR & 0x01) == 0x01) { //Si il y a interruption par le MAT
+        LPC_TIM2->IR &= ~(1 << 0);      //Nettoyer le drapeau de l'interruption du MR0
+        send_data();
+    }
+    
+    //TODO Read
+    
+    myled1 = !myled1;
+    bIsHalfPeriod = !bIsHalfPeriod;
+}
+
 int main() {
     rit_init();
     read_pin.fall(p14_interrupt);
@@ -76,7 +188,8 @@
     thread->start(read);
     
     while(true) {
-        // TODO: Mettre ici le code pour l'input et l'envoie de message
+        get_text();
+        write();
         uart.putc(0);
         wait_ms(100);
     }