From 318d850719a86d58012689143c01dd0edb6263b5 Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Wed, 10 Feb 2021 10:56:36 +0100 Subject: :sprakles: Add failsafe code (addressing #5) --- source/HoverBitController.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index 65ebf17..16c6bf1 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -45,6 +45,7 @@ void HoverBitController::init(MicroBit* _uBit) { yaw = 0; throttle = 0; failSafeC = 0; + receiveTime = (*uBit).systemTime(); /* I am not completly sure what this does, but it seems to me like this is putting the air:bit board in some kind of "bind-mode", on the spec-sheet @@ -60,12 +61,17 @@ void HoverBitController::init(MicroBit* _uBit) { /** * This is not implemented yet. */ -void HoverBitController::failSafe(void) { - // throttle = 0; - // roll = 0; - // yaw = 0; - // arm = 0; - // failSafeC++; +bool HoverBitController::failSafe(void) { + unsigned long deltaReceiveTime = (*uBit.systemTime()) - receiveTime; + if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { + Throttle(0); + Roll(0); + Servo1(0); + } + if (deltaReceiveTime > FSAFE_TLIM_ARM) { + Arm(0); + } + return (deltaReceiveTime > FSAFE_TLIM_THROTTLE) || (deltaReceiveTime > FSAFE_TLIM_ARM); } /** @@ -144,7 +150,9 @@ void HoverBitController::AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw, * Method that sends commands with the current values for all parameters. */ void HoverBitController::HoverControl() { - AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); + if (!failSafe()) { + AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); + } } int HoverBitController::Throttle() { @@ -154,6 +162,7 @@ void HoverBitController::Throttle(int _throttle) { if (_throttle > 99) { throttle = 100; } else if (_throttle < 0) { throttle = 0; } else { throttle = _throttle; } + lastReceiveTime = (*uBit).systemTime(); } int HoverBitController::Servo1() { return servo_1; @@ -162,6 +171,7 @@ void HoverBitController::Servo1(int _servo1) { if (_servo1 > 180) { servo_1 = 180; } else if (_servo1 < 0) { servo_1 = 0; } else { servo_1 = _servo1; } + lastReceiveTime = (*uBit).systemTime(); } int HoverBitController::Roll() { return roll; @@ -170,12 +180,14 @@ void HoverBitController::Roll(int _roll) { if (_roll > 90) { roll = 90; } else if (_roll < -90) { roll = -90; } else { roll = _roll; } + lastReceiveTime = (*uBit).systemTime(); } bool HoverBitController::Arm() { return (arm == 1); } void HoverBitController::Arm(bool _arm) { arm = (int)_arm; + lastReceiveTime = (*uBit).systemTime(); } bool HoverBitController::BatteryEmpty() { return batteryEmpty; -- cgit v1.2.3 From 8cc460085e75a2cda1bb03cc51786c776da6ebcd Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Wed, 10 Feb 2021 11:04:13 +0100 Subject: :boom: Refactor HoverBitController to only have API relevant for HoverBit --- source/HoverBitController.cpp | 33 +++++++++++++-------------------- source/HoverBitController.h | 18 +++++++++++------- source/main.cpp | 12 ++++++------ 3 files changed, 30 insertions(+), 33 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index 16c6bf1..9860b43 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -44,8 +44,7 @@ void HoverBitController::init(MicroBit* _uBit) { roll = 0; yaw = 0; throttle = 0; - failSafeC = 0; - receiveTime = (*uBit).systemTime(); + lastReceiveTime = (*uBit).systemTime(); /* I am not completly sure what this does, but it seems to me like this is putting the air:bit board in some kind of "bind-mode", on the spec-sheet @@ -62,14 +61,15 @@ void HoverBitController::init(MicroBit* _uBit) { * This is not implemented yet. */ bool HoverBitController::failSafe(void) { - unsigned long deltaReceiveTime = (*uBit.systemTime()) - receiveTime; + unsigned long deltaReceiveTime = (*uBit).systemTime() - lastReceiveTime; if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { Throttle(0); - Roll(0); - Servo1(0); + Rudder(0); + AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); } if (deltaReceiveTime > FSAFE_TLIM_ARM) { Arm(0); + AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); } return (deltaReceiveTime > FSAFE_TLIM_THROTTLE) || (deltaReceiveTime > FSAFE_TLIM_ARM); } @@ -77,7 +77,7 @@ bool HoverBitController::failSafe(void) { /** * This returns the current voltage of the battery. */ -unsigned int HoverBitController::getBatteryVoltage() { +unsigned int HoverBitController::GetBatteryVoltage() { float batteryFactor = 4.42; int batteryMilliVolt = 3700; return ((float)((&(*uBit).io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); @@ -164,22 +164,15 @@ void HoverBitController::Throttle(int _throttle) { else { throttle = _throttle; } lastReceiveTime = (*uBit).systemTime(); } -int HoverBitController::Servo1() { - return servo_1; -} -void HoverBitController::Servo1(int _servo1) { - if (_servo1 > 180) { servo_1 = 180; } - else if (_servo1 < 0) { servo_1 = 0; } - else { servo_1 = _servo1; } - lastReceiveTime = (*uBit).systemTime(); -} -int HoverBitController::Roll() { +int HoverBitController::Rudder() { + // The AirBit uses the roll parameter to control the hoverbit's rudder. return roll; } -void HoverBitController::Roll(int _roll) { - if (_roll > 90) { roll = 90; } - else if (_roll < -90) { roll = -90; } - else { roll = _roll; } +void HoverBitController::Rudder(int _rudder) { + // The AirBit uses the roll parameter to control the hoverbit's rudder. + if (_rudder > 90) { roll = 90; } + else if (_rudder < -90) { roll = -90; } + else { roll = _rudder; } lastReceiveTime = (*uBit).systemTime(); } bool HoverBitController::Arm() { diff --git a/source/HoverBitController.h b/source/HoverBitController.h index 477e96e..0c2960a 100644 --- a/source/HoverBitController.h +++ b/source/HoverBitController.h @@ -31,6 +31,12 @@ DEALINGS IN THE SOFTWARE. #define FSAFE_TLIM_THROTTLE 1000 // When to cut the throttle #define FSAFE_TLIM_ARM 5000 // When to disarm +/** + * This class can be used to interface with a AirBit card for controlling a HOVER:BIT kit. + * + * A lot of the features of the airbit is ignored here and made easy to understand if all + * you want to do is use it for a hoverbit. + */ class HoverBitController { private: MicroBit* uBit; @@ -42,7 +48,7 @@ class HoverBitController { int pitch; int yaw; int throttle; - unsigned long receiveTime; + unsigned long lastReceiveTime; bool mainController; bool batteryEmpty; @@ -50,19 +56,17 @@ class HoverBitController { float batteryFactor; bool failSafe(void); + void AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw,int Aux1,int Aux2); public: void init(MicroBit* _uBit); - unsigned int getBatteryVoltage(void); - void AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw,int Aux1,int Aux2); + unsigned int GetBatteryVoltage(void); void HoverControl(); int Throttle(); void Throttle(int _throttle); - int Servo1(); - void Servo1(int _servo1); - int Roll(); - void Roll(int _roll); + int Rudder(); + void Rudder(int _rudder); bool Arm(); void Arm(bool _arm); bool BatteryEmpty(); diff --git a/source/main.cpp b/source/main.cpp index caf8ffe..eaf3f30 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -77,17 +77,17 @@ void onConnected(MicroBitEvent) { int value = atoi(msg.substring(startI, startI + valLength).toCharArray()); if (cCommand == 'R') { - controller.Roll(value); - accString = accString + ManagedString("R") + ManagedString(controller.Roll()); + 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 if (cCommand == 'S') { - controller.Servo1(value); - accString = accString + ManagedString("S") + ManagedString(controller.Servo1()); + } + } else { + // We ignore it :) } cCommand = cChar; @@ -261,7 +261,7 @@ int main() { uBit.audio.soundExpressions.play(ManagedString("hello")); while (1) { - batteryMilliVolt = controller.getBatteryVoltage(); + batteryMilliVolt = controller.GetBatteryVoltage(); if (uBit.logo.isPressed()) { if (!bCapLogoIsPressed) { -- cgit v1.2.3 From dfabc6f837023ac4aaade2fddaa98a3a6777391e Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Wed, 24 Feb 2021 13:06:28 +0100 Subject: :art: Change (*uBit).prop to uBit->prop --- source/HoverBitController.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index 9860b43..fc4c51b 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -44,16 +44,16 @@ void HoverBitController::init(MicroBit* _uBit) { roll = 0; yaw = 0; throttle = 0; - lastReceiveTime = (*uBit).systemTime(); + lastReceiveTime = uBit->systemTime(); /* I am not completly sure what this does, but it seems to me like this is putting the air:bit board in some kind of "bind-mode", on the spec-sheet there isn't any documentation for what 20 pulses means tho... */ - (*uBit).sleep(100); + uBit->sleep(100); int o; for (o = 0; o < 20; o++) { AirBit(-90, 0, 90, 0, 90, 0, 0); - (*uBit).sleep(20); + uBit->sleep(20); } } @@ -61,7 +61,7 @@ void HoverBitController::init(MicroBit* _uBit) { * This is not implemented yet. */ bool HoverBitController::failSafe(void) { - unsigned long deltaReceiveTime = (*uBit).systemTime() - lastReceiveTime; + unsigned long deltaReceiveTime = uBit->systemTime() - lastReceiveTime; if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { Throttle(0); Rudder(0); @@ -80,7 +80,7 @@ bool HoverBitController::failSafe(void) { unsigned int HoverBitController::GetBatteryVoltage() { float batteryFactor = 4.42; int batteryMilliVolt = 3700; - return ((float)((&(*uBit).io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); + return ((float)((&uBit->io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); } /** @@ -143,7 +143,7 @@ void HoverBitController::AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw, buf[13] = aux1S & 255; buf[14] = (6 << 2) | ((aux2S >> 8) & 3); buf[15] = aux2S & 255; - (*uBit).serial.send(buf, 16, SYNC_SPINWAIT); + uBit->serial.send(buf, 16, SYNC_SPINWAIT); } /** @@ -162,7 +162,7 @@ void HoverBitController::Throttle(int _throttle) { if (_throttle > 99) { throttle = 100; } else if (_throttle < 0) { throttle = 0; } else { throttle = _throttle; } - lastReceiveTime = (*uBit).systemTime(); + lastReceiveTime = uBit->systemTime(); } int HoverBitController::Rudder() { // The AirBit uses the roll parameter to control the hoverbit's rudder. @@ -173,14 +173,14 @@ void HoverBitController::Rudder(int _rudder) { if (_rudder > 90) { roll = 90; } else if (_rudder < -90) { roll = -90; } else { roll = _rudder; } - lastReceiveTime = (*uBit).systemTime(); + lastReceiveTime = uBit->systemTime(); } bool HoverBitController::Arm() { return (arm == 1); } void HoverBitController::Arm(bool _arm) { arm = (int)_arm; - lastReceiveTime = (*uBit).systemTime(); + lastReceiveTime = uBit->systemTime(); } bool HoverBitController::BatteryEmpty() { return batteryEmpty; -- cgit v1.2.3 From 7989505bf43c6dd0ea846f075337261f52e7bd5f Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Wed, 24 Feb 2021 13:37:24 +0100 Subject: :art: Use extern MicroBit instead of sending pointer to classes --- inc/HoverBitController.h | 6 +++--- source/HoverBitController.cpp | 21 ++++++++++----------- source/main.cpp | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/inc/HoverBitController.h b/inc/HoverBitController.h index 0c2960a..80ad173 100644 --- a/inc/HoverBitController.h +++ b/inc/HoverBitController.h @@ -31,6 +31,8 @@ DEALINGS IN THE SOFTWARE. #define FSAFE_TLIM_THROTTLE 1000 // When to cut the throttle #define FSAFE_TLIM_ARM 5000 // When to disarm +extern MicroBit uBit; + /** * This class can be used to interface with a AirBit card for controlling a HOVER:BIT kit. * @@ -39,8 +41,6 @@ DEALINGS IN THE SOFTWARE. */ class HoverBitController { private: - MicroBit* uBit; - int buzzer; int servo_1; int arm; @@ -59,7 +59,7 @@ class HoverBitController { void AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw,int Aux1,int Aux2); public: - void init(MicroBit* _uBit); + void init(); unsigned int GetBatteryVoltage(void); void HoverControl(); diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index fc4c51b..2e908c3 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -31,8 +31,7 @@ DEALINGS IN THE SOFTWARE. * * @param _uBit the MicroBit instance */ -void HoverBitController::init(MicroBit* _uBit) { - uBit = _uBit; +void HoverBitController::init() { mainController = false; batteryEmpty = false; batteryMilliVolt = 3700; @@ -44,16 +43,16 @@ void HoverBitController::init(MicroBit* _uBit) { roll = 0; yaw = 0; throttle = 0; - lastReceiveTime = uBit->systemTime(); + lastReceiveTime = uBit.systemTime(); /* I am not completly sure what this does, but it seems to me like this is putting the air:bit board in some kind of "bind-mode", on the spec-sheet there isn't any documentation for what 20 pulses means tho... */ - uBit->sleep(100); + uBit.sleep(100); int o; for (o = 0; o < 20; o++) { AirBit(-90, 0, 90, 0, 90, 0, 0); - uBit->sleep(20); + uBit.sleep(20); } } @@ -61,7 +60,7 @@ void HoverBitController::init(MicroBit* _uBit) { * This is not implemented yet. */ bool HoverBitController::failSafe(void) { - unsigned long deltaReceiveTime = uBit->systemTime() - lastReceiveTime; + unsigned long deltaReceiveTime = uBit.systemTime() - lastReceiveTime; if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { Throttle(0); Rudder(0); @@ -80,7 +79,7 @@ bool HoverBitController::failSafe(void) { unsigned int HoverBitController::GetBatteryVoltage() { float batteryFactor = 4.42; int batteryMilliVolt = 3700; - return ((float)((&uBit->io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); + return ((float)((&uBit.io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); } /** @@ -143,7 +142,7 @@ void HoverBitController::AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw, buf[13] = aux1S & 255; buf[14] = (6 << 2) | ((aux2S >> 8) & 3); buf[15] = aux2S & 255; - uBit->serial.send(buf, 16, SYNC_SPINWAIT); + uBit.serial.send(buf, 16, SYNC_SPINWAIT); } /** @@ -162,7 +161,7 @@ void HoverBitController::Throttle(int _throttle) { if (_throttle > 99) { throttle = 100; } else if (_throttle < 0) { throttle = 0; } else { throttle = _throttle; } - lastReceiveTime = uBit->systemTime(); + lastReceiveTime = uBit.systemTime(); } int HoverBitController::Rudder() { // The AirBit uses the roll parameter to control the hoverbit's rudder. @@ -173,14 +172,14 @@ void HoverBitController::Rudder(int _rudder) { if (_rudder > 90) { roll = 90; } else if (_rudder < -90) { roll = -90; } else { roll = _rudder; } - lastReceiveTime = uBit->systemTime(); + lastReceiveTime = uBit.systemTime(); } bool HoverBitController::Arm() { return (arm == 1); } void HoverBitController::Arm(bool _arm) { arm = (int)_arm; - lastReceiveTime = uBit->systemTime(); + lastReceiveTime = uBit.systemTime(); } bool HoverBitController::BatteryEmpty() { return batteryEmpty; diff --git a/source/main.cpp b/source/main.cpp index 8d5e837..de11801 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -258,7 +258,7 @@ 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); -- cgit v1.2.3 From 5a75b5919ab5ca96243570b9b8ab7e9e5a36c9f6 Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Sat, 27 Feb 2021 16:45:17 +0100 Subject: :zap: Remove include from source file --- source/HoverBitController.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'source/HoverBitController.cpp') diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index 2e908c3..df9893e 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -22,7 +22,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include #include "HoverBitController.h" /** -- cgit v1.2.3 From c4554532612d139de31723267cb1c3192ff6d4a8 Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Sun, 28 Feb 2021 11:50:53 +0100 Subject: :sparkles: Add emptyBattery code --- inc/HoverBitController.h | 3 ++- source/HoverBitController.cpp | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/inc/HoverBitController.h b/inc/HoverBitController.h index 80ad173..f2c10b7 100644 --- a/inc/HoverBitController.h +++ b/inc/HoverBitController.h @@ -51,11 +51,12 @@ class HoverBitController { unsigned long lastReceiveTime; bool mainController; - bool batteryEmpty; + bool bBatteryEmpty; int batteryMilliVolt; float batteryFactor; bool failSafe(void); + void checkBattery(); void AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw,int Aux1,int Aux2); public: diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index df9893e..1ecc21b 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -32,7 +32,7 @@ DEALINGS IN THE SOFTWARE. */ void HoverBitController::init() { mainController = false; - batteryEmpty = false; + bBatteryEmpty = false; batteryMilliVolt = 3700; batteryFactor = 4.42; @@ -81,6 +81,18 @@ unsigned int HoverBitController::GetBatteryVoltage() { return ((float)((&uBit.io.P0)->getAnalogValue()) * batteryFactor * 0.05) + ((float)batteryMilliVolt * 0.95); } +/** + * Check wether battery level is too low. + */ +void HoverBitController::checkBattery() { + if (GetBatteryVoltage() < BATTERY_LOW_LIMIT - 60) { + bBatteryEmpty = true; + Throttle(0); + Arm(0); + Rudder(0); + } +} + /** * Method for sending commands to the AirBit-card, * this code is translated from the ts-code in MakeKit's original hex-file. @@ -148,6 +160,10 @@ void HoverBitController::AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw, * Method that sends commands with the current values for all parameters. */ void HoverBitController::HoverControl() { + checkBattery(); + if (BatteryEmpty()) { + Arm(0); + } if (!failSafe()) { AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); } @@ -181,5 +197,6 @@ void HoverBitController::Arm(bool _arm) { lastReceiveTime = uBit.systemTime(); } bool HoverBitController::BatteryEmpty() { - return batteryEmpty; + checkBattery(); + return bBatteryEmpty; } -- cgit v1.2.3 From 820e89ead9577c7aa4b7ef10f363daf8a28247ac Mon Sep 17 00:00:00 2001 From: Jakob Stendahl Date: Tue, 8 Jun 2021 00:56:19 +0200 Subject: :sparkles: Do lots of small tweaks --- CMakeLists.txt | 11 ----------- inc/Screen.h | 2 -- source/HoverBitController.cpp | 29 +++++++++++++---------------- source/Screen.cpp | 38 +++++--------------------------------- source/main.cpp | 35 ++++++++++++++--------------------- 5 files changed, 32 insertions(+), 83 deletions(-) (limited to 'source/HoverBitController.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 879568c..e2130f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,17 +82,6 @@ SET(CODAL_OUTPUT_NAME ${device.device}) SET(CODAL_TARGET_PROCESSOR ${device.processor}) SET(CODAL_TARGET_CPU_ARCHITECTURE ${device.architecture}) -# if this is the first build, lets copy a sample main.cpp from the target if available. -if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${CODAL_APP_SOURCE_DIR} AND EXISTS ${CMAKE_CURRENT_LIST_DIR}/${LIB_DEST}/${codal.target.name}/samples/main.cpp) - FILE(COPY ${CMAKE_CURRENT_LIST_DIR}/${LIB_DEST}/${codal.target.name}/samples/main.cpp DESTINATION ${CMAKE_CURRENT_LIST_DIR}/${CODAL_APP_SOURCE_DIR}) -endif() - -#copy samples and remove main.cpp -if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/samples AND EXISTS ${CMAKE_CURRENT_LIST_DIR}/${LIB_DEST}/${codal.target.name}/samples/) - FILE(COPY ${CMAKE_CURRENT_LIST_DIR}/${LIB_DEST}/${codal.target.name}/samples DESTINATION ${CMAKE_CURRENT_LIST_DIR}) - FILE(REMOVE ${CMAKE_CURRENT_LIST_DIR}/samples/main.cpp) -endif() - #################### SET(TOOLCHAIN ${device.toolchain}) diff --git a/inc/Screen.h b/inc/Screen.h index abac919..0ea7b8c 100644 --- a/inc/Screen.h +++ b/inc/Screen.h @@ -83,8 +83,6 @@ class HoverBitDisplay { DisplayMainScreenMode screenMode; unsigned int tmpTimer; bool BLEconnected; - bool bBLEIndicator; - bool flipFrame; bool isPause; void lowBattery(); diff --git a/source/HoverBitController.cpp b/source/HoverBitController.cpp index 1ecc21b..301fdeb 100644 --- a/source/HoverBitController.cpp +++ b/source/HoverBitController.cpp @@ -27,8 +27,6 @@ DEALINGS IN THE SOFTWARE. /** * Init method for HoverBitController, this sets everything to the default values. * It also initializes the airbit-pcb with some protocol magic. - * - * @param _uBit the MicroBit instance */ void HoverBitController::init() { mainController = false; @@ -44,9 +42,8 @@ void HoverBitController::init() { throttle = 0; lastReceiveTime = uBit.systemTime(); - /* I am not completly sure what this does, but it seems to me like this is - putting the air:bit board in some kind of "bind-mode", on the spec-sheet - there isn't any documentation for what 20 pulses means tho... */ + /* I am not completly sure what this does, according to the hover:bit guys + this is some magic to disable gyro-control of the lift fan. */ uBit.sleep(100); int o; for (o = 0; o < 20; o++) { @@ -60,14 +57,14 @@ void HoverBitController::init() { */ bool HoverBitController::failSafe(void) { unsigned long deltaReceiveTime = uBit.systemTime() - lastReceiveTime; - if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { - Throttle(0); - Rudder(0); - AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); - } if (deltaReceiveTime > FSAFE_TLIM_ARM) { - Arm(0); - AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); + arm = 0; + AirBit(0, 0, 0, 0, 0, 0 + 45, servo_1); + } + if (deltaReceiveTime > FSAFE_TLIM_THROTTLE) { + throttle = 0; + roll = 0; + AirBit(0, arm, 0, 0, 0, 0 + 45, servo_1); } return (deltaReceiveTime > FSAFE_TLIM_THROTTLE) || (deltaReceiveTime > FSAFE_TLIM_ARM); } @@ -87,9 +84,9 @@ unsigned int HoverBitController::GetBatteryVoltage() { void HoverBitController::checkBattery() { if (GetBatteryVoltage() < BATTERY_LOW_LIMIT - 60) { bBatteryEmpty = true; - Throttle(0); - Arm(0); - Rudder(0); + throttle = 0; + arm = 0; + roll = 0; } } @@ -162,7 +159,7 @@ void HoverBitController::AirBit(int Pitch,int Arm,int Roll,int Throttle,int Yaw, void HoverBitController::HoverControl() { checkBattery(); if (BatteryEmpty()) { - Arm(0); + arm = 0; } if (!failSafe()) { AirBit(0, arm, 0, throttle, roll, roll + 45, servo_1); diff --git a/source/Screen.cpp b/source/Screen.cpp index ad52247..f961994 100644 --- a/source/Screen.cpp +++ b/source/Screen.cpp @@ -179,9 +179,6 @@ void HoverBitDisplay::update() { if (isPause) { return; } int batteryMilliVolt = controller.GetBatteryVoltage(); - flipFrame = (uBit.systemTime() - tmpTimer) > 1000; - if (flipFrame) { tmpTimer = uBit.systemTime(); } - if ((((&uBit.io.P0)->getAnalogValue()) < 600) && (((&uBit.io.P0)->getAnalogValue()) >= 400)) { iconBatteryCharging(); } else if (controller.BatteryEmpty() || (batteryMilliVolt < BATTERY_LOW_LIMIT && (&uBit.io.P0)->getAnalogValue() > 300)) { @@ -189,7 +186,7 @@ void HoverBitDisplay::update() { } else if (!BLEconnected) { BLENotConnected(); } else { - mainScreen(); + showGraphs(); } } @@ -211,39 +208,14 @@ void HoverBitDisplay::lowBattery() { * Flashes a bluetooth symbol on screen. */ void HoverBitDisplay::BLENotConnected() { - if ((((uBit.systemTime() >> (12 - 1) & 1)) == 1)) { - bBLEIndicator = !bBLEIndicator; + if (uBit.systemTime() % 1000 > 250) { + MicroBitImage img(bluetoothSymbol); + uBit.display.print(img); + } else { 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(); - } } } -/** - * Method that does the "default" main screen mode. - * Called when in a connected "normal" operating state. - */ -void HoverBitDisplay::mainScreen() { - switch (displayMainScreenMode) { - case OFF: - break; - case BATTERY: - uBit.display.clear(); - batteryLevelFullScreen(); - break; - case GRAPHS: - default: - showGraphs(); - break; - } -} - /** * Show the GRAPH displayMainScreenMode */ diff --git a/source/main.cpp b/source/main.cpp index 6f3332b..16e665a 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -52,6 +52,7 @@ void onDisconnected(MicroBitEvent) { void onDelim(MicroBitEvent) { ManagedString msg = uart->readUntil(BLE_UART_DELIM); + uBit.display.image.setPixelValue(1, 0, 255); int length = msg.length(); const char* command = msg.toCharArray(); @@ -120,13 +121,6 @@ void onDelim(MicroBitEvent) { uart->send(accString); } -void onButtonA_press(MicroBitEvent e) { - hoverBitDisplay.nextMode(); -} - -void onButtonB_press(MicroBitEvent e) { -} - void onButtonAB_press(MicroBitEvent e) { hoverBitDisplay.pause(); uBit.display.scroll(VERSION); @@ -135,14 +129,15 @@ void onButtonAB_press(MicroBitEvent e) { int main() { uBit.init(); - uBit.audio.setVolume(255); // Setup serial for Spektsat communication with air:bit board uBit.serial.setBaud(115200); uBit.serial.redirect(uBit.io.P1, uBit.io.P2); - /* Initialize hover:bit controller module - * the init procedure have to be run within 100ms after air:bit power up */ + /* Initialize hover:bit controller module, these timeouts are some voodo + magic I don't quite understand. But for the init method to function + as we want, there should be a relatively long delay here. */ + uBit.sleep(3000); controller.init(); // Setup listeners @@ -150,8 +145,6 @@ int main() { 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 @@ -160,21 +153,21 @@ int main() { uart = new MicroBitUARTService(*uBit.ble, 32, 32); uart->eventOn(BLE_UART_DELIM); + uBit.audio.setVolume(20); uBit.audio.soundExpressions.play(ManagedString("hello")); + hoverBitDisplay.mode(GRAPHS); while (1) { - if (uBit.logo.isPressed()) { - if (!bCapLogoIsPressed) { - bCapLogoIsPressed = true; - hoverBitDisplay.nextMode(); - } - } else if (bCapLogoIsPressed) { - bCapLogoIsPressed = false; - } - hoverBitDisplay.update(); controller.HoverControl(); + if (uBit.systemTime() % 2000 > 1900) { + uart->send( + ManagedString("B:") + + ManagedString((int)controller.GetBatteryVoltage()) + ); + } uBit.sleep(20); + schedule(); } // If main exits, there may still be other fibers running or registered event handlers etc. -- cgit v1.2.3