test

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

Committer:
gomihgy
Date:
Tue Mar 22 09:22:51 2016 +0000
Branch:
KS3
Revision:
23:ca1806081f0c
Parent:
21:ab5b55d1947d
Child:
24:c6ef55535900
v1.00.009 add DFUService

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 12:880400fa5c44 3 #include "BLE.h"
gomihgy 23:ca1806081f0c 4 #include "DFUService.h"
gomihgy 9:a7bd5ae66d6d 5 #include "common.h"
akita11 19:05526fe9365e 6 #include <stdlib.h>
akita11 0:08c8325a21ec 7
gomihgy 6:bc960e6fd1ed 8 // BLE
gomihgy 6:bc960e6fd1ed 9 #define INTERVAL_500MSEC (500UL)
gomihgy 6:bc960e6fd1ed 10 #define CONNTIMEOUT_3000MSEC (3000UL)
gomihgy 5:1730064b94bd 11 #define ADV_TIMEOUT (0)
gomihgy 5:1730064b94bd 12 #define DEVICE_NAME "Kitchen Scale"
gomihgy 5:1730064b94bd 13 #define BLE_TXPOWER_4DBM (4)
gomihgy 5:1730064b94bd 14
gomihgy 5:1730064b94bd 15 // Device Information Service (DIS) (20 character limit)
gomihgy 5:1730064b94bd 16 // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml
gomihgy 6:bc960e6fd1ed 17 #define MANUFACTURER_NAME_STRING "Hacarus" // Manufacturer Name String - shall represent the name of the manufacturer of the device.
gomihgy 6:bc960e6fd1ed 18 #define MODEL_NUMBER_STRING "0001" // Model Number String - shall represent the model number that is assigned by the device vendor.
gomihgy 6:bc960e6fd1ed 19 #define SERIAL_NUMBER_STRING "000780c0ffeef00d" // Serial Number String - shall represent the serial number for a particular instance of the device.
gomihgy 23:ca1806081f0c 20 #define FIRMWARE_REVISION_STRING "v1.00.009@rev0023" // Firmware Revision String - shall represent the firmware revision for the firmware within the device.
gomihgy 5:1730064b94bd 21
gomihgy 5:1730064b94bd 22 // Weight Scale Service (Original)
gomihgy 5:1730064b94bd 23 #define UUID_WEIGHT_SCALE_SERVICE (0x181D)
gomihgy 6:bc960e6fd1ed 24
akita11 20:c3fadeef5842 25 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 26 // Switch
gomihgy 14:81347f8f0bda 27 #define SW_THRESHOLD (0.5)
gomihgy 14:81347f8f0bda 28 #define SW_SAMPLECOUNT (3)
akita11 20:c3fadeef5842 29 #endif
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 16:fc66feb533d0 38 #define LED_INTERVAL_MSEC (100)
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 9:a7bd5ae66d6d 45 uint32_t weight_data;
gomihgy 9:a7bd5ae66d6d 46 float32_t weight = 0.0;
gomihgy 6:bc960e6fd1ed 47 uint32_t scale = 0;
gomihgy 6:bc960e6fd1ed 48 int update_counter = 0;
akita11 20:c3fadeef5842 49 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 14:81347f8f0bda 50 float sw_data[SW_SAMPLECOUNT];
gomihgy 14:81347f8f0bda 51 uint8_t sw_count = 0;
akita11 20:c3fadeef5842 52 #endif
gomihgy 6:bc960e6fd1ed 53 int led_mode = MODE_OFF;
gomihgy 6:bc960e6fd1ed 54 float led_brightness = BRIGHTNESS_MINVALUE;
akita11 4:edd6e262de9e 55
akita11 10:95c1e5a218d5 56 #ifdef UART_DEBUG
akita11 20:c3fadeef5842 57 #if defined(PCB_VER1) || defined(PCB_VER2)
akita11 10:95c1e5a218d5 58 Serial pc(P0_9, P0_8);// TX=P0_9
akita11 20:c3fadeef5842 59 #else
akita11 20:c3fadeef5842 60 Serial pc(P0_9, P0_11);// TX=P0_9
akita11 20:c3fadeef5842 61 #endif
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
akita11 20:c3fadeef5842 68 Timer t;
akita11 20:c3fadeef5842 69
akita11 20:c3fadeef5842 70 // BLE
gomihgy 12:880400fa5c44 71 BLE ble;
gomihgy 5:1730064b94bd 72 Gap::ConnectionParams_t connectionParams;
gomihgy 5:1730064b94bd 73
gomihgy 5:1730064b94bd 74 /* Complete list of 16-bit Service IDs */
gomihgy 6:bc960e6fd1ed 75 uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE};
gomihgy 5:1730064b94bd 76
gomihgy 5:1730064b94bd 77 /* Weight Scale Service */
gomihgy 6:bc960e6fd1ed 78 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 79 GattCharacteristic WeightMeasurement (UUID(UUID_HACARUS_WEIGHT_CHAR), (uint8_t *)&weight_data, sizeof(weight_data), sizeof(weight_data),
akita11 20:c3fadeef5842 80 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
gomihgy 6:bc960e6fd1ed 81 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 82 GattCharacteristic WeightScale (UUID(UUID_HACARUS_SCALE_CHAR), (uint8_t *)&scale, sizeof(scale), sizeof(scale),
akita11 20:c3fadeef5842 83 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
gomihgy 6:bc960e6fd1ed 84 GattCharacteristic *Chars[] = {&WeightMeasurement,&WeightScale};
gomihgy 6:bc960e6fd1ed 85 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 86 GattService HWS = GattService(UUID(UUID_HACARUS_WEIGHT_SERVICE), Chars, sizeof(Chars) / sizeof(GattCharacteristic *));
gomihgy 5:1730064b94bd 87
gomihgy 5:1730064b94bd 88 /* Device Information Service */
gomihgy 5:1730064b94bd 89 GattCharacteristic ManuName(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, (uint8_t *)&MANUFACTURER_NAME_STRING, sizeof(MANUFACTURER_NAME_STRING) - 1, sizeof(MANUFACTURER_NAME_STRING) - 1,
akita11 20:c3fadeef5842 90 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 5:1730064b94bd 91 GattCharacteristic ModelNum(GattCharacteristic::UUID_MODEL_NUMBER_STRING_CHAR, (uint8_t *)&MODEL_NUMBER_STRING, sizeof(MODEL_NUMBER_STRING) - 1, sizeof(MODEL_NUMBER_STRING) - 1,
akita11 20:c3fadeef5842 92 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 6:bc960e6fd1ed 93 GattCharacteristic SerialNum(GattCharacteristic::UUID_SERIAL_NUMBER_STRING_CHAR, (uint8_t *)&SERIAL_NUMBER_STRING, sizeof(SERIAL_NUMBER_STRING) - 1, sizeof(SERIAL_NUMBER_STRING) - 1,
akita11 20:c3fadeef5842 94 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 5:1730064b94bd 95 GattCharacteristic FWVersion(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)&FIRMWARE_REVISION_STRING, sizeof(FIRMWARE_REVISION_STRING) - 1, sizeof(FIRMWARE_REVISION_STRING) - 1,
akita11 20:c3fadeef5842 96 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 6:bc960e6fd1ed 97 GattCharacteristic *DISChars[] = {&ManuName, &ModelNum, &SerialNum, &FWVersion};
gomihgy 5:1730064b94bd 98 GattService DIS(GattService::UUID_DEVICE_INFORMATION_SERVICE , DISChars, sizeof(DISChars) / sizeof(GattCharacteristic *));
gomihgy 5:1730064b94bd 99
akita11 20:c3fadeef5842 100 #ifdef PCB_VER1
akita11 20:c3fadeef5842 101 bool check_joystick()
akita11 20:c3fadeef5842 102 {
gomihgy 14:81347f8f0bda 103 float sum_data = 0;
akita11 20:c3fadeef5842 104
gomihgy 14:81347f8f0bda 105 sw_data[sw_count] = io.get_x();
akita11 20:c3fadeef5842 106
akita11 20:c3fadeef5842 107 if(++sw_count >= SW_SAMPLECOUNT) {
gomihgy 14:81347f8f0bda 108 sw_count = 0;
gomihgy 7:9ebf125e405f 109 }
akita11 20:c3fadeef5842 110
akita11 20:c3fadeef5842 111 for(int count = 0; count < SW_SAMPLECOUNT; count++) {
gomihgy 14:81347f8f0bda 112 sum_data += sw_data[count];
akita11 0:08c8325a21ec 113 }
akita11 20:c3fadeef5842 114
gomihgy 14:81347f8f0bda 115 return ((sum_data / SW_SAMPLECOUNT) >= SW_THRESHOLD);
gomihgy 7:9ebf125e405f 116 }
akita11 20:c3fadeef5842 117 #endif
gomihgy 7:9ebf125e405f 118
gomihgy 9:a7bd5ae66d6d 119 uint32_t quick_ieee11073_from_float(float data)
gomihgy 9:a7bd5ae66d6d 120 {
gomihgy 9:a7bd5ae66d6d 121 uint8_t exponent = 0xFE; //exponent is -2
gomihgy 9:a7bd5ae66d6d 122 uint32_t mantissa = (uint32_t)(data*100);
akita11 20:c3fadeef5842 123
gomihgy 9:a7bd5ae66d6d 124 return ( ((uint32_t)exponent) << 24) | mantissa;
gomihgy 9:a7bd5ae66d6d 125 }
gomihgy 9:a7bd5ae66d6d 126
akita11 20:c3fadeef5842 127 #if defined(PCB_VER1) || defined(PCB_VER2)
akita11 20:c3fadeef5842 128 void SWInit(void)
akita11 20:c3fadeef5842 129 {
gomihgy 16:fc66feb533d0 130 // SW Initialize
akita11 20:c3fadeef5842 131 for(int count = 0; count < SW_SAMPLECOUNT; count++) {
gomihgy 16:fc66feb533d0 132 sw_data[count] = 0;
gomihgy 16:fc66feb533d0 133 }
gomihgy 16:fc66feb533d0 134 }
akita11 20:c3fadeef5842 135 #endif
akita11 10:95c1e5a218d5 136
akita11 20:c3fadeef5842 137 void AppInit(void)
akita11 20:c3fadeef5842 138 {
akita11 20:c3fadeef5842 139
akita11 20:c3fadeef5842 140 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 141 SWInit();
akita11 20:c3fadeef5842 142 #endif
gomihgy 16:fc66feb533d0 143 io.analog_pow(1);
akita11 20:c3fadeef5842 144
akita11 21:ab5b55d1947d 145 #ifdef PCB_VER3
akita11 21:ab5b55d1947d 146 // check XTALFREQ for TaiyoYuden module in PCB_VER3
akita11 21:ab5b55d1947d 147 /*
akita11 20:c3fadeef5842 148 if(NRF_UICR->XTALFREQ == 0xFFFFFF00){
akita11 20:c3fadeef5842 149 io.display_value = 3232;
akita11 20:c3fadeef5842 150 }else if(NRF_UICR->XTALFREQ == 0xFFFFFFFF){
akita11 20:c3fadeef5842 151 io.display_value = 1616;
akita11 20:c3fadeef5842 152 }
akita11 21:ab5b55d1947d 153 */
akita11 21:ab5b55d1947d 154 #endif
akita11 0:08c8325a21ec 155 }
akita11 0:08c8325a21ec 156
gomihgy 5:1730064b94bd 157 /*
gomihgy 5:1730064b94bd 158 * BLE CallBacks
gomihgy 5:1730064b94bd 159 */
gomihgy 12:880400fa5c44 160 void BLEConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
gomihgy 5:1730064b94bd 161 {
akita11 20:c3fadeef5842 162 ble.updateConnectionParams(params->handle, params->connectionParams);
gomihgy 5:1730064b94bd 163 }
gomihgy 5:1730064b94bd 164
gomihgy 12:880400fa5c44 165 void BLEDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
gomihgy 5:1730064b94bd 166 {
akita11 20:c3fadeef5842 167 if(led_mode == MODE_ON) {
gomihgy 6:bc960e6fd1ed 168 ble.startAdvertising();
gomihgy 5:1730064b94bd 169 }
gomihgy 5:1730064b94bd 170 }
gomihgy 5:1730064b94bd 171
gomihgy 12:880400fa5c44 172 void BLERadioNotificationCallback(bool radio_active)
gomihgy 12:880400fa5c44 173 {
akita11 20:c3fadeef5842 174 if (radio_active == false) {
akita11 20:c3fadeef5842 175 if(led_mode == MODE_ON) {
gomihgy 12:880400fa5c44 176 }
gomihgy 12:880400fa5c44 177 }
gomihgy 12:880400fa5c44 178 }
gomihgy 12:880400fa5c44 179
akita11 20:c3fadeef5842 180 void BleInitialize(void)
akita11 20:c3fadeef5842 181 {
akita11 20:c3fadeef5842 182
gomihgy 6:bc960e6fd1ed 183 uint8_t advertiseServiceID[16];
akita11 20:c3fadeef5842 184
gomihgy 5:1730064b94bd 185 // Initialize
gomihgy 5:1730064b94bd 186 ble.init();
akita11 20:c3fadeef5842 187
gomihgy 5:1730064b94bd 188 // Event Set
gomihgy 5:1730064b94bd 189 ble.onConnection(&BLEConnectionCallback);
gomihgy 5:1730064b94bd 190 ble.onDisconnection(&BLEDisconnectionCallback);
gomihgy 12:880400fa5c44 191 ble.onRadioNotification(&BLERadioNotificationCallback);
akita11 20:c3fadeef5842 192
gomihgy 5:1730064b94bd 193 ble.getPreferredConnectionParams(&connectionParams);
gomihgy 6:bc960e6fd1ed 194 connectionParams.maxConnectionInterval = INTERVAL_500MSEC;
gomihgy 6:bc960e6fd1ed 195 connectionParams.minConnectionInterval = INTERVAL_500MSEC;
gomihgy 6:bc960e6fd1ed 196 connectionParams.connectionSupervisionTimeout = CONNTIMEOUT_3000MSEC;
gomihgy 6:bc960e6fd1ed 197 connectionParams.slaveLatency = 2;
gomihgy 5:1730064b94bd 198 ble.setPreferredConnectionParams(&connectionParams);
akita11 20:c3fadeef5842 199
gomihgy 5:1730064b94bd 200 ble.setTxPower(BLE_TXPOWER_4DBM);
akita11 20:c3fadeef5842 201
akita11 20:c3fadeef5842 202 for(int i=0; i<16; i++) {
gomihgy 6:bc960e6fd1ed 203 advertiseServiceID[i] = UUID_HACARUS_WEIGHT_SERVICE[16 - 1 - i];
gomihgy 6:bc960e6fd1ed 204 }
gomihgy 6:bc960e6fd1ed 205
gomihgy 5:1730064b94bd 206 ble.accumulateAdvertisingPayload((GapAdvertisingData::Flags)(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED));
gomihgy 5:1730064b94bd 207 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
akita11 20:c3fadeef5842 208 (const uint8_t *)DEVICE_NAME,
akita11 20:c3fadeef5842 209 strlen(DEVICE_NAME));
gomihgy 5:1730064b94bd 210 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
gomihgy 6:bc960e6fd1ed 211 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
gomihgy 6:bc960e6fd1ed 212 (const uint8_t *)advertiseServiceID, sizeof(advertiseServiceID));
akita11 20:c3fadeef5842 213
gomihgy 12:880400fa5c44 214 ble.setAdvertisingInterval(INTERVAL_500MSEC);
gomihgy 5:1730064b94bd 215 ble.setAdvertisingTimeout(ADV_TIMEOUT); /* 0 is disable the advertising timeout. */
akita11 20:c3fadeef5842 216
gomihgy 6:bc960e6fd1ed 217 ble.addService(HWS);
gomihgy 5:1730064b94bd 218 ble.addService(DIS);
gomihgy 23:ca1806081f0c 219 DFUService dfu(ble);
gomihgy 5:1730064b94bd 220 }
gomihgy 5:1730064b94bd 221
akita11 0:08c8325a21ec 222 int main()
akita11 0:08c8325a21ec 223 {
gomihgy 5:1730064b94bd 224 #ifdef UART_DEBUG
gomihgy 5:1730064b94bd 225 pc.baud(UART_BAUD_RATE);
gomihgy 5:1730064b94bd 226 #endif
akita11 21:ab5b55d1947d 227 /*
akita11 21:ab5b55d1947d 228 // debug for PCB_VER4
akita11 21:ab5b55d1947d 229 io.analog_pow(1);
akita11 21:ab5b55d1947d 230 // 0g = 0.509444 * 16777215 = 8547051
akita11 21:ab5b55d1947d 231 // 2000g = 0.588761 * 16777215 = 9877770
akita11 21:ab5b55d1947d 232 // d = 0.079317/2kg = 1330719/2kg = 665.36/g
akita11 21:ab5b55d1947d 233 uint32_t d0 = io._get_adc_raw(0);
akita11 21:ab5b55d1947d 234 while(1) {
akita11 21:ab5b55d1947d 235 uint32_t d = io._get_adc_raw(0);
akita11 21:ab5b55d1947d 236 if (d > d0) d = d - d0; else d = 0;
akita11 21:ab5b55d1947d 237 pc.printf("%d %d %f\r\n", io.get_switch(), d, (float)d / 665.36);
akita11 21:ab5b55d1947d 238 }
akita11 21:ab5b55d1947d 239 */
akita11 21:ab5b55d1947d 240 #ifdef PCB_VER3
akita11 10:95c1e5a218d5 241 // set XTAL=32MHz for TaiyoYuden's module
akita11 11:be439189e3f7 242 // is moved to mbed-src/targets/cmsis/TARGET_NORDIC/TARGET_MCU_NRF51822/system_nrf51.c
akita11 11:be439189e3f7 243 DEBUG("UICR->XTALFREQ=%x\r\n", NRF_UICR->XTALFREQ); // this should be 0xffffff00, not 0xffffffff
akita11 10:95c1e5a218d5 244 #endif
akita11 10:95c1e5a218d5 245
akita11 10:95c1e5a218d5 246 BleInitialize();
gomihgy 16:fc66feb533d0 247 AppInit();
akita11 20:c3fadeef5842 248 led_mode = MODE_OFF;
gomihgy 6:bc960e6fd1ed 249 for (;; ) {
akita11 21:ab5b55d1947d 250 pc.printf("#");
gomihgy 14:81347f8f0bda 251 // 100msec waitForEvent
gomihgy 14:81347f8f0bda 252 t.reset();
akita11 20:c3fadeef5842 253 while(t.read_ms() < LED_INTERVAL_MSEC) {
gomihgy 23:ca1806081f0c 254 pc.printf(".");
gomihgy 16:fc66feb533d0 255 t.start();
gomihgy 14:81347f8f0bda 256 ble.waitForEvent();
gomihgy 16:fc66feb533d0 257 t.stop();
gomihgy 14:81347f8f0bda 258 }
gomihgy 23:ca1806081f0c 259
akita11 21:ab5b55d1947d 260 pc.printf("$");
akita11 21:ab5b55d1947d 261 pc.printf("%d %d\r\n", led_mode, io.get_switch());
akita11 20:c3fadeef5842 262 // ticker蜃ヲ逅・
akita11 20:c3fadeef5842 263 switch(led_mode) {
gomihgy 14:81347f8f0bda 264 case MODE_OFF:
akita11 20:c3fadeef5842 265 io.analog_pow(0);
akita11 20:c3fadeef5842 266 io.display(0);
akita11 20:c3fadeef5842 267 if(io.get_switch()) {
gomihgy 14:81347f8f0bda 268 led_mode = MODE_START;
gomihgy 14:81347f8f0bda 269 }
akita11 20:c3fadeef5842 270 break;
gomihgy 14:81347f8f0bda 271 case MODE_START:
akita11 20:c3fadeef5842 272 io.analog_pow(1);
gomihgy 14:81347f8f0bda 273 led_brightness += BRIGHTNESS_ADDVALUE;
akita11 21:ab5b55d1947d 274 pc.printf("br=%f/%f\r\n", led_brightness, BRIGHTNESS_MAXVALUE);
gomihgy 14:81347f8f0bda 275 io.display(led_brightness);
akita11 20:c3fadeef5842 276 if(led_brightness >= BRIGHTNESS_MAXVALUE) {
gomihgy 14:81347f8f0bda 277 update_counter = 0;
gomihgy 16:fc66feb533d0 278 io.calibrate_weight();
akita11 20:c3fadeef5842 279 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 280 SWInit();
akita11 20:c3fadeef5842 281 #endif
gomihgy 16:fc66feb533d0 282 ble.startAdvertising();
gomihgy 14:81347f8f0bda 283 led_mode = MODE_ON;
gomihgy 14:81347f8f0bda 284 }
akita11 20:c3fadeef5842 285 break;
gomihgy 14:81347f8f0bda 286 case MODE_ON:
akita11 20:c3fadeef5842 287 io.analog_pow(1);
akita11 20:c3fadeef5842 288 if(io.get_switch()) {
gomihgy 14:81347f8f0bda 289 led_mode = MODE_END;
akita11 20:c3fadeef5842 290 if(ble.getGapState().connected) {
gomihgy 14:81347f8f0bda 291 ble.disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION);
akita11 20:c3fadeef5842 292 } else {
gomihgy 14:81347f8f0bda 293 ble.stopAdvertising();
gomihgy 14:81347f8f0bda 294 }
akita11 20:c3fadeef5842 295 } else {
gomihgy 18:d1d15ec580fa 296 scale++;
gomihgy 18:d1d15ec580fa 297 ble.updateCharacteristicValue(WeightScale.getValueAttribute().getHandle(),
akita11 20:c3fadeef5842 298 (uint8_t *)&scale,
akita11 20:c3fadeef5842 299 sizeof(scale));
akita11 20:c3fadeef5842 300
akita11 19:05526fe9365e 301 // weight = io.get_weight_raw() / WEIGHT_COEFFICIENT;
akita11 20:c3fadeef5842 302 // if(weight < 0) {
akita11 20:c3fadeef5842 303 // weight = 0;
akita11 20:c3fadeef5842 304 // }
akita11 20:c3fadeef5842 305 weight = io.get_weight();
akita11 20:c3fadeef5842 306 io.display_value = (uint16_t)weight;
akita11 20:c3fadeef5842 307 // io.display_value = 8888; // for LED soldering check
akita11 20:c3fadeef5842 308 #ifdef UART_DEBUG
akita11 21:ab5b55d1947d 309 // pc.printf("%d\r\n", io._get_adc_raw(0));
akita11 20:c3fadeef5842 310 // pc.printf("weight=%f %d / %d\r\n", weight, io.display_value, io._adc0);
akita11 20:c3fadeef5842 311 // pc.printf("%02x %02x %02x %02x\r\n", io._seg[0], io._seg[1], io._seg[2], io._seg[3]);
akita11 20:c3fadeef5842 312 #endif
akita11 20:c3fadeef5842 313 if(++update_counter >= 5) {
akita11 20:c3fadeef5842 314 weight_data = quick_ieee11073_from_float(weight);
akita11 20:c3fadeef5842 315 ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(),
akita11 20:c3fadeef5842 316 (uint8_t *)&weight_data,
akita11 20:c3fadeef5842 317 sizeof(weight_data));
akita11 20:c3fadeef5842 318 update_counter = 0;
gomihgy 14:81347f8f0bda 319 }
gomihgy 14:81347f8f0bda 320 }
akita11 20:c3fadeef5842 321 break;
gomihgy 14:81347f8f0bda 322 case MODE_END:
gomihgy 14:81347f8f0bda 323 led_brightness -= BRIGHTNESS_ADDVALUE;
gomihgy 14:81347f8f0bda 324 io.display(led_brightness);
akita11 20:c3fadeef5842 325 if(led_brightness <= BRIGHTNESS_MINVALUE) {
akita11 20:c3fadeef5842 326 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 327 SWInit();
akita11 20:c3fadeef5842 328 #endif
gomihgy 14:81347f8f0bda 329 led_mode = MODE_OFF;
gomihgy 14:81347f8f0bda 330 }
akita11 20:c3fadeef5842 331 break;
gomihgy 14:81347f8f0bda 332 }
akita11 0:08c8325a21ec 333 }
akita11 0:08c8325a21ec 334 }