160801

Dependencies:   BLE_API mbed nRF51822

Fork of 151006_1st_Scenario_normal by ramo

main.cpp

Committer:
ssenwkdw
Date:
2016-08-01
Revision:
5:beffbecc70c6
Parent:
4:e80d411f87ae

File content as of revision 5:beffbecc70c6:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2015 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <cstdlib>
#include <ctime>
#include <math.h>
#include "mbed.h"
#include "ble/BLE.h"
#include "ble/DiscoveredCharacteristic.h"
#include "ble/DiscoveredService.h"

BLE        ble;
DigitalOut led(P0_19,1);
DigitalOut myled(P0_8);
DigitalOut neo(P0_6,1);
DigitalOut pin4(P0_4);
DigitalOut pin5(P0_5);
DigitalOut pin15(P0_15);
DigitalOut pin29(P0_29);

static const unsigned NUM_ROBOTS = 8;
static const unsigned CLASS = 0;

uint16_t customServiceUUID  = 0xA000;
uint16_t readwriteCharUUID  = 0xA001;
static const uint16_t secure_code[] = {0xABCD};

uint8_t info[NUM_ROBOTS]= {0};
uint8_t x[22] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
float y[22];

ReadWriteArrayGattCharacteristic<uint8_t, NUM_ROBOTS> readwriteChar(readwriteCharUUID, info);

GattCharacteristic *characteristics[] = {&readwriteChar};

GattService        customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));

DiscoveredCharacteristic characteristics_discovered;

uint8_t com_p;
bool movingTrigger = false;
uint8_t info_t[NUM_ROBOTS]= {0,};
uint8_t point;

float IRRead(PinName Pin) {
        AnalogIn AIn(Pin);
        float IRIn;
        IRIn=AIn;
        return(IRIn);
}

void moveRandom(void)
{
    uint8_t move_r1 = static_cast <int> (rand())%2; //0 or 1
    float move_r2 = 3 * static_cast <float> (rand()) / static_cast <float> (RAND_MAX); // 0~3

    if( move_r1 > 0.5) {
        move_r1 = 1;
    } else {
        move_r1 = 0;
    }

    if(move_r1==0) {
        pin4 = 1;
        pin5 = 1;
        pin15 = 0;
        pin29 = 0;
    } else {
        pin4 = 0;
        pin5 = 0;
        pin15 = 1;
        pin29 = 1;
    }
    wait(move_r2);

    pin4 = 1;
    pin5 = 1;
    pin15 = 1;
    pin29 = 1;
    float move_r3 = 3 * static_cast <float> (rand()) / static_cast <float> (RAND_MAX); // 0~3
    wait(move_r3);
}

void RGB_Show(uint8_t r, uint8_t g, uint8_t b)
{
    uint8_t rgb[3] = {g, r, b};
    uint8_t *p = rgb;
    uint8_t *end = p + 3;
    while (p < end) {
        uint8_t pix = *p++;
        for (uint8_t mask = 0x80; mask; mask >>= 1) {
            if (pix & mask) {
                // T1H 760ns
                NRF_GPIO->OUTSET = (1UL << 8);
                NRF_GPIO->OUTSET = (1UL << 8);
                NRF_GPIO->OUTSET = (1UL << 8);
                // T1L 660ns
                NRF_GPIO->OUTCLR = (1UL << 8);
            } else {
                // T0H 380ns
                NRF_GPIO->OUTSET = (1UL << 8);
                // T0L 840ns
                NRF_GPIO->OUTCLR = (1UL << 8);
                NRF_GPIO->OUTCLR = (1UL << 8);
                NRF_GPIO->OUTCLR = (1UL << 8);
                NRF_GPIO->OUTCLR = (1UL << 8);
            }
        }
    }
    NRF_GPIO->OUTCLR = (1UL << 8);
    wait_us(100);
}

void periodicCallback(void)
{
    led=!led;
    point = 0;
    for(int i=0; i<NUM_ROBOTS; i++) {
        point+=info[i];
    }
    if(point==0) {
        RGB_Show(0x00,0x00,0xff);
    } else if(point==1) {
        RGB_Show(0xff,0xff,0xff);
    } else if(point==2) {
        RGB_Show(0x00,0xff,0x00);
    } else if(point==3) {
        RGB_Show(0x00,0xff,0xff);
    } else if(point==4) {
        RGB_Show(0xff,0x00,0x00);
    } else if(point==5) {
        RGB_Show(0xff,0x00,0xff);
    } else if(point==6) {
        RGB_Show(0xff,0xff,0x00);
    } else if(point==7) {
        RGB_Show(0xff,0xff,0xff);
    } else if(point==8) {
        RGB_Show(0x00,0x00,0xff);
    }
}

void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
{
    float ran=static_cast <float> (rand()) / static_cast <float> (RAND_MAX); // 0~1 probability
    printf("com_p : %f OOOOOOOOOOOOOO ran : %f \r\n",y[com_p],ran);
    if( (params->rssi > -48) && (y[com_p] > ran) && (params->advertisingData[1] == 0xAF) ) {
        ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
    } else {
        movingTrigger = true;
    }
}

void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP)
{
    if (characteristicP->getUUID() == 0xA001) { /* !ALERT! Alter this filter to suit your device. */
        characteristics_discovered        = *characteristicP;
        printf("characteristic discovered\r\n");
        characteristics_discovered.read();
    }
}

