diff --git a/platforms/arduino/BTstack.cpp b/platforms/arduino/BTstack.cpp index 3845e3ba5..dc8b891f1 100644 --- a/platforms/arduino/BTstack.cpp +++ b/platforms/arduino/BTstack.cpp @@ -656,5 +656,18 @@ void BTstackManager::bleStopScanning(){ le_central_stop_scan(); } +void BTstackManager::setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size)){ +} +void BTstackManager::setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size)){ +} +void BTstackManager::addGATTService(UUID * uuid){ +} +void BTstackManager::addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text){ +} +void BTstackManager::addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len){ +} +void BTstackManager::addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id){ +} + BTstackManager BTstack; diff --git a/platforms/arduino/BTstack.h b/platforms/arduino/BTstack.h index 18c66a9fd..656cfc2ba 100644 --- a/platforms/arduino/BTstack.h +++ b/platforms/arduino/BTstack.h @@ -174,6 +174,14 @@ public: void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device)); void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); void setGATTCharacteristicUnsubscribedCallback(void (*)(BLEStatus status, BLEDevice * device)); + + void setGATTCharacteristicRead(uint16_t (*)(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size)); + void setGATTCharacteristicWrite(int (*)(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size)); + + void addGATTService(UUID * uuid); + void addGATTCharacteristic(UUID * uuid, uint16_t flags, const char * text); + void addGATTCharacteristic(UUID * uuid, uint16_t flags, uint8_t * data, uint16_t data_len); + void addGATTCharacteristicDynamic(UUID * uuid, uint16_t flags, uint16_t characteristic_id); }; extern BTstackManager BTstack; \ No newline at end of file diff --git a/platforms/arduino/examples/LEPeripheral/LEPeripheral.ino b/platforms/arduino/examples/LEPeripheral/LEPeripheral.ino index 33e563955..d834888f0 100644 --- a/platforms/arduino/examples/LEPeripheral/LEPeripheral.ino +++ b/platforms/arduino/examples/LEPeripheral/LEPeripheral.ino @@ -1,72 +1,85 @@ +// LE Peripheral Example - not working yet #include -#include -#include "att_server.h" #include -// EM9301 address 0C:F3:EE:00:00:00 +#define GATT_CHARACTERISTIC_TEMP_ID 0 -// retarget printf -#ifdef ENERGIA -extern "C" { - int putchar(int c) { - Serial.write((uint8_t)c); - return c; - } -} -static void setup_printf(void) { - Serial.begin(9600); -} -#else +// setup printf static FILE uartout = {0} ; static int uart_putchar (char c, FILE *stream) { Serial.write(c); return 0; } -static void setup_printf(void) { - Serial.begin(115200); +static void setup_printf(int baud) { + Serial.begin(baud); fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE); stdout = &uartout; } -#endif -// test profile -#include "profile.h" +void setup() { -// write requests -static int att_write_callback(uint16_t con_handle, uint16_t handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size){ - printf("WRITE Callback, handle 0x%04x\n", handle); + setup_printf(9600); - switch(handle){ - case ATT_CHARACTERISTIC_FFF1_01_VALUE_HANDLE: - buffer[buffer_size]=0; - printf("New text: %s\n", buffer); - break; - case ATT_CHARACTERISTIC_FFF2_01_VALUE_HANDLE: - printf("New value: %u\n", buffer[0]); -#ifdef PIN_LED - if (buffer[0]){ - digitalWrite(PIN_LED, HIGH); - } else { - digitalWrite(PIN_LED, LOW); - } -#endif - break; + // set callbacks + BTstack.setBLEDeviceConnectedCallback(deviceConnectedCallback); + BTstack.setBLEDeviceDisconnectedCallback(deviceDisconnectedCallback); + BTstack.setGATTCharacteristicRead(gattReadCallback); + BTstack.setGATTCharacteristicWrite(gattWriteCallback); + + // setup GATT Database + int flags = 0; + uint8_t * data = NULL; + uint16_t data_len = 0; + BTstack.addGATTService(new UUID("B8E06067-62AD-41BA-9231-206AE80AB550")); + BTstack.addGATTCharacteristic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, "string"); + BTstack.addGATTCharacteristic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, data, data_len); + BTstack.addGATTCharacteristicDynamic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, GATT_CHARACTERISTIC_TEMP_ID); + // .. + + BTstack.setup(); +} + + +void loop() { + BTstack.loop(); +} + +void deviceConnectedCallback(BLEStatus status, BLEDevice *device) { + switch (status){ + case BLE_STATUS_OK: + printf("Device connected!\n"); + break; + default: + break; + } +} + +void deviceDisconnectedCallback(BLEDevice * device){ + printf("Disconnected.\n"); +} + +// ATT Client Read Callback for Dynamic Data +// - if buffer == NULL, don't copy data, just return size of value +// - if buffer != NULL, copy data and return number bytes copied +// @param characteristic_id to be read +// @param buffer +// @param buffer_size +uint16_t gattReadCallback(uint16_t characteristic_id, uint8_t * buffer, uint16_t buffer_size){ + switch (characteristic_id){ + case GATT_CHARACTERISTIC_TEMP_ID: + break; } return 0; } -void setup(){ - - setup_printf(); - - printf("Main::Setup()\n"); - BT.setup(); - - // set up ATT - att_set_db(profile_data); - att_set_write_callback(att_write_callback); +// ATT Client Write Callback for Dynamic Data +// @param characteristic_id to be read +// @param buffer +// @param buffer_size +// @returns 0 if write was ok, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer +int gattWriteCallback(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size){ + switch (characteristic_id){ + } + return 0; } -void loop(){ - BT.loop(); -} diff --git a/platforms/arduino/examples/Test/Test.ino b/platforms/arduino/examples/Test/Test.ino deleted file mode 100644 index f00de60e1..000000000 --- a/platforms/arduino/examples/Test/Test.ino +++ /dev/null @@ -1,192 +0,0 @@ -/* basic SPI */ -#include - -#ifdef ENERGIA - -// CMM 9301 Configuration for TI Launchpad -#define PIN_SCK 7 -#define PIN_CS 8 -#define PIN_SHUTDOWN 11 -#define PIN_IRQ_DATA 13 -#define PIN_MISO 14 -#define PIN_MOSI 15 -#else // ARDUINO - -// CMM 9301 Configuration on Arduino -#define PIN_IRQ_DATA 2 -#define PIN_CS 4 -#define PIN_SHUTDOWN 5 -#define PIN_MISO 50 -#define PIN_MOSI 51 -#define PIN_SCK 52 -#define PIN_SHUTDOWN -#endif - -#if 0 -// software SPI -class Software_SPI { -public: - void setBitOrder(int){} - void setDataMode(int){}; - void setClockDivider(int){}; - void begin(){ - } - void end(){ - } - uint8_t transfer(uint8_t data){ - int i; - for (i=0;i<8;i++){ - if (data & 0x80){ - digitalWrite(PIN_MOSI, HIGH); - } else { - digitalWrite(PIN_MOSI, LOW); - } - digitalWrite(PIN_SCK, HIGH); - data = data << 1; - digitalWrite(PIN_SCK, LOW); - } - return 0; - } -}; - -#define SPI_MODE0 0 -#define SPI_CLOCK_DIV8 8 - -Software_SPI SPI; -#endif - -void setup(){ - pinMode (PIN_CS, OUTPUT); - pinMode(PIN_MOSI, OUTPUT); - pinMode(PIN_SCK, OUTPUT); - pinMode(PIN_SHUTDOWN, OUTPUT); - - SPI.setBitOrder(MSBFIRST); - SPI.setDataMode(SPI_MODE0); - - // digitalWrite(PIN_SHUTDOWN, LOW); - digitalWrite(PIN_CS, HIGH); - digitalWrite(PIN_MOSI, LOW); - - Serial.begin(9600); - Serial.println("Started\n"); -} - -void send_reset(){ - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, HIGH); - delay(1); - digitalWrite(PIN_CS, LOW); - delay(1); - SPI.begin(); - SPI.setClockDivider(SPI_CLOCK_DIV8); - SPI.transfer(0x01); - SPI.transfer(0x03); - SPI.transfer(0x0c); - SPI.transfer(0x00); - SPI.end(); - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, LOW); - digitalWrite(PIN_CS, HIGH); -} - -void send_illegal(){ - digitalWrite(PIN_MOSI, HIGH); - pinMode(PIN_MOSI, OUTPUT); - delay(1); - digitalWrite(PIN_CS, LOW); - delay(1); - SPI.begin(); - int i; - for (i=0;i<255;i++){ - SPI.transfer(0xff); - } - SPI.end(); - digitalWrite(PIN_CS, HIGH); -} - -void flush_input(){ - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, LOW); - digitalWrite(PIN_CS, LOW); - SPI.begin(); - while (digitalRead(PIN_IRQ_DATA) == HIGH){ - SPI.transfer(0x00); - } - SPI.end(); - digitalWrite(PIN_CS, HIGH); -} - -void read_event(){ - do { - pinMode (PIN_CS, OUTPUT); - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, LOW); - delay(1); - digitalWrite(PIN_CS, LOW); - delay(1); - SPI.begin(); - uint8_t data = SPI.transfer(0x00); - Serial.print("Read 0x"); - Serial.println(data, HEX); - SPI.end(); - pinMode (PIN_CS, OUTPUT); - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_CS, HIGH); - delay(1); - } while (digitalRead(PIN_IRQ_DATA) == HIGH); -} - -void send_noise(){ - while (1){ - Serial.print("."); - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, HIGH); - SPI.begin(); - digitalWrite(PIN_CS, LOW); - SPI.transfer(0x0f); - SPI.transfer(0x55); - SPI.transfer(0xf0); - digitalWrite(PIN_CS, HIGH); - SPI.end(); - pinMode(PIN_MOSI, OUTPUT); - digitalWrite(PIN_MOSI, LOW); - } - Serial.println("\n"); -} - -void power_cycle(){ - // power cycle - pinMode(PIN_MOSI, INPUT); - pinMode(PIN_CS, INPUT); - digitalWrite(PIN_SHUTDOWN, HIGH); - delay(1000); - digitalWrite(PIN_SHUTDOWN, LOW); - delay(1000); - pinMode(PIN_CS, OUTPUT); - pinMode(PIN_MOSI, OUTPUT); -} - -void loop() { - - Serial.println("Send noise"); - - // prepare unsynced state - // send_noise(); - - // bring HCI parser into defined error state - // send_illegal(); - - // power cycle - Serial.println("Power cycle"); - power_cycle(); - - Serial.println("Reset"); - send_reset(); - - while (digitalRead(PIN_IRQ_DATA) == HIGH){ - read_event(); - } - - delay(5000); -}