Wallbot_CaaS

Dependencies:   MPU6050 mbed PID

Fork of BLE_MPU6050_test6_challenge_sb by Junichi Katsu

old_main.cpp

Committer:
c201075
Date:
2018-05-15
Revision:
2:64f85c9eb556
Parent:
main.cpp@ 0:8468a4403fea

File content as of revision 2:64f85c9eb556:

#include "mbed.h"
#include "MPU6050.h"
#include "BLEDevice.h"
#include "wallbotble.h"
#include "RCBController.h"
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "pictLIB.h"


#define DBG 0

enum _mode {
    Nomal = 0,      // ????[?h
    LineFollow,     // ???C???g???[?X???[?h
    Challenge,      // ?`???????W???[?h        
};

Serial pc(USBTX, USBRX);
BLEDevice  ble;
Ticker ticker;
MPU6050 mpu;
wallbotble wb;

myI2C i2c(P0_22,P0_21);

Adafruit_8x8matrix matrix1 = Adafruit_8x8matrix(&i2c);
Adafruit_8x8matrix matrix2 = Adafruit_8x8matrix(&i2c);

PICTLIB pl(16,16);

int mode = Nomal;

char bValue = 0;

#if 1
char data[16][16] =
{
{0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0},
{0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0},
{0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};
char data2[16][16] =
{
{0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
{1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1},
{0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,0},
{0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0},
{0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0},
};
#else
char data[16][16] =
{
{0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0},
{0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0},
{0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0},
{0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,0},
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
{0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0},
{0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0},
{0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0},
{0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0},
{0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0},
{0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0},
{0,1,0,0,1,0,0,1,1,0,0,1,0,0,1,0},
{0,1,0,0,0,1,1,0,0,1,1,0,0,0,1,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0},
};
#endif

char	dsp_data[16][16];
char	dsp_data2[16][16];

/* 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 SendMessage(char *msg)
{
    if (!ble.getGapState().connected) {
        return;
    }
    int len = strlen(msg);
    
    if(len < 10)
    {
        strcpy( (char*)_mValue ,msg );
        ble.updateCharacteristicValue(b_Char.getValueAttribute().getHandle(), (uint8_t *)_mValue, sizeof(_mValue));
    }
}

void onConnected(Gap::Handle_t handle, Gap::addr_type_t peerAddrType ,const Gap::address_t peerAddr,const Gap::ConnectionParams_t *params)
{
    wb.set_led2(1);
#if DBG
    pc.printf("Connected\n\r");
#endif
}

void onDisconnected(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
    wb.stop();

    ble.startAdvertising();
    wb.set_led2(0);
#if DBG
    pc.printf("Disconnected\n\r");
#endif
}

void periodicCallback(void)
{
    if (!ble.getGapState().connected) {
        return;
    }
    if( (bValue == 0)&&(wb.GetLinePosition() != 0) )
    {
        // Game over
        wb.stop();
        bValue = 10;  
    }
    if( bValue > 0 )
    {
        wb.stop();
        SendMessage("GAME OVER");
        bValue--;
        if( bValue == 0 )
        {
            wb.set_led1(0);
            SendMessage(" NOMAL  ");
            mode = Nomal;
            ticker.detach();
        }
    }
}


// GattEvent
void onDataWritten(const GattCharacteristicWriteCBParams *params)
{
    if( (params->charHandle == ControllerChar.getValueAttribute().getHandle()) && ( mode != LineFollow ))
    {
        float right_factor;
        float left_factor;

        memcpy( &controller.data[0], params->data , params->len );
#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        
        if(mode == Challenge)
        {
            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 )
            {
                wb.left_motor(left_factor);
                wb.right_motor(right_factor);
            }
            else if( controller.status.A == 1 )
            {
                wb.left_motor(-right_factor);
                wb.right_motor(-left_factor);
            }
            else
            {
        		wb.forward(1.0);
            }
        }
        else
        {
            if( (controller.status.LeftAnalogUD != 128)||(controller.status.RightAnalogUD != 128) )
            {
                left_factor = ((float)((int)controller.status.LeftAnalogUD -128) / 128.0);
                right_factor = ((float)((int)controller.status.RightAnalogUD -128) / 128.0);

                wb.left_motor(left_factor);
                wb.right_motor(right_factor);
            }
            else
            {
                float factor = ((float)((int)controller.status.AcceleX -128) / 128.0); 
    
                right_factor = ((factor <= 0.0) ? 1.0 : 1.0 - (factor*2));
                left_factor = ((factor >= 0.0) ? 1.0 : 1.0 - (-factor*2));
    
                if( controller.status.B == 1 )
                {
                    wb.left_motor(left_factor);
                    wb.right_motor(right_factor);
                }
                else if( controller.status.A == 1 )
                {
                    wb.left_motor(-right_factor);
                    wb.right_motor(-left_factor);
                }
                else if( controller.status.UP == 1 )
                {
                    wb.forward(1.0);
                }
                else if( controller.status.DOWN == 1 )
                {
                    wb.backward(1.0);
                }
                else if( controller.status.RIGHT == 1 )
                {
                    wb.right_turn(1.0);
                }
                else if( controller.status.LEFT == 1 )
                {
                    wb.left_turn(1.0);
                }
                else
                {
                    wb.stop();   
                }
                if((controller.status.UP == 1)&&(controller.status.DOWN == 1))  // START BUTTON
                {
                    SendMessage("Challenge");
                    wb.set_led1(1);
                    mode = Challenge;
                    wb.stop();
                    ticker.attach(periodicCallback, 0.1);
                }
            }
        }
    }
}

void line_follow_mode(void)
{
    switch(wb.GetLinePosition())
    {
        case 1:                 // ????????
            wb.left_motor(1.0);
            wb.right_motor(-1.0);
            break;
        case 3:                 // ????????
            wb.left_motor(1.0);
            wb.right_motor(-0.5);
            break;
        case 2:                 // ????????
            wb.left_motor(1.0);
            wb.right_motor(0.5);
            break;
        case 6:                 // ????????
            wb.left_motor(1.0);
            wb.right_motor(1.0);
            break;
        case 4:                 // ????????
            wb.left_motor(0.5);
            wb.right_motor(1.0);
            break;
        case 12:                // ????????
            wb.left_motor(-0.5);
            wb.right_motor(1.0);
            break;
        case 8:                 // ????????
            wb.left_motor(-1.0);
            wb.right_motor(1.0);
            break;
        default:
            wb.left_motor(1.0);
            wb.right_motor(1.0);
            break;
    }
}

float read_rad()
{
    int16_t ax, ay, az;
    int16_t gx, gy, gz;
    static float old_rad = 1000.0;

    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    //pc.printf("%d;%d;%d;%d;%d;%d\n\r",ax,ay,az,gx,gy,gz);
    float rad;
    if( ax > 0.0 )
    {
        rad = ((float)ay / 16000.0) * 90.0;    
    }
    else
    {
        rad = ((float)ay / 16000.0) * 90.0;
        if( ay > 0 )
        {
            rad = 180 - rad;
        }
        else
        {
            rad = -180 - rad;
        }
    }
    int d;
    if( rad > 0 )
    {
        d = (rad + 0.5) / 10;
    }
    else
    {
        d = (rad - 0.5) / 10;
    }
    d *= 10;
    rad = -d;
    //pc.printf("%f;%d;%d\n\r",rad,ax,ay);

    if( old_rad != 1000.0 )
    {
        if( (old_rad + 20.0) >= rad)
        {
            old_rad = rad;    
        }
        else if( (old_rad - 20.0) <= rad)
        {
            
        }
        else
        {
            rad = old_rad;
        }
    }
    return(rad);
}


void drowDisplay()
{
    for (int y = 0; y < 8; y++) {
      for (int x = 0; x < 16; x++) {
        if( dsp_data[x][y+8] == 1 )
        {
            matrix1.drawPixel(x, y, LED_ON);
        }
        else
        {
            matrix1.drawPixel(x, y, LED_OFF);
        }
        if( dsp_data[x][y] == 1 )
        {
            matrix2.drawPixel(x, y, LED_ON);
        }
        else
        {
            matrix2.drawPixel(x, y, LED_OFF);
        }
      }
    }
    matrix1.writeDisplay();  // write the changes we just made to the display
    matrix2.writeDisplay();  // write the changes we just made to the display

}

/**************************************************************************/
/*!
    @brief  Program entry point
*/
/**************************************************************************/
int main(void)
{
    char   in[ 16 ][ 16 ];  //  
    char   in2[ 16 ][ 16 ];  //  
    float rad_set = 0.0;
    float rad = 0.0;
    int count = 0;

    pc.printf("START\n\r");
    
    mpu.initialize();
#if 1
    matrix1.begin(0x71);
    matrix2.begin(0x70);
#else
    matrix1.begin(0x70);
    matrix2.begin(0x74);
#endif
    matrix1.setBrightness(15);
    matrix2.setBrightness(15);
    matrix1.clear();
    matrix2.clear();

    for ( int i = 0; i < 16; i++ )
        for ( int j = 0; j < 16; j++ )
            in[15-i][j] = data[i][j];

    for ( int i = 0; i < 16; i++ )
        for ( int j = 0; j < 16; j++ )
            dsp_data[i][j] = in[i][j];
            
    for ( int i = 0; i < 16; i++ )
        for ( int j = 0; j < 16; j++ )
            in2[15-i][j] = data2[i][j];

    for ( int i = 0; i < 16; i++ )
        for ( int j = 0; j < 16; j++ )
            dsp_data[i][j] = in2[i][j];
            
	drowDisplay();

    wb.f_sensor_calibrate();

#if DBG
    pc.baud(9600);
    DBG(pc.printf("Start\n\r");)
#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(wb.GetSw())
        {
            if( mode == LineFollow)
            {
			    wb.stop();
			    
			    mode = Nomal;
			    wb.set_led1(0);
	        }
	        else
	        {
	            mode = LineFollow;
			    wb.set_led1(1);
	        }
	        wait(1.0);
        }
        if(mode == LineFollow)
        {
            line_follow_mode();
        }
        else
        {
            ble.waitForEvent();
        }
        if(mode == Challenge)
        {
			count++;
			if(count > 50)
			{
				count = 0;
		        pl.scroll(&in[0][0],&dsp_data[0][0]);
				drowDisplay();
			    for ( int i = 0; i < 16; i++ )
			        for ( int j = 0; j < 16; j++ )
			            in[i][j] = dsp_data[i][j];
			}
		}
		else
		{
        rad = read_rad();
		
		if( (rad > -45.0)&&(rad < 45.0 ) )
		{
			rad = 0.0;
	    }
		else if( (rad > 45.0)&&(rad < 135.0 ) )
		{
			rad = 90.0;
	    }
		else if( ((rad > 135.0)&&(rad < 180.0 ))||((rad > -180.0)&&(rad < -135.0 )) )
		{
			rad = 180.0;
	    }
		else if( (rad > -135.0)&&(rad < -45.0 ) )
		{
			rad = -90.0;
	    }
		else
		{
			
		}
		
		if( rad_set > rad )
		{
			if( (rad_set == 180)&&(rad <0) )
			{
				rad_set = -175;
			}
			else
			{
				rad_set -= 5.0;
			}
		}
		else if( rad_set < rad )
		{
			if( (rad == 180.0)&&(rad_set <0))
			{
				rad_set -= 5.0;
			}
			else
			{
				rad_set += 5.0;
			}
		}
		else
		{
			;
		}
		if(rad_set == -180.0)
		{
			rad_set = 180.0;
		}
        pl.rotation(rad_set,&in2[0][0],&dsp_data[0][0]);
		drowDisplay();
		}
    }
}