Added SpanPoint::get()
This completes SpanPoint. Next: rename HomePeer to be HomePoint.
This commit is contained in:
parent
4f983051ce
commit
58683586bc
|
|
@ -26,6 +26,8 @@ void SpanPeer::start(const char *macAddress, const char *password){
|
||||||
mbedtls_sha256_ret((const unsigned char *)password,strlen(password),lmk,0);
|
mbedtls_sha256_ret((const unsigned char *)password,strlen(password),lmk,0);
|
||||||
esp_now_set_pmk(lmk+16);
|
esp_now_set_pmk(lmk+16);
|
||||||
|
|
||||||
|
peerInfo.channel=0;
|
||||||
|
peerInfo.ifidx=WIFI_IF_STA;
|
||||||
peerInfo.encrypt = true;
|
peerInfo.encrypt = true;
|
||||||
memcpy(peerInfo.lmk, lmk, 16);
|
memcpy(peerInfo.lmk, lmk, 16);
|
||||||
esp_now_add_peer(&peerInfo);
|
esp_now_add_peer(&peerInfo);
|
||||||
|
|
|
||||||
|
|
@ -2154,15 +2154,8 @@ void SpanOTA::error(ota_error_t err){
|
||||||
// SpanPoint //
|
// SpanPoint //
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
SpanPoint::SpanPoint(const char *macAddress){
|
SpanPoint::SpanPoint(const char *macAddress, int qLength, int nItems){
|
||||||
|
|
||||||
if(homeSpan.Accessories.empty() || homeSpan.Accessories.back()->Services.empty()){
|
|
||||||
Serial.printf("\nFATAL ERROR! Can't create new SpanPoint(\"%s\") without a defined Service ***\n",macAddress);
|
|
||||||
Serial.printf("\n=== PROGRAM HALTED ===");
|
|
||||||
while(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
if(sscanf(macAddress,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",peerInfo.peer_addr,peerInfo.peer_addr+1,peerInfo.peer_addr+2,peerInfo.peer_addr+3,peerInfo.peer_addr+4,peerInfo.peer_addr+5)!=6){
|
if(sscanf(macAddress,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",peerInfo.peer_addr,peerInfo.peer_addr+1,peerInfo.peer_addr+2,peerInfo.peer_addr+3,peerInfo.peer_addr+4,peerInfo.peer_addr+5)!=6){
|
||||||
Serial.printf("\nFATAL ERROR! Can't create new SpanPoint(\"%s\") - Invalid MAC Address ***\n",macAddress);
|
Serial.printf("\nFATAL ERROR! Can't create new SpanPoint(\"%s\") - Invalid MAC Address ***\n",macAddress);
|
||||||
|
|
@ -2170,11 +2163,17 @@ SpanPoint::SpanPoint(const char *macAddress){
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
peerInfo.channel=0; // 0=matches current WiFi channel
|
init(); // initialize SpanPoint
|
||||||
|
peerInfo.channel=0; // 0 = matches current WiFi channel
|
||||||
peerInfo.ifidx=WIFI_IF_STA; // must specify interface
|
peerInfo.ifidx=WIFI_IF_STA; // must specify interface
|
||||||
peerInfo.encrypt=true; // turn on encryption for this peer
|
peerInfo.encrypt=true; // turn on encryption for this peer
|
||||||
memcpy(peerInfo.lmk, lmk, 16); // set local key
|
memcpy(peerInfo.lmk, lmk, 16); // set local key
|
||||||
esp_now_add_peer(&peerInfo); // add peer to ESP-NOW
|
esp_now_add_peer(&peerInfo); // add peer to ESP-NOW
|
||||||
|
|
||||||
|
this->qLength=qLength;
|
||||||
|
dataQueue = xQueueCreate(nItems,qLength);
|
||||||
|
|
||||||
|
SpanPoints.push_back(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
@ -2197,12 +2196,33 @@ void SpanPoint::init(const char *password){
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
void SpanPoint::dataReceived(const uint8_t *mac, const uint8_t *incomingData, int len){
|
boolean SpanPoint::get(void *dataBuf){
|
||||||
Serial.printf("SpanPoint: %d bytes received from %02X:%02X:%02X:%02X:%02X:%02X\n",len,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
|
|
||||||
|
return(xQueueReceive(dataQueue, dataBuf, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
||||||
|
void SpanPoint::dataReceived(const uint8_t *mac, const uint8_t *incomingData, int len){
|
||||||
|
|
||||||
|
auto it=SpanPoints.begin();
|
||||||
|
for(;it!=SpanPoints.end() && memcmp((*it)->peerInfo.peer_addr,mac,6)!=0; it++);
|
||||||
|
|
||||||
|
if(it==SpanPoints.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(len!=(*it)->qLength){
|
||||||
|
Serial.printf("SpanPoint Warning! %d bytes received from %02X:%02X:%02X:%02X:%02X:%02X does not match %d-byte queue size\n",len,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],(*it)->qLength);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xQueueSend((*it)->dataQueue, incomingData, pdMS_TO_TICKS(1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// MISC //
|
||||||
|
///////////////////////////////
|
||||||
|
|
||||||
void __attribute__((weak)) loop(){
|
void __attribute__((weak)) loop(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2214,5 +2234,6 @@ boolean SpanOTA::enabled=false;
|
||||||
boolean SpanOTA::auth;
|
boolean SpanOTA::auth;
|
||||||
uint8_t SpanPoint::lmk[16];
|
uint8_t SpanPoint::lmk[16];
|
||||||
boolean SpanPoint::initialized=false;
|
boolean SpanPoint::initialized=false;
|
||||||
|
vector<SpanPoint *> SpanPoint::SpanPoints;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -160,17 +160,21 @@ class SpanPoint {
|
||||||
|
|
||||||
friend class Span;
|
friend class Span;
|
||||||
|
|
||||||
esp_now_peer_info_t peerInfo;
|
int qLength; // length of 1 queue item (in bytes)
|
||||||
|
esp_now_peer_info_t peerInfo; // structure for all ESP-NOW peer data
|
||||||
|
QueueHandle_t dataQueue; // queue to store data after it is received
|
||||||
|
|
||||||
static uint8_t lmk[16];
|
static uint8_t lmk[16];
|
||||||
static boolean initialized;
|
static boolean initialized;
|
||||||
|
static vector<SpanPoint *> SpanPoints;
|
||||||
|
|
||||||
static void dataReceived(const uint8_t *mac, const uint8_t *incomingData, int len);
|
static void dataReceived(const uint8_t *mac, const uint8_t *incomingData, int len);
|
||||||
static void init(const char *password="HomeSpan");
|
static void init(const char *password="HomeSpan");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SpanPoint(const char *macAddress);
|
SpanPoint(const char *macAddress, int qLength, int nItems=1);
|
||||||
|
boolean get(void *dataBuf);
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
|
@ -339,7 +343,6 @@ class SpanAccessory{
|
||||||
friend class SpanCharacteristic;
|
friend class SpanCharacteristic;
|
||||||
friend class SpanButton;
|
friend class SpanButton;
|
||||||
friend class SpanRange;
|
friend class SpanRange;
|
||||||
friend class SpanPoint;
|
|
||||||
|
|
||||||
uint32_t aid=0; // Accessory Instance ID (HAP Table 6-1)
|
uint32_t aid=0; // Accessory Instance ID (HAP Table 6-1)
|
||||||
int iidCount=0; // running count of iid to use for Services and Characteristics associated with this Accessory
|
int iidCount=0; // running count of iid to use for Services and Characteristics associated with this Accessory
|
||||||
|
|
|
||||||
20
src/src.ino
20
src/src.ino
|
|
@ -15,6 +15,16 @@
|
||||||
CUSTOM_CHAR(LightMode, AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA, PR, STRING, "ANY_VALUE", NULL, NULL, true);
|
CUSTOM_CHAR(LightMode, AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA, PR, STRING, "ANY_VALUE", NULL, NULL, true);
|
||||||
CUSTOM_CHAR_STRING(DarkMode, AAAAAAAA-BBBB-AAAA-AAAA-AAAAAAAAAAAA, PR, "MY_VALUE");
|
CUSTOM_CHAR_STRING(DarkMode, AAAAAAAA-BBBB-AAAA-AAAA-AAAAAAAAAAAA, PR, "MY_VALUE");
|
||||||
|
|
||||||
|
SpanPoint *dev1;
|
||||||
|
SpanPoint *dev2;
|
||||||
|
|
||||||
|
struct message_t {
|
||||||
|
char a[32];
|
||||||
|
int b;
|
||||||
|
float c;
|
||||||
|
bool d;
|
||||||
|
} message;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
|
@ -44,6 +54,9 @@ void setup() {
|
||||||
|
|
||||||
homeSpan.setSpanPointPassword("Hello Thert");
|
homeSpan.setSpanPointPassword("Hello Thert");
|
||||||
|
|
||||||
|
dev1=new SpanPoint("AC:67:B2:77:42:20",sizeof(message_t));
|
||||||
|
dev2=new SpanPoint("7C:DF:A1:61:E4:A8",sizeof(message_t));
|
||||||
|
|
||||||
new SpanAccessory(); // Begin by creating a new Accessory using SpanAccessory(), which takes no arguments
|
new SpanAccessory(); // Begin by creating a new Accessory using SpanAccessory(), which takes no arguments
|
||||||
|
|
||||||
new Service::AccessoryInformation(); // HAP requires every Accessory to implement an AccessoryInformation Service, which has 6 required Characteristics
|
new Service::AccessoryInformation(); // HAP requires every Accessory to implement an AccessoryInformation Service, which has 6 required Characteristics
|
||||||
|
|
@ -65,7 +78,8 @@ void setup() {
|
||||||
new Characteristic::Name("Light 1");
|
new Characteristic::Name("Light 1");
|
||||||
new Characteristic::ColorTemperature();
|
new Characteristic::ColorTemperature();
|
||||||
new Characteristic::Active();
|
new Characteristic::Active();
|
||||||
new SpanPoint("AC:67:B2:77:42:20");
|
|
||||||
|
|
||||||
new Service::LightBulb();
|
new Service::LightBulb();
|
||||||
new Characteristic::On(0,true);
|
new Characteristic::On(0,true);
|
||||||
(new Characteristic::Brightness(50,false))->setRange(10,100,5);
|
(new Characteristic::Brightness(50,false))->setRange(10,100,5);
|
||||||
|
|
@ -99,6 +113,10 @@ void setup() {
|
||||||
void loop(){
|
void loop(){
|
||||||
|
|
||||||
homeSpan.poll();
|
homeSpan.poll();
|
||||||
|
if(dev1->get(&message))
|
||||||
|
Serial.printf("DEV1: '%s' %d %f %d\n",message.a,message.b,message.c,message.d);
|
||||||
|
if(dev2->get(&message))
|
||||||
|
Serial.printf("DEV2: '%s' %d %f %d\n",message.a,message.b,message.c,message.d);
|
||||||
|
|
||||||
} // end of loop()
|
} // end of loop()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue