Skip to content

Crashing when three or more characteristics are updated every 30ms? #594

Open
@Zilch123

Description

@Zilch123

Intel Curie's Tiny-Tile board crashes when three or more characteristics are updated every 30ms.

#include <CurieBLE.h>
#include <CurieIMU.h>
#define MAX_IMU_RECORD 1

typedef struct {
    int index;
    unsigned int slot[3];
} imuFrameType;

// Buffer to hold IMU data
imuFrameType imuBuf[MAX_IMU_RECORD];

unsigned seqNum = 0;

// Tx IMU data Characteristic
// remote clients will be able to
// get notifications if this characteristic changes
// standard 128-bit characteristic UUID
BLEService bleImuService("A7580001-153E-D4F6-F26D-43D8D98EEB13"); 
BLECharacteristic bleImuChar("F7580003-153E-D4F6-F26D-43D8D98EEB13", 
                             BLERead | BLENotify, sizeof(imuBuf));   
BLECharacteristic bleImuChar1("B7580003-153E-D4F6-F26D-43D8D98EEB13",
                             BLERead | BLENotify, sizeof(imuBuf));     
BLECharacteristic bleImuChar2("C7580003-153E-D4F6-F26D-43D8D98EEB13", 
                             BLERead | BLENotify, sizeof(imuBuf));   
                                                                            
void setup()
{
    Serial.begin(9600);    // initialize serial communication

    bool txpower_set = BLE.setTxPower(4);
    BLE.begin();
    CurieIMU.begin();
    BLE.setLocalName("Imu");
    BLE.setAdvertisedServiceUuid(bleImuService.uuid());// add the service UUID
    //Accelerometer sampling rate = 200Hz
    CurieIMU.setAccelerometerRate(200);
    //Minimum, Maximum connection interval 7.5ms- 10ms 
    //(0x06=7.5/1.25, 0x08= 10/1.25)//0x028=50/1.25 
    BLE.setConnectionInterval(0x06,0x28);
    BLE.addService(bleImuService);   // Add the Imu service
    bleImuService.addCharacteristic(bleImuChar); // add the Imu characteristic
    bleImuService.addCharacteristic(bleImuChar1);
    bleImuService.addCharacteristic(bleImuChar2);
    BLE.advertise();
}

void loop()
{
    // listen for BLE peripherals to connect:
    // Since we are a peripheral we need a central object to connect to
    BLEDevice central = BLE.central();
    BLE.poll();
    // if a central is connected to peripheral:
    if (central)
    {
        long currentMillis, sentTime;
        // Send IMU data as long as the central is still connected
        currentMillis = sentTime = millis();
        while (central.connected())
        {
          while(bleImuChar.canNotify()&bleImuChar1.canNotify()&bleImuChar2.canNotify())
          {
            // Take IMU data every 25 msec
            if ((millis() - sentTime) >= 33)
            {
                    for(int i=0; i<=2; i++)
                    {
                      //Reads acc data
                      recordImuData(i);
                      delay(10);
                    }
                    delay(2);
                    // Sets Tx buffer to the read acc data
                    bleImuChar.setValue((unsigned char *)&(imuBuf[0]), sizeof(imuBuf[0])); 
                    bleImuChar1.setValue((unsigned char *)&(imuBuf[1]), sizeof(imuBuf[1]));
                    bleImuChar2.setValue((unsigned char *)&(imuBuf[2]), sizeof(imuBuf[2]));
                    
                    sentTime = millis();  //note what time data was sent 
                    for(int j=0;j<=1;j++)
                    {
                      for(int k=0; k<=2; k++)
                      {
                        Serial.println(imuBuf[j].slot[k]);
                        imuBuf[j].slot[k]=0; 
                      }
                    }
                    
                   
             }//end of if( time> update time) loop
            } // end of While( The Char.CanNotify())loop
          } //end of While(central.connnected()) loop
       } // end of if(central) loop
    }

// This function records the IMU data that we send to the central 
void recordImuData(int index)
{
    /* Read IMU data.
    */
    int ax, ay, az;
    int gx, gy, gz;

    imuBuf[index].index = seqNum++;
    CurieIMU.readAccelerometer(ax, ay, az);
    //ax=10;
    //Serial.println(ax);
        // Encode the data into the buffer
    imuBuf[index].slot[0] = (unsigned int)(ax);
    imuBuf[index].slot[1] = (unsigned int)(ay);
    imuBuf[index].slot[2] = (unsigned int)(az);

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions