|
| 1 | +#include "MicroBit.h" |
| 2 | +MicroBit uBit; |
| 3 | +const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10}; |
| 4 | +uint8_t advertising = 0; |
| 5 | +uint8_t tx_power_level = 6; |
| 6 | +uint8_t AdvData [] = {0xff, 0xff, |
| 7 | + 0x55, 0x97, |
| 8 | + '0', '0', |
| 9 | + '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.'}; |
| 10 | +uint8_t buttonsState = 0; |
| 11 | +uint8_t eventCounter = 0; |
| 12 | + |
| 13 | +char digit(uint8_t n) |
| 14 | +{ |
| 15 | + return '0' + n; |
| 16 | +} |
| 17 | + |
| 18 | +void startAdvertising() { |
| 19 | + int connectable = 0; |
| 20 | + int interval = 160; |
| 21 | + uBit.bleManager.setTransmitPower(tx_power_level); |
| 22 | + uBit.bleManager.ble->setAdvertisingType(connectable ? GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED : GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); |
| 23 | + uBit.bleManager.ble->setAdvertisingInterval(interval); |
| 24 | + uBit.bleManager.ble->clearAdvertisingPayload(); |
| 25 | + uBit.bleManager.ble->accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
| 26 | + uBit.bleManager.ble->accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData)); |
| 27 | + uBit.bleManager.ble->startAdvertising(); |
| 28 | + uBit.display.printAsync("ULTIBO", 200); |
| 29 | + advertising = 1; |
| 30 | +} |
| 31 | + |
| 32 | +void updatePayload () |
| 33 | +{ |
| 34 | + uBit.bleManager.ble->clearAdvertisingPayload(); |
| 35 | + uBit.bleManager.ble->accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
| 36 | + AdvData [4] = digit (eventCounter / 10); |
| 37 | + AdvData [5] = digit (eventCounter % 10); |
| 38 | + for (int i = 19; i >= 1; i--) |
| 39 | + { |
| 40 | + AdvData [i + 6] = AdvData [i + 6 - 1]; |
| 41 | + } |
| 42 | + AdvData [6] = buttonsState + '0'; |
| 43 | + uBit.bleManager.ble->accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData)); |
| 44 | +} |
| 45 | + |
| 46 | +void stopAdvertising() { |
| 47 | + uBit.bleManager.stopAdvertising(); |
| 48 | + uBit.display.scroll("OFF"); |
| 49 | + advertising = 0; |
| 50 | +} |
| 51 | + |
| 52 | +char text[] = "?"; |
| 53 | + |
| 54 | +void onButton(MicroBitEvent e) |
| 55 | +{ |
| 56 | + uint8_t mask; |
| 57 | + uint8_t prev = buttonsState; |
| 58 | + if (e.source == MICROBIT_ID_BUTTON_A) |
| 59 | + mask = 0x01; |
| 60 | + |
| 61 | + if (e.source == MICROBIT_ID_BUTTON_B) |
| 62 | + mask = 0x02; |
| 63 | + |
| 64 | + if (e.source == MICROBIT_ID_BUTTON_AB) |
| 65 | + mask = 0x04; |
| 66 | + |
| 67 | + if (e.source == MICROBIT_ID_IO_P0) |
| 68 | + mask = 0x08; |
| 69 | + |
| 70 | + if (e.source == MICROBIT_ID_IO_P1) |
| 71 | + mask = 0x10; |
| 72 | + |
| 73 | + if (e.source == MICROBIT_ID_IO_P2) |
| 74 | + mask = 0x20; |
| 75 | + |
| 76 | + if (e.value == MICROBIT_BUTTON_EVT_DOWN) |
| 77 | + buttonsState |= mask; |
| 78 | + |
| 79 | + if (e.value == MICROBIT_BUTTON_EVT_UP) |
| 80 | + buttonsState &= ~mask; |
| 81 | + |
| 82 | + if (buttonsState != prev) |
| 83 | + { |
| 84 | + eventCounter = (eventCounter + 1) % 100; |
| 85 | + switch (buttonsState) |
| 86 | + { |
| 87 | + case 0: text [0] = ' '; |
| 88 | + break; |
| 89 | + case 1: text [0] = 'A'; |
| 90 | + break; |
| 91 | + case 2: text [0] = 'B'; |
| 92 | + break; |
| 93 | + case 3: text [0] = '2'; |
| 94 | + break; |
| 95 | + default: text [0] = '?'; |
| 96 | + } |
| 97 | + uBit.display.printAsync (text); |
| 98 | + updatePayload (); |
| 99 | + } |
| 100 | + |
| 101 | +// if (e.value == MICROBIT_BUTTON_EVT_CLICK) |
| 102 | +// uBit.serial.printf("CLICK"); |
| 103 | +// |
| 104 | +// if (e.value == MICROBIT_BUTTON_EVT_LONG_CLICK) |
| 105 | +// uBit.serial.printf("LONG_CLICK"); |
| 106 | +// |
| 107 | +// if (e.value == MICROBIT_BUTTON_EVT_HOLD) |
| 108 | +// uBit.serial.printf("HOLD"); |
| 109 | +// |
| 110 | +// if (e.value == MICROBIT_BUTTON_EVT_DOUBLE_CLICK) |
| 111 | +// uBit.serial.printf("DOUBLE_CLICK"); |
| 112 | +// |
| 113 | +// uBit.serial.printf("\r\n"); |
| 114 | +} |
| 115 | + |
| 116 | +int main() |
| 117 | +{ |
| 118 | + uBit.init(); |
| 119 | + uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton); |
| 120 | + uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton); |
| 121 | + startAdvertising(); |
| 122 | + release_fiber(); |
| 123 | +} |
0 commit comments