BLE switch interface using micro:bit with 3 tact switches or 3 Makey Makey sensors

Dependencies:   microbit

Committer:
masakjm
Date:
Thu Jun 06 19:06:06 2019 +0000
Revision:
1:9d0e2e5b5d25
Child:
2:8e2e6c6658be

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masakjm 1:9d0e2e5b5d25 1 //=================================
masakjm 1:9d0e2e5b5d25 2 // microbit_switch_if_3sw
masakjm 1:9d0e2e5b5d25 3 //=================================
masakjm 1:9d0e2e5b5d25 4 // BLE switch interface with 3 tact switches for micro:bit
masakjm 1:9d0e2e5b5d25 5 // The MIT License (MIT) Copyright (c) 2019 Masatomo Kojima
masakjm 1:9d0e2e5b5d25 6
masakjm 1:9d0e2e5b5d25 7 #include "mbed.h"
masakjm 1:9d0e2e5b5d25 8 #include "MicroBit.h"
masakjm 1:9d0e2e5b5d25 9 #include "ble/services/BatteryService.h"
masakjm 1:9d0e2e5b5d25 10 #include "KeyboardService.h"
masakjm 1:9d0e2e5b5d25 11 #include "Keyboard_types.h"
masakjm 1:9d0e2e5b5d25 12 #include "HIDServiceBase.h"
masakjm 1:9d0e2e5b5d25 13 #include "HIDDeviceInformationService.h"
masakjm 1:9d0e2e5b5d25 14
masakjm 1:9d0e2e5b5d25 15 //----------------------
masakjm 1:9d0e2e5b5d25 16 // Keybord
masakjm 1:9d0e2e5b5d25 17 //----------------------
masakjm 1:9d0e2e5b5d25 18 #define MODIFY_CTRL 0x100
masakjm 1:9d0e2e5b5d25 19 #define MODIFY_SHIFT 0x200
masakjm 1:9d0e2e5b5d25 20 #define MODIFY_OPTION 0x400 /* option or alt */
masakjm 1:9d0e2e5b5d25 21 #define MODIFY_COMMAND 0x800 /* command or Windows */
masakjm 1:9d0e2e5b5d25 22
masakjm 1:9d0e2e5b5d25 23 const int KEY_BS = 8; /* Keyboard Backspace */
masakjm 1:9d0e2e5b5d25 24 const int KEY_TAB = 9; /* Keyboard Tab */
masakjm 1:9d0e2e5b5d25 25 const int KEY_ENTER = 10; /* Keyboard Return (Enter) */
masakjm 1:9d0e2e5b5d25 26 //const int KEY_ESC = 27; /* Keyboard Escape */
masakjm 1:9d0e2e5b5d25 27 const int KEY_SPACE = 32; /* Keyboard Space */
masakjm 1:9d0e2e5b5d25 28
masakjm 1:9d0e2e5b5d25 29 const int KEY_EQUAL = 0x2b; /* = */
masakjm 1:9d0e2e5b5d25 30 const int KEY_COMMA = 0x2c; /* , */
masakjm 1:9d0e2e5b5d25 31 const int KEY_MINUS = 0x2d; /* - */
masakjm 1:9d0e2e5b5d25 32 const int KEY_PIRIOD = 0x2e; /* . */
masakjm 1:9d0e2e5b5d25 33 const int KEY_SLASH = 0x2f; /* / */
masakjm 1:9d0e2e5b5d25 34 const int KEY_QUOT = 0x40; /* ' */
masakjm 1:9d0e2e5b5d25 35
masakjm 1:9d0e2e5b5d25 36 const int KEY_PLUS = MODIFY_SHIFT +0x2b; /* + */
masakjm 1:9d0e2e5b5d25 37 const int KEY_LT = MODIFY_SHIFT +0x2c; /* < */
masakjm 1:9d0e2e5b5d25 38 const int KEY_UNDER = MODIFY_SHIFT +0x2d; /* _ */
masakjm 1:9d0e2e5b5d25 39 const int KEY_GT = MODIFY_SHIFT +0x2e; /* > */
masakjm 1:9d0e2e5b5d25 40 const int KEY_QUESTION = MODIFY_SHIFT +0x2f; /* ? */
masakjm 1:9d0e2e5b5d25 41 const int KEY_RBRACKET = MODIFY_SHIFT +0x30; /* ) shif+0 */
masakjm 1:9d0e2e5b5d25 42 const int KEY_EXCLA = MODIFY_SHIFT +0x31; /* ! shif+1 */
masakjm 1:9d0e2e5b5d25 43 const int KEY_AT = MODIFY_SHIFT +0x32; /* @ shif+2 */
masakjm 1:9d0e2e5b5d25 44 const int KEY_NUMBER = MODIFY_SHIFT +0x33; /* # shif+3 */
masakjm 1:9d0e2e5b5d25 45 const int KEY_DOLL = MODIFY_SHIFT +0x34; /* $ shif+4 */
masakjm 1:9d0e2e5b5d25 46 const int KEY_PERCENT = MODIFY_SHIFT +0x35; /* % shif+5 */
masakjm 1:9d0e2e5b5d25 47 const int KEY_CARET = MODIFY_SHIFT +0x36; /* ^ shif+6 */
masakjm 1:9d0e2e5b5d25 48 const int KEY_AMP = MODIFY_SHIFT +0x37; /* & shif+7 */
masakjm 1:9d0e2e5b5d25 49 const int KEY_ASTERISK = MODIFY_SHIFT +0x38; /* * shif+8 */
masakjm 1:9d0e2e5b5d25 50 const int KEY_LBRACKET = MODIFY_SHIFT +0x39; /* ( shif+9 */
masakjm 1:9d0e2e5b5d25 51 const int KEY_DBLQUOT = MODIFY_SHIFT +0x40; /* " */
masakjm 1:9d0e2e5b5d25 52
masakjm 1:9d0e2e5b5d25 53 //----------------------
masakjm 1:9d0e2e5b5d25 54 // Setting
masakjm 1:9d0e2e5b5d25 55 //----------------------
masakjm 1:9d0e2e5b5d25 56 #define NUM_GROUP1 7
masakjm 1:9d0e2e5b5d25 57 #define NUM_G1MEMBER 3
masakjm 1:9d0e2e5b5d25 58
masakjm 1:9d0e2e5b5d25 59 #define NUM_GROUP_3SW 7
masakjm 1:9d0e2e5b5d25 60 #define NUM_3SW_MEMBER 3
masakjm 1:9d0e2e5b5d25 61 #define NUM_GROUP_JOY 5
masakjm 1:9d0e2e5b5d25 62 #define NUM_JOY_MEMBER 5
masakjm 1:9d0e2e5b5d25 63 #define NUM_DEVICE 3
masakjm 1:9d0e2e5b5d25 64
masakjm 1:9d0e2e5b5d25 65 const int keyCodeGroup_AB[3] = { // Button A, Button B, Button A&B
masakjm 1:9d0e2e5b5d25 66 'a',
masakjm 1:9d0e2e5b5d25 67 'b',
masakjm 1:9d0e2e5b5d25 68 MODIFY_COMMAND + 'h' // アプリ終了
masakjm 1:9d0e2e5b5d25 69 };
masakjm 1:9d0e2e5b5d25 70 const int keyCodeGroup_3SW[NUM_GROUP_3SW][NUM_3SW_MEMBER] = { // P0 P1 P2
masakjm 1:9d0e2e5b5d25 71 {KEY_TAB, KEY_SPACE, KEY_ENTER},
masakjm 1:9d0e2e5b5d25 72 {KEY_F6, RIGHT_ARROW, LEFT_ARROW},
masakjm 1:9d0e2e5b5d25 73 {KEY_F1, KEY_F2, KEY_F3},
masakjm 1:9d0e2e5b5d25 74 {MODIFY_COMMAND + 'r', MODIFY_OPTION + DOWN_ARROW, MODIFY_OPTION + UP_ARROW},
masakjm 1:9d0e2e5b5d25 75 {KEY_F7, '1', '3'},
masakjm 1:9d0e2e5b5d25 76 {KEY_F8, 'h', 'j'},
masakjm 1:9d0e2e5b5d25 77 {'0', DOWN_ARROW, UP_ARROW}
masakjm 1:9d0e2e5b5d25 78 };
masakjm 1:9d0e2e5b5d25 79
masakjm 1:9d0e2e5b5d25 80 const int keyCodeGroup_JOY[NUM_GROUP_JOY][NUM_JOY_MEMBER] = { // 中央 左 右 上 下
masakjm 1:9d0e2e5b5d25 81 {0, KEY_TAB, KEY_SPACE, 0, KEY_ENTER },
masakjm 1:9d0e2e5b5d25 82 {KEY_HOME, RIGHT_ARROW, LEFT_ARROW, DOWN_ARROW, UP_ARROW },
masakjm 1:9d0e2e5b5d25 83 {KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5},
masakjm 1:9d0e2e5b5d25 84 {MODIFY_COMMAND+'r', 0, 0, MODIFY_OPTION+DOWN_ARROW, MODIFY_OPTION+UP_ARROW},
masakjm 1:9d0e2e5b5d25 85 {KEY_ENTER, KEY_TAB, KEY_SPACE, 0, 0 },
masakjm 1:9d0e2e5b5d25 86 };
masakjm 1:9d0e2e5b5d25 87
masakjm 1:9d0e2e5b5d25 88 //in "BLE_HID\Keyboad_types.h"
masakjm 1:9d0e2e5b5d25 89 //enum FUNCTION_KEY {
masakjm 1:9d0e2e5b5d25 90 // KEY_F1 = 128, /* F1 key */
masakjm 1:9d0e2e5b5d25 91 // KEY_F2, /* F2 key */
masakjm 1:9d0e2e5b5d25 92 // KEY_F3, /* F3 key */
masakjm 1:9d0e2e5b5d25 93 // KEY_F4, /* F4 key */
masakjm 1:9d0e2e5b5d25 94 // KEY_F5, /* F5 key */
masakjm 1:9d0e2e5b5d25 95 // KEY_F6, /* F6 key */
masakjm 1:9d0e2e5b5d25 96 // KEY_F7, /* F7 key */
masakjm 1:9d0e2e5b5d25 97 // KEY_F8, /* F8 key */
masakjm 1:9d0e2e5b5d25 98 // KEY_F9, /* F9 key */
masakjm 1:9d0e2e5b5d25 99 // KEY_F10, /* F10 key */
masakjm 1:9d0e2e5b5d25 100 // KEY_F11, /* F11 key */
masakjm 1:9d0e2e5b5d25 101 // KEY_F12, /* F12 key */
masakjm 1:9d0e2e5b5d25 102 //
masakjm 1:9d0e2e5b5d25 103 // KEY_PRINT_SCREEN, /* Print Screen key */
masakjm 1:9d0e2e5b5d25 104 // KEY_SCROLL_LOCK, /* Scroll lock */
masakjm 1:9d0e2e5b5d25 105 // KEY_CAPS_LOCK, /* caps lock */
masakjm 1:9d0e2e5b5d25 106 // KEY_NUM_LOCK, /* num lock */
masakjm 1:9d0e2e5b5d25 107 // KEY_INSERT, /* Insert key */
masakjm 1:9d0e2e5b5d25 108 // KEY_HOME, /* Home key */
masakjm 1:9d0e2e5b5d25 109 // KEY_PAGE_UP, /* Page Up key */
masakjm 1:9d0e2e5b5d25 110 // KEY_PAGE_DOWN, /* Page Down key */
masakjm 1:9d0e2e5b5d25 111 //
masakjm 1:9d0e2e5b5d25 112 // RIGHT_ARROW, /* Right arrow */
masakjm 1:9d0e2e5b5d25 113 // LEFT_ARROW, /* Left arrow */
masakjm 1:9d0e2e5b5d25 114 // DOWN_ARROW, /* Down arrow */
masakjm 1:9d0e2e5b5d25 115 // UP_ARROW, /* Up arrow */
masakjm 1:9d0e2e5b5d25 116 //};
masakjm 1:9d0e2e5b5d25 117
masakjm 1:9d0e2e5b5d25 118 //----------------------
masakjm 1:9d0e2e5b5d25 119 // Display
masakjm 1:9d0e2e5b5d25 120 //----------------------
masakjm 1:9d0e2e5b5d25 121 #define TIME_TURN_OFF 7.0 // 非表示モードに入るまでの時間 (s)
masakjm 1:9d0e2e5b5d25 122 #define SETTING_DISPLAY_WAIT 1.0 // 設定モード表示時間 (s)
masakjm 1:9d0e2e5b5d25 123
masakjm 1:9d0e2e5b5d25 124 //----------------------
masakjm 1:9d0e2e5b5d25 125 // State
masakjm 1:9d0e2e5b5d25 126 //----------------------
masakjm 1:9d0e2e5b5d25 127 enum STATE {
masakjm 1:9d0e2e5b5d25 128 STATE_DESABLE_INPUT, // 入力無効時
masakjm 1:9d0e2e5b5d25 129 STATE_SETTING_FREQ, // よく変更する設定
masakjm 1:9d0e2e5b5d25 130 STATE_SETTING_DEVICE, // デバイス設定時
masakjm 1:9d0e2e5b5d25 131 STATE_OPERATING, // 操作時
masakjm 1:9d0e2e5b5d25 132 };
masakjm 1:9d0e2e5b5d25 133 //----------------------
masakjm 1:9d0e2e5b5d25 134 // Disable debug messages by setting NO_DEBUG
masakjm 1:9d0e2e5b5d25 135 //----------------------
masakjm 1:9d0e2e5b5d25 136 #ifndef NO_DEBUG
masakjm 1:9d0e2e5b5d25 137 #define DEBUG(...) printf(__VA_ARGS__)
masakjm 1:9d0e2e5b5d25 138 #else
masakjm 1:9d0e2e5b5d25 139 #define DEBUG(...)
masakjm 1:9d0e2e5b5d25 140 #endif
masakjm 1:9d0e2e5b5d25 141
masakjm 1:9d0e2e5b5d25 142 //----------------------
masakjm 1:9d0e2e5b5d25 143 // BLE & HID
masakjm 1:9d0e2e5b5d25 144 //----------------------
masakjm 1:9d0e2e5b5d25 145 /**
masakjm 1:9d0e2e5b5d25 146 * IO capabilities of the device. During development, you most likely want "JustWorks", which means
masakjm 1:9d0e2e5b5d25 147 * no IO capabilities.
masakjm 1:9d0e2e5b5d25 148 * It is also possible to use IO_CAPS_DISPLAY_ONLY to generate and show a pincode on the serial
masakjm 1:9d0e2e5b5d25 149 * output.
masakjm 1:9d0e2e5b5d25 150 */
masakjm 1:9d0e2e5b5d25 151 #ifndef HID_SECURITY_IOCAPS
masakjm 1:9d0e2e5b5d25 152 #define HID_SECURITY_IOCAPS (SecurityManager::IO_CAPS_NONE)
masakjm 1:9d0e2e5b5d25 153 #endif
masakjm 1:9d0e2e5b5d25 154
masakjm 1:9d0e2e5b5d25 155 /**
masakjm 1:9d0e2e5b5d25 156 * Security level. MITM disabled forces "Just Works". If you require MITM, HID_SECURITY_IOCAPS must
masakjm 1:9d0e2e5b5d25 157 * be at least IO_CAPS_DISPLAY_ONLY.
masakjm 1:9d0e2e5b5d25 158 */
masakjm 1:9d0e2e5b5d25 159 #ifndef HID_SECURITY_REQUIRE_MITM
masakjm 1:9d0e2e5b5d25 160 #define HID_SECURITY_REQUIRE_MITM false
masakjm 1:9d0e2e5b5d25 161 #endif
masakjm 1:9d0e2e5b5d25 162
masakjm 1:9d0e2e5b5d25 163 /**
masakjm 1:9d0e2e5b5d25 164 * Initialize security manager: set callback functions and required security level
masakjm 1:9d0e2e5b5d25 165 */
masakjm 1:9d0e2e5b5d25 166 void initializeSecurity(BLE &_ble);
masakjm 1:9d0e2e5b5d25 167
masakjm 1:9d0e2e5b5d25 168 /**
masakjm 1:9d0e2e5b5d25 169 * - Initialize auxiliary services required by the HID-over-GATT Profile.
masakjm 1:9d0e2e5b5d25 170 * - Initialize common Gap advertisement.
masakjm 1:9d0e2e5b5d25 171 *
masakjm 1:9d0e2e5b5d25 172 * Demos only have to set a custom device name and appearance, and their HID
masakjm 1:9d0e2e5b5d25 173 * service.
masakjm 1:9d0e2e5b5d25 174 */
masakjm 1:9d0e2e5b5d25 175 void initializeHOGP(BLE &_ble);
masakjm 1:9d0e2e5b5d25 176
masakjm 1:9d0e2e5b5d25 177 enum BLE_MESSAGE {
masakjm 1:9d0e2e5b5d25 178 BLE_NO_MESSAGE, // メッセージ無し
masakjm 1:9d0e2e5b5d25 179 BLE_CONNECTED, // BLE接続完了
masakjm 1:9d0e2e5b5d25 180 BLE_PAIRING_SUCCESS, // ペアリング成功
masakjm 1:9d0e2e5b5d25 181 BLE_PAIRING_FAILED, // ペアリング失敗
masakjm 1:9d0e2e5b5d25 182 };
masakjm 1:9d0e2e5b5d25 183
masakjm 1:9d0e2e5b5d25 184 //----------------------
masakjm 1:9d0e2e5b5d25 185 // Display Message
masakjm 1:9d0e2e5b5d25 186 //----------------------
masakjm 1:9d0e2e5b5d25 187 #define DISP_NO_MESSAGE 0 // メッセージ無し
masakjm 1:9d0e2e5b5d25 188 #define DISP_PRESS_BUTTON_A 'A' // ボタンA
masakjm 1:9d0e2e5b5d25 189 #define DISP_PRESS_BUTTON_B 'B' // ボタンB
masakjm 1:9d0e2e5b5d25 190 #define DISP_HOLD_BUTTON_AB 'H' // ボタンABの長押し
masakjm 1:9d0e2e5b5d25 191 #define DISP_ACTIVE_IO_P0 '0' // 端子P0
masakjm 1:9d0e2e5b5d25 192 #define DISP_ACTIVE_IO_P1 '1' // 端子P1
masakjm 1:9d0e2e5b5d25 193 #define DISP_ACTIVE_IO_P2 '2' // 端子P2
masakjm 1:9d0e2e5b5d25 194 #define DISP_BLE_WAIT 'W' // BLE接続待ち
masakjm 1:9d0e2e5b5d25 195 #define DISP_BLE_CONNECTED 'C' // BLE接続完了
masakjm 1:9d0e2e5b5d25 196 #define DISP_BLE_PAIRING_SUCCESS 'P' // ペアリング成功
masakjm 1:9d0e2e5b5d25 197 #define DISP_BLE_PAIRING_FAILED 'F' // ペアリング失敗
masakjm 1:9d0e2e5b5d25 198 #define DISP_BLE_ERROR_SENDDATA 'E' // データ送出時エラー
masakjm 1:9d0e2e5b5d25 199 #define DISP_BLE_ERROR_WRITEDDATA 'e' // データ書込時エラー
masakjm 1:9d0e2e5b5d25 200 #define DISP_ERROR_INCORRECT_CODE 'I' // コーディングエラー
masakjm 1:9d0e2e5b5d25 201 #define DISP_ERROR_DEVICE_CONNECT 'V' // デバイス接続エラー
masakjm 1:9d0e2e5b5d25 202
masakjm 1:9d0e2e5b5d25 203 #define DISP_SETTING_FREQ 'S' // よく変更する設定
masakjm 1:9d0e2e5b5d25 204 #define DISP_SETTING_DEVICE 'D' // デバイス設定
masakjm 1:9d0e2e5b5d25 205 #define DISP_SETTING_SPEC_1 'X' // 個別設定1
masakjm 1:9d0e2e5b5d25 206 #define DISP_SETTING_SPEC_2 'Y' // 個別設定2
masakjm 1:9d0e2e5b5d25 207 #define DISP_SETTING_SPEC_3 'Z' // 個別設定3
masakjm 1:9d0e2e5b5d25 208
masakjm 1:9d0e2e5b5d25 209 const char bleDispChar[]={
masakjm 1:9d0e2e5b5d25 210 DISP_NO_MESSAGE,
masakjm 1:9d0e2e5b5d25 211 DISP_BLE_CONNECTED,
masakjm 1:9d0e2e5b5d25 212 DISP_BLE_PAIRING_SUCCESS,
masakjm 1:9d0e2e5b5d25 213 DISP_BLE_PAIRING_FAILED};
masakjm 1:9d0e2e5b5d25 214
masakjm 1:9d0e2e5b5d25 215
masakjm 1:9d0e2e5b5d25 216 //----------------------
masakjm 1:9d0e2e5b5d25 217 // Input Buffer
masakjm 1:9d0e2e5b5d25 218 //----------------------
masakjm 1:9d0e2e5b5d25 219 #define BUTTON_STATUS_DOWN 0x100 // 押された
masakjm 1:9d0e2e5b5d25 220 #define BUTTON_STATUS_UP 0x200 // 離された
masakjm 1:9d0e2e5b5d25 221 #define BUTTON_STATUS_HOLD 0x300 // 保持された
masakjm 1:9d0e2e5b5d25 222
masakjm 1:9d0e2e5b5d25 223 #define BUTTON_NAME_A 1 // A
masakjm 1:9d0e2e5b5d25 224 #define BUTTON_NAME_B 2 // B
masakjm 1:9d0e2e5b5d25 225 #define BUTTON_NAME_P0 3 // P0
masakjm 1:9d0e2e5b5d25 226 #define BUTTON_NAME_P1 4 // P1
masakjm 1:9d0e2e5b5d25 227 #define BUTTON_NAME_P2 5 // P2
masakjm 1:9d0e2e5b5d25 228
masakjm 1:9d0e2e5b5d25 229
masakjm 1:9d0e2e5b5d25 230
masakjm 1:9d0e2e5b5d25 231
masakjm 1:9d0e2e5b5d25 232
masakjm 1:9d0e2e5b5d25 233