GIU\ZF

Dependencies:   MCP23017 WattBob_TextLCD mbed-rtos mbed

Fork of rtos_basic by mbed official

Committer:
ihexx
Date:
Tue Mar 27 22:03:07 2018 +0000
Revision:
16:0ada6cbd41e2
Parent:
15:524de2b2ef8e
completed task merging of carSim, getControls, and engine switch;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ihexx 12:90b5d8eae5ec 1 #include "core.h"
ihexx 12:90b5d8eae5ec 2
ihexx 12:90b5d8eae5ec 3 namespace mailData{
ihexx 12:90b5d8eae5ec 4 Mail<mail_t, 100> mailBox;
ihexx 12:90b5d8eae5ec 5 }
ihexx 12:90b5d8eae5ec 6
ihexx 13:ab52f46c98ab 7 namespace enqueueMail{
ihexx 13:ab52f46c98ab 8 //Send speed, accelerometer and brake values to a 100 element MAIL queue
ihexx 12:90b5d8eae5ec 9 Thread thread;
ihexx 13:ab52f46c98ab 10 const float freq = 0.2; //hz
ihexx 12:90b5d8eae5ec 11
ihexx 12:90b5d8eae5ec 12 //I/O
ihexx 12:90b5d8eae5ec 13 void runTask(){
ihexx 14:8a6c20435523 14
ihexx 14:8a6c20435523 15
ihexx 13:ab52f46c98ab 16 Timer executionTimer,sleepTimer;
ihexx 13:ab52f46c98ab 17 executionTimer.reset();
ihexx 13:ab52f46c98ab 18 sleepTimer.reset();
ihexx 13:ab52f46c98ab 19
ihexx 13:ab52f46c98ab 20 const int const_delay = int((1000.0f/freq)+0.5f);
ihexx 13:ab52f46c98ab 21 int dynamic_delay = const_delay;
ihexx 14:8a6c20435523 22 int tick = 0;
ihexx 13:ab52f46c98ab 23
ihexx 12:90b5d8eae5ec 24 while(1){
ihexx 14:8a6c20435523 25 sleepTimer.stop();
ihexx 13:ab52f46c98ab 26 executionTimer.start();
ihexx 13:ab52f46c98ab 27 int sleepTime = sleepTimer.read_ms();
ihexx 13:ab52f46c98ab 28 const int drift = ((sleepTime - dynamic_delay) > 0)?
ihexx 13:ab52f46c98ab 29 (sleepTime - dynamic_delay) : 0;
ihexx 13:ab52f46c98ab 30 //Core Loop:
ihexx 12:90b5d8eae5ec 31 using namespace mailData;
ihexx 12:90b5d8eae5ec 32 mail_t *mail = mailBox.alloc();
ihexx 12:90b5d8eae5ec 33
ihexx 12:90b5d8eae5ec 34 runTimeParams::liveAccess.lock();
ihexx 12:90b5d8eae5ec 35
ihexx 12:90b5d8eae5ec 36 mail->speed = runTimeParams::avgSpeed;
ihexx 12:90b5d8eae5ec 37 mail->accel = runTimeParams::accelForce;
ihexx 12:90b5d8eae5ec 38 mail->brake = runTimeParams::brakeForce;
ihexx 12:90b5d8eae5ec 39
ihexx 12:90b5d8eae5ec 40 runTimeParams::liveAccess.unlock();
ihexx 12:90b5d8eae5ec 41
ihexx 12:90b5d8eae5ec 42 mailBox.put(mail);
ihexx 13:ab52f46c98ab 43 //End of Core loop
ihexx 12:90b5d8eae5ec 44
ihexx 14:8a6c20435523 45 tick++;
ihexx 13:ab52f46c98ab 46 executionTimer.stop();
ihexx 13:ab52f46c98ab 47 int exec_time = executionTimer.read_ms();
ihexx 13:ab52f46c98ab 48
ihexx 13:ab52f46c98ab 49 #if DEBUG_MODE
ihexx 14:8a6c20435523 50 const int debug_log_interval = int(freq/dequeueMail::freq);
ihexx 14:8a6c20435523 51 if (!(tick%debug_log_interval)){
ihexx 14:8a6c20435523 52 runTimeParams::liveAccess.lock();
ihexx 14:8a6c20435523 53 runTimeParams::debugLog += "Enqueue Mail," + to_string(exec_time) + ","
ihexx 14:8a6c20435523 54 + to_string(sleepTime) + ","
ihexx 14:8a6c20435523 55 + to_string(drift) + "\n\r";
ihexx 14:8a6c20435523 56 runTimeParams::liveAccess.unlock();
ihexx 14:8a6c20435523 57 tick = 0;
ihexx 14:8a6c20435523 58 }
ihexx 13:ab52f46c98ab 59 #endif
ihexx 13:ab52f46c98ab 60
ihexx 13:ab52f46c98ab 61 executionTimer.reset();
ihexx 13:ab52f46c98ab 62 sleepTimer.reset();
ihexx 13:ab52f46c98ab 63 sleepTimer.start();
ihexx 14:8a6c20435523 64
ihexx 13:ab52f46c98ab 65 dynamic_delay = const_delay - (exec_time + drift);
ihexx 13:ab52f46c98ab 66 Thread::wait(dynamic_delay);
ihexx 12:90b5d8eae5ec 67 }
ihexx 12:90b5d8eae5ec 68
ihexx 12:90b5d8eae5ec 69 }
ihexx 12:90b5d8eae5ec 70 }
ihexx 12:90b5d8eae5ec 71
ihexx 13:ab52f46c98ab 72 namespace dequeueMail{
ihexx 13:ab52f46c98ab 73 //Dump contents of feature_7 MAIL queue to the serial connection to the PC
ihexx 12:90b5d8eae5ec 74 Thread thread;
ihexx 16:0ada6cbd41e2 75 #if DEBUG_MODE
ihexx 16:0ada6cbd41e2 76 const float freq = 0.2; //hz
ihexx 16:0ada6cbd41e2 77 #else
ihexx 16:0ada6cbd41e2 78 const float freq = 0.05; //hz
ihexx 16:0ada6cbd41e2 79 #endif
ihexx 13:ab52f46c98ab 80
ihexx 15:524de2b2ef8e 81
ihexx 12:90b5d8eae5ec 82 Serial pc(USBTX, USBRX); // tx, rx
ihexx 13:ab52f46c98ab 83
ihexx 12:90b5d8eae5ec 84
ihexx 12:90b5d8eae5ec 85 void runTask(){
ihexx 13:ab52f46c98ab 86 Timer executionTimer,sleepTimer;
ihexx 13:ab52f46c98ab 87 executionTimer.reset();
ihexx 13:ab52f46c98ab 88 sleepTimer.reset();
ihexx 13:ab52f46c98ab 89
ihexx 13:ab52f46c98ab 90 const int const_delay = int((1000.0f/freq)+0.5f);
ihexx 13:ab52f46c98ab 91 int dynamic_delay = const_delay;
ihexx 13:ab52f46c98ab 92
ihexx 13:ab52f46c98ab 93 pc.printf("speed,acceleration,brake\n\r");
ihexx 12:90b5d8eae5ec 94
ihexx 13:ab52f46c98ab 95 while(true){
ihexx 13:ab52f46c98ab 96
ihexx 13:ab52f46c98ab 97 sleepTimer.stop();
ihexx 13:ab52f46c98ab 98 executionTimer.start();
ihexx 13:ab52f46c98ab 99 int sleepTime = sleepTimer.read_ms();
ihexx 13:ab52f46c98ab 100 const int drift = ((sleepTime - dynamic_delay) > 0)?
ihexx 13:ab52f46c98ab 101 (sleepTime - dynamic_delay) : 0;
ihexx 13:ab52f46c98ab 102
ihexx 13:ab52f46c98ab 103 /* Mail */
ihexx 13:ab52f46c98ab 104 using namespace mailData;
ihexx 13:ab52f46c98ab 105 osEvent evt = mailBox.get(1);
ihexx 13:ab52f46c98ab 106 while (evt.status == osEventMail){
ihexx 13:ab52f46c98ab 107 mail_t * mail = (mail_t*)evt.value.p;
ihexx 13:ab52f46c98ab 108 pc.printf("%.2f,%.2f,%.2f\n\r",mail->speed,mail->accel,mail->brake);
ihexx 13:ab52f46c98ab 109 mailBox.free(mail);
ihexx 13:ab52f46c98ab 110 evt = mailBox.get(1);
ihexx 13:ab52f46c98ab 111 }
ihexx 12:90b5d8eae5ec 112
ihexx 13:ab52f46c98ab 113 executionTimer.stop();
ihexx 13:ab52f46c98ab 114 int exec_time = executionTimer.read_ms();
ihexx 12:90b5d8eae5ec 115
ihexx 13:ab52f46c98ab 116 #if DEBUG_MODE
ihexx 13:ab52f46c98ab 117 runTimeParams::liveAccess.lock();
ihexx 13:ab52f46c98ab 118 runTimeParams::debugLog += "Dequeue Mail," + to_string(exec_time) + ","
ihexx 13:ab52f46c98ab 119 + to_string(sleepTime) + ","
ihexx 13:ab52f46c98ab 120 + to_string(drift) + "\n\r";
ihexx 13:ab52f46c98ab 121 pc.printf(runTimeParams::debugLog.c_str());
ihexx 13:ab52f46c98ab 122 runTimeParams::debugLog = "";
ihexx 13:ab52f46c98ab 123 runTimeParams::liveAccess.unlock();
ihexx 13:ab52f46c98ab 124 #endif
ihexx 13:ab52f46c98ab 125
ihexx 13:ab52f46c98ab 126 executionTimer.reset();
ihexx 13:ab52f46c98ab 127 sleepTimer.reset();
ihexx 13:ab52f46c98ab 128 sleepTimer.start();
ihexx 13:ab52f46c98ab 129 dynamic_delay = const_delay - (exec_time + drift);
ihexx 13:ab52f46c98ab 130 Thread::wait(dynamic_delay);
ihexx 13:ab52f46c98ab 131
ihexx 13:ab52f46c98ab 132 }
ihexx 12:90b5d8eae5ec 133 }
ihexx 12:90b5d8eae5ec 134 }
ihexx 12:90b5d8eae5ec 135
ihexx 12:90b5d8eae5ec 136