Commit 1c5cdc27 authored by captainwong's avatar captainwong

2.1.6

parent 431daf57
# Ademco Change Log # Ademco Change Log
## 2.1.6
- fix typo of `hb_machine_timer_to_greenwich`, `hb_machine_timer_from_greenwich`
- fix com request `A0` doc, remove `p3`
## 2.1.5
- return type of `hb_get_available_zone_properties_by_type` changed from `int` to `size_t`
## 2.1.4
- add `ADEMCO_ID_MASK`, `ADEMCO_ZONE_MASK`, and `ADEMCO_GG_MASK`
## 2.1.3
- fix `hb_com_resp_a2_p1_t` typo
## 2.1.2
- fix `ademco_parse_packet` on met invalid timestamp, `pkt.timestamp` is not inited
## 2.1.1
## 2.1.0
- change `ademco_zone_t` to `uint16_t`
- change `ademco_gg_t` to `uint8_t`
## 2.0.0
- add `hb_com_resp_ad_iter_t`, `hb_com_resp_ad_iter_init` and `hb_com_resp_ad_iter_next`
- add `ADEMCO_PACKET_PWD_MIN_LEN`, `ADEMCO_PACKET_PWD_MAX_LEN`
- code styles changed
- when parse returns `ADEMCO_PARSE_RESULT_ERROR`, `*ate` will contains length to ignore, caller must drop `*ate` bytes of data
## 1.5.1 ## 1.5.1
- account minimum length is 6 - `account` minimum length is 6
- `ademcoIsValidAccount` check length - `ademco_is_valid_account` check length
## 1.5.0 ## 1.5.0
- `HbComResp_A2_Iter.com` changed to pointer - `hb_com_resp_a2_iter_t.com` changed to pointer
- update parser for `timestamp` - update parser for `timestamp`
- add `AdemcoControlSource` defs - add `AdemcoControlSource` defs
...@@ -28,7 +73,7 @@ ...@@ -28,7 +73,7 @@
- add `file` for parse error - add `file` for parse error
- fix `struct tm not initilized` on parse - fix `struct tm not initilized` on parse
- fix parsing pointer on parse timestamp failed - fix parsing pointer on parse `timestamp` failed
## 1.2.0 ## 1.2.0
...@@ -40,9 +85,9 @@ ...@@ -40,9 +85,9 @@
## 1.1.0 ## 1.1.0
- ADEMCO_PACKET_ACCT_MAX_LEN changed from 64 to 18 - `ADEMCO_PACKET_ACCT_MAX_LEN` changed from 64 to 18
- add ADEMCO_PACKET_ACCT_MAX_LEN - add `ADEMCO_PACKET_ACCT_MAX_LEN`
- hb_com 读写主机账号命令 - `hb_com` 读写主机账号命令
## 1.0.0 ## 1.0.0
......
This diff is collapsed.
This diff is collapsed.
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
#endif // ADEMCO_EXPORTS #endif // ADEMCO_EXPORTS
#if defined(SWIGJAVA) || defined(SWIGCSHARP) #if defined(SWIGJAVA) || defined(SWIGCSHARP)
#define ademco_char_t uint8_t typedef uint8_t ademco_char_t;
#else #else
#define ademco_char_t char typedef char ademco_char_t;
#endif #endif
#ifndef ADEMCO_ENABLE_CHINESE #ifndef ADEMCO_ENABLE_CHINESE
......
...@@ -6,9 +6,9 @@ ...@@ -6,9 +6,9 @@
* evolve between minor releases, but only in a backwards compatible way. * evolve between minor releases, but only in a backwards compatible way.
*/ */
#define ADEMCO_VERSION_MAJOR 1 #define ADEMCO_VERSION_MAJOR 2
#define ADEMCO_VERSION_MINOR 5 #define ADEMCO_VERSION_MINOR 1
#define ADEMCO_VERSION_PATCH 1 #define ADEMCO_VERSION_PATCH 6
#define ADEMCO_VERSION_IS_RELEASE 1 #define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX "" #define ADEMCO_VERSION_SUFFIX ""
......
# 串口透传协议 # 串口透传协议
## 发给主机 ## 发给主机
|数据|长度|含义|说明| |数据|长度|含义|说明|
|---|----|----|----| |---|----|----|----|
|EB AB 3F **A0** 75|5|索要主机状态| |EB AB 3F **A0** 75|5|索要主机状态|
|EB AB 3F **A1** 76|5|索要防区|第一次索要时发送| |EB AB 3F **A1** 76|5|索要防区|第一次索要时发送|
|EB AB 3F **A2** 77|5|索要防区|在主机回应“还有更多防区”时发送此命令继续索要| |EB AB 3F **A2** 77|5|索要防区|在主机回应“还有更多防区”时发送此命令继续索要|
|EB CB 3F 09 **A3** *P1* *P2* *P3* SUM|9|修改防区|*P1*:防区号,*P2*:防区属性,*P3*:操作码:0删除,1学码,2结束学码,3修改属性| |EB CB 3F 09 **A3** *P1* *P2* *P3* SUM|9|修改防区|*P1*:防区号,*P2*:防区属性,*P3*:操作码:0删除,1学码,2结束学码,3修改属性|
|EB AB 3F **A5** 7A|5|索要定时器| |EB AB 3F **A5** 7A|5|索要定时器|
|EB CB 3F 0E **A7** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|13|设置定时器|第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*| |EB CB 3F 0E **A7** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|13|设置定时器|第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*|
|EB CB 3F 08 **A9** *DH DL* SUM|8|测试地址|*DH*:测试地址高位,*DL*:测试地址低位| |EB CB 3F 08 **A9** *DH DL* SUM|8|测试地址|*DH*:测试地址高位,*DL*:测试地址低位|
|EB CB 3F 08 **AA** *P1 P2* SUM|8|修改防区探头遗失/失联|*P1*:防区号;*P2*: 0失联关,1失联开| |EB CB 3F 08 **AA** *P1 P2* SUM|8|修改防区探头遗失/失联|*P1*:防区号;*P2*: 0失联关,1失联开|
|EB AB 3F **AC** 81|5|索要防区探头遗失/失联|第一次索要时发送| |EB AB 3F **AC** 81|5|索要防区探头遗失/失联|第一次索要时发送|
|EB AB 3F **AD** 82|5|索要防区探头遗失/失联|在主机回应“还有更多数据”时发送此命令继续索要| |EB AB 3F **AD** 82|5|索要防区探头遗失/失联|在主机回应“还有更多数据”时发送此命令继续索要|
|EB CB 3F 08 **AE** *P1 P2* SUM|8|三区段主机布撤防|*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防,1撤防| |EB CB 3F 08 **AE** *P1 P2* SUM|8|三区段主机布撤防|*P1*:0主机,1区段1,2区段2,3区段3;*P2*:0布防,1撤防|
|EB CB 3F 06 **B0** AB|6|索要三区段主机状态|| |EB CB 3F 06 **B0** AB|6|索要三区段主机状态||
## 主机回应 ## 主机回应
|数据|长度|含义|说明| |数据|长度|含义|说明|
|---|----|----|----| |---|----|----|----|
|EB BA 3F 07 *P0* **A0** *P1 P2 P3* SUM|10|主机状态回应|*P0*:语音;*P1*:0布防,1半布防,2撤防,3设置;*P2:主机类型| |EB BA 3F 07 *P0* **A0** *P1 P2* SUM|8|主机状态回应|*P0*:语音;*P1*:主机状态;*P2*:主机类型|
|EB BA 3F *PN* *P0* **A2** *[Z, P]x(N-8)/2 P1* SUM|变长|主机防区数据回应|*PN*:表示本条数据内包含多少个字节,最大20x2+8=48个字节,防区/属性字节对的数量最大为20;<br/> *P0*:语音;Z:防区号;P:防区属性;*P1*:FF表示没有更多数据了,其他表示还有更多数据| |EB BA 3F *PN* *P0* **A2** *[Z, P]x(N-8)/2 P1* SUM|变长|主机防区数据回应|*PN*:表示本条数据内包含多少个字节,最大20x2+8=48个字节,防区/属性字节对的数量最大为20;<br/> *P0*:语音;Z:防区号;P:防区属性;*P1*:FF表示没有更多数据了,其他表示还有更多数据|
|EB BA 3F 07 *P0* **A3** SUM|7|学码开始回应|*P0*:语音。因为学码时主机要等待外部无线信号(用户触发探测器),<br/> 因此先回应A3表示已经开始学码,学码成功时再回 A4| |EB BA 3F 07 *P0* **A3** SUM|7|学码开始回应|*P0*:语音。因为学码时主机要等待外部无线信号(用户触发探测器),<br/> 因此先回应A3表示已经开始学码,学码成功时再回 A4|
|EB BA 3F 0A *P0* **A4** *P1 P2 P3* SUM|10|修改防区回应|*P0*:语音;*P1*:防区号;*P2*:防区属性;*P3*:0失败,1成功,2失败-重码,3失败-空防区| |EB BA 3F 0A *P0* **A4** *P1 P2 P3* SUM|10|修改防区回应|*P0*:语音;*P1*:防区号;*P2*:防区属性;*P3*:0失败,1成功,2失败-重码,3失败-空防区|
|EB BA 3F 0F *P0* **A6** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|14|定时器回应|*P0*:语音;第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*| |EB BA 3F 0F *P0* **A6** *H1 M1 H2 M2 H3 M3 H4 M4* SUM|14|定时器回应|*P0*:语音;第一组定时布防:*H1:M1*, 定时撤防:*H2:M2*<br/> 第二组定时布防:*H3:M3*,定时撤防:*H4:M4*|
|EB BA 3F 07 *P0* **A7** SUM|7|修改定时器回应|*P0*:语音| |EB BA 3F 07 *P0* **A7** SUM|7|修改定时器回应|*P0*:语音|
|EB BA 3F 07 *P0* **A9** SUM|7|测试地址回应、激活|*P0*:语音| |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 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 *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 08 *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 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|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令| |EB BA 3F 07 *P0* **A8** SUM|7|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令|
...@@ -24,32 +24,32 @@ const char* print_bool(bool b) { ...@@ -24,32 +24,32 @@ const char* print_bool(bool b) {
return b ? "√" : " "; // "×"; return b ? "√" : " "; // "×";
} }
AdemcoEvent statusEvents[] = { ademco_event_t statusEvents[] = {
#define XX(name, code, zh) EVENT_##name, #define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX) ADEMCO_STATUS_EVENTS_MAP(XX)
#undef XX #undef XX
}; };
AdemcoEvent alarmEvents[] = { ademco_event_t alarmEvents[] = {
#define XX(name, code, zh) EVENT_##name, #define XX(name, code, zh) EVENT_##name,
ADEMCO_ALARM_EVENTS_MAP(XX) ADEMCO_ALARM_EVENTS_MAP(XX)
#undef XX #undef XX
}; };
AdemcoEvent excepEvents[] = { ademco_event_t excepEvents[] = {
#define XX(name, code, zh) EVENT_##name, #define XX(name, code, zh) EVENT_##name,
ADEMCO_EXEPTION_EVENTS_MAP(XX) ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX) ADEMCO_RESUME_EVENTS_MAP(XX)
#undef XX #undef XX
}; };
AdemcoEvent privateEvents[] = { ademco_event_t privateEvents[] = {
#define XX(name, code, zh) EVENT_##name, #define XX(name, code, zh) EVENT_##name,
ADEMCO_HB_EVENTS_MAP(XX) ADEMCO_HB_EVENTS_MAP(XX)
#undef XX #undef XX
}; };
AdemcoEvent allEvents[] = { ademco_event_t allEvents[] = {
#define XX(name, code, zh) EVENT_##name, #define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX) ADEMCO_STATUS_EVENTS_MAP(XX)
ADEMCO_ALARM_EVENTS_MAP(XX) ADEMCO_ALARM_EVENTS_MAP(XX)
...@@ -59,26 +59,26 @@ AdemcoEvent allEvents[] = { ...@@ -59,26 +59,26 @@ AdemcoEvent allEvents[] = {
#undef XX #undef XX
}; };
HbZoneProperty allZoneProperties[] = { hb_zone_property_t allZoneProperties[] = {
#define XX(name, value, str) HZP_##name, #define XX(name, value, str) HZP_##name,
HB_ZONE_PROPERTY_MAP(XX) HB_ZONE_PROPERTY_MAP(XX)
#undef XX #undef XX
}; };
void printEvents(const AdemcoEvent* events, size_t len) void printEvents(const ademco_event_t* events, size_t len)
{ {
printf("|事件码|含义|en|\n|-----|----|--|\n"); printf("|事件码|含义|en|\n|-----|----|--|\n");
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
auto e = events[i]; auto e = events[i];
printf("|%04d|%s|%s|\n", e, printf("|%04d|%s|%s|\n", e,
ademcoEventToStringChinese(e), ademco_event_to_string_chinese(e),
ademcoEventToString(e)); ademco_event_to_string(e));
} }
printf("\n"); printf("\n");
} }
const char* get_core_author(HbMachineType t) const char* get_core_author(hb_machine_type_t t)
{ {
switch (t) { switch (t) {
case HMT_WIFI: case HMT_WIFI:
...@@ -100,7 +100,7 @@ const char* get_core_author(HbMachineType t) ...@@ -100,7 +100,7 @@ const char* get_core_author(HbMachineType t)
return ""; return "";
} }
const char* get_net_author(HbMachineType t) const char* get_net_author(hb_machine_type_t t)
{ {
switch (t) { switch (t) {
case HMT_WIFI: case HMT_WIFI:
...@@ -120,7 +120,7 @@ const char* get_net_author(HbMachineType t) ...@@ -120,7 +120,7 @@ const char* get_net_author(HbMachineType t)
return ""; return "";
} }
std::vector<std::string> get_machine_brands(HbMachineType t) std::vector<std::string> get_machine_brands(hb_machine_type_t t)
{ {
switch (t) { switch (t) {
case HMT_WIFI: case HMT_WIFI:
...@@ -152,7 +152,7 @@ std::string brand_to_path(const std::string& brand) ...@@ -152,7 +152,7 @@ std::string brand_to_path(const std::string& brand)
return {}; return {};
} }
void print_machine_brands(HbMachineType t) void print_machine_brands(hb_machine_type_t t)
{ {
printf("|<ul>"); printf("|<ul>");
for (auto brand : get_machine_brands(t)) { for (auto brand : get_machine_brands(t)) {
...@@ -175,24 +175,24 @@ void print_machineTypes() ...@@ -175,24 +175,24 @@ void print_machineTypes()
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|\n"); "|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|\n");
for (auto e : allEvents) { for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) { if (ademco_is_machine_type_event(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e); auto t = hb_machine_type_from_ademco_event(e);
if(!hbMachineIsSelling(t)) continue; if(!hb_is_machine_on_sale(t)) continue;
printf("|%04d %s", (int)e, ademcoEventToStringChinese(e)); printf("|%04d %s", (int)e, ademco_event_to_string_chinese(e));
printf("|%s", hbMachineTypeToStringChinese(t)); printf("|%s", hb_machine_type_to_string_chinese(t));
printf("|%s", print_bool(hbMachineCanArm(t))); printf("|%s", print_bool(hb_machine_can_arm(t)));
printf("|%s", print_bool(hbMachineCanDisarm(t))); printf("|%s", print_bool(hb_machine_can_disarm(t)));
printf("|%s", print_bool(hbMachineCanHalfArm(t))); printf("|%s", print_bool(hb_machine_can_half_arm(t)));
printf("|%s", print_bool(hbMachineCanEnterSettings(t))); printf("|%s", print_bool(hb_machine_can_config(t)));
printf("|%s", print_bool(hbMachineCanReportSignalStrength(t))); printf("|%s", print_bool(hb_machine_can_report_signal_strength(t)));
printf("|1~%d", hbZoneMax(t)); printf("|1~%d", hb_get_max_zone_by_type(t));
if (hbMachineHasWiredZone(t)) { if (hb_machine_has_wired_zones(t)) {
printf("|%d~%d", hbWiredZoneMin(t), hbWiredZoneMax(t)); printf("|%d~%d", hb_wired_zone_min(t), hb_wired_zone_max(t));
} else { } else {
printf("| "); printf("| ");
} }
printf("|%s", print_bool(hbMachineCanReportBySMS(t))); printf("|%s", print_bool(hb_machine_can_report_by_sms(t)));
printf("|%s", get_core_author(t)); printf("|%s", get_core_author(t));
printf("|%s", get_net_author(t)); printf("|%s", get_net_author(t));
print_machine_brands(t); print_machine_brands(t);
...@@ -211,9 +211,9 @@ void print_imgs() ...@@ -211,9 +211,9 @@ void print_imgs()
std::map<std::string, std::string> imgs; std::map<std::string, std::string> imgs;
for (auto e : allEvents) { for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) { if (ademco_is_machine_type_event(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e); auto t = hb_machine_type_from_ademco_event(e);
if (!hbMachineIsSelling(t)) continue; if (!hb_is_machine_on_sale(t)) continue;
for (auto brand : get_machine_brands(t)) { for (auto brand : get_machine_brands(t)) {
auto path = brand_to_path(brand); auto path = brand_to_path(brand);
...@@ -230,7 +230,7 @@ void print_imgs() ...@@ -230,7 +230,7 @@ void print_imgs()
printf("\n\n"); printf("\n\n");
} }
bool zprop_is_contain(HbZoneProperty* props, int count, HbZoneProperty prop) { bool zprop_is_contain(hb_zone_property_t* props, int count, hb_zone_property_t prop) {
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
if (props[i] == prop)return true; if (props[i] == prop)return true;
} }
...@@ -244,8 +244,8 @@ void print_available_zone_props() ...@@ -244,8 +244,8 @@ void print_available_zone_props()
//auto all_props = getAvailableZoneProperties(); //auto all_props = getAvailableZoneProperties();
auto print_prop = [](HbZoneProperty zp) { auto print_prop = [](hb_zone_property_t zp) {
printf("%02X %s", zp, hbZonePropertyToStringChinese(zp)); printf("%02X %s", zp, hb_zone_property_to_string_chinese(zp));
}; };
...@@ -266,7 +266,7 @@ void print_available_zone_props() ...@@ -266,7 +266,7 @@ void print_available_zone_props()
printf("|失联支持"); printf("|失联支持");
for (auto zp : allZoneProperties) { for (auto zp : allZoneProperties) {
printf("|%s", print_bool(hbZonePropCanReportLost(zp))); printf("|%s", print_bool(hb_zone_can_report_lost(zp)));
} }
printf("|\n\n"); printf("|\n\n");
...@@ -286,14 +286,14 @@ void print_available_zone_props() ...@@ -286,14 +286,14 @@ void print_available_zone_props()
printf("|\n"); printf("|\n");
for (auto e : allEvents) { for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) { if (ademco_is_machine_type_event(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e); auto t = hb_machine_type_from_ademco_event(e);
if (!hbMachineIsSelling(t)) continue; if (!hb_is_machine_on_sale(t)) continue;
printf("|%04d", (int)e); printf("|%04d", (int)e);
printf("|%d", (int)t); printf("|%d", (int)t);
print_machine_brands(t); print_machine_brands(t);
HbZoneProperty avail_props[12]; hb_zone_property_t avail_props[HZP_COUNT];
int count = hbGetAvailableZoneProperties(t, avail_props); int count = hb_get_available_zone_properties_by_type(t, avail_props);
for (auto zp : allZoneProperties) { for (auto zp : allZoneProperties) {
printf("|%s", print_bool(zprop_is_contain(avail_props, count, zp))); printf("|%s", print_bool(zprop_is_contain(avail_props, count, zp)));
} }
...@@ -367,7 +367,7 @@ void print_g250_alarm_codes() ...@@ -367,7 +367,7 @@ void print_g250_alarm_codes()
//}; //};
//for (auto code : codes) { //for (auto code : codes) {
// printf("|%02X|%04d|%s|\n", code, ademcoEventFromCode(code), jlib::win32::utf16_to_mbcs(ademcoEventToStringChinese(ademcoEventFromCode(code), false)).c_str()); // printf("|%02X|%04d|%s|\n", code, ademcoEventFromCode(code), jlib::win32::utf16_to_mbcs(ademco_event_to_string_chinese(ademcoEventFromCode(code), false)).c_str());
//} //}
} }
......
...@@ -6,6 +6,7 @@ CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) ...@@ -6,6 +6,7 @@ CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd ${CURRENT_DIR} cd ${CURRENT_DIR}
mkdir -p ./uvlib mkdir -p ./uvlib
cp -r /g/dev_libs/ademco/uvlib/llhttp ./uvlib/ repo=/h/dev_hb/libhb
cp /g/dev_libs/ademco/uvlib/*.h ./uvlib/ cp -r ${repo}/uvlib/llhttp ./uvlib/
cp /g/dev_libs/ademco/uvlib/*.c ./uvlib/ cp ${repo}/uvlib/*.h ./uvlib/
\ No newline at end of file cp ${repo}/uvlib/*.c ./uvlib/
\ No newline at end of file
...@@ -8,9 +8,9 @@ ...@@ -8,9 +8,9 @@
typedef struct machine_info_s { typedef struct machine_info_s {
char acct[ADEMCO_PACKET_ACCT_MAX_LEN + 1]; char acct[ADEMCO_PACKET_ACCT_MAX_LEN + 1];
AdemcoId ademcoId; ademco_id_t ademco_id;
HbMachineType type; hb_machine_type_t type;
HbMachineStatus status; hb_machine_status_t status;
}machine_info_t; }machine_info_t;
struct { struct {
...@@ -81,7 +81,7 @@ int post(const char* json) { ...@@ -81,7 +81,7 @@ int post(const char* json) {
return 0; return 0;
} }
int relay(const char* acct, AdemcoEvent ademco_event, AdemcoZone zone, AdemcoGG gg) { int relay(const char* acct, ademco_event_t ademco_event, ademco_zone_t zone, ademco_gg_t gg) {
cJSON* json = NULL; cJSON* json = NULL;
char* string = NULL; char* string = NULL;
int r = 0; int r = 0;
...@@ -110,7 +110,7 @@ void on_tcp_connection(uv_tcpserver_client_context_t* client, int connected) { ...@@ -110,7 +110,7 @@ void on_tcp_connection(uv_tcpserver_client_context_t* client, int connected) {
if (connected) { if (connected) {
machine_info_t* machine = malloc(sizeof(machine_info_t)); machine_info_t* machine = malloc(sizeof(machine_info_t));
memset(machine->acct, '\0', sizeof(machine->acct)); memset(machine->acct, '\0', sizeof(machine->acct));
machine->ademcoId = 0; machine->ademco_id = 0;
machine->type = HMT_INVALID; machine->type = HMT_INVALID;
machine->status = HMS_INVALID; machine->status = HMS_INVALID;
client->data = machine; client->data = machine;
...@@ -123,51 +123,51 @@ void on_tcp_connection(uv_tcpserver_client_context_t* client, int connected) { ...@@ -123,51 +123,51 @@ void on_tcp_connection(uv_tcpserver_client_context_t* client, int connected) {
} }
uv_tcp_parse_result_t on_tcp_parse(uv_tcpserver_client_context_t* client, const char* buf, size_t len, size_t* ate) { uv_tcp_parse_result_t on_tcp_parse(uv_tcpserver_client_context_t* client, const char* buf, size_t len, size_t* ate) {
AdemcoPacket pkt; ademco_packet_t pkt;
AdemcoParseResult res = ademcoPacketParse(buf, len, &pkt, ate, NULL); ademco_parse_result_t res = ademco_parse_packet(buf, len, &pkt, ate, NULL);
switch (res) { switch (res) {
case RESULT_OK: case ADEMCO_PARSE_RESULT_OK:
switch (pkt.id) { switch (pkt.id) {
case AID_NULL: case AID_NULL:
case AID_HB: case AID_HB:
case AID_ADM_CID: case AID_ADM_CID:
printf("C:"); printf("C:");
ademcoPrint(pkt.raw, pkt.raw_len); ademco_print(pkt.raw, pkt.raw_len);
if (((machine_info_t*)(client->data))->acct[0] == '\0') { if (((machine_info_t*)(client->data))->acct[0] == '\0') {
strcpy(((machine_info_t*)(client->data))->acct, pkt.acct); strcpy(((machine_info_t*)(client->data))->acct, pkt.acct);
relay(pkt.acct, EVENT_ONLINE, 0, 0); relay(pkt.acct, EVENT_ONLINE, 0, 0);
} }
if (pkt.data.ademcoId) { if (pkt.data.ademco_id) {
((machine_info_t*)(client->data))->ademcoId = pkt.data.ademcoId; ((machine_info_t*)(client->data))->ademco_id = pkt.data.ademco_id;
} }
if (ademcoIsMachineStatusEvent(pkt.data.ademcoEvent)) { if (ademco_is_machine_status_event(pkt.data.ademco_event)) {
((machine_info_t*)(client->data))->status = hbMachineStatusFromAdemcoEvent(pkt.data.ademcoEvent); ((machine_info_t*)(client->data))->status = hb_machine_status_from_ademco_event(pkt.data.ademco_event);
} }
if (ademcoIsMachineTypeEvent(pkt.data.ademcoEvent)) { if (ademco_is_machine_type_event(pkt.data.ademco_event)) {
((machine_info_t*)(client->data))->type = hbMachineTypeFromAdemcoEvent(pkt.data.ademcoEvent); ((machine_info_t*)(client->data))->type = hb_machine_type_from_ademco_event(pkt.data.ademco_event);
} }
if (pkt.data.ademcoEvent != EVENT_INVALID_EVENT && ((machine_info_t*)(client->data))->acct[0] != '\0') { if (pkt.data.ademco_event != EVENT_INVALID_EVENT && ((machine_info_t*)(client->data))->acct[0] != '\0') {
relay(((machine_info_t*)(client->data))->acct, pkt.data.ademcoEvent, pkt.data.zone, pkt.data.gg); relay(((machine_info_t*)(client->data))->acct, pkt.data.ademco_event, pkt.data.zone, pkt.data.gg);
} }
ademcoMakeAckPacket2(&pkt, pkt.seq, pkt.acct, pkt.data.ademcoId); ademco_make_ack_packet2(&pkt, pkt.seq, pkt.acct, pkt.data.ademco_id);
uv_tcpserver_send_to_cli(client, pkt.raw, pkt.raw_len); uv_tcpserver_send_to_cli(client, pkt.raw, pkt.raw_len);
printf("S:"); printf("S:");
ademcoPrint(pkt.raw, pkt.raw_len); ademco_print(pkt.raw, pkt.raw_len);
break; break;
} }
return uv_tcp_parse_ok; return uv_tcp_parse_ok;
break; break;
case RESULT_NOT_ENOUGH: case ADEMCO_PARSE_RESULT_NOT_ENOUGH:
return uv_tcp_parse_not_enough; return uv_tcp_parse_not_enough;
break; break;
case RESULT_ERROR: case ADEMCO_PARSE_RESULT_ERROR:
return uv_tcp_parse_error; return uv_tcp_parse_error;
break; break;
default: default:
......
...@@ -90,6 +90,7 @@ ...@@ -90,6 +90,7 @@
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
...@@ -106,6 +107,7 @@ ...@@ -106,6 +107,7 @@
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
...@@ -122,6 +124,7 @@ ...@@ -122,6 +124,7 @@
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
...@@ -138,6 +141,7 @@ ...@@ -138,6 +141,7 @@
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
......
// dllmain.c : Defines the entry point for the DLL application.
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
(void)hModule;
(void)lpReserved;
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#endif
...@@ -59,16 +59,27 @@ void mybuf_append(mybuf_t* buf, const char* data, size_t len) { ...@@ -59,16 +59,27 @@ void mybuf_append(mybuf_t* buf, const char* data, size_t len) {
} }
void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len, void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len,
int show_header, int show_address, int show_ascii, char def_ascii) { int show_header, int show_address, int show_ascii, char def_ascii,
const char* newline) {
size_t addr = 0; size_t addr = 0;
if (!newline) {
newline = "\n";
}
if (show_header) { if (show_header) {
if (show_address) if (show_address)
mybuf_cat_printf(buf, "addr "); mybuf_cat_printf(buf, "ADDR | ");
mybuf_cat_printf(buf, "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E OF"); mybuf_cat_printf(buf, "00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E OF");
if (show_ascii) { if (show_ascii)
mybuf_cat_printf(buf, " 0123456789ABCDEF"); mybuf_cat_printf(buf, " | 0123456789ABCDEF");
} mybuf_cat_printf(buf, "%s", newline);
mybuf_cat_printf(buf, "\n");
if (show_address)
mybuf_cat_printf(buf, "-----+------------------------------------------------");
else
mybuf_cat_printf(buf, "---------------------------------------------------");
if (show_ascii)
mybuf_cat_printf(buf, "-+-----------------");
mybuf_cat_printf(buf, "%s", newline);
} }
if (def_ascii < 32 || def_ascii > 126) { if (def_ascii < 32 || def_ascii > 126) {
def_ascii = '.'; // default ascii def_ascii = '.'; // default ascii
...@@ -76,7 +87,7 @@ void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len, ...@@ -76,7 +87,7 @@ void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len,
for (size_t i = 0; i < len; i++) { for (size_t i = 0; i < len; i++) {
if (show_address) { if (show_address) {
if (i % 16 == 0) { if (i % 16 == 0) {
mybuf_cat_printf(buf, "%04zX ", addr); mybuf_cat_printf(buf, "%04zX | ", addr);
addr += 16; addr += 16;
} }
} }
...@@ -96,9 +107,9 @@ void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len, ...@@ -96,9 +107,9 @@ void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len,
mybuf_cat_printf(buf, "%c", def_ascii); mybuf_cat_printf(buf, "%c", def_ascii);
} }
} }
mybuf_cat_printf(buf, "\n"); mybuf_cat_printf(buf, "%s", newline);
} else { } else {
mybuf_cat_printf(buf, "\n"); mybuf_cat_printf(buf, "%s", newline);
} }
} }
} }
...@@ -149,3 +160,25 @@ void mybuf_clear_append(mybuf_t* buf, const char* data, size_t len) { ...@@ -149,3 +160,25 @@ void mybuf_clear_append(mybuf_t* buf, const char* data, size_t len) {
mybuf_append(buf, tmp.buf, tmp.size); mybuf_append(buf, tmp.buf, tmp.size);
mybuf_clear(&tmp); mybuf_clear(&tmp);
} }
char* mybuf_to_string(mybuf_t* buf) {
size_t len = buf->size;
if (len == 0) {
char* str = (char*)malloc(1);
fatal_if_null(str);
str[0] = '\0';
return str;
}
if (buf->buf[len - 1] == '\0') {
len--;
}
char* str = (char*)malloc(len + 1);
fatal_if_null(str);
memcpy(str, buf->buf, len);
str[len] = '\0';
return str;
}
void mybuf_free(char* str) {
free(str);
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#pragma once #pragma once
#include "uvlib_config.h"
#include <stddef.h> // size_t #include <stddef.h> // size_t
#ifdef __cplusplus #ifdef __cplusplus
...@@ -23,31 +24,37 @@ typedef struct { ...@@ -23,31 +24,37 @@ typedef struct {
size_t size, capacity; size_t size, capacity;
} mybuf_t; } mybuf_t;
void mybuf_init(mybuf_t* buf); UVLIB_EXPORT_SYMBOL void mybuf_init(mybuf_t* buf);
size_t mybuf_space(mybuf_t* buf); UVLIB_EXPORT_SYMBOL size_t mybuf_space(mybuf_t* buf);
void mybuf_reserve(mybuf_t* buf, size_t size); UVLIB_EXPORT_SYMBOL void mybuf_reserve(mybuf_t* buf, size_t size);
void mybuf_append(mybuf_t* buf, const char* data, size_t len); UVLIB_EXPORT_SYMBOL void mybuf_append(mybuf_t* buf, const char* data, size_t len);
/* /*
* append hex dump to mybuf * append hex dump to mybuf
* show_header: show 00~0F address header, default is 0 * show_header: show 00~0F address header, default is 0
* show_address: show 0000~FFFF address on left * show_address: show 0000~FFFF address on left
* show_ascii: show ascii on right if can print, default is 0 * show_ascii: show ascii on right if can print, default is 0
* def_ascii: when show_ascii but can't print, show def_ascii instead, default is '?' * def_ascii: when show_ascii but can't print, show def_ascii instead, default is '.'
* newline: default is "\n"
*/ */
void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len, UVLIB_EXPORT_SYMBOL void mybuf_append_hexdump(mybuf_t* buf, const char* data, size_t len,
int show_header, int show_address, int show_ascii, char def_ascii); int show_header, int show_address, int show_ascii, char def_ascii,
const char* newline);
#ifdef __GNUC__ #ifdef __GNUC__
void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...) UVLIB_EXPORT_SYMBOL void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...)
__attribute__((format(printf, 2, 3))); __attribute__((format(printf, 2, 3)));
#else #else
void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...); UVLIB_EXPORT_SYMBOL void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...);
#endif #endif
void mybuf_clear(mybuf_t* buf); UVLIB_EXPORT_SYMBOL void mybuf_clear(mybuf_t* buf);
// safe to call me when data in buf // safe to call me when data in buf
void mybuf_clear_append(mybuf_t* buf, const char* data, size_t len); UVLIB_EXPORT_SYMBOL void mybuf_clear_append(mybuf_t* buf, const char* data, size_t len);
// call mybuf_free to free string
UVLIB_EXPORT_SYMBOL char* mybuf_to_string(mybuf_t* buf);
UVLIB_EXPORT_SYMBOL void mybuf_free(char* str);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -40,16 +40,16 @@ typedef struct uv_httpc_response_s { ...@@ -40,16 +40,16 @@ typedef struct uv_httpc_response_s {
typedef void (*uv_httpc_on_response_t)(uv_httpc_t* httpc, uv_httpc_response_t* res); typedef void (*uv_httpc_on_response_t)(uv_httpc_t* httpc, uv_httpc_response_t* res);
int uv_httpc_create(uv_httpc_t** httpc, uv_loop_t* loop, const char* host, const char* port, UVLIB_EXPORT_SYMBOL int uv_httpc_create(uv_httpc_t** httpc, uv_loop_t* loop, const char* host, const char* port,
uv_httpc_on_response_t on_response); uv_httpc_on_response_t on_response);
int uv_httpc_post(uv_httpc_t* httpc, const char* url, uv_httpc_headers_t* headers, UVLIB_EXPORT_SYMBOL int uv_httpc_post(uv_httpc_t* httpc, const char* url, uv_httpc_headers_t* headers,
const char* data, size_t len, int timeout); const char* data, size_t len, int timeout);
int uv_httpc_stop(uv_httpc_t* httpc); UVLIB_EXPORT_SYMBOL int uv_httpc_stop(uv_httpc_t* httpc);
void uv_httpc_free(uv_httpc_t* httpc); UVLIB_EXPORT_SYMBOL void uv_httpc_free(uv_httpc_t* httpc);
uv_httpc_headers_t* uv_httpc_headers_append(uv_httpc_headers_t* headers, char* data); UVLIB_EXPORT_SYMBOL uv_httpc_headers_t* uv_httpc_headers_append(uv_httpc_headers_t* headers, char* data);
uv_httpc_headers_t* uv_httpc_headers_append_nodup(uv_httpc_headers_t* headers, char* data); UVLIB_EXPORT_SYMBOL uv_httpc_headers_t* uv_httpc_headers_append_nodup(uv_httpc_headers_t* headers, char* data);
uv_httpc_headers_t* uv_httpc_headers_dup(uv_httpc_headers_t* headers); UVLIB_EXPORT_SYMBOL uv_httpc_headers_t* uv_httpc_headers_dup(uv_httpc_headers_t* headers);
void uv_httpc_headers_free_all(uv_httpc_headers_t* headers, int freedata); UVLIB_EXPORT_SYMBOL void uv_httpc_headers_free_all(uv_httpc_headers_t* headers, int freedata);
#ifdef WEUV_TEST #ifdef WEUV_TEST
int uv_httpc_test_main(int argc, char** argv); int uv_httpc_test_main(int argc, char** argv);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#pragma once #pragma once
#include "uvlib_config.h"
#include <uv.h> #include <uv.h>
#include "llhttp/include/llhttp.h" #include "llhttp/include/llhttp.h"
...@@ -41,24 +42,24 @@ typedef struct uv_httpd_server_s uv_httpd_server_t; ...@@ -41,24 +42,24 @@ typedef struct uv_httpd_server_s uv_httpd_server_t;
typedef void(*on_request_t)(uv_httpd_server_t* server, uv_httpd_client_t* client, uv_httpd_request_t* req); typedef void(*on_request_t)(uv_httpd_server_t* server, uv_httpd_client_t* client, uv_httpd_request_t* req);
void nprintf(const char* msg, size_t len, int newline); UVLIB_EXPORT_SYMBOL void nprintf(const char* msg, size_t len, int newline);
int string_ncmp(const char* s1, size_t len1, const char* s2, size_t len2); UVLIB_EXPORT_SYMBOL int string_ncmp(const char* s1, size_t len1, const char* s2, size_t len2);
int string0_ncmp(const char* s1, const char* s2, size_t len2); UVLIB_EXPORT_SYMBOL int string0_ncmp(const char* s1, const char* s2, size_t len2);
int string_nicmp(const char* s1, size_t len1, const char* s2, size_t len2); UVLIB_EXPORT_SYMBOL int string_nicmp(const char* s1, size_t len1, const char* s2, size_t len2);
int string0_nicmp(const char* s1, const char* s2, size_t len2); UVLIB_EXPORT_SYMBOL int string0_nicmp(const char* s1, const char* s2, size_t len2);
// enable `printf`s, default is disabled // enable `printf`s, default is disabled
void uv_httpd_enable_printf(int enable); UVLIB_EXPORT_SYMBOL void uv_httpd_enable_printf(int enable);
// return 0 for success, otherwise it is `uv_errno_t` // return 0 for success, otherwise it is `uv_errno_t`
// if your want to use a existing `uv_loop_t`, pass it by `loop` // if your want to use a existing `uv_loop_t`, pass it by `loop`
// otherwise a new `uv_loop_t` will be created. // otherwise a new `uv_loop_t` will be created.
int uv_httpd_create(uv_httpd_server_t** server, uv_loop_t* loop, on_request_t on_request); UVLIB_EXPORT_SYMBOL int uv_httpd_create(uv_httpd_server_t** server, uv_loop_t* loop, on_request_t on_request);
void uv_httpd_stop(uv_httpd_server_t* server); UVLIB_EXPORT_SYMBOL void uv_httpd_stop(uv_httpd_server_t* server);
void uv_httpd_free(uv_httpd_server_t* server); UVLIB_EXPORT_SYMBOL void uv_httpd_free(uv_httpd_server_t* server);
// return 0 for success, otherwise it is uv_errno_t // return 0 for success, otherwise it is uv_errno_t
int uv_httpd_listen(uv_httpd_server_t* server, const char* ip, int port); UVLIB_EXPORT_SYMBOL int uv_httpd_listen(uv_httpd_server_t* server, const char* ip, int port);
// return 0 for success, otherwise it is uv_errno_t // return 0 for success, otherwise it is uv_errno_t
int uv_httpd_write_response(uv_httpd_client_t* client, char* response, size_t len); UVLIB_EXPORT_SYMBOL int uv_httpd_write_response(uv_httpd_client_t* client, char* response, size_t len);
struct uv_httpd_server_s { struct uv_httpd_server_s {
......
...@@ -73,12 +73,13 @@ void uv_log_raw(uv_log_level_t level, const char* msg) { ...@@ -73,12 +73,13 @@ void uv_log_raw(uv_log_level_t level, const char* msg) {
} }
void uv_log_hexdump(uv_log_level_t level, const char* buf, size_t len, void uv_log_hexdump(uv_log_level_t level, const char* buf, size_t len,
int show_header, int show_address, int show_ascii, char def_ascii) { int show_header, int show_address, int show_ascii, char def_ascii,
const char* newline) {
mybuf_t mybuf; mybuf_t mybuf;
if (level < g_level || level > uv_log_level_fatal) return; if (level < g_level || level > uv_log_level_fatal) return;
mybuf_init(&mybuf); mybuf_init(&mybuf);
mybuf_cat_printf(&mybuf, "hex dump of %p, len=%zu\n", buf, len); mybuf_cat_printf(&mybuf, "hex dump of %p, len=%zu\n", buf, len);
mybuf_append_hexdump(&mybuf, buf, len, show_header, show_address, show_ascii, def_ascii); mybuf_append_hexdump(&mybuf, buf, len, show_header, show_address, show_ascii, def_ascii, newline);
uv_log_raw(level, mybuf.buf); uv_log_raw(level, mybuf.buf);
mybuf_clear(&mybuf); mybuf_clear(&mybuf);
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#pragma once #pragma once
#include "uvlib_config.h"
#include <stdlib.h> #include <stdlib.h>
#ifdef __cplusplus #ifdef __cplusplus
...@@ -28,23 +29,25 @@ typedef enum { ...@@ -28,23 +29,25 @@ typedef enum {
uv_log_level_invalid = 1 << 11, uv_log_level_invalid = 1 << 11,
} uv_log_level_t; } uv_log_level_t;
uv_log_level_t uv_log_level_from_string(const char* str); UVLIB_EXPORT_SYMBOL uv_log_level_t uv_log_level_from_string(const char* str);
const char* uv_log_level_to_string(uv_log_level_t level); UVLIB_EXPORT_SYMBOL const char* uv_log_level_to_string(uv_log_level_t level);
void uv_log_set_level(uv_log_level_t level); UVLIB_EXPORT_SYMBOL void uv_log_set_level(uv_log_level_t level);
void uv_log_set_log_file(const char* file); UVLIB_EXPORT_SYMBOL void uv_log_set_log_file(const char* file);
uv_log_level_t uv_log_get_level(); UVLIB_EXPORT_SYMBOL uv_log_level_t uv_log_get_level();
void uv_log(uv_log_level_t level, const char* fmt, ...); UVLIB_EXPORT_SYMBOL void uv_log(uv_log_level_t level, const char* fmt, ...);
void uv_log_raw(uv_log_level_t level, const char* msg); UVLIB_EXPORT_SYMBOL void uv_log_raw(uv_log_level_t level, const char* msg);
/** /**
* log hex dump * log hex dump
* show_header: show 00~0F address header, default is 0 * show_header: show 00~0F address header, default is 0
* show_address: show 0000~FFFF address on left * show_address: show 0000~FFFF address on left
* show_ascii: show ascii on right if can print, default is 0 * show_ascii: show ascii on right if can print, default is 0
* def_ascii: when show_ascii but can't print, show def_ascii instead, default is '?' * def_ascii: when show_ascii but can't print, show def_ascii instead, default is '.'
* newline: default is "\n"
*/ */
void uv_log_hexdump(uv_log_level_t level, const char* buf, size_t len, UVLIB_EXPORT_SYMBOL void uv_log_hexdump(uv_log_level_t level, const char* buf, size_t len,
int show_header, int show_address, int show_ascii, char def_ascii); int show_header, int show_address, int show_ascii, char def_ascii,
const char* newline);
#define uvlog_all(...) uv_log(uv_log_level_all, __VA_ARGS__) #define uvlog_all(...) uv_log(uv_log_level_all, __VA_ARGS__)
#define uvlog_verbose(...) uv_log(uv_log_level_verbose, __VA_ARGS__) #define uvlog_verbose(...) uv_log(uv_log_level_verbose, __VA_ARGS__)
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#pragma once #pragma once
#include <uv.h> #include <uv.h>
#include "uvlib_config.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
...@@ -15,7 +16,7 @@ typedef enum { ...@@ -15,7 +16,7 @@ typedef enum {
uv_tcp_parse_error, uv_tcp_parse_error,
} uv_tcp_parse_result_t; } uv_tcp_parse_result_t;
int getpeeraddr(uv_tcp_t* tcp, char* ip, size_t len, uint16_t* port); UVLIB_EXPORT_SYMBOL int getpeeraddr(uv_tcp_t* tcp, char* ip, size_t len, uint16_t* port);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -90,7 +90,7 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ...@@ -90,7 +90,7 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
if (cli->settings->on_parse) { if (cli->settings->on_parse) {
cli->buf.size += nread; cli->buf.size += nread;
size_t cb, total = cli->buf.size; size_t cb = 0, total = cli->buf.size;
const char* p = cli->buf.buf; const char* p = cli->buf.buf;
uv_tcp_parse_result_t r = cli->settings->on_parse(cli, p, total, &cb); uv_tcp_parse_result_t r = cli->settings->on_parse(cli, p, total, &cb);
while (r == uv_tcp_parse_ok && total > 0) { while (r == uv_tcp_parse_ok && total > 0) {
...@@ -100,14 +100,12 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ...@@ -100,14 +100,12 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
r = cli->settings->on_parse(cli, p, total, &cb); r = cli->settings->on_parse(cli, p, total, &cb);
} }
if (r == uv_tcp_parse_error) { if (r == uv_tcp_parse_error) {
mybuf_clear(&cli->buf); p += cb;
} else if (p != cli->buf.buf) { total -= cb;
}
if (p != cli->buf.buf) {
if (total > 0) { if (total > 0) {
mybuf_t buf; mybuf_clear_append(&cli->buf, p, total);
mybuf_init(&buf);
mybuf_append(&buf, p, total);
mybuf_clear(&cli->buf);
mybuf_append(&cli->buf, buf.buf, buf.size);
} else { } else {
mybuf_clear(&cli->buf); mybuf_clear(&cli->buf);
} }
......
...@@ -17,11 +17,11 @@ typedef uv_tcp_parse_result_t (*uv_tcpclient_on_parse_t)(uv_tcpclient_t* client, ...@@ -17,11 +17,11 @@ typedef uv_tcp_parse_result_t (*uv_tcpclient_on_parse_t)(uv_tcpclient_t* client,
typedef void (*uv_tcpclient_on_connect_t)(uv_tcpclient_t* client, int connected); typedef void (*uv_tcpclient_on_connect_t)(uv_tcpclient_t* client, int connected);
typedef void (*uv_tcpclient_on_closed_t)(uv_tcpclient_t* client); typedef void (*uv_tcpclient_on_closed_t)(uv_tcpclient_t* client);
int uv_tcpclient_new(uv_tcpclient_t** client, uv_loop_t* loop, uv_tcpclient_settings_t* settings); UVLIB_EXPORT_SYMBOL int uv_tcpclient_new(uv_tcpclient_t** client, uv_loop_t* loop, uv_tcpclient_settings_t* settings);
int uv_tcpclient_start(uv_tcpclient_t* client, const char* domain, const char* port); UVLIB_EXPORT_SYMBOL int uv_tcpclient_start(uv_tcpclient_t* client, const char* domain, const char* port);
void uv_tcpclient_send(uv_tcpclient_t* client, const char* buf, size_t len); UVLIB_EXPORT_SYMBOL void uv_tcpclient_send(uv_tcpclient_t* client, const char* buf, size_t len);
void uv_tcpclient_stop(uv_tcpclient_t* client); UVLIB_EXPORT_SYMBOL void uv_tcpclient_stop(uv_tcpclient_t* client);
void uv_tcpclient_free(uv_tcpclient_t* client); UVLIB_EXPORT_SYMBOL void uv_tcpclient_free(uv_tcpclient_t* client);
struct uv_tcpclient_settings_s { struct uv_tcpclient_settings_s {
uv_tcpclient_on_connect_t on_connect; uv_tcpclient_on_connect_t on_connect;
......
...@@ -39,7 +39,7 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ...@@ -39,7 +39,7 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
if (cli->server->settings->on_parse) { if (cli->server->settings->on_parse) {
cli->buf.size += nread; cli->buf.size += nread;
size_t cb, total = cli->buf.size; size_t cb = 0, total = cli->buf.size;
const char* p = cli->buf.buf; const char* p = cli->buf.buf;
uv_tcp_parse_result_t r = cli->server->settings->on_parse(cli, p, total, &cb); uv_tcp_parse_result_t r = cli->server->settings->on_parse(cli, p, total, &cb);
while (r == uv_tcp_parse_ok && total > 0) { while (r == uv_tcp_parse_ok && total > 0) {
...@@ -49,8 +49,10 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) { ...@@ -49,8 +49,10 @@ static void on_read(uv_stream_t* stream, ssize_t nread, const uv_buf_t* buf) {
r = cli->server->settings->on_parse(cli, p, total, &cb); r = cli->server->settings->on_parse(cli, p, total, &cb);
} }
if (r == uv_tcp_parse_error) { if (r == uv_tcp_parse_error) {
mybuf_clear(&cli->buf); p += cb;
} else if (p != cli->buf.buf) { total -= cb;
}
if (p != cli->buf.buf) {
if (total > 0) { if (total > 0) {
mybuf_clear_append(&cli->buf, p, total); mybuf_clear_append(&cli->buf, p, total);
} else { } else {
......
...@@ -20,14 +20,14 @@ typedef uv_tcp_parse_result_t (*uv_tcpserver_on_parse_t)(uv_tcpserver_client_con ...@@ -20,14 +20,14 @@ typedef uv_tcp_parse_result_t (*uv_tcpserver_on_parse_t)(uv_tcpserver_client_con
typedef void (*uv_tcpserver_on_server_shutdown_t)(uv_tcpserver_t* server); typedef void (*uv_tcpserver_on_server_shutdown_t)(uv_tcpserver_t* server);
typedef struct uv_tcpserver_settings_s uv_tcpserver_settings_t; typedef struct uv_tcpserver_settings_s uv_tcpserver_settings_t;
int uv_tcpserver_create(uv_tcpserver_t** server, uv_loop_t* loop, uv_tcpserver_settings_t* settings); UVLIB_EXPORT_SYMBOL int uv_tcpserver_create(uv_tcpserver_t** server, uv_loop_t* loop, uv_tcpserver_settings_t* settings);
int uv_tcpserver_start_listen(uv_tcpserver_t* server, const char* listen_addr, int listen_port); UVLIB_EXPORT_SYMBOL int uv_tcpserver_start_listen(uv_tcpserver_t* server, const char* listen_addr, int listen_port);
void uv_tcpserver_stop(uv_tcpserver_t* server); UVLIB_EXPORT_SYMBOL void uv_tcpserver_stop(uv_tcpserver_t* server);
void uv_tcpserver_free(uv_tcpserver_t* server); UVLIB_EXPORT_SYMBOL void uv_tcpserver_free(uv_tcpserver_t* server);
void uv_tcpserver_close_cli(uv_tcpserver_client_context_t* cli); UVLIB_EXPORT_SYMBOL void uv_tcpserver_close_cli(uv_tcpserver_client_context_t* cli);
// cli must be diconnected already, safe pattern is call this function in callback `on_connect` with `connected = 0` // cli must be diconnected already, safe pattern is call this function in callback `on_connect` with `connected = 0`
void uv_tcpserver_free_cli_ctx(uv_tcpserver_client_context_t* cli); UVLIB_EXPORT_SYMBOL void uv_tcpserver_free_cli_ctx(uv_tcpserver_client_context_t* cli);
int uv_tcpserver_send_to_cli(uv_tcpserver_client_context_t* cli, const char* buf, size_t len); UVLIB_EXPORT_SYMBOL int uv_tcpserver_send_to_cli(uv_tcpserver_client_context_t* cli, const char* buf, size_t len);
struct uv_tcpserver_s { struct uv_tcpserver_s {
void* data; void* data;
......
...@@ -14,27 +14,40 @@ ...@@ -14,27 +14,40 @@
#ifdef _WIN32 #ifdef _WIN32
#define UVLIB_DIR "G:/dev_libs/ademco/" #ifdef UVLIB_LOAD_DLL
#ifdef UVLIB_USE_MT #define LIB_DIR "H:/dev_hb/libhb/"
#define UVLIB_NAME "uvlib_mt.lib" #define LIB_NAME "uvlib.lib"
#else
#define UVLIB_NAME "uvlib.lib" #elif defined(UVLIB_LINK_STATIC)
#endif
#define LIB_DIR "H:/dev_hb/libhb/"
#define LIB_NAME "uvlib_s.lib"
#elif defined(UVLIB_LINK_STATIC_MT)
#define LIB_DIR "H:/dev_hb/libhb/"
#define LIB_NAME "uvlib_smt.lib"
#endif // UVLIB_LOAD_DLL
#if defined(LIB_DIR) && defined(LIB_NAME)
#ifdef _WIN64 #ifdef _WIN64
#ifdef _DEBUG #ifdef _DEBUG
#pragma comment(lib, UVLIB_DIR "x64/Debug/" UVLIB_NAME) #pragma comment(lib, LIB_DIR "x64/Debug/" LIB_NAME)
#else #else
#pragma comment(lib, UVLIB_DIR "x64/Release/" UVLIB_NAME) #pragma comment(lib, LIB_DIR "x64/Release/" LIB_NAME)
#endif #endif
#else // WIN32 #else // WIN32
#ifdef _DEBUG #ifdef _DEBUG
#pragma comment(lib, UVLIB_DIR "Debug/" UVLIB_NAME) #pragma comment(lib, LIB_DIR "Debug/" LIB_NAME)
#else #else
#pragma comment(lib, UVLIB_DIR "Release/" UVLIB_NAME) #pragma comment(lib, LIB_DIR "Release/" LIB_NAME)
#endif #endif
#endif #endif
#undef LIB_DIR
#undef LIB_NAME
#endif // defined(LIB_DIR) && defined(LIB_NAME)
#endif // _WIN32 #endif // _WIN32
......
#ifndef __UVLIB_CONFIG_H__
#define __UVLIB_CONFIG_H__
#pragma once
#ifdef UVLIB_EXPORTS
#if defined __GNUC__
#define UVLIB_EXPORT_SYMBOL __attribute__((visibility("default")))
#elif defined(_MSC_VER)
#define UVLIB_EXPORT_SYMBOL __declspec(dllexport)
#else
#define UVLIB_EXPORT_SYMBOL
#endif
#else
#define UVLIB_EXPORT_SYMBOL
#endif
#endif
#ifndef __UVLIB_VERSION_H__ #ifndef __UVLIB_VERSION_H__
#define __UVLIB_VERSION_H__ #define __UVLIB_VERSION_H__
#include "uvlib_config.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
...@@ -12,7 +14,7 @@ extern "C" { ...@@ -12,7 +14,7 @@ extern "C" {
#define UVLIB_VERSION_MAJOR 1 #define UVLIB_VERSION_MAJOR 1
#define UVLIB_VERSION_MINOR 0 #define UVLIB_VERSION_MINOR 0
#define UVLIB_VERSION_PATCH 0 #define UVLIB_VERSION_PATCH 4
#define UVLIB_VERSION_IS_RELEASE 1 #define UVLIB_VERSION_IS_RELEASE 1
#define UVLIB_VERSION_SUFFIX "" #define UVLIB_VERSION_SUFFIX ""
...@@ -20,8 +22,8 @@ extern "C" { ...@@ -20,8 +22,8 @@ extern "C" {
(UVLIB_VERSION_MINOR << 8) | \ (UVLIB_VERSION_MINOR << 8) | \
(UVLIB_VERSION_PATCH)) (UVLIB_VERSION_PATCH))
unsigned int uvlib_version(void); UVLIB_EXPORT_SYMBOL unsigned int uvlib_version(void);
const char* uvlib_version_string(void); UVLIB_EXPORT_SYMBOL const char* uvlib_version_string(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -50,10 +50,10 @@ struct Buffer { ...@@ -50,10 +50,10 @@ struct Buffer {
SOCKET clientSock = INVALID_SOCKET; SOCKET clientSock = INVALID_SOCKET;
Buffer clientBuffer = {}; Buffer clientBuffer = {};
std::string clientAcct = {}; std::string clientAcct = {};
AdemcoId clientAdemcoId = 0; ademco_id_t clientAdemcoId = 0;
std::mutex mutex = {}; std::mutex mutex = {};
std::vector<AdemcoEvent> evntsWaiting4Send = {}; std::vector<ademco_event_t> evntsWaiting4Send = {};
char pwd[1024] = {}; char pwd[1024] = {};
int setNonBlocking(SOCKET socket) { int setNonBlocking(SOCKET socket) {
...@@ -132,20 +132,20 @@ int main(int argc, char** argv) { ...@@ -132,20 +132,20 @@ int main(int argc, char** argv) {
} }
}; };
auto do_handle = []() -> AdemcoParseResult { auto do_handle = []() -> ademco_parse_result_t {
AdemcoPacket pkt; size_t cb = 0; ademco_packet_t pkt; size_t cb = 0;
AdemcoParseResult result = ademcoPacketParse(clientBuffer.buff + clientBuffer.rpos, ademco_parse_result_t result = ademco_parse_packet(clientBuffer.buff + clientBuffer.rpos,
clientBuffer.wpos - clientBuffer.rpos, clientBuffer.wpos - clientBuffer.rpos,
&pkt, &pkt,
&cb, &cb,
nullptr); nullptr);
switch (result) { switch (result) {
case AdemcoParseResult::RESULT_OK: case ademco_parse_result_t::ADEMCO_PARSE_RESULT_OK:
{ {
clientBuffer.rpos += cb; clientBuffer.rpos += cb;
//printf("id=%s\n", ap.id_.data()); //printf("id=%s\n", ap.id_.data());
printf("C:"); ademcoPrint(pkt.raw, pkt.raw_len); printf("C:"); ademco_print(pkt.raw, pkt.raw_len);
switch (pkt.id) { switch (pkt.id) {
case AID_ACK: case AID_ACK:
// success // success
...@@ -154,8 +154,8 @@ int main(int argc, char** argv) { ...@@ -154,8 +154,8 @@ int main(int argc, char** argv) {
case AID_NULL: // reply ack case AID_NULL: // reply ack
{ {
char ack[1024]; char ack[1024];
size_t len = ademcoMakeAckPacket(ack, sizeof(ack), pkt.seq, pkt.acct, 0); size_t len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademcoPrint(ack, len); printf("S:"); ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0); send(clientSock, (const char*)ack, len, 0);
break; break;
} }
...@@ -164,14 +164,14 @@ int main(int argc, char** argv) { ...@@ -164,14 +164,14 @@ int main(int argc, char** argv) {
case AID_ADM_CID: case AID_ADM_CID:
{ {
clientAcct = pkt.acct; clientAcct = pkt.acct;
clientAdemcoId = pkt.data.ademcoId; clientAdemcoId = pkt.data.ademco_id;
// handle event // handle event
// reply ack // reply ack
{ {
char ack[1024]; char ack[1024];
int len = ademcoMakeAckPacket(ack, sizeof(ack), pkt.seq, pkt.acct, 0); int len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademcoPrint(ack, len); printf("S:"); ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0); send(clientSock, (const char*)ack, len, 0);
} }
...@@ -184,11 +184,11 @@ int main(int argc, char** argv) { ...@@ -184,11 +184,11 @@ int main(int argc, char** argv) {
break; break;
} }
case AdemcoParseResult::RESULT_NOT_ENOUGH: case ademco_parse_result_t::ADEMCO_PARSE_RESULT_NOT_ENOUGH:
// do nothing // do nothing
break; break;
case AdemcoParseResult::RESULT_ERROR: case ademco_parse_result_t::ADEMCO_PARSE_RESULT_ERROR:
default: default:
// error handle, e.g. clear buff // error handle, e.g. clear buff
clientBuffer.clear(); clientBuffer.clear();
...@@ -248,7 +248,7 @@ int main(int argc, char** argv) { ...@@ -248,7 +248,7 @@ int main(int argc, char** argv) {
result = do_handle(); result = do_handle();
} }
if (result == AdemcoParseResult::RESULT_NOT_ENOUGH) { break; } if (result == ademco_parse_result_t::ADEMCO_PARSE_RESULT_NOT_ENOUGH) { break; }
} }
} }
}; };
...@@ -266,14 +266,14 @@ int main(int argc, char** argv) { ...@@ -266,14 +266,14 @@ int main(int argc, char** argv) {
char buf[1024]; char buf[1024];
for (auto e : evntsWaiting4Send) { for (auto e : evntsWaiting4Send) {
if (e == EVENT_DISARM) { if (e == EVENT_DISARM) {
AdemcoXDataSegment xdata; ademco_xdata_t xdata;
ademcoMakeXData(&xdata, TWO_HEX, AdemcoXDataTransform::AdemcoXDataTransform_as_is, pwd, 6); ademco_make_xdata(&xdata, ADEMCO_XDATA_LENGTH_FMT_TWO_HEX, ADEMCO_XDATA_TRANSFORM_AS_IS, pwd, 6);
int len = ademcoMakeHbPacket(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata); int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata);
printf("S:"); ademcoPrint(buf, len); printf("S:"); ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0); send(clientSock, (const char*)buf, len, 0);
} else { } else {
int len = ademcoMakeHbPacket(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr); int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr);
printf("S:"); ademcoPrint(buf, len); printf("S:"); ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0); send(clientSock, (const char*)buf, len, 0);
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{ {
"targets":[ "targets":[
{ {
"target_name": "libademco_js", "target_name": "libademco_js",
"sources":[ "sources":[
"libademco_wrap.cxx", "libademco_wrap.cxx",
"../ademco.c", "../ademco.c",
"../hb_com.c", "../hb_com.c",
] ],
} 'conditions': [
] ['OS=="win"', {
'msvs_settings': {
'VCCLCompilerTool': {
"AdditionalOptions": [
"/source-charset:utf-8",
]},
},
}],
],
}
]
} }
\ No newline at end of file
...@@ -3,7 +3,7 @@ const assert = require('assert'); ...@@ -3,7 +3,7 @@ const assert = require('assert');
const libname = process.platform === "win32" ? "libademco_js" : "ademco_js"; const libname = process.platform === "win32" ? "libademco_js" : "ademco_js";
const libademco = require(`./build/Release/${libname}`); const libademco = require(`./build/Release/${libname}`);
libademco.ademcoPrint("hello nodejs", "hello nodejs".length); libademco.ademco_print("hello nodejs", "hello nodejs".length);
console.log(libademco); console.log(libademco);
...@@ -11,17 +11,17 @@ function test_parse() { ...@@ -11,17 +11,17 @@ function test_parse() {
console.log("test parse..."); console.log("test parse...");
var str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r"; var str = "\nC5C30053\"HENG-BO\"0000R000000L000000#90219125916578[#000000|1737 00 000]_09:11:19,08-05-2019\r";
var cb = libademco.new_size_tp(); var cb = libademco.new_size_tp();
var pkt = new libademco.AdemcoPacket(); var pkt = new libademco.ademco_packet_t();
var res = libademco.ademcoPacketParse(str, str.length, pkt, cb, null); var res = libademco.ademco_parse_packet(str, str.length, pkt, cb, null);
assert.strictEqual(res, libademco.RESULT_OK); assert.strictEqual(res, libademco.ADEMCO_PARSE_RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), str.length); assert.strictEqual(libademco.size_tp_value(cb), str.length);
assert.strictEqual(pkt.crc, 0xC5C3); assert.strictEqual(pkt.crc, 0xC5C3);
assert.strictEqual(pkt.len, 0x0053); assert.strictEqual(pkt.len, 0x0053);
assert.strictEqual(pkt.id, libademco.AID_HB); assert.strictEqual(pkt.id, libademco.AID_HB);
assert.strictEqual(pkt.seq, 0); assert.strictEqual(pkt.seq, 0);
assert.strictEqual(pkt.acct, "90219125916578"); assert.strictEqual(pkt.acct, "90219125916578");
assert.strictEqual(pkt.data.ademcoId, 0); assert.strictEqual(pkt.data.ademco_id, 0);
assert.strictEqual(pkt.data.ademcoEvent, libademco.EVENT_I_AM_WIRE_MACHINE); assert.strictEqual(pkt.data.ademco_event, libademco.EVENT_I_AM_WIRE_MACHINE);
assert.strictEqual(pkt.data.gg, 0); assert.strictEqual(pkt.data.gg, 0);
assert.strictEqual(pkt.data.zone, 0); assert.strictEqual(pkt.data.zone, 0);
console.log("res=%d, commited=%d", res, libademco.size_tp_value(cb)); console.log("res=%d, commited=%d", res, libademco.size_tp_value(cb));
...@@ -29,22 +29,22 @@ function test_parse() { ...@@ -29,22 +29,22 @@ function test_parse() {
function test_pack() { function test_pack() {
console.log("test pack"); console.log("test pack");
var pkt = new libademco.AdemcoPacket(); var pkt = new libademco.ademco_packet_t();
libademco.ademcoMakeHbPacket2(pkt, 1, "861234567890", 666666, libademco.EVENT_ARM, 0, 0, null); libademco.ademco_make_hb_packet2(pkt, 1, "861234567890", 666666, libademco.EVENT_ARM, 0, 0, null);
console.log("len=%d", pkt.raw_len); console.log("len=%d", pkt.raw_len);
libademco.ademcoPrint(pkt.raw, pkt.raw_len); libademco.ademco_print(pkt.raw, pkt.raw_len);
console.log("test parse packed data"); console.log("test parse packed data");
var pkt2 = new libademco.AdemcoPacket(); var pkt2 = new libademco.ademco_packet_t();
var cb = libademco.new_size_tp(); var cb = libademco.new_size_tp();
var res = libademco.ademcoPacketParse(pkt.raw, pkt.raw_len, pkt2, cb, null); var res = libademco.ademco_parse_packet(pkt.raw, pkt.raw_len, pkt2, cb, null);
assert.strictEqual(res, libademco.RESULT_OK); assert.strictEqual(res, libademco.ADEMCO_PARSE_RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len); assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len);
assert.strictEqual(pkt2.id, libademco.AID_HB); assert.strictEqual(pkt2.id, libademco.AID_HB);
assert.strictEqual(pkt2.seq, 1); assert.strictEqual(pkt2.seq, 1);
assert.strictEqual(pkt2.acct, "861234567890"); assert.strictEqual(pkt2.acct, "861234567890");
assert.strictEqual(pkt2.data.ademcoId, 666666); assert.strictEqual(pkt2.data.ademco_id, 666666);
assert.strictEqual(pkt2.data.ademcoEvent, libademco.EVENT_ARM); assert.strictEqual(pkt2.data.ademco_event, libademco.EVENT_ARM);
assert.strictEqual(pkt2.data.gg, 0); assert.strictEqual(pkt2.data.gg, 0);
assert.strictEqual(pkt2.data.zone, 0); assert.strictEqual(pkt2.data.zone, 0);
} }
...@@ -56,11 +56,11 @@ class AlarmHost { ...@@ -56,11 +56,11 @@ class AlarmHost {
this.address = socket.address().address; this.address = socket.address().address;
this.port = socket.address().port; this.port = socket.address().port;
this.buf = null; this.buf = null;
this.inpkt = new libademco.AdemcoPacket(); this.inpkt = new libademco.ademco_packet_t();
this.outpkt = new libademco.AdemcoPacket(); this.outpkt = new libademco.ademco_packet_t();
this.parseErr = new libademco.AdemcoParseError(); this.parseErr = new libademco.ademco_parse_error_t();
this.cb = libademco.new_size_tp(); this.cb = libademco.new_size_tp();
this.ademcoId = 0; this.ademco_id = 0;
this.acct = ''; this.acct = '';
this.seq = 1; this.seq = 1;
...@@ -69,14 +69,14 @@ class AlarmHost { ...@@ -69,14 +69,14 @@ class AlarmHost {
chunk = Buffer.concat([this.buf, chunk]); chunk = Buffer.concat([this.buf, chunk]);
} }
let res = libademco.ademcoPacketParse(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr); let res = libademco.ademco_parse_packet(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr);
while (res === libademco.RESULT_OK) { while (res === libademco.ADEMCO_PARSE_RESULT_OK) {
chunk = chunk.slice(libademco.size_tp_value(this.cb)); chunk = chunk.slice(libademco.size_tp_value(this.cb));
this.handleMsg(); this.handleMsg();
res = libademco.ademcoPacketParse(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr); res = libademco.ademco_parse_packet(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr);
} }
if (res === libademco.RESULT_ERROR) { if (res === libademco.ADEMCO_PARSE_RESULT_ERROR) {
console.log('parse error at line=%d, msg=%s', this.parseErr.line, this.parseErr.msg); console.log('parse error at line=%d, msg=%s', this.parseErr.line, this.parseErr.msg);
chunk = null; chunk = null;
} }
...@@ -93,7 +93,7 @@ class AlarmHost { ...@@ -93,7 +93,7 @@ class AlarmHost {
handleMsg() { handleMsg() {
console.log(this.tag() + ':'); console.log(this.tag() + ':');
libademco.ademcoPrint(this.inpkt.raw, this.inpkt.raw_len); libademco.ademco_print(this.inpkt.raw, this.inpkt.raw_len);
switch (this.inpkt.id) { switch (this.inpkt.id) {
case libademco.AID_NULL: case libademco.AID_NULL:
...@@ -104,7 +104,7 @@ class AlarmHost { ...@@ -104,7 +104,7 @@ class AlarmHost {
case libademco.AID_HB: case libademco.AID_HB:
case libademco.AID_ADM_CID: case libademco.AID_ADM_CID:
this.acct = this.inpkt.acct; this.acct = this.inpkt.acct;
this.ademcoId = this.inpkt.data.ademcoId; this.ademco_id = this.inpkt.data.ademco_id;
this.sendAck(this.inpkt.seq); this.sendAck(this.inpkt.seq);
break; break;
...@@ -117,16 +117,16 @@ class AlarmHost { ...@@ -117,16 +117,16 @@ class AlarmHost {
if (this.acct) { if (this.acct) {
str += ' acct=' + this.acct; str += ' acct=' + this.acct;
} }
if (this.ademcoId) { if (this.ademco_id) {
str += ' ademco_id=' + this.ademcoId; str += ' ademco_id=' + this.ademco_id;
} }
return str; return str;
} }
sendAck(seq) { sendAck(seq) {
libademco.ademcoMakeAckPacket2(this.outpkt, seq, this.acct, this.ademcoId); libademco.ademco_make_ack_packet2(this.outpkt, seq, this.acct, this.ademco_id);
console.log('server reply:'); console.log('server reply:');
libademco.ademcoPrint(this.outpkt.raw, this.outpkt.raw_len); libademco.ademco_print(this.outpkt.raw, this.outpkt.raw_len);
this.socket.write(Buffer.from(this.outpkt.raw, this.outpkt.raw_len)); this.socket.write(Buffer.from(this.outpkt.raw, this.outpkt.raw_len));
} }
......
mkdir com\hb3344\ademco mkdir com\hb3344\ademco
"E:\local_program\swig\swigwin-4.1.1\swig.exe" -csharp -namespace com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_csharp_wrap.c libademco.swig "E:\local_program\swig\swigwin-4.1.1\swig.exe" -csharp -namespace com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_csharp_wrap.c libademco.swig
cl -c ../ademco.c ../hb_com.c libademco_csharp_wrap.c -I"../" cl -c ../ademco.c ../hb_com.c libademco_csharp_wrap.c -I"../" /source-charset:utf-8
cl -LD ademco.obj hb_com.obj libademco_csharp_wrap.obj -o libademco.dll cl -LD ademco.obj hb_com.obj libademco_csharp_wrap.obj -o libademco.dll
csc CSharpDemo.cs -recurse:com/hb3344/ademco/*.cs csc CSharpDemo.cs -recurse:com/hb3344/ademco/*.cs
rem CSharpDemo.exe rem CSharpDemo.exe
mkdir com\hb3344\ademco mkdir com\hb3344\ademco
"E:\local_program\swig\swigwin-4.1.1\swig.exe" -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_java_wrap.c libademco.swig "E:\local_program\swig\swigwin-4.1.1\swig.exe" -java -package com.hb3344.ademco -outdir com/hb3344/ademco -o libademco_java_wrap.c libademco.swig
cl -c ../ademco.c ../hb_com.c libademco_java_wrap.c -I"../" -I"%JAVA_HOME%include" -I"%JAVA_HOME%include/win32" cl -c ../ademco.c ../hb_com.c libademco_java_wrap.c -I"../" -I"%JAVA_HOME%include" -I"%JAVA_HOME%include/win32" /source-charset:utf-8
cl -LD ademco.obj hb_com.obj libademco_java_wrap.obj -o ademco_java.dll cl -LD ademco.obj hb_com.obj libademco_java_wrap.obj -o ademco_java.dll
javac -encoding utf-8 JavaDemo.java javac -encoding utf-8 JavaDemo.java
rem java JavaDemo rem java JavaDemo
...@@ -5,11 +5,13 @@ set -e ...@@ -5,11 +5,13 @@ set -e
CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P ) CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd $CURRENT_DIR cd $CURRENT_DIR
cp -f /g/dev_libs/ademco/hb/ademco.h ../ repo=/h/dev_hb/libhb/libhb
cp -f /g/dev_libs/ademco/hb/ademco.c ../
cp -f /g/dev_libs/ademco/hb/hb_com.h ../ cp -f ${repo}/ademco.h ../
cp -f /g/dev_libs/ademco/hb/hb_com.c ../ cp -f ${repo}/ademco.c ../
cp -f /g/dev_libs/ademco/hb/ademco_version.h ../ cp -f ${repo}/hb_com.h ../
cp -f /g/dev_libs/ademco/hb/ademco_config.h ../ cp -f ${repo}/hb_com.c ../
cp -f /g/dev_libs/ademco/hb/CHANGELOG.md ../ cp -f ${repo}/ademco_version.h ../
cp -f ${repo}/ademco_config.h ../
cp -f ${repo}/CHANGELOG.md ../
sed -i '/\[hb\]/d' ../CHANGELOG.md sed -i '/\[hb\]/d' ../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