vo dung
/
eddystone_URL
first commit
Fork of BLE_WallbotBLE_Challenge by
Diff: main.cpp
- Revision:
- 4:2386637c9c7c
- Parent:
- 3:ef465ae893a3
- Child:
- 5:984cc7e96073
--- a/main.cpp Thu Nov 23 07:44:33 2017 +0000 +++ b/main.cpp Thu Nov 23 08:46:00 2017 +0000 @@ -1,438 +1,48 @@ #include "mbed.h" #include "BLEDevice.h" -#include "RCBController.h" -#include "TB6612.h" - -#define DBG 0 BLEDevice ble; -#if DBG -Serial pc(USBTX, USBRX); -#endif -/* LEDs for indication: */ -DigitalOut ModeLed(P0_19); -DigitalOut ConnectStateLed(P0_18); -DigitalOut outlow(P0_20); -//PwmOut ControllerStateLed(LED2); - -AnalogIn fsen1(P0_2); -AnalogIn fsen2(P0_3); -AnalogIn fsen3(P0_4); -AnalogIn fsen4(P0_5); -#if 0 -TB6612 left(P0_29,P0_23,P0_24); -TB6612 right(P0_28,P0_30,P0_0); -#else -TB6612 left(P0_29,P0_24,P0_23); -TB6612 right(P0_28,P0_0,P0_30); -#endif -Ticker ticker; - -DigitalIn sw1(P0_16); -DigitalIn sw2(P0_17); - -DigitalIn encl1(P0_6); -DigitalIn encl2(P0_7); -DigitalIn encr1(P0_8); -DigitalIn encr2(P0_10); - - -int base_fsen[4]; -int line_mode = 0; -int challenge_mode = 0; -char bValue = 0; - -int get_line(int num); - -/* RCBController Service */ -static const uint16_t RCBController_service_uuid = 0xFFF0; -static const uint16_t RCBController_Characteristic_uuid = 0xFFF1; -static const uint16_t RCBController_b_Characteristic_uuid = 0xFFF3; -uint8_t RCBControllerPayload[10] = {0,}; - -GattCharacteristic ControllerChar (RCBController_Characteristic_uuid,RCBControllerPayload,10, 10, - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); -//static uint8_t _bValue = 0x00; -static uint8_t _mValue[10] = {0,}; -GattCharacteristic b_Char(RCBController_b_Characteristic_uuid, _mValue, sizeof(_mValue), sizeof(_mValue), - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); - -GattCharacteristic *ControllerChars[] = {&ControllerChar,&b_Char}; -GattService RCBControllerService(RCBController_service_uuid, ControllerChars, sizeof(ControllerChars) / sizeof(GattCharacteristic *)); - -RCBController controller; - -void onConnected(Gap::Handle_t handle, const Gap::ConnectionParams_t *params) -{ - ConnectStateLed = 0; -#if DBG - pc.printf("Connected\n\r"); -#endif -} - -void onDisconnected(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) -{ - left = 0; - right = 0; - - ble.startAdvertising(); - ConnectStateLed = 1; -#if DBG - pc.printf("Disconnected\n\r"); -#endif -} - -void periodicCallback(void) -{ - if (!ble.getGapState().connected) { - return; - } - int line = get_line(0) ? 1 : 0; - line |= get_line(1) ? 2 : 0; - line |= get_line(2) ? 4 : 0; - line |= get_line(3) ? 8 : 0; - if( (bValue == 0)&&(line != 0) ) - { - // game over - left = 0.0; - right = 0.0; - bValue = 10; - } - if( bValue > 0 ) - { - memcpy( _mValue , "GAME OVER",10); - ble.updateCharacteristicValue(b_Char.getValueAttribute().getHandle(), (uint8_t *)_mValue, sizeof(_mValue)); - ModeLed = !ModeLed; - bValue--; - if( bValue == 0 ) - { - ModeLed = 1; - challenge_mode = 0; - ticker.detach(); - } - } -} - - -// GattEvent -void onDataWritten(const GattCharacteristicWriteCBParams *params) -{ - if( (params->charHandle == ControllerChar.getValueAttribute().getHandle()) && (line_mode == 0)) - { - memcpy( &controller.data[0], params->data , params->len ); - //memcpy( &controller.data[0], RCBControllerPayload, sizeof(controller)); -#if DBG - - pc.printf("DATA:%02X %02X %d %d %d %d %d %d %d %02X\n\r",controller.data[0],controller.data[1],controller.data[2],controller.data[3],controller.data[4], - controller.data[5],controller.data[6],controller.data[7],controller.data[8],controller.data[9]); -#endif - float right_factor; - float left_factor; - - left_factor = ((float)((int)controller.status.LeftAnalogUD -128) / 128.0); - right_factor = ((float)((int)controller.status.RightAnalogUD -128) / 128.0); - - if(challenge_mode == 1) - { - if( bValue == 0 ) - { - float factor = ((float)((int)controller.status.AcceleX -128) / 128.0); - - float right_factor = ((factor <= 0.0) ? 1.0 : 1.0 - (factor*2)); - float left_factor = ((factor >= 0.0) ? 1.0 : 1.0 - (-factor*2)); - - if( controller.status.B == 1 ) - { - left = left_factor; - right = right_factor; - } - else if( controller.status.A == 1 ) - { - left = -right_factor; - right = -left_factor; - } - else - { - left = 0; - right = 0; - } - } - } - else if( (left_factor != 0.0)||(right_factor != 0.0) ) - { - left = left_factor; - right = right_factor; - } - else - { - float factor = ((float)((int)controller.status.AcceleX -128) / 128.0); - - float right_factor = ((factor <= 0.0) ? 1.0 : 1.0 - (factor*2)); - float left_factor = ((factor >= 0.0) ? 1.0 : 1.0 - (-factor*2)); - - if( controller.status.B == 1 ) - { - left = left_factor; - right = right_factor; - } - else if( controller.status.A == 1 ) - { - left = -right_factor; - right = -left_factor; - } - else if( controller.status.UP == 1 ) - { - left = 1.0; - right = 1.0; - } - else if( controller.status.DOWN == 1 ) - { - left = -1.0; - right = -1.0; - } - else if( controller.status.RIGHT == 1 ) - { - left = 1.0; - right = -1.0; - } - else if( controller.status.LEFT == 1 ) - { - left = -1.0; - right = 1.0; - } - else - { - left = 0.0; - right = 0.0; - } - if((controller.status.UP == 1)&&(controller.status.DOWN == 1)) - { - left = 0.0; - right = 0.0; - ModeLed = 0; - challenge_mode = 1; - ticker.attach(periodicCallback, 0.1); - - } - } - //ControllerStateLed = (float)controller.status.LeftAnalogLR / 255.0; - } -} - -int get_fsen(int num) -{ - switch(num) - { - case 0: - return((int)fsen1.read_u16()); - case 1: - return((int)fsen2.read_u16()); - case 2: - return((int)fsen3.read_u16()); - case 3: - return((int)fsen4.read_u16()); - } - return(0); -} - -void base() -{ - wait(0.5); - - for(int i=0;i<4;i++) - { - base_fsen[i] = 0; - } - - for(int j=0;j<10;j++) - { - for(int i=0;i<4;i++) - { - base_fsen[i] += get_fsen(i); - } - wait_ms(50); - } - for(int i=0;i<4;i++) - { - base_fsen[i] = base_fsen[i] / 10; - } -#if DBG - pc.printf("[0]:%05d[1]:%05d[2]:%05d[3]:%05d\n\r",base_fsen[0],base_fsen[1],base_fsen[2],base_fsen[3]); -#endif -} - -int get_line(int num) -{ - int in = get_fsen(num); - int ret = 0; - -#if 1 - if(in > 700) -#else - if( (in > (base_fsen[num] + 200))||(in < (base_fsen[num] - 200))) -#endif - { - ret = 1; - } - return(ret); -} - -void line(void) -{ - ModeLed = 0; - wait(1); - while(sw1 != 0) - { -#if 0 - int line = get_line(0) ? 0 : 1; - line |= get_line(1) ? 0 : 2; - line |= get_line(2) ? 0 : 4; - line |= get_line(3) ? 0 : 8; -#else - int line = get_line(0) ? 1 : 0; - line |= get_line(1) ? 2 : 0; - line |= get_line(2) ? 4 : 0; - line |= get_line(3) ? 8 : 0; -#endif - -#if DBG - pc.printf("line=%02x %04x %04x %04x %04x\n\r",line,base_fsen[0],base_fsen[1],base_fsen[2],base_fsen[3]); -#endif -#if 1 - switch(line) - { - case 1: // ○○○● - left = 1.0; - right = -1.0; - break; - case 3: // ○○●● - left = 1.0; - right = -0.5; - break; - case 2: // ○○●○ - left = 1.0; - right = 0.5; - break; - case 6: // ○●●○ - left = 1.0; - right = 1.0; - break; - case 4: // ○●○○ - left = 0.5; - right = 1.0; - break; - case 12: // ●●○○ - left = -0.5; - right = 1.0; - break; - case 8: // ●○○○ - left = -1.0; - right = 1.0; - break; - default: - left = 1.0; - right = 1.0; - break; - } -#endif - } - ModeLed = 1; - left = 0.0; - right = 0.0; - wait(1); -} - -#if 0 -int counter1 = 0; -void p1_rise() -{ - if( pin2 == 1 ) - { - counter1++; - } - else - { - counter1--; - } -} -#endif - -/**************************************************************************/ -/*! - @brief Program entry point -*/ -/**************************************************************************/ +static const uint16_t uuid16_list[] = {0x00A0}; +const static uint8_t beaconPayload_url[] = { + 0xaa, + 0xfe, + + // URL + + 0x10, // Frame Type + 0x20, // Ranging Data + 0x02, // URL Scheme (http:// = 0x02) + + 'i', + 'o', + 't', + 'm', + 'a', + 'k', + 'e', + 'r', + '.', + 'v', + 'n', +}; int main(void) { - sw1.mode(PullUp); - sw2.mode(PullUp); - - encl1.mode(PullNone); - encl2.mode(PullNone); - encr1.mode(PullNone); - encr2.mode(PullNone); - - ModeLed = 1; - ConnectStateLed = 1; -#if DBG - //pc.baud(921600); - pc.baud(9600); - pc.printf("Start\n\r"); -#endif - outlow = 0; + ble.init(); + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED|GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); + + //ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_uid, sizeof(beaconPayload_uid)); + ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_url, sizeof(beaconPayload_url)); + //ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA,beaconPayload_tlm, sizeof(beaconPayload_tlm)); + + ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED); + + ble.setAdvertisingInterval(160); - if(sw2 == 0) - { -// pin1.mode(PullDown); -// pin1.rise(&p1_rise); - while(1) - { - //int in1 = pin1; - //int in2 = pin2; - //ModeLed = pin1; - //pc.printf("dat = %d %d\r\n",in1,in2); - base(); -#if 0 - left = 1.0; - right = 1.0; - wait(5); - left = -1.0; - right = -1.0; - wait(5); -#endif - } - } - - ble.init(); - ble.onConnection(onConnected); - ble.onDisconnection(onDisconnected); - ble.onDataWritten(onDataWritten); - - /* setup advertising */ - ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); - ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); - ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, - (const uint8_t *)"mbed WallbotBLE", sizeof("mbed WallbotBLE") - 1); - ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, - (const uint8_t *)RCBController_service_uuid, sizeof(RCBController_service_uuid)); - - ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ ble.startAdvertising(); - - ble.addService(RCBControllerService); - - - while (1) { - if(sw1 == 0) - { - bValue = 1; - line_mode = 1; - line(); - line_mode = 0; - bValue = 0; - } + + while(true) { ble.waitForEvent(); } } -