test

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

Committer:
masaaki_makabe
Date:
Fri Aug 12 04:07:00 2016 +0000
Branch:
KS3
Revision:
36:3cca74c30551
Parent:
33:d7b53d548c33
???????????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
akita11 0:08c8325a21ec 1 #include "mbed.h"
masaaki_makabe 31:b5e19d153db4 2 #include "exio.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>
masaaki_makabe 30:f67850cc3cfe 7 #include <arm_math.h>
masaaki_makabe 31:b5e19d153db4 8 #include "CurrentTimeService.h"
masaaki_makabe 31:b5e19d153db4 9 #include "MMA845x.h"
masaaki_makabe 31:b5e19d153db4 10 #include "common.h"
akita11 0:08c8325a21ec 11
akita11 27:8c3c29b3f704 12
gomihgy 6:bc960e6fd1ed 13 // BLE
gomihgy 6:bc960e6fd1ed 14 #define INTERVAL_500MSEC (500UL)
gomihgy 6:bc960e6fd1ed 15 #define CONNTIMEOUT_3000MSEC (3000UL)
gomihgy 5:1730064b94bd 16 #define ADV_TIMEOUT (0)
gomihgy 5:1730064b94bd 17 #define DEVICE_NAME "Kitchen Scale"
gomihgy 5:1730064b94bd 18 #define BLE_TXPOWER_4DBM (4)
gomihgy 5:1730064b94bd 19
gomihgy 5:1730064b94bd 20 // Device Information Service (DIS) (20 character limit)
gomihgy 5:1730064b94bd 21 // https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml
gomihgy 6:bc960e6fd1ed 22 #define MANUFACTURER_NAME_STRING "Hacarus" // Manufacturer Name String - shall represent the name of the manufacturer of the device.
gomihgy 6:bc960e6fd1ed 23 #define MODEL_NUMBER_STRING "0001" // Model Number String - shall represent the model number that is assigned by the device vendor.
gomihgy 6:bc960e6fd1ed 24 #define SERIAL_NUMBER_STRING "000780c0ffeef00d" // Serial Number String - shall represent the serial number for a particular instance of the device.
gomihgy 28:d8c652994988 25 #define FIRMWARE_REVISION_STRING "v1.00.009@rev0028" // Firmware Revision String - shall represent the firmware revision for the firmware within the device.
gomihgy 5:1730064b94bd 26
gomihgy 5:1730064b94bd 27 // Weight Scale Service (Original)
masaaki_makabe 31:b5e19d153db4 28 //#define UUID_WEIGHT_SCALE_SERVICE (0x181D)
gomihgy 6:bc960e6fd1ed 29
akita11 20:c3fadeef5842 30 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 31 // Switch
gomihgy 14:81347f8f0bda 32 #define SW_THRESHOLD (0.5)
gomihgy 14:81347f8f0bda 33 #define SW_SAMPLECOUNT (3)
akita11 20:c3fadeef5842 34 #endif
gomihgy 5:1730064b94bd 35
gomihgy 6:bc960e6fd1ed 36 // Mode
gomihgy 6:bc960e6fd1ed 37 #define MODE_OFF (0) // LED OFF
gomihgy 6:bc960e6fd1ed 38 #define MODE_START (1) // LED OFF -> ON
gomihgy 6:bc960e6fd1ed 39 #define MODE_ON (2) // LED ON
gomihgy 6:bc960e6fd1ed 40 #define MODE_END (3) // LED ON -> OFF
masaaki_makabe 31:b5e19d153db4 41 /*S-----------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 42 State_t _state = S_WATCH;
masaaki_makabe 31:b5e19d153db4 43 Mode_t _mode = M_SCALE;
masaaki_makabe 31:b5e19d153db4 44 /*E-----------------------------------------------------------*/
gomihgy 6:bc960e6fd1ed 45
gomihgy 6:bc960e6fd1ed 46 // Led
gomihgy 16:fc66feb533d0 47 #define LED_INTERVAL_MSEC (100)
gomihgy 6:bc960e6fd1ed 48 #define BRIGHTNESS_ADDVALUE (0.1)
gomihgy 7:9ebf125e405f 49 #define BRIGHTNESS_MINVALUE (0.0)
gomihgy 6:bc960e6fd1ed 50 #define BRIGHTNESS_MAXVALUE (1.0)
gomihgy 6:bc960e6fd1ed 51
gomihgy 6:bc960e6fd1ed 52 // Properties
akita11 25:da723b86c60b 53 //io io;
masaaki_makabe 31:b5e19d153db4 54 /*S---------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 55 //io io(P0_15, P0_13); // HX711's CLK & DAT
masaaki_makabe 31:b5e19d153db4 56 exio io;
masaaki_makabe 36:3cca74c30551 57 DFUService *p_dfu;
masaaki_makabe 31:b5e19d153db4 58 /*E---------------------------------------------------------------*/
akita11 27:8c3c29b3f704 59 //io(P0_5, P0_4); // HX711's CLK & DAT for BLEnano debug
gomihgy 9:a7bd5ae66d6d 60 uint32_t weight_data;
gomihgy 9:a7bd5ae66d6d 61 float32_t weight = 0.0;
gomihgy 6:bc960e6fd1ed 62 uint32_t scale = 0;
gomihgy 6:bc960e6fd1ed 63 int update_counter = 0;
akita11 20:c3fadeef5842 64 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 14:81347f8f0bda 65 float sw_data[SW_SAMPLECOUNT];
gomihgy 14:81347f8f0bda 66 uint8_t sw_count = 0;
akita11 20:c3fadeef5842 67 #endif
gomihgy 6:bc960e6fd1ed 68 int led_mode = MODE_OFF;
gomihgy 6:bc960e6fd1ed 69 float led_brightness = BRIGHTNESS_MINVALUE;
akita11 4:edd6e262de9e 70
akita11 10:95c1e5a218d5 71 #ifdef UART_DEBUG
akita11 20:c3fadeef5842 72 #if defined(PCB_VER1) || defined(PCB_VER2)
akita11 10:95c1e5a218d5 73 Serial pc(P0_9, P0_8);// TX=P0_9
akita11 20:c3fadeef5842 74 #else
akita11 20:c3fadeef5842 75 Serial pc(P0_9, P0_11);// TX=P0_9
akita11 20:c3fadeef5842 76 #endif
akita11 10:95c1e5a218d5 77 #define UART_BAUD_RATE (9600UL)
akita11 10:95c1e5a218d5 78 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
akita11 10:95c1e5a218d5 79 #else
akita11 10:95c1e5a218d5 80 #define DEBUG(...) {}
akita11 10:95c1e5a218d5 81 #endif
akita11 10:95c1e5a218d5 82
akita11 20:c3fadeef5842 83 Timer t;
akita11 20:c3fadeef5842 84
akita11 20:c3fadeef5842 85 // BLE
gomihgy 12:880400fa5c44 86 BLE ble;
gomihgy 5:1730064b94bd 87 Gap::ConnectionParams_t connectionParams;
gomihgy 5:1730064b94bd 88
gomihgy 5:1730064b94bd 89 /* Complete list of 16-bit Service IDs */
gomihgy 6:bc960e6fd1ed 90 uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE};
gomihgy 5:1730064b94bd 91
gomihgy 5:1730064b94bd 92 /* Weight Scale Service */
gomihgy 6:bc960e6fd1ed 93 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 94 GattCharacteristic WeightMeasurement (UUID(UUID_HACARUS_WEIGHT_CHAR), (uint8_t *)&weight_data, sizeof(weight_data), sizeof(weight_data),
akita11 20:c3fadeef5842 95 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
gomihgy 6:bc960e6fd1ed 96 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 97 GattCharacteristic WeightScale (UUID(UUID_HACARUS_SCALE_CHAR), (uint8_t *)&scale, sizeof(scale), sizeof(scale),
akita11 20:c3fadeef5842 98 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
gomihgy 6:bc960e6fd1ed 99 GattCharacteristic *Chars[] = {&WeightMeasurement,&WeightScale};
gomihgy 6:bc960e6fd1ed 100 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 101 GattService HWS = GattService(UUID(UUID_HACARUS_WEIGHT_SERVICE), Chars, sizeof(Chars) / sizeof(GattCharacteristic *));
gomihgy 5:1730064b94bd 102
gomihgy 5:1730064b94bd 103 /* Device Information Service */
gomihgy 5:1730064b94bd 104 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 105 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 5:1730064b94bd 106 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 107 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 6:bc960e6fd1ed 108 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 109 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 5:1730064b94bd 110 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 111 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
gomihgy 6:bc960e6fd1ed 112 GattCharacteristic *DISChars[] = {&ManuName, &ModelNum, &SerialNum, &FWVersion};
gomihgy 5:1730064b94bd 113 GattService DIS(GattService::UUID_DEVICE_INFORMATION_SERVICE , DISChars, sizeof(DISChars) / sizeof(GattCharacteristic *));
gomihgy 5:1730064b94bd 114
masaaki_makabe 31:b5e19d153db4 115 /*S--------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 116 CurrentTimeService *p_CurrentTimeService; // Current Time Service
masaaki_makabe 31:b5e19d153db4 117 MMA845x *p_MMA845x; // 加速度センサー(本体)
masaaki_makabe 31:b5e19d153db4 118 I2C i2c(P0_17, P0_18); // 加速度センサー(I2C)
masaaki_makabe 31:b5e19d153db4 119 /*E--------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 120
akita11 20:c3fadeef5842 121 #ifdef PCB_VER1
akita11 20:c3fadeef5842 122 bool check_joystick()
akita11 20:c3fadeef5842 123 {
gomihgy 14:81347f8f0bda 124 float sum_data = 0;
akita11 20:c3fadeef5842 125
gomihgy 14:81347f8f0bda 126 sw_data[sw_count] = io.get_x();
akita11 20:c3fadeef5842 127
akita11 20:c3fadeef5842 128 if(++sw_count >= SW_SAMPLECOUNT) {
gomihgy 14:81347f8f0bda 129 sw_count = 0;
gomihgy 7:9ebf125e405f 130 }
akita11 20:c3fadeef5842 131
akita11 20:c3fadeef5842 132 for(int count = 0; count < SW_SAMPLECOUNT; count++) {
gomihgy 14:81347f8f0bda 133 sum_data += sw_data[count];
akita11 0:08c8325a21ec 134 }
akita11 20:c3fadeef5842 135
gomihgy 14:81347f8f0bda 136 return ((sum_data / SW_SAMPLECOUNT) >= SW_THRESHOLD);
gomihgy 7:9ebf125e405f 137 }
akita11 20:c3fadeef5842 138 #endif
gomihgy 7:9ebf125e405f 139
gomihgy 9:a7bd5ae66d6d 140 uint32_t quick_ieee11073_from_float(float data)
gomihgy 9:a7bd5ae66d6d 141 {
gomihgy 9:a7bd5ae66d6d 142 uint8_t exponent = 0xFE; //exponent is -2
gomihgy 9:a7bd5ae66d6d 143 uint32_t mantissa = (uint32_t)(data*100);
akita11 20:c3fadeef5842 144
gomihgy 9:a7bd5ae66d6d 145 return ( ((uint32_t)exponent) << 24) | mantissa;
gomihgy 9:a7bd5ae66d6d 146 }
gomihgy 9:a7bd5ae66d6d 147
akita11 20:c3fadeef5842 148 #if defined(PCB_VER1) || defined(PCB_VER2)
akita11 20:c3fadeef5842 149 void SWInit(void)
akita11 20:c3fadeef5842 150 {
gomihgy 16:fc66feb533d0 151 // SW Initialize
akita11 20:c3fadeef5842 152 for(int count = 0; count < SW_SAMPLECOUNT; count++) {
gomihgy 16:fc66feb533d0 153 sw_data[count] = 0;
gomihgy 16:fc66feb533d0 154 }
gomihgy 16:fc66feb533d0 155 }
akita11 20:c3fadeef5842 156 #endif
akita11 10:95c1e5a218d5 157
akita11 20:c3fadeef5842 158 void AppInit(void)
akita11 20:c3fadeef5842 159 {
akita11 20:c3fadeef5842 160
akita11 20:c3fadeef5842 161 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 162 SWInit();
akita11 20:c3fadeef5842 163 #endif
gomihgy 16:fc66feb533d0 164 io.analog_pow(1);
akita11 20:c3fadeef5842 165
akita11 21:ab5b55d1947d 166 #ifdef PCB_VER3
akita11 21:ab5b55d1947d 167 // check XTALFREQ for TaiyoYuden module in PCB_VER3
gomihgy 28:d8c652994988 168 /*
gomihgy 28:d8c652994988 169 if(NRF_UICR->XTALFREQ == 0xFFFFFF00){
gomihgy 28:d8c652994988 170 io.display_value = 3232;
gomihgy 28:d8c652994988 171 }else if(NRF_UICR->XTALFREQ == 0xFFFFFFFF){
gomihgy 28:d8c652994988 172 io.display_value = 1616;
gomihgy 28:d8c652994988 173 }
gomihgy 28:d8c652994988 174 */
akita11 21:ab5b55d1947d 175 #endif
akita11 0:08c8325a21ec 176 }
akita11 0:08c8325a21ec 177
gomihgy 5:1730064b94bd 178 /*
gomihgy 5:1730064b94bd 179 * BLE CallBacks
gomihgy 5:1730064b94bd 180 */
gomihgy 12:880400fa5c44 181 void BLEConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
gomihgy 5:1730064b94bd 182 {
akita11 20:c3fadeef5842 183 ble.updateConnectionParams(params->handle, params->connectionParams);
masaaki_makabe 33:d7b53d548c33 184 #ifdef UART_DEBUG
masaaki_makabe 33:d7b53d548c33 185 pc.printf("BLEConnectionCallback \r\n");
masaaki_makabe 33:d7b53d548c33 186 #endif
gomihgy 5:1730064b94bd 187 }
gomihgy 5:1730064b94bd 188
gomihgy 12:880400fa5c44 189 void BLEDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
gomihgy 5:1730064b94bd 190 {
akita11 20:c3fadeef5842 191 if(led_mode == MODE_ON) {
gomihgy 6:bc960e6fd1ed 192 ble.startAdvertising();
gomihgy 5:1730064b94bd 193 }
masaaki_makabe 33:d7b53d548c33 194 #ifdef UART_DEBUG
masaaki_makabe 33:d7b53d548c33 195 pc.printf("BLEDisconnectionCallback \r\n");
masaaki_makabe 33:d7b53d548c33 196 #endif
gomihgy 5:1730064b94bd 197 }
gomihgy 5:1730064b94bd 198
gomihgy 12:880400fa5c44 199 void BLERadioNotificationCallback(bool radio_active)
gomihgy 12:880400fa5c44 200 {
akita11 20:c3fadeef5842 201 if (radio_active == false) {
akita11 20:c3fadeef5842 202 if(led_mode == MODE_ON) {
gomihgy 12:880400fa5c44 203 }
gomihgy 12:880400fa5c44 204 }
masaaki_makabe 33:d7b53d548c33 205 #ifdef UART_DEBUG
masaaki_makabe 33:d7b53d548c33 206 pc.printf("BLERadioNotificationCallback \r\n");
masaaki_makabe 33:d7b53d548c33 207 #endif
gomihgy 12:880400fa5c44 208 }
gomihgy 12:880400fa5c44 209
masaaki_makabe 31:b5e19d153db4 210
masaaki_makabe 31:b5e19d153db4 211
akita11 20:c3fadeef5842 212 void BleInitialize(void)
akita11 20:c3fadeef5842 213 {
akita11 20:c3fadeef5842 214
gomihgy 6:bc960e6fd1ed 215 uint8_t advertiseServiceID[16];
akita11 20:c3fadeef5842 216
gomihgy 5:1730064b94bd 217 // Initialize
gomihgy 5:1730064b94bd 218 ble.init();
akita11 20:c3fadeef5842 219
gomihgy 5:1730064b94bd 220 // Event Set
gomihgy 5:1730064b94bd 221 ble.onConnection(&BLEConnectionCallback);
gomihgy 5:1730064b94bd 222 ble.onDisconnection(&BLEDisconnectionCallback);
gomihgy 12:880400fa5c44 223 ble.onRadioNotification(&BLERadioNotificationCallback);
akita11 20:c3fadeef5842 224
gomihgy 5:1730064b94bd 225 ble.getPreferredConnectionParams(&connectionParams);
gomihgy 6:bc960e6fd1ed 226 connectionParams.maxConnectionInterval = INTERVAL_500MSEC;
gomihgy 6:bc960e6fd1ed 227 connectionParams.minConnectionInterval = INTERVAL_500MSEC;
gomihgy 6:bc960e6fd1ed 228 connectionParams.connectionSupervisionTimeout = CONNTIMEOUT_3000MSEC;
gomihgy 6:bc960e6fd1ed 229 connectionParams.slaveLatency = 2;
gomihgy 5:1730064b94bd 230 ble.setPreferredConnectionParams(&connectionParams);
akita11 20:c3fadeef5842 231
gomihgy 5:1730064b94bd 232 ble.setTxPower(BLE_TXPOWER_4DBM);
akita11 20:c3fadeef5842 233
akita11 20:c3fadeef5842 234 for(int i=0; i<16; i++) {
gomihgy 6:bc960e6fd1ed 235 advertiseServiceID[i] = UUID_HACARUS_WEIGHT_SERVICE[16 - 1 - i];
gomihgy 6:bc960e6fd1ed 236 }
gomihgy 6:bc960e6fd1ed 237
gomihgy 5:1730064b94bd 238 ble.accumulateAdvertisingPayload((GapAdvertisingData::Flags)(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED));
gomihgy 5:1730064b94bd 239 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
akita11 20:c3fadeef5842 240 (const uint8_t *)DEVICE_NAME,
akita11 20:c3fadeef5842 241 strlen(DEVICE_NAME));
gomihgy 5:1730064b94bd 242 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
gomihgy 6:bc960e6fd1ed 243 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
gomihgy 6:bc960e6fd1ed 244 (const uint8_t *)advertiseServiceID, sizeof(advertiseServiceID));
akita11 20:c3fadeef5842 245
gomihgy 12:880400fa5c44 246 ble.setAdvertisingInterval(INTERVAL_500MSEC);
gomihgy 5:1730064b94bd 247 ble.setAdvertisingTimeout(ADV_TIMEOUT); /* 0 is disable the advertising timeout. */
akita11 20:c3fadeef5842 248
masaaki_makabe 31:b5e19d153db4 249 /*S-----------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 250 /*CurrentTimeServiceの初期化とサービス追加*/
masaaki_makabe 31:b5e19d153db4 251 ble_date_time_t dt; // 1970/1/1 00:00:00 以降の初期値
masaaki_makabe 31:b5e19d153db4 252 dt.year = 2016;
masaaki_makabe 31:b5e19d153db4 253 dt.month = 7;
masaaki_makabe 31:b5e19d153db4 254 dt.day = 31;
masaaki_makabe 31:b5e19d153db4 255 dt.hours = 23;
masaaki_makabe 31:b5e19d153db4 256 dt.minutes = 45;
masaaki_makabe 31:b5e19d153db4 257 dt.seconds = 0;
masaaki_makabe 31:b5e19d153db4 258 p_CurrentTimeService = new CurrentTimeService(ble, dt);
masaaki_makabe 31:b5e19d153db4 259 /*E-----------------------------------------------------------------------*/
gomihgy 6:bc960e6fd1ed 260 ble.addService(HWS);
gomihgy 5:1730064b94bd 261 ble.addService(DIS);
masaaki_makabe 36:3cca74c30551 262 // DFUサービスがスタックに割り当たっていたのをヒープへ移動
masaaki_makabe 36:3cca74c30551 263 //DFUService dfu(ble);
masaaki_makabe 36:3cca74c30551 264 p_dfu = new DFUService(ble);
gomihgy 5:1730064b94bd 265 }
masaaki_makabe 31:b5e19d153db4 266 /*S---------------------------------------------------------------------*/
masaaki_makabe 33:d7b53d548c33 267 /*キー押されて1sec経過すればコールバックされる*/
masaaki_makabe 33:d7b53d548c33 268 int _key1sec = 0;
masaaki_makabe 33:d7b53d548c33 269 bool _analog_skip = false;
masaaki_makabe 33:d7b53d548c33 270 void KeyOn(void)
masaaki_makabe 33:d7b53d548c33 271 {
masaaki_makabe 33:d7b53d548c33 272 _key1sec = 1;
masaaki_makabe 33:d7b53d548c33 273 }
masaaki_makabe 31:b5e19d153db4 274 void AccelInit(void)
masaaki_makabe 31:b5e19d153db4 275 {
masaaki_makabe 31:b5e19d153db4 276 /*加速度センサー初期化*/
masaaki_makabe 31:b5e19d153db4 277 p_MMA845x = new MMA845x(i2c, MMA845x::SA0_VSS);
masaaki_makabe 31:b5e19d153db4 278 //p_MMA845x->attachZAxisPulse(&zTap);
masaaki_makabe 31:b5e19d153db4 279
masaaki_makabe 31:b5e19d153db4 280 const int ADR = 0x3A;
masaaki_makabe 31:b5e19d153db4 281 char data[2], cmd = 0x0D;
masaaki_makabe 31:b5e19d153db4 282 i2c.write(ADR, &cmd, 1, true);
masaaki_makabe 31:b5e19d153db4 283 i2c.read(ADR, &data[0], 1); // data[0]: Who am I?
masaaki_makabe 31:b5e19d153db4 284
masaaki_makabe 31:b5e19d153db4 285 //p_MMA845x->enableMotionMode();
masaaki_makabe 31:b5e19d153db4 286 //p_MMA845x->registerDump();
masaaki_makabe 31:b5e19d153db4 287 p_MMA845x->enableDataReadyMode();
masaaki_makabe 33:d7b53d548c33 288
masaaki_makabe 33:d7b53d548c33 289 io.attach(&KeyOn);
masaaki_makabe 31:b5e19d153db4 290 }
masaaki_makabe 31:b5e19d153db4 291 /*モード決定*/
masaaki_makabe 31:b5e19d153db4 292 void GetMode(void)
masaaki_makabe 31:b5e19d153db4 293 {
masaaki_makabe 31:b5e19d153db4 294 // 横置きなら時計タイマーモード、縦置きなら計量モード
masaaki_makabe 31:b5e19d153db4 295 //int x = p_MMA845x->getX();
masaaki_makabe 31:b5e19d153db4 296 //int y = p_MMA845x->getY();
masaaki_makabe 31:b5e19d153db4 297 //int z = p_MMA845x->getZ();
masaaki_makabe 31:b5e19d153db4 298 float xx = p_MMA845x->getXX();
masaaki_makabe 31:b5e19d153db4 299 _mode = (xx < 0.3) ? M_SCALE : M_WATCHTIMER;
masaaki_makabe 31:b5e19d153db4 300 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 301 pc.printf("KATAMUKI xx=%f, mode=%s\r\n", xx, (_mode == M_SCALE) ? "SCALE" : "WATCHTIMER");
masaaki_makabe 31:b5e19d153db4 302 #endif
masaaki_makabe 31:b5e19d153db4 303 }
masaaki_makabe 31:b5e19d153db4 304 /*STATE決定*/
masaaki_makabe 31:b5e19d153db4 305 void GetState(int sw)
masaaki_makabe 31:b5e19d153db4 306 {
masaaki_makabe 31:b5e19d153db4 307 ble_date_time_t dt;
masaaki_makabe 31:b5e19d153db4 308 // スイッチ長押しでタイマー、通常押しで時間表示
masaaki_makabe 31:b5e19d153db4 309 if(sw == exio::LongPressed) {
masaaki_makabe 31:b5e19d153db4 310 p_CurrentTimeService->setCounter(0); // タイマーカウンタリセット
masaaki_makabe 31:b5e19d153db4 311 io.displaySeconds(0);
masaaki_makabe 31:b5e19d153db4 312 _state = S_TIMER;
masaaki_makabe 31:b5e19d153db4 313 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 314 pc.printf("S_TIMER START\r\n");
masaaki_makabe 31:b5e19d153db4 315 #endif
masaaki_makabe 31:b5e19d153db4 316 } else if(sw == exio::Pressed){
masaaki_makabe 31:b5e19d153db4 317 p_CurrentTimeService->setTm(60/*sec*/); /*表示タイムアウト*/
masaaki_makabe 31:b5e19d153db4 318 p_CurrentTimeService->readDateTime(dt); // 時計取得
masaaki_makabe 31:b5e19d153db4 319 io.displayHHMM(dt);
masaaki_makabe 31:b5e19d153db4 320 _state = S_WATCH;
masaaki_makabe 31:b5e19d153db4 321 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 322 pc.printf("S_WATCH START\r\n");
masaaki_makabe 31:b5e19d153db4 323 #endif
masaaki_makabe 31:b5e19d153db4 324 }
masaaki_makabe 31:b5e19d153db4 325 }
masaaki_makabe 31:b5e19d153db4 326 int TMain(int sw)
masaaki_makabe 31:b5e19d153db4 327 {
masaaki_makabe 31:b5e19d153db4 328 /*下記は時計/タイマーモード*/
masaaki_makabe 31:b5e19d153db4 329 ble_date_time_t dt;
masaaki_makabe 31:b5e19d153db4 330 int t;
masaaki_makabe 31:b5e19d153db4 331 switch(_state){
masaaki_makabe 31:b5e19d153db4 332 case S_TIMER:
masaaki_makabe 31:b5e19d153db4 333 /*タイマー表示の場合*/
masaaki_makabe 31:b5e19d153db4 334 t = p_CurrentTimeService->getCounter();
masaaki_makabe 31:b5e19d153db4 335 io.displaySeconds(t); // タイマー表示
masaaki_makabe 31:b5e19d153db4 336 // スイッチ押された場合終了
masaaki_makabe 31:b5e19d153db4 337 if(sw != exio::None){
masaaki_makabe 31:b5e19d153db4 338 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 339 pc.printf("S_TIMER EXIT\r\n");
masaaki_makabe 31:b5e19d153db4 340 #endif
masaaki_makabe 31:b5e19d153db4 341 return 1; // モード終了
masaaki_makabe 31:b5e19d153db4 342 }
masaaki_makabe 31:b5e19d153db4 343 break;
masaaki_makabe 31:b5e19d153db4 344 case S_WATCH:
masaaki_makabe 31:b5e19d153db4 345 /*時計表示の場合*/
masaaki_makabe 31:b5e19d153db4 346 p_CurrentTimeService->readDateTime(dt); // 時計取得
masaaki_makabe 31:b5e19d153db4 347 io.displayHHMM(dt); // 時計表示
masaaki_makabe 31:b5e19d153db4 348 // 表示タイムアウトもしくはスイッチ押しの場合終了
masaaki_makabe 31:b5e19d153db4 349 if(/*p_CurrentTimeService->getTm() <= 0 ||*/ sw != exio::None){ // タイムアウトorスイッチ押し
masaaki_makabe 31:b5e19d153db4 350 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 351 pc.printf("S_WATCH EXIT\r\n");
masaaki_makabe 31:b5e19d153db4 352 #endif
masaaki_makabe 31:b5e19d153db4 353 return 1; // モード終了
masaaki_makabe 31:b5e19d153db4 354 }
masaaki_makabe 31:b5e19d153db4 355 break;
masaaki_makabe 31:b5e19d153db4 356 default:
masaaki_makabe 31:b5e19d153db4 357 break;
masaaki_makabe 31:b5e19d153db4 358 }
masaaki_makabe 31:b5e19d153db4 359 return 0; // モード継続
masaaki_makabe 31:b5e19d153db4 360 }
masaaki_makabe 31:b5e19d153db4 361 /*E-----------------------------------------------------------------------*/
gomihgy 5:1730064b94bd 362
masaaki_makabe 29:09406be35ef4 363 //DigitalOut _reg_ps(P0_1, 1); // 1=normal, 0=power_save
masaaki_makabe 29:09406be35ef4 364 //DigitalOut _adc_rate(P0_6, 1); // 0=10Hz, 1=80Hz (HX711's RATE pin)
masaaki_makabe 29:09406be35ef4 365
akita11 0:08c8325a21ec 366 int main()
akita11 0:08c8325a21ec 367 {
masaaki_makabe 31:b5e19d153db4 368 /*S----------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 369 int sw;
masaaki_makabe 31:b5e19d153db4 370 /*E----------------------------------------------------*/
akita11 24:c6ef55535900 371 float weight_s;
akita11 24:c6ef55535900 372 int Navg = 5;
akita11 24:c6ef55535900 373 int sample = 0;
gomihgy 5:1730064b94bd 374 #ifdef UART_DEBUG
gomihgy 5:1730064b94bd 375 pc.baud(UART_BAUD_RATE);
masaaki_makabe 31:b5e19d153db4 376 pc.printf("%s(%d): Program Start\r\n", __FILE__, __LINE__);
masaaki_makabe 29:09406be35ef4 377 // for checking SPI configuration (SPI1 is used_)
masaaki_makabe 29:09406be35ef4 378 // pc.printf("SPI->PSELSCK = %x\r\n", NRF_SPI0->PSELSCK); // will be 15 (P0_15)
masaaki_makabe 29:09406be35ef4 379 // pc.printf("SPI->PSELMISO = %x\r\n", NRF_SPI0->PSELMISO); // will be 13 (P0_13)
masaaki_makabe 29:09406be35ef4 380 // pc.printf("SPI->PSELMOSI = %x\r\n", NRF_SPI0->PSELMOSI); // will be 14 (P0_14): dummy
masaaki_makabe 29:09406be35ef4 381 // pc.printf("SPI->PSELSCK = %x\r\n", NRF_SPI1->PSELSCK); // will be 15 (P0_15)
masaaki_makabe 29:09406be35ef4 382 // pc.printf("SPI->PSELMISO = %x\r\n", NRF_SPI1->PSELMISO); // will be 13 (P0_13)
masaaki_makabe 29:09406be35ef4 383 // pc.printf("SPI->PSELMOSI = %x\r\n", NRF_SPI1->PSELMOSI); // will be 14 (P0_14): dummy
gomihgy 5:1730064b94bd 384 #endif
akita11 21:ab5b55d1947d 385 #ifdef PCB_VER3
akita11 10:95c1e5a218d5 386 // set XTAL=32MHz for TaiyoYuden's module
akita11 11:be439189e3f7 387 // is moved to mbed-src/targets/cmsis/TARGET_NORDIC/TARGET_MCU_NRF51822/system_nrf51.c
akita11 11:be439189e3f7 388 DEBUG("UICR->XTALFREQ=%x\r\n", NRF_UICR->XTALFREQ); // this should be 0xffffff00, not 0xffffffff
akita11 10:95c1e5a218d5 389 #endif
akita11 10:95c1e5a218d5 390
akita11 10:95c1e5a218d5 391 BleInitialize();
masaaki_makabe 31:b5e19d153db4 392 /*S-----------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 393 AccelInit();
masaaki_makabe 31:b5e19d153db4 394 /*E-----------------------------------------------*/
gomihgy 16:fc66feb533d0 395 AppInit();
gomihgy 28:d8c652994988 396
akita11 20:c3fadeef5842 397 led_mode = MODE_OFF;
akita11 27:8c3c29b3f704 398 #ifdef DISPLAY_DEMO
akita11 27:8c3c29b3f704 399 uint16_t d = 0;
akita11 27:8c3c29b3f704 400 uint8_t demo_count = 0;
akita11 27:8c3c29b3f704 401 led_mode = MODE_START; // for debug mode
akita11 27:8c3c29b3f704 402 #endif
gomihgy 6:bc960e6fd1ed 403 for (;; ) {
gomihgy 14:81347f8f0bda 404 // 100msec waitForEvent
gomihgy 14:81347f8f0bda 405 t.reset();
akita11 20:c3fadeef5842 406 while(t.read_ms() < LED_INTERVAL_MSEC) {
gomihgy 16:fc66feb533d0 407 t.start();
gomihgy 14:81347f8f0bda 408 ble.waitForEvent();
gomihgy 16:fc66feb533d0 409 t.stop();
gomihgy 14:81347f8f0bda 410 }
akita11 20:c3fadeef5842 411 switch(led_mode) {
gomihgy 14:81347f8f0bda 412 case MODE_OFF:
akita11 20:c3fadeef5842 413 io.analog_pow(0);
akita11 20:c3fadeef5842 414 io.display(0);
masaaki_makabe 31:b5e19d153db4 415 /*S--------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 416 sw = io.get_switch();
masaaki_makabe 31:b5e19d153db4 417 io.switch_reset();
masaaki_makabe 31:b5e19d153db4 418 if(sw != exio::None) {/*通常押しもしくは長押し*/
masaaki_makabe 33:d7b53d548c33 419 _key1sec = 0;
masaaki_makabe 33:d7b53d548c33 420 io.CallFlagClear();
masaaki_makabe 31:b5e19d153db4 421 GetMode(); /*傾きからモード決定*/
masaaki_makabe 31:b5e19d153db4 422 if(_mode == M_WATCHTIMER){
masaaki_makabe 31:b5e19d153db4 423 GetState(sw); //WATCH or TIMER ?
masaaki_makabe 31:b5e19d153db4 424 }
masaaki_makabe 31:b5e19d153db4 425 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 426 pc.printf("GO MODE_START\r\n");
masaaki_makabe 31:b5e19d153db4 427 #endif
masaaki_makabe 31:b5e19d153db4 428 /*E--------------------------------------------------------------------*/
gomihgy 14:81347f8f0bda 429 led_mode = MODE_START;
gomihgy 14:81347f8f0bda 430 }
masaaki_makabe 33:d7b53d548c33 431 /*S---------------------------------------------------------------------------*/
masaaki_makabe 33:d7b53d548c33 432 else {
masaaki_makabe 33:d7b53d548c33 433 // キー押された状態で1sec経過した場合表示のみ開始、Timerモード開始は後ほど
masaaki_makabe 33:d7b53d548c33 434 if(_key1sec == 1){
masaaki_makabe 33:d7b53d548c33 435 _mode = M_WATCHTIMER;
masaaki_makabe 33:d7b53d548c33 436 _state = S_TIMER;
masaaki_makabe 33:d7b53d548c33 437 io.analog_pow(1);
masaaki_makabe 33:d7b53d548c33 438 io.power_save_mode(0);
masaaki_makabe 33:d7b53d548c33 439 _analog_skip = true;
masaaki_makabe 33:d7b53d548c33 440 io.displaySeconds(0);
masaaki_makabe 33:d7b53d548c33 441 //io.display_unitT();
masaaki_makabe 33:d7b53d548c33 442 _key1sec = 2;
masaaki_makabe 33:d7b53d548c33 443 } else if(_key1sec == 2){
masaaki_makabe 33:d7b53d548c33 444 led_brightness += BRIGHTNESS_ADDVALUE; // 徐々に明るく
masaaki_makabe 33:d7b53d548c33 445 io.display(led_brightness);
masaaki_makabe 33:d7b53d548c33 446 if(led_brightness >= BRIGHTNESS_MAXVALUE) _key1sec = 3;
masaaki_makabe 33:d7b53d548c33 447 } else {
masaaki_makabe 33:d7b53d548c33 448 io.display(led_brightness);
masaaki_makabe 33:d7b53d548c33 449 }
masaaki_makabe 33:d7b53d548c33 450 }
masaaki_makabe 33:d7b53d548c33 451 /*E---------------------------------------------------------------------------*/
akita11 20:c3fadeef5842 452 break;
gomihgy 14:81347f8f0bda 453 case MODE_START:
masaaki_makabe 33:d7b53d548c33 454 //if(_analog_skip) {_analog_skip=false; goto L090;}
akita11 20:c3fadeef5842 455 io.analog_pow(1);
akita11 24:c6ef55535900 456 io.power_save_mode(0);
masaaki_makabe 31:b5e19d153db4 457 /*S----------------------------------------------------------------*/
masaaki_makabe 33:d7b53d548c33 458 //L090:
masaaki_makabe 31:b5e19d153db4 459 // タイマー時はここで毎回更新
masaaki_makabe 33:d7b53d548c33 460 //if(_mode == M_WATCHTIMER && _state == S_TIMER){
masaaki_makabe 33:d7b53d548c33 461 // p_CurrentTimeService->setCounter(0); // タイマーカウンタリセット
masaaki_makabe 33:d7b53d548c33 462 // io.displaySeconds(0);
masaaki_makabe 33:d7b53d548c33 463 /*} else*/ if(_mode == M_SCALE){
masaaki_makabe 31:b5e19d153db4 464 io.display_value = 0;
masaaki_makabe 31:b5e19d153db4 465 }
masaaki_makabe 31:b5e19d153db4 466 /*E----------------------------------------------------------------*/
gomihgy 14:81347f8f0bda 467 led_brightness += BRIGHTNESS_ADDVALUE;
gomihgy 14:81347f8f0bda 468 io.display(led_brightness);
akita11 20:c3fadeef5842 469 if(led_brightness >= BRIGHTNESS_MAXVALUE) {
masaaki_makabe 31:b5e19d153db4 470 /*S-----------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 471 if(_mode == M_WATCHTIMER){
masaaki_makabe 31:b5e19d153db4 472 ble.startAdvertising();
masaaki_makabe 31:b5e19d153db4 473 led_mode = MODE_ON;
masaaki_makabe 31:b5e19d153db4 474 break; /*時間/タイマーモードはここで終了*/
masaaki_makabe 31:b5e19d153db4 475 }
masaaki_makabe 31:b5e19d153db4 476 /*E-----------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 477 /*計量モードの初期処理*/
gomihgy 14:81347f8f0bda 478 update_counter = 0;
masaaki_makabe 31:b5e19d153db4 479 io.calibrate_weight(); /*ここがゼロ補正*/
akita11 20:c3fadeef5842 480 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 481 SWInit();
akita11 20:c3fadeef5842 482 #endif
gomihgy 16:fc66feb533d0 483 ble.startAdvertising();
gomihgy 14:81347f8f0bda 484 led_mode = MODE_ON;
akita11 24:c6ef55535900 485 weight_s = 0.0;
akita11 24:c6ef55535900 486 sample = 0;
gomihgy 14:81347f8f0bda 487 }
akita11 20:c3fadeef5842 488 break;
gomihgy 14:81347f8f0bda 489 case MODE_ON:
akita11 24:c6ef55535900 490 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 491 //pc.printf("%d %d %.2f\r\n", io.get_switch(), io.get_weight_raw(), io.get_weight());
akita11 24:c6ef55535900 492 #endif
akita11 20:c3fadeef5842 493 io.analog_pow(1);
akita11 27:8c3c29b3f704 494 #ifdef DISPLAY_DEMO
akita11 27:8c3c29b3f704 495 demo_count++;
gomihgy 28:d8c652994988 496 if (demo_count == 10) {
akita11 27:8c3c29b3f704 497 demo_count = 0;
akita11 27:8c3c29b3f704 498 io.display_value = d++; // increment display value for every 1s in demo mode
gomihgy 28:d8c652994988 499 weight_data = quick_ieee11073_from_float(d);
gomihgy 28:d8c652994988 500 ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(),
gomihgy 28:d8c652994988 501 (uint8_t *)&weight_data,
gomihgy 28:d8c652994988 502 sizeof(weight_data));
akita11 27:8c3c29b3f704 503 }
akita11 27:8c3c29b3f704 504 #else
masaaki_makabe 31:b5e19d153db4 505 /*S-------------------------------------------------------------------------*/
masaaki_makabe 31:b5e19d153db4 506 sw = io.get_switch();
masaaki_makabe 31:b5e19d153db4 507 io.switch_reset();
masaaki_makabe 31:b5e19d153db4 508 if(_mode == M_WATCHTIMER){
masaaki_makabe 31:b5e19d153db4 509 int ret = TMain(sw); // 時間/タイマー処理へ
masaaki_makabe 31:b5e19d153db4 510 if(ret == 1){ // モード終了
masaaki_makabe 31:b5e19d153db4 511 goto L010;
masaaki_makabe 31:b5e19d153db4 512 }
masaaki_makabe 31:b5e19d153db4 513 break; // 時間/タイマーモードはここで終了
masaaki_makabe 31:b5e19d153db4 514 }
masaaki_makabe 31:b5e19d153db4 515 /*下記は計量モード*/
masaaki_makabe 31:b5e19d153db4 516 if(sw == exio::Pressed) {
masaaki_makabe 31:b5e19d153db4 517 L010:
masaaki_makabe 31:b5e19d153db4 518 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 519 pc.printf("GO MODE_END\r\n");
masaaki_makabe 31:b5e19d153db4 520 #endif
masaaki_makabe 31:b5e19d153db4 521 /*E-------------------------------------------------------------------------*/
gomihgy 14:81347f8f0bda 522 led_mode = MODE_END;
akita11 20:c3fadeef5842 523 if(ble.getGapState().connected) {
gomihgy 14:81347f8f0bda 524 ble.disconnect(Gap::REMOTE_USER_TERMINATED_CONNECTION);
akita11 20:c3fadeef5842 525 } else {
gomihgy 14:81347f8f0bda 526 ble.stopAdvertising();
gomihgy 14:81347f8f0bda 527 }
akita11 20:c3fadeef5842 528 } else {
gomihgy 18:d1d15ec580fa 529 scale++;
gomihgy 18:d1d15ec580fa 530 ble.updateCharacteristicValue(WeightScale.getValueAttribute().getHandle(),
akita11 20:c3fadeef5842 531 (uint8_t *)&scale,
akita11 20:c3fadeef5842 532 sizeof(scale));
akita11 20:c3fadeef5842 533
akita11 24:c6ef55535900 534 weight_s += io.get_weight();
akita11 24:c6ef55535900 535 sample++;
gomihgy 28:d8c652994988 536 if (sample == Navg) {
akita11 24:c6ef55535900 537 weight = weight_s / (float)Navg;
akita11 24:c6ef55535900 538 io.display_value = (uint16_t)weight;
akita11 24:c6ef55535900 539 weight_s = 0.0;
akita11 24:c6ef55535900 540 sample = 0;
masaaki_makabe 31:b5e19d153db4 541 #ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 542 pc.printf("weight=%.1f\r\n", weight);
masaaki_makabe 31:b5e19d153db4 543 #endif
akita11 24:c6ef55535900 544 }
akita11 24:c6ef55535900 545 // pc.printf("weight=%.1f\r\n", weight);
akita11 20:c3fadeef5842 546 // io.display_value = 8888; // for LED soldering check
akita11 20:c3fadeef5842 547 #ifdef UART_DEBUG
akita11 21:ab5b55d1947d 548 // pc.printf("%d\r\n", io._get_adc_raw(0));
akita11 20:c3fadeef5842 549 // pc.printf("weight=%f %d / %d\r\n", weight, io.display_value, io._adc0);
akita11 20:c3fadeef5842 550 #endif
akita11 20:c3fadeef5842 551 if(++update_counter >= 5) {
akita11 20:c3fadeef5842 552 weight_data = quick_ieee11073_from_float(weight);
akita11 20:c3fadeef5842 553 ble.updateCharacteristicValue(WeightMeasurement.getValueAttribute().getHandle(),
akita11 20:c3fadeef5842 554 (uint8_t *)&weight_data,
akita11 20:c3fadeef5842 555 sizeof(weight_data));
akita11 20:c3fadeef5842 556 update_counter = 0;
gomihgy 14:81347f8f0bda 557 }
gomihgy 14:81347f8f0bda 558 }
akita11 27:8c3c29b3f704 559 #endif
akita11 20:c3fadeef5842 560 break;
gomihgy 14:81347f8f0bda 561 case MODE_END:
gomihgy 14:81347f8f0bda 562 led_brightness -= BRIGHTNESS_ADDVALUE;
gomihgy 14:81347f8f0bda 563 io.display(led_brightness);
akita11 20:c3fadeef5842 564 if(led_brightness <= BRIGHTNESS_MINVALUE) {
akita11 20:c3fadeef5842 565 #if defined(PCB_VER1) || defined(PCB_VER2)
gomihgy 16:fc66feb533d0 566 SWInit();
akita11 20:c3fadeef5842 567 #endif
gomihgy 14:81347f8f0bda 568 led_mode = MODE_OFF;
akita11 24:c6ef55535900 569 io.power_save_mode(1);
gomihgy 14:81347f8f0bda 570 }
akita11 20:c3fadeef5842 571 break;
gomihgy 14:81347f8f0bda 572 }
akita11 0:08c8325a21ec 573 }
akita11 0:08c8325a21ec 574 }