北海道情報専門学校 ライフハック研究所のエンベデッドUSBチーム松葉和仁により開発されたUSBSecのmbedに使用するソースコード by 和仁

Dependencies:   SDFileSystem MusicEngine

Fork of mbed-os-example-ble-LED by mbed-os-examples

北海道情報専門学校 ライフハック研究所 エンベデッドUSB USBSec用mbedプログラム

松葉和仁

Committer:
kazu0o2
Date:
Thu Feb 02 23:54:25 2017 +0000
Revision:
21:969148afd29e
Parent:
20:09bb6cbf820f
Child:
22:ad986f13599d
wait to async

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 11:7404978b24e7 1 #include <events/mbed_events.h>
mbed_official 2:864ddfb70a9c 2 #include <mbed.h>
kazu0o2 14:be4e43ce1578 3 #include "SDFileSystem.h"
kazu0o2 19:13657e28b099 4 #include "MusicEngine.h"
mbed_official 2:864ddfb70a9c 5 #include "ble/BLE.h"
kazu0o2 14:be4e43ce1578 6 #include "INITService.h"//初期設定とその状態の送信を行う 0x01
kazu0o2 14:be4e43ce1578 7 #include "PINService.h"//パスワードの認証を行う0x02
kazu0o2 14:be4e43ce1578 8 #include "USBService.h"//USB機器の接続、切断を行う 0x03
kazu0o2 14:be4e43ce1578 9 #include "STATEService.h"//認証、電源、USB状態の送信を行う 0x04
kazu0o2 14:be4e43ce1578 10
kazu0o2 14:be4e43ce1578 11 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
kazu0o2 14:be4e43ce1578 12 * it will have an impact on code-size and power consumption. */
kazu0o2 14:be4e43ce1578 13 #if NEED_CONSOLE_OUTPUT
kazu0o2 14:be4e43ce1578 14 Serial pc(USBTX, USBRX);
kazu0o2 14:be4e43ce1578 15 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
kazu0o2 14:be4e43ce1578 16 #else
kazu0o2 14:be4e43ce1578 17 #define DEBUG(...) /* nothing */
kazu0o2 14:be4e43ce1578 18 #endif /* #if NEED_CONSOLE_OUTPUT */
mbed_official 2:864ddfb70a9c 19
kazu0o2 14:be4e43ce1578 20 #define mC 261.626
kazu0o2 14:be4e43ce1578 21 #define mD 293.665
kazu0o2 14:be4e43ce1578 22 #define mE 329.628
kazu0o2 14:be4e43ce1578 23 #define mF 349.228
kazu0o2 14:be4e43ce1578 24 #define mG 391.995
kazu0o2 14:be4e43ce1578 25 #define mA 440.000
kazu0o2 14:be4e43ce1578 26 #define mB 493.883
kazu0o2 14:be4e43ce1578 27
kazu0o2 14:be4e43ce1578 28 DigitalOut alivenessLED(LED1, 0);//システム生存確認LED
kazu0o2 14:be4e43ce1578 29 DigitalOut actuatedLED(LED2, 0);//USB用リレーピン
mbed_official 2:864ddfb70a9c 30
kazu0o2 14:be4e43ce1578 31 InterruptIn powerSwitch(p17);//パワー検出コード
kazu0o2 14:be4e43ce1578 32 InterruptIn resetSwitch(p18);//リセットボタン
kazu0o2 14:be4e43ce1578 33
kazu0o2 19:13657e28b099 34 //PwmOut speakerP(LED4);//スピーカPWM
kazu0o2 15:c65fdaa7bfc0 35 DigitalOut speakerD(LED3, 0);//スピーカ省電力化デジタル
kazu0o2 19:13657e28b099 36 MusicEngine Speaker(LED4);
kazu0o2 14:be4e43ce1578 37
kazu0o2 14:be4e43ce1578 38 //SDFileSystem local("local");//SDカードを定義する
kazu0o2 14:be4e43ce1578 39 SDFileSystem sd(p13,p14,p15,p19,"sd");
kazu0o2 14:be4e43ce1578 40
kazu0o2 14:be4e43ce1578 41 const static char DEVICE_NAME[] = "USBSec";
kazu0o2 14:be4e43ce1578 42 static const uint16_t uuid16_list[] = {USBService::USB_SERVICE_UUID,PINService::PIN_SERVICE_UUID,STATEService::STATE_SERVICE_UUID,INITService::INIT_SERVICE_UUID};//testcode
mbed_official 2:864ddfb70a9c 43
mbed_official 2:864ddfb70a9c 44 static EventQueue eventQueue(
mbed_official 2:864ddfb70a9c 45 /* event count */ 10 * /* event size */ 32
mbed_official 2:864ddfb70a9c 46 );
mbed_official 2:864ddfb70a9c 47
kazu0o2 14:be4e43ce1578 48 USBService *usbServicePtr;
kazu0o2 14:be4e43ce1578 49 PINService *pinServicePtr;
kazu0o2 14:be4e43ce1578 50 STATEService *stateServicePtr;
kazu0o2 14:be4e43ce1578 51 INITService *initServicePtr;
kazu0o2 14:be4e43ce1578 52
kazu0o2 14:be4e43ce1578 53 bool authenticationInformation = false;//パスワードは登録されているか
kazu0o2 14:be4e43ce1578 54 bool authenticated = false;//パスワード認証を行ったか
kazu0o2 14:be4e43ce1578 55
kazu0o2 14:be4e43ce1578 56 char password[] = {0x00,0x00,0x00,0x00,0x00,0x00};//デバッグパスワード
kazu0o2 14:be4e43ce1578 57
kazu0o2 14:be4e43ce1578 58 int connectAlertCount = 0;
kazu0o2 15:c65fdaa7bfc0 59 int disconnectAlertCount = 0;
kazu0o2 16:1ef03a07fbab 60 float connectAlert[]={mC,mE,mG,mB,mB};
kazu0o2 16:1ef03a07fbab 61 float disconnectAlert[]={mB,mG,mE,mC,mB};
kazu0o2 14:be4e43ce1578 62
kazu0o2 14:be4e43ce1578 63 void connectAlertOff();
kazu0o2 14:be4e43ce1578 64
kazu0o2 18:688c14c4f3ea 65 //http://mag.switch-science.com/2015/06/17/fathersday2015/
kazu0o2 21:969148afd29e 66
kazu0o2 14:be4e43ce1578 67 /**
kazu0o2 14:be4e43ce1578 68 *接続時発音
kazu0o2 14:be4e43ce1578 69 *接続時に発音されるためのキュー
kazu0o2 14:be4e43ce1578 70 */
kazu0o2 14:be4e43ce1578 71 void connectAlertOn() {
kazu0o2 14:be4e43ce1578 72 DEBUG("connectAlertOn\r\n");
kazu0o2 19:13657e28b099 73 /*
kazu0o2 15:c65fdaa7bfc0 74 speakerP.period(1.0/connectAlert[connectAlertCount]);
kazu0o2 15:c65fdaa7bfc0 75 speakerP.write(0.5f);
kazu0o2 15:c65fdaa7bfc0 76 eventQueue.call_in(1.0f, &connectAlertOff);
kazu0o2 19:13657e28b099 77 */
kazu0o2 21:969148afd29e 78 //Speaker.play("T120L4CDEFEDCREFGAGFER");//非同期だった//7秒?
kazu0o2 21:969148afd29e 79 Speaker.play("T120L4CDEFEDC");//非同期だった//7秒?
kazu0o2 21:969148afd29e 80 eventQueue.call_in(5000.0f, &connectAlertOff);
kazu0o2 14:be4e43ce1578 81 }
kazu0o2 14:be4e43ce1578 82
kazu0o2 14:be4e43ce1578 83 /**
kazu0o2 14:be4e43ce1578 84 *接続時発音
kazu0o2 14:be4e43ce1578 85 *接続時に発音されるためのキュー
kazu0o2 14:be4e43ce1578 86 */
kazu0o2 14:be4e43ce1578 87 void connectAlertOff() {
kazu0o2 21:969148afd29e 88 DEBUG("connectAlertOff\r\n");
kazu0o2 19:13657e28b099 89 /*
kazu0o2 15:c65fdaa7bfc0 90 speakerP.write(0.0f);
kazu0o2 14:be4e43ce1578 91 if(connectAlertCount<4){
kazu0o2 14:be4e43ce1578 92 connectAlertCount += 1;
kazu0o2 17:73975681cdd3 93 eventQueue.call_in(2.0f, &connectAlertOn);
kazu0o2 14:be4e43ce1578 94 }else{
kazu0o2 15:c65fdaa7bfc0 95 if(disconnectAlertCount<=0){
kazu0o2 15:c65fdaa7bfc0 96 speakerD = 0;
kazu0o2 15:c65fdaa7bfc0 97 }
kazu0o2 15:c65fdaa7bfc0 98 connectAlertCount = 0;
kazu0o2 14:be4e43ce1578 99 DEBUG("connectAlertStop\r\n");
kazu0o2 14:be4e43ce1578 100 }
kazu0o2 19:13657e28b099 101 */
kazu0o2 21:969148afd29e 102 speakerD = 0;
kazu0o2 14:be4e43ce1578 103 }
kazu0o2 14:be4e43ce1578 104
kazu0o2 14:be4e43ce1578 105 /**
kazu0o2 14:be4e43ce1578 106 *接続時発音
kazu0o2 14:be4e43ce1578 107 *接続時に発音を開始するためのキュー
kazu0o2 14:be4e43ce1578 108 */
kazu0o2 14:be4e43ce1578 109 void connectAlertStart() {
kazu0o2 14:be4e43ce1578 110 DEBUG("connectAlertStart\r\n");
kazu0o2 15:c65fdaa7bfc0 111 speakerD = 1;
kazu0o2 14:be4e43ce1578 112 connectAlertCount = 0;
kazu0o2 15:c65fdaa7bfc0 113 eventQueue.call(&connectAlertOn);
kazu0o2 15:c65fdaa7bfc0 114 }
kazu0o2 15:c65fdaa7bfc0 115
kazu0o2 15:c65fdaa7bfc0 116 void disconnectAlertOff();
kazu0o2 15:c65fdaa7bfc0 117
kazu0o2 15:c65fdaa7bfc0 118 /**
kazu0o2 15:c65fdaa7bfc0 119 *切断時発音
kazu0o2 15:c65fdaa7bfc0 120 *切断時に発音されるためのキュー
kazu0o2 15:c65fdaa7bfc0 121 */
kazu0o2 15:c65fdaa7bfc0 122 void disconnectAlertOn() {
kazu0o2 15:c65fdaa7bfc0 123 DEBUG("disconnectAlertOn\r\n");
kazu0o2 19:13657e28b099 124 /*
kazu0o2 15:c65fdaa7bfc0 125 speakerP.period(1.0/disconnectAlert[disconnectAlertCount]);
kazu0o2 15:c65fdaa7bfc0 126 speakerP.write(0.5f);
kazu0o2 15:c65fdaa7bfc0 127 eventQueue.call_in(1.0f, &disconnectAlertOff);
kazu0o2 19:13657e28b099 128 */
kazu0o2 19:13657e28b099 129
kazu0o2 21:969148afd29e 130 Speaker.play("T120L4CR4CR4CR4CR4");//非同期だった
kazu0o2 21:969148afd29e 131 eventQueue.call_in(5000.0f, &disconnectAlertOff);
kazu0o2 15:c65fdaa7bfc0 132 }
kazu0o2 15:c65fdaa7bfc0 133
kazu0o2 15:c65fdaa7bfc0 134 /**
kazu0o2 15:c65fdaa7bfc0 135 *切断時発音
kazu0o2 15:c65fdaa7bfc0 136 *切断時に発音されるためのキュー
kazu0o2 15:c65fdaa7bfc0 137 */
kazu0o2 15:c65fdaa7bfc0 138 void disconnectAlertOff() {
kazu0o2 15:c65fdaa7bfc0 139 DEBUG("disconnectAlertOff\r\n");
kazu0o2 19:13657e28b099 140 /*speakerP.write(0.0f);
kazu0o2 15:c65fdaa7bfc0 141 if(disconnectAlertCount<4){
kazu0o2 15:c65fdaa7bfc0 142 disconnectAlertCount += 1;
kazu0o2 17:73975681cdd3 143 eventQueue.call_in(2.0f, &disconnectAlertOn);
kazu0o2 15:c65fdaa7bfc0 144 }else{
kazu0o2 15:c65fdaa7bfc0 145 if(connectAlertCount<=0){
kazu0o2 15:c65fdaa7bfc0 146 speakerD = 0;
kazu0o2 15:c65fdaa7bfc0 147 }
kazu0o2 15:c65fdaa7bfc0 148 disconnectAlertCount = 0;
kazu0o2 15:c65fdaa7bfc0 149 DEBUG("disconnectAlertStop\r\n");
kazu0o2 19:13657e28b099 150 }*/
kazu0o2 21:969148afd29e 151 speakerD = 0;
kazu0o2 15:c65fdaa7bfc0 152 }
kazu0o2 15:c65fdaa7bfc0 153
kazu0o2 15:c65fdaa7bfc0 154 /**
kazu0o2 15:c65fdaa7bfc0 155 *切断時発音
kazu0o2 15:c65fdaa7bfc0 156 *切断時に発音を開始するためのキュー
kazu0o2 15:c65fdaa7bfc0 157 */
kazu0o2 15:c65fdaa7bfc0 158 void disconnectAlertStart() {
kazu0o2 15:c65fdaa7bfc0 159 DEBUG("disconnectAlertStart\r\n");
kazu0o2 15:c65fdaa7bfc0 160 speakerD = 1;
kazu0o2 15:c65fdaa7bfc0 161 disconnectAlertCount = 0;
kazu0o2 15:c65fdaa7bfc0 162 eventQueue.call(&disconnectAlertOn);
kazu0o2 14:be4e43ce1578 163 }
kazu0o2 14:be4e43ce1578 164
kazu0o2 14:be4e43ce1578 165 /**
kazu0o2 14:be4e43ce1578 166 *パワー検出コード
kazu0o2 14:be4e43ce1578 167 *タクトスイッチが押されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 168 */
kazu0o2 14:be4e43ce1578 169 void togglePowerUp() {
kazu0o2 14:be4e43ce1578 170 DEBUG("PowerUp\r\n");
kazu0o2 14:be4e43ce1578 171 stateServicePtr->powerStateUpdate(0x01);
kazu0o2 14:be4e43ce1578 172 }
kazu0o2 14:be4e43ce1578 173
kazu0o2 14:be4e43ce1578 174 /**
kazu0o2 14:be4e43ce1578 175 *パワー検出コード
kazu0o2 14:be4e43ce1578 176 *タクトスイッチが離されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 177 */
kazu0o2 14:be4e43ce1578 178 void togglePowerDown() {
kazu0o2 14:be4e43ce1578 179 DEBUG("PowerDown\r\n");
kazu0o2 14:be4e43ce1578 180 stateServicePtr->powerStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 181
kazu0o2 14:be4e43ce1578 182 //USBの無効化
kazu0o2 14:be4e43ce1578 183 actuatedLED = 0x00;
kazu0o2 14:be4e43ce1578 184 stateServicePtr->usbStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 185 }
kazu0o2 14:be4e43ce1578 186
kazu0o2 14:be4e43ce1578 187 /**
kazu0o2 14:be4e43ce1578 188 *パワー検出コード
kazu0o2 14:be4e43ce1578 189 *タクトスイッチが押されたときに実行される関数
kazu0o2 14:be4e43ce1578 190 */
kazu0o2 14:be4e43ce1578 191 void powerUp() {
kazu0o2 14:be4e43ce1578 192 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 193 eventQueue.call(&togglePowerUp);
kazu0o2 14:be4e43ce1578 194 }
mbed_official 2:864ddfb70a9c 195
kazu0o2 14:be4e43ce1578 196 /**
kazu0o2 14:be4e43ce1578 197 *パワー検出コード
kazu0o2 14:be4e43ce1578 198 *タクトスイッチが離されたときに実行される関数
kazu0o2 14:be4e43ce1578 199 */
kazu0o2 14:be4e43ce1578 200 void powerDown() {
kazu0o2 14:be4e43ce1578 201 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 202 eventQueue.call(&togglePowerDown);
kazu0o2 14:be4e43ce1578 203 }
kazu0o2 14:be4e43ce1578 204
kazu0o2 14:be4e43ce1578 205 /**
kazu0o2 14:be4e43ce1578 206 *リセットボタン
kazu0o2 14:be4e43ce1578 207 *タクトスイッチが離されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 208 */
kazu0o2 14:be4e43ce1578 209 void toggleResetDown() {
kazu0o2 14:be4e43ce1578 210 DEBUG("ResetDown\r\n");
kazu0o2 14:be4e43ce1578 211 DEBUG("パスワードのリセットを行います\r\n");
kazu0o2 14:be4e43ce1578 212 //リセットパスワードの書き込み
kazu0o2 14:be4e43ce1578 213 FILE *fp = fopen("/sd/sdtest.txt", "w");
kazu0o2 14:be4e43ce1578 214 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 215 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 216 }else{
kazu0o2 14:be4e43ce1578 217 fprintf(fp, "00\n00\n00\n00\n00\n00\n");
kazu0o2 14:be4e43ce1578 218 fclose(fp);
kazu0o2 14:be4e43ce1578 219 }
kazu0o2 14:be4e43ce1578 220
kazu0o2 14:be4e43ce1578 221 //パスワード登録状態のリセット
kazu0o2 14:be4e43ce1578 222 authenticationInformation = false;
kazu0o2 14:be4e43ce1578 223 initServicePtr->stateUpdate(0x00);
kazu0o2 14:be4e43ce1578 224 //パスワード認証状態のリセット
kazu0o2 14:be4e43ce1578 225 authenticated=false;
kazu0o2 14:be4e43ce1578 226 stateServicePtr->authStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 227 DEBUG("パスワードのリセットが完了しました\r\n");
kazu0o2 14:be4e43ce1578 228 }
kazu0o2 14:be4e43ce1578 229
kazu0o2 14:be4e43ce1578 230 /**
kazu0o2 14:be4e43ce1578 231 *リセットボタン
kazu0o2 14:be4e43ce1578 232 *タクトスイッチが離されたときに実行される関数
kazu0o2 14:be4e43ce1578 233 */
kazu0o2 14:be4e43ce1578 234 void resetDown() {
kazu0o2 14:be4e43ce1578 235 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 236 eventQueue.call(&toggleResetDown);
kazu0o2 14:be4e43ce1578 237 }
kazu0o2 14:be4e43ce1578 238
kazu0o2 14:be4e43ce1578 239 /**
kazu0o2 14:be4e43ce1578 240 * Bluetooth接続時の操作
kazu0o2 14:be4e43ce1578 241 */
kazu0o2 14:be4e43ce1578 242 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
kazu0o2 14:be4e43ce1578 243 {
kazu0o2 14:be4e43ce1578 244 char mac[6];
kazu0o2 14:be4e43ce1578 245 DEBUG("peerMAC:%d\r\n",params->peerAddr);
kazu0o2 14:be4e43ce1578 246 DEBUG("peerMAC_length:%d\r\n",sizeof(params->peerAddr));
kazu0o2 14:be4e43ce1578 247 DEBUG("peerMAC:");
kazu0o2 14:be4e43ce1578 248 for(int i = 0;i<sizeof(params->peerAddr);i+=1){
kazu0o2 14:be4e43ce1578 249 mac[i]=params->peerAddr[i];
kazu0o2 14:be4e43ce1578 250 DEBUG("%02x ", params->peerAddr[i]);
kazu0o2 14:be4e43ce1578 251 }
kazu0o2 14:be4e43ce1578 252 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 253
kazu0o2 14:be4e43ce1578 254 /*
kazu0o2 14:be4e43ce1578 255 DEBUG("peerArrayMAC:%d\r\n",mac);
kazu0o2 14:be4e43ce1578 256 DEBUG("peerArrayMAC_length:%d\r\n",sizeof(mac));
kazu0o2 14:be4e43ce1578 257 DEBUG("peerArrayMAC:");
kazu0o2 14:be4e43ce1578 258 for(int i = 0;i<sizeof(mac);i+=1){
kazu0o2 14:be4e43ce1578 259 DEBUG("%d ", mac[i]);
kazu0o2 14:be4e43ce1578 260 }
kazu0o2 14:be4e43ce1578 261 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 262 */
kazu0o2 14:be4e43ce1578 263
kazu0o2 14:be4e43ce1578 264 DEBUG("ownAddrMAC:%d\r\n",params->ownAddr);
kazu0o2 14:be4e43ce1578 265 DEBUG("ownAddrMAC_length:%d\r\n",sizeof(params->ownAddr));
kazu0o2 14:be4e43ce1578 266 DEBUG("ownAddrMAC:");
kazu0o2 14:be4e43ce1578 267 for(int i = 0;i<sizeof(params->ownAddr);i+=1){
kazu0o2 14:be4e43ce1578 268 DEBUG("%d ", params->ownAddr[i]);
kazu0o2 14:be4e43ce1578 269 }
kazu0o2 14:be4e43ce1578 270 DEBUG("\r\n");
kazu0o2 15:c65fdaa7bfc0 271
kazu0o2 15:c65fdaa7bfc0 272
kazu0o2 15:c65fdaa7bfc0 273 eventQueue.call(&connectAlertStart);
kazu0o2 14:be4e43ce1578 274
kazu0o2 14:be4e43ce1578 275 DEBUG("BluetoothConnection!\r\n");
kazu0o2 14:be4e43ce1578 276 }
kazu0o2 14:be4e43ce1578 277
kazu0o2 14:be4e43ce1578 278 /**
kazu0o2 14:be4e43ce1578 279 * Bluetooth切断時の操作
kazu0o2 14:be4e43ce1578 280 */
mbed_official 2:864ddfb70a9c 281 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
mbed_official 2:864ddfb70a9c 282 {
mbed_official 2:864ddfb70a9c 283 (void) params;
kazu0o2 14:be4e43ce1578 284 //認証状態の無効化
kazu0o2 14:be4e43ce1578 285 authenticated = false;
kazu0o2 14:be4e43ce1578 286 stateServicePtr->authStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 287 //USBの無効化
kazu0o2 14:be4e43ce1578 288 actuatedLED = 0x00;
kazu0o2 14:be4e43ce1578 289 stateServicePtr->usbStateUpdate(0x00);
kazu0o2 14:be4e43ce1578 290
mbed_official 2:864ddfb70a9c 291 BLE::Instance().gap().startAdvertising();
kazu0o2 15:c65fdaa7bfc0 292
kazu0o2 15:c65fdaa7bfc0 293 eventQueue.call(&disconnectAlertStart);
kazu0o2 14:be4e43ce1578 294 DEBUG("BluetoothDisconnection!\r\n");
mbed_official 2:864ddfb70a9c 295 }
mbed_official 2:864ddfb70a9c 296
kazu0o2 14:be4e43ce1578 297 /**
kazu0o2 14:be4e43ce1578 298 *動作確認ランプの状態変更
kazu0o2 14:be4e43ce1578 299 */
mbed_official 2:864ddfb70a9c 300 void blinkCallback(void)
mbed_official 2:864ddfb70a9c 301 {
mbed_official 2:864ddfb70a9c 302 alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */
mbed_official 2:864ddfb70a9c 303 }
mbed_official 2:864ddfb70a9c 304
kazu0o2 14:be4e43ce1578 305
kazu0o2 14:be4e43ce1578 306 /**
kazu0o2 14:be4e43ce1578 307 *パスワードSDカード書き込み
kazu0o2 14:be4e43ce1578 308 *パスワードが変更されたときに実行されるキュー
kazu0o2 14:be4e43ce1578 309 */
kazu0o2 14:be4e43ce1578 310 void writeSD() {
kazu0o2 14:be4e43ce1578 311 //SDへの書き込み処理
kazu0o2 14:be4e43ce1578 312 DEBUG("SDカードを開きます\r\n");
kazu0o2 14:be4e43ce1578 313 FILE *fp = fopen("/sd/sdtest.txt", "w");
kazu0o2 14:be4e43ce1578 314 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 315 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 316 }else{
kazu0o2 14:be4e43ce1578 317 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 318 fprintf(fp,"%02x", password[i]);
kazu0o2 14:be4e43ce1578 319 fprintf(fp, "\n");
kazu0o2 14:be4e43ce1578 320 }
kazu0o2 14:be4e43ce1578 321 fclose(fp);
kazu0o2 14:be4e43ce1578 322 }
kazu0o2 14:be4e43ce1578 323 DEBUG("SDカードを閉じます\r\n");
kazu0o2 14:be4e43ce1578 324 }
kazu0o2 14:be4e43ce1578 325
mbed_official 2:864ddfb70a9c 326 /**
mbed_official 2:864ddfb70a9c 327 * This callback allows the LEDService to receive updates to the ledState Characteristic.
kazu0o2 14:be4e43ce1578 328 * LEDサービスにて状態変更を受信した際に呼び出されるコールバック
mbed_official 2:864ddfb70a9c 329 *
mbed_official 2:864ddfb70a9c 330 * @param[in] params
mbed_official 2:864ddfb70a9c 331 * Information about the characterisitc being updated.
mbed_official 2:864ddfb70a9c 332 */
mbed_official 2:864ddfb70a9c 333 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
kazu0o2 14:be4e43ce1578 334 DEBUG("onDataWrittenCallback:");
kazu0o2 14:be4e43ce1578 335
kazu0o2 14:be4e43ce1578 336 if (params->handle == initServicePtr->getValueHandle()) {
kazu0o2 14:be4e43ce1578 337 DEBUG("INITService\r\n");
kazu0o2 14:be4e43ce1578 338 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 339 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 340 DEBUG("%02x ", params->data[i]);
kazu0o2 14:be4e43ce1578 341 }
kazu0o2 14:be4e43ce1578 342 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 343
kazu0o2 14:be4e43ce1578 344 //認証情報の確認
kazu0o2 14:be4e43ce1578 345 if(authenticationInformation){
kazu0o2 14:be4e43ce1578 346 //認証情報が登録されていた場合は登録を行わない
kazu0o2 14:be4e43ce1578 347 DEBUG("認証情報登録済みのため、認証情報の登録を中止します\r\n");
kazu0o2 14:be4e43ce1578 348 return;
kazu0o2 14:be4e43ce1578 349 }
kazu0o2 14:be4e43ce1578 350
kazu0o2 14:be4e43ce1578 351 DEBUG("認証情報の登録を開始します\r\n");
kazu0o2 14:be4e43ce1578 352
kazu0o2 14:be4e43ce1578 353 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 354 password[i] = params->data[i];
kazu0o2 14:be4e43ce1578 355 }
kazu0o2 14:be4e43ce1578 356
kazu0o2 14:be4e43ce1578 357 DEBUG("PasswordLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 358 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 359 DEBUG("%02x ", password[i]);
kazu0o2 14:be4e43ce1578 360 }
kazu0o2 14:be4e43ce1578 361 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 362
kazu0o2 14:be4e43ce1578 363 authenticationInformation = true;
kazu0o2 14:be4e43ce1578 364 initServicePtr->stateUpdate(0x01);
kazu0o2 14:be4e43ce1578 365
kazu0o2 14:be4e43ce1578 366
kazu0o2 14:be4e43ce1578 367 // 即実行されるイベント
kazu0o2 14:be4e43ce1578 368 eventQueue.call(&writeSD);
kazu0o2 14:be4e43ce1578 369
kazu0o2 14:be4e43ce1578 370 DEBUG("認証情報の登録を終了します\r\n");
kazu0o2 14:be4e43ce1578 371 return;
kazu0o2 14:be4e43ce1578 372 }
kazu0o2 14:be4e43ce1578 373
kazu0o2 14:be4e43ce1578 374 if(!authenticationInformation){
kazu0o2 14:be4e43ce1578 375 //認証情報が登録されていない場合は操作を行わない
kazu0o2 14:be4e43ce1578 376 DEBUG("\r\n認証情報未登録のため、操作を中止します\r\n");
kazu0o2 14:be4e43ce1578 377 return;
kazu0o2 14:be4e43ce1578 378 }
kazu0o2 14:be4e43ce1578 379
kazu0o2 14:be4e43ce1578 380 if (params->handle == pinServicePtr->getValueHandle()) {
kazu0o2 14:be4e43ce1578 381 DEBUG("PINService\r\n");
kazu0o2 14:be4e43ce1578 382 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 383 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 384 DEBUG("%02x ", params->data[i]);
kazu0o2 14:be4e43ce1578 385 }
kazu0o2 14:be4e43ce1578 386 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 387
kazu0o2 14:be4e43ce1578 388 DEBUG("認証を開始します\r\n");
kazu0o2 14:be4e43ce1578 389 DEBUG("VerificationLength:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 390 DEBUG("RegisterLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 391 if(params->len != sizeof(password)){
kazu0o2 14:be4e43ce1578 392 DEBUG("認証に失敗しました\r\n");
kazu0o2 14:be4e43ce1578 393 return;
kazu0o2 14:be4e43ce1578 394 }
kazu0o2 14:be4e43ce1578 395 DEBUG("Verification:Register\r\n");
kazu0o2 14:be4e43ce1578 396 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 397 DEBUG("%02x", params->data[i]);
kazu0o2 14:be4e43ce1578 398 DEBUG(":");
kazu0o2 14:be4e43ce1578 399 DEBUG("%02x", password[i]);
kazu0o2 14:be4e43ce1578 400 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 401 if(params->data[i]!= password[i]){
kazu0o2 14:be4e43ce1578 402 DEBUG("認証に失敗しました\r\n");
kazu0o2 14:be4e43ce1578 403 return;
kazu0o2 14:be4e43ce1578 404 }
kazu0o2 14:be4e43ce1578 405 }
kazu0o2 14:be4e43ce1578 406 authenticated=true;
kazu0o2 14:be4e43ce1578 407 stateServicePtr->authStateUpdate(0x01);
kazu0o2 14:be4e43ce1578 408 DEBUG("認証が完了しました\r\n");
kazu0o2 14:be4e43ce1578 409 return;
kazu0o2 14:be4e43ce1578 410 }
kazu0o2 14:be4e43ce1578 411
kazu0o2 14:be4e43ce1578 412 if(!authenticated){
kazu0o2 14:be4e43ce1578 413 //認証が行われていない場合は操作を行わない
kazu0o2 14:be4e43ce1578 414 DEBUG("\r\n認証がされていないため、操作を中止します\r\n");
kazu0o2 14:be4e43ce1578 415 return;
kazu0o2 14:be4e43ce1578 416 }
kazu0o2 14:be4e43ce1578 417
kazu0o2 14:be4e43ce1578 418 if ((params->handle == usbServicePtr->getValueHandle()) && (params->len == 1)) {
kazu0o2 14:be4e43ce1578 419
kazu0o2 14:be4e43ce1578 420 DEBUG("USBService\r\n");
kazu0o2 14:be4e43ce1578 421 DEBUG("length:%d\r\n",params->len);
kazu0o2 14:be4e43ce1578 422 for(int i = 0;i<params->len;i+=1){
kazu0o2 14:be4e43ce1578 423 DEBUG("%d ", params->data[i]);
kazu0o2 14:be4e43ce1578 424 }
kazu0o2 14:be4e43ce1578 425 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 426
mbed_official 2:864ddfb70a9c 427 actuatedLED = *(params->data);
kazu0o2 14:be4e43ce1578 428 stateServicePtr->usbStateUpdate(*(params->data));
kazu0o2 14:be4e43ce1578 429 return;
mbed_official 2:864ddfb70a9c 430 }
mbed_official 2:864ddfb70a9c 431 }
mbed_official 2:864ddfb70a9c 432
mbed_official 2:864ddfb70a9c 433 /**
mbed_official 2:864ddfb70a9c 434 * This function is called when the ble initialization process has failled
kazu0o2 14:be4e43ce1578 435 * BLEの初期化失敗のコールバック
mbed_official 2:864ddfb70a9c 436 */
mbed_official 2:864ddfb70a9c 437 void onBleInitError(BLE &ble, ble_error_t error)
mbed_official 2:864ddfb70a9c 438 {
kazu0o2 14:be4e43ce1578 439 DEBUG("BluetoothError!\r\n");
mbed_official 2:864ddfb70a9c 440 /* Initialization error handling should go here */
mbed_official 2:864ddfb70a9c 441 }
mbed_official 2:864ddfb70a9c 442
mbed_official 2:864ddfb70a9c 443 /**
mbed_official 2:864ddfb70a9c 444 * Callback triggered when the ble initialization process has finished
kazu0o2 14:be4e43ce1578 445 * BLEの初期化が完了したときに呼び出されるコールバック
mbed_official 2:864ddfb70a9c 446 */
mbed_official 2:864ddfb70a9c 447 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mbed_official 2:864ddfb70a9c 448 {
mbed_official 2:864ddfb70a9c 449 BLE& ble = params->ble;
mbed_official 2:864ddfb70a9c 450 ble_error_t error = params->error;
mbed_official 2:864ddfb70a9c 451
mbed_official 2:864ddfb70a9c 452 if (error != BLE_ERROR_NONE) {
mbed_official 2:864ddfb70a9c 453 /* In case of error, forward the error handling to onBleInitError */
kazu0o2 14:be4e43ce1578 454 /* エラーがあった場合はここから上の'onBleInitError'が呼び出される */
mbed_official 2:864ddfb70a9c 455 onBleInitError(ble, error);
mbed_official 2:864ddfb70a9c 456 return;
mbed_official 2:864ddfb70a9c 457 }
mbed_official 2:864ddfb70a9c 458
mbed_official 2:864ddfb70a9c 459 /* Ensure that it is the default instance of BLE */
kazu0o2 14:be4e43ce1578 460 /* BLEのデフォルトインスタンスであることを確認 */
mbed_official 2:864ddfb70a9c 461 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mbed_official 2:864ddfb70a9c 462 return;
mbed_official 2:864ddfb70a9c 463 }
mbed_official 2:864ddfb70a9c 464
mbed_official 2:864ddfb70a9c 465 ble.gap().onDisconnection(disconnectionCallback);
kazu0o2 14:be4e43ce1578 466 ble.gap().onConnection(connectionCallback);
mbed_official 2:864ddfb70a9c 467 ble.gattServer().onDataWritten(onDataWrittenCallback);
mbed_official 2:864ddfb70a9c 468
kazu0o2 14:be4e43ce1578 469 bool initialValueForUSBUSBCharacteristic = false;
kazu0o2 14:be4e43ce1578 470 usbServicePtr = new USBService(ble, initialValueForUSBUSBCharacteristic);
kazu0o2 14:be4e43ce1578 471
kazu0o2 14:be4e43ce1578 472 char initialValueForPINPINCharacteristic[] = {0x00,0x00,0x00,0x00,0x00,0x00};
kazu0o2 14:be4e43ce1578 473 pinServicePtr = new PINService(ble, initialValueForPINPINCharacteristic);
kazu0o2 14:be4e43ce1578 474
kazu0o2 14:be4e43ce1578 475 char initialValueForSTATEAUTHCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 476 char initialValueForSTATEPOWERCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 477 char initialValueForSTATEUSBCharacteristic = 0x00;
kazu0o2 14:be4e43ce1578 478 stateServicePtr = new STATEService(ble, initialValueForSTATEAUTHCharacteristic, initialValueForSTATEPOWERCharacteristic, initialValueForSTATEUSBCharacteristic);
kazu0o2 14:be4e43ce1578 479
kazu0o2 14:be4e43ce1578 480 char initialValueForINITSETCharacteristic[] = {0x00,0x00,0x00,0x00,0x00,0x00};
kazu0o2 14:be4e43ce1578 481 char initialValueForINITGETCharacteristic = authenticationInformation;
kazu0o2 14:be4e43ce1578 482 initServicePtr = new INITService(ble, initialValueForINITSETCharacteristic,initialValueForINITGETCharacteristic);
mbed_official 2:864ddfb70a9c 483
mbed_official 2:864ddfb70a9c 484 /* setup advertising */
kazu0o2 14:be4e43ce1578 485 /* BLEクライアントへの広告の設定 */
mbed_official 2:864ddfb70a9c 486 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
kazu0o2 14:be4e43ce1578 487 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
mbed_official 2:864ddfb70a9c 488 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
mbed_official 2:864ddfb70a9c 489 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mbed_official 2:864ddfb70a9c 490 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
mbed_official 2:864ddfb70a9c 491 ble.gap().startAdvertising();
kazu0o2 14:be4e43ce1578 492
kazu0o2 14:be4e43ce1578 493 DEBUG("BluetoothStart!\r\n");
mbed_official 2:864ddfb70a9c 494 }
mbed_official 2:864ddfb70a9c 495
mbed_official 2:864ddfb70a9c 496 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 2:864ddfb70a9c 497 BLE &ble = BLE::Instance();
mbed_official 11:7404978b24e7 498 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mbed_official 2:864ddfb70a9c 499 }
mbed_official 2:864ddfb70a9c 500
mbed_official 2:864ddfb70a9c 501 int main()
kazu0o2 15:c65fdaa7bfc0 502 {
kazu0o2 14:be4e43ce1578 503 //SDカードパスワードの取得
kazu0o2 14:be4e43ce1578 504 char charpass;//SDカードから取得されたパスワード
kazu0o2 14:be4e43ce1578 505 FILE *fp = fopen("/sd/sdtest.txt", "r");
kazu0o2 14:be4e43ce1578 506 if(fp == NULL) {
kazu0o2 14:be4e43ce1578 507 DEBUG("Could not open file for write\n");
kazu0o2 14:be4e43ce1578 508 }else{
kazu0o2 14:be4e43ce1578 509 int passwordindex = 0;
kazu0o2 14:be4e43ce1578 510 //パスワードを取り出しパスワード変数へ
kazu0o2 14:be4e43ce1578 511 while( fscanf( fp, "%02x",&charpass ) != EOF ){
kazu0o2 14:be4e43ce1578 512 DEBUG("%02x\r\n",charpass);
kazu0o2 14:be4e43ce1578 513 password[passwordindex] = charpass;
kazu0o2 14:be4e43ce1578 514 passwordindex+=1;
kazu0o2 14:be4e43ce1578 515 }
kazu0o2 14:be4e43ce1578 516 fclose(fp);
kazu0o2 14:be4e43ce1578 517 }
kazu0o2 14:be4e43ce1578 518
kazu0o2 14:be4e43ce1578 519 //起動時の認証情報状態の設定
kazu0o2 14:be4e43ce1578 520 authenticationInformation = false;
kazu0o2 14:be4e43ce1578 521 DEBUG("PasswordLength:%d\r\n",sizeof(password));
kazu0o2 14:be4e43ce1578 522 for(int i = 0;i<sizeof(password);i+=1){
kazu0o2 14:be4e43ce1578 523 DEBUG("%d ", password[i]);
kazu0o2 14:be4e43ce1578 524 if(password[i] != 0x00){
kazu0o2 14:be4e43ce1578 525 authenticationInformation = true;
kazu0o2 14:be4e43ce1578 526 }
kazu0o2 14:be4e43ce1578 527 }
kazu0o2 14:be4e43ce1578 528 DEBUG("\r\n");
kazu0o2 14:be4e43ce1578 529
kazu0o2 14:be4e43ce1578 530 powerSwitch.mode(PullUp);//パワー検出コード_スイッチピンをPullUpに
kazu0o2 14:be4e43ce1578 531 powerSwitch.fall(&powerUp);//パワー検出コード_スイッチが押されたときの割り込み処理
kazu0o2 14:be4e43ce1578 532 powerSwitch.rise(&powerDown);//パワー検出コード_スイッチが離されたときの割り込み処理
kazu0o2 14:be4e43ce1578 533
kazu0o2 14:be4e43ce1578 534 resetSwitch.mode(PullUp);//リセットボタン_スイッチピンをPullUpに
kazu0o2 14:be4e43ce1578 535 resetSwitch.rise(&resetDown);//リセットボタン_スイッチが離されたときの割り込み処理
kazu0o2 14:be4e43ce1578 536
mbed_official 11:7404978b24e7 537 eventQueue.call_every(500, blinkCallback);
mbed_official 2:864ddfb70a9c 538
mbed_official 2:864ddfb70a9c 539 BLE &ble = BLE::Instance();
mbed_official 2:864ddfb70a9c 540 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 2:864ddfb70a9c 541 ble.init(bleInitComplete);
kazu0o2 14:be4e43ce1578 542
kazu0o2 14:be4e43ce1578 543 //パスワード設定情報のBluetoothへの反映
kazu0o2 14:be4e43ce1578 544 if(authenticationInformation){
kazu0o2 14:be4e43ce1578 545 initServicePtr->stateUpdate(0x01);
kazu0o2 14:be4e43ce1578 546 }
mbed_official 2:864ddfb70a9c 547
mbed_official 11:7404978b24e7 548 eventQueue.dispatch_forever();
mbed_official 2:864ddfb70a9c 549
mbed_official 2:864ddfb70a9c 550 return 0;
mbed_official 2:864ddfb70a9c 551 }