Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of BLE_WallbotBLE_Challenge by
main.cpp
- Committer:
- jksoft
- Date:
- 2014-11-12
- Revision:
- 0:76dfa9657d9d
- Child:
- 1:a86c84ead24a
File content as of revision 0:76dfa9657d9d:
#include "mbed.h"
#include "BLEDevice.h"
#include "RCBController.h"
#include "TB6612.h"
#define DBG 0
BLEDevice ble;
Serial pc(USBTX, USBRX);
/* 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 1
TB6612 left(P0_29,P0_23,P0_24);
TB6612 right(P0_28,P0_0,P0_30);
#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 pin1(P0_8);
DigitalIn pin2(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)
{
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;
}
pc.printf("[0]:%05d[1]:%05d[2]:%05d[3]:%05d\n\r",base_fsen[0],base_fsen[1],base_fsen[2],base_fsen[3]);
}
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
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;
}
}
ModeLed = 1;
left = 0.0;
right = 0.0;
wait(1);
}
int counter1 = 0;
void p1_rise()
{
if( pin2 == 1 )
{
counter1++;
}
else
{
counter1--;
}
}
/**************************************************************************/
/*!
@brief Program entry point
*/
/**************************************************************************/
int main(void)
{
sw1.mode(PullUp);
sw2.mode(PullUp);
ModeLed = 1;
ConnectStateLed = 1;
#if DBG
//pc.baud(921600);
pc.baud(9600);
pc.printf("Start\n\r");
#endif
outlow = 0;
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 (true) {
if(sw1 == 0)
{
bValue = 1;
line_mode = 1;
line();
line_mode = 0;
bValue = 0;
}
ble.waitForEvent();
}
}
