![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
g
main.cpp
- Committer:
- ShaolinPoutine
- Date:
- 2017-01-31
- Revision:
- 1:8475f46f050b
- Parent:
- 0:8b27cd0189c9
- Child:
- 2:2d84e5bf72bd
File content as of revision 1:8475f46f050b:
#include "mbed.h" #include "rtos.h" Serial pc(USBTX, USBRX); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); DigitalIn en_1(p15, PullUp); DigitalIn en_2(p16, PullUp); AnalogIn ea_1(p19); AnalogIn ea_2(p20); int signalnewdata = 0x1 << 6; int signal100ms = 0x1 << 5; int signal50ms = 0x1 << 4; int signal250ms = 0x1 << 3; int typeAnalog = 0; int typeNumeric = 1; time_t begin_time = 0; MemoryPool<float, 16> analogpool; // TODO MemoryPool<int, 16> numericpool; Ticker analogtimer; Ticker numerictimer; Thread* panalog_thread; Thread* pnumeric_thread; typedef struct { int type; // Which type of event int id; // Which pins changed int* position; // Position in the memory pool unsigned long seconds; // Timestamp when the event occured } reading; Queue<reading, 16> queue; void lecture_analog(void const *args) { pc.printf("Debut des lectures analogiques\r\n"); float state[2] = {0,0}; float newstate[2] = {0,0}; float mean1[5] = {0,0,0,0,0}; float mean2[5] = {0,0,0,0,0}; int i = 0; time_t timestamp = time(NULL); unsigned long seconds = 0; reading *message; while (true) { // synchronisation sur la période d'échantillonnage Thread::signal_wait(signal250ms); // lecture de l'étampe temporelle seconds = (unsigned long) difftime(begin_time, 0); // lecture des échantillons analogiques mean1[i] = ea_1; mean2[i] = ea_2; // calcul de la nouvelle moyenne courante newstate[0] = (mean1[0] + mean1[1] + mean1[2] + mean1[3] + mean1[4]) / 5.0; newstate[1] = (mean2[0] + mean2[1] + mean2[2] + mean2[3] + mean2[4]) / 5.0; // génération éventuelle d'un événement led3 = !led3; if (abs(newstate[0] - state[0]) > 1.0/8.0) { state[0] = newstate[0]; float *state = analogpool.alloc(); *state = state[0]; message->type = typeAnalog; message->id = 1; message->position = (int *) state; message->seconds = seconds; queue.put(message); } if (abs(newstate[1] - state[1]) > 1.0/8.0) { state[1] = newstate[1]; float *state = analogpool.alloc(); *state = state[1]; message->type = typeAnalog; message->id = 2; message->position = (int *) state; message->seconds = seconds; queue.put(message); } i = (i + 1) % 5; } } void lecture_num(void const *args) { pc.printf("Debut des lectures numeriques\r\n"); bool state[2] = {false, false}; bool newstate[2] = {false, false}; bool changed[2] = {false, false}; unsigned long seconds = 0; reading *message; while (true) { // synchronisation sur la période d'échantillonnage //numeric_thread.signal_clr(signal100ms); Thread::signal_wait(signal100ms); // lecture de l'étampe temporelle seconds = (unsigned long) difftime(begin_time, 0); // lecture des échantillons numériques newstate[0] = !en_1; newstate[1] = !en_2; // prise en charge du phénomène de rebond changed[0] = newstate[0] != state[0]; changed[1] = newstate[1] != state[1]; int *test = numericpool.alloc(); *test = 42; printf("%d", test); numericpool.free(test); if (changed[0] || changed [1]) { pnumeric_thread->signal_clr(signal50ms); //flag isp Thread::signal_wait(signal50ms); newstate[0] = !en_1; newstate[1] = !en_2; if(newstate[0] != state[0] && changed[0]) { led1 = newstate[0]; state[0] = newstate[0]; // génération éventuelle d'un événement int *state = numericpool.alloc(); *state = state[0]; message->type = typeNumeric; message->id = 1; message->position = state; message->seconds = seconds; queue.put(message); } if(newstate[1] != state[1] && changed[1]) { led2 = newstate[1]; state[1] = newstate[1]; // génération éventuelle d'un événement int *state = numericpool.alloc(); *state = state[1]; message->type = typeNumeric; message->id = 2; message->position = state; message->seconds = seconds; queue.put(message); } } else { Thread::yield(); } } } void collection(void const *args) { osEvent event; reading* message; while (true) { // attente et lecture d'un événement event = queue.get(); message = (reading*) event.value.p; if (message->type == typeNumeric) { // écriture de l'événement en sortie (port série) pc.printf("The state on numeric pin %d has changed to %d at %lus\r\n", message->id, (int *) *(message->position), message->seconds); numericpool.free(message->position); } if (message->type == typeAnalog) { // écriture de l'événement en sortie (port série) pc.printf("The state on analog pin %d has changed to %d at %lus\r\n", message->id, *(message->position), message->seconds); analogpool.free((float *) message->position); } } } void signalnumeric() { pnumeric_thread->signal_set(signal100ms | signal50ms); } void signalanalog() { panalog_thread->signal_set(signal250ms); } Ticker flipper; void flip() { led4 = !led4; } int main(){ // set_time(0); begin_time = time(NULL); pc.printf("Welcome\r\n"); flipper.attach(&flip, 0.5); // initialisation du RTC analogtimer.attach(&signalanalog, 0.250); numerictimer.attach(&signalnumeric, 0.5); // démarrage des tâches Thread analog_thread(lecture_analog); panalog_thread = &analog_thread; Thread numeric_thread(lecture_num); pnumeric_thread = &numeric_thread; Thread q(collection); while(1){ } }