test

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

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?

UserRevisionLine numberNew 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