test
Dependencies: BLE_API nRF51822 mbed
Fork of KS7 by
main.cpp@5:1730064b94bd, 2015-10-27 (annotated)
- Committer:
- gomihgy
- Date:
- Tue Oct 27 02:04:56 2015 +0000
- Revision:
- 5:1730064b94bd
- Parent:
- 4:edd6e262de9e
- Child:
- 6:bc960e6fd1ed
???? v0.1.00; WSS??DIS??????[g]?????SerialNumberString(0x2A25)????
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 | 5:1730064b94bd | 5 | // Advertise |
gomihgy | 5:1730064b94bd | 6 | #define INTERVAL_1SEC (1000UL) |
gomihgy | 5:1730064b94bd | 7 | #define ADV_TIMEOUT (0) |
gomihgy | 5:1730064b94bd | 8 | |
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 | 5:1730064b94bd | 14 | #define MANUFACTURER_NAME_STRING "akita11/GomiHgy" // Manufacturer Name String - shall represent the name of the manufacturer of the device. |
gomihgy | 5:1730064b94bd | 15 | #define MODEL_NUMBER_STRING "Model Number" // Model Number String - shall represent the model number that is assigned by the device vendor. |
gomihgy | 5:1730064b94bd | 16 | #define SERIAL_NUMBER_STRING "Serial Number" // Serial Number String - shall represent the serial number for a particular instance of the device. |
gomihgy | 5:1730064b94bd | 17 | #define HARDWARE_REVISION_STRING "v1.0.0@151023" // Hardware Revision String - shall represent the hardware revision for the hardware within the device. |
gomihgy | 5:1730064b94bd | 18 | #define FIRMWARE_REVISION_STRING "rev0004:edd6e262de9e" // Firmware Revision String - shall represent the firmware revision for the firmware within the device. |
gomihgy | 5:1730064b94bd | 19 | #define SOFTWARE_REVISION_STRING "v0.1.00.005:151027r1" // Software Revision String - shall represent the software revision for the software within the device. |
gomihgy | 5:1730064b94bd | 20 | |
gomihgy | 5:1730064b94bd | 21 | // Weight Scale Service (Original) |
gomihgy | 5:1730064b94bd | 22 | #define UUID_WEIGHT_SCALE_SERVICE (0x181D) |
gomihgy | 5:1730064b94bd | 23 | #define UUID_WEIGHT_MEASUREMENT_CHAR (0x3A9D) |
gomihgy | 5:1730064b94bd | 24 | |
gomihgy | 5:1730064b94bd | 25 | #ifdef UART_DEBUG |
gomihgy | 5:1730064b94bd | 26 | Serial pc(P0_9, P0_8);// TX=P0_9 |
gomihgy | 5:1730064b94bd | 27 | #define UART_BAUD_RATE (9600UL) |
gomihgy | 5:1730064b94bd | 28 | #endif |
akita11 | 4:edd6e262de9e | 29 | |
akita11 | 4:edd6e262de9e | 30 | /* |
akita11 | 4:edd6e262de9e | 31 | Serial pc(P0_9, P0_8);// TX=P0_9 |
akita11 | 4:edd6e262de9e | 32 | AnalogIn vin(P0_1); |
akita11 | 4:edd6e262de9e | 33 | |
akita11 | 4:edd6e262de9e | 34 | int main() |
akita11 | 4:edd6e262de9e | 35 | { |
akita11 | 4:edd6e262de9e | 36 | pc.baud(9600); |
akita11 | 4:edd6e262de9e | 37 | while(1){ |
akita11 | 4:edd6e262de9e | 38 | pc.printf("CONFIG=%x\r\n", NRF_ADC->CONFIG); // 0x0000046a |
akita11 | 4:edd6e262de9e | 39 | // EXTREFSEL=00 (none) |
akita11 | 4:edd6e262de9e | 40 | // PSEL=00000100 (use AnalogInput2) |
akita11 | 4:edd6e262de9e | 41 | // REFSEL=11 (VDD with 1/3 prescale) |
akita11 | 4:edd6e262de9e | 42 | // INPSEL=010 (prescale=1/3) |
akita11 | 4:edd6e262de9e | 43 | // RES=10 (10bit) |
akita11 | 4:edd6e262de9e | 44 | pc.printf("%f %d\r\n", vin.read(), NRF_ADC->RESULT); |
akita11 | 4:edd6e262de9e | 45 | wait(0.1); |
akita11 | 4:edd6e262de9e | 46 | } |
akita11 | 4:edd6e262de9e | 47 | } |
akita11 | 4:edd6e262de9e | 48 | */ |
akita11 | 4:edd6e262de9e | 49 | |
akita11 | 0:08c8325a21ec | 50 | io io; |
akita11 | 0:08c8325a21ec | 51 | |
akita11 | 0:08c8325a21ec | 52 | Ticker tk; // 1s timer for switch check & weighgt measure |
akita11 | 0:08c8325a21ec | 53 | float weight; |
gomihgy | 5:1730064b94bd | 54 | char weight_str[20]; |
akita11 | 0:08c8325a21ec | 55 | uint8_t fPow = 0; |
akita11 | 0:08c8325a21ec | 56 | |
gomihgy | 5:1730064b94bd | 57 | BLEDevice ble; |
gomihgy | 5:1730064b94bd | 58 | Gap::ConnectionParams_t connectionParams; |
gomihgy | 5:1730064b94bd | 59 | |
gomihgy | 5:1730064b94bd | 60 | /* Complete list of 16-bit Service IDs */ |
gomihgy | 5:1730064b94bd | 61 | uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE,UUID_WEIGHT_SCALE_SERVICE}; |
gomihgy | 5:1730064b94bd | 62 | |
gomihgy | 5:1730064b94bd | 63 | /* Weight Scale Service */ |
gomihgy | 5:1730064b94bd | 64 | GattCharacteristic WeightMeasurement(GattCharacteristic::UUID_SERIAL_NUMBER_STRING_CHAR/*UUID_WEIGHT_MEASUREMENT_CHAR*/, (uint8_t *)&weight_str, sizeof(weight_str), sizeof(weight_str), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
gomihgy | 5:1730064b94bd | 65 | GattCharacteristic *WMSChars[] = {&WeightMeasurement }; |
gomihgy | 5:1730064b94bd | 66 | GattService WMS(UUID_WEIGHT_SCALE_SERVICE , WMSChars, sizeof(WMSChars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 67 | |
gomihgy | 5:1730064b94bd | 68 | /* Device Information Service */ |
gomihgy | 5:1730064b94bd | 69 | 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 | 70 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 71 | 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 | 72 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 73 | //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 | 74 | // GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 75 | GattCharacteristic HWVersion(GattCharacteristic::UUID_HARDWARE_REVISION_STRING_CHAR, (uint8_t *)&HARDWARE_REVISION_STRING, sizeof(HARDWARE_REVISION_STRING) - 1, sizeof(HARDWARE_REVISION_STRING) - 1, |
gomihgy | 5:1730064b94bd | 76 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 77 | 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 | 78 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 79 | GattCharacteristic SWVersion(GattCharacteristic::UUID_SOFTWARE_REVISION_STRING_CHAR, (uint8_t *)&SOFTWARE_REVISION_STRING, sizeof(SOFTWARE_REVISION_STRING) - 1, sizeof(SOFTWARE_REVISION_STRING) - 1, |
gomihgy | 5:1730064b94bd | 80 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 81 | GattCharacteristic *DISChars[] = {&ManuName, &ModelNum, /*&SerialNum,*/ &HWVersion, &FWVersion, &SWVersion }; |
gomihgy | 5:1730064b94bd | 82 | GattService DIS(GattService::UUID_DEVICE_INFORMATION_SERVICE , DISChars, sizeof(DISChars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 83 | |
akita11 | 0:08c8325a21ec | 84 | // 1s timer for switch check & weighgt measure |
akita11 | 0:08c8325a21ec | 85 | void ticker_1s() |
akita11 | 0:08c8325a21ec | 86 | { |
akita11 | 0:08c8325a21ec | 87 | io.analog_pow(1); // turn analog power on |
akita11 | 0:08c8325a21ec | 88 | weight = io.get_weight(); // get weight [g] |
gomihgy | 5:1730064b94bd | 89 | sprintf (weight_str, "%0.3f[g]", weight); |
gomihgy | 5:1730064b94bd | 90 | ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(), |
gomihgy | 5:1730064b94bd | 91 | (uint8_t *)&weight_str, |
gomihgy | 5:1730064b94bd | 92 | sizeof(weight_str)); |
akita11 | 3:2398a9368c9b | 93 | /* |
akita11 | 0:08c8325a21ec | 94 | // check switch, and control power flag (fPower) |
akita11 | 0:08c8325a21ec | 95 | if (fPow == 0 && io.get_switch() == 1){ |
akita11 | 0:08c8325a21ec | 96 | while(io.get_switch() == 1); // wait until switch released |
akita11 | 0:08c8325a21ec | 97 | fPow = 1; |
akita11 | 0:08c8325a21ec | 98 | } |
akita11 | 0:08c8325a21ec | 99 | if (fPow == 1 && io.get_switch() == 1){ |
akita11 | 0:08c8325a21ec | 100 | while(io.get_switch() == 1); // wait until switch released |
akita11 | 0:08c8325a21ec | 101 | fPow = 0; |
akita11 | 0:08c8325a21ec | 102 | } |
akita11 | 3:2398a9368c9b | 103 | */ |
akita11 | 4:edd6e262de9e | 104 | |
akita11 | 4:edd6e262de9e | 105 | // io.display_value = (uint16_t)(io.get_weight_raw() * 9999.0); // dummy display |
akita11 | 4:edd6e262de9e | 106 | // io.display_value = (int)(io.get_x() * 9900 + io.get_y() * 99); // test: display joystick XY value |
akita11 | 4:edd6e262de9e | 107 | // io.display_value = (uint16_t)(io.get_x() * 9999.0); // dummy display |
akita11 | 4:edd6e262de9e | 108 | |
akita11 | 4:edd6e262de9e | 109 | |
akita11 | 0:08c8325a21ec | 110 | io.analog_pow(0); // turn analog power off |
akita11 | 0:08c8325a21ec | 111 | } |
akita11 | 0:08c8325a21ec | 112 | |
gomihgy | 5:1730064b94bd | 113 | /* |
gomihgy | 5:1730064b94bd | 114 | * BLE CallBacks |
gomihgy | 5:1730064b94bd | 115 | */ |
gomihgy | 5:1730064b94bd | 116 | void BLEConnectionCallback(Gap::Handle_t handle, Gap::addr_type_t type, const Gap::address_t addr,const Gap::ConnectionParams_t *params) |
gomihgy | 5:1730064b94bd | 117 | { |
gomihgy | 5:1730064b94bd | 118 | ble.updateConnectionParams(handle, &connectionParams); |
gomihgy | 5:1730064b94bd | 119 | } |
gomihgy | 5:1730064b94bd | 120 | |
gomihgy | 5:1730064b94bd | 121 | void BLEDisconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
gomihgy | 5:1730064b94bd | 122 | { |
gomihgy | 5:1730064b94bd | 123 | ble.startAdvertising(); |
gomihgy | 5:1730064b94bd | 124 | } |
gomihgy | 5:1730064b94bd | 125 | |
gomihgy | 5:1730064b94bd | 126 | void BLEDataWrittenCallback(const GattCharacteristicWriteCBParams *params) |
gomihgy | 5:1730064b94bd | 127 | { |
gomihgy | 5:1730064b94bd | 128 | // Do Nothing. |
gomihgy | 5:1730064b94bd | 129 | } |
gomihgy | 5:1730064b94bd | 130 | |
gomihgy | 5:1730064b94bd | 131 | void BLEDataReadCallback(const GattCharacteristicReadCBParams *params) |
gomihgy | 5:1730064b94bd | 132 | { |
gomihgy | 5:1730064b94bd | 133 | // Do Nothing. |
gomihgy | 5:1730064b94bd | 134 | } |
gomihgy | 5:1730064b94bd | 135 | |
gomihgy | 5:1730064b94bd | 136 | void BLERadioNotificationCallback(bool radio_active) |
gomihgy | 5:1730064b94bd | 137 | { |
gomihgy | 5:1730064b94bd | 138 | if (radio_active == false) |
gomihgy | 5:1730064b94bd | 139 | { |
gomihgy | 5:1730064b94bd | 140 | // Do Nothing. |
gomihgy | 5:1730064b94bd | 141 | } |
gomihgy | 5:1730064b94bd | 142 | } |
gomihgy | 5:1730064b94bd | 143 | |
gomihgy | 5:1730064b94bd | 144 | void BleInitialize(void){ |
gomihgy | 5:1730064b94bd | 145 | |
gomihgy | 5:1730064b94bd | 146 | // Initialize |
gomihgy | 5:1730064b94bd | 147 | ble.init(); |
gomihgy | 5:1730064b94bd | 148 | |
gomihgy | 5:1730064b94bd | 149 | // Event Set |
gomihgy | 5:1730064b94bd | 150 | ble.onConnection(&BLEConnectionCallback); |
gomihgy | 5:1730064b94bd | 151 | ble.onDisconnection(&BLEDisconnectionCallback); |
gomihgy | 5:1730064b94bd | 152 | //ble.onDataWritten(&BLEDataWrittenCallback); |
gomihgy | 5:1730064b94bd | 153 | //ble.onDataRead(&BLEDataReadCallback); |
gomihgy | 5:1730064b94bd | 154 | ble.onRadioNotification(&BLERadioNotificationCallback); |
gomihgy | 5:1730064b94bd | 155 | |
gomihgy | 5:1730064b94bd | 156 | ble.getPreferredConnectionParams(&connectionParams); |
gomihgy | 5:1730064b94bd | 157 | connectionParams.minConnectionInterval = INTERVAL_1SEC; |
gomihgy | 5:1730064b94bd | 158 | connectionParams.maxConnectionInterval = INTERVAL_1SEC; |
gomihgy | 5:1730064b94bd | 159 | ble.setPreferredConnectionParams(&connectionParams); |
gomihgy | 5:1730064b94bd | 160 | |
gomihgy | 5:1730064b94bd | 161 | ble.setTxPower(BLE_TXPOWER_4DBM); |
gomihgy | 5:1730064b94bd | 162 | ble.accumulateAdvertisingPayload((GapAdvertisingData::Flags)(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED)); |
gomihgy | 5:1730064b94bd | 163 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
gomihgy | 5:1730064b94bd | 164 | (const uint8_t *)DEVICE_NAME, |
gomihgy | 5:1730064b94bd | 165 | strlen(DEVICE_NAME)); |
gomihgy | 5:1730064b94bd | 166 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
gomihgy | 5:1730064b94bd | 167 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,(uint8_t *)uuid16_list, sizeof(uuid16_list)); |
gomihgy | 5:1730064b94bd | 168 | |
gomihgy | 5:1730064b94bd | 169 | ble.setAdvertisingInterval(INTERVAL_1SEC); |
gomihgy | 5:1730064b94bd | 170 | ble.setAdvertisingTimeout(ADV_TIMEOUT); /* 0 is disable the advertising timeout. */ |
gomihgy | 5:1730064b94bd | 171 | |
gomihgy | 5:1730064b94bd | 172 | ble.addService(WMS); |
gomihgy | 5:1730064b94bd | 173 | ble.addService(DIS); |
gomihgy | 5:1730064b94bd | 174 | } |
gomihgy | 5:1730064b94bd | 175 | |
akita11 | 0:08c8325a21ec | 176 | int main() |
akita11 | 0:08c8325a21ec | 177 | { |
gomihgy | 5:1730064b94bd | 178 | BleInitialize(); |
gomihgy | 5:1730064b94bd | 179 | |
gomihgy | 5:1730064b94bd | 180 | #ifdef UART_DEBUG |
gomihgy | 5:1730064b94bd | 181 | pc.baud(UART_BAUD_RATE); |
gomihgy | 5:1730064b94bd | 182 | #endif |
gomihgy | 5:1730064b94bd | 183 | |
akita11 | 4:edd6e262de9e | 184 | tk.attach(&ticker_1s, 0.1); |
gomihgy | 5:1730064b94bd | 185 | |
gomihgy | 5:1730064b94bd | 186 | ble.startAdvertising(); |
akita11 | 4:edd6e262de9e | 187 | // io.calibrate_weight(); // initial calibration |
akita11 | 0:08c8325a21ec | 188 | while(1){ |
akita11 | 4:edd6e262de9e | 189 | io.display(1); |
akita11 | 4:edd6e262de9e | 190 | for (int i = 0; i < 50; i++){ |
akita11 | 4:edd6e262de9e | 191 | io.display_value = (uint16_t)(io.get_weight() * 9999.0); // dummy display |
akita11 | 4:edd6e262de9e | 192 | wait(0.1); |
akita11 | 4:edd6e262de9e | 193 | } |
akita11 | 4:edd6e262de9e | 194 | io.display(0.3); |
akita11 | 4:edd6e262de9e | 195 | for (int i = 0; i < 50; i++){ |
akita11 | 4:edd6e262de9e | 196 | io.display_value = (int)(io.get_x() * 9900 + io.get_y() * 99); // test: display joystick XY value |
akita11 | 4:edd6e262de9e | 197 | wait(0.1); |
akita11 | 4:edd6e262de9e | 198 | } |
akita11 | 4:edd6e262de9e | 199 | // io.display_value = (uint16_t)(io.get_weight() * 9999.0); // dummy display |
akita11 | 4:edd6e262de9e | 200 | // wait(0.1); |
akita11 | 4:edd6e262de9e | 201 | // for (float i = 0; i < 1.0; i+=0.05){ |
akita11 | 4:edd6e262de9e | 202 | // if (i <0.5) io.display(1.0-i); |
akita11 | 4:edd6e262de9e | 203 | // else io.display(i); // change display brightneess |
akita11 | 4:edd6e262de9e | 204 | // wait(0.1); |
akita11 | 4:edd6e262de9e | 205 | // io.display_value = (uint16_t)(io.get_weight() * 9999.0); // dummy display |
akita11 | 4:edd6e262de9e | 206 | // } |
akita11 | 0:08c8325a21ec | 207 | } |
akita11 | 0:08c8325a21ec | 208 | } |
akita11 | 0:08c8325a21ec | 209 |