mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-17 20:42:47 +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();
|
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;
|
BTstackManager BTstack;
|
||||||
|
|
||||||
|
@ -174,6 +174,14 @@ public:
|
|||||||
void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device));
|
void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device));
|
||||||
void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
|
void setGATTCharacteristicSubscribedCallback(void (*)(BLEStatus status, BLEDevice * device));
|
||||||
void setGATTCharacteristicUnsubscribedCallback(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;
|
extern BTstackManager BTstack;
|
@ -1,72 +1,85 @@
|
|||||||
|
// LE Peripheral Example - not working yet
|
||||||
#include <BTstack.h>
|
#include <BTstack.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include "att_server.h"
|
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
|
|
||||||
// EM9301 address 0C:F3:EE:00:00:00
|
#define GATT_CHARACTERISTIC_TEMP_ID 0
|
||||||
|
|
||||||
// retarget printf
|
// setup 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
|
|
||||||
static FILE uartout = {0} ;
|
static FILE uartout = {0} ;
|
||||||
static int uart_putchar (char c, FILE *stream) {
|
static int uart_putchar (char c, FILE *stream) {
|
||||||
Serial.write(c);
|
Serial.write(c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static void setup_printf(void) {
|
static void setup_printf(int baud) {
|
||||||
Serial.begin(115200);
|
Serial.begin(baud);
|
||||||
fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
|
fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
|
||||||
stdout = &uartout;
|
stdout = &uartout;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// test profile
|
void setup() {
|
||||||
#include "profile.h"
|
|
||||||
|
|
||||||
// write requests
|
setup_printf(9600);
|
||||||
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);
|
|
||||||
|
|
||||||
switch(handle){
|
// set callbacks
|
||||||
case ATT_CHARACTERISTIC_FFF1_01_VALUE_HANDLE:
|
BTstack.setBLEDeviceConnectedCallback(deviceConnectedCallback);
|
||||||
buffer[buffer_size]=0;
|
BTstack.setBLEDeviceDisconnectedCallback(deviceDisconnectedCallback);
|
||||||
printf("New text: %s\n", buffer);
|
BTstack.setGATTCharacteristicRead(gattReadCallback);
|
||||||
break;
|
BTstack.setGATTCharacteristicWrite(gattWriteCallback);
|
||||||
case ATT_CHARACTERISTIC_FFF2_01_VALUE_HANDLE:
|
|
||||||
printf("New value: %u\n", buffer[0]);
|
// setup GATT Database
|
||||||
#ifdef PIN_LED
|
int flags = 0;
|
||||||
if (buffer[0]){
|
uint8_t * data = NULL;
|
||||||
digitalWrite(PIN_LED, HIGH);
|
uint16_t data_len = 0;
|
||||||
} else {
|
BTstack.addGATTService(new UUID("B8E06067-62AD-41BA-9231-206AE80AB550"));
|
||||||
digitalWrite(PIN_LED, LOW);
|
BTstack.addGATTCharacteristic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, "string");
|
||||||
}
|
BTstack.addGATTCharacteristic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, data, data_len);
|
||||||
#endif
|
BTstack.addGATTCharacteristicDynamic(new UUID("f897177b-aee8-4767-8ecc-cc694fd5fcee"), flags, GATT_CHARACTERISTIC_TEMP_ID);
|
||||||
break;
|
// ..
|
||||||
|
|
||||||
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup(){
|
// ATT Client Write Callback for Dynamic Data
|
||||||
|
// @param characteristic_id to be read
|
||||||
setup_printf();
|
// @param buffer
|
||||||
|
// @param buffer_size
|
||||||
printf("Main::Setup()\n");
|
// @returns 0 if write was ok, ATT_ERROR_INVALID_OFFSET if offset is larger than max buffer
|
||||||
BT.setup();
|
int gattWriteCallback(uint16_t characteristic_id, uint8_t *buffer, uint16_t buffer_size){
|
||||||
|
switch (characteristic_id){
|
||||||
// set up ATT
|
}
|
||||||
att_set_db(profile_data);
|
return 0;
|
||||||
att_set_write_callback(att_write_callback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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