同時公開のFunctionGenerator-DACと同時利用によりファンクション・ジェネレータを実現する。

Dependencies:   BLE_API mbed nRF51822

FunctionGenerator-DAC

/users/ohneta/code/FunctionGenerator-DAC/

詳細は上記、FunctionGenerator-DACでおこないます。

main.cpp

Committer:
ohneta
Date:
2015-06-16
Revision:
0:6e47fe8d8f5c

File content as of revision 0:6e47fe8d8f5c:

#include "mbed.h"

#include <I2C.h>
#include "BLEDevice.h"
#include "FunctionGenCommands.h"

// prototypes
 void connectionCallback(Gap::Handle_t Handle_t,
                        Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr,
                        Gap::addr_type_t ownAddrType,  const Gap::address_t ownAddr,
                        const Gap::ConnectionParams_t *params);
void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason);
void writeCharCallback(const GattCharacteristicWriteCBParams *params);
void lookme();
void tickerCallback();

//void commandPrint(FGCommand *command);

//---------------------------------------------------------

Ticker ticker;
Serial      pc(P0_9, P0_11);
DigitalOut  led1(P0_18);
DigitalOut  led2(P0_19);

DigitalOut  lookmeOut(P0_21);
I2C i2c(P0_22, P0_20);
const int i2cSlaveAddr = 0x62;

//---------------------------------------------------------

BLEDevice ble;

const static char     DEVICE_NAME[] = "mbedFuncGen 0.01";
static const uint16_t uuid16_list[] = {0xFFFF};     // Custom UUID, FFFF is reserved for development
 
// Set Up custom Characteristics
static uint8_t          deviceValue = 0;
static uint8_t          outputValue = 0;
static uint32_t         frequencyValue = 0;
static WaveformInfo     waveformInfoValue;
static WaveformBlock    waveformBlockValue;

WriteOnlyArrayGattCharacteristic<uint8_t, 0>        resetChar(CHARACTERISTICS_UUID_RESET, NULL);
ReadWriteArrayGattCharacteristic<uint8_t, 1>        deviceChar(CHARACTERISTICS_UUID_DEVICE, &deviceValue);
ReadWriteArrayGattCharacteristic<uint8_t, 1>        outputChar(CHARACTERISTICS_UUID_OUTPUT, &outputValue);
ReadWriteArrayGattCharacteristic<uint32_t, 1>       frequencyChar(CHARACTERISTICS_UUID_FREQUENCY, &frequencyValue);
WriteOnlyArrayGattCharacteristic<WaveformInfo, 1>   waveformInfoChar(CHARACTERISTICS_UUID_WAVEFORMINFO, &waveformInfoValue);
WriteOnlyArrayGattCharacteristic<WaveformBlock, 1>  waveformBlockChar(CHARACTERISTICS_UUID_WAVEFORMBLOCK, &waveformBlockValue);
WriteOnlyArrayGattCharacteristic<uint8_t, 0>        waveformToBufferChar(CHARACTERISTICS_UUID_WAVEFORMTOBUFFER, NULL);

// Set up custom service
GattCharacteristic *characteristics[] = {
    &resetChar,
    &deviceChar,
    &outputChar,
    &frequencyChar,
    &waveformInfoChar,
    &waveformBlockChar,
    &waveformToBufferChar
};
GattService customService(  0xA000,
                            characteristics,
                            sizeof(characteristics) / sizeof(GattCharacteristic *)  );
 
 
//---------------------------------------------------------
/**
 *
 */
 void connectionCallback(Gap::Handle_t Handle_t,
                        Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr,
                        Gap::addr_type_t ownAddrType,  const Gap::address_t ownAddr,
                        const Gap::ConnectionParams_t *params)
{
    pc.printf("connectionCallback\n");
}

//---------------------------------------------------------
/*
 *  Restart advertising when phone app disconnects
 */ 
void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
{
    pc.printf("disconnectionCallback\n");
    ble.startAdvertising(); 
}

//---------------------------------------------------------
//---------------------------------------------------------
/* 
 *  handle writes to writeCharacteristic
 */
