Remote I/O Switchx4 LEDx4 AINx2(Battery,Potentiometer) OUTx8 INx8 nRFUARTの改造版 ライブラリアップデートに注意 BLE_API,nRF51822,mbed

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_LoopbackUART by Bluetooth Low Energy

Revision:
14:388dd59269c8
Parent:
13:15764cc1f12c
Child:
15:828ad860628f
--- a/main.cpp	Tue Sep 29 12:02:15 2015 +0000
+++ b/main.cpp	Mon Dec 26 06:56:48 2016 +0000
@@ -16,52 +16,236 @@
 
 #include "mbed.h"
 #include "ble/BLE.h"
+#include "ble/services/UARTService.h"
+//
+////////////////////////////////////////
+//
+#define LED_ON          1
+#define LED_OFF         0
+//
+////////////////////////////////////////
+// I/O pin define
+#define LED_PIN1        P0_25
+#define LED_PIN2        P0_28
+#define LED_PIN3        P0_29
+#define LED_PIN4        P0_30
 
-#include "ble/services/UARTService.h"
+#define SWITCH_PIN1     P0_4
+#define SWITCH_PIN2     P0_5
+#define SWITCH_PIN3     P0_6
+#define SWITCH_PIN4     P0_7
+
+#define OUT_PORT_PIN1   P0_18
+#define OUT_PORT_PIN2   P0_17
+#define OUT_PORT_PIN3   P0_16
+#define OUT_PORT_PIN4   P0_20
+#define OUT_PORT_PIN5   P0_21
+#define OUT_PORT_PIN6   P0_22
+#define OUT_PORT_PIN7   P0_23
+#define OUT_PORT_PIN8   P0_24
 
-#define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
-                               * it will have an impact on code-size and power consumption. */
+#define IN_PORT_PIN1    P0_0
+#define IN_PORT_PIN2    P0_1
+#define IN_PORT_PIN3    P0_10
+#define IN_PORT_PIN4    P0_12
+#define IN_PORT_PIN5    P0_13
+#define IN_PORT_PIN6    P0_14
+#define IN_PORT_PIN7    P0_15
+#define IN_PORT_PIN8    P0_19
+
+#define ANALOG_IN_PIN1  P0_2
+#define ANALOG_IN_PIN2  P0_3
+
+//#define PWM_PIN         P0_8
+
+#define DEBUG_TX_PIN    P0_9
+#define DEBUG_RX_PIN    P0_11
+//
+////////////////////////////////////////
+//
+#define cmd_LED 'L' // "Lxx"
+#define cmd_OUT 'O' // "Oxx"
+//
+////////////////////////////////////////
+//
+DigitalOut      LED_1(LED_PIN1);
+DigitalOut      LED_2(LED_PIN2);
+DigitalOut      LED_3(LED_PIN3);
+DigitalOut      LED_4(LED_PIN4);
+
+DigitalIn       SW_1(SWITCH_PIN1);
+DigitalIn       SW_2(SWITCH_PIN2);
+DigitalIn       SW_3(SWITCH_PIN3);
+DigitalIn       SW_4(SWITCH_PIN4);
 
-#if NEED_CONSOLE_OUTPUT
-#define DEBUG(...) { printf(__VA_ARGS__); }
-#else
-#define DEBUG(...) /* nothing */
-#endif /* #if NEED_CONSOLE_OUTPUT */
+DigitalOut      DO_1(OUT_PORT_PIN1);
+DigitalOut      DO_2(OUT_PORT_PIN2);
+DigitalOut      DO_3(OUT_PORT_PIN3);
+DigitalOut      DO_4(OUT_PORT_PIN4);
+DigitalOut      DO_5(OUT_PORT_PIN5);
+DigitalOut      DO_6(OUT_PORT_PIN6);
+DigitalOut      DO_7(OUT_PORT_PIN7);
+DigitalOut      DO_8(OUT_PORT_PIN8);
+
+DigitalIn       DI_1(IN_PORT_PIN1);
+DigitalIn       DI_2(IN_PORT_PIN2);
+DigitalIn       DI_3(IN_PORT_PIN3);
+DigitalIn       DI_4(IN_PORT_PIN4);
+DigitalIn       DI_5(IN_PORT_PIN5);
+DigitalIn       DI_6(IN_PORT_PIN6);
+DigitalIn       DI_7(IN_PORT_PIN7);
+DigitalIn       DI_8(IN_PORT_PIN8);
+
+//
+Serial          DEBUG(DEBUG_TX_PIN, DEBUG_RX_PIN);
+AnalogIn        AIN_1(ANALOG_IN_PIN1);
+AnalogIn        AIN_2(ANALOG_IN_PIN2);
+//
+////////////////////////////////////////
+//
+BLEDevice  ble;
+UARTService *uartServicePtr;
+Ticker ticker;
+//
+////////////////////////////////////////
+uint16_t input_now;
+uint16_t input_old;
+uint16_t ain1_now;
+uint16_t ain2_now;
+uint16_t ain1_old;
+uint16_t ain2_old;
+uint16_t output_buf;
 
