chirimenBLE for TY51822
Dependencies: mbed BLE_API nRF51822
main.cpp@0:6b1b97df8a36, 2018-12-13 (annotated)
- Committer:
- nakamura_bs
- Date:
- Thu Dec 13 02:05:08 2018 +0000
- Revision:
- 0:6b1b97df8a36
- Child:
- 1:4d21403a5251
develop phase 1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nakamura_bs | 0:6b1b97df8a36 | 1 | #include "mbed.h" |
nakamura_bs | 0:6b1b97df8a36 | 2 | #include "BLE.h" |
nakamura_bs | 0:6b1b97df8a36 | 3 | |
nakamura_bs | 0:6b1b97df8a36 | 4 | #include "board.h" |
nakamura_bs | 0:6b1b97df8a36 | 5 | |
nakamura_bs | 0:6b1b97df8a36 | 6 | #define VERSION_NUM 1 // 2018-11-28 |
nakamura_bs | 0:6b1b97df8a36 | 7 | const static char DEVICE_NAME[] = "btGPIO2"; |
nakamura_bs | 0:6b1b97df8a36 | 8 | |
nakamura_bs | 0:6b1b97df8a36 | 9 | #define NEED_CONSOLE_OUTPUT 1 |
nakamura_bs | 0:6b1b97df8a36 | 10 | /* Set this if you need debug messages on the console; |
nakamura_bs | 0:6b1b97df8a36 | 11 | * it will have an impact on code-size and power consumption. */ |
nakamura_bs | 0:6b1b97df8a36 | 12 | |
nakamura_bs | 0:6b1b97df8a36 | 13 | #if NEED_CONSOLE_OUTPUT |
nakamura_bs | 0:6b1b97df8a36 | 14 | Serial pc(DBG_TX, DBG_RX); // TX,RX default 9600bps |
nakamura_bs | 0:6b1b97df8a36 | 15 | #define DEBUG(...) { pc.printf(__VA_ARGS__); } |
nakamura_bs | 0:6b1b97df8a36 | 16 | #else |
nakamura_bs | 0:6b1b97df8a36 | 17 | #define DEBUG(...) /* nothing */ |
nakamura_bs | 0:6b1b97df8a36 | 18 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
nakamura_bs | 0:6b1b97df8a36 | 19 | |
nakamura_bs | 0:6b1b97df8a36 | 20 | |
nakamura_bs | 0:6b1b97df8a36 | 21 | #ifdef MICROBIT |
nakamura_bs | 0:6b1b97df8a36 | 22 | // micro:bit matrix-led |
nakamura_bs | 0:6b1b97df8a36 | 23 | DigitalOut col0(P0_4, 0); |
nakamura_bs | 0:6b1b97df8a36 | 24 | #endif |
nakamura_bs | 0:6b1b97df8a36 | 25 | DigitalOut LED_CONNECT(GPIO_LED_CONNECT); |
nakamura_bs | 0:6b1b97df8a36 | 26 | |
nakamura_bs | 0:6b1b97df8a36 | 27 | #define CMD_EXPORT 0x10 |
nakamura_bs | 0:6b1b97df8a36 | 28 | #define CMD_GPIO_WRITE 0x11 |
nakamura_bs | 0:6b1b97df8a36 | 29 | #define CMD_GPIO_READ 0x12 |
nakamura_bs | 0:6b1b97df8a36 | 30 | #define CMD_UNEXPORT 0x13 |
nakamura_bs | 0:6b1b97df8a36 | 31 | #define CMD_GPIO_EVENT 0x14 |
nakamura_bs | 0:6b1b97df8a36 | 32 | #define CMD_I2C_INIT 0x20 |
nakamura_bs | 0:6b1b97df8a36 | 33 | #define CMD_I2C_WRITE 0x21 |
nakamura_bs | 0:6b1b97df8a36 | 34 | #define CMD_I2C_RDBYTE 0x22 |
nakamura_bs | 0:6b1b97df8a36 | 35 | #define CMD_I2C_READ 0x23 |
nakamura_bs | 0:6b1b97df8a36 | 36 | #define CMD_ADC_INPUT 0x30 |
nakamura_bs | 0:6b1b97df8a36 | 37 | #define CMD_ADC_READ 0x31 |
nakamura_bs | 0:6b1b97df8a36 | 38 | |
nakamura_bs | 0:6b1b97df8a36 | 39 | |
nakamura_bs | 0:6b1b97df8a36 | 40 | // Bluetooth Low Energy |
nakamura_bs | 0:6b1b97df8a36 | 41 | BLE ble; |
nakamura_bs | 0:6b1b97df8a36 | 42 | static Gap::ConnectionParams_t connectionParams; |
nakamura_bs | 0:6b1b97df8a36 | 43 | |
nakamura_bs | 0:6b1b97df8a36 | 44 | // I2C 2-waire |
nakamura_bs | 0:6b1b97df8a36 | 45 | I2C i2c(I2C_SDA,I2C_SCL); |
nakamura_bs | 0:6b1b97df8a36 | 46 | #define MAX_I2C_TRANSFAR_SIZE 10 |
nakamura_bs | 0:6b1b97df8a36 | 47 | |
nakamura_bs | 0:6b1b97df8a36 | 48 | // Timer |
nakamura_bs | 0:6b1b97df8a36 | 49 | Ticker timerTask; |
nakamura_bs | 0:6b1b97df8a36 | 50 | |
nakamura_bs | 0:6b1b97df8a36 | 51 | /* |
nakamura_bs | 0:6b1b97df8a36 | 52 | * gpio bridge used UUID |
nakamura_bs | 0:6b1b97df8a36 | 53 | * ServiceUUID: 928a3d40-e8bf-4b2b-b443-66d2569aed50 |
nakamura_bs | 0:6b1b97df8a36 | 54 | * NotifyDataUUID: 928a3d41-e8bf-4b2b-b443-66d2569aed50 |
nakamura_bs | 0:6b1b97df8a36 | 55 | * WriteDataUUID: 928a3d42-e8bf-4b2b-b443-66d2569aed50 |
nakamura_bs | 0:6b1b97df8a36 | 56 | */ |
nakamura_bs | 0:6b1b97df8a36 | 57 | static const uint8_t UUID_GPIO_SERVICE[] = {0x92,0x8a,0x3d,0x40,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50}; |
nakamura_bs | 0:6b1b97df8a36 | 58 | static const uint8_t UUID_ADV_SERVICE[] = {0x50,0xed,0x9a,0x56,0xd2,0x66,0x43,0xb4,0x2b,0x4b,0xbf,0xe8,0x40,0x3d,0x8a,0x92}; |
nakamura_bs | 0:6b1b97df8a36 | 59 | static const uint8_t UUID_NOTIFY_DATA[] = {0x92,0x8a,0x3d,0x41,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50}; |
nakamura_bs | 0:6b1b97df8a36 | 60 | static const uint8_t UUID_WRITE_DATA[] = {0x92,0x8a,0x3d,0x42,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50}; |
nakamura_bs | 0:6b1b97df8a36 | 61 | static const uint8_t UUID_STAT_DATA[] = {0x92,0x8a,0x3d,0x43,0xe8,0xbf,0x4b,0x2b,0xb4,0x43,0x66,0xd2,0x56,0x9a,0xed,0x50}; |
nakamura_bs | 0:6b1b97df8a36 | 62 | |
nakamura_bs | 0:6b1b97df8a36 | 63 | uint8_t wrtData[20] = {0,}; |
nakamura_bs | 0:6b1b97df8a36 | 64 | GattCharacteristic gWrtCharacteristic (UUID_WRITE_DATA, wrtData, sizeof(wrtData), sizeof(wrtData), |
nakamura_bs | 0:6b1b97df8a36 | 65 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
nakamura_bs | 0:6b1b97df8a36 | 66 | |
nakamura_bs | 0:6b1b97df8a36 | 67 | uint8_t notifyData[20] = {0,}; |
nakamura_bs | 0:6b1b97df8a36 | 68 | GattCharacteristic gNotifyCharacteristic (UUID_NOTIFY_DATA, notifyData, sizeof(notifyData), sizeof(notifyData), |
nakamura_bs | 0:6b1b97df8a36 | 69 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
nakamura_bs | 0:6b1b97df8a36 | 70 | |
nakamura_bs | 0:6b1b97df8a36 | 71 | uint8_t statData[20] = {0,0}; |
nakamura_bs | 0:6b1b97df8a36 | 72 | GattCharacteristic gStatCharacteristic (UUID_STAT_DATA, statData, sizeof(statData), sizeof(statData), |
nakamura_bs | 0:6b1b97df8a36 | 73 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
nakamura_bs | 0:6b1b97df8a36 | 74 | |
nakamura_bs | 0:6b1b97df8a36 | 75 | GattCharacteristic *gGpioChars[] = {&gNotifyCharacteristic,&gWrtCharacteristic,&gStatCharacteristic}; |
nakamura_bs | 0:6b1b97df8a36 | 76 | GattService gGpioService = GattService(UUID_GPIO_SERVICE, gGpioChars, sizeof(gGpioChars) / sizeof(GattCharacteristic *)); |
nakamura_bs | 0:6b1b97df8a36 | 77 | |
nakamura_bs | 0:6b1b97df8a36 | 78 | int gConnect = 0; |
nakamura_bs | 0:6b1b97df8a36 | 79 | |
nakamura_bs | 0:6b1b97df8a36 | 80 | int gCmdLen = 0; |
nakamura_bs | 0:6b1b97df8a36 | 81 | uint8_t gCmdData[20] = {0,}; |
nakamura_bs | 0:6b1b97df8a36 | 82 | |
nakamura_bs | 0:6b1b97df8a36 | 83 | int gNotifyLen = 0; |
nakamura_bs | 0:6b1b97df8a36 | 84 | uint8_t gNotifyData[6] = {0x2,0x0,0x0,0x14,0,0}; |
nakamura_bs | 0:6b1b97df8a36 | 85 | int gScanGPIO = 0; |
nakamura_bs | 0:6b1b97df8a36 | 86 | |
nakamura_bs | 0:6b1b97df8a36 | 87 | /* ----GPIO Task----------------------------------------------------------------------- */ |
nakamura_bs | 0:6b1b97df8a36 | 88 | void gpioTask() { |
nakamura_bs | 0:6b1b97df8a36 | 89 | |
nakamura_bs | 0:6b1b97df8a36 | 90 | // LED_CONNECT = !LED_CONNECT; |
nakamura_bs | 0:6b1b97df8a36 | 91 | |
nakamura_bs | 0:6b1b97df8a36 | 92 | if (gNotifyLen >0) { // busy |
nakamura_bs | 0:6b1b97df8a36 | 93 | return; |
nakamura_bs | 0:6b1b97df8a36 | 94 | } |
nakamura_bs | 0:6b1b97df8a36 | 95 | |
nakamura_bs | 0:6b1b97df8a36 | 96 | for (int i=0; i<sizeof(validGpioPins); i++) { |
nakamura_bs | 0:6b1b97df8a36 | 97 | if (eventGpioPins[gScanGPIO] != 0) { // is event pins |
nakamura_bs | 0:6b1b97df8a36 | 98 | uint8_t rdGpio = gports[gScanGPIO]; |
nakamura_bs | 0:6b1b97df8a36 | 99 | if ( currentGpioLevel[gScanGPIO] != rdGpio) { |
nakamura_bs | 0:6b1b97df8a36 | 100 | DEBUG("GPIO status chenged port%d:%d\r\n",validGpioPins[gScanGPIO],rdGpio); |
nakamura_bs | 0:6b1b97df8a36 | 101 | currentGpioLevel[gScanGPIO] = rdGpio; |
nakamura_bs | 0:6b1b97df8a36 | 102 | gNotifyData[4] = gScanGPIO; |
nakamura_bs | 0:6b1b97df8a36 | 103 | gNotifyData[5] = rdGpio; |
nakamura_bs | 0:6b1b97df8a36 | 104 | gNotifyLen = 6; |
nakamura_bs | 0:6b1b97df8a36 | 105 | continue; |
nakamura_bs | 0:6b1b97df8a36 | 106 | } |
nakamura_bs | 0:6b1b97df8a36 | 107 | } |
nakamura_bs | 0:6b1b97df8a36 | 108 | gScanGPIO++; |
nakamura_bs | 0:6b1b97df8a36 | 109 | if (gScanGPIO > sizeof(validGpioPins)) { |
nakamura_bs | 0:6b1b97df8a36 | 110 | gScanGPIO = 0; |
nakamura_bs | 0:6b1b97df8a36 | 111 | } |
nakamura_bs | 0:6b1b97df8a36 | 112 | } |
nakamura_bs | 0:6b1b97df8a36 | 113 | } |
nakamura_bs | 0:6b1b97df8a36 | 114 | |
nakamura_bs | 0:6b1b97df8a36 | 115 | void reloadGpioCondition() { |
nakamura_bs | 0:6b1b97df8a36 | 116 | for (int i=0; i<sizeof(validGpioPins); i++) { |
nakamura_bs | 0:6b1b97df8a36 | 117 | if (eventGpioPins[i] != 0) { // is event pins |
nakamura_bs | 0:6b1b97df8a36 | 118 | uint8_t rdGpio = gports[i]; |
nakamura_bs | 0:6b1b97df8a36 | 119 | currentGpioLevel[i] = rdGpio; |
nakamura_bs | 0:6b1b97df8a36 | 120 | } |
nakamura_bs | 0:6b1b97df8a36 | 121 | } |
nakamura_bs | 0:6b1b97df8a36 | 122 | } |
nakamura_bs | 0:6b1b97df8a36 | 123 | |
nakamura_bs | 0:6b1b97df8a36 | 124 | void clearEventLists() { |
nakamura_bs | 0:6b1b97df8a36 | 125 | for (int i=0; i<sizeof(validGpioPins); i++) { |
nakamura_bs | 0:6b1b97df8a36 | 126 | eventGpioPins[i] = 0; |
nakamura_bs | 0:6b1b97df8a36 | 127 | } |
nakamura_bs | 0:6b1b97df8a36 | 128 | } |
nakamura_bs | 0:6b1b97df8a36 | 129 | |
nakamura_bs | 0:6b1b97df8a36 | 130 | void initGpio() { |
nakamura_bs | 0:6b1b97df8a36 | 131 | for (int i=0; i<sizeof(validGpioPins); i++) { |
nakamura_bs | 0:6b1b97df8a36 | 132 | int gpioNum = validGpioPins[i]; |
nakamura_bs | 0:6b1b97df8a36 | 133 | DEBUG("initGpio() 0x%x\r\n", gpioNum); |
nakamura_bs | 0:6b1b97df8a36 | 134 | gports[gpioNum].input(); // 端子を入力モード |
nakamura_bs | 0:6b1b97df8a36 | 135 | gports[gpioNum].mode(PullNone); // pullアップ/ダウンなし |
nakamura_bs | 0:6b1b97df8a36 | 136 | eventGpioPins[gpioNum] = 0; // イベント監視対象外 |
nakamura_bs | 0:6b1b97df8a36 | 137 | reloadGpioCondition(); // 設定を更新 |
nakamura_bs | 0:6b1b97df8a36 | 138 | } |
nakamura_bs | 0:6b1b97df8a36 | 139 | } |
nakamura_bs | 0:6b1b97df8a36 | 140 | |
nakamura_bs | 0:6b1b97df8a36 | 141 | /* --- BLE callbacks ------------------------------------------------------------------- */ |
nakamura_bs | 0:6b1b97df8a36 | 142 | void onDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) // Mod |
nakamura_bs | 0:6b1b97df8a36 | 143 | { |
nakamura_bs | 0:6b1b97df8a36 | 144 | DEBUG("Disconnected handle %u, reason %u\r\n", params->handle, params->reason); |
nakamura_bs | 0:6b1b97df8a36 | 145 | DEBUG("Restarting the advertising process\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 146 | DEBUG("Disconnected!\n\r"); |
nakamura_bs | 0:6b1b97df8a36 | 147 | timerTask.detach(); // stop timer |
nakamura_bs | 0:6b1b97df8a36 | 148 | gConnect = 0; |
nakamura_bs | 0:6b1b97df8a36 | 149 | clearEventLists(); |
nakamura_bs | 0:6b1b97df8a36 | 150 | |
nakamura_bs | 0:6b1b97df8a36 | 151 | LED_CONNECT = 0; |
nakamura_bs | 0:6b1b97df8a36 | 152 | ble.startAdvertising(); |
nakamura_bs | 0:6b1b97df8a36 | 153 | } |
nakamura_bs | 0:6b1b97df8a36 | 154 | |
nakamura_bs | 0:6b1b97df8a36 | 155 | #define BLE_INTERVAL_10MS 8 |
nakamura_bs | 0:6b1b97df8a36 | 156 | #define BLE_INTERVAL_12MS 10 |
nakamura_bs | 0:6b1b97df8a36 | 157 | #define BLE_INTERVAL_20MS 15 |
nakamura_bs | 0:6b1b97df8a36 | 158 | #define BLE_INTERVAL_30MS 23 |
nakamura_bs | 0:6b1b97df8a36 | 159 | #define BLE_INTERVAL_50MS 39 |
nakamura_bs | 0:6b1b97df8a36 | 160 | #define BLE_INTERVAL_62MS 50 |
nakamura_bs | 0:6b1b97df8a36 | 161 | #define BLE_INTERVAL_100MS 78 |
nakamura_bs | 0:6b1b97df8a36 | 162 | #define BLE_INTERVAL_125MS 100 |
nakamura_bs | 0:6b1b97df8a36 | 163 | |
nakamura_bs | 0:6b1b97df8a36 | 164 | void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) //Mod |
nakamura_bs | 0:6b1b97df8a36 | 165 | { |
nakamura_bs | 0:6b1b97df8a36 | 166 | DEBUG("Connected!\n\r"); |
nakamura_bs | 0:6b1b97df8a36 | 167 | LED_CONNECT = 1; |
nakamura_bs | 0:6b1b97df8a36 | 168 | ble.getPreferredConnectionParams(&connectionParams); |
nakamura_bs | 0:6b1b97df8a36 | 169 | // connectionParams.minConnectionInterval = BLE_INTERVAL_10MS; |
nakamura_bs | 0:6b1b97df8a36 | 170 | connectionParams.minConnectionInterval = BLE_INTERVAL_50MS; |
nakamura_bs | 0:6b1b97df8a36 | 171 | // connectionParams.minConnectionInterval = INTERVAL_100MS; |
nakamura_bs | 0:6b1b97df8a36 | 172 | |
nakamura_bs | 0:6b1b97df8a36 | 173 | // connectionParams.maxConnectionInterval = BLE_INTERVAL_12MS; |
nakamura_bs | 0:6b1b97df8a36 | 174 | connectionParams.maxConnectionInterval = BLE_INTERVAL_62MS; |
nakamura_bs | 0:6b1b97df8a36 | 175 | // connectionParams.maxConnectionInterval = BLE_INTERVAL_125MS; |
nakamura_bs | 0:6b1b97df8a36 | 176 | if (ble.updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) { |
nakamura_bs | 0:6b1b97df8a36 | 177 | DEBUG("failed to update connection paramter\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 178 | } |
nakamura_bs | 0:6b1b97df8a36 | 179 | gConnect = 1; |
nakamura_bs | 0:6b1b97df8a36 | 180 | timerTask.attach(&gpioTask, 0.1f); // start interval 100mS timer |
nakamura_bs | 0:6b1b97df8a36 | 181 | |
nakamura_bs | 0:6b1b97df8a36 | 182 | // set ready flag |
nakamura_bs | 0:6b1b97df8a36 | 183 | statData[0] = 0; |
nakamura_bs | 0:6b1b97df8a36 | 184 | statData[1] = VERSION_NUM; |
nakamura_bs | 0:6b1b97df8a36 | 185 | ble.gattServer().write(gStatCharacteristic.getValueAttribute().getHandle(), statData, 4); |
nakamura_bs | 0:6b1b97df8a36 | 186 | |
nakamura_bs | 0:6b1b97df8a36 | 187 | |
nakamura_bs | 0:6b1b97df8a36 | 188 | } |
nakamura_bs | 0:6b1b97df8a36 | 189 | |
nakamura_bs | 0:6b1b97df8a36 | 190 | void ConnectTimeoutCallback(Gap::TimeoutSource_t source) |
nakamura_bs | 0:6b1b97df8a36 | 191 | { |
nakamura_bs | 0:6b1b97df8a36 | 192 | ble.setAdvertisingTimeout(0); /* 0 is disable the advertising timeout. */ |
nakamura_bs | 0:6b1b97df8a36 | 193 | ble.startAdvertising(); |
nakamura_bs | 0:6b1b97df8a36 | 194 | } |
nakamura_bs | 0:6b1b97df8a36 | 195 | |
nakamura_bs | 0:6b1b97df8a36 | 196 | void DataWrittenCallback(const GattWriteCallbackParams *params) |
nakamura_bs | 0:6b1b97df8a36 | 197 | { |
nakamura_bs | 0:6b1b97df8a36 | 198 | uint8_t *wrtData = (uint8_t *)params->data; |
nakamura_bs | 0:6b1b97df8a36 | 199 | uint16_t wrtLen = params->len; |
nakamura_bs | 0:6b1b97df8a36 | 200 | |
nakamura_bs | 0:6b1b97df8a36 | 201 | memcpy(gCmdData,wrtData,wrtLen); |
nakamura_bs | 0:6b1b97df8a36 | 202 | gCmdLen = wrtLen; |
nakamura_bs | 0:6b1b97df8a36 | 203 | LED_CONNECT = 0; // busy condition |
nakamura_bs | 0:6b1b97df8a36 | 204 | |
nakamura_bs | 0:6b1b97df8a36 | 205 | DEBUG("rcv\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 206 | // DEBUG("DataWrittenCallback() len=%u data=", wrtLen); |
nakamura_bs | 0:6b1b97df8a36 | 207 | // for (int i=0; i< wrtLen; i++) { |
nakamura_bs | 0:6b1b97df8a36 | 208 | // DEBUG("0x%x,", *wrtData++); |
nakamura_bs | 0:6b1b97df8a36 | 209 | // } |
nakamura_bs | 0:6b1b97df8a36 | 210 | // DEBUG("\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 211 | |
nakamura_bs | 0:6b1b97df8a36 | 212 | } |
nakamura_bs | 0:6b1b97df8a36 | 213 | |
nakamura_bs | 0:6b1b97df8a36 | 214 | void UpdatesEnabledCallBack(Gap::Handle_t handle) |
nakamura_bs | 0:6b1b97df8a36 | 215 | { |
nakamura_bs | 0:6b1b97df8a36 | 216 | DEBUG("UpdatesEnabled\n\r"); |
nakamura_bs | 0:6b1b97df8a36 | 217 | // ユーザ処理コード |
nakamura_bs | 0:6b1b97df8a36 | 218 | } |
nakamura_bs | 0:6b1b97df8a36 | 219 | |
nakamura_bs | 0:6b1b97df8a36 | 220 | void UpdatesDisabledCallBack(Gap::Handle_t handle) |
nakamura_bs | 0:6b1b97df8a36 | 221 | { |
nakamura_bs | 0:6b1b97df8a36 | 222 | DEBUG("UpdatesDisabled\n\r"); |
nakamura_bs | 0:6b1b97df8a36 | 223 | // ユーザ処理コード |
nakamura_bs | 0:6b1b97df8a36 | 224 | } |
nakamura_bs | 0:6b1b97df8a36 | 225 | |
nakamura_bs | 0:6b1b97df8a36 | 226 | void DataSentCallback(unsigned count) |
nakamura_bs | 0:6b1b97df8a36 | 227 | { |
nakamura_bs | 0:6b1b97df8a36 | 228 | // DEBUG("DataSentCallback\n\r"); |
nakamura_bs | 0:6b1b97df8a36 | 229 | // ユーザ処理コード |
nakamura_bs | 0:6b1b97df8a36 | 230 | } |
nakamura_bs | 0:6b1b97df8a36 | 231 | |
nakamura_bs | 0:6b1b97df8a36 | 232 | /* --- test code ----------------------------------------------------------------------- */ |
nakamura_bs | 0:6b1b97df8a36 | 233 | int tako() { |
nakamura_bs | 0:6b1b97df8a36 | 234 | i2c.frequency(I2C_SPEED); |
nakamura_bs | 0:6b1b97df8a36 | 235 | char wReg[2] = {0x0,0x0}; |
nakamura_bs | 0:6b1b97df8a36 | 236 | char rReg[2] = {0,0}; |
nakamura_bs | 0:6b1b97df8a36 | 237 | |
nakamura_bs | 0:6b1b97df8a36 | 238 | i2c.start(); |
nakamura_bs | 0:6b1b97df8a36 | 239 | int val = i2c.write(0x48<<1); |
nakamura_bs | 0:6b1b97df8a36 | 240 | i2c.stop(); |
nakamura_bs | 0:6b1b97df8a36 | 241 | DEBUG("write val %d\r\n",val); |
nakamura_bs | 0:6b1b97df8a36 | 242 | |
nakamura_bs | 0:6b1b97df8a36 | 243 | #if 1 |
nakamura_bs | 0:6b1b97df8a36 | 244 | if (i2c.write(0x48<<1, wReg, 0) == 0) { |
nakamura_bs | 0:6b1b97df8a36 | 245 | DEBUG("write ok\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 246 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 247 | DEBUG("write NG\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 248 | } |
nakamura_bs | 0:6b1b97df8a36 | 249 | #endif |
nakamura_bs | 0:6b1b97df8a36 | 250 | // i2c.write(0x48, wReg, 1); |
nakamura_bs | 0:6b1b97df8a36 | 251 | #if 1 |
nakamura_bs | 0:6b1b97df8a36 | 252 | if (i2c.read(0x48<<1, rReg, 2) == 0) { |
nakamura_bs | 0:6b1b97df8a36 | 253 | DEBUG("read ok\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 254 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 255 | DEBUG("read ng\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 256 | } |
nakamura_bs | 0:6b1b97df8a36 | 257 | |
nakamura_bs | 0:6b1b97df8a36 | 258 | DEBUG("read sensor data="); |
nakamura_bs | 0:6b1b97df8a36 | 259 | for (int i=0; i< 2; i++) { |
nakamura_bs | 0:6b1b97df8a36 | 260 | DEBUG("0x%x,", rReg[i]); |
nakamura_bs | 0:6b1b97df8a36 | 261 | } |
nakamura_bs | 0:6b1b97df8a36 | 262 | DEBUG("\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 263 | #endif |
nakamura_bs | 0:6b1b97df8a36 | 264 | return 0; |
nakamura_bs | 0:6b1b97df8a36 | 265 | } |
nakamura_bs | 0:6b1b97df8a36 | 266 | |
nakamura_bs | 0:6b1b97df8a36 | 267 | /* --- user task ----------------------------------------------------------------------- */ |
nakamura_bs | 0:6b1b97df8a36 | 268 | int checkGPIO(int gpioNum) { |
nakamura_bs | 0:6b1b97df8a36 | 269 | for (int i=0; i<sizeof(validGpioPins); i++) { |
nakamura_bs | 0:6b1b97df8a36 | 270 | if (validGpioPins[i] == gpioNum) { |
nakamura_bs | 0:6b1b97df8a36 | 271 | return i; |
nakamura_bs | 0:6b1b97df8a36 | 272 | } |
nakamura_bs | 0:6b1b97df8a36 | 273 | } |
nakamura_bs | 0:6b1b97df8a36 | 274 | DEBUG("Invalid GPIO number %d\r\n",gpioNum); |
nakamura_bs | 0:6b1b97df8a36 | 275 | return -1; |
nakamura_bs | 0:6b1b97df8a36 | 276 | } |
nakamura_bs | 0:6b1b97df8a36 | 277 | |
nakamura_bs | 0:6b1b97df8a36 | 278 | // ホストからのコマンドを処理 |
nakamura_bs | 0:6b1b97df8a36 | 279 | void commandTask() { |
nakamura_bs | 0:6b1b97df8a36 | 280 | uint8_t response[20] = {1,2,3,4}; |
nakamura_bs | 0:6b1b97df8a36 | 281 | int responseSize = 5; |
nakamura_bs | 0:6b1b97df8a36 | 282 | int gpioNum = -1; |
nakamura_bs | 0:6b1b97df8a36 | 283 | char i2cWrBuf[MAX_I2C_TRANSFAR_SIZE] = {0,}; |
nakamura_bs | 0:6b1b97df8a36 | 284 | char i2cRdBuf[MAX_I2C_TRANSFAR_SIZE] = {0,}; |
nakamura_bs | 0:6b1b97df8a36 | 285 | |
nakamura_bs | 0:6b1b97df8a36 | 286 | memcpy(response,gCmdData,4); // コマンドヘッダ部分をレスポンスデータにコピー |
nakamura_bs | 0:6b1b97df8a36 | 287 | |
nakamura_bs | 0:6b1b97df8a36 | 288 | switch (gCmdData[3]) { |
nakamura_bs | 0:6b1b97df8a36 | 289 | case CMD_EXPORT: // use GPIO port |
nakamura_bs | 0:6b1b97df8a36 | 290 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 291 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 292 | // gCmdData[5] : 0=outpt 1=input |
nakamura_bs | 0:6b1b97df8a36 | 293 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 294 | // response[4] : 1=accept 1=reject |
nakamura_bs | 0:6b1b97df8a36 | 295 | gpioNum = checkGPIO(gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 296 | if (gpioNum < 0) { |
nakamura_bs | 0:6b1b97df8a36 | 297 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 298 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 299 | if (gCmdData[5] == 0) { |
nakamura_bs | 0:6b1b97df8a36 | 300 | DEBUG("set GPIO output %d\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 301 | gports[gpioNum] = 0; // inital state low |
nakamura_bs | 0:6b1b97df8a36 | 302 | gports[gpioNum].output(); |
nakamura_bs | 0:6b1b97df8a36 | 303 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 304 | DEBUG("set GPIO input %d\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 305 | gports[gpioNum].input(); |
nakamura_bs | 0:6b1b97df8a36 | 306 | gports[gpioNum].mode(PullUp); // 内蔵プルアップを使う |
nakamura_bs | 0:6b1b97df8a36 | 307 | // gports[gpioNum].mode( PullDown ); / 内蔵プルダウンを使う |
nakamura_bs | 0:6b1b97df8a36 | 308 | eventGpioPins[gpioNum] = 1; // イベント監視対象 |
nakamura_bs | 0:6b1b97df8a36 | 309 | reloadGpioCondition(); |
nakamura_bs | 0:6b1b97df8a36 | 310 | } |
nakamura_bs | 0:6b1b97df8a36 | 311 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 312 | } |
nakamura_bs | 0:6b1b97df8a36 | 313 | break; |
nakamura_bs | 0:6b1b97df8a36 | 314 | |
nakamura_bs | 0:6b1b97df8a36 | 315 | case CMD_UNEXPORT: // GPIO port input |
nakamura_bs | 0:6b1b97df8a36 | 316 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 317 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 318 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 319 | // response[4] : 1=accept 1=reject |
nakamura_bs | 0:6b1b97df8a36 | 320 | gpioNum = checkGPIO(gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 321 | if (gpioNum < 0) { |
nakamura_bs | 0:6b1b97df8a36 | 322 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 323 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 324 | gports[gpioNum].input(); // 端子を入力として解放 |
nakamura_bs | 0:6b1b97df8a36 | 325 | gports[gpioNum].mode(PullNone); |
nakamura_bs | 0:6b1b97df8a36 | 326 | eventGpioPins[gpioNum] = 0; // イベント監視対象外 |
nakamura_bs | 0:6b1b97df8a36 | 327 | reloadGpioCondition(); |
nakamura_bs | 0:6b1b97df8a36 | 328 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 329 | } |
nakamura_bs | 0:6b1b97df8a36 | 330 | break; |
nakamura_bs | 0:6b1b97df8a36 | 331 | |
nakamura_bs | 0:6b1b97df8a36 | 332 | case CMD_GPIO_WRITE: // GPIO port write |
nakamura_bs | 0:6b1b97df8a36 | 333 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 334 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 335 | // gCmdData[5] : 0=low 1=high |
nakamura_bs | 0:6b1b97df8a36 | 336 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 337 | // response[4] : 1=accept 0=reject |
nakamura_bs | 0:6b1b97df8a36 | 338 | gpioNum = checkGPIO(gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 339 | if (gpioNum < 0) { |
nakamura_bs | 0:6b1b97df8a36 | 340 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 341 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 342 | gports[gpioNum] = gCmdData[5]; |
nakamura_bs | 0:6b1b97df8a36 | 343 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 344 | } |
nakamura_bs | 0:6b1b97df8a36 | 345 | break; |
nakamura_bs | 0:6b1b97df8a36 | 346 | |
nakamura_bs | 0:6b1b97df8a36 | 347 | case CMD_GPIO_READ: // GPIO port write |
nakamura_bs | 0:6b1b97df8a36 | 348 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 349 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 350 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 351 | // response[4] : 1=accept 0=reject |
nakamura_bs | 0:6b1b97df8a36 | 352 | // response[5] : port condition 0=low 1=high |
nakamura_bs | 0:6b1b97df8a36 | 353 | gpioNum = checkGPIO(gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 354 | if (gpioNum < 0) { |
nakamura_bs | 0:6b1b97df8a36 | 355 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 356 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 357 | gports[gpioNum] = gCmdData[5]; |
nakamura_bs | 0:6b1b97df8a36 | 358 | if (gports[gpioNum] ==0) { |
nakamura_bs | 0:6b1b97df8a36 | 359 | response[5] = 0; // Low |
nakamura_bs | 0:6b1b97df8a36 | 360 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 361 | response[5] = 1; // High |
nakamura_bs | 0:6b1b97df8a36 | 362 | } |
nakamura_bs | 0:6b1b97df8a36 | 363 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 364 | responseSize += 1; |
nakamura_bs | 0:6b1b97df8a36 | 365 | } |
nakamura_bs | 0:6b1b97df8a36 | 366 | break; |
nakamura_bs | 0:6b1b97df8a36 | 367 | |
nakamura_bs | 0:6b1b97df8a36 | 368 | case CMD_I2C_INIT: // I2C test access |
nakamura_bs | 0:6b1b97df8a36 | 369 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 370 | // gCmdData[4] : slave I2C address |
nakamura_bs | 0:6b1b97df8a36 | 371 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 372 | // response[4] : 1=accept 1=reject |
nakamura_bs | 0:6b1b97df8a36 | 373 | i2cWrBuf[0] =0; |
nakamura_bs | 0:6b1b97df8a36 | 374 | if (i2c.write(gCmdData[4]<<1, i2cWrBuf, 0) == 0) { |
nakamura_bs | 0:6b1b97df8a36 | 375 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 376 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 377 | DEBUG("I2C write error address=%x\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 378 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 379 | } |
nakamura_bs | 0:6b1b97df8a36 | 380 | break; |
nakamura_bs | 0:6b1b97df8a36 | 381 | |
nakamura_bs | 0:6b1b97df8a36 | 382 | case CMD_I2C_READ: // I2C read |
nakamura_bs | 0:6b1b97df8a36 | 383 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 384 | // gCmdData[4] : slave I2C address |
nakamura_bs | 0:6b1b97df8a36 | 385 | // gCmdData[5] : sub-address |
nakamura_bs | 0:6b1b97df8a36 | 386 | // gCmdData[6] : length |
nakamura_bs | 0:6b1b97df8a36 | 387 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 388 | // response[4] : read data length / 0=reject |
nakamura_bs | 0:6b1b97df8a36 | 389 | // response[5] : read data |
nakamura_bs | 0:6b1b97df8a36 | 390 | if ((gCmdData[6] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[6] < 1)) { |
nakamura_bs | 0:6b1b97df8a36 | 391 | DEBUG("I2C write error invalid length=%d\r\n",gCmdData[6]); |
nakamura_bs | 0:6b1b97df8a36 | 392 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 393 | break; |
nakamura_bs | 0:6b1b97df8a36 | 394 | } |
nakamura_bs | 0:6b1b97df8a36 | 395 | i2cWrBuf[0] = gCmdData[5]; |
nakamura_bs | 0:6b1b97df8a36 | 396 | if (i2c.write(gCmdData[4]<<1, i2cWrBuf, 1, true) != 0) { // Repeat condision |
nakamura_bs | 0:6b1b97df8a36 | 397 | DEBUG("I2C write error address=%x\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 398 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 399 | break; |
nakamura_bs | 0:6b1b97df8a36 | 400 | } |
nakamura_bs | 0:6b1b97df8a36 | 401 | if (i2c.read(gCmdData[4]<<1, i2cRdBuf, gCmdData[6]) != 0) { |
nakamura_bs | 0:6b1b97df8a36 | 402 | DEBUG("I2C read error address=%x\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 403 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 404 | break; |
nakamura_bs | 0:6b1b97df8a36 | 405 | } |
nakamura_bs | 0:6b1b97df8a36 | 406 | // DEBUG("I2C read ok\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 407 | memcpy(&response[5],i2cRdBuf,gCmdData[6]); |
nakamura_bs | 0:6b1b97df8a36 | 408 | response[4] = gCmdData[6]; // read size |
nakamura_bs | 0:6b1b97df8a36 | 409 | responseSize += gCmdData[6]; |
nakamura_bs | 0:6b1b97df8a36 | 410 | break; |
nakamura_bs | 0:6b1b97df8a36 | 411 | |
nakamura_bs | 0:6b1b97df8a36 | 412 | case CMD_I2C_RDBYTE: |
nakamura_bs | 0:6b1b97df8a36 | 413 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 414 | // gCmdData[4] : slave I2C address |
nakamura_bs | 0:6b1b97df8a36 | 415 | // gCmdData[5] : length |
nakamura_bs | 0:6b1b97df8a36 | 416 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 417 | // response[4] : read data length / 0=reject |
nakamura_bs | 0:6b1b97df8a36 | 418 | // response[5] : read data |
nakamura_bs | 0:6b1b97df8a36 | 419 | if ((gCmdData[5] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[5] < 1)) { |
nakamura_bs | 0:6b1b97df8a36 | 420 | DEBUG("I2C write error invalid length=%d\r\n",gCmdData[5]); |
nakamura_bs | 0:6b1b97df8a36 | 421 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 422 | break; |
nakamura_bs | 0:6b1b97df8a36 | 423 | } |
nakamura_bs | 0:6b1b97df8a36 | 424 | if (i2c.read(gCmdData[4]<<1, i2cRdBuf, gCmdData[5]) != 0) { |
nakamura_bs | 0:6b1b97df8a36 | 425 | DEBUG("I2C read error address=%x\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 426 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 427 | break; |
nakamura_bs | 0:6b1b97df8a36 | 428 | } |
nakamura_bs | 0:6b1b97df8a36 | 429 | // DEBUG("read ok\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 430 | memcpy(&response[5],i2cRdBuf,gCmdData[5]); |
nakamura_bs | 0:6b1b97df8a36 | 431 | response[4] = gCmdData[5]; // read size |
nakamura_bs | 0:6b1b97df8a36 | 432 | responseSize += gCmdData[5]; |
nakamura_bs | 0:6b1b97df8a36 | 433 | break; |
nakamura_bs | 0:6b1b97df8a36 | 434 | |
nakamura_bs | 0:6b1b97df8a36 | 435 | case CMD_I2C_WRITE: // I2C write |
nakamura_bs | 0:6b1b97df8a36 | 436 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 437 | // gCmdData[4] : slave I2C address |
nakamura_bs | 0:6b1b97df8a36 | 438 | // gCmdData[5] : length |
nakamura_bs | 0:6b1b97df8a36 | 439 | // gCmdData[6] : write data |
nakamura_bs | 0:6b1b97df8a36 | 440 | // gCmdData[7] ... |
nakamura_bs | 0:6b1b97df8a36 | 441 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 442 | // response[4] : 1=accept 1=reject |
nakamura_bs | 0:6b1b97df8a36 | 443 | if ((gCmdData[5] > MAX_I2C_TRANSFAR_SIZE) || (gCmdData[5] < 1)) { |
nakamura_bs | 0:6b1b97df8a36 | 444 | DEBUG("I2C write error invalid length=%d\r\n",gCmdData[5]); |
nakamura_bs | 0:6b1b97df8a36 | 445 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 446 | break; |
nakamura_bs | 0:6b1b97df8a36 | 447 | } |
nakamura_bs | 0:6b1b97df8a36 | 448 | memcpy(i2cWrBuf,&gCmdData[6],gCmdData[5]); |
nakamura_bs | 0:6b1b97df8a36 | 449 | if (i2c.write(gCmdData[4]<<1, i2cWrBuf, gCmdData[5]) != 0) { // Repeat condision |
nakamura_bs | 0:6b1b97df8a36 | 450 | DEBUG("I2C write error address=%x\r\n",gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 451 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 452 | break; |
nakamura_bs | 0:6b1b97df8a36 | 453 | } |
nakamura_bs | 0:6b1b97df8a36 | 454 | |
nakamura_bs | 0:6b1b97df8a36 | 455 | response[4] = gCmdData[5]; // return complite transfar size |
nakamura_bs | 0:6b1b97df8a36 | 456 | break; |
nakamura_bs | 0:6b1b97df8a36 | 457 | |
nakamura_bs | 0:6b1b97df8a36 | 458 | #if 0 |
nakamura_bs | 0:6b1b97df8a36 | 459 | case CMD_ADC_INPUT: |
nakamura_bs | 0:6b1b97df8a36 | 460 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 461 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 462 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 463 | // response[4] : 1=accept 1=reject |
nakamura_bs | 0:6b1b97df8a36 | 464 | gpioNum = checkGPIO(gCmdData[4]); |
nakamura_bs | 0:6b1b97df8a36 | 465 | if ((gpioNum < 1) || (gpioNum > 6)) { |
nakamura_bs | 0:6b1b97df8a36 | 466 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 467 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 468 | gports[gpioNum].input(); // 端子を入力として解放 |
nakamura_bs | 0:6b1b97df8a36 | 469 | gports[gpioNum].mode(PullNone); |
nakamura_bs | 0:6b1b97df8a36 | 470 | eventGpioPins[gpioNum] = 0; // イベント監視対象外 |
nakamura_bs | 0:6b1b97df8a36 | 471 | reloadGpioCondition(); |
nakamura_bs | 0:6b1b97df8a36 | 472 | |
nakamura_bs | 0:6b1b97df8a36 | 473 | // ADC setting |
nakamura_bs | 0:6b1b97df8a36 | 474 | // 10bit Reference internal Bandcap(1.2V) |
nakamura_bs | 0:6b1b97df8a36 | 475 | NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) | |
nakamura_bs | 0:6b1b97df8a36 | 476 | (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) | |
nakamura_bs | 0:6b1b97df8a36 | 477 | (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) | |
nakamura_bs | 0:6b1b97df8a36 | 478 | (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos); |
nakamura_bs | 0:6b1b97df8a36 | 479 | response[4] = 1; // OK |
nakamura_bs | 0:6b1b97df8a36 | 480 | } |
nakamura_bs | 0:6b1b97df8a36 | 481 | break; |
nakamura_bs | 0:6b1b97df8a36 | 482 | |
nakamura_bs | 0:6b1b97df8a36 | 483 | case CMD_ADC_READ: |
nakamura_bs | 0:6b1b97df8a36 | 484 | // input: |
nakamura_bs | 0:6b1b97df8a36 | 485 | // gCmdData[4] : target port number |
nakamura_bs | 0:6b1b97df8a36 | 486 | // output: |
nakamura_bs | 0:6b1b97df8a36 | 487 | // response[4] : read data length(fixed 2) / 0=reject |
nakamura_bs | 0:6b1b97df8a36 | 488 | // response[5] : read data(MSB) |
nakamura_bs | 0:6b1b97df8a36 | 489 | // response[6] : read data(LSB) |
nakamura_bs | 0:6b1b97df8a36 | 490 | gpioNum = gCmdData[4]; |
nakamura_bs | 0:6b1b97df8a36 | 491 | if ((gpioNum < 1) || (gpioNum > 6)) { |
nakamura_bs | 0:6b1b97df8a36 | 492 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 493 | } else { |
nakamura_bs | 0:6b1b97df8a36 | 494 | NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk; |
nakamura_bs | 0:6b1b97df8a36 | 495 | NRF_ADC->CONFIG |= (4 << gpioNum) << ADC_CONFIG_PSEL_Pos; |
nakamura_bs | 0:6b1b97df8a36 | 496 | NRF_ADC->TASKS_START = 1; |
nakamura_bs | 0:6b1b97df8a36 | 497 | while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) { |
nakamura_bs | 0:6b1b97df8a36 | 498 | } |
nakamura_bs | 0:6b1b97df8a36 | 499 | uint16_t advalue = (uint16_t)NRF_ADC->RESULT; // 10 bit |
nakamura_bs | 0:6b1b97df8a36 | 500 | DEBUG("read adc %d =%x\r\n",gpioNum, advalue); |
nakamura_bs | 0:6b1b97df8a36 | 501 | response[5] = advalue >> 8; |
nakamura_bs | 0:6b1b97df8a36 | 502 | response[6] = advalue && 0xff; |
nakamura_bs | 0:6b1b97df8a36 | 503 | responseSize += 2; |
nakamura_bs | 0:6b1b97df8a36 | 504 | } |
nakamura_bs | 0:6b1b97df8a36 | 505 | break; |
nakamura_bs | 0:6b1b97df8a36 | 506 | #endif |
nakamura_bs | 0:6b1b97df8a36 | 507 | |
nakamura_bs | 0:6b1b97df8a36 | 508 | default: |
nakamura_bs | 0:6b1b97df8a36 | 509 | DEBUG("unknonwn command =%x\r\n",gCmdData[3]); |
nakamura_bs | 0:6b1b97df8a36 | 510 | response[4] = 0; // error |
nakamura_bs | 0:6b1b97df8a36 | 511 | break; |
nakamura_bs | 0:6b1b97df8a36 | 512 | |
nakamura_bs | 0:6b1b97df8a36 | 513 | } |
nakamura_bs | 0:6b1b97df8a36 | 514 | |
nakamura_bs | 0:6b1b97df8a36 | 515 | DEBUG("reply\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 516 | // DEBUG("send Notify len=%u data=", responseSize); |
nakamura_bs | 0:6b1b97df8a36 | 517 | // for (int i=0; i< responseSize; i++) { |
nakamura_bs | 0:6b1b97df8a36 | 518 | // DEBUG("0x%x,", response[i]); |
nakamura_bs | 0:6b1b97df8a36 | 519 | // } |
nakamura_bs | 0:6b1b97df8a36 | 520 | // DEBUG("\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 521 | |
nakamura_bs | 0:6b1b97df8a36 | 522 | // send response (notify) |
nakamura_bs | 0:6b1b97df8a36 | 523 | ble.gattServer().write(gNotifyCharacteristic.getValueAttribute().getHandle(), response, responseSize); |
nakamura_bs | 0:6b1b97df8a36 | 524 | LED_CONNECT = 1; // ready |
nakamura_bs | 0:6b1b97df8a36 | 525 | |
nakamura_bs | 0:6b1b97df8a36 | 526 | } |
nakamura_bs | 0:6b1b97df8a36 | 527 | |
nakamura_bs | 0:6b1b97df8a36 | 528 | /* --- main code ----------------------------------------------------------------------- */ |
nakamura_bs | 0:6b1b97df8a36 | 529 | int main() { |
nakamura_bs | 0:6b1b97df8a36 | 530 | LED_CONNECT = 1; |
nakamura_bs | 0:6b1b97df8a36 | 531 | gCmdLen = 0; |
nakamura_bs | 0:6b1b97df8a36 | 532 | gConnect = 0; |
nakamura_bs | 0:6b1b97df8a36 | 533 | gScanGPIO = 0; |
nakamura_bs | 0:6b1b97df8a36 | 534 | |
nakamura_bs | 0:6b1b97df8a36 | 535 | initGpio(); |
nakamura_bs | 0:6b1b97df8a36 | 536 | DEBUG("PowerON version %d\n\r",VERSION_NUM); |
nakamura_bs | 0:6b1b97df8a36 | 537 | |
nakamura_bs | 0:6b1b97df8a36 | 538 | /* Initialise the nRF51822 */ |
nakamura_bs | 0:6b1b97df8a36 | 539 | ble.init(); |
nakamura_bs | 0:6b1b97df8a36 | 540 | |
nakamura_bs | 0:6b1b97df8a36 | 541 | /* Setup The event handlers */ |
nakamura_bs | 0:6b1b97df8a36 | 542 | ble.onConnection(onConnectionCallback); |
nakamura_bs | 0:6b1b97df8a36 | 543 | ble.onDisconnection(onDisconnectionCallback); |
nakamura_bs | 0:6b1b97df8a36 | 544 | ble.onTimeout(ConnectTimeoutCallback); |
nakamura_bs | 0:6b1b97df8a36 | 545 | |
nakamura_bs | 0:6b1b97df8a36 | 546 | ble.onDataWritten(DataWrittenCallback); |
nakamura_bs | 0:6b1b97df8a36 | 547 | ble.onDataSent(DataSentCallback); |
nakamura_bs | 0:6b1b97df8a36 | 548 | ble.onUpdatesEnabled(UpdatesEnabledCallBack); |
nakamura_bs | 0:6b1b97df8a36 | 549 | ble.onUpdatesDisabled(UpdatesDisabledCallBack); |
nakamura_bs | 0:6b1b97df8a36 | 550 | |
nakamura_bs | 0:6b1b97df8a36 | 551 | |
nakamura_bs | 0:6b1b97df8a36 | 552 | /* setup advertising */ |
nakamura_bs | 0:6b1b97df8a36 | 553 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
nakamura_bs | 0:6b1b97df8a36 | 554 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
nakamura_bs | 0:6b1b97df8a36 | 555 | |
nakamura_bs | 0:6b1b97df8a36 | 556 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
nakamura_bs | 0:6b1b97df8a36 | 557 | (const uint8_t *)UUID_ADV_SERVICE, sizeof(UUID_ADV_SERVICE)); |
nakamura_bs | 0:6b1b97df8a36 | 558 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
nakamura_bs | 0:6b1b97df8a36 | 559 | (const uint8_t *)DEVICE_NAME, |
nakamura_bs | 0:6b1b97df8a36 | 560 | strlen(DEVICE_NAME)); |
nakamura_bs | 0:6b1b97df8a36 | 561 | ble.gap().setAdvertisingInterval(80); /* 50ms; in multiples of 0.625ms. */ |
nakamura_bs | 0:6b1b97df8a36 | 562 | ble.gap().startAdvertising(); |
nakamura_bs | 0:6b1b97df8a36 | 563 | DEBUG("Start Advertising\r\n"); |
nakamura_bs | 0:6b1b97df8a36 | 564 | |
nakamura_bs | 0:6b1b97df8a36 | 565 | ble.addService(gGpioService); |
nakamura_bs | 0:6b1b97df8a36 | 566 | |
nakamura_bs | 0:6b1b97df8a36 | 567 | // tako(); |
nakamura_bs | 0:6b1b97df8a36 | 568 | LED_CONNECT = 0; |
nakamura_bs | 0:6b1b97df8a36 | 569 | for (;; ) { |
nakamura_bs | 0:6b1b97df8a36 | 570 | ble.waitForEvent(); |
nakamura_bs | 0:6b1b97df8a36 | 571 | if (gCmdLen > 0) { |
nakamura_bs | 0:6b1b97df8a36 | 572 | commandTask(); |
nakamura_bs | 0:6b1b97df8a36 | 573 | gCmdLen =0; |
nakamura_bs | 0:6b1b97df8a36 | 574 | } else if (gNotifyLen > 0) { |
nakamura_bs | 0:6b1b97df8a36 | 575 | ble.gattServer().write(gNotifyCharacteristic.getValueAttribute().getHandle(), gNotifyData, gNotifyLen); |
nakamura_bs | 0:6b1b97df8a36 | 576 | gNotifyLen = 0; |
nakamura_bs | 0:6b1b97df8a36 | 577 | } |
nakamura_bs | 0:6b1b97df8a36 | 578 | } |
nakamura_bs | 0:6b1b97df8a36 | 579 | |
nakamura_bs | 0:6b1b97df8a36 | 580 | } |