Commit 8fb74fbf authored by captainwong's avatar captainwong

2.4.0

parent ea2321a6
# Ademco Change Log
## 2.4.0 2024-4-18 04:28:43
- split some features from `hb_com` to `hb_core`
## 2.3.0 2024-4-17 17:38:01
## 2.2.2 2024-4-15 13:35:39
## 2.2.1
......
......@@ -7,8 +7,8 @@
*/
#define ADEMCO_VERSION_MAJOR 2
#define ADEMCO_VERSION_MINOR 2
#define ADEMCO_VERSION_PATCH 1
#define ADEMCO_VERSION_MINOR 4
#define ADEMCO_VERSION_PATCH 0
#define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX ""
......
......@@ -30,7 +30,7 @@
|EB BA 3F 07 *P0* **A9** SUM|7|测试地址回应、激活|*P0*:语音|
|EB BA 3F 09 *P0* **AB** *P1 P2* SUM|9|修改防区探头遗失/失联回应|*P0*:语音;*P1*:防区号;*P2*:0失联关,1失联开,2拒绝设置|
|EB BA 3F *PN* *P0* **AD** *P1 DATA P2* SUM|变长|索要防区探头遗失/失联回应|回应所有失联开的防区。<br/> *PN*:本条数据包含多少字节;*P0*:语音;<br/> *P1*:F0指示DATA以1个字节表示防区号,F1表示DATA以2个字节表示防区号;<br/> *DATA*:所有失联开的防区;<br/> *P2*:FF表示传输结束,其他表示还有更多数据|
|EB BA 3F 08 *P0* **AF** *P1 P2* SUM|9|三区段主机布撤防回应|*P0*:语音;*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防成功,1撤防成功|
|EB BA 3F 09 *P0* **AF** *P1 P2* SUM|9|三区段主机布撤防回应|*P0*:语音;*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防成功,1撤防成功|
|EB BA 3F 08 *P0* **B1** *P1* SUM|8|三区段主机索要状态回应|*P0*:语音;<br/> *P1*:8位,7/6位主机状态,5/4位区段1状态,3/2位区段2状态,1/0位区段3状态<br/> 值为0布防,1撤防|
|EB BA 3F 07 *P0* **A8** SUM|7|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令|
......@@ -156,12 +156,12 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\ademco.c" />
<ClCompile Include="..\..\hb_com.c" />
<ClCompile Include="..\..\hb_core.c" />
<ClCompile Include="dllmain.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\ademco.h" />
<ClInclude Include="..\..\hb_com.h" />
<ClInclude Include="..\..\hb_core.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
......
......@@ -21,7 +21,7 @@
<ClCompile Include="..\..\ademco.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\hb_com.c">
<ClCompile Include="..\..\hb_core.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
......@@ -29,7 +29,7 @@
<ClInclude Include="..\..\ademco.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\hb_com.h">
<ClInclude Include="..\..\hb_core.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
......
......@@ -20,11 +20,11 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\ademco.c" />
<ClCompile Include="..\..\hb_com.c" />
<ClCompile Include="..\..\hb_core.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\ademco.h" />
<ClInclude Include="..\..\hb_com.h" />
<ClInclude Include="..\..\hb_core.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
......
......@@ -18,7 +18,7 @@
<ClCompile Include="..\..\ademco.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\hb_com.c">
<ClCompile Include="..\..\hb_core.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
......@@ -26,7 +26,7 @@
<ClInclude Include="..\..\ademco.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\hb_com.h">
<ClInclude Include="..\..\hb_core.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
......
......@@ -20,11 +20,11 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\ademco.c" />
<ClCompile Include="..\..\hb_com.c" />
<ClCompile Include="..\..\hb_core.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\ademco.h" />
<ClInclude Include="..\..\hb_com.h" />
<ClInclude Include="..\..\hb_core.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
......
......@@ -18,7 +18,7 @@
<ClCompile Include="..\..\ademco.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\hb_com.c">
<ClCompile Include="..\..\hb_core.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
......@@ -26,7 +26,7 @@
<ClInclude Include="..\..\ademco.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\hb_com.h">
<ClInclude Include="..\..\hb_core.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
......
#include "../../ademco.h"
#include "../../hb_com.h"
#include "../../hb_core.h"
#include <jlib/win32/UnicodeTool.h>
#include <jlib/win32/path_op.h>
#include <jlib/util/std_util.h>
......
#include <stdio.h>
#include "../../hb_com.h"
#include "../../hb_core.h"
#include "uvlib/uv_log.h"
#include "uvlib/uv_tcpserver.h"
#include "cJSON/cJSON.h"
......
......@@ -152,7 +152,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\ademco.c" />
<ClCompile Include="..\..\hb_com.c" />
<ClCompile Include="..\..\hb_core.c" />
<ClCompile Include="cJSON\cJSON.c" />
<ClCompile Include="httprelay.c" />
<ClCompile Include="uvlib\llhttp\src\api.c" />
......@@ -168,7 +168,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\ademco.h" />
<ClInclude Include="..\..\hb_com.h" />
<ClInclude Include="..\..\hb_core.h" />
<ClInclude Include="cJSON\cJSON.h" />
<ClInclude Include="uvlib\list.h" />
<ClInclude Include="uvlib\mybuf.h" />
......
......@@ -30,9 +30,6 @@
<ClCompile Include="..\..\ademco.c">
<Filter>ademco</Filter>
</ClCompile>
<ClCompile Include="..\..\hb_com.c">
<Filter>ademco</Filter>
</ClCompile>
<ClCompile Include="httprelay.c">
<Filter>Source Files</Filter>
</ClCompile>
......@@ -69,14 +66,14 @@
<ClCompile Include="uvlib\uv_tcp.c">
<Filter>uvlib</Filter>
</ClCompile>
<ClCompile Include="..\..\hb_core.c">
<Filter>ademco</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\ademco.h">
<Filter>ademco</Filter>
</ClInclude>
<ClInclude Include="..\..\hb_com.h">
<Filter>ademco</Filter>
</ClInclude>
<ClInclude Include="uvlib\list.h">
<Filter>uvlib</Filter>
</ClInclude>
......@@ -107,5 +104,8 @@
<ClInclude Include="cJSON\cJSON.h">
<Filter>cJSON</Filter>
</ClInclude>
<ClInclude Include="..\..\hb_core.h">
<Filter>ademco</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
#include "hb_com.h"
#include "hb_core.h"
#include <string.h>
......@@ -422,32 +422,6 @@ const char* hb_zone_property_to_string(hb_zone_property_t zp) {
}
}
const char* hb_com_req_to_string(hb_com_req_t type) {
switch (type) {
#define XX(name, str) \
case HB_COM_REQ_##name: \
return #name;
HB_COM_REQUESTS_MAP(XX)
#undef XX
default:
return "InvalidRequestType";
}
}
const char* hb_com_resp_to_string(hb_com_resp_t type) {
switch (type) {
#define XX(name, str) \
case HB_COM_RESP_##name: \
return #name;
HB_COM_RESPONSES_MAP(XX)
#undef XX
default:
return "InvalidResponseType";
}
}
#if ADEMCO_ENABLE_CHINESE
const char* hb_machine_status_to_string_chinese(hb_machine_status_t status) {
switch (status) {
......@@ -487,33 +461,6 @@ const char* hb_zone_property_to_string_chinese(hb_zone_property_t zp) {
return "无效属性";
}
}
const char* hb_com_req_to_string_chinese(hb_com_req_t type) {
switch (type) {
#define XX(name, str) \
case HB_COM_REQ_##name: \
return str;
HB_COM_REQUESTS_MAP(XX)
#undef XX
default:
return "无效请求";
}
}
const char* hb_com_resp_to_string_chinese(hb_com_resp_t type) {
switch (type) {
#define XX(name, str) \
case HB_COM_RESP_##name: \
return str;
HB_COM_RESPONSES_MAP(XX)
#undef XX
default:
return "无效回应";
}
}
#endif // ADEMCO_ENABLE_CHINESE
const char* hb_get_zone_format_str(hb_machine_type_t type) {
......@@ -525,647 +472,3 @@ const char* hb_get_zone_format_str(hb_machine_type_t type) {
else
return "%d";
}
void hb_sum(uint8_t* data, size_t len) {
uint8_t sum = 0;
uint8_t* p = data;
while (p != data + len - 1)
sum += *p++;
*p = sum;
}
int hb_chksum(const uint8_t* data, size_t len) {
uint8_t sum = 0;
const uint8_t* p = data;
while (p != data + len - 1)
sum += *p++;
return sum == *p;
}
#define copy_data_to_com \
if (cd) { \
cd->len = len & 0xFF; \
memcpy(cd->data, data, len & 0xFF); \
}
hb_com_req_t hb_com_parse_req(const uint8_t* data,
size_t len,
hb_com_data_t* cd) {
do {
if (len < 5) {
break;
}
if (data[0] != 0xEB) {
break;
}
switch (data[1]) {
case 0xAB: {
if (data[2] != 0x3F) {
break;
}
switch (data[3]) {
case 0xA0: // EB AB 3F A0 75
{
if (len != HB_COM_REQ_A0_LEN) {
break;
}
if (memcmp(HB_COM_REQ_A0_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_A0;
}
case 0xA1: // EB AB 3F A1 76
{
if (len != HB_COM_REQ_A1_LEN) {
break;
}
if (memcmp(HB_COM_REQ_A1_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_A1;
}
case 0xA2: // EB AB 3F A2 77
{
if (len != HB_COM_REQ_A2_LEN) {
break;
}
if (memcmp(HB_COM_REQ_A2_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_A2;
}
case 0xA5: // EB AB 3F A5 7A
{
if (len != HB_COM_REQ_A5_LEN) {
break;
}
if (memcmp(HB_COM_REQ_A5_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_A5;
}
case 0xAC: // EB AB 3F AC 81
{
if (len != HB_COM_REQ_AC_LEN) {
break;
}
if (memcmp(HB_COM_REQ_AC_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_AC;
}
case 0xAD: // EB AB 3F AD 82
{
if (len != HB_COM_REQ_AD_LEN) {
break;
}
if (memcmp(HB_COM_REQ_AD_DATA, data, len) != 0) {
break;
}
copy_data_to_com;
return HB_COM_REQ_AD;
}
default:
break;
}
break;
}
case 0xBA: {
if (data[2] != 0x3F) {
break;
}
if (len == HB_COM_REQ_RA_LEN &&
memcmp(data, HB_COM_REQ_RA_DATA, len) == 0) {
copy_data_to_com;
return HB_COM_REQ_RA;
}
break;
}
case 0xCB: {
if (data[2] != 0x3F) {
break;
}
if (data[3] == 0x09 &&
data[4] == 0xA3 &&
len == HB_COM_REQ_A3_LEN) {
// EB CB 3F 09 A3 P1 P2 P3 SUM
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_REQ_A3;
}
} else if (data[3] == 0x0F &&
data[4] == 0x4D &&
len == HB_COM_REQ_WA_LEN) {
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_REQ_WA;
}
} else if (data[3] == 0x0E &&
data[4] == 0xA7 &&
len == HB_COM_REQ_A7_LEN) {
// EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_REQ_A7;
}
}
/*else if (data[3] == 0x08 && data[4] == 0xA9 && len == A9_len) {
A7 req; memcpy(req.data, data, req.len); sum(req);
if (data[len - 1] == req.data[len - 1]) { return A7; }
}*/
else if (data[3] == 0x08 &&
data[4] == 0xAA &&
len == HB_COM_REQ_AA_LEN) {
// EB CB 3F 08 AA P1 P2 SUM
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_REQ_AA;
}
}
/*else if (data[3] == 0x08 && data[4] == 0xAE && len == AE_len) {
AA req; memcpy(req.data, data, req.len); sum(req);
if (data[len - 1] == req.data[len - 1]) { return AA; }
}*/
else if (data[3] == 0x06 && data[4] == 0xB0 &&
len == HB_COM_REQ_B0_LEN &&
memcmp(HB_COM_REQ_B0_DATA, data, len) == 0) {
// EB CB 3F 06 B0 AB
copy_data_to_com;
return HB_COM_REQ_B0;
}
}
}
} while (0);
return HB_COM_REQ_INVALID;
}
hb_com_req_t hb_com_parse_xdata_req(const ademco_xdata_t* xdata,
hb_com_data_t* cd) {
if (!xdata) {
return HB_COM_REQ_INVALID;
}
return hb_com_parse_req(
(const uint8_t*)ademco_xdata_get_valid_content_addr(xdata),
ademco_xdata_get_valid_content_len(xdata),
cd);
}
hb_com_resp_t hb_com_parse_resp(const uint8_t* data,
size_t len,
hb_com_data_t* cd) {
do {
if (len < 7) {
break;
} // 所有的 response ,长度最小为 7
if (data[0] != 0xEB || data[1] != 0xBA || data[2] != 0x3F) {
break;
}
switch (data[5]) {
case 0xA0: // EB BA 3F 07 P0 A0 P1 P2 P3 SUM
{
if (len != HB_COM_RESP_A0_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A0;
}
break;
}
case 0xA2: // EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
{
if (len != data[3]) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A2;
}
break;
}
case 0xA3: {
if (len != HB_COM_RESP_A3_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A3;
}
break;
}
case 0xA4: {
if (len != HB_COM_RESP_A4_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A4;
}
break;
}
case 0xA6: {
if (len != HB_COM_RESP_A6_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A6;
}
break;
}
case 0xA7: {
if (len != HB_COM_RESP_A7_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A7;
}
break;
}
case 0xA8: {
if (len != HB_COM_RESP_A8_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_A8;
}
break;
}
case 0xA9: {
// TODO
break;
}
case 0xAB: {
if (len != HB_COM_RESP_AB_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_AB;
}
break;
}
case 0xAD: // EB BA 3F PN P0 AD P1 DATA P2 SUM
{
if (len != data[3]) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_AD;
}
break;
}
case 0xAF: // TODO
{
break;
}
case 0xB1: // EB BA 3F 08 P0 B1 P1 SUM
{
if (len != HB_COM_RESP_B1_LEN) {
break;
}
if (hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_B1;
}
break;
}
}
} while (0);
// 处理读写主机账号回应
do {
if (len >= HB_COM_RESP_WA_LEN &&
memcmp(HB_COM_RESP_WA_DATA, data, HB_COM_RESP_WA_LEN) == 0) {
return HB_COM_RESP_WA;
}
if (len >= HB_COM_RESP_RA_LEN &&
memcmp(HB_COM_RESP_RA_HEAD, data, sizeof(HB_COM_RESP_RA_HEAD) - 1) == 0 &&
hb_chksum(data, len)) {
copy_data_to_com;
return HB_COM_RESP_RA;
}
} while (0);
return HB_COM_RESP_INVALID;
}
hb_com_resp_t hb_com_parse_xdata_resp(const ademco_xdata_t* xdata,
hb_com_data_t* cd) {
if (!xdata) {
return HB_COM_RESP_INVALID;
}
return hb_com_parse_resp(
(const uint8_t*)ademco_xdata_get_valid_content_addr(xdata),
ademco_xdata_get_valid_content_len(xdata),
cd);
}
void hb_com_make_req_a0_get_machine_status(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_A0_DATA, HB_COM_REQ_A0_LEN);
data->len = HB_COM_REQ_A0_LEN;
}
void hb_com_make_req_a1_get_machine_zones(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_A1_DATA, HB_COM_REQ_A1_LEN);
data->len = HB_COM_REQ_A1_LEN;
}
void hb_com_make_req_a2_get_more_machine_zones(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_A2_DATA, HB_COM_REQ_A2_LEN);
data->len = HB_COM_REQ_A2_LEN;
}
void hb_com_make_req_a3_modify_machine_zone(hb_com_data_t* data,
uint8_t zone,
hb_zone_property_t prop,
hb_com_req_a3_p3_t op) {
memcpy(data->data, HB_COM_REQ_A3_DATA, 5);
data->data[5] = zone;
data->data[6] = prop;
data->data[7] = op;
data->len = HB_COM_REQ_A3_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_req_a5_get_machine_timer(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_A5_DATA, HB_COM_REQ_A5_LEN);
data->len = HB_COM_REQ_A5_LEN;
}
void hb_com_make_req_a7_set_machine_timer(hb_com_data_t* data,
hb_machine_timer_t* timer) {
memcpy(data->data, HB_COM_REQ_A7_HEAD, 5);
memcpy(data->data + 5, timer, sizeof(*timer));
data->len = HB_COM_REQ_A7_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_req_aa_modify_machine_zone_lost_config(hb_com_data_t* data,
uint8_t zone,
int on) {
memcpy(data->data, HB_COM_REQ_AA_HEAD, 5);
data->data[5] = zone;
data->data[6] = !!on;
data->len = HB_COM_REQ_AA_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_req_ac_get_machine_zone_lost_config(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_AC_DATA, HB_COM_REQ_AC_LEN);
data->len = HB_COM_REQ_AC_LEN;
}
void hb_com_make_req_ad_get_more_machine_zone_lost_config(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_AD_DATA, HB_COM_REQ_AD_LEN);
data->len = HB_COM_REQ_AD_LEN;
}
void hb_com_make_req_ae_set_3sec_machine_status(hb_com_data_t* data,
hb_com_3sec_which_t p1,
hb_com_3sec_status_t status) {
memcpy(data->data, HB_COM_REQ_AE_HEAD, 5);
data->data[5] = p1;
data->data[6] = status;
data->len = HB_COM_REQ_AE_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_req_b0_get_3sec_machine_status(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_B0_DATA, HB_COM_REQ_B0_LEN);
data->len = HB_COM_REQ_B0_LEN;
}
void hb_com_make_req_ra_read_acct(hb_com_data_t* data) {
memcpy(data->data, HB_COM_REQ_RA_DATA, HB_COM_REQ_RA_LEN);
data->len = HB_COM_REQ_RA_LEN;
}
void hb_com_make_req_wa_write_acct(hb_com_data_t* data, const char* acct) {
memcpy(data->data, HB_COM_REQ_WA_HEAD, 5);
ademco_hex_str_to_hilo_array(data->data + 5,
ADEMCO_PACKET_ACCT_MAX_LEN / 2,
acct);
data->len = HB_COM_REQ_WA_LEN;
hb_sum(data->data, data->len);
}
void hb_com_resp_a2_iter_init(hb_com_resp_a2_iter_t* iter,
const hb_com_data_t* com) {
if (!iter || !com) return;
iter->com = com;
iter->i = 0;
if (com->len > HB_COM_RESP_A2_MIN_LEN) {
iter->total = (com->len - HB_COM_RESP_A2_MIN_LEN) / 2;
iter->p1 = (com->data[com->len - 2] == 0xFF)
? HB_COM_RESP_A2_P1_NOMORE
: HB_COM_RESP_A2_P1_MORE;
} else {
iter->total = 0;
iter->p1 = HB_COM_RESP_A2_P1_NOMORE;
}
}
hb_com_resp_a2_p1_t hb_com_resp_a2_iter_next(hb_com_resp_a2_iter_t* iter,
hb_zone_and_property_t* zp) {
if (iter->i == iter->total)
return HB_COM_RESP_A2_P1_NOMORE;
zp->zone = iter->com->data[6 + iter->i * 2];
zp->prop = (hb_zone_property_t)iter->com->data[7 + iter->i * 2];
iter->i++;
return HB_COM_RESP_A2_P1_MORE;
}
void hb_com_make_resp_a0_machine_status(hb_com_data_t* data,
hb_machine_status_t status,
hb_machine_type_t type) {
memcpy(data->data, HB_COM_RESP_A0_HEAD, 6);
data->data[6] = status;
data->data[7] = type;
data->len = HB_COM_RESP_A0_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_resp_a2_machine_zones(hb_com_data_t* data,
size_t count,
ademco_zone_t* zones,
hb_zone_property_t* props,
hb_com_resp_a2_p1_t p1) {
if (count > HB_COM_RESP_A2_MAX_ZONE) {
return;
}
memcpy(data->data, HB_COM_RESP_A2_HEAD, 6);
data->data[3] = (HB_COM_RESP_A2_MIN_LEN + count * 2) & 0xFF;
uint8_t* p = data->data + 6;
for (size_t i = 0; i < count; i++) {
*p++ = zones[i] & 0xFF;
*p++ = props[i];
}
*p++ = (count > 0) ? (uint8_t)p1 : (uint8_t)HB_COM_RESP_A2_P1_NOMORE;
data->len = (++p - data->data) & 0xFF;
hb_sum(data->data, data->len);
}
void hb_com_make_resp_a3_waiting_sensor_signal(hb_com_data_t* data) {
memcpy(data->data, HB_COM_RESP_A3_DATA, HB_COM_RESP_A3_LEN);
data->len = HB_COM_RESP_A3_LEN;
}
void hb_com_make_resp_a4_modify_zone_result(hb_com_data_t* data,
ademco_zone_t zone,
hb_zone_property_t prop,
hb_com_resp_a4_p3_t p3) {
memcpy(data->data, HB_COM_RESP_A4_HEAD, 6);
data->data[6] = zone & 0xFF;
data->data[7] = prop;
data->data[8] = p3;
data->len = HB_COM_RESP_A4_LEN;
hb_sum(data->data, data->len);
}
void hb_com_resp_a7_to_timer(hb_com_data_t* data, hb_machine_timer_t* timer) {
memcpy(timer->data, &data->data[2], 8);
}
void hb_com_make_resp_a6_machine_timer(hb_com_data_t* data,
hb_machine_timer_t* timer) {
memcpy(data->data, HB_COM_RESP_A6_HEAD, 6);
memcpy(data->data + 6, timer->data, sizeof(*timer));
data->len = HB_COM_RESP_A6_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_resp_a7_set_machine_timer_result(hb_com_data_t* data) {
memcpy(data->data, HB_COM_RESP_A7_DATA, HB_COM_RESP_A7_LEN);
data->len = HB_COM_RESP_A7_LEN;
}
void hb_com_make_resp_a8_reject(hb_com_data_t* data) {
memcpy(data->data, HB_COM_RESP_A8_DATA, HB_COM_RESP_A8_LEN);
data->len = HB_COM_RESP_A8_LEN;
}
void hb_com_make_resp_ab_modify_machine_zone_lost_config_result(hb_com_data_t* data,
ademco_zone_t zone,
hb_com_resp_ab_p2_t p2) {
memcpy(data->data, HB_COM_RESP_AB_HEAD, 6);
data->data[6] = zone & 0xFF;
data->data[7] = p2;
data->len = HB_COM_RESP_AB_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_resp_ad_machine_zone_lost_config(hb_com_data_t* data,
hb_com_resp_ad_p1_t p1,
size_t count,
ademco_zone_t* zones,
hb_com_resp_ad_p2_t p2) {
if (count > HB_COM_RESP_AD_MAX_ZONE) {
return;
}
memcpy(data->data, HB_COM_RESP_AD_HEAD, 6);
data->data[3] = (HB_COM_RESP_AD_MIN_LEN +
(p1 == HB_COM_RESP_AD_P1_SINGLE ? count : count * 2)) &
0xFF;
data->data[6] = p1;
uint8_t* p = data->data + 7;
for (size_t i = 0; i < count; i++) {
if (p1 == HB_COM_RESP_AD_P1_SINGLE) {
*p++ = zones[i] & 0xFF;
} else {
*p++ = zones[i] >> 8 & 0xFF;
*p++ = zones[i] & 0xFF;
}
}
*p++ = (count > 0) ? (uint8_t)p2 : (uint8_t)HB_COM_RESP_AD_P2_NOMORE;
data->len = (++p - data->data) & 0xFF;
hb_sum(data->data, data->len);
}
void hb_com_resp_ad_iter_init(hb_com_resp_ad_iter_t* iter, const hb_com_data_t* com) {
if (!iter || !com) return;
iter->com = com;
iter->i = 0;
if (com->len > HB_COM_RESP_AD_MIN_LEN) {
iter->p1 = com->data[6];
iter->total = (com->len - HB_COM_RESP_AD_MIN_LEN);
if (iter->p1 == HB_COM_RESP_AD_P1_DOUBLE) {
iter->total >>= 1;
}
iter->p2 = (com->data[com->len - 2] == 0xFF)
? HB_COM_RESP_AD_P2_NOMORE
: HB_COM_RESP_AD_P2_MORE;
} else {
iter->total = 0;
iter->p1 = HB_COM_RESP_AD_P1_SINGLE;
iter->p2 = HB_COM_RESP_AD_P2_NOMORE;
}
}
hb_com_resp_ad_p2_t hb_com_resp_ad_iter_next(hb_com_resp_ad_iter_t* iter, ademco_zone_t* zone) {
if (iter->i == iter->total)
return HB_COM_RESP_AD_P2_NOMORE;
if (iter->p1 == HB_COM_RESP_AD_P1_SINGLE) {
*zone = iter->com->data[7 + iter->i];
} else {
*zone = iter->com->data[7 + iter->i * 2] << 8;
*zone += iter->com->data[7 + iter->i * 2 + 1];
}
iter->i++;
return HB_COM_RESP_AD_P2_MORE;
}
void hb_com_make_resp_af_set_3sec_machine_status_result(hb_com_data_t* data,
hb_com_3sec_which_t p1,
hb_com_3sec_status_t status) {
memcpy(data->data, HB_COM_RESP_AF_HEAD, 6);
data->data[6] = p1;
data->data[7] = status;
data->len = HB_COM_RESP_AF_LEN;
hb_sum(data->data, data->len);
}
void hb_com_make_resp_b1_3sec_machine_status(hb_com_data_t* data,
hb_machine_status_t statusMachine,
hb_machine_status_t statusSec1,
hb_machine_status_t statusSec2,
hb_machine_status_t statusSec3) {
memcpy(data->data, HB_COM_RESP_B1_HEAD, 6);
data->data[6] = ((uint8_t)statusMachine << 6) |
((uint8_t)statusSec1 << 4) |
((uint8_t)statusSec2 << 2) |
((uint8_t)statusSec3);
data->len = HB_COM_RESP_B1_LEN;
hb_sum(data->data, data->len);
}
void hb_com_data_to_ademco_xdata(const hb_com_data_t* const data,
ademco_xdata_t* xdata,
ademco_xdata_length_format_t xlf,
ademco_xdata_transform_t xtr) {
ademco_make_xdata(xdata, xlf, xtr, (const char*)data->data, data->len);
}
#ifndef __HB_COM_H__
#define __HB_COM_H__
#ifndef __HB_CORE_H__
#define __HB_CORE_H__
#pragma once
......@@ -9,8 +9,6 @@
extern "C" {
#endif
// 串口透传数据最大长度
#define HB_COM_DATA_MAX_LEN 64
// 三防区主机状态GG范围 1~3
#define HB_3SECTION_MACHINE_GG_MIN 1
......@@ -126,289 +124,33 @@ typedef enum hb_zone_property_t {
HZP_INVALID = -1,
} hb_zone_property_t;
typedef struct hb_zone_and_property_t {
typedef struct {
ademco_zone_t zone;
hb_zone_property_t prop;
} hb_zone_and_property_t;
typedef struct hb_machine_time_point_t {
typedef struct {
uint8_t hour;
uint8_t minute;
} hb_machine_time_point_t;
typedef struct hb_machine_timer_one_t {
typedef struct {
hb_machine_time_point_t arm_at;
hb_machine_time_point_t disarm_at;
} hb_machine_timer_one_t;
typedef union hb_machine_timer_t {
typedef union {
hb_machine_timer_one_t timer[2]; // 2 set of timer
uint8_t data[8];
} hb_machine_timer_t;
// 串口透传数据
typedef struct hb_com_data_t {
uint8_t data[HB_COM_DATA_MAX_LEN];
uint8_t len;
} hb_com_data_t;
// COM request table
#define HB_COM_REQUESTS_MAP(XX) \
XX(A0, "索要主机状态") \
XX(A1, "索要防区") \
XX(A2, "索要更多防区") \
XX(A3, "修改防区") \
XX(A5, "获取定时器") \
XX(A7, "设置定时器") \
XX(A9, "TODO") \
XX(AA, "修改防区探头遗失/失联") \
XX(AC, "索要防区探头遗失/失联--第一次索要") \
XX(AD, "索要防区探头遗失/失联--继续索要") \
XX(AE, "三区段主机布撤防命令") \
XX(B0, "索要三区段主机状态") \
XX(RA, "读取主机账号") \
XX(WA, "写入主机账号")
// 发给主机
typedef enum hb_com_req_t {
#define XX(name, str) HB_COM_REQ_##name,
HB_COM_REQUESTS_MAP(XX)
#undef XX
// invalid
HB_COM_REQ_INVALID = -1,
} hb_com_req_t;
// COM response table
#define HB_COM_RESPONSES_MAP(XX) \
XX(A0, "索要主机状态回应") \
XX(A2, "索要防区回应") \
XX(A3, "学码开始回应") \
XX(A4, "修改防区回应") \
XX(A6, "获取定时器回应") \
XX(A7, "设置定时器回应") \
XX(A8, "拒绝设置或设置失败回应") \
XX(A9, "TODO") \
XX(AB, "修改防区探头遗失/失联回应") \
XX(AD, "索要防区探头遗失/失联回应") \
XX(AF, "三区段主机布撤防命令回应") \
XX(B1, "三区段主机状态回应") \
XX(RA, "读取主机账号回应") \
XX(WA, "写入主机账号回应")
// 主机回应
typedef enum hb_com_resp_t {
#define XX(name, str) HB_COM_RESP_##name,
HB_COM_RESPONSES_MAP(XX)
#undef XX
// invalid
HB_COM_RESP_INVALID = -1,
} hb_com_resp_t;
// 索要主机状态 EB AB 3F A0 75
#define HB_COM_REQ_A0_LEN 5
#define HB_COM_REQ_A0_DATA "\xEB\xAB\x3F\xA0\x75"
// 回应主机状态 EB BA 3F 07 P0 A0 P1 P2 SUM
#define HB_COM_RESP_A0_LEN 9
#define HB_COM_RESP_A0_HEAD "\xEB\xBA\x3F\x07\xCC\xA0"
// 索要主机防区 EB AB 3F A1 76
#define HB_COM_REQ_A1_LEN 5
#define HB_COM_REQ_A1_DATA "\xEB\xAB\x3F\xA1\x76"
// 回应主机防区 EB BA 3F PN P0 A2 [Z, P]xN P1 SUM
// 无防区数据时长度最小为8
#define HB_COM_RESP_A2_MIN_LEN 8
// 最多可以包含 20 个防区
#define HB_COM_RESP_A2_MAX_ZONE 20
// 一包数据最多有8+20*2=48个字节
#define HB_COM_RESP_A2_MAX_LEN (HB_COM_RESP_A2_MIN_LEN + HB_COM_RESP_A2_MAX_ZONE * 2)
typedef enum hb_com_resp_a2_p1_t {
HB_COM_RESP_A2_P1_MORE = 0x00, // 还有更多防区
HB_COM_RESP_A2_P1_NOMORE = 0xFF, // 无更多防区
} hb_com_resp_a2_p1_t;
#define HB_COM_RESP_A2_HEAD "\xEB\xBA\x3F\x08\xCC\xA2"
typedef struct hb_com_resp_a2_iter_t {
const hb_com_data_t* com;
uint8_t i, total;
hb_com_resp_a2_p1_t p1;
} hb_com_resp_a2_iter_t;
// 索要更多主机防区 EB AB 3F A2 77
// 仅应在收到ZoneResponse的param非0xFF时发送,以索要全部防区
#define HB_COM_REQ_A2_LEN 5
#define HB_COM_REQ_A2_DATA "\xEB\xAB\x3F\xA2\x77"
// 修改主机防区 EB CB 3F 09 A3 P1 P2 P3 SUM
#define HB_COM_REQ_A3_LEN 9
#define HB_COM_REQ_A3_DATA "\xEB\xCB\x3F\x09\xA3"
typedef enum hb_com_req_a3_p3_t {
HB_COM_REQ_A3_P3_DEL = 0x00, // 删除防区
HB_COM_REQ_A3_P3_PAIR = 0x01, // 学码
HB_COM_REQ_A3_P3_STOP = 0x02, // 停止学码
HB_COM_REQ_A3_P3_MOD = 0x03, // 修改防区属性
} hb_com_req_a3_p3_t;
// 学码开始回应 EB BA 3F 07 P0 A3 5A
// 因为学码时主机要等待外部无线信号(用户触发探测器),
// 因此先回应A3表示已经开始学码,学码成功时回 ZoneOpResponse A4
#define HB_COM_RESP_A3_LEN 7
#define HB_COM_RESP_A3_DATA "\xEB\xBA\x3F\x07\xCC\xA3\x5A"
// 修改防区回应 EB BA 3F 0A P0 A4 P1 P2 P3 SUM
#define HB_COM_RESP_A4_LEN 10
#define HB_COM_RESP_A4_HEAD "\xEB\xBA\x3F\x0A\xCC\xA4"
typedef enum hb_com_resp_a4_p3_t {
HB_COM_RESP_A4_P3_FAIL = 0x00, // 失败
HB_COM_RESP_A4_P3_OK = 0x01, // 成功
HB_COM_RESP_A4_P3_DUP = 0x02, // 失败--重码
HB_COM_RESP_A4_P3_NE = 0x03, // 失败--防区未对码 not exists
} hb_com_resp_a4_p3_t;
// 获取主机定时器
// EB AB 3F A5 7A
#define HB_COM_REQ_A5_LEN 5
#define HB_COM_REQ_A5_DATA "\xEB\xAB\x3F\xA5\x7A"
// 获取主机定时器回应
// EB BA 3F 0F P0 A6 H1 M1 H2 M2 H3 M3 H4 M4 SUM
#define HB_COM_RESP_A6_LEN 15
#define HB_COM_RESP_A6_HEAD "\xEB\xBA\x3F\x0F\xCC\xA6"
// 设置主机定时器
// EB CB 3F 0E A7 H1 M1 H2 M2 H3 M3 H4 M4 SUM
#define HB_COM_REQ_A7_LEN 14
#define HB_COM_REQ_A7_HEAD "\xEB\xCB\x3F\x0E\xA7"
// 设置主机定时器回应
// EB BA 3F 07 P0 A7 SUM
#define HB_COM_RESP_A7_LEN 7
#define HB_COM_RESP_A7_DATA "\xEB\xBA\x3F\x07\xCC\xA7\x5E"
// 拒绝设置回应
// EB BA 3F 07 P0 A8 SUM
// 任何操作,主机如果认为非法,都可以用A8直接回复
#define HB_COM_RESP_A8_LEN 7
#define HB_COM_RESP_A8_DATA "\xEB\xBA\x3F\x07\xCC\xA8\x5F"
// 修改防区探头遗失/失联
// EB CB 3F 08 AA P1 P2 SUM
#define HB_COM_REQ_AA_LEN 8
#define HB_COM_REQ_AA_HEAD "\xEB\xAB\x3F\x08\xAA"
// 修改防区探头遗失/失联回应
// EB BA 3F 09 P0 AB P1 P2 SUM
#define HB_COM_RESP_AB_LEN 9
#define HB_COM_RESP_AB_HEAD "\xEB\xBA\x3F\x09\xCC\xAB"
typedef enum hb_com_resp_ab_p2_t {
HB_COM_RESP_AB_P2_CLOSE = 0, // 防区失联关
HB_COM_RESP_AB_P2_OPEN = 1, // 防区失联开
HB_COM_RESP_AB_P2_REJECT = 2, // 拒绝操作
} hb_com_resp_ab_p2_t;
// 索要防区探头遗失/失联,第一次索要
// EB AB 3F AC 81
#define HB_COM_REQ_AC_LEN 5
#define HB_COM_REQ_AC_DATA "\xEB\xAB\x3F\xAC\x81"
// 索要防区探头遗失/失联,索要更多
// EB AB 3F AD 82
#define HB_COM_REQ_AD_LEN 5
#define HB_COM_REQ_AD_DATA "\xEB\xAB\x3F\xAD\x82"
// 索要防区探头遗失/失联回应
// EB BA 3F PN P0 AD P1 DATA P2 SUM
// 无防区失联数据时一包长度最小为9
#define HB_COM_RESP_AD_MIN_LEN 9
// 一包最多包含20个防区
#define HB_COM_RESP_AD_MAX_ZONE 20
// 一包最多有 9 + 20 *2 = 49 个字节
#define HB_COM_RESP_AD_MAX_LEN \
(HB_COM_RESP_AD_MIN_LEN + HB_COM_RESP_AD_MAX_ZONE * 2)
typedef enum hb_com_resp_ad_p1_t {
HB_COM_RESP_AD_P1_SINGLE = 0xF0, // 防区号以单字节表示
HB_COM_RESP_AD_P1_DOUBLE = 0xF1, // 防区号以双字节表示
} hb_com_resp_ad_p1_t;
typedef enum hb_com_resp_ad_p2_t {
HB_COM_RESP_AD_P2_MORE = 0x00, // 还有更多防区
HB_COM_RESP_AD_P2_NOMORE = 0xFF, // 无更多防区
} hb_com_resp_ad_p2_t;
#define HB_COM_RESP_AD_HEAD "\xEB\xBA\x3F\x09\xCC\xAD"
typedef struct hb_com_resp_ad_iter_t {
const hb_com_data_t* com;
uint8_t i, total;
hb_com_resp_ad_p1_t p1;
hb_com_resp_ad_p2_t p2;
} hb_com_resp_ad_iter_t;
typedef enum hb_com_3sec_status_t {
HB_COM_3SEC_ARM = 0x00, // 布防(成功)
HB_COM_3SEC_DISARM = 0x01, // 撤防(成功)
} hb_com_3sec_status_t;
typedef enum hb_com_3sec_which_t {
HB_COM_3SEC_MACHINE, // 主机
HB_COM_3SEC_SECTION1, // 区段1
HB_COM_3SEC_SECTION2, // 区段2
HB_COM_3SEC_SECTION3, // 区段3
} hb_com_3sec_which_t;
// 三区段主机布撤防命令 EB CB 3F 08 AE P1 P2 SUM
#define HB_COM_REQ_AE_LEN 8
#define HB_COM_REQ_AE_HEAD "\xEB\xCB\x3F\x08\xAE"
// 三区段主机布撤防命令回应 EB BA 3F 08 P0 AF P1 P2 SUM
#define HB_COM_RESP_AF_LEN 9
#define HB_COM_RESP_AF_HEAD "\xEB\xBA\x3F\x08\xCC\xAF"
// 三区段主机索要主机状态 EB CB 3F 06 B0 AB
#define HB_COM_REQ_B0_LEN 6
#define HB_COM_REQ_B0_DATA "\xEB\xCB\x3F\x06\xB0\xAB"
// 三区段主机状态回应 EB BA 3F 08 P0 B1 P1 SUM
#define HB_COM_RESP_B1_LEN 8
#define HB_COM_RESP_B1_HEAD "\xEB\xBA\x3F\x08\xCC\xB1"
#define hb_com_resp_b1_get_status(d) \
((((d)[6] >> 6) & 0x03) == HB_COM_3SEC_ARM ? HMS_ARM : HMS_DISARM)
#define hb_com_resp_b1_get_status1(d) \
((((d)[6] >> 4) & 0x03) == HB_COM_3SEC_ARM ? HMS_ARM : HMS_DISARM)
#define hb_com_resp_b1_get_status2(d) \
((((d)[6] >> 2) & 0x03) == HB_COM_3SEC_ARM ? HMS_ARM : HMS_DISARM)
#define hb_com_resp_b1_get_status3(d) \
((((d)[6]) & 0x03) == HB_COM_3SEC_ARM ? HMS_ARM : HMS_DISARM)
// 读取主机账号
#define HB_COM_REQ_RA_LEN 7
#define HB_COM_REQ_RA_DATA "\xEB\xBA\x3F\x07\x00\x4C\x37"
// 读取主机账号回应
#define HB_COM_RESP_RA_LEN 15
#define HB_COM_RESP_RA_HEAD "\xEB\xCB\x3F\x0F\x4C"
// 写入主机账号
#define HB_COM_REQ_WA_LEN 15
#define HB_COM_REQ_WA_HEAD "\xEB\xCB\x3F\x0F\x4D"
// 写入主机账号回应(与读取命令相同)
#define HB_COM_RESP_WA_LEN HB_COM_REQ_RA_LEN
#define HB_COM_RESP_WA_DATA HB_COM_REQ_RA_DATA
///////////////////////////// property functions //////////////////////////////
// return available count
// props must have at least HZP_COUNT items
ADEMCO_EXPORT_SYMBOL
size_t hb_get_available_zone_properties_by_type(hb_machine_type_t type, hb_zone_property_t props[HZP_COUNT]);
size_t hb_get_available_zone_properties_by_type(hb_machine_type_t type,
hb_zone_property_t props[HZP_COUNT]);
// 最大防区号根据型号不同而不同
ADEMCO_EXPORT_SYMBOL
......@@ -527,12 +269,6 @@ const char* hb_machine_type_to_string(hb_machine_type_t type);
ADEMCO_EXPORT_SYMBOL
const char* hb_zone_property_to_string(hb_zone_property_t zp);
ADEMCO_EXPORT_SYMBOL
const char* hb_com_req_to_string(hb_com_req_t type);
ADEMCO_EXPORT_SYMBOL
const char* hb_com_resp_to_string(hb_com_resp_t type);
#if ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const char* hb_machine_status_to_string_chinese(hb_machine_status_t status);
......@@ -542,174 +278,11 @@ const char* hb_machine_type_to_string_chinese(hb_machine_type_t type);
ADEMCO_EXPORT_SYMBOL
const char* hb_zone_property_to_string_chinese(hb_zone_property_t zp);
ADEMCO_EXPORT_SYMBOL
const char* hb_com_req_to_string_chinese(hb_com_req_t type);
ADEMCO_EXPORT_SYMBOL
const char* hb_com_resp_to_string_chinese(hb_com_resp_t type);
#endif // ADEMCO_ENABLE_CHINESE
ADEMCO_EXPORT_SYMBOL
const char* hb_get_zone_format_str(hb_machine_type_t type);
///////////////////////////// COM functions ///////////////////////////////////
// 累加校验,计算data[0] ~ data[len-2],校验和放在data[len-1]
ADEMCO_EXPORT_SYMBOL
void hb_sum(uint8_t* data, size_t len);
// 校验和是否正确, return 0 for incorrect, otherwise correct
ADEMCO_EXPORT_SYMBOL
int hb_chksum(const uint8_t* data, size_t len);
ADEMCO_EXPORT_SYMBOL
hb_com_req_t hb_com_parse_req(const uint8_t* buff, size_t len, hb_com_data_t* cd);
ADEMCO_EXPORT_SYMBOL
hb_com_req_t hb_com_parse_xdata_req(const ademco_xdata_t* xdata, hb_com_data_t* cd);
// parse COM response and return response type.
// If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
hb_com_resp_t hb_com_parse_resp(const uint8_t* buff, size_t len, hb_com_data_t* cd);
// parse COM response and return response type.
// If cd is non-NULL, valid data will be copied to cd
ADEMCO_EXPORT_SYMBOL
hb_com_resp_t hb_com_parse_xdata_resp(const ademco_xdata_t* xdata, hb_com_data_t* cd);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a0_get_machine_status(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a1_get_machine_zones(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a2_get_more_machine_zones(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a3_modify_machine_zone(hb_com_data_t* data,
uint8_t zone,
hb_zone_property_t prop,
hb_com_req_a3_p3_t op);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a5_get_machine_timer(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_a7_set_machine_timer(hb_com_data_t* data, hb_machine_timer_t* timer);
// TODO
// ADEMCO_EXPORT_SYMBOL
// void hbComMakeReqA9(hb_com_data_t* data, hb_machine_status_t status, hb_machine_type_t type);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_aa_modify_machine_zone_lost_config(hb_com_data_t* data, uint8_t zone, int on);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_ac_get_machine_zone_lost_config(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_ad_get_more_machine_zone_lost_config(hb_com_data_t* data);
// p2 must be HB_COM_3SEC_ARM or HB_COM_3SEC_DISARM
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_ae_set_3sec_machine_status(hb_com_data_t* data,
hb_com_3sec_which_t p1,
hb_com_3sec_status_t status);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_b0_get_3sec_machine_status(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_ra_read_acct(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_req_wa_write_acct(hb_com_data_t* data, const char* acct);
ADEMCO_EXPORT_SYMBOL
void hb_com_resp_a2_iter_init(hb_com_resp_a2_iter_t* iter, const hb_com_data_t* com);
ADEMCO_EXPORT_SYMBOL
hb_com_resp_a2_p1_t hb_com_resp_a2_iter_next(hb_com_resp_a2_iter_t* iter,
hb_zone_and_property_t* zp);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a0_machine_status(hb_com_data_t* data,
hb_machine_status_t status,
hb_machine_type_t type);
// zones and props length is count
// if count is 0, p1 wil be set to HB_COM_RESP_A2_P1_NOMORE
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a2_machine_zones(hb_com_data_t* data,
size_t count,
ademco_zone_t* zones,
hb_zone_property_t* props,
hb_com_resp_a2_p1_t p1);
// 学码开始,等待探测器无线信号中
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a3_waiting_sensor_signal(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a4_modify_zone_result(hb_com_data_t* data,
ademco_zone_t zone,
hb_zone_property_t prop,
hb_com_resp_a4_p3_t p3);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a6_machine_timer(hb_com_data_t* data, hb_machine_timer_t* timer);
ADEMCO_EXPORT_SYMBOL
void hb_com_resp_a7_to_timer(hb_com_data_t* data, hb_machine_timer_t* timer);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a7_set_machine_timer_result(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_a8_reject(hb_com_data_t* data);
// TODO
// ADEMCO_EXPORT_SYMBOL void hbComMakeRespA9_(hb_com_data_t* data);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_ab_modify_machine_zone_lost_config_result(hb_com_data_t* data,
ademco_zone_t zone,
hb_com_resp_ab_p2_t p2);
// 返回所有失联开的防区
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_ad_machine_zone_lost_config(hb_com_data_t* data,
hb_com_resp_ad_p1_t p1,
size_t count,
ademco_zone_t* zones,
hb_com_resp_ad_p2_t p2);
ADEMCO_EXPORT_SYMBOL
void hb_com_resp_ad_iter_init(hb_com_resp_ad_iter_t* iter, const hb_com_data_t* com);
ADEMCO_EXPORT_SYMBOL
hb_com_resp_ad_p2_t hb_com_resp_ad_iter_next(hb_com_resp_ad_iter_t* iter, ademco_zone_t* zone);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_af_set_3sec_machine_status_result(hb_com_data_t* data,
hb_com_3sec_which_t p1,
hb_com_3sec_status_t status);
ADEMCO_EXPORT_SYMBOL
void hb_com_make_resp_b1_3sec_machine_status(hb_com_data_t* data,
hb_machine_status_t statusMachine,
hb_machine_status_t statusSec1,
hb_machine_status_t statusSec2,
hb_machine_status_t statusSec3);
ADEMCO_EXPORT_SYMBOL
void hb_com_data_to_ademco_xdata(const hb_com_data_t* const data,
ademco_xdata_t* xdata,
ademco_xdata_length_format_t xlf,
ademco_xdata_transform_t xtr);
#ifdef __cplusplus
}
#endif
......
......@@ -5,7 +5,7 @@
"sources":[
"libademco_wrap.cxx",
"../ademco.c",
"../hb_com.c",
"../hb_core.c",
],
'conditions': [
['OS=="win"', {
......
......@@ -17,7 +17,7 @@
/* Includes the header in the wrapper code */
#include "../ademco_config.h"
#include "../ademco_version.h"
#include "../hb_com.h"
#include "../hb_core.h"
%}
#ifdef SWIGJAVA
......@@ -41,5 +41,5 @@ JAVA_ARRAYS_TYPEMAPS(uint8_t, byte, jbyte, Uint8, "[B")
%include "../ademco_config.h"
%include "../ademco_version.h"
%include "../ademco.h"
%include "../hb_com.h"
%include "../hb_core.h"
......@@ -9,8 +9,8 @@ repo=/h/dev_hb/libhb/libhb
cp -f ${repo}/ademco.h ../
cp -f ${repo}/ademco.c ../
cp -f ${repo}/hb_com.h ../
cp -f ${repo}/hb_com.c ../
cp -f ${repo}/hb_core.h ../
cp -f ${repo}/hb_core.c ../
cp -f ${repo}/ademco_version.h ../
cp -f ${repo}/ademco_config.h ../
cp -f ${repo}/CHANGELOG.md ../
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment