Xavier Bélanger / Mbed 2 deprecated APP4_Manchester

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
IC_Blood
Date:
Tue Feb 23 02:06:15 2016 +0000
Commit message:
Commit_1

Changed in this revision

CRC16.cpp Show annotated file Show diff for this revision Revisions of this file
CRC16.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CRC16.cpp	Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,49 @@
+#include "CRC16.h"
+CRC16::CRC16()
+{
+    unsigned short crc16table[256] = { 
+        0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,
+        0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,
+        0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,
+        0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,
+        0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,
+        0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,
+        0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,
+        0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,
+        0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,
+        0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,
+        0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,
+        0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,
+        0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,
+        0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,
+        0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,
+        0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101, 
+        0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,
+        0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,
+        0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,
+        0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,
+        0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,
+        0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,
+        0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,
+        0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,
+        0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,
+        0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,
+        0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,
+        0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,
+        0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,
+        0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,
+        0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,
+        0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202};
+ }
+ CRC16::~CRC16()
+ {}
+unsigned short CRC16::calculateCRC16(char input[], int lenght)
+{
+    unsigned short CRC16 = 0;
+    for(int i = 0; i < lenght; i++)
+    {
+        unsigned  short tableValue = crc16table[((CRC16>>8)^*(char *)input++)&SHIFTER];
+        CRC16=(CRC16<<8)^tableValue;
+    }
+    return CRC16;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CRC16.h	Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,17 @@
+#ifndef CRC16_H
+#define CRC16_H
+
+
+
+class CRC16
+{
+    private:
+        unsigned short crc16table[256];
+        const unsigned int SHIFTER = 0x00FF;
+        
+    public:
+        unsigned short calculateCRC16(char input[], int lenght);
+        CRC16();
+        ~CRC16();
+};
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,317 @@
+#include "main.h"
+
+int main()
+{
+    tclock = 1;
+    pos = 0;
+    
+    state = INIT_STATE;
+    m_crc = new CRC16();
+    messageReady = false;
+    
+    
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    pc.printf("\n");
+    
+    bitset<200> testMEF (string("0101010101111110000000000010000001000001010011000100110001001111001001001101011001111110"));
+    
+    for (int i = 87; i >= 0; i--)
+    {    
+        analyze_state(testMEF[i]);
+    }
+    
+    if(messageReady)
+    {
+        for (int i = 0; i < LENGTH_CHARGE_UTILE_BYTE; i++)
+            pc.printf("%c",c_chargeUtile[i]);
+    }
+    //toEncodeTest = bitset<696>(string("00011101010011"));
+    
+    //pc.printf("Test");
+    
+    //timer2_init();
+    
+    while(1)
+    {
+    }
+}
+
+void timer2_init(void)
+{
+    LPC_SC->PCLKSEL1 |=1<<12;       //pclk = cclk timer2
+    LPC_SC->PCONP |=1<<22;          //timer2 power on
+    LPC_TIM2->MR0 = 9600000;        //100 msec
+    LPC_TIM2->MCR = 3;              //interrupt and reset control
+                                    //3 = Interrupt & reset timer2 on match
+                                    //1 = Interrupt only, no reset of timer0
+    LPC_TIM2->EMR =2<<4;             //EMC0 = 10 (Toogle)
+    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer2 interrupt
+    LPC_TIM2->TCR = 1;              //enable Timer2
+}
+
+void timer3_init(void)
+{
+    LPC_SC->PCLKSEL1 |=1<<12;       //pclk = cclk timer2
+    LPC_SC->PCONP |=1<<22;          //timer2 power on
+    LPC_TIM2->MR0 = 9600000;        //100 msec
+    LPC_TIM2->MCR = 3;              //interrupt and reset control
+                                    //3 = Interrupt & reset timer2 on match
+                                    //1 = Interrupt only, no reset of timer0
+    LPC_TIM2->EMR =2<<4;             //EMC0 = 10 (Toogle)
+    NVIC_EnableIRQ(TIMER2_IRQn);    //enable timer2 interrupt
+    LPC_TIM2->TCR = 1;              //enable Timer2
+}
+
+
+bool analyze_state(bool bit)
+{
+    switch(state)
+    {
+       case INIT_STATE:
+            
+            pc.printf("INIT_STATE\t");
+            
+            if (bit == 0)
+            {
+                state = PREAMBULE;
+                nextBit = 1;
+                cntState = 0;
+            }
+            
+            break;
+            
+        case PREAMBULE:
+        
+            pc.printf("PREAMBULE\t");
+            if (bit == nextBit && cntState < 6)
+            {
+                nextBit = !nextBit;
+                cntState++;
+            }
+            else if (bit == nextBit && cntState == 6)
+            {
+                state = START;
+                cntState = 0;
+                nextBit = 0;
+            }
+            else
+            {
+                state = INIT_STATE;
+            }
+            
+            break;
+            
+        case START:
+        
+            pc.printf("START\t");
+            
+            if(cntState == 0 && bit == nextBit)
+            {
+                nextBit = 1;
+                cntState++;
+            }
+            else if (cntState < 6 && bit == nextBit)
+            {
+                cntState++;
+            }
+            else if (cntState == 6 && bit == nextBit)
+            {
+                nextBit = 0;
+                cntState++;
+            }
+            else if (cntState == 7 && bit == nextBit)
+            {
+                state = ENTETE;
+                cntState = 0;
+                nextBit = 0;
+            }
+            else
+            {
+                state = INIT_STATE;
+            }
+            
+            break;
+           
+        case ENTETE:
+        
+            if(cntState < 7 && nextBit == 0)
+            {
+                pc.printf("TEST1: %i \t", cntState);
+                cntState++;
+                
+            }
+            else if (cntState == 7 && nextBit == 0)
+            {
+                pc.printf("TEST2: %i \t", cntState);
+                nextBit = 1;
+            }
+            else if (nextBit == 1 && cntState > 0)
+            {
+                pc.printf("TEST3: %i \t", cntState);
+                buffer.set(cntState, bit);
+                cntState--;
+            }
+            else if (nextBit == 1 && cntState == 0)
+            { 
+                buffer.set(cntState, bit);
+                state = CHARGE_UTILE;
+                LENGTH_CHARGE_UTILE_BIT = (int)(buffer.to_ulong());
+                
+                cntState = LENGTH_CHARGE_UTILE_BIT - 1;
+            }
+            else
+            {
+                state = INIT_STATE;
+            }
+            
+            break;
+           
+        case CHARGE_UTILE:
+            
+            pc.printf("CHARGE UTILE\t");
+            
+            if (cntState > 0)
+            {
+               chargeUtile.set(cntState, bit); 
+               cntState--;
+            }
+            else if (cntState == 0)
+            {
+                chargeUtile.set(cntState, bit); 
+                cntState = 0;
+                state = CONTROLE;
+                nextBit = 0;
+            }
+            else
+            {
+                state = INIT_STATE;
+            }
+            
+            break;
+           
+        case CONTROLE:
+            
+            if(nextBit == 0)
+            {
+                LENGTH_CHARGE_UTILE_BYTE = LENGTH_CHARGE_UTILE_BIT / 8;
+                
+                for (int i = 0; i < LENGTH_CHARGE_UTILE_BIT; i++)
+                {
+                    pc.printf("%i", (chargeUtile[i] & 0x1));
+                    if (i % 8 == 0)
+                        c_chargeUtile[i / 8] = (chargeUtile[i] << 7) | (chargeUtile[i + 1] << 6) | (chargeUtile[i + 2] << 5) | (chargeUtile[i + 3] << 4) | (chargeUtile[i + 4] << 3) | (chargeUtile[i + 5] << 2) | (chargeUtile[i + 6] << 1) | (chargeUtile[i + 7] << 0);
+                }
+                
+                CRC_Calculated = m_crc->calculateCRC16(c_chargeUtile, LENGTH_CHARGE_UTILE_BYTE);
+                
+                pc.printf("CRC Calculated: %hu\t", CRC_Calculated);
+                
+                nextBit = 1;
+                cntState = 14;
+                buffer.reset();
+                buffer.set(15, bit);
+            }
+            else if (nextBit == 1 && cntState > 0)
+            {
+                buffer.set(cntState, bit);
+                cntState--;
+            }
+            else if (nextBit == 1 && cntState == 0)
+            {
+                buffer.set(cntState, bit);
+                CRC_Received = (unsigned short)buffer.to_ulong();
+                
+                pc.printf("CRC Received: %hu\t", CRC_Received);
+                
+                if (CRC_Received != CRC_Calculated)
+                {
+                    state = END;
+                    nextBit = 0;
+                    cntState = 0;
+                }
+                else
+                {
+                    state = INIT_STATE;
+                }
+            }
+            else
+            {
+                state = INIT_STATE;
+            }
+            
+            break;
+           
+        case END:
+        
+            if (nextBit == 0 && nextBit == bit && cntState == 0)
+            {
+                nextBit = 1;
+                cntState++;
+            }
+            else if (nextBit == 1 && nextBit == bit && cntState < 6)
+            {
+                cntState++;
+            }
+            else if (nextBit == 1 && nextBit == bit && cntState == 6)
+            {
+                nextBit = 0;
+                cntState++;
+            }
+            else if (nextBit == 0 && nextBit == bit && cntState == 7)
+            {
+                messageReady = true;
+                state = INIT_STATE;
+            }
+            else
+            {
+                state = INIT_STATE;
+                messageReady = false;
+            }
+        
+        break;
+    }
+    
+    return 1;
+}
+
+extern "C" void TIMER2_IRQHandler (void)
+{
+    if ((LPC_TIM2->IR & 0x01) == 0x01)   // if MR0 interrupt, proceed
+    {
+        LPC_TIM2->IR |= 1 << 0;         // Clear MR0 interrupt flag
+        
+        tclock = !tclock;
+        
+        if (pos < 14)
+        {            
+            LPC_TIM2->EMR = (toEncodeTest[pos] == tclock);
+            pc.printf("%i", (toEncodeTest[pos] == tclock));
+            if (tclock)
+                pos++;
+        }
+    }
+}
+
+extern "C" void TIMER3_IRQHandler (void)
+{
+    if ((LPC_TIM3->IR & 0x01) == 0x01)   // if MR0 interrupt, proceed
+    {
+        LPC_TIM3->IR |= 1 << 0;         // Clear MR0 interrupt flag
+        
+        tclock = !tclock;
+        
+        if (pos < 14)
+        {            
+            LPC_TIM2->EMR = (toEncodeTest[pos] == tclock);
+            pc.printf("%i", (toEncodeTest[pos] == tclock));
+            if (tclock)
+                pos++;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "mbed.h"
+#include "CRC16.h"
+#include <iostream>       // std::cout
+#include <string>         // std::string
+#include <bitset>         // std::bitset
+
+DigitalOut data(p26); //Data
+
+enum states
+{
+    INIT_STATE      = 0,
+    PREAMBULE       = 1,
+    START           = 2,
+    ENTETE          = 3,
+    CHARGE_UTILE    = 4,
+    CONTROLE        = 5,
+    END             = 6
+};
+
+int state;
+int cntState;
+bool nextBit;
+bitset<16> buffer;
+bitset<640> chargeUtile;
+int LENGTH_CHARGE_UTILE_BIT;
+int LENGTH_CHARGE_UTILE_BYTE;
+char c_chargeUtile[80];
+unsigned short CRC_Calculated;
+unsigned short CRC_Received;
+bool messageReady;
+CRC16 *m_crc;
+
+Serial pc(USBTX, USBRX);
+
+bool tclock;
+bitset<696> toEncodeTest;
+int pos;
+
+void timer2_init(void);
+int manchester_encode(bitset<696> toEncode);
+int manchester_decode();
+extern "C" void TIMER2_IRQHandler (void);
+bool analyze_state(bool bit);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Feb 23 02:06:15 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/252557024ec3
\ No newline at end of file