-BLEDevice  ble;
-DigitalOut led1(LED1);
+////////////////////////////////////////
+void periodicCallback_led_blink( void );
+void periodicCallback_sw_read( void );
+void set_LED( int num, int val );
+void set_OUT( int num, int val );
+void read_IN( void );
+void port_clear( void );
+void cmd_check( uint8_t* s );
+void board_test( void );
+//
+////////////////////////////////////////
+uint16_t board_test_fg = 0;
+uint16_t uart_cmd_check( void );
+uint16_t cmd_c_wp;
+uint8_t cmd_str[8];
+bool update_characteristic_fg;
+bool change_input_fg;
+bool first_update_fg;
+uint16_t adc_update_cnt;
+//
+////////////////////////////////////////
+// BLEイベント接続時
+void connectionCallback(const Gap::ConnectionCallbackParams_t * params)
+{
+    ticker.detach();
+    DEBUG.printf("Connection handle:%u \r\n",params->handle);
+    // stop blinking when we connect
+    LED_1 = LED_OFF;
+    read_IN();
+    ticker.attach(periodicCallback_sw_read, 0.1);
+    update_characteristic_fg = true;
+    first_update_fg = true;
+    adc_update_cnt = 0;
+}
 
-UARTService *uartServicePtr;
-
+//
+////////////////////////////////////////
+// BLEイベント切断時
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
-    DEBUG("Disconnected!\n\r");
-    DEBUG("Restarting the advertising process\n\r");
+    int i;
+    update_characteristic_fg = false;
+    ticker.detach();
+    DEBUG.printf("Disconnected!\n\r");
+    DEBUG.printf("Restarting the advertising process\n\r");
     ble.startAdvertising();
+    ticker.attach(periodicCallback_led_blink, 1);
+    for( i=1; i < 4+1 ; i++ ){ set_LED(i,0); }
+    for( i=1; i < 8+1 ; i++ ){ set_OUT(i,0); }
 }
-
+//
+////////////////////////////////////////
+// BLE-UART受信時
 void onDataWritten(const GattWriteCallbackParams *params)
 {
+    uint8_t* s;
     if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) {
         uint16_t bytesRead = params->len;
-        DEBUG("received %u bytes\n\r", bytesRead);
-        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
+        DEBUG.printf("received %u bytes\n\r", bytesRead);
+        s = (uint8_t*)(&(params->data[0]));
+        cmd_check(s);
+        // BLE-UART送信
+//        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
     }
 }
-
-void periodicCallback(void)
+//
+////////////////////////////////////////
+// 未接続時周期割り込み
+void periodicCallback_led_blink(void)
+{
+    LED_1 = !LED_1;
+}
+//
+////////////////////////////////////////
+// 接続時周期割り込み
+void periodicCallback_sw_read( void  )
 {
-    led1 = !led1;
+    char send_str[20];
+    uint16_t slen;
+
+    read_IN();
+    sprintf(send_str,"%04X,%04X,%04X \r",input_now,ain1_now,ain2_now);
+    slen = strlen(send_str);
+
+    if( first_update_fg == true )
+    {
+        first_update_fg = false;
+        change_input_fg = true;
+    }
+    else
+    {
+        change_input_fg = false;
+    }
+
+    if( input_now != input_old )
+    {
+        change_input_fg = true;
+    }
+    adc_update_cnt++;
+    if( adc_update_cnt > 10  )
+    {
+        adc_update_cnt = 0;
+        change_input_fg = true;
+    }
+    if(( update_characteristic_fg == true )&&( change_input_fg == true ))
+    {
+        DEBUG.printf("len=%d,data=%s",slen,send_str);
+        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(),(uint8_t*)(&send_str[0]),slen);
+    }
 }
