draft LE Peripheral example for Arduino, implementation is missing

This commit is contained in:
Matthias Ringwald 2015-04-28 23:19:47 +02:00
parent 8773374af6
commit aa0cf9f42d
4 changed files with 85 additions and 243 deletions

View File

@ -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;

View File

@ -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;

View File

@ -1,72 +1,85 @@
// LE Peripheral Example - not working yet
#include <BTstack.h>
#include <stdio.h>
#include "att_server.h"
#include <SPI.h>
// 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();
}

View File

@ -1,192 +0,0 @@
/* basic SPI */
#include <SPI.h>
#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);
}