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

Dependencies:   microbit

Committer:
masakjm
Date:
Tue Jun 11 18:08:53 2019 +0000
Revision:
3:d8fd4efb63cc
Parent:
2:8e2e6c6658be
Change the usage of timer.

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