-
+//
+////////////////////////////////////////
+// メイン
 int main(void)
 {
-    led1 = 1;
-    Ticker ticker;
-    ticker.attach(periodicCallback, 1);
+    DEBUG.baud(9600);
+    port_clear();
+    read_IN();
+    DEBUG.printf("\r\n");
+    DEBUG.printf("BLE remote I/O \r\n");
+    DEBUG.printf("2019/12/24\r\n");
+    read_IN();
+    DEBUG.printf("\r\n");
+    if( ( input_now & 0x0003 ) == 0x0003 ){ board_test(); } //SW1,2 ON?
+//
+    DEBUG.printf("Start program\r\n");
+    ticker.attach(periodicCallback_led_blink, 1);
 
-    DEBUG("Initialising the nRF51822\n\r");
     ble.init();
+    ble.onConnection(connectionCallback);
     ble.onDisconnection(disconnectionCallback);
     ble.onDataWritten(onDataWritten);
 
@@ -69,7 +253,8 @@
     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
     ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
-                                     (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
+                                     (const uint8_t *)"BLE IO", sizeof("BLE IO") - 1);
+//                                     (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
                                      (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
 
@@ -83,3 +268,233 @@
         ble.waitForEvent();
     }
 }
+
+////////////////////////////////////////
+void board_test( void )
+{
+//  I/O port debug
+    cmd_c_wp = 0;
+
+    DEBUG.printf("board I/O debug \r\n");
+    output_buf = 0;
+    read_IN();
+    while( 1 )
+    {
+        wait_ms(200);
+        read_IN();
+        DEBUG.printf("%04X,%04X,%04X \r",input_now,ain1_now,ain2_now);
+        //
+        if( input_now & 0x0001 ){ set_LED(1,1); } else { set_LED(1,0); }
+        if( input_now & 0x0002 ){ set_LED(2,1); } else { set_LED(2,0); }
+        if( input_now & 0x0004 ){ set_LED(3,1); } else { set_LED(3,0); }
+        if( input_now & 0x0008 ){ set_LED(4,1); } else { set_LED(4,0); }
+        //
+        if( output_buf & 0x0001 ){ set_OUT(1,1); } else { set_OUT(1,0); }
+        if( output_buf & 0x0002 ){ set_OUT(2,1); } else { set_OUT(2,0); }
+        if( output_buf & 0x0004 ){ set_OUT(3,1); } else { set_OUT(3,0); }
+        if( output_buf & 0x0008 ){ set_OUT(4,1); } else { set_OUT(4,0); }
+        if( output_buf & 0x0010 ){ set_OUT(5,1); } else { set_OUT(5,0); }
+        if( output_buf & 0x0020 ){ set_OUT(6,1); } else { set_OUT(6,0); }
+        if( output_buf & 0x0040 ){ set_OUT(7,1); } else { set_OUT(7,0); }
+        if( output_buf & 0x0080 ){ set_OUT(8,1); } else { set_OUT(8,0); }
+        output_buf++;
+        if( uart_cmd_check() != 0 )
+        {
+            cmd_check( cmd_str );
+        }
+    }
+}
+
+////////////////////////////////////////
+void set_LED( int num, int val )
+{
+    switch( num )
+    {
+        case 1:
+            LED_1 = val;
+            break;
+        case 2:
+            LED_2 = val;
+            break;
+        case 3:
+            LED_3 = val;
+            break;
+        case 4:
+            LED_4 = val;
+            break;
+    }
+}
+
+void set_OUT( int num, int val )
+{
+    switch( num )
+    {
+        case 1:
+            DO_1 = val;
+            break;
+        case 2:
+            DO_2 = val;
+            break;
+        case 3:
+            DO_3 = val;
+            break;
+        case 4:
+            DO_4 = val;
+            break;
+        case 5:
+            DO_5 = val;
+            break;
+        case 6:
+            DO_6 = val;
+            break;
+        case 7:
+            DO_7 = val;
+            break;
+        case 8:
+            DO_8 = val;
+            break;
+    }
+}
+
+void read_IN( void )
+{
+    input_old = input_now;
+    input_now = 0;
+    if( SW_1 == 0 ){ input_now |= 0x0001; }
+    if( SW_2 == 0 ){ input_now |= 0x0002; }
+    if( SW_3 == 0 ){ input_now |= 0x0004; }
+    if( SW_4 == 0 ){ input_now |= 0x0008; }
+    if( DI_1 == 0 ){ input_now |= 0x0100; }
+    if( DI_2 == 0 ){ input_now |= 0x0200; }
+    if( DI_3 == 0 ){ input_now |= 0x0400; }
+    if( DI_4 == 0 ){ input_now |= 0x0800; }
+    if( DI_5 == 0 ){ input_now |= 0x1000; }
+    if( DI_6 == 0 ){ input_now |= 0x2000; }
+    if( DI_7 == 0 ){ input_now |= 0x4000; }
+    if( DI_8 == 0 ){ input_now |= 0x8000; }
+    ain1_old = ain1_now;
+    ain2_old = ain2_now;
+    ain1_now = AIN_1.read_u16();
+    ain2_now = AIN_2.read_u16();;
+}
+
+void port_clear( void )
+{
+    int i;
+    for( i=1; i < 4+1 ; i++ ){ set_LED(i,0); }
+    for( i=1; i < 8+1 ; i++ ){ set_OUT(i,0); }
+//
+    LED_1 = 1;
+    wait_ms(100);
+    LED_2 = 1;
+    wait_ms(100);
+    LED_3 = 1;
+    wait_ms(100);
+    LED_4 = 1;
+    wait_ms(100);
+    LED_1 = 0;
+    wait_ms(100);
+    LED_2 = 0;
+    wait_ms(100);
+    LED_3 = 0;
+    wait_ms(100);
+    LED_4 = 0;
+    wait_ms(400);
+    LED_1 = 1;
+    LED_2 = 1;
+    LED_3 = 1;
+    LED_4 = 1;
+    wait_ms(400);
+    LED_1 = 0;
+    LED_2 = 0;
+    LED_3 = 0;
+    LED_4 = 0;
+//
+}
+
+uint16_t uart_cmd_check( void )
+{
+    uint16_t res;
+    uint8_t c;
+    res = 0;
+    if( DEBUG.readable() )
+    {
+        c = DEBUG.getc();
+        cmd_str[cmd_c_wp] = c;
+        cmd_c_wp++;
+        if( cmd_c_wp >= 4 )
+        {
+            cmd_str[cmd_c_wp] = 0;
+            cmd_c_wp = 0;
+            res = 1;
+        }
+    }
+    return res;
+}
+
+void cmd_check( uint8_t* s )
+{
+    int val;
+
+    DEBUG.printf("\r\ncmd=%s\r\n",s);
+    if( s[2] == '0' )
+    {
+        val = 0;
+    }
+    else if( s[2] == '1' )
+    {
+        val = 1;
+    }
+    if( s[0] == 'L' )
+    {
+        switch( s[1] )
+        {
+            case '1':
+                set_LED( 1, val );
+                break;
+            case '2':
+                set_LED( 2, val );
+                break;
+            case '3':
+                set_LED( 3, val );
+                break;
+            case '4':
+                set_LED( 4, val );
+                break;
+        }
+        return;
+    }
+    if( s[0] == 'O' )
+    {
+        switch( s[1] )
+        {
+            case '1':
+                set_OUT( 1, val );
+                break;
+            case '2':
+                set_OUT( 2, val );
+                break;
+            case '3':
+                set_OUT( 3, val );
+                break;
+            case '4':
+                set_OUT( 4, val );
+                break;
+            case '5':
+                set_OUT( 5, val );
+                break;
+            case '6':
+                set_OUT( 6, val );
+                break;
+            case '7':
+                set_OUT( 7, val );
+                break;
+            case '8':
+                set_OUT( 8, val );
+                break;
+        }
+        return;
+    }
+}
+
+