3タイプのコントロールに対応

Dependencies:   BLE_API TB6612FNG mbed nRF51822

Fork of BLE_WALLBOT_BLE by Junichi Katsu

Committer:
jksoft
Date:
Mon Sep 29 11:26:56 2014 +0000
Revision:
5:88d466dea486
Parent:
4:ca2ee032bc5a
??????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:8c643bfe55b7 1 #include "mbed.h"
jksoft 1:48f6e08a3ac2 2 #include "BLEDevice.h"
jksoft 0:8c643bfe55b7 3 #include "RCBController.h"
jksoft 4:ca2ee032bc5a 4 #include "TB6612.h"
jksoft 0:8c643bfe55b7 5
jksoft 5:88d466dea486 6 #define DBG 0
jksoft 0:8c643bfe55b7 7
jksoft 1:48f6e08a3ac2 8 BLEDevice ble;
jksoft 0:8c643bfe55b7 9 Serial pc(USBTX, USBRX);
jksoft 0:8c643bfe55b7 10 /* LEDs for indication: */
jksoft 4:ca2ee032bc5a 11 DigitalOut ConnectStateLed(P0_18);
jksoft 5:88d466dea486 12 DigitalOut testLED(P0_19);
jksoft 4:ca2ee032bc5a 13 DigitalOut outlow(P0_20);
jksoft 5:88d466dea486 14 DigitalIn sw1(P0_16);
jksoft 5:88d466dea486 15 DigitalIn sw2(P0_17);
jksoft 5:88d466dea486 16
jksoft 4:ca2ee032bc5a 17 //PwmOut ControllerStateLed(LED2);
jksoft 0:8c643bfe55b7 18
jksoft 4:ca2ee032bc5a 19 TB6612 left(P0_29,P0_24,P0_23);
jksoft 4:ca2ee032bc5a 20 TB6612 right(P0_28,P0_30,P0_0);
jksoft 0:8c643bfe55b7 21
jksoft 0:8c643bfe55b7 22 /* RCBController Service */
jksoft 0:8c643bfe55b7 23 static const uint16_t RCBController_service_uuid = 0xFFF0;
jksoft 0:8c643bfe55b7 24 static const uint16_t RCBController_Characteristic_uuid = 0xFFF1;
jksoft 1:48f6e08a3ac2 25 uint8_t RCBControllerPayload[10] = {0,};
jksoft 1:48f6e08a3ac2 26
jksoft 1:48f6e08a3ac2 27 GattCharacteristic ControllerChar (RCBController_Characteristic_uuid,RCBControllerPayload,10, 10,
jksoft 0:8c643bfe55b7 28 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
jksoft 0:8c643bfe55b7 29 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
jksoft 1:48f6e08a3ac2 30 GattCharacteristic *ControllerChars[] = {&ControllerChar};
jksoft 1:48f6e08a3ac2 31 GattService RCBControllerService(RCBController_service_uuid, ControllerChars, sizeof(ControllerChars) / sizeof(GattCharacteristic *));
jksoft 0:8c643bfe55b7 32
jksoft 0:8c643bfe55b7 33 RCBController controller;
jksoft 0:8c643bfe55b7 34
jksoft 5:88d466dea486 35 int cmode = 0;
jksoft 5:88d466dea486 36
jksoft 5:88d466dea486 37 void onConnected(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)
jksoft 0:8c643bfe55b7 38 {
jksoft 1:48f6e08a3ac2 39 ConnectStateLed = 0;
jksoft 0:8c643bfe55b7 40 #if DBG
jksoft 1:48f6e08a3ac2 41 pc.printf("Connected\n\r");
jksoft 0:8c643bfe55b7 42 #endif
jksoft 1:48f6e08a3ac2 43 }
jksoft 0:8c643bfe55b7 44
jksoft 5:88d466dea486 45 void onDisconnected(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
jksoft 1:48f6e08a3ac2 46 {
jksoft 1:48f6e08a3ac2 47 ble.startAdvertising();
jksoft 1:48f6e08a3ac2 48 ConnectStateLed = 1;
jksoft 0:8c643bfe55b7 49 #if DBG
jksoft 1:48f6e08a3ac2 50 pc.printf("Disconnected\n\r");
jksoft 0:8c643bfe55b7 51 #endif
jksoft 1:48f6e08a3ac2 52 }
jksoft 1:48f6e08a3ac2 53
jksoft 0:8c643bfe55b7 54
jksoft 0:8c643bfe55b7 55 // GattEvent
jksoft 5:88d466dea486 56 void onDataWritten(const GattCharacteristicWriteCBParams *params)
jksoft 0:8c643bfe55b7 57 {
jksoft 5:88d466dea486 58 if (params->charHandle == ControllerChar.getValueAttribute().getHandle())
jksoft 5:88d466dea486 59 {
jksoft 1:48f6e08a3ac2 60 uint16_t bytesRead;
jksoft 5:88d466dea486 61 memcpy( &controller.data[0], params->data , params->len );
jksoft 5:88d466dea486 62 // ble.readCharacteristicValue(ControllerChar.getHandle(),RCBControllerPayload, &bytesRead);
jksoft 5:88d466dea486 63 // memcpy( &controller.data[0], RCBControllerPayload, sizeof(controller));
jksoft 0:8c643bfe55b7 64 #if DBG
jksoft 1:48f6e08a3ac2 65
jksoft 1:48f6e08a3ac2 66 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],
jksoft 0:8c643bfe55b7 67 controller.data[5],controller.data[6],controller.data[7],controller.data[8],controller.data[9]);
jksoft 0:8c643bfe55b7 68 #endif
jksoft 5:88d466dea486 69 float right_factor;
jksoft 5:88d466dea486 70 float left_factor;
jksoft 5:88d466dea486 71
jksoft 5:88d466dea486 72 left_factor = ((float)((int)controller.status.LeftAnalogUD -128) / 128.0);
jksoft 5:88d466dea486 73 right_factor = ((float)((int)controller.status.RightAnalogUD -128) / 128.0);
jksoft 5:88d466dea486 74
jksoft 5:88d466dea486 75 if( (left_factor != 0.0)||(right_factor != 0.0) )
jksoft 5:88d466dea486 76 {
jksoft 5:88d466dea486 77 left = left_factor;
jksoft 5:88d466dea486 78 right = right_factor;
jksoft 5:88d466dea486 79 }
jksoft 5:88d466dea486 80 else
jksoft 5:88d466dea486 81 {
jksoft 5:88d466dea486 82 float factor = ((float)((int)controller.status.AcceleX -128) / 128.0);
jksoft 5:88d466dea486 83
jksoft 5:88d466dea486 84 float right_factor = ((factor <= 0.0) ? 1.0 : 1.0 - (factor*2));
jksoft 5:88d466dea486 85 float left_factor = ((factor >= 0.0) ? 1.0 : 1.0 - (-factor*2));
jksoft 5:88d466dea486 86
jksoft 5:88d466dea486 87 if( controller.status.B == 1 )
jksoft 5:88d466dea486 88 {
jksoft 5:88d466dea486 89 left = left_factor;
jksoft 5:88d466dea486 90 right = right_factor;
jksoft 5:88d466dea486 91 }
jksoft 5:88d466dea486 92 else if( controller.status.A == 1 )
jksoft 5:88d466dea486 93 {
jksoft 5:88d466dea486 94 left = -right_factor;
jksoft 5:88d466dea486 95 right = -left_factor;
jksoft 5:88d466dea486 96 }
jksoft 5:88d466dea486 97 else if( controller.status.UP == 1 )
jksoft 5:88d466dea486 98 {
jksoft 5:88d466dea486 99 left = 1.0;
jksoft 5:88d466dea486 100 right = 1.0;
jksoft 5:88d466dea486 101 }
jksoft 5:88d466dea486 102 else if( controller.status.DOWN == 1 )
jksoft 5:88d466dea486 103 {
jksoft 5:88d466dea486 104 left = -1.0;
jksoft 5:88d466dea486 105 right = -1.0;
jksoft 5:88d466dea486 106 }
jksoft 5:88d466dea486 107 else if( controller.status.RIGHT == 1 )
jksoft 5:88d466dea486 108 {
jksoft 5:88d466dea486 109 left = 1.0;
jksoft 5:88d466dea486 110 right = -1.0;
jksoft 5:88d466dea486 111 }
jksoft 5:88d466dea486 112 else if( controller.status.LEFT == 1 )
jksoft 5:88d466dea486 113 {
jksoft 5:88d466dea486 114 left = -1.0;
jksoft 5:88d466dea486 115 right = 1.0;
jksoft 5:88d466dea486 116 }
jksoft 5:88d466dea486 117 else
jksoft 5:88d466dea486 118 {
jksoft 5:88d466dea486 119 left = 0.0;
jksoft 5:88d466dea486 120 right = 0.0;
jksoft 5:88d466dea486 121 }
jksoft 5:88d466dea486 122 }
jksoft 4:ca2ee032bc5a 123 //ControllerStateLed = (float)controller.status.LeftAnalogLR / 255.0;
jksoft 1:48f6e08a3ac2 124 }
jksoft 0:8c643bfe55b7 125
jksoft 1:48f6e08a3ac2 126 }
jksoft 0:8c643bfe55b7 127
jksoft 0:8c643bfe55b7 128 /**************************************************************************/
jksoft 0:8c643bfe55b7 129 /*!
jksoft 0:8c643bfe55b7 130 @brief Program entry point
jksoft 0:8c643bfe55b7 131 */
jksoft 0:8c643bfe55b7 132 /**************************************************************************/
jksoft 0:8c643bfe55b7 133 int main(void)
jksoft 0:8c643bfe55b7 134 {
jksoft 4:ca2ee032bc5a 135 pc.baud(921600);
jksoft 4:ca2ee032bc5a 136
jksoft 5:88d466dea486 137 sw1.mode(PullUp);
jksoft 5:88d466dea486 138 sw2.mode(PullUp);
jksoft 4:ca2ee032bc5a 139
jksoft 4:ca2ee032bc5a 140 ConnectStateLed = 1;
jksoft 0:8c643bfe55b7 141 #if DBG
jksoft 0:8c643bfe55b7 142 pc.printf("Start\n\r");
jksoft 0:8c643bfe55b7 143 #endif
jksoft 4:ca2ee032bc5a 144 outlow = 0;
jksoft 1:48f6e08a3ac2 145
jksoft 2:dd85fdc18224 146 ble.init();
jksoft 1:48f6e08a3ac2 147 ble.onConnection(onConnected);
jksoft 1:48f6e08a3ac2 148 ble.onDisconnection(onDisconnected);
jksoft 1:48f6e08a3ac2 149 ble.onDataWritten(onDataWritten);
jksoft 1:48f6e08a3ac2 150
jksoft 1:48f6e08a3ac2 151 /* setup advertising */
jksoft 1:48f6e08a3ac2 152 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
jksoft 1:48f6e08a3ac2 153 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jksoft 1:48f6e08a3ac2 154 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
jksoft 4:ca2ee032bc5a 155 (const uint8_t *)"mbed WallbotBLE", sizeof("mbed WallbotBLE") - 1);
jksoft 1:48f6e08a3ac2 156 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
jksoft 1:48f6e08a3ac2 157 (const uint8_t *)RCBController_service_uuid, sizeof(RCBController_service_uuid));
jksoft 0:8c643bfe55b7 158
jksoft 1:48f6e08a3ac2 159 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
jksoft 1:48f6e08a3ac2 160 ble.startAdvertising();
jksoft 0:8c643bfe55b7 161
jksoft 1:48f6e08a3ac2 162 ble.addService(RCBControllerService);
jksoft 4:ca2ee032bc5a 163
jksoft 5:88d466dea486 164 testLED = cmode;
jksoft 5:88d466dea486 165 int old_sw = 0;
jksoft 0:8c643bfe55b7 166
jksoft 1:48f6e08a3ac2 167 while (true) {
jksoft 5:88d466dea486 168 #if 0
jksoft 5:88d466dea486 169 if(sw1 == 0 && old_sw == 1)
jksoft 5:88d466dea486 170 {
jksoft 5:88d466dea486 171 cmode = !cmode;
jksoft 5:88d466dea486 172 testLED = cmode;
jksoft 5:88d466dea486 173 wait(0.1);
jksoft 5:88d466dea486 174 }
jksoft 5:88d466dea486 175 old_sw = sw1;
jksoft 5:88d466dea486 176 #endif
jksoft 1:48f6e08a3ac2 177 ble.waitForEvent();
jksoft 0:8c643bfe55b7 178 }
jksoft 0:8c643bfe55b7 179 }
jksoft 0:8c643bfe55b7 180