test
Dependencies: BLE_API nRF51822 mbed
Fork of KS7 by
main.cpp@15:544e0ce3c1d9, 2015-12-17 (annotated)
- Committer:
- gomihgy
- Date:
- Thu Dec 17 04:12:30 2015 +0000
- Revision:
- 15:544e0ce3c1d9
- Parent:
- 14:81347f8f0bda
- Child:
- 16:fc66feb533d0
v1.00.005; Fixed stability problems with timer
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 | 12:880400fa5c44 | 3 | #include "BLE.h" |
gomihgy | 9:a7bd5ae66d6d | 4 | #include "common.h" |
akita11 | 0:08c8325a21ec | 5 | |
gomihgy | 6:bc960e6fd1ed | 6 | // BLE |
gomihgy | 6:bc960e6fd1ed | 7 | #define INTERVAL_500MSEC (500UL) |
gomihgy | 6:bc960e6fd1ed | 8 | #define CONNTIMEOUT_3000MSEC (3000UL) |
gomihgy | 5:1730064b94bd | 9 | #define ADV_TIMEOUT (0) |
gomihgy | 5:1730064b94bd | 10 | #define DEVICE_NAME "Kitchen Scale" |
gomihgy | 5:1730064b94bd | 11 | #define BLE_TXPOWER_4DBM (4) |
gomihgy | 5:1730064b94bd | 12 | |
gomihgy | 5:1730064b94bd | 13 | // Device Information Service (DIS) (20 character limit) |
gomihgy | 5:1730064b94bd | 14 | // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml |
gomihgy | 6:bc960e6fd1ed | 15 | #define MANUFACTURER_NAME_STRING "Hacarus" // Manufacturer Name String - shall represent the name of the manufacturer of the device. |
gomihgy | 6:bc960e6fd1ed | 16 | #define MODEL_NUMBER_STRING "0001" // Model Number String - shall represent the model number that is assigned by the device vendor. |
gomihgy | 6:bc960e6fd1ed | 17 | #define SERIAL_NUMBER_STRING "000780c0ffeef00d" // Serial Number String - shall represent the serial number for a particular instance of the device. |
gomihgy | 15:544e0ce3c1d9 | 18 | #define FIRMWARE_REVISION_STRING "v1.00.005@rev0015" // Firmware Revision String - shall represent the firmware revision for the firmware within the device. |
gomihgy | 5:1730064b94bd | 19 | |
gomihgy | 5:1730064b94bd | 20 | // Weight Scale Service (Original) |
gomihgy | 5:1730064b94bd | 21 | #define UUID_WEIGHT_SCALE_SERVICE (0x181D) |
gomihgy | 6:bc960e6fd1ed | 22 | |
gomihgy | 6:bc960e6fd1ed | 23 | // JoyStick |
gomihgy | 7:9ebf125e405f | 24 | #define PUSH_MINTHRESHOLD (0.2) |
gomihgy | 7:9ebf125e405f | 25 | #define PUSH_MAXTHRESHOLD (0.6) |
gomihgy | 14:81347f8f0bda | 26 | #define PUSH_COUNT (3) |
gomihgy | 14:81347f8f0bda | 27 | |
gomihgy | 14:81347f8f0bda | 28 | #define SW_THRESHOLD (0.5) |
gomihgy | 14:81347f8f0bda | 29 | #define SW_SAMPLECOUNT (3) |
gomihgy | 5:1730064b94bd | 30 | |
gomihgy | 6:bc960e6fd1ed | 31 | // Mode |
gomihgy | 6:bc960e6fd1ed | 32 | #define MODE_OFF (0) // LED OFF |
gomihgy | 6:bc960e6fd1ed | 33 | #define MODE_START (1) // LED OFF -> ON |
gomihgy | 6:bc960e6fd1ed | 34 | #define MODE_ON (2) // LED ON |
gomihgy | 6:bc960e6fd1ed | 35 | #define MODE_END (3) // LED ON -> OFF |
gomihgy | 6:bc960e6fd1ed | 36 | |
gomihgy | 6:bc960e6fd1ed | 37 | // Led |
gomihgy | 7:9ebf125e405f | 38 | #define LED_INTERVAL_NSEC (100000) |
gomihgy | 6:bc960e6fd1ed | 39 | #define BRIGHTNESS_ADDVALUE (0.1) |
gomihgy | 7:9ebf125e405f | 40 | #define BRIGHTNESS_MINVALUE (0.0) |
gomihgy | 6:bc960e6fd1ed | 41 | #define BRIGHTNESS_MAXVALUE (1.0) |
gomihgy | 6:bc960e6fd1ed | 42 | |
gomihgy | 6:bc960e6fd1ed | 43 | // Properties |
gomihgy | 6:bc960e6fd1ed | 44 | io io; |
gomihgy | 6:bc960e6fd1ed | 45 | Ticker tk; |
gomihgy | 9:a7bd5ae66d6d | 46 | uint32_t weight_data; |
gomihgy | 9:a7bd5ae66d6d | 47 | float32_t weight = 0.0; |
gomihgy | 6:bc960e6fd1ed | 48 | uint32_t scale = 0; |
gomihgy | 6:bc960e6fd1ed | 49 | int update_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 50 | int push_counter = 0; |
gomihgy | 14:81347f8f0bda | 51 | float sw_data[SW_SAMPLECOUNT]; |
gomihgy | 14:81347f8f0bda | 52 | uint8_t sw_count = 0; |
gomihgy | 6:bc960e6fd1ed | 53 | int led_mode = MODE_OFF; |
gomihgy | 6:bc960e6fd1ed | 54 | float led_brightness = BRIGHTNESS_MINVALUE; |
akita11 | 4:edd6e262de9e | 55 | |
gomihgy | 14:81347f8f0bda | 56 | Timer t; |
gomihgy | 14:81347f8f0bda | 57 | |
akita11 | 10:95c1e5a218d5 | 58 | // UART for debug |
akita11 | 10:95c1e5a218d5 | 59 | |
akita11 | 10:95c1e5a218d5 | 60 | #ifdef UART_DEBUG |
akita11 | 10:95c1e5a218d5 | 61 | Serial pc(P0_9, P0_8);// TX=P0_9 |
akita11 | 10:95c1e5a218d5 | 62 | #define UART_BAUD_RATE (9600UL) |
akita11 | 10:95c1e5a218d5 | 63 | #define DEBUG(...) { pc.printf(__VA_ARGS__); } |
akita11 | 10:95c1e5a218d5 | 64 | #else |
akita11 | 10:95c1e5a218d5 | 65 | #define DEBUG(...) {} |
akita11 | 10:95c1e5a218d5 | 66 | #endif |
akita11 | 10:95c1e5a218d5 | 67 | |
gomihgy | 6:bc960e6fd1ed | 68 | // BLE |
gomihgy | 12:880400fa5c44 | 69 | BLE ble; |
gomihgy | 5:1730064b94bd | 70 | Gap::ConnectionParams_t connectionParams; |
gomihgy | 5:1730064b94bd | 71 | |
gomihgy | 5:1730064b94bd | 72 | /* Complete list of 16-bit Service IDs */ |
gomihgy | 6:bc960e6fd1ed | 73 | uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE}; |
gomihgy | 5:1730064b94bd | 74 | |
gomihgy | 5:1730064b94bd | 75 | /* Weight Scale Service */ |
gomihgy | 6:bc960e6fd1ed | 76 | 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 | 9:a7bd5ae66d6d | 77 | GattCharacteristic WeightMeasurement (UUID(UUID_HACARUS_WEIGHT_CHAR), (uint8_t *)&weight_data, sizeof(weight_data), sizeof(weight_data), |
gomihgy | 6:bc960e6fd1ed | 78 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE); |
gomihgy | 6:bc960e6fd1ed | 79 | 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 | 80 | GattCharacteristic WeightScale (UUID(UUID_HACARUS_SCALE_CHAR), (uint8_t *)&scale, sizeof(scale), sizeof(scale), |
gomihgy | 6:bc960e6fd1ed | 81 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
gomihgy | 6:bc960e6fd1ed | 82 | GattCharacteristic *Chars[] = {&WeightMeasurement,&WeightScale}; |
gomihgy | 6:bc960e6fd1ed | 83 | 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 | 84 | GattService HWS = GattService(UUID(UUID_HACARUS_WEIGHT_SERVICE), Chars, sizeof(Chars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 85 | |
gomihgy | 5:1730064b94bd | 86 | /* Device Information Service */ |
gomihgy | 5:1730064b94bd | 87 | 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 | 88 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 89 | 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 | 90 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 6:bc960e6fd1ed | 91 | 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 | 92 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 5:1730064b94bd | 93 | 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 | 94 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
gomihgy | 6:bc960e6fd1ed | 95 | GattCharacteristic *DISChars[] = {&ManuName, &ModelNum, &SerialNum, &FWVersion}; |
gomihgy | 5:1730064b94bd | 96 | GattService DIS(GattService::UUID_DEVICE_INFORMATION_SERVICE , DISChars, sizeof(DISChars) / sizeof(GattCharacteristic *)); |
gomihgy | 5:1730064b94bd | 97 | |
gomihgy | 7:9ebf125e405f | 98 | /* to confirm joystick */ |
gomihgy | 7:9ebf125e405f | 99 | bool check_joystick(){ |
gomihgy | 14:81347f8f0bda | 100 | float sum_data = 0; |
gomihgy | 6:bc960e6fd1ed | 101 | |
gomihgy | 14:81347f8f0bda | 102 | // ジョイスティックXのADC値(0〜1.0換算)が0.5以上ならON、0.5未満ならOFF |
gomihgy | 14:81347f8f0bda | 103 | sw_data[sw_count] = io.get_x(); |
gomihgy | 14:81347f8f0bda | 104 | |
gomihgy | 14:81347f8f0bda | 105 | if(++sw_count >= SW_SAMPLECOUNT){ |
gomihgy | 14:81347f8f0bda | 106 | sw_count = 0; |
gomihgy | 7:9ebf125e405f | 107 | } |
gomihgy | 7:9ebf125e405f | 108 | |
gomihgy | 14:81347f8f0bda | 109 | for(int count = 0;count < SW_SAMPLECOUNT;count++){ |
gomihgy | 14:81347f8f0bda | 110 | sum_data += sw_data[count]; |
akita11 | 0:08c8325a21ec | 111 | } |
gomihgy | 6:bc960e6fd1ed | 112 | |
gomihgy | 14:81347f8f0bda | 113 | return ((sum_data / SW_SAMPLECOUNT) >= SW_THRESHOLD); |
gomihgy | 7:9ebf125e405f | 114 | } |
gomihgy | 7:9ebf125e405f | 115 | |
gomihgy | 9:a7bd5ae66d6d | 116 | uint32_t quick_ieee11073_from_float(float data) |
gomihgy | 9:a7bd5ae66d6d | 117 | { |
gomihgy | 9:a7bd5ae66d6d | 118 | uint8_t exponent = 0xFE; //exponent is -2 |
gomihgy | 9:a7bd5ae66d6d | 119 | uint32_t mantissa = (uint32_t)(data*100); |
gomihgy | 9:a7bd5ae66d6d | 120 | |
gomihgy | 9:a7bd5ae66d6d | 121 | return ( ((uint32_t)exponent) << 24) | mantissa; |
gomihgy | 9:a7bd5ae66d6d | 122 | } |
gomihgy | 9:a7bd5ae66d6d | 123 | |
gomihgy | 7:9ebf125e405f | 124 | void ticker_callback() |
gomihgy | 7:9ebf125e405f | 125 | { |
akita11 | 10:95c1e5a218d5 | 126 | |
akita11 | 10:95c1e5a218d5 | 127 | // pc.printf("!!!\r\n"); |
akita11 | 10:95c1e5a218d5 | 128 | /* |
akita11 | 10:95c1e5a218d5 | 129 | while(1){ |
akita11 | 10:95c1e5a218d5 | 130 | adc_dat[0] = 0x01; // config reg. |
akita11 | 10:95c1e5a218d5 | 131 | // adc_dat[1] = 0xc4 | (ch << 4); // single conv. & FS=+-2.048V & conv. |
akita11 | 10:95c1e5a218d5 | 132 | adc_dat[1] = 0xc4; |
akita11 | 10:95c1e5a218d5 | 133 | adc_dat[2] = 0x83; // 8SPS & disable comp. |
akita11 | 10:95c1e5a218d5 | 134 | pc.printf("adc_dat: %02x %02x\r\n", adc_dat[0], adc_dat[1]); |
akita11 | 10:95c1e5a218d5 | 135 | // i2c.write(I2C_ADDR_ADS1115, adc_dat, 3); |
akita11 | 10:95c1e5a218d5 | 136 | adc_dat[0] = 0x00; |
akita11 | 10:95c1e5a218d5 | 137 | // i2c.write(I2C_ADDR_ADS1115, adc_dat, 1); |
akita11 | 10:95c1e5a218d5 | 138 | // i2c.read(I2C_ADDR_ADS1115, adc_dat, 2); |
akita11 | 10:95c1e5a218d5 | 139 | uint8_t dh, dl; |
akita11 | 10:95c1e5a218d5 | 140 | dh = adc_dat[0]; |
akita11 | 10:95c1e5a218d5 | 141 | dl = adc_dat[1]; |
akita11 | 10:95c1e5a218d5 | 142 | pc.printf("%d %d\r\n", dh, dl); |
akita11 | 10:95c1e5a218d5 | 143 | // pc.printf("ADC result=%02x %02x\r\n", dh, dl); |
akita11 | 10:95c1e5a218d5 | 144 | } |
akita11 | 10:95c1e5a218d5 | 145 | */ |
akita11 | 10:95c1e5a218d5 | 146 | |
gomihgy | 6:bc960e6fd1ed | 147 | switch(led_mode){ |
gomihgy | 6:bc960e6fd1ed | 148 | case MODE_OFF: |
gomihgy | 14:81347f8f0bda | 149 | if(check_joystick()){ |
gomihgy | 14:81347f8f0bda | 150 | // io.display_value = 0; |
gomihgy | 6:bc960e6fd1ed | 151 | led_mode = MODE_START; |
gomihgy | 14:81347f8f0bda | 152 | } |
gomihgy | 6:bc960e6fd1ed | 153 | break; |
gomihgy | 6:bc960e6fd1ed | 154 | case MODE_START: |
gomihgy | 6:bc960e6fd1ed | 155 | led_brightness += BRIGHTNESS_ADDVALUE; |
gomihgy | 12:880400fa5c44 | 156 | io.display(led_brightness); |
gomihgy | 6:bc960e6fd1ed | 157 | if(led_brightness >= BRIGHTNESS_MAXVALUE){ |
gomihgy | 14:81347f8f0bda | 158 | update_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 159 | led_mode = MODE_ON; |
gomihgy | 6:bc960e6fd1ed | 160 | ble.startAdvertising(); |
gomihgy | 6:bc960e6fd1ed | 161 | } |
gomihgy | 6:bc960e6fd1ed | 162 | break; |
gomihgy | 6:bc960e6fd1ed | 163 | case MODE_ON: |
gomihgy | 14:81347f8f0bda | 164 | if(!check_joystick()){ |
gomihgy | 8:32be16b1eaf2 | 165 | led_mode = MODE_END; |
gomihgy | 6:bc960e6fd1ed | 166 | if(ble.getGapState().connected){ |
gomihgy | 6:bc960e6fd1ed | 167 | ble.disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION); |
gomihgy | 8:32be16b1eaf2 | 168 | }else{ |
gomihgy | 8:32be16b1eaf2 | 169 | ble.stopAdvertising(); |
gomihgy | 6:bc960e6fd1ed | 170 | } |
gomihgy | 14:81347f8f0bda | 171 | return; |
gomihgy | 14:81347f8f0bda | 172 | } |
gomihgy | 14:81347f8f0bda | 173 | //io.analog_pow(1); // turn analog power on |
gomihgy | 14:81347f8f0bda | 174 | //wait_ms(1); |
gomihgy | 14:81347f8f0bda | 175 | weight = io.get_weight() * 9999.0; |
gomihgy | 14:81347f8f0bda | 176 | io.display_value = (uint16_t)weight; // dummy display |
gomihgy | 14:81347f8f0bda | 177 | //io.analog_pow(0); // turn analog power off |
gomihgy | 14:81347f8f0bda | 178 | |
gomihgy | 14:81347f8f0bda | 179 | if(++update_counter >= 5){ |
gomihgy | 14:81347f8f0bda | 180 | weight_data = quick_ieee11073_from_float(weight); |
gomihgy | 14:81347f8f0bda | 181 | ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(), |
gomihgy | 14:81347f8f0bda | 182 | (uint8_t *)&weight_data, |
gomihgy | 14:81347f8f0bda | 183 | sizeof(weight_data)); |
gomihgy | 6:bc960e6fd1ed | 184 | update_counter = 0; |
gomihgy | 6:bc960e6fd1ed | 185 | } |
gomihgy | 14:81347f8f0bda | 186 | |
gomihgy | 6:bc960e6fd1ed | 187 | break; |
gomihgy | 6:bc960e6fd1ed | 188 | case MODE_END: |
gomihgy | 6:bc960e6fd1ed | 189 | led_brightness -= BRIGHTNESS_ADDVALUE; |
gomihgy | 12:880400fa5c44 | 190 | io.display(led_brightness); |
gomihgy | 6:bc960e6fd1ed | 191 | if(led_brightness <= BRIGHTNESS_MINVALUE){ |
gomihgy | 6:bc960e6fd1ed | 192 | led_mode = MODE_OFF; |
gomihgy | 6:bc960e6fd1ed | 193 | } |
gomihgy | 6:bc960e6fd1ed | 194 | break; |
akita11 | 0:08c8325a21ec | 195 | } |
akita11 | 0:08c8325a21ec | 196 | } |
akita11 | 0:08c8325a21ec | 197 | |
gomihgy | 5:1730064b94bd | 198 | /* |
gomihgy | 5:1730064b94bd | 199 | * BLE CallBacks |
gomihgy | 5:1730064b94bd | 200 | */ |
gomihgy | 12:880400fa5c44 | 201 | void BLEConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
gomihgy | 5:1730064b94bd | 202 | { |
gomihgy | 12:880400fa5c44 | 203 | ble.updateConnectionParams(params->handle, params->connectionParams); |
gomihgy | 5:1730064b94bd | 204 | } |
gomihgy | 5:1730064b94bd | 205 | |
gomihgy | 12:880400fa5c44 | 206 | void BLEDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
gomihgy | 5:1730064b94bd | 207 | { |
gomihgy | 6:bc960e6fd1ed | 208 | if(led_mode == MODE_ON){ |
gomihgy | 6:bc960e6fd1ed | 209 | ble.startAdvertising(); |
gomihgy | 5:1730064b94bd | 210 | } |
gomihgy | 5:1730064b94bd | 211 | } |
gomihgy | 5:1730064b94bd | 212 | |
gomihgy | 12:880400fa5c44 | 213 | void BLERadioNotificationCallback(bool radio_active) |
gomihgy | 12:880400fa5c44 | 214 | { |
gomihgy | 12:880400fa5c44 | 215 | if (radio_active == false) |
gomihgy | 12:880400fa5c44 | 216 | { |
gomihgy | 12:880400fa5c44 | 217 | if(led_mode == MODE_ON){ |
gomihgy | 12:880400fa5c44 | 218 | } |
gomihgy | 12:880400fa5c44 | 219 | } |
gomihgy | 12:880400fa5c44 | 220 | } |
gomihgy | 12:880400fa5c44 | 221 | |
gomihgy | 5:1730064b94bd | 222 | void BleInitialize(void){ |
gomihgy | 5:1730064b94bd | 223 | |
gomihgy | 6:bc960e6fd1ed | 224 | uint8_t advertiseServiceID[16]; |
gomihgy | 6:bc960e6fd1ed | 225 | |
gomihgy | 5:1730064b94bd | 226 | // Initialize |
gomihgy | 5:1730064b94bd | 227 | ble.init(); |
gomihgy | 5:1730064b94bd | 228 | |
gomihgy | 5:1730064b94bd | 229 | // Event Set |
gomihgy | 5:1730064b94bd | 230 | ble.onConnection(&BLEConnectionCallback); |
gomihgy | 5:1730064b94bd | 231 | ble.onDisconnection(&BLEDisconnectionCallback); |
gomihgy | 12:880400fa5c44 | 232 | ble.onRadioNotification(&BLERadioNotificationCallback); |
gomihgy | 5:1730064b94bd | 233 | |
gomihgy | 5:1730064b94bd | 234 | ble.getPreferredConnectionParams(&connectionParams); |
gomihgy | 6:bc960e6fd1ed | 235 | connectionParams.maxConnectionInterval = INTERVAL_500MSEC; |
gomihgy | 6:bc960e6fd1ed | 236 | connectionParams.minConnectionInterval = INTERVAL_500MSEC; |
gomihgy | 6:bc960e6fd1ed | 237 | connectionParams.connectionSupervisionTimeout = CONNTIMEOUT_3000MSEC; |
gomihgy | 6:bc960e6fd1ed | 238 | connectionParams.slaveLatency = 2; |
gomihgy | 5:1730064b94bd | 239 | ble.setPreferredConnectionParams(&connectionParams); |
gomihgy | 5:1730064b94bd | 240 | |
gomihgy | 5:1730064b94bd | 241 | ble.setTxPower(BLE_TXPOWER_4DBM); |
gomihgy | 6:bc960e6fd1ed | 242 | |
gomihgy | 6:bc960e6fd1ed | 243 | for(int i=0; i<16; i++){ |
gomihgy | 6:bc960e6fd1ed | 244 | advertiseServiceID[i] = UUID_HACARUS_WEIGHT_SERVICE[16 - 1 - i]; |
gomihgy | 6:bc960e6fd1ed | 245 | } |
gomihgy | 6:bc960e6fd1ed | 246 | |
gomihgy | 5:1730064b94bd | 247 | ble.accumulateAdvertisingPayload((GapAdvertisingData::Flags)(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED)); |
gomihgy | 5:1730064b94bd | 248 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
gomihgy | 5:1730064b94bd | 249 | (const uint8_t *)DEVICE_NAME, |
gomihgy | 5:1730064b94bd | 250 | strlen(DEVICE_NAME)); |
gomihgy | 5:1730064b94bd | 251 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
gomihgy | 6:bc960e6fd1ed | 252 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
gomihgy | 6:bc960e6fd1ed | 253 | (const uint8_t *)advertiseServiceID, sizeof(advertiseServiceID)); |
gomihgy | 6:bc960e6fd1ed | 254 | |
gomihgy | 12:880400fa5c44 | 255 | ble.setAdvertisingInterval(INTERVAL_500MSEC); |
gomihgy | 5:1730064b94bd | 256 | ble.setAdvertisingTimeout(ADV_TIMEOUT); /* 0 is disable the advertising timeout. */ |
gomihgy | 5:1730064b94bd | 257 | |
gomihgy | 6:bc960e6fd1ed | 258 | ble.addService(HWS); |
gomihgy | 5:1730064b94bd | 259 | ble.addService(DIS); |
gomihgy | 5:1730064b94bd | 260 | } |
gomihgy | 5:1730064b94bd | 261 | |
akita11 | 0:08c8325a21ec | 262 | int main() |
akita11 | 0:08c8325a21ec | 263 | { |
gomihgy | 5:1730064b94bd | 264 | #ifdef UART_DEBUG |
gomihgy | 5:1730064b94bd | 265 | pc.baud(UART_BAUD_RATE); |
gomihgy | 5:1730064b94bd | 266 | #endif |
akita11 | 10:95c1e5a218d5 | 267 | #ifndef PCB_VER1 |
akita11 | 10:95c1e5a218d5 | 268 | // set XTAL=32MHz for TaiyoYuden's module |
akita11 | 11:be439189e3f7 | 269 | // is moved to mbed-src/targets/cmsis/TARGET_NORDIC/TARGET_MCU_NRF51822/system_nrf51.c |
akita11 | 11:be439189e3f7 | 270 | DEBUG("UICR->XTALFREQ=%x\r\n", NRF_UICR->XTALFREQ); // this should be 0xffffff00, not 0xffffffff |
akita11 | 10:95c1e5a218d5 | 271 | #endif |
akita11 | 10:95c1e5a218d5 | 272 | |
akita11 | 10:95c1e5a218d5 | 273 | BleInitialize(); |
gomihgy | 5:1730064b94bd | 274 | |
gomihgy | 14:81347f8f0bda | 275 | // SW Initialize |
gomihgy | 14:81347f8f0bda | 276 | for(int count = 0;count < SW_SAMPLECOUNT;count++){ |
gomihgy | 14:81347f8f0bda | 277 | sw_data[count] = 0; |
gomihgy | 14:81347f8f0bda | 278 | } |
gomihgy | 14:81347f8f0bda | 279 | |
gomihgy | 14:81347f8f0bda | 280 | |
akita11 | 10:95c1e5a218d5 | 281 | /* |
gomihgy | 14:81347f8f0bda | 282 | //tk.attach_us(&ticker_callback, LED_INTERVAL_NSEC); |
gomihgy | 12:880400fa5c44 | 283 | if(NRF_UICR->XTALFREQ == 0xFFFFFF00){ |
gomihgy | 12:880400fa5c44 | 284 | io.display_value = 3232; |
gomihgy | 12:880400fa5c44 | 285 | }else if(NRF_UICR->XTALFREQ == 0xFFFFFFFF){ |
gomihgy | 12:880400fa5c44 | 286 | io.display_value = 1616; |
gomihgy | 12:880400fa5c44 | 287 | } |
gomihgy | 14:81347f8f0bda | 288 | */ |
gomihgy | 12:880400fa5c44 | 289 | |
akita11 | 11:be439189e3f7 | 290 | io.analog_pow(1); |
gomihgy | 14:81347f8f0bda | 291 | |
gomihgy | 6:bc960e6fd1ed | 292 | for (;; ) { |
gomihgy | 14:81347f8f0bda | 293 | // 100msec waitForEvent |
gomihgy | 14:81347f8f0bda | 294 | t.reset(); |
gomihgy | 14:81347f8f0bda | 295 | t.start(); |
gomihgy | 14:81347f8f0bda | 296 | while(t.read_ms() < 100){ |
gomihgy | 14:81347f8f0bda | 297 | ble.waitForEvent(); |
gomihgy | 14:81347f8f0bda | 298 | } |
gomihgy | 15:544e0ce3c1d9 | 299 | t.stop(); |
gomihgy | 14:81347f8f0bda | 300 | |
gomihgy | 14:81347f8f0bda | 301 | // ticker処理 |
gomihgy | 14:81347f8f0bda | 302 | switch(led_mode){ |
gomihgy | 14:81347f8f0bda | 303 | case MODE_OFF: |
gomihgy | 14:81347f8f0bda | 304 | if(check_joystick()){ |
gomihgy | 14:81347f8f0bda | 305 | led_mode = MODE_START; |
gomihgy | 14:81347f8f0bda | 306 | } |
gomihgy | 14:81347f8f0bda | 307 | break; |
gomihgy | 14:81347f8f0bda | 308 | case MODE_START: |
gomihgy | 14:81347f8f0bda | 309 | led_brightness += BRIGHTNESS_ADDVALUE; |
gomihgy | 14:81347f8f0bda | 310 | io.display(led_brightness); |
gomihgy | 14:81347f8f0bda | 311 | if(led_brightness >= BRIGHTNESS_MAXVALUE){ |
gomihgy | 14:81347f8f0bda | 312 | update_counter = 0; |
gomihgy | 14:81347f8f0bda | 313 | led_mode = MODE_ON; |
gomihgy | 14:81347f8f0bda | 314 | ble.startAdvertising(); |
gomihgy | 14:81347f8f0bda | 315 | } |
gomihgy | 14:81347f8f0bda | 316 | break; |
gomihgy | 14:81347f8f0bda | 317 | case MODE_ON: |
gomihgy | 14:81347f8f0bda | 318 | if(!check_joystick()){ |
gomihgy | 14:81347f8f0bda | 319 | led_mode = MODE_END; |
gomihgy | 14:81347f8f0bda | 320 | if(ble.getGapState().connected){ |
gomihgy | 14:81347f8f0bda | 321 | ble.disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION); |
gomihgy | 14:81347f8f0bda | 322 | }else{ |
gomihgy | 14:81347f8f0bda | 323 | ble.stopAdvertising(); |
gomihgy | 14:81347f8f0bda | 324 | } |
gomihgy | 14:81347f8f0bda | 325 | }else{ |
gomihgy | 14:81347f8f0bda | 326 | weight = io.get_weight() * 9999.0; |
gomihgy | 14:81347f8f0bda | 327 | io.display_value = (uint16_t)weight; // dummy display |
gomihgy | 14:81347f8f0bda | 328 | if(++update_counter >= 5){ |
gomihgy | 14:81347f8f0bda | 329 | weight_data = quick_ieee11073_from_float(weight); |
gomihgy | 14:81347f8f0bda | 330 | ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(), |
gomihgy | 14:81347f8f0bda | 331 | (uint8_t *)&weight_data, |
gomihgy | 14:81347f8f0bda | 332 | sizeof(weight_data)); |
gomihgy | 14:81347f8f0bda | 333 | update_counter = 0; |
gomihgy | 14:81347f8f0bda | 334 | } |
gomihgy | 14:81347f8f0bda | 335 | } |
gomihgy | 14:81347f8f0bda | 336 | break; |
gomihgy | 14:81347f8f0bda | 337 | case MODE_END: |
gomihgy | 14:81347f8f0bda | 338 | led_brightness -= BRIGHTNESS_ADDVALUE; |
gomihgy | 14:81347f8f0bda | 339 | io.display(led_brightness); |
gomihgy | 14:81347f8f0bda | 340 | if(led_brightness <= BRIGHTNESS_MINVALUE){ |
gomihgy | 14:81347f8f0bda | 341 | led_mode = MODE_OFF; |
gomihgy | 14:81347f8f0bda | 342 | } |
gomihgy | 14:81347f8f0bda | 343 | break; |
gomihgy | 14:81347f8f0bda | 344 | } |
akita11 | 0:08c8325a21ec | 345 | } |
akita11 | 0:08c8325a21ec | 346 | } |
gomihgy | 6:bc960e6fd1ed | 347 | |
akita11 | 0:08c8325a21ec | 348 |