test

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

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?

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