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