6/18 wallbot

Dependencies:   mbed

Fork of BLE_WallbotBLE_Challenge_byYUTAKA by Yutaka Yoshida

Revision:
0:76dfa9657d9d
Child:
1:a86c84ead24a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 12 02:40:34 2014 +0000
@@ -0,0 +1,415 @@
+#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();
+    }
+}
+