Add CRC16 library

Dependencies:   CRC16 mbed-rtos mbed

Fork of S5info_APP4 by Éric Bisson

Committer:
ericbisson
Date:
Tue Jan 31 00:51:06 2017 +0000
Revision:
2:c6465d4e82d2
Parent:
1:b3ae0d9f02ad
Child:
3:3ecbcc05bc85
a tester

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ericbisson 0:c637467eeb8f 1 #include "mbed.h"
ericbisson 0:c637467eeb8f 2 #include "rtos.h"
ericbisson 0:c637467eeb8f 3
ericbisson 2:c6465d4e82d2 4 #define UN_HUITIEME_SHORT 0x1FFF
ericbisson 2:c6465d4e82d2 5 #define MOVING_AVG_SIZE 5
ericbisson 1:b3ae0d9f02ad 6
ericbisson 1:b3ae0d9f02ad 7 struct message_t
ericbisson 1:b3ae0d9f02ad 8 {
ericbisson 1:b3ae0d9f02ad 9 time_t timestamp;
ericbisson 1:b3ae0d9f02ad 10 char pin_id;
ericbisson 1:b3ae0d9f02ad 11 unsigned short value;
ericbisson 1:b3ae0d9f02ad 12 };
ericbisson 1:b3ae0d9f02ad 13
ericbisson 1:b3ae0d9f02ad 14 struct MovingAverage_t
ericbisson 1:b3ae0d9f02ad 15 {
ericbisson 1:b3ae0d9f02ad 16 unsigned short buffer[MOVING_AVG_SIZE];
ericbisson 1:b3ae0d9f02ad 17 char cursor;
ericbisson 1:b3ae0d9f02ad 18 bool bFilled;
ericbisson 1:b3ae0d9f02ad 19 };
ericbisson 2:c6465d4e82d2 20
ericbisson 2:c6465d4e82d2 21 Thread* t1;
ericbisson 2:c6465d4e82d2 22 Thread* t2;
ericbisson 2:c6465d4e82d2 23 Thread* t3;
ericbisson 2:c6465d4e82d2 24
ericbisson 2:c6465d4e82d2 25 DigitalIn* en_1;
ericbisson 2:c6465d4e82d2 26 DigitalIn* en_2;
ericbisson 2:c6465d4e82d2 27 AnalogIn* ea_1;
ericbisson 2:c6465d4e82d2 28 AnalogIn* ea_2;
ericbisson 2:c6465d4e82d2 29 Serial* pc;
ericbisson 2:c6465d4e82d2 30 Mutex* mutex;
ericbisson 2:c6465d4e82d2 31 Mail<message_t, 16>* Mailbox;
ericbisson 2:c6465d4e82d2 32
ericbisson 2:c6465d4e82d2 33 MovingAverage_t* MovingAverageP19;
ericbisson 2:c6465d4e82d2 34 MovingAverage_t* MovingAverageP20;
ericbisson 1:b3ae0d9f02ad 35
ericbisson 1:b3ae0d9f02ad 36 bool bLast_p15 = false;
ericbisson 1:b3ae0d9f02ad 37 bool bLast_p16 = false;
ericbisson 1:b3ae0d9f02ad 38 unsigned short u16Last_p19 = 0;
ericbisson 1:b3ae0d9f02ad 39 unsigned short u16Last_p20 = 0;
ericbisson 0:c637467eeb8f 40
ericbisson 0:c637467eeb8f 41 void signal_analog()
ericbisson 0:c637467eeb8f 42 {
ericbisson 0:c637467eeb8f 43 t1->signal_set(1);
ericbisson 0:c637467eeb8f 44 }
ericbisson 0:c637467eeb8f 45
ericbisson 0:c637467eeb8f 46 void signal_digital()
ericbisson 0:c637467eeb8f 47 {
ericbisson 2:c6465d4e82d2 48 t2->signal_set(1);
ericbisson 0:c637467eeb8f 49 }
ericbisson 0:c637467eeb8f 50
ericbisson 1:b3ae0d9f02ad 51 unsigned short moyenne_mobile(MovingAverage_t* MA, unsigned short newData)
ericbisson 1:b3ae0d9f02ad 52 {
ericbisson 1:b3ae0d9f02ad 53 int sum = 0;
ericbisson 1:b3ae0d9f02ad 54 MA->buffer[MA->cursor] = newData;
ericbisson 1:b3ae0d9f02ad 55 MA->cursor++;
ericbisson 1:b3ae0d9f02ad 56 if (MA->cursor >= MOVING_AVG_SIZE)
ericbisson 1:b3ae0d9f02ad 57 {
ericbisson 1:b3ae0d9f02ad 58 MA->cursor = 0;
ericbisson 1:b3ae0d9f02ad 59 MA->bFilled = true;
ericbisson 1:b3ae0d9f02ad 60 }
ericbisson 1:b3ae0d9f02ad 61
ericbisson 1:b3ae0d9f02ad 62 if (MA->bFilled)
ericbisson 1:b3ae0d9f02ad 63 {
ericbisson 1:b3ae0d9f02ad 64 for (char i = 0; i < MOVING_AVG_SIZE; i++)
ericbisson 1:b3ae0d9f02ad 65 {
ericbisson 1:b3ae0d9f02ad 66 sum += MA->buffer[i];
ericbisson 1:b3ae0d9f02ad 67 }
ericbisson 1:b3ae0d9f02ad 68 sum = sum / MOVING_AVG_SIZE;
ericbisson 1:b3ae0d9f02ad 69 }
ericbisson 1:b3ae0d9f02ad 70 else
ericbisson 1:b3ae0d9f02ad 71 {
ericbisson 1:b3ae0d9f02ad 72 for (char i = 0; i < MA->cursor; i++)
ericbisson 1:b3ae0d9f02ad 73 {
ericbisson 1:b3ae0d9f02ad 74 sum += MA->buffer[i];
ericbisson 1:b3ae0d9f02ad 75 }
ericbisson 1:b3ae0d9f02ad 76 sum = sum / MA->cursor;
ericbisson 1:b3ae0d9f02ad 77 }
ericbisson 1:b3ae0d9f02ad 78
ericbisson 1:b3ae0d9f02ad 79 return sum;
ericbisson 1:b3ae0d9f02ad 80 }
ericbisson 1:b3ae0d9f02ad 81
ericbisson 2:c6465d4e82d2 82 void MailBox_put(time_t timestamp, char pin_id, unsigned short value)
ericbisson 1:b3ae0d9f02ad 83 {
ericbisson 2:c6465d4e82d2 84 // Prepare the message to send
ericbisson 2:c6465d4e82d2 85 message_t* msg = Mailbox->calloc();
ericbisson 2:c6465d4e82d2 86 msg->timestamp = timestamp;
ericbisson 2:c6465d4e82d2 87 msg->pin_id = pin_id;
ericbisson 2:c6465d4e82d2 88 msg->value = value;
ericbisson 2:c6465d4e82d2 89
ericbisson 2:c6465d4e82d2 90 // Add the message to the mailbox
ericbisson 2:c6465d4e82d2 91 mutex->lock();
ericbisson 2:c6465d4e82d2 92 Mailbox->put(msg);
ericbisson 2:c6465d4e82d2 93 mutex->unlock();
ericbisson 2:c6465d4e82d2 94
ericbisson 2:c6465d4e82d2 95 // Signal the new message
ericbisson 2:c6465d4e82d2 96 t3->signal_set(1);
ericbisson 1:b3ae0d9f02ad 97 t1->yield();
ericbisson 1:b3ae0d9f02ad 98 t2->yield();
ericbisson 1:b3ae0d9f02ad 99 }
ericbisson 1:b3ae0d9f02ad 100
ericbisson 2:c6465d4e82d2 101 void lecture_analog() {
ericbisson 2:c6465d4e82d2 102 while (true) {
ericbisson 2:c6465d4e82d2 103 // synchronisation sur la période d'échantillonnage
ericbisson 2:c6465d4e82d2 104 t1->signal_wait(1);
ericbisson 2:c6465d4e82d2 105
ericbisson 2:c6465d4e82d2 106 // lecture de l'étampe temporelle
ericbisson 2:c6465d4e82d2 107 time_t curTime = time(NULL);
ericbisson 2:c6465d4e82d2 108
ericbisson 2:c6465d4e82d2 109 // lecture des échantillons analogiques
ericbisson 2:c6465d4e82d2 110 // calcul de la nouvelle moyenne courante
ericbisson 2:c6465d4e82d2 111 unsigned short res_p19 = moyenne_mobile(MovingAverageP19, ea_1->read_u16());
ericbisson 2:c6465d4e82d2 112 unsigned short res_p20 = moyenne_mobile(MovingAverageP20, ea_2->read_u16());
ericbisson 2:c6465d4e82d2 113
ericbisson 2:c6465d4e82d2 114 // génération éventuelle d'un événement
ericbisson 2:c6465d4e82d2 115 if ((res_p19 + UN_HUITIEME_SHORT) < u16Last_p19 || (res_p19 - UN_HUITIEME_SHORT) > u16Last_p19 )
ericbisson 2:c6465d4e82d2 116 {
ericbisson 2:c6465d4e82d2 117 MailBox_put(curTime, 19, res_p19);
ericbisson 2:c6465d4e82d2 118 }
ericbisson 2:c6465d4e82d2 119 if ((res_p20 + UN_HUITIEME_SHORT < u16Last_p20) || (res_p20 - UN_HUITIEME_SHORT) > u16Last_p20 )
ericbisson 2:c6465d4e82d2 120 {
ericbisson 2:c6465d4e82d2 121 MailBox_put(curTime, 20, res_p20);
ericbisson 2:c6465d4e82d2 122 }
ericbisson 2:c6465d4e82d2 123
ericbisson 2:c6465d4e82d2 124 u16Last_p19 = res_p19;
ericbisson 2:c6465d4e82d2 125 u16Last_p20 = res_p20;
ericbisson 2:c6465d4e82d2 126
ericbisson 2:c6465d4e82d2 127 t1->signal_clr(1);
ericbisson 2:c6465d4e82d2 128 t1->yield();
ericbisson 1:b3ae0d9f02ad 129 }
ericbisson 0:c637467eeb8f 130 }
ericbisson 2:c6465d4e82d2 131 void lecture_num() {
ericbisson 2:c6465d4e82d2 132 while (true) {
ericbisson 2:c6465d4e82d2 133 // synchronisation sur la période d'échantillonnage
ericbisson 2:c6465d4e82d2 134 t2->signal_wait(1);
ericbisson 2:c6465d4e82d2 135
ericbisson 2:c6465d4e82d2 136 // lecture de l'étampe temporelle
ericbisson 2:c6465d4e82d2 137 time_t curTime = time(NULL);
ericbisson 2:c6465d4e82d2 138
ericbisson 2:c6465d4e82d2 139 // lecture des échantillons numériques
ericbisson 2:c6465d4e82d2 140 bool bP15 = en_1->read();
ericbisson 2:c6465d4e82d2 141 bool bP16 = en_2->read();
ericbisson 2:c6465d4e82d2 142
ericbisson 2:c6465d4e82d2 143 // prise en charge du phénomène de rebond
ericbisson 2:c6465d4e82d2 144 wait_ms(50); // :')
ericbisson 2:c6465d4e82d2 145
ericbisson 2:c6465d4e82d2 146 // génération éventuelle d'un événement
ericbisson 2:c6465d4e82d2 147 if (en_1->read() == bP15 && bP15 != bLast_p15)
ericbisson 2:c6465d4e82d2 148 {
ericbisson 2:c6465d4e82d2 149 MailBox_put(curTime, 15, bP15);
ericbisson 2:c6465d4e82d2 150 }
ericbisson 2:c6465d4e82d2 151 if (en_2->read() == bP16 && bP16 != bLast_p16)
ericbisson 2:c6465d4e82d2 152 {
ericbisson 2:c6465d4e82d2 153 MailBox_put(curTime, 16, bP16);
ericbisson 2:c6465d4e82d2 154 }
ericbisson 2:c6465d4e82d2 155 bLast_p15 = bP15;
ericbisson 2:c6465d4e82d2 156 bLast_p16 = bP16;
ericbisson 2:c6465d4e82d2 157
ericbisson 2:c6465d4e82d2 158 t2->signal_clr(1);
ericbisson 2:c6465d4e82d2 159 t2->yield();
ericbisson 1:b3ae0d9f02ad 160 }
ericbisson 0:c637467eeb8f 161 }
ericbisson 2:c6465d4e82d2 162 void collection() {
ericbisson 2:c6465d4e82d2 163 while (true) {
ericbisson 2:c6465d4e82d2 164 // attente et lecture d'un événement
ericbisson 2:c6465d4e82d2 165 t3->signal_wait(1);
ericbisson 2:c6465d4e82d2 166 mutex->lock();
ericbisson 2:c6465d4e82d2 167 while (Mailbox->get().status == osEventMail)
ericbisson 2:c6465d4e82d2 168 {
ericbisson 2:c6465d4e82d2 169 message_t* msg = (message_t*)Mailbox->get().value.p;
ericbisson 2:c6465d4e82d2 170
ericbisson 2:c6465d4e82d2 171 // écriture de l'événement en sortie (port série)
ericbisson 2:c6465d4e82d2 172 pc->printf("[%s] Evenement de la pin %d avec valeur %d\n", ctime(&(msg->timestamp)), msg->pin_id, msg->value);
ericbisson 2:c6465d4e82d2 173
ericbisson 2:c6465d4e82d2 174 Mailbox->free(msg);
ericbisson 2:c6465d4e82d2 175 }
ericbisson 2:c6465d4e82d2 176 mutex->unlock();
ericbisson 2:c6465d4e82d2 177 t3->signal_clr(1);
ericbisson 2:c6465d4e82d2 178 t3->yield();
ericbisson 2:c6465d4e82d2 179 }
ericbisson 0:c637467eeb8f 180 }
ericbisson 2:c6465d4e82d2 181 int main() {
ericbisson 2:c6465d4e82d2 182 // Initialization de tous les globals
ericbisson 2:c6465d4e82d2 183 Mailbox = new Mail<message_t, 16>();
ericbisson 2:c6465d4e82d2 184 MovingAverageP19 = new MovingAverage_t();
ericbisson 2:c6465d4e82d2 185 MovingAverageP20 = new MovingAverage_t();
ericbisson 2:c6465d4e82d2 186 en_1 = new DigitalIn(p15);
ericbisson 2:c6465d4e82d2 187 en_2 = new DigitalIn(p16);
ericbisson 2:c6465d4e82d2 188 ea_1 = new AnalogIn(p19);
ericbisson 2:c6465d4e82d2 189 ea_2 = new AnalogIn(p20);
ericbisson 2:c6465d4e82d2 190 mutex = new Mutex();
ericbisson 2:c6465d4e82d2 191 pc = new Serial(USBTX, USBRX);
ericbisson 2:c6465d4e82d2 192
ericbisson 0:c637467eeb8f 193 // set the time
ericbisson 1:b3ae0d9f02ad 194 set_time(1485887400);
ericbisson 0:c637467eeb8f 195
ericbisson 0:c637467eeb8f 196 // démarrage des tâches
ericbisson 0:c637467eeb8f 197 t1 = new Thread();
ericbisson 0:c637467eeb8f 198 t2 = new Thread();
ericbisson 0:c637467eeb8f 199 t3 = new Thread();
ericbisson 0:c637467eeb8f 200
ericbisson 0:c637467eeb8f 201 t1->start(lecture_analog);
ericbisson 0:c637467eeb8f 202 t2->start(lecture_num);
ericbisson 0:c637467eeb8f 203 t3->start(collection);
ericbisson 0:c637467eeb8f 204
ericbisson 2:c6465d4e82d2 205 Ticker tick1;
ericbisson 2:c6465d4e82d2 206 Ticker tick2;
ericbisson 2:c6465d4e82d2 207
ericbisson 2:c6465d4e82d2 208 tick1.attach(&signal_digital, 0.1);
ericbisson 2:c6465d4e82d2 209 tick2.attach(&signal_analog, 0.25);
ericbisson 0:c637467eeb8f 210
ericbisson 0:c637467eeb8f 211 while(1) {
ericbisson 0:c637467eeb8f 212 }
ericbisson 0:c637467eeb8f 213 }