mirror of
https://github.com/hzkincony/kc868-arduino-library.git
synced 2024-11-23 05:58:25 +01:00
first upload
This commit is contained in:
parent
d11542c0b5
commit
73452141b3
50
examples/kc868-test/kc868-test.ino
Normal file
50
examples/kc868-test/kc868-test.ino
Normal file
@ -0,0 +1,50 @@
|
||||
#include "KC868.h"
|
||||
|
||||
|
||||
KC868 kc868(&Serial2,115200);//create a new kc868 object, arg 1: serial object point , arg 2: baudrate
|
||||
|
||||
|
||||
void SwitchUpdate(uint8_t idx, uint8_t state)
|
||||
{
|
||||
Serial.printf("Switch %d : %d\n",idx,state);//state ,0:switch off , 1: switch on
|
||||
|
||||
}
|
||||
|
||||
void SensorUpdate(uint8_t idx, uint8_t state)
|
||||
{
|
||||
Serial.printf("Sensor %d : %d\n",idx,state); //state ,0:sensor triggered , 1:sensor not triggered
|
||||
}
|
||||
|
||||
void setup() {
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
delay(3000);
|
||||
|
||||
kc868.open();//open the kc868 first
|
||||
|
||||
kc868.setReadMode(0);//mode, 0 :default, Query directly; 1: Query all switch state every 2s
|
||||
|
||||
kc868.setSwitchChangeHook(SwitchUpdate);//set switch change hook
|
||||
|
||||
kc868.setSensorChangeHook(SensorUpdate);//set sensor change hook
|
||||
|
||||
Serial.println("Write Switch 1 on.");
|
||||
kc868.writeSwitch(1,1);
|
||||
|
||||
Serial.println("Delay 1 second.");
|
||||
delay(1000);
|
||||
|
||||
Serial.println("Write Switch 1 off.");
|
||||
kc868.writeSwitch(1,0);
|
||||
|
||||
//kc868.readSwitchAll();//
|
||||
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// put your main code here, to run repeatedly:
|
||||
kc868.poll();
|
||||
|
||||
}
|
35
keywords.txt
Normal file
35
keywords.txt
Normal file
@ -0,0 +1,35 @@
|
||||
###########################################
|
||||
# Datatypes (KEYWORD1)
|
||||
###########################################
|
||||
|
||||
KC868 KEYWORD1
|
||||
|
||||
###########################################
|
||||
# Methods and Functions (KEYWORD2)
|
||||
###########################################
|
||||
|
||||
open KEYWORD2
|
||||
close KEYWORD2
|
||||
poll KEYWORD2
|
||||
readSwitch KEYWORD2
|
||||
readSwitchCache KEYWORD2
|
||||
writeSwitch KEYWORD2
|
||||
setSwitchChangeHook KEYWORD2
|
||||
setSensorChangeHook KEYWORD2
|
||||
setReadMode KEYWORD2
|
||||
|
||||
|
||||
###########################################
|
||||
# structures (KEYWORD3)
|
||||
###########################################
|
||||
|
||||
|
||||
###########################################
|
||||
# constants (LITERAL1)
|
||||
###########################################
|
||||
|
||||
|
||||
###########################################
|
||||
# ? (LITERAL2)
|
||||
###########################################
|
||||
|
10
library.properties
Normal file
10
library.properties
Normal file
@ -0,0 +1,10 @@
|
||||
name=kc868-arduino-library
|
||||
version=1.0.0
|
||||
author=KinCony <hificat@163.com>
|
||||
maintainer=KinCony <hificat@163.com>
|
||||
sentence=KC868 library for Arduino
|
||||
paragraph=This library is designed for KC868 series control boards.
|
||||
category=Communication,Sensors
|
||||
url=https://github.com/hzkincony/kc868-arduino-library
|
||||
architectures=*
|
||||
includes=KC868.h
|
634
src/KC868.cpp
Normal file
634
src/KC868.cpp
Normal file
@ -0,0 +1,634 @@
|
||||
#include "KC868.h"
|
||||
|
||||
KC868::KC868(HardwareSerial *hs, unsigned long baud)
|
||||
{
|
||||
_type = dev_serial;
|
||||
_serial = hs;
|
||||
_baud = baud;
|
||||
}
|
||||
|
||||
boolean KC868::open()
|
||||
{
|
||||
if (_type == dev_serial)
|
||||
{
|
||||
_serial->begin(_baud);
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean KC868::close()
|
||||
{
|
||||
if (_type == dev_serial)
|
||||
{
|
||||
_serial->end();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean KC868::readSwitch(int idx)
|
||||
{
|
||||
boolean ret;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
|
||||
|
||||
if(_mode == 1)
|
||||
{
|
||||
return readSwitchCache(idx);
|
||||
}
|
||||
|
||||
if(idx>_totalRelayCount)
|
||||
return false;
|
||||
|
||||
// example RELAY-READ-255,1
|
||||
sprintf(pkt.txbuf, "%s,%d\n", READ_RELAY_CMD, idx);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
|
||||
// example RELAY-READ-255,1,1,OK\0
|
||||
sprintf(tmp, "%s,%d,1,OK", READ_RELAY_CMD, idx); //check 'OK' ,otherwise return false
|
||||
ret = checkRet(tmp);
|
||||
Serial.printf("---%s---",pkt.rxbuf);
|
||||
Serial.printf("---%d---",ret);
|
||||
if (ret)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean KC868::readSwitchCache(int idx)
|
||||
{
|
||||
boolean ret;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
|
||||
if(idx>_totalRelayCount)
|
||||
return false;
|
||||
|
||||
if(_SwitchCache&(0x00000001<<(idx-1)))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t KC868::readSwitchAll()
|
||||
{
|
||||
boolean ret;
|
||||
char *p1,*p2;
|
||||
_cmd_pkt cmd;
|
||||
int dotCount=0;
|
||||
|
||||
if(_mode == 1)
|
||||
{
|
||||
return _SwitchCache;
|
||||
}
|
||||
|
||||
// example RELAY-STATE-255\n
|
||||
sprintf(pkt.txbuf, "%s", RELAY_STATE_CMD);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
|
||||
// example RELAY-STATE-255,0,0,0,1,OK
|
||||
ret = checkRet("RELAY-STATE-255");
|
||||
if (ret)
|
||||
{
|
||||
// find return string from pkt.rxbuf
|
||||
p1 = strstr(pkt.rxbuf, RELAY_CMD);
|
||||
if (p1 != NULL)
|
||||
{
|
||||
|
||||
p2 = strstr(p1, OK_CMD);
|
||||
if ((p2 != NULL) && (p2 - p1 >= 14))
|
||||
{
|
||||
cmd.head = p1;
|
||||
cmd.state = p2;
|
||||
|
||||
for (int n = 0; n < (p2 - p1); n++)
|
||||
{
|
||||
if (p1[n] == ',')
|
||||
{
|
||||
p1[n] = '\0';
|
||||
dotCount++;
|
||||
if (dotCount == 1)
|
||||
cmd.p1 = &p1[n + 1];
|
||||
else if (dotCount == 2)
|
||||
cmd.p2 = &p1[n + 1];
|
||||
else if (dotCount == 3)
|
||||
cmd.p3 = &p1[n + 1];
|
||||
else if (dotCount == 4)
|
||||
cmd.p4 = &p1[n + 1];
|
||||
}
|
||||
}
|
||||
|
||||
if(strstr(cmd.head,"RELAY-STATE-255")!=NULL)
|
||||
{
|
||||
uint8_t n1 = 0, n2 = 0,n3=0,n4=0;
|
||||
if(_totalRelayCount == 8)
|
||||
{
|
||||
n1 = atoi(cmd.p1);
|
||||
|
||||
}
|
||||
else if(_totalRelayCount == 16)
|
||||
{
|
||||
n2 = atoi(cmd.p1);
|
||||
n1 = atoi(cmd.p2);
|
||||
|
||||
}
|
||||
else if(_totalRelayCount == 32)
|
||||
{
|
||||
n4 = atoi(cmd.p1);
|
||||
n3 = atoi(cmd.p2);
|
||||
n2 = atoi(cmd.p3);
|
||||
n1 = atoi(cmd.p4);
|
||||
}
|
||||
|
||||
_SwitchCache=n4;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n3;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n2;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n1;
|
||||
|
||||
return _SwitchCache;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
boolean KC868::writeSwitch(int idx, int value)
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t data;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
|
||||
if(idx>_totalRelayCount)
|
||||
return false;
|
||||
|
||||
// example RELAY-SET-255,1,1
|
||||
sprintf(pkt.txbuf, "%s,%d,%d\n", SET_RELAY_CMD, idx, value);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
delay(80);//delay at least 80ms, the control board needs some time to process
|
||||
|
||||
|
||||
// example RELAY-SET-255,1,1,OK
|
||||
// sprintf(tmp,"%s,%d,%d,OK", SET_RELAY_CMD, idx, value); //check 'OK',otherwise return false
|
||||
// ret = checkRet(tmp);
|
||||
// if (ret)
|
||||
// {
|
||||
// //update cache
|
||||
// if(value==1)
|
||||
// {
|
||||
// _SwitchCache|=(0x00000001<<(idx-1));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// _SwitchCache&=(~(0x00000001<<(idx-1)));
|
||||
// }
|
||||
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// else
|
||||
// return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean KC868::writeSwitchAll(uint32_t value)
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t data;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
uint8_t r1=0,r2=0,r3=0,r4=0;
|
||||
|
||||
if(_totalRelayCount == 8)
|
||||
{
|
||||
r1 = value & 0xFF;
|
||||
sprintf(pkt.txbuf, "%s,%d\n", SET_RELAY_ALL_CMD, r1);
|
||||
|
||||
}
|
||||
|
||||
if(_totalRelayCount==16)
|
||||
{
|
||||
r1 = value & 0xFF;
|
||||
r2 = (value>>8) & 0xFF;
|
||||
sprintf(pkt.txbuf, "%s,%d,%d\n", SET_RELAY_ALL_CMD, r2,r1);
|
||||
}
|
||||
|
||||
if(_totalRelayCount==32)
|
||||
{
|
||||
r1 = value & 0xFF;
|
||||
r2 = (value>>8) & 0xFF;
|
||||
r3 = (value>>16) & 0xFF;
|
||||
r4 = (value>>24) & 0xFF;
|
||||
sprintf(pkt.txbuf, "%s,%d,%d,%d,%d\n", SET_RELAY_ALL_CMD,r4,r3,r2,r1);
|
||||
}
|
||||
// example RELAY-SET-255,1,1
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
//delay(80);
|
||||
pkt.txbuf[strlen(pkt.txbuf)-1]=0;
|
||||
sprintf(tmp,"%s,OK", pkt.txbuf); //check 'OK',otherwise return false
|
||||
ret = checkRet(tmp);
|
||||
if (ret)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
boolean KC868::writeSwitchAllON()
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t data;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
|
||||
|
||||
sprintf(pkt.txbuf, "%s\n", RELAY_STATE_ALL_ON);
|
||||
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
//delay(80);
|
||||
sprintf(tmp,"%s,OK", RELAY_STATE_ALL_ON); //check 'OK',otherwise return false
|
||||
ret = checkRet(tmp);
|
||||
if (ret)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
boolean KC868::writeSwitchAllOFF()
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t data;
|
||||
char tmp[PKT_MAX_LEN];
|
||||
|
||||
|
||||
sprintf(pkt.txbuf, "%s\n", RELAY_STATE_ALL_OFF);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
//delay(80);
|
||||
sprintf(tmp,"%s,OK", RELAY_STATE_ALL_OFF); //check 'OK',otherwise return false
|
||||
ret = checkRet(tmp);
|
||||
if (ret)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
//return sensor state , 0 happened , 1 not happened
|
||||
boolean KC868::readSensor(int idx)
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t value = 0;
|
||||
uint8_t data;
|
||||
char *p1,*p2;
|
||||
_cmd_pkt cmd;
|
||||
|
||||
sprintf(pkt.txbuf, "%s\n", RELAY_GET_INPUT);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
//delay(80);
|
||||
ret = checkRet(RELAY_GET_INPUT);
|
||||
if (ret)
|
||||
{
|
||||
p1 = strstr(pkt.rxbuf, RELAY_CMD);
|
||||
if (p1 != NULL)
|
||||
{
|
||||
//RELAY-GET_INPUT-255,255,OK
|
||||
p2 = strstr(p1, OK_CMD);
|
||||
|
||||
if ((p2 != NULL) && (p2 - p1 >= 22))
|
||||
{
|
||||
cmd.head = p1;
|
||||
cmd.state = p2;
|
||||
cmd.p1 = &p1[20];
|
||||
for(int n=20;n<24;n++)
|
||||
{
|
||||
if (p1[n] == ',')
|
||||
{
|
||||
p1[n] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
value = atoi(cmd.p1);
|
||||
value = (value>>(idx-1))&0x01;
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
//return 6 sensor state in 1 byte, D5-D0
|
||||
uint8_t KC868::readSensorAll()
|
||||
{
|
||||
boolean ret;
|
||||
uint8_t value = 0;
|
||||
uint8_t data;
|
||||
char *p1,*p2;
|
||||
_cmd_pkt cmd;
|
||||
|
||||
sprintf(pkt.txbuf, "%s\n", RELAY_GET_INPUT);
|
||||
write(pkt.txbuf, strlen(pkt.txbuf));
|
||||
//delay(80);
|
||||
ret = checkRet(RELAY_GET_INPUT);
|
||||
if (ret)
|
||||
{
|
||||
p1 = strstr(pkt.rxbuf, RELAY_CMD);
|
||||
if (p1 != NULL)
|
||||
{
|
||||
//RELAY-GET_INPUT-255,255,OK
|
||||
p2 = strstr(p1, OK_CMD);
|
||||
if ((p2 != NULL) && (p2 - p1 >= 22))
|
||||
{
|
||||
cmd.head = p1;
|
||||
cmd.state = p2;
|
||||
cmd.p1 = &p1[20];
|
||||
for(int n=20;n<24;n++)
|
||||
{
|
||||
if (p1[n] == ',')
|
||||
{
|
||||
p1[n] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
value = atoi(cmd.p1);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0xFF;
|
||||
|
||||
}
|
||||
|
||||
void KC868::write(char *data, uint16_t len)
|
||||
{
|
||||
if (_type == dev_serial)
|
||||
{
|
||||
memset(pkt.rxbuf, 0, PKT_MAX_LEN);
|
||||
_serial->write(data, len);
|
||||
}
|
||||
}
|
||||
|
||||
void KC868::read(char *data, uint16_t *len, uint16_t timeout)
|
||||
{
|
||||
if (_type == dev_serial)
|
||||
{
|
||||
_serial->readBytesUntil('\n', data, timeout);
|
||||
*len = strlen(data);
|
||||
}
|
||||
}
|
||||
|
||||
boolean KC868::checkRet(char *src, uint16_t timeout)
|
||||
{
|
||||
//char buf[PKT_MAX_LEN];
|
||||
uint16_t len = 0;
|
||||
if (_type == dev_serial)
|
||||
{
|
||||
_serial->readBytesUntil('\n', pkt.rxbuf, timeout);
|
||||
len = strlen(pkt.rxbuf);
|
||||
if (len < strlen(src))
|
||||
return false;
|
||||
if (strstr(pkt.rxbuf, src) != NULL)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void KC868::poll()
|
||||
{
|
||||
if(_mode == 1)
|
||||
{
|
||||
nowTime = millis();
|
||||
if(nowTime>lastTime?(nowTime-lastTime >= TIME_PERIOD):(nowTime >= lastTime+TIME_PERIOD))
|
||||
{
|
||||
lastTime = millis();
|
||||
timeFlag = 1;
|
||||
}
|
||||
|
||||
if(timeFlag)
|
||||
{
|
||||
timeFlag = 0;
|
||||
write(RELAY_STATE_CMD, strlen(RELAY_STATE_CMD));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
while (_serial->available())
|
||||
{
|
||||
|
||||
uint8_t received = _serial->read();
|
||||
if((received=='\0')||(received=='\n'))
|
||||
break;
|
||||
inputBuffer[bufferPos++] = received;
|
||||
if (bufferPos >= PKT_MAX_LEN)
|
||||
{
|
||||
bufferPos = 0;
|
||||
}
|
||||
|
||||
}
|
||||
if(bufferPos>0)
|
||||
{
|
||||
//handle one line
|
||||
handleData(inputBuffer, bufferPos);
|
||||
|
||||
memset(inputBuffer, 0, PKT_MAX_LEN);
|
||||
bufferPos = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void KC868::setSwitchChangeHook(hook func)
|
||||
{
|
||||
SwitchChangeHook = func;
|
||||
}
|
||||
|
||||
void KC868::setSensorChangeHook(hook func)
|
||||
{
|
||||
SensorChangeHook = func;
|
||||
}
|
||||
|
||||
//example RELAY-KEY-255,x,y,OK
|
||||
// RELAY-ALARM-x,OK alarm
|
||||
// RELAY-STATE-255,D3,D2,D1,D0,OK set all relay return
|
||||
void KC868::handleData(char *data, uint16_t len)
|
||||
{
|
||||
int dotCount = 0;
|
||||
_cmd_pkt cmd;
|
||||
char *p1, *p2;
|
||||
|
||||
p1 = strstr(data, RELAY_CMD);
|
||||
if (p1 != NULL)
|
||||
{
|
||||
lastTime = millis();//update last time
|
||||
|
||||
p2 = strstr(p1, OK_CMD);
|
||||
if ((p2 != NULL) && (p2 - p1 >= 14))
|
||||
{
|
||||
cmd.head = p1;
|
||||
cmd.state = p2;
|
||||
//analysis string
|
||||
for (int n = 0; n < (p2 - p1); n++)
|
||||
{
|
||||
if (p1[n] == ',')
|
||||
{
|
||||
p1[n] = '\0';
|
||||
dotCount++;
|
||||
if (dotCount == 1)
|
||||
cmd.p1 = &p1[n + 1];
|
||||
else if (dotCount == 2)
|
||||
cmd.p2 = &p1[n + 1];
|
||||
else if (dotCount == 3)
|
||||
cmd.p3 = &p1[n + 1];
|
||||
else if (dotCount == 4)
|
||||
cmd.p4 = &p1[n + 1];
|
||||
}
|
||||
}
|
||||
|
||||
if(strstr(cmd.head,"RELAY-STATE-255")!=NULL)
|
||||
{
|
||||
uint8_t n1 = 0, n2 = 0,n3=0,n4=0;
|
||||
if(_totalRelayCount == 8)
|
||||
{
|
||||
n1 = atoi(cmd.p1);
|
||||
|
||||
}
|
||||
else if(_totalRelayCount == 16)
|
||||
{
|
||||
n2 = atoi(cmd.p1);
|
||||
n1 = atoi(cmd.p2);
|
||||
|
||||
}
|
||||
else if(_totalRelayCount == 32)
|
||||
{
|
||||
n4 = atoi(cmd.p1);
|
||||
n3 = atoi(cmd.p2);
|
||||
n2 = atoi(cmd.p3);
|
||||
n1 = atoi(cmd.p4);
|
||||
}
|
||||
|
||||
_SwitchCache=n4;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n3;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n2;
|
||||
_SwitchCache<<=8;
|
||||
_SwitchCache|=n1;
|
||||
|
||||
if(_SwitchCache_last!=_SwitchCache)
|
||||
{
|
||||
|
||||
|
||||
for(uint8_t n=0;n<32;n++)
|
||||
{
|
||||
if(((_SwitchCache>>n)&0x01)!=((_SwitchCache_last>>n)&0x01))
|
||||
{
|
||||
if(SwitchChangeHook!=NULL)
|
||||
SwitchChangeHook(n+1, ((_SwitchCache>>n)&0x01));//call switch change hook too
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
_SwitchCache_last = _SwitchCache;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
//Serial.printf("relay : %08x",_SwitchCache);
|
||||
|
||||
}
|
||||
else if(strstr(cmd.head,"RELAY-SET-255")!=NULL)
|
||||
{
|
||||
uint8_t idx = 0, value = 0;
|
||||
|
||||
idx = atoi(cmd.p1);
|
||||
value = atoi(cmd.p2);
|
||||
if ((idx <= 32) && (value <= 1))
|
||||
{
|
||||
if(value==1)
|
||||
_SwitchCache|=(0x00000001<<(idx-1));
|
||||
else
|
||||
_SwitchCache&= (~(0x00000001<<(idx-1)));
|
||||
|
||||
if(SwitchChangeHook!=NULL)
|
||||
SwitchChangeHook(idx, value);//switch change hook
|
||||
}
|
||||
|
||||
}
|
||||
//RELAY-ALARM-1,OK
|
||||
else if(strstr(cmd.head,"RELAY-ALARM-")!=NULL)
|
||||
{
|
||||
uint8_t idx = 0;
|
||||
p1 = strstr(data, "ALARM-");
|
||||
if (p1 != NULL)
|
||||
{
|
||||
|
||||
cmd.p1 = p1+6;
|
||||
idx = atoi(cmd.p1);
|
||||
|
||||
if(SensorChangeHook!=NULL)
|
||||
SensorChangeHook(idx,0);//alarm
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else if(strstr(cmd.head,"RELAY-DIARM-")!=NULL)
|
||||
{
|
||||
uint8_t idx = 0;
|
||||
|
||||
p1 = strstr(data, "DIARM-");
|
||||
if (p1 != NULL)
|
||||
{
|
||||
cmd.p1 = p1+6;
|
||||
|
||||
idx = atoi(cmd.p1);
|
||||
|
||||
if(SensorChangeHook!=NULL)
|
||||
SensorChangeHook(idx,1);//Cancel alarm
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//0 default mode 1 Query every 2 seconds
|
||||
void KC868::setReadMode(uint8_t mode)
|
||||
{
|
||||
|
||||
_mode = mode;
|
||||
if(_mode == 1)
|
||||
{
|
||||
timeFlag = 1;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
106
src/KC868.h
Normal file
106
src/KC868.h
Normal file
@ -0,0 +1,106 @@
|
||||
#ifndef _KC868_
|
||||
#define _KC868_
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "HardwareSerial.h"
|
||||
#include "driver/uart.h"
|
||||
|
||||
|
||||
#define ON 1
|
||||
#define OFF 0
|
||||
#define PKT_MAX_LEN 128
|
||||
|
||||
#define OK_CMD "OK"
|
||||
#define ERROR_CMD "ERROR"
|
||||
#define SET_RELAY_CMD "RELAY-SET-255"
|
||||
#define SET_RELAY_ALL_CMD "RELAY-SET_ALL-255"
|
||||
#define READ_RELAY_CMD "RELAY-READ-255"
|
||||
#define KEY_RELAY_CMD "RELAY-KEY-255"
|
||||
#define RELAY_CMD "RELAY-"
|
||||
#define RELAY_STATE_CMD "RELAY-STATE-255\n"
|
||||
#define RELAY_STATE_ALL_ON "RELAY-AON-255,1,1"
|
||||
#define RELAY_STATE_ALL_OFF "RELAY-AOF-255,1,1"
|
||||
#define RELAY_GET_INPUT "RELAY-GET_INPUT-255"
|
||||
|
||||
|
||||
#define TIME_PERIOD 2000ul //ms
|
||||
|
||||
typedef enum
|
||||
{
|
||||
dev_serial,
|
||||
dev_tcp,
|
||||
dev_udp
|
||||
} _dev_type;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char txbuf[PKT_MAX_LEN];
|
||||
uint16_t txlen;
|
||||
char rxbuf[PKT_MAX_LEN];
|
||||
uint16_t rxlen;
|
||||
} _data_pkt;
|
||||
|
||||
typedef void (*hook)(uint8_t, uint8_t);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *head;
|
||||
char *p1;
|
||||
char *p2;
|
||||
char *p3;
|
||||
char *p4;
|
||||
char *state;
|
||||
} _cmd_pkt;
|
||||
|
||||
class KC868
|
||||
{
|
||||
|
||||
_dev_type _type;
|
||||
HardwareSerial *_serial;
|
||||
int _baud;
|
||||
uint32_t _SwitchCache;//save switch state ,32 bit
|
||||
uint32_t _SwitchCache_last=0x00;//save last switch state ,32 bit
|
||||
uint8_t _SensorCache=0XFF;//save sensor input state
|
||||
|
||||
uint8_t _mode;
|
||||
hw_timer_t* tim= NULL;
|
||||
hook SwitchChangeHook=NULL,SensorChangeHook=NULL;
|
||||
|
||||
uint16_t bufferPos = 0;
|
||||
uint16_t readPos = 0;
|
||||
char inputBuffer[PKT_MAX_LEN];
|
||||
|
||||
uint8_t _totalRelayCount=32;
|
||||
|
||||
void write(char *data, uint16_t len);
|
||||
void read(char *data, uint16_t *len, uint16_t timeout = 100);
|
||||
boolean checkRet(char *src, uint16_t timeout = 100);
|
||||
void handleData(char *data, uint16_t len);
|
||||
uint8_t timeFlag;
|
||||
unsigned long nowTime;
|
||||
unsigned long lastTime;
|
||||
|
||||
_data_pkt pkt;
|
||||
|
||||
public:
|
||||
KC868(HardwareSerial *hs, unsigned long baud); //serial
|
||||
// KC868(WiFiClient client); // wificlient
|
||||
|
||||
boolean open();
|
||||
boolean close();
|
||||
void poll();
|
||||
boolean readSwitch(int idx);
|
||||
boolean readSwitchCache(int idx);
|
||||
uint32_t readSwitchAll();
|
||||
boolean writeSwitch(int idx, int value);
|
||||
boolean writeSwitchAll(uint32_t value);
|
||||
boolean writeSwitchAllON();
|
||||
boolean writeSwitchAllOFF();
|
||||
boolean readSensor(int idx);
|
||||
uint8_t readSensorAll();
|
||||
void setSwitchChangeHook(hook func);
|
||||
void setSensorChangeHook(hook func);
|
||||
void setReadMode(uint8_t mode);
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user