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