Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed TrapezoidControl QEI Pulse LM61CIZ
Diff: Communication/Controller/Controller.cpp
- Revision:
- 0:669ef71cba68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Communication/Controller/Controller.cpp Sat Sep 08 06:05:22 2018 +0000
@@ -0,0 +1,100 @@
+#include "Controller.h"
+
+#include "Mu/Mu.h"
+#include "../../../LED/LED.h"
+
+using namespace MU;
+
+namespace CONTROLLER {
+ Ticker MuTimer;
+
+ void UartUpdate();
+ void LostCheck();
+
+ namespace {
+ ControllerData ctrData;
+ ControllerData keepCtrData;
+ const uint8_t defaultData[4] = CTR_DEFAULT_DATA;
+ const char check[] = "DR=";
+ volatile char packet[24];
+
+ bool controllerLost = false;
+
+ uint8_t timerCount = 0;
+ }
+
+ void Controller::Initialize() {
+ MuUart.attach(UartUpdate, Serial::RxIrq);
+ MuTimer.attach(LostCheck, 0.025);
+ DataReset();
+ }
+
+ ControllerData* Controller::GetData() {
+ __disable_irq();
+ for(uint8_t i=0; i<CTR_DATA_LENGTH; i++) keepCtrData.buf[i] = ctrData.buf[i];
+ __enable_irq();
+ return &keepCtrData;
+ }
+
+ void Controller::DataReset() {
+ // __disable_irq();
+ for(uint8_t i=0; i<CTR_DATA_LENGTH; i++) ctrData.buf[i] = defaultData[i];
+ // __enable_irq();
+ }
+
+ bool Controller::CheckControllerLost() {
+ return controllerLost;
+ }
+
+ void UartUpdate() {
+ static bool phase = false;
+ static uint8_t count = 0;
+ static uint8_t ledCount = 0;
+
+ char data = MuUart.getc();
+
+ if(phase) {
+ packet[count] = data;
+ if(count < 2) {
+ if(data != check[count]) {
+ phase = false;
+ // controllerLost = true;
+ LED_MU = LED_OFF;
+ }
+ }
+ else if(count == 9) {
+ if(data != '\r') {
+ phase = false;
+ count = 0;
+ } else {
+ ctrData.buf[0] = packet[5];
+ ctrData.buf[1] = packet[6];
+ ctrData.buf[2] = packet[7];
+ ctrData.buf[3] = packet[8];
+ phase = false;
+ timerCount = 0;
+ controllerLost = false;
+ LED_MU = LED_ON;
+ }
+ }
+ count++;
+ }
+ else {
+ if(data == '*') {
+ count = 0;
+ phase = true;
+ }
+ }
+ }
+
+ void LostCheck() {
+ timerCount++;
+ if(timerCount == 2) LED_MU = LED_OFF;
+ if(timerCount >= 20) {
+ controllerLost = true;
+ Controller::DataReset();
+ timerCount = 0;
+ LED_MU = LED_OFF;
+ }
+ }
+}