void writeCharCallback(const GattCharacteristicWriteCBParams *params)
{
    led2 = !led2;

    FGPacket  fgPacket;

    pc.printf("--------\n");
    pc.printf("writeCharCallback\n");
    {
        pc.printf("Data received: length = %d, data = ", params->len); 
        for(int x = 0; x < params->len; x++) {
            pc.printf("%02x ", params->data[x]);
        }
        pc.printf("\n");
    }

    if (params->charHandle == resetChar.getValueHandle()) {
        pc.printf("resetChar\n");
        
        fgPacket.header.command = FGCommand_Reset;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandReset);
        //fgPacket.body.commandReset = NULL;

    } else
    if (params->charHandle == deviceChar.getValueHandle()) {
        memcpy(&deviceValue, params->data, params->len);
        pc.printf("deviceChar : deviceValue: %x\n", deviceValue);
        
        fgPacket.header.command = FGCommand_Device;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandDevice);
        fgPacket.body.commandDevice.device = deviceValue;

    } else
    if (params->charHandle == outputChar.getValueHandle()) {
        memcpy(&outputValue, params->data, params->len);
        pc.printf("outputChar : outputValue: %x\n", outputValue);
        
        fgPacket.header.command = FGCommand_Output;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandOutput);
        fgPacket.body.commandOutput.on = outputValue;

    } else
    if (params->charHandle == frequencyChar.getValueHandle()) {
        memcpy(&frequencyValue, params->data, params->len);
        pc.printf("frequencyChar\n");
        pc.printf("frequencyValue: %d (0x%x)\n", frequencyValue, frequencyValue);

        fgPacket.header.command = FGCommand_Frequency;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandFrequency);
        fgPacket.body.commandFrequency.frequency = frequencyValue;

    } else
    if (params->charHandle == waveformInfoChar.getValueHandle()) {
        memcpy(&waveformInfoValue, params->data, params->len);
        pc.printf("waveformInfoChar\n");
        pc.printf("FGCommandWaveformInfo.waveSize: %d\n", waveformInfoValue.waveSize);
        pc.printf("                      bitPerData: %d\n", waveformInfoValue.bitPerData);
        pc.printf("                      blockSize: %d\n", waveformInfoValue.blockSize);
        pc.printf("                      blockMaxNum: %d\n", waveformInfoValue.blockMaxNum);

        fgPacket.header.command = FGCommand_WaveformInfo;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandWaveformInfo);
        fgPacket.body.commandWaveformInfo = waveformInfoValue;

    } else
    if (params->charHandle == waveformBlockChar.getValueHandle()) {
        memcpy(&waveformBlockValue, params->data, params->len);
        pc.printf("waveformBlockChar\n");
        pc.printf("waveformBlockChar.blockNo: %d\n", waveformBlockValue.blockNo);
        pc.printf("                  length: %d\n", waveformBlockValue.length);
        pc.printf("                  buffer: ");
        for (int i = 0; i < waveformBlockValue.length; i++) {
            pc.printf("%02x ", waveformBlockValue.buffer[i]);
        }
        pc.printf("\n");

        fgPacket.header.command = FGCommand_WaveformBlock;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommandWaveformBlock);
        fgPacket.body.commandWaveformBlock = waveformBlockValue;

    } else
    if (params->charHandle == waveformToBufferChar.getValueHandle()) {
        pc.printf("waveformToBufferChar : non\n");
        
        fgPacket.header.command = FGCommand_WaveformToBuffer;
        fgPacket.header.length = sizeof(FGHeader) + sizeof(FGCommand_WaveformToBuffer);
        //fgPacket.body.commandWaveformToBuffer = NULL;
    }


    // I2C送信
    {
        lookme();
        int ret = i2c.write(i2cSlaveAddr, (const char *)&fgPacket, fgPacket.header.length);
        pc.printf("I2C ret: %d \n", ret);
 
        //ble.updateCharacteristicValue(readChar.getValueHandle(),params->data,params->len);
    }
}

//---------------------------------------------------------
// 要調整
void lookme()
{
    lookmeOut = 0;
    wait_ms(5);
    lookmeOut = 1;
    wait_ms(5);
    lookmeOut = 0;
}

//---------------------------------------------------------
unsigned long gTickerCount = 0;

void tickerCallback()
{        
    led1 = !led1;
    gTickerCount++;
}

//---------------------------------------------------------
/*
 *  main loop
 */ 
int main(void)
{
    ticker.attach(&tickerCallback, 0.5);
    i2c.frequency(100000);

    pc.baud(115200);
    pc.printf("\n");
    pc.printf("mbed function generator BLE translator\n");
    pc.printf("--\n");


    ble.init();
    ble.onConnection(connectionCallback);
    ble.onDisconnection(disconnectionCallback);

    ble.onDataWritten(writeCharCallback);                 // 書き込まれたときのコールバック
    //ble_error_t err = ble.onDataRead(readCharCallback);   // 読み込まれたときのコールバック

/*
void         onDataSent          (void(*callback)(unsigned count))
void         onDataWritten       (void(*callback)(const GattCharacteristicWriteCBParams *eventDataP))
ble_error_t  onDataRead          (void(*callback)(const GattCharacteristicReadCBParams *eventDataP))
void         onRadioNotification (Gap::RadioNotificationEventCallback_t callback)
    
*/  

    // setup advertising
    {
        // BLE only, no classic BT
        ble.accumulateAdvertisingPayload(   GapAdvertisingData::BREDR_NOT_SUPPORTED | 
                                            GapAdvertisingData::LE_GENERAL_DISCOVERABLE );
        // advertising type
        ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
        // add name
        ble.accumulateAdvertisingPayload(   GapAdvertisingData::COMPLETE_LOCAL_NAME, 
                                            (uint8_t *)DEVICE_NAME, 
                                            sizeof(DEVICE_NAME) );
        // UUID's broadcast in advertising packet
        ble.accumulateAdvertisingPayload(   GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
                                            (uint8_t *)uuid16_list,
                                            sizeof(uuid16_list) );
        ble.setAdvertisingInterval(100); // interval is 100ms. 
        // add my service
        ble.addService(customService);

        // start advertising
        ble.startAdvertising();
    }
 


    while (true) {
        ble.waitForEvent();
#if 0
        {
            led2 = 0; wait(0.1);
            led2 = 1; wait(0.2);
            led2 = 0; wait(0.1);
            led2 = 1; wait(0.2);
            led2 = 0; wait(0.1);
            led2 = 1; wait(0.2);
            led2 = 0; wait(0.1);
            led2 = 1; wait(0.2);
            led2 = 0;
        }
#endif
        led2 = !led2;
    }
}