test
Dependencies: BLE_API nRF51822 mbed
Fork of KS7 by
main.cpp@7:9ebf125e405f, 2015-11-06 (annotated)
- Committer:
- gomihgy
- Date:
- Fri Nov 06 03:45:16 2015 +0000
- Revision:
- 7:9ebf125e405f
- Parent:
- 6:bc960e6fd1ed
- Child:
- 8:32be16b1eaf2
v1.00.001; ?ticker???100msec???; ???????????????????????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akita11 | 0:08c8325a21ec | 1 | #include "mbed.h" |
akita11 | 0:08c8325a21ec | 2 | #include "io.h" |
gomihgy | 5:1730064b94bd | 3 | #include "BLEDevice.h" |
akita11 | 0:08c8325a21ec | 4 | |
gomihgy | 6:bc960e6fd1ed | 5 | // BLE |
gomihgy | 6:bc960e6fd1ed | 6 | #define INTERVAL_500MSEC (500UL) |
gomihgy | 6:bc960e6fd1ed | 7 | #define CONNTIMEOUT_3000MSEC (3000UL) |
gomihgy | 5:1730064b94bd | 8 | #define ADV_TIMEOUT (0) |
gomihgy | 5:1730064b94bd | 9 | #define DEVICE_NAME "Kitchen Scale" |
gomihgy | 5:1730064b94bd | 10 | #define BLE_TXPOWER_4DBM (4) |
gomihgy | 5:1730064b94bd | 11 | |
gomihgy | 5:1730064b94bd | 12 | // Device Information Service (DIS) (20 character limit) |
gomihgy | 5:1730064b94bd | 13 | // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml |
gomihgy | 6:bc960e6fd1ed | 14 | #define MANUFACTURER_NAME_STRING "Hacarus" // Manufacturer Name String - shall represent the name of the manufacturer of the device. |
gomihgy | 6:bc960e6fd1ed | 15 | #define MODEL_NUMBER_STRING "0001" // Model Number String - shall represent the model number that is assigned by the device vendor. |
gomihgy | 6:bc960e6fd1ed | 16 | #define SERIAL_NUMBER_STRING "000780c0ffeef00d" // Serial Number String - shall represent the serial number for a particular instance of the device. |
gomihgy | 7:9ebf125e405f | 17 | #define FIRMWARE_REVISION_STRING "v1.00.001@rev0007" // Firmware Revision String - shall represent the firmware revision for the firmware within the device. |
gomihgy | 5:1730064b94bd | 18 | |
gomihgy | 5:1730064b94bd | 19 | // Weight Scale Service (Original) |
gomihgy | 5:1730064b94bd | 20 | #define UUID_WEIGHT_SCALE_SERVICE (0x181D) |
gomihgy | 6:bc960e6fd1ed | 21 | |
gomihgy | 6:bc960e6fd1ed | 22 | // JoyStick |
gomihgy | 7:9ebf125e405f | 23 | #define PUSH_MINTHRESHOLD (0.2) |
gomihgy | 7:9ebf125e405f | 24 | #define PUSH_MAXTHRESHOLD (0.6) |
gomihgy | 7:9ebf125e405f | 25 | #define PUSH_COUNT (15) |
gomihgy | 5:1730064b94bd | 26 | |
gomihgy | 6:bc960e6fd1ed | 27 | // Mode |
gomihgy | 6:bc960e6fd1ed | 28 | #define MODE_OFF (0) // LED OFF |
gomihgy | 6:bc960e6fd1ed | 29 | #define MODE_START (1) // LED OFF -> ON |
gomihgy | 6:bc960e6fd1ed | 30 | #define MODE_ON (2) // LED ON |
gomihgy | 6:bc960e6fd1ed | 31 | #define MODE_END (3) // LED ON -> OFF |
gomihgy | 6:bc960e6fd1ed | 32 | |
gomihgy | 6:bc960e6fd1ed | 33 | // Led |
gomihgy | 7:9ebf125e405f | 34 | #define LED_INTERVAL_NSEC (100000) |
gomihgy | 6:bc960e6fd1ed | 35 | #define BRIGHTNESS_ADDVALUE (0.1) |
gomihgy | 7:9ebf125e405f | 36 | #define BRIGHTNESS_MINVALUE (0.0) |
gomihgy | 6:bc960e6fd1ed | 37 | #define BRIGHTNESS_MAXVALUE (1.0) |
gomihgy | 6:bc960e6fd1ed | 38 | |
gomihgy | 6:bc960e6fd1ed | 39 | // UART for debug |
gomihgy | 5:1730064b94bd | 40 | #ifdef UART_DEBUG |
gomihgy | 5:1730064b94bd | 41 | Serial pc(P0_9, P0_8);// TX=P0_9 |
gomihgy | 5:1730064b94bd | 42 | #define UART_BAUD_RATE (9600UL) |
gomihgy | 5:1730064b94bd | 43 | #endif |
akita11 | 4:edd6e262de9e | 44 | |
gomihgy | 6:bc960e6fd1ed | 45 | // Properties |
gomihgy | 6:bc960e6fd1ed | 46 | io io; |
gomihgy | 6:bc960e6fd1ed | 47 | Ticker tk; |
gomihgy | 6:bc960e6fd1ed | 48 | float weight = 0; |
gomihgy | 6:bc960e6fd1ed | 49 | uint32_t scale = 0; |
gomihgy | 6:bc960e6fd1ed | 50 | int update_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 51 | int push_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 52 | int led_mode = MODE_OFF; |
gomihgy | 6:bc960e6fd1ed | 53 | float led_brightness = BRIGHTNESS_MINVALUE; |
akita11 | 4:edd6e262de9e | 54 | |
gomihgy | 6:bc960e6fd1ed | 55 | // BLE |
gomihgy | 5:1730064b94bd | 56 | BLEDevice ble; |
gomihgy | 5:1730064b94bd | 57 | Gap::ConnectionParams_t connectionParams; |
gomihgy | 5:1730064b94bd | 58 | |
gomihgy | 5:1730064b94bd | 59 | /* Complete list of 16-bit Service IDs */ |
gomihgy | 6:bc960e6fd1ed | 60 | uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE}; |
gomihgy | 5:1730064b94bd | 61 | |
gomihgy | 5:1730064b94bd | 62 | /* Weight Scale Service */ |
gomihgy | 6:bc960e6fd1ed | 63 | static const uint8_t UUID_HACARUS_WEIGHT_CHAR[] = {0x00, 0x00, 0x2A, 0x9D, 0x00, 0x01, 0x00, 0x01, 0x00, 'H','a', 'c', 'a', 'r','u', 's'}; |
gomihgy | 6:bc960e6fd1ed | 64 | GattCharacteristic WeightMeasurement (UUID(UUID_HACARUS_WEIGHT_CHAR), (uint8_t *)&weight, sizeof(weight), sizeof(weight), |
gomihgy | 6:bc960e6fd1ed | 65 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
gomihgy | 6:bc960e6fd1ed | 66 | static const uint8_t UUID_HACARUS_SCALE_CHAR[] = {0x00, 0x00, 0x2A, 0x9E, 0x00, 0x01, 0x00, 0x01, 0x00, 'H','a', 'c', 'a', 'r','u', 's'}; |
gomihgy | 6:bc960e6fd1ed | 67 | GattCharacteristic WeightScale (UUID(UUID_HACARUS_SCALE_CHAR), (uint8_t *)&scale, sizeof(scale), sizeof(scale), |
gomihgy | 6:bc960e6fd1ed | 68 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
gomihgy | 6:bc960e6fd1ed | 69 | GattCharacteristic *Chars[] = {&WeightMeasurement,&WeightScale}; |
gomihgy | 6:bc960e6fd1ed | 70 | static const uint8_t UUID_HACARUS_WEIGHT_SERVICE[] = {0x00, 0x00, 0x18, 0x1D, 0x00, 0x01, 0x00, 0x01, 0x00, 'H','a', 'c', 'a', 'r','u', 's'}; |
gomihgy | 6:bc960e6fd1ed | 71 | GattService HWS = GattService(UUID(UUID_HACARUS_WEIGHT_SERVICE), Chars, sizeof(Chars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 72 | |
gomihgy | 5:1730064b94bd | 73 | /* Device Information Service */ |
gomihgy | 5:1730064b94bd | 74 | GattCharacteristic ManuName(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, (uint8_t *)&MANUFACTURER_NAME_STRING, sizeof(MANUFACTURER_NAME_STRING) - 1, sizeof(MANUFACTURER_NAME_STRING) - 1, |
gomihgy | 5:1730064b94bd | 75 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 76 | GattCharacteristic ModelNum(GattCharacteristic::UUID_MODEL_NUMBER_STRING_CHAR, (uint8_t *)&MODEL_NUMBER_STRING, sizeof(MODEL_NUMBER_STRING) - 1, sizeof(MODEL_NUMBER_STRING) - 1, |
gomihgy | 5:1730064b94bd | 77 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 6:bc960e6fd1ed | 78 | GattCharacteristic SerialNum(GattCharacteristic::UUID_SERIAL_NUMBER_STRING_CHAR, (uint8_t *)&SERIAL_NUMBER_STRING, sizeof(SERIAL_NUMBER_STRING) - 1, sizeof(SERIAL_NUMBER_STRING) - 1, |
gomihgy | 5:1730064b94bd | 79 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 80 | GattCharacteristic FWVersion(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)&FIRMWARE_REVISION_STRING, sizeof(FIRMWARE_REVISION_STRING) - 1, sizeof(FIRMWARE_REVISION_STRING) - 1, |
gomihgy | 5:1730064b94bd | 81 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 6:bc960e6fd1ed | 82 | GattCharacteristic *DISChars[] = {&ManuName, &ModelNum, &SerialNum, &FWVersion}; |
gomihgy | 5:1730064b94bd | 83 | GattService DIS(GattService::UUID_DEVICE_INFORMATION_SERVICE , DISChars, sizeof(DISChars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 84 | |
gomihgy | 7:9ebf125e405f | 85 | /* to confirm joystick */ |
gomihgy | 7:9ebf125e405f | 86 | bool check_joystick(){ |
gomihgy | 6:bc960e6fd1ed | 87 | bool pushing = false; |
gomihgy | 7:9ebf125e405f | 88 | float value_x,value_y; |
gomihgy | 7:9ebf125e405f | 89 | |
gomihgy | 7:9ebf125e405f | 90 | value_x = io.get_x(); |
gomihgy | 7:9ebf125e405f | 91 | value_y = io.get_y(); |
gomihgy | 6:bc960e6fd1ed | 92 | |
gomihgy | 7:9ebf125e405f | 93 | if(PUSH_MINTHRESHOLD >= value_x || PUSH_MAXTHRESHOLD <= value_x){ |
gomihgy | 7:9ebf125e405f | 94 | pushing = true; |
gomihgy | 7:9ebf125e405f | 95 | } |
gomihgy | 7:9ebf125e405f | 96 | else if(PUSH_MINTHRESHOLD >= value_y || PUSH_MAXTHRESHOLD <= value_y){ |
gomihgy | 7:9ebf125e405f | 97 | pushing = true; |
gomihgy | 7:9ebf125e405f | 98 | } |
gomihgy | 7:9ebf125e405f | 99 | |
gomihgy | 7:9ebf125e405f | 100 | if(pushing){ |
gomihgy | 6:bc960e6fd1ed | 101 | if(++push_counter >= PUSH_COUNT){ |
gomihgy | 6:bc960e6fd1ed | 102 | push_counter = 0; |
gomihgy | 7:9ebf125e405f | 103 | return true; |
gomihgy | 6:bc960e6fd1ed | 104 | } |
gomihgy | 6:bc960e6fd1ed | 105 | }else{ |
gomihgy | 6:bc960e6fd1ed | 106 | push_counter = 0; |
akita11 | 0:08c8325a21ec | 107 | } |
gomihgy | 6:bc960e6fd1ed | 108 | |
gomihgy | 7:9ebf125e405f | 109 | return false; |
gomihgy | 7:9ebf125e405f | 110 | } |
gomihgy | 7:9ebf125e405f | 111 | |
gomihgy | 7:9ebf125e405f | 112 | void ticker_callback() |
gomihgy | 7:9ebf125e405f | 113 | { |
gomihgy | 7:9ebf125e405f | 114 | bool pushing = check_joystick(); |
gomihgy | 7:9ebf125e405f | 115 | |
gomihgy | 6:bc960e6fd1ed | 116 | switch(led_mode){ |
gomihgy | 6:bc960e6fd1ed | 117 | case MODE_OFF: |
gomihgy | 6:bc960e6fd1ed | 118 | if(pushing){ |
gomihgy | 6:bc960e6fd1ed | 119 | io.display_value = 0; |
gomihgy | 6:bc960e6fd1ed | 120 | led_mode = MODE_START; |
gomihgy | 6:bc960e6fd1ed | 121 | } |
gomihgy | 6:bc960e6fd1ed | 122 | break; |
gomihgy | 6:bc960e6fd1ed | 123 | case MODE_START: |
gomihgy | 6:bc960e6fd1ed | 124 | led_brightness += BRIGHTNESS_ADDVALUE; |
gomihgy | 6:bc960e6fd1ed | 125 | io.display(led_brightness); |
gomihgy | 6:bc960e6fd1ed | 126 | if(led_brightness >= BRIGHTNESS_MAXVALUE){ |
gomihgy | 6:bc960e6fd1ed | 127 | led_mode = MODE_ON; |
gomihgy | 6:bc960e6fd1ed | 128 | ble.startAdvertising(); |
gomihgy | 6:bc960e6fd1ed | 129 | } |
gomihgy | 6:bc960e6fd1ed | 130 | break; |
gomihgy | 6:bc960e6fd1ed | 131 | case MODE_ON: |
gomihgy | 6:bc960e6fd1ed | 132 | if(!pushing){ |
gomihgy | 6:bc960e6fd1ed | 133 | io.display_value = (uint16_t)(io.get_weight() * 9999.0); // dummy display |
gomihgy | 6:bc960e6fd1ed | 134 | if(++update_counter >= 5){ |
gomihgy | 6:bc960e6fd1ed | 135 | io.analog_pow(1); // turn analog power on |
gomihgy | 6:bc960e6fd1ed | 136 | weight = io.get_weight() * 9999.0; |
gomihgy | 6:bc960e6fd1ed | 137 | ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(), |
gomihgy | 6:bc960e6fd1ed | 138 | (uint8_t *)&weight, |
gomihgy | 6:bc960e6fd1ed | 139 | sizeof(weight)); |
gomihgy | 6:bc960e6fd1ed | 140 | io.analog_pow(0); // turn analog power off |
gomihgy | 6:bc960e6fd1ed | 141 | update_counter = 0; |
gomihgy | 7:9ebf125e405f | 142 | } |
gomihgy | 6:bc960e6fd1ed | 143 | }else{ |
gomihgy | 6:bc960e6fd1ed | 144 | if(ble.getGapState().connected){ |
gomihgy | 6:bc960e6fd1ed | 145 | ble.disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION); |
gomihgy | 6:bc960e6fd1ed | 146 | } |
gomihgy | 6:bc960e6fd1ed | 147 | led_mode = MODE_END; |
gomihgy | 6:bc960e6fd1ed | 148 | update_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 149 | } |
gomihgy | 6:bc960e6fd1ed | 150 | break; |
gomihgy | 6:bc960e6fd1ed | 151 | case MODE_END: |
gomihgy | 6:bc960e6fd1ed | 152 | led_brightness -= BRIGHTNESS_ADDVALUE; |
gomihgy | 6:bc960e6fd1ed | 153 | io.display(led_brightness); |
gomihgy | 6:bc960e6fd1ed | 154 | if(led_brightness <= BRIGHTNESS_MINVALUE){ |
gomihgy | 6:bc960e6fd1ed | 155 | led_mode = MODE_OFF; |
gomihgy | 6:bc960e6fd1ed | 156 | } |
gomihgy | 6:bc960e6fd1ed | 157 | break; |
akita11 | 0:08c8325a21ec | 158 | } |
akita11 | 0:08c8325a21ec | 159 | } |
akita11 | 0:08c8325a21ec | 160 | |
gomihgy | 5:1730064b94bd | 161 | /* |
gomihgy | 5:1730064b94bd | 162 | * BLE CallBacks |
gomihgy | 5:1730064b94bd | 163 | */ |
gomihgy | 5:1730064b94bd | 164 | void BLEConnectionCallback(Gap::Handle_t handle, Gap::addr_type_t type, const Gap::address_t addr,const Gap::ConnectionParams_t *params) |
gomihgy | 5:1730064b94bd | 165 | { |
gomihgy | 5:1730064b94bd | 166 | ble.updateConnectionParams(handle, &connectionParams); |
gomihgy | 5:1730064b94bd | 167 | } |
gomihgy | 5:1730064b94bd | 168 | |
gomihgy | 5:1730064b94bd | 169 | void BLEDisconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
gomihgy | 5:1730064b94bd | 170 | { |
gomihgy | 6:bc960e6fd1ed | 171 | if(led_mode == MODE_ON){ |
gomihgy | 6:bc960e6fd1ed | 172 | ble.startAdvertising(); |
gomihgy | 5:1730064b94bd | 173 | } |
gomihgy | 5:1730064b94bd | 174 | } |
gomihgy | 5:1730064b94bd | 175 | |
gomihgy | 5:1730064b94bd | 176 | void BleInitialize(void){ |
gomihgy | 5:1730064b94bd | 177 | |
gomihgy | 6:bc960e6fd1ed | 178 | uint8_t advertiseServiceID[16]; |
gomihgy | 6:bc960e6fd1ed | 179 | |
gomihgy | 5:1730064b94bd | 180 | // Initialize |
gomihgy | 5:1730064b94bd | 181 | ble.init(); |
gomihgy | 5:1730064b94bd | 182 | |
gomihgy | 5:1730064b94bd | 183 | // Event Set |
gomihgy | 5:1730064b94bd | 184 | ble.onConnection(&BLEConnectionCallback); |
gomihgy | 5:1730064b94bd | 185 | ble.onDisconnection(&BLEDisconnectionCallback); |
gomihgy | 5:1730064b94bd | 186 | |
gomihgy | 5:1730064b94bd | 187 | ble.getPreferredConnectionParams(&connectionParams); |
gomihgy | 6:bc960e6fd1ed | 188 | connectionParams.maxConnectionInterval = INTERVAL_500MSEC; |
gomihgy | 6:bc960e6fd1ed | 189 | connectionParams.minConnectionInterval = INTERVAL_500MSEC; |
gomihgy | 6:bc960e6fd1ed | 190 | connectionParams.connectionSupervisionTimeout = CONNTIMEOUT_3000MSEC; |
gomihgy | 6:bc960e6fd1ed | 191 | connectionParams.slaveLatency = 2; |
gomihgy | 5:1730064b94bd | 192 | ble.setPreferredConnectionParams(&connectionParams); |
gomihgy | 5:1730064b94bd | 193 | |
gomihgy | 5:1730064b94bd | 194 | ble.setTxPower(BLE_TXPOWER_4DBM); |
gomihgy | 6:bc960e6fd1ed | 195 | |
gomihgy | 6:bc960e6fd1ed | 196 | for(int i=0; i<16; i++){ |
gomihgy | 6:bc960e6fd1ed | 197 | advertiseServiceID[i] = UUID_HACARUS_WEIGHT_SERVICE[16 - 1 - i]; |
gomihgy | 6:bc960e6fd1ed | 198 | } |
gomihgy | 6:bc960e6fd1ed | 199 | |
gomihgy | 5:1730064b94bd | 200 | ble.accumulateAdvertisingPayload((GapAdvertisingData::Flags)(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED)); |
gomihgy | 5:1730064b94bd | 201 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
gomihgy | 5:1730064b94bd | 202 | (const uint8_t *)DEVICE_NAME, |
gomihgy | 5:1730064b94bd | 203 | strlen(DEVICE_NAME)); |
gomihgy | 5:1730064b94bd | 204 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
gomihgy | 6:bc960e6fd1ed | 205 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
gomihgy | 6:bc960e6fd1ed | 206 | (const uint8_t *)advertiseServiceID, sizeof(advertiseServiceID)); |
gomihgy | 6:bc960e6fd1ed | 207 | |
gomihgy | 6:bc960e6fd1ed | 208 | ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(INTERVAL_500MSEC)); |
gomihgy | 5:1730064b94bd | 209 | ble.setAdvertisingTimeout(ADV_TIMEOUT); /* 0 is disable the advertising timeout. */ |
gomihgy | 5:1730064b94bd | 210 | |
gomihgy | 6:bc960e6fd1ed | 211 | ble.addService(HWS); |
gomihgy | 5:1730064b94bd | 212 | ble.addService(DIS); |
gomihgy | 5:1730064b94bd | 213 | } |
gomihgy | 5:1730064b94bd | 214 | |
akita11 | 0:08c8325a21ec | 215 | int main() |
akita11 | 0:08c8325a21ec | 216 | { |
gomihgy | 5:1730064b94bd | 217 | BleInitialize(); |
gomihgy | 5:1730064b94bd | 218 | |
gomihgy | 5:1730064b94bd | 219 | #ifdef UART_DEBUG |
gomihgy | 5:1730064b94bd | 220 | pc.baud(UART_BAUD_RATE); |
gomihgy | 5:1730064b94bd | 221 | #endif |
gomihgy | 5:1730064b94bd | 222 | |
gomihgy | 6:bc960e6fd1ed | 223 | tk.attach_us(&ticker_callback, LED_INTERVAL_NSEC); |
gomihgy | 5:1730064b94bd | 224 | |
gomihgy | 6:bc960e6fd1ed | 225 | for (;; ) { |
gomihgy | 6:bc960e6fd1ed | 226 | ble.waitForEvent(); |
akita11 | 0:08c8325a21ec | 227 | } |
akita11 | 0:08c8325a21ec | 228 | } |
gomihgy | 6:bc960e6fd1ed | 229 | |
akita11 | 0:08c8325a21ec | 230 |