diff options
Diffstat (limited to 'source/main.cpp')
-rw-r--r-- | source/main.cpp | 147 |
1 files changed, 82 insertions, 65 deletions
diff --git a/source/main.cpp b/source/main.cpp index caf8ffe..de11801 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -27,6 +27,9 @@ DEALINGS IN THE SOFTWARE. #include "HoverBitController.h" #include "Screen.h" +#define VERSION "0.0.1" +#define BLE_UART_DELIM ":" + MicroBit uBit; MicroBitUARTService *uart; HoverBitController controller; @@ -44,68 +47,64 @@ DisplayMainScreenMode displayMainScreenMode = GRAPHS; void onConnected(MicroBitEvent) { bConnected = 1; uBit.audio.soundExpressions.play(ManagedString("giggle")); +} - // mobile app will send ASCII strings terminated with the colon character - ManagedString eom(":"); +void onDisconnected(MicroBitEvent) { + bConnected = 0; + uBit.audio.soundExpressions.play(ManagedString("sad")); +} - while (bConnected) { - ManagedString msg = uart->readUntil(eom); - int length = msg.length(); - const char* command = msg.toCharArray(); +void onDelim(MicroBitEvent) { + ManagedString msg = uart->readUntil(BLE_UART_DELIM); - ManagedString accString("ACC:"); + int length = msg.length(); + const char* command = msg.toCharArray(); - char cCommand = command[0]; - char cChar; - int startI = 1; - bool bEOC = false; - int valLength = 0; + ManagedString accString("ACC:"); - for (int i = 1; i < length; i++) { - cChar = command[i]; + char cCommand = command[0]; + char cChar; + int startI = 1; + bool bEOC = false; + int valLength = 0; - if (i >= length - 1) { - bEOC = true; - valLength = i - startI + 1; - } else if (cChar == 'R' || cChar == 'T' || cChar == 'A' || cChar == 'S') { - bEOC = true; - valLength = i - startI; - } + for (int i = 1; i < length; i++) { + cChar = command[i]; - if (bEOC) { - /* We will just assume that we end up with a valid integer here */ - int value = atoi(msg.substring(startI, startI + valLength).toCharArray()); - - if (cCommand == 'R') { - controller.Roll(value); - accString = accString + ManagedString("R") + ManagedString(controller.Roll()); - } else if (cCommand == 'T') { - controller.Throttle(value); - accString = accString + ManagedString("T") + ManagedString(controller.Throttle()); - } else if (cCommand == 'A') { - controller.Arm(value == 1); - accString = accString + ManagedString("A") + ManagedString(controller.Arm()); - } else if (cCommand == 'S') { - controller.Servo1(value); - accString = accString + ManagedString("S") + ManagedString(controller.Servo1()); - } + if (i >= length - 1) { + bEOC = true; + valLength = i - startI + 1; + } else if (cChar == 'R' || cChar == 'T' || cChar == 'A' || cChar == 'S') { + bEOC = true; + valLength = i - startI; + } - cCommand = cChar; - startI = i+1; - bEOC = false; + if (bEOC) { + /* We will just assume that we end up with a valid integer here */ + int value = atoi(msg.substring(startI, startI + valLength).toCharArray()); + + if (cCommand == 'R') { + controller.Rudder(value); + accString = accString + ManagedString("R") + ManagedString(controller.Rudder()); + } else if (cCommand == 'T') { + controller.Throttle(value); + accString = accString + ManagedString("T") + ManagedString(controller.Throttle()); + } else if (cCommand == 'A') { + controller.Arm(value == 1); + accString = accString + ManagedString("A") + ManagedString(controller.Arm()); + } else { + // We ignore it :) } + + cCommand = cChar; + startI = i+1; + bEOC = false; } - // @TODO: Move this to the hoverControl module, we would rather like to have that there, or in the main loop. - // it could also be in the same clause as the batttery sending, but we might want to have it more - // dependent on actual received values. - uart->send(accString); } - -} - -void onDisconnected(MicroBitEvent) { - bConnected = 0; - uBit.audio.soundExpressions.play(ManagedString("sad")); + // @TODO: Move this to the hoverControl module, we would rather like to have that there, or in the main loop. + // it could also be in the same clause as the batttery sending, but we might want to have it more + // dependent on actual received values. + uart->send(accString); } void iconBatteryDead() { @@ -195,7 +194,25 @@ void mainScreen() { bool bDelayElapsed = (uBit.systemTime() - tmpTimer) > 1000; if (bDelayElapsed) { tmpTimer = uBit.systemTime(); } - if (bDelayElapsed && bConnected) { uart->send(ManagedString("B:") + ManagedString(batteryMilliVolt)); } + if (bConnected) { + if (bDelayElapsed) { + uart->send(ManagedString("B:") + ManagedString(batteryMilliVolt)); + } + } else { + if (bDelayElapsed) { + bBLEIndicator = !bBLEIndicator; + uBit.display.clear(); + if (bBLEIndicator) { + MicroBitImage img(bluetoothSymbol); + uBit.display.print(img); + } else { + // Need to actually see this to know if I want to flash only + // blank screen or with battery. + //batteryLevelFullScreen(); + } + } + return; + } switch (displayMainScreenMode) { case OFF: @@ -216,23 +233,19 @@ void mainScreen() { } break; } - - if (bConnected) { - uBit.display.image.setPixelValue(0, 0, 255); - } else { - if (bDelayElapsed) { bBLEIndicator = !bBLEIndicator; } - if (bBLEIndicator) { - uBit.display.image.setPixelValue(0, 0, 0); - } else { - uBit.display.image.setPixelValue(0, 0, 255); - } - } } void onButtonA_press(MicroBitEvent e) { + nextMainScreenDisplayMode(); } void onButtonB_press(MicroBitEvent e) { } +void onButtonAB_press(MicroBitEvent e) { + DisplayMainScreenMode tmpDMode = displayMainScreenMode; + displayMainScreenMode = OFF; + uBit.display.scroll(VERSION); + displayMainScreenMode = tmpDMode; +} int main() { uBit.init(); @@ -245,23 +258,27 @@ int main() { /* Initialize hover:bit controller module * the init procedure have to be run within 100ms after air:bit power up */ - controller.init(&uBit); + controller.init(); // Setup listeners uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, onConnected); uBit.messageBus.listen(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, onDisconnected); + uBit.messageBus.listen(MICROBIT_ID_BLE_UART, MICROBIT_UART_S_EVT_DELIM_MATCH, onDelim); + uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA_press); uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB_press); + uBit.messageBus.listen(MICROBIT_ID_BUTTON_AB, MICROBIT_BUTTON_EVT_CLICK, onButtonAB_press); // uartService // Note GATT table size increased from default in MicroBitConfig.h // #define MICROBIT_SD_GATT_TABLE_SIZE 0x500 uart = new MicroBitUARTService(*uBit.ble, 32, 32); + uart->eventOn(BLE_UART_DELIM); uBit.audio.soundExpressions.play(ManagedString("hello")); while (1) { - batteryMilliVolt = controller.getBatteryVoltage(); + batteryMilliVolt = controller.GetBatteryVoltage(); if (uBit.logo.isPressed()) { if (!bCapLogoIsPressed) { |