void serviceDiscoveryCallback(const DiscoveredService *service)
{
}

void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
{
    info[7] += 1;
    ble.gap().stopAdvertising();
    ble.gap().stopScan();
    
    printf("adv peerAddr[%02x %02x %02x %02x %02x %02x]\r\n",
                   params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0]);
    movingTrigger = false;
    printf("connected\r\n");
    if (params->role == Gap::CENTRAL) {
        printf("CENTRAL\r\n");
        ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xA000, 0xA001);
    } else {
        printf("PERIPHERAL\r\n");
    }
}

void onDataReadCallback(const GattReadCallbackParams *response)
{
    if (response->handle == characteristics_discovered.getValueHandle()) {
        printf("info_t : ");
        for(int i=0; i < NUM_ROBOTS; i++) {
            info_t[i] = response->data[i];
            printf("%u \t",info_t[i]);
        }
        printf("\r\n");
        
        if(info[0] == 0) {
            if(response->data[0] == 0) {
                info[1] += 1; // +1 point
                info[2] = 0; // connection with normal
                info_t[1] += 1;
                info_t[2] = 0;
                characteristics_discovered.write(NUM_ROBOTS,info_t);
            } else {
                info[3] += 1; // -1 point
                info[2] = 1; // connection with malicious
                characteristics_discovered.write(NUM_ROBOTS,info_t);
            }
        } else {
            if(response->data[0] == 0) {
                info_t[3] += 1;
                info_t[2] = 1;
                characteristics_discovered.write(NUM_ROBOTS,info_t);
                printf("aaa\r\n");
            } else {
                characteristics_discovered.write(NUM_ROBOTS,info_t);
            }
        }
    }
}

void onDataWriteCallback(const GattWriteCallbackParams *params)
{
    printf("bbb\r\n");
    ble.updateCharacteristicValue(readwriteChar.getValueHandle(),info,NUM_ROBOTS);
}

void onDataWrittenCallback(const GattWriteCallbackParams *params)
{
    printf("ccc\r\n");
    for(int i=0; i<NUM_ROBOTS-1; i++) {
        info[i] = params->data[i];
    }
    printf("writecallbackparam : ");
    for(int i=0; i<NUM_ROBOTS; i++) {
        printf("%u \t",params->data[i]);
    }
    printf("\r\n");
    ble.gattServer().write(readwriteChar.getValueHandle(),info,NUM_ROBOTS);
    ble.updateCharacteristicValue(readwriteChar.getValueHandle(),params->data,params->len);
    printf("data is written well\r\n");
    
    ble.gap().disconnect(params->connHandle,Gap::REMOTE_USER_TERMINATED_CONNECTION);
}

void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
    printf("Current info : ");
    for(int i=0; i<NUM_ROBOTS; i++) {
        printf("%u \t",info[i]);
    }
    printf("\r\n");
    printf("disconnected\r\n");
    if(info[2] == 0) {
        if(com_p == 21) {
            com_p = 21;
        } else {
            com_p += 1;
        }
    } else if(info[2] == 1) {
        if(com_p == 0) {
            com_p = 0;
        } else {
            com_p -= 1;
        }
    }
    ble.gap().startAdvertising();
    ble.gap().startScan(advertisementCallback);
}

int main(void)
{   
    srand (static_cast <unsigned> (time(0))); //seeding for random
    for(int i=0; i<22;i++){
        y[i] = 0.1 + 0.9*(1-exp(-0.2*x[i]));
        printf("%f ",y[i]);
    }
    printf("\r\n");
    info[0] = CLASS; // normal : 0 & malicious : 1
    info[1] = 0; // point
    com_p = 11;
    
    srand (static_cast <unsigned> (time(0)));
    
    Ticker ticker;
    
    for(int i=0; i<NUM_ROBOTS; i++) {
        printf("%u \t",info[i]);
    }
    printf("\r\n");
    
    printf("communication for connection is started\r\n");
    ble.init();
    ble.gap().onConnection(connectionCallback);
    ble.gap().onDisconnection(disconnectionCallback);

    ble.gattClient().onDataRead(onDataReadCallback);
    ble.gattClient().onDataWrite(onDataWriteCallback);
    ble.gattServer().onDataWritten(onDataWrittenCallback);
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::RABOT_REDBEAR_BLE_NANO, (uint8_t *)secure_code, sizeof(secure_code));
    ble.gap().setAdvertisingInterval(59);

    ble.addService(customService);
    
    ble.gap().startAdvertising();
    ble.gap().setScanParams(125 /* scan interval */, 79 /* scan window */);
    ble.gap().startScan(advertisementCallback);

    while (true) {
        /*
                if(connectionState == false) {
                    ble.gap().startAdvertising();
                    ble.gap().startScan(advertisementCallback);
                } else {
                    ble.gap().stopAdvertising();
                    ble.gap().stopScan();
                }
        */
        ble.waitForEvent();
        if(movingTrigger == true) {
            moveRandom();
        } else {
            pin4 = 0;
            pin5 = 0;
            pin15 = 0;
            pin29 = 0;
        }
        if(info[1] == 20) {
            printf("Game over");
            break;
        }
    }
    ble.shutdown();
    pin4 = 0;
    pin5 = 0;
    pin15 = 0;
    pin29 = 0;
}