mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-09 21:45:54 +00:00
draft LE Peripheral example for Arduino, implementation is missing
This commit is contained in:
parent
8773374af6
commit
aa0cf9f42d
@ -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;
|
||||
|
||||
|
@ -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;
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user