aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Stendahl <jakob.stendahl@outlook.com>2021-06-08 00:56:19 +0200
committerJakob Stendahl <jakob.stendahl@outlook.com>2021-06-08 00:56:19 +0200
commit820e89ead9577c7aa4b7ef10f363daf8a28247ac (patch)
tree8006e48de8129e836ee45ef4516a036625949062
parente9a5544db7be5e461b92743b37adcc77162483b7 (diff)
downloadhoverbit-ble-820e89ead9577c7aa4b7ef10f363daf8a28247ac.tar.gz
hoverbit-ble-820e89ead9577c7aa4b7ef10f363daf8a28247ac.zip
:sparkles: Do lots of small tweaks
-rw-r--r--CMakeLists.txt11
-rw-r--r--inc/Screen.h2
-rw-r--r--source/HoverBitController.cpp29
-rw-r--r--source/Screen.cpp38
-rw-r--r--source/main.cpp35
5 files changed, 32 insertions, 83 deletions
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,40 +208,15 @@ 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
*/
void HoverBitDisplay::showGraphs() {
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.