
project_sensor
Dependencies: project mbed nRF51822
main.cpp@0:75d0e1bb5990, 2017-05-28 (annotated)
- Committer:
- didierlauwerys
- Date:
- Sun May 28 16:26:53 2017 +0000
- Revision:
- 0:75d0e1bb5990
spi_ctrl
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
didierlauwerys | 0:75d0e1bb5990 | 1 | using namespace std; |
didierlauwerys | 0:75d0e1bb5990 | 2 | |
didierlauwerys | 0:75d0e1bb5990 | 3 | #include "mbed.h" |
didierlauwerys | 0:75d0e1bb5990 | 4 | #include "spi_master.h" |
didierlauwerys | 0:75d0e1bb5990 | 5 | #include "adxl345.h" |
didierlauwerys | 0:75d0e1bb5990 | 6 | #include "ble/BLE.h" |
didierlauwerys | 0:75d0e1bb5990 | 7 | #include "ble/Gap.h" |
didierlauwerys | 0:75d0e1bb5990 | 8 | #include "ble/UUID.h" |
didierlauwerys | 0:75d0e1bb5990 | 9 | #include "ble/GattCharacteristic.h" |
didierlauwerys | 0:75d0e1bb5990 | 10 | #include "ble/GattCallbackParamTypes.h" |
didierlauwerys | 0:75d0e1bb5990 | 11 | #include "ble/GattServer.h" |
didierlauwerys | 0:75d0e1bb5990 | 12 | |
didierlauwerys | 0:75d0e1bb5990 | 13 | //#define CS P0_7 //chipselect |
didierlauwerys | 0:75d0e1bb5990 | 14 | #define MOSI P0_9 //Master Out Slave In |
didierlauwerys | 0:75d0e1bb5990 | 15 | #define MISO P0_11 //Master In Slave Out |
didierlauwerys | 0:75d0e1bb5990 | 16 | #define SCK P0_8 //Clock |
didierlauwerys | 0:75d0e1bb5990 | 17 | //additional IO |
didierlauwerys | 0:75d0e1bb5990 | 18 | #define ON_SW P0_28 //ON/OFF switch |
didierlauwerys | 0:75d0e1bb5990 | 19 | #define BEPB P0_29 //Enable/disable bluetooth push button |
didierlauwerys | 0:75d0e1bb5990 | 20 | #define CHARACT_DATA 0 |
didierlauwerys | 0:75d0e1bb5990 | 21 | |
didierlauwerys | 0:75d0e1bb5990 | 22 | #define MIN_CONN_INTERVAL 10 //250 milliseconds |
didierlauwerys | 0:75d0e1bb5990 | 23 | #define MAX_CONN_INTERVAL 30 //350 milliseconds |
didierlauwerys | 0:75d0e1bb5990 | 24 | |
didierlauwerys | 0:75d0e1bb5990 | 25 | DigitalOut spi_cs(P0_28); |
didierlauwerys | 0:75d0e1bb5990 | 26 | DigitalIn int1(P0_15); |
didierlauwerys | 0:75d0e1bb5990 | 27 | DigitalIn location(P0_07); |
didierlauwerys | 0:75d0e1bb5990 | 28 | SPIClass SPI1(NRF_SPI1); |
didierlauwerys | 0:75d0e1bb5990 | 29 | data_member_t data[513]; |
didierlauwerys | 0:75d0e1bb5990 | 30 | BLEDevice ble; |
didierlauwerys | 0:75d0e1bb5990 | 31 | Gap::Handle_t connectionHandle = 0xFFFF; |
didierlauwerys | 0:75d0e1bb5990 | 32 | |
didierlauwerys | 0:75d0e1bb5990 | 33 | /*SET UUID*/ |
didierlauwerys | 0:75d0e1bb5990 | 34 | const UUID GATT_SERVICE = "88888888-5555-4444-1111-777777777777"; |
didierlauwerys | 0:75d0e1bb5990 | 35 | const UUID ADV_DATA = "11001100-2200-3300-4400-550055005500"; |
didierlauwerys | 0:75d0e1bb5990 | 36 | const UUID RECV_DATA = "22002200-3300-4400-5500-660066006600"; |
didierlauwerys | 0:75d0e1bb5990 | 37 | char *compbuf= new char[26]; |
didierlauwerys | 0:75d0e1bb5990 | 38 | uint16_t compbufLen=0; |
didierlauwerys | 0:75d0e1bb5990 | 39 | char *sendbuf= new char[26]; |
didierlauwerys | 0:75d0e1bb5990 | 40 | char *sendbufaddr=sendbuf; |
didierlauwerys | 0:75d0e1bb5990 | 41 | uint16_t sendbufLen=20*sizeof(uint8_t); |
didierlauwerys | 0:75d0e1bb5990 | 42 | char *readystr = "data ready"; |
didierlauwerys | 0:75d0e1bb5990 | 43 | uint16_t readyLen = sizeof("data ready"); |
didierlauwerys | 0:75d0e1bb5990 | 44 | char *startstr = "START"; |
didierlauwerys | 0:75d0e1bb5990 | 45 | uint16_t startLen = sizeof("START"); |
didierlauwerys | 0:75d0e1bb5990 | 46 | char *sendstr = "SEND"; |
didierlauwerys | 0:75d0e1bb5990 | 47 | uint16_t sendLen = sizeof("SEND"); |
didierlauwerys | 0:75d0e1bb5990 | 48 | bool data_ready; |
didierlauwerys | 0:75d0e1bb5990 | 49 | uint16_t sendindex; |
didierlauwerys | 0:75d0e1bb5990 | 50 | uint8_t *AdvData= new uint8_t[26]; |
didierlauwerys | 0:75d0e1bb5990 | 51 | uint16_t AdvDataLen=0; |
didierlauwerys | 0:75d0e1bb5990 | 52 | uint8_t *RcvData= new uint8_t[26]; |
didierlauwerys | 0:75d0e1bb5990 | 53 | uint16_t RcvDataLen=0; |
didierlauwerys | 0:75d0e1bb5990 | 54 | uint8_t devnr = 1; |
didierlauwerys | 0:75d0e1bb5990 | 55 | unsigned count; |
didierlauwerys | 0:75d0e1bb5990 | 56 | /* Device Name, simpel discovey */ |
didierlauwerys | 0:75d0e1bb5990 | 57 | const static char DEVICE_NAME[] = "Trump"; |
didierlauwerys | 0:75d0e1bb5990 | 58 | GattCharacteristic gattchar = GattCharacteristic(ADV_DATA, AdvData, AdvDataLen, 26, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
didierlauwerys | 0:75d0e1bb5990 | 59 | GattCharacteristic rxCharacteristic = GattCharacteristic(RECV_DATA, RcvData, RcvDataLen, 26, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);// | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); |
didierlauwerys | 0:75d0e1bb5990 | 60 | |
didierlauwerys | 0:75d0e1bb5990 | 61 | GattCharacteristic *CHARACT_ARRAY[] = {&gattchar,&rxCharacteristic}; |
didierlauwerys | 0:75d0e1bb5990 | 62 | GattService gatt_service(GATT_SERVICE,CHARACT_ARRAY,2); |
didierlauwerys | 0:75d0e1bb5990 | 63 | GattAttribute::Handle_t writeHandle; |
didierlauwerys | 0:75d0e1bb5990 | 64 | GattAttribute::Handle_t readHandle; |
didierlauwerys | 0:75d0e1bb5990 | 65 | |
didierlauwerys | 0:75d0e1bb5990 | 66 | |
didierlauwerys | 0:75d0e1bb5990 | 67 | |
didierlauwerys | 0:75d0e1bb5990 | 68 | |
didierlauwerys | 0:75d0e1bb5990 | 69 | bool poll_start_send_data(uint8_t *compare_str, uint8_t comp_length){ |
didierlauwerys | 0:75d0e1bb5990 | 70 | uint16_t bufLen = 27; |
didierlauwerys | 0:75d0e1bb5990 | 71 | uint8_t *rdbuf= new uint8_t[bufLen]; |
didierlauwerys | 0:75d0e1bb5990 | 72 | ble.readCharacteristicValue(readHandle,rdbuf,&bufLen); |
didierlauwerys | 0:75d0e1bb5990 | 73 | for (uint8_t i=0 ; i<comp_length-1 ; i++) |
didierlauwerys | 0:75d0e1bb5990 | 74 | { |
didierlauwerys | 0:75d0e1bb5990 | 75 | if (*(rdbuf+i*sizeof(uint8_t)) != *(compare_str+i*sizeof(uint8_t))) |
didierlauwerys | 0:75d0e1bb5990 | 76 | { |
didierlauwerys | 0:75d0e1bb5990 | 77 | delete rdbuf; |
didierlauwerys | 0:75d0e1bb5990 | 78 | return false; |
didierlauwerys | 0:75d0e1bb5990 | 79 | } |
didierlauwerys | 0:75d0e1bb5990 | 80 | } |
didierlauwerys | 0:75d0e1bb5990 | 81 | delete rdbuf; |
didierlauwerys | 0:75d0e1bb5990 | 82 | return true; |
didierlauwerys | 0:75d0e1bb5990 | 83 | } |
didierlauwerys | 0:75d0e1bb5990 | 84 | |
didierlauwerys | 0:75d0e1bb5990 | 85 | void Flash_Buff_WriteBytes(uint8_t addr, uint8_t pbuf) |
didierlauwerys | 0:75d0e1bb5990 | 86 | { |
didierlauwerys | 0:75d0e1bb5990 | 87 | spi_cs = 0; |
didierlauwerys | 0:75d0e1bb5990 | 88 | wait_us(200); |
didierlauwerys | 0:75d0e1bb5990 | 89 | SPI1.transfer((uint8_t)addr); |
didierlauwerys | 0:75d0e1bb5990 | 90 | SPI1.transfer(pbuf); |
didierlauwerys | 0:75d0e1bb5990 | 91 | |
didierlauwerys | 0:75d0e1bb5990 | 92 | wait_us(200); |
didierlauwerys | 0:75d0e1bb5990 | 93 | spi_cs = 1; |
didierlauwerys | 0:75d0e1bb5990 | 94 | } |
didierlauwerys | 0:75d0e1bb5990 | 95 | |
didierlauwerys | 0:75d0e1bb5990 | 96 | void Flash_Buff_ReadBytes(uint8_t addr, uint8_t *pbuf) |
didierlauwerys | 0:75d0e1bb5990 | 97 | { |
didierlauwerys | 0:75d0e1bb5990 | 98 | spi_cs = 0; |
didierlauwerys | 0:75d0e1bb5990 | 99 | wait_us(20); |
didierlauwerys | 0:75d0e1bb5990 | 100 | |
didierlauwerys | 0:75d0e1bb5990 | 101 | SPI1.transfer((uint8_t)addr|0x80); |
didierlauwerys | 0:75d0e1bb5990 | 102 | *pbuf = SPI1.transfer(0x00); |
didierlauwerys | 0:75d0e1bb5990 | 103 | |
didierlauwerys | 0:75d0e1bb5990 | 104 | wait_us(20); |
didierlauwerys | 0:75d0e1bb5990 | 105 | spi_cs = 1; |
didierlauwerys | 0:75d0e1bb5990 | 106 | } |
didierlauwerys | 0:75d0e1bb5990 | 107 | |
didierlauwerys | 0:75d0e1bb5990 | 108 | void init_adxl() |
didierlauwerys | 0:75d0e1bb5990 | 109 | { |
didierlauwerys | 0:75d0e1bb5990 | 110 | Flash_Buff_WriteBytes(INT_ENABLE, 0x00); |
didierlauwerys | 0:75d0e1bb5990 | 111 | Flash_Buff_WriteBytes(THRESH_TAP, THRESH_TAP_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 112 | Flash_Buff_WriteBytes(OFSX, OFSX_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 113 | Flash_Buff_WriteBytes(OFSY, OFSY_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 114 | Flash_Buff_WriteBytes(OFSZ, OFSZ_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 115 | Flash_Buff_WriteBytes(DUR, DUR_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 116 | Flash_Buff_WriteBytes(Latent, Latent_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 117 | Flash_Buff_WriteBytes(Window, Window_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 118 | Flash_Buff_WriteBytes(THRESH_ACT, THRESH_ACT_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 119 | Flash_Buff_WriteBytes(THRESH_INACT, THRESH_INACT_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 120 | Flash_Buff_WriteBytes(TIME_INACT, TIME_INACT_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 121 | Flash_Buff_WriteBytes(ACT_INACT_CTL, ACT_INACT_CTL_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 122 | Flash_Buff_WriteBytes(THRESH_FF, THRESH_FF_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 123 | Flash_Buff_WriteBytes(TIME_FF, TIME_FF_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 124 | Flash_Buff_WriteBytes(TAP_AXES, TAP_AXES_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 125 | Flash_Buff_WriteBytes(BW_RATE, BW_RATE_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 126 | Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 127 | Flash_Buff_WriteBytes(INT_MAP, INT_MAP_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 128 | Flash_Buff_WriteBytes(DATA_FORMAT, DATA_FORMAT_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 129 | Flash_Buff_WriteBytes(FIFO_CTL, FIFO_CTL_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 130 | Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x08); |
didierlauwerys | 0:75d0e1bb5990 | 131 | Flash_Buff_WriteBytes(INT_ENABLE, INT_ENABLE_INIT); |
didierlauwerys | 0:75d0e1bb5990 | 132 | } |
didierlauwerys | 0:75d0e1bb5990 | 133 | |
didierlauwerys | 0:75d0e1bb5990 | 134 | void read_data(uint16_t index) |
didierlauwerys | 0:75d0e1bb5990 | 135 | { |
didierlauwerys | 0:75d0e1bb5990 | 136 | spi_cs = 0; |
didierlauwerys | 0:75d0e1bb5990 | 137 | wait_us(20); |
didierlauwerys | 0:75d0e1bb5990 | 138 | |
didierlauwerys | 0:75d0e1bb5990 | 139 | SPI1.transfer((uint8_t)(DATAX0|0xC0)); |
didierlauwerys | 0:75d0e1bb5990 | 140 | data[index].data_x0 = SPI1.transfer(0x00)^0x80; |
didierlauwerys | 0:75d0e1bb5990 | 141 | data[index].data_x1 = SPI1.transfer(0x00); |
didierlauwerys | 0:75d0e1bb5990 | 142 | data[index].data_y0 = SPI1.transfer(0x00)^0x80; |
didierlauwerys | 0:75d0e1bb5990 | 143 | data[index].data_y1 = SPI1.transfer(0x00); |
didierlauwerys | 0:75d0e1bb5990 | 144 | data[index].data_z0 = SPI1.transfer(0x00)^0x80; |
didierlauwerys | 0:75d0e1bb5990 | 145 | data[index].data_z1 = SPI1.transfer(0x00); |
didierlauwerys | 0:75d0e1bb5990 | 146 | |
didierlauwerys | 0:75d0e1bb5990 | 147 | wait_us(20); |
didierlauwerys | 0:75d0e1bb5990 | 148 | spi_cs = 1; |
didierlauwerys | 0:75d0e1bb5990 | 149 | } |
didierlauwerys | 0:75d0e1bb5990 | 150 | |
didierlauwerys | 0:75d0e1bb5990 | 151 | |
didierlauwerys | 0:75d0e1bb5990 | 152 | /* WHEN CONNECTION ... */ |
didierlauwerys | 0:75d0e1bb5990 | 153 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { |
didierlauwerys | 0:75d0e1bb5990 | 154 | if (params->role == Gap::CENTRAL) { |
didierlauwerys | 0:75d0e1bb5990 | 155 | connectionHandle = params->handle; |
didierlauwerys | 0:75d0e1bb5990 | 156 | } |
didierlauwerys | 0:75d0e1bb5990 | 157 | } |
didierlauwerys | 0:75d0e1bb5990 | 158 | |
didierlauwerys | 0:75d0e1bb5990 | 159 | |
didierlauwerys | 0:75d0e1bb5990 | 160 | /* Restart advertising when the peer disconnects */ |
didierlauwerys | 0:75d0e1bb5990 | 161 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
didierlauwerys | 0:75d0e1bb5990 | 162 | { |
didierlauwerys | 0:75d0e1bb5990 | 163 | BLE::Instance().gap().startAdvertising(); |
didierlauwerys | 0:75d0e1bb5990 | 164 | } |
didierlauwerys | 0:75d0e1bb5990 | 165 | |
didierlauwerys | 0:75d0e1bb5990 | 166 | /*This function is called when the ble initialization process has failed*/ |
didierlauwerys | 0:75d0e1bb5990 | 167 | void onBleInitError(BLE &ble, ble_error_t error) |
didierlauwerys | 0:75d0e1bb5990 | 168 | { |
didierlauwerys | 0:75d0e1bb5990 | 169 | /* Avoid compiler warnings, library said to do this */ |
didierlauwerys | 0:75d0e1bb5990 | 170 | (void) ble; |
didierlauwerys | 0:75d0e1bb5990 | 171 | (void) error; |
didierlauwerys | 0:75d0e1bb5990 | 172 | |
didierlauwerys | 0:75d0e1bb5990 | 173 | /* Initialization error handling should go here */ |
didierlauwerys | 0:75d0e1bb5990 | 174 | } |
didierlauwerys | 0:75d0e1bb5990 | 175 | |
didierlauwerys | 0:75d0e1bb5990 | 176 | void dataSentCallback(unsigned count) |
didierlauwerys | 0:75d0e1bb5990 | 177 | { |
didierlauwerys | 0:75d0e1bb5990 | 178 | SPI1.transfer(0xCC); |
didierlauwerys | 0:75d0e1bb5990 | 179 | sendindex+=1; |
didierlauwerys | 0:75d0e1bb5990 | 180 | memcpy(sendbufaddr+0*sizeof(uint8_t), &sendindex, sizeof(uint16_t)); |
didierlauwerys | 0:75d0e1bb5990 | 181 | memcpy(sendbufaddr+2*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 182 | memcpy(sendbufaddr+3*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 183 | memcpy(sendbufaddr+4*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 184 | memcpy(sendbufaddr+5*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 185 | memcpy(sendbufaddr+6*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 186 | memcpy(sendbufaddr+7*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 187 | sendindex+=1; |
didierlauwerys | 0:75d0e1bb5990 | 188 | memcpy(sendbufaddr+8*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 189 | memcpy(sendbufaddr+9*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 190 | memcpy(sendbufaddr+10*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 191 | memcpy(sendbufaddr+11*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 192 | memcpy(sendbufaddr+12*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 193 | memcpy(sendbufaddr+13*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 194 | sendindex+=1; |
didierlauwerys | 0:75d0e1bb5990 | 195 | memcpy(sendbufaddr+14*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 196 | memcpy(sendbufaddr+15*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 197 | memcpy(sendbufaddr+16*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 198 | memcpy(sendbufaddr+17*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 199 | memcpy(sendbufaddr+18*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 200 | memcpy(sendbufaddr+19*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 201 | if(sendindex>=512) |
didierlauwerys | 0:75d0e1bb5990 | 202 | data_ready=false; |
didierlauwerys | 0:75d0e1bb5990 | 203 | |
didierlauwerys | 0:75d0e1bb5990 | 204 | } |
didierlauwerys | 0:75d0e1bb5990 | 205 | |
didierlauwerys | 0:75d0e1bb5990 | 206 | /*Callback triggered when ble initialization process has finished*/ |
didierlauwerys | 0:75d0e1bb5990 | 207 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
didierlauwerys | 0:75d0e1bb5990 | 208 | { |
didierlauwerys | 0:75d0e1bb5990 | 209 | BLE& ble = params->ble; |
didierlauwerys | 0:75d0e1bb5990 | 210 | ble_error_t error = params->error; |
didierlauwerys | 0:75d0e1bb5990 | 211 | |
didierlauwerys | 0:75d0e1bb5990 | 212 | /* In case of error, forward the error handling to onBleInitError */ |
didierlauwerys | 0:75d0e1bb5990 | 213 | if (error != BLE_ERROR_NONE) { |
didierlauwerys | 0:75d0e1bb5990 | 214 | onBleInitError(ble, error); |
didierlauwerys | 0:75d0e1bb5990 | 215 | return; |
didierlauwerys | 0:75d0e1bb5990 | 216 | } |
didierlauwerys | 0:75d0e1bb5990 | 217 | |
didierlauwerys | 0:75d0e1bb5990 | 218 | /* Ensure that it is the default instance of BLE */ |
didierlauwerys | 0:75d0e1bb5990 | 219 | if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
didierlauwerys | 0:75d0e1bb5990 | 220 | return; |
didierlauwerys | 0:75d0e1bb5990 | 221 | } |
didierlauwerys | 0:75d0e1bb5990 | 222 | |
didierlauwerys | 0:75d0e1bb5990 | 223 | /* Set device name characteristic data */ |
didierlauwerys | 0:75d0e1bb5990 | 224 | ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME); |
didierlauwerys | 0:75d0e1bb5990 | 225 | |
didierlauwerys | 0:75d0e1bb5990 | 226 | ble.gattServer().onDataSent(dataSentCallback); |
didierlauwerys | 0:75d0e1bb5990 | 227 | |
didierlauwerys | 0:75d0e1bb5990 | 228 | |
didierlauwerys | 0:75d0e1bb5990 | 229 | /* callback when disconnected */ |
didierlauwerys | 0:75d0e1bb5990 | 230 | ble.gap().onDisconnection(disconnectionCallback); |
didierlauwerys | 0:75d0e1bb5990 | 231 | |
didierlauwerys | 0:75d0e1bb5990 | 232 | /* Sacrifice 3B of 31B to some Advertising Flags (see nrfconnect toolbox for flag parameters :) ) */ |
didierlauwerys | 0:75d0e1bb5990 | 233 | // for |
didierlauwerys | 0:75d0e1bb5990 | 234 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);// say this device can be discovered by other BLE supportingdevices |
didierlauwerys | 0:75d0e1bb5990 | 235 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // say that a connection can be set ( connectable) and that it does not matter with who it connects (unidirected) |
didierlauwerys | 0:75d0e1bb5990 | 236 | |
didierlauwerys | 0:75d0e1bb5990 | 237 | |
didierlauwerys | 0:75d0e1bb5990 | 238 | /* Sacrifice another 2B of 31B (actually 29B) to AdvType overhead, rest goes to AdvData array --> about 26B of actual sendable data :o */ |
didierlauwerys | 0:75d0e1bb5990 | 239 | //Overhead = 1B Length, 1B Type |
didierlauwerys | 0:75d0e1bb5990 | 240 | //Type = AdvData |
didierlauwerys | 0:75d0e1bb5990 | 241 | //Length = sizeof(AdvData) |
didierlauwerys | 0:75d0e1bb5990 | 242 | //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, AdvData, sizeof(AdvData)); |
didierlauwerys | 0:75d0e1bb5990 | 243 | |
didierlauwerys | 0:75d0e1bb5990 | 244 | /*fill in device name as local name*/ |
didierlauwerys | 0:75d0e1bb5990 | 245 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
didierlauwerys | 0:75d0e1bb5990 | 246 | |
didierlauwerys | 0:75d0e1bb5990 | 247 | /* Set advertising interval. Longer interval == Less radiothingies use == longer battery life :) */ |
didierlauwerys | 0:75d0e1bb5990 | 248 | ble.gap().setAdvertisingInterval(20); /* 100ms */ |
didierlauwerys | 0:75d0e1bb5990 | 249 | |
didierlauwerys | 0:75d0e1bb5990 | 250 | |
didierlauwerys | 0:75d0e1bb5990 | 251 | |
didierlauwerys | 0:75d0e1bb5990 | 252 | ble.addService(gatt_service); |
didierlauwerys | 0:75d0e1bb5990 | 253 | |
didierlauwerys | 0:75d0e1bb5990 | 254 | //ble.gap().addData(GapAdvertisingData::SERVICE_DATA, (uint8_t *)AdvData, sizeof(AdvData)); |
didierlauwerys | 0:75d0e1bb5990 | 255 | /* Start advertising */ |
didierlauwerys | 0:75d0e1bb5990 | 256 | ble.gap().startAdvertising(); //start sending advertising packets |
didierlauwerys | 0:75d0e1bb5990 | 257 | |
didierlauwerys | 0:75d0e1bb5990 | 258 | ble.initializeSecurity(); |
didierlauwerys | 0:75d0e1bb5990 | 259 | //end |
didierlauwerys | 0:75d0e1bb5990 | 260 | } |
didierlauwerys | 0:75d0e1bb5990 | 261 | |
didierlauwerys | 0:75d0e1bb5990 | 262 | |
didierlauwerys | 0:75d0e1bb5990 | 263 | main() { |
didierlauwerys | 0:75d0e1bb5990 | 264 | wait_ms(1); |
didierlauwerys | 0:75d0e1bb5990 | 265 | data_ready=false; |
didierlauwerys | 0:75d0e1bb5990 | 266 | BLE& ble = BLE::Instance(); |
didierlauwerys | 0:75d0e1bb5990 | 267 | ble.init(bleInitComplete); |
didierlauwerys | 0:75d0e1bb5990 | 268 | spi_cs = 1; |
didierlauwerys | 0:75d0e1bb5990 | 269 | if (location==1) { |
didierlauwerys | 0:75d0e1bb5990 | 270 | char *waitingstr = "waiting1"; |
didierlauwerys | 0:75d0e1bb5990 | 271 | uint16_t waitingLen = sizeof("waiting1"); } |
didierlauwerys | 0:75d0e1bb5990 | 272 | else if(location==0) { |
didierlauwerys | 0:75d0e1bb5990 | 273 | char *waitingstr = "waiting0"; |
didierlauwerys | 0:75d0e1bb5990 | 274 | uint16_t waitingLen = sizeof("waiting0"); } |
didierlauwerys | 0:75d0e1bb5990 | 275 | uint16_t index; |
didierlauwerys | 0:75d0e1bb5990 | 276 | for(uint16_t i=0; i<513;i++){ |
didierlauwerys | 0:75d0e1bb5990 | 277 | data[i].data_x0=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 278 | data[i].data_x1=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 279 | data[i].data_y0=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 280 | data[i].data_y1=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 281 | data[i].data_z0=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 282 | data[i].data_z1=(uint8_t)0; |
didierlauwerys | 0:75d0e1bb5990 | 283 | } |
didierlauwerys | 0:75d0e1bb5990 | 284 | SPI1.begin(SCK, MOSI, MISO); |
didierlauwerys | 0:75d0e1bb5990 | 285 | init_adxl(); |
didierlauwerys | 0:75d0e1bb5990 | 286 | writeHandle = gattchar.getValueHandle(); |
didierlauwerys | 0:75d0e1bb5990 | 287 | readHandle = rxCharacteristic.getValueHandle(); |
didierlauwerys | 0:75d0e1bb5990 | 288 | |
didierlauwerys | 0:75d0e1bb5990 | 289 | while(1) |
didierlauwerys | 0:75d0e1bb5990 | 290 | { |
didierlauwerys | 0:75d0e1bb5990 | 291 | ble.gattServer().write(writeHandle,(uint8_t *)waitingstr, waitingLen); |
didierlauwerys | 0:75d0e1bb5990 | 292 | while (poll_start_send_data((uint8_t *)startstr, startLen) != true) |
didierlauwerys | 0:75d0e1bb5990 | 293 | { |
didierlauwerys | 0:75d0e1bb5990 | 294 | ble.waitForEvent(); |
didierlauwerys | 0:75d0e1bb5990 | 295 | } |
didierlauwerys | 0:75d0e1bb5990 | 296 | //SPI |
didierlauwerys | 0:75d0e1bb5990 | 297 | Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x08); |
didierlauwerys | 0:75d0e1bb5990 | 298 | for (index=0 ; index<513 ; index++){ |
didierlauwerys | 0:75d0e1bb5990 | 299 | while(!int1){wait_us(1);} |
didierlauwerys | 0:75d0e1bb5990 | 300 | read_data(index); |
didierlauwerys | 0:75d0e1bb5990 | 301 | } |
didierlauwerys | 0:75d0e1bb5990 | 302 | Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x04); |
didierlauwerys | 0:75d0e1bb5990 | 303 | ble.gattServer().write(writeHandle,(uint8_t *)readystr, readyLen); |
didierlauwerys | 0:75d0e1bb5990 | 304 | //condition to send data |
didierlauwerys | 0:75d0e1bb5990 | 305 | while (poll_start_send_data((uint8_t *)sendstr, sendLen) != true) |
didierlauwerys | 0:75d0e1bb5990 | 306 | { |
didierlauwerys | 0:75d0e1bb5990 | 307 | ble.waitForEvent(); |
didierlauwerys | 0:75d0e1bb5990 | 308 | } |
didierlauwerys | 0:75d0e1bb5990 | 309 | index=0; |
didierlauwerys | 0:75d0e1bb5990 | 310 | sendindex=2; |
didierlauwerys | 0:75d0e1bb5990 | 311 | data_ready=true; |
didierlauwerys | 0:75d0e1bb5990 | 312 | memcpy(sendbufaddr+0*sizeof(uint8_t), &index, sizeof(uint16_t)); |
didierlauwerys | 0:75d0e1bb5990 | 313 | memcpy(sendbufaddr+2*sizeof(uint8_t), &(data[index].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 314 | memcpy(sendbufaddr+3*sizeof(uint8_t), &(data[index].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 315 | memcpy(sendbufaddr+4*sizeof(uint8_t), &(data[index].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 316 | memcpy(sendbufaddr+5*sizeof(uint8_t), &(data[index].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 317 | memcpy(sendbufaddr+6*sizeof(uint8_t), &(data[index].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 318 | memcpy(sendbufaddr+7*sizeof(uint8_t), &(data[index].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 319 | memcpy(sendbufaddr+8*sizeof(uint8_t), &(data[index+1].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 320 | memcpy(sendbufaddr+9*sizeof(uint8_t), &(data[index+1].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 321 | memcpy(sendbufaddr+10*sizeof(uint8_t), &(data[index+1].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 322 | memcpy(sendbufaddr+11*sizeof(uint8_t), &(data[index+1].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 323 | memcpy(sendbufaddr+12*sizeof(uint8_t), &(data[index+1].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 324 | memcpy(sendbufaddr+13*sizeof(uint8_t), &(data[index+1].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 325 | memcpy(sendbufaddr+14*sizeof(uint8_t), &(data[index+2].data_x0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 326 | memcpy(sendbufaddr+15*sizeof(uint8_t), &(data[index+2].data_x1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 327 | memcpy(sendbufaddr+16*sizeof(uint8_t), &(data[index+2].data_y0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 328 | memcpy(sendbufaddr+17*sizeof(uint8_t), &(data[index+2].data_y1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 329 | memcpy(sendbufaddr+18*sizeof(uint8_t), &(data[index+2].data_z0), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 330 | memcpy(sendbufaddr+19*sizeof(uint8_t), &(data[index+2].data_z1), sizeof(uint8_t)); |
didierlauwerys | 0:75d0e1bb5990 | 331 | wait(2); |
didierlauwerys | 0:75d0e1bb5990 | 332 | while (data_ready == true) |
didierlauwerys | 0:75d0e1bb5990 | 333 | { |
didierlauwerys | 0:75d0e1bb5990 | 334 | ble.gattServer().write(writeHandle, (uint8_t *)sendbufaddr, sendbufLen); |
didierlauwerys | 0:75d0e1bb5990 | 335 | ble.waitForEvent(); |
didierlauwerys | 0:75d0e1bb5990 | 336 | |
didierlauwerys | 0:75d0e1bb5990 | 337 | } |
didierlauwerys | 0:75d0e1bb5990 | 338 | } |
didierlauwerys | 0:75d0e1bb5990 | 339 | } |