Commit 1c5cdc27 authored by captainwong's avatar captainwong

2.1.6

parent 431daf57
# 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
- account minimum length is 6
- `ademcoIsValidAccount` check length
- `account` minimum length is 6
- `ademco_is_valid_account` check length
## 1.5.0
- `HbComResp_A2_Iter.com` changed to pointer
- `hb_com_resp_a2_iter_t.com` changed to pointer
- update parser for `timestamp`
- add `AdemcoControlSource` defs
......@@ -28,7 +73,7 @@
- add `file` for parse error
- fix `struct tm not initilized` on parse
- fix parsing pointer on parse timestamp failed
- fix parsing pointer on parse `timestamp` failed
## 1.2.0
......@@ -40,9 +85,9 @@
## 1.1.0
- ADEMCO_PACKET_ACCT_MAX_LEN changed from 64 to 18
- add ADEMCO_PACKET_ACCT_MAX_LEN
- hb_com 读写主机账号命令
- `ADEMCO_PACKET_ACCT_MAX_LEN` changed from 64 to 18
- add `ADEMCO_PACKET_ACCT_MAX_LEN`
- `hb_com` 读写主机账号命令
## 1.0.0
......
This diff is collapsed.
This diff is collapsed.
......@@ -20,9 +20,9 @@
#endif // ADEMCO_EXPORTS
#if defined(SWIGJAVA) || defined(SWIGCSHARP)
#define ademco_char_t uint8_t
typedef uint8_t ademco_char_t;
#else
#define ademco_char_t char
typedef char ademco_char_t;
#endif
#ifndef ADEMCO_ENABLE_CHINESE
......
......@@ -6,9 +6,9 @@
* evolve between minor releases, but only in a backwards compatible way.
*/
#define ADEMCO_VERSION_MAJOR 1
#define ADEMCO_VERSION_MINOR 5
#define ADEMCO_VERSION_PATCH 1
#define ADEMCO_VERSION_MAJOR 2
#define ADEMCO_VERSION_MINOR 1
#define ADEMCO_VERSION_PATCH 6
#define ADEMCO_VERSION_IS_RELEASE 1
#define ADEMCO_VERSION_SUFFIX ""
......
# 串口透传协议
## 发给主机
|数据|长度|含义|说明|
|---|----|----|----|
|EB AB 3F **A0** 75|5|索要主机状态|
|EB AB 3F **A1** 76|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 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 08 **A9** *DH DL* SUM|8|测试地址|*DH*:测试地址高位,*DL*:测试地址低位|
|EB CB 3F 08 **AA** *P1 P2* SUM|8|修改防区探头遗失/失联|*P1*:防区号;*P2*: 0失联关,1失联开|
|EB AB 3F **AC** 81|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 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 *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 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 07 *P0* **A7** 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 *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* **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 AB 3F **A0** 75|5|索要主机状态|
|EB AB 3F **A1** 76|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 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 08 **A9** *DH DL* SUM|8|测试地址|*DH*:测试地址高位,*DL*:测试地址低位|
|EB CB 3F 08 **AA** *P1 P2* SUM|8|修改防区探头遗失/失联|*P1*:防区号;*P2*: 0失联关,1失联开|
|EB AB 3F **AC** 81|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 06 **B0** AB|6|索要三区段主机状态||
## 主机回应
|数据|长度|含义|说明|
|---|----|----|----|
|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 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 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* **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 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|拒绝设置|主机如果认为对方的命令非法,都可以回复此条命令|
......@@ -24,32 +24,32 @@ const char* print_bool(bool b) {
return b ? "√" : " "; // "×";
}
AdemcoEvent statusEvents[] = {
ademco_event_t statusEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent alarmEvents[] = {
ademco_event_t alarmEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_ALARM_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent excepEvents[] = {
ademco_event_t excepEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_EXEPTION_EVENTS_MAP(XX)
ADEMCO_RESUME_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent privateEvents[] = {
ademco_event_t privateEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_HB_EVENTS_MAP(XX)
#undef XX
};
AdemcoEvent allEvents[] = {
ademco_event_t allEvents[] = {
#define XX(name, code, zh) EVENT_##name,
ADEMCO_STATUS_EVENTS_MAP(XX)
ADEMCO_ALARM_EVENTS_MAP(XX)
......@@ -59,26 +59,26 @@ AdemcoEvent allEvents[] = {
#undef XX
};
HbZoneProperty allZoneProperties[] = {
hb_zone_property_t allZoneProperties[] = {
#define XX(name, value, str) HZP_##name,
HB_ZONE_PROPERTY_MAP(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");
for (size_t i = 0; i < len; i++) {
auto e = events[i];
printf("|%04d|%s|%s|\n", e,
ademcoEventToStringChinese(e),
ademcoEventToString(e));
ademco_event_to_string_chinese(e),
ademco_event_to_string(e));
}
printf("\n");
}
const char* get_core_author(HbMachineType t)
const char* get_core_author(hb_machine_type_t t)
{
switch (t) {
case HMT_WIFI:
......@@ -100,7 +100,7 @@ const char* get_core_author(HbMachineType t)
return "";
}
const char* get_net_author(HbMachineType t)
const char* get_net_author(hb_machine_type_t t)
{
switch (t) {
case HMT_WIFI:
......@@ -120,7 +120,7 @@ const char* get_net_author(HbMachineType t)
return "";
}
std::vector<std::string> get_machine_brands(HbMachineType t)
std::vector<std::string> get_machine_brands(hb_machine_type_t t)
{
switch (t) {
case HMT_WIFI:
......@@ -152,7 +152,7 @@ std::string brand_to_path(const std::string& brand)
return {};
}
void print_machine_brands(HbMachineType t)
void print_machine_brands(hb_machine_type_t t)
{
printf("|<ul>");
for (auto brand : get_machine_brands(t)) {
......@@ -175,24 +175,24 @@ void print_machineTypes()
"|---------|-------|----|----|-----|----|-------|----|-------|---|----|---|----|\n");
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if(!hbMachineIsSelling(t)) continue;
printf("|%04d %s", (int)e, ademcoEventToStringChinese(e));
printf("|%s", hbMachineTypeToStringChinese(t));
printf("|%s", print_bool(hbMachineCanArm(t)));
printf("|%s", print_bool(hbMachineCanDisarm(t)));
printf("|%s", print_bool(hbMachineCanHalfArm(t)));
printf("|%s", print_bool(hbMachineCanEnterSettings(t)));
printf("|%s", print_bool(hbMachineCanReportSignalStrength(t)));
printf("|1~%d", hbZoneMax(t));
if (hbMachineHasWiredZone(t)) {
printf("|%d~%d", hbWiredZoneMin(t), hbWiredZoneMax(t));
if (ademco_is_machine_type_event(e)) {
auto t = hb_machine_type_from_ademco_event(e);
if(!hb_is_machine_on_sale(t)) continue;
printf("|%04d %s", (int)e, ademco_event_to_string_chinese(e));
printf("|%s", hb_machine_type_to_string_chinese(t));
printf("|%s", print_bool(hb_machine_can_arm(t)));
printf("|%s", print_bool(hb_machine_can_disarm(t)));
printf("|%s", print_bool(hb_machine_can_half_arm(t)));
printf("|%s", print_bool(hb_machine_can_config(t)));
printf("|%s", print_bool(hb_machine_can_report_signal_strength(t)));
printf("|1~%d", hb_get_max_zone_by_type(t));
if (hb_machine_has_wired_zones(t)) {
printf("|%d~%d", hb_wired_zone_min(t), hb_wired_zone_max(t));
} else {
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_net_author(t));
print_machine_brands(t);
......@@ -211,9 +211,9 @@ void print_imgs()
std::map<std::string, std::string> imgs;
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if (!hbMachineIsSelling(t)) continue;
if (ademco_is_machine_type_event(e)) {
auto t = hb_machine_type_from_ademco_event(e);
if (!hb_is_machine_on_sale(t)) continue;
for (auto brand : get_machine_brands(t)) {
auto path = brand_to_path(brand);
......@@ -230,7 +230,7 @@ void print_imgs()
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++) {
if (props[i] == prop)return true;
}
......@@ -244,8 +244,8 @@ void print_available_zone_props()
//auto all_props = getAvailableZoneProperties();
auto print_prop = [](HbZoneProperty zp) {
printf("%02X %s", zp, hbZonePropertyToStringChinese(zp));
auto print_prop = [](hb_zone_property_t zp) {
printf("%02X %s", zp, hb_zone_property_to_string_chinese(zp));
};
......@@ -266,7 +266,7 @@ void print_available_zone_props()
printf("|失联支持");
for (auto zp : allZoneProperties) {
printf("|%s", print_bool(hbZonePropCanReportLost(zp)));
printf("|%s", print_bool(hb_zone_can_report_lost(zp)));
}
printf("|\n\n");
......@@ -286,14 +286,14 @@ void print_available_zone_props()
printf("|\n");
for (auto e : allEvents) {
if (ademcoIsMachineTypeEvent(e)) {
auto t = hbMachineTypeFromAdemcoEvent(e);
if (!hbMachineIsSelling(t)) continue;
if (ademco_is_machine_type_event(e)) {
auto t = hb_machine_type_from_ademco_event(e);
if (!hb_is_machine_on_sale(t)) continue;
printf("|%04d", (int)e);
printf("|%d", (int)t);
print_machine_brands(t);
HbZoneProperty avail_props[12];
int count = hbGetAvailableZoneProperties(t, avail_props);
hb_zone_property_t avail_props[HZP_COUNT];
int count = hb_get_available_zone_properties_by_type(t, avail_props);
for (auto zp : allZoneProperties) {
printf("|%s", print_bool(zprop_is_contain(avail_props, count, zp)));
}
......@@ -367,7 +367,7 @@ void print_g250_alarm_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 )
cd ${CURRENT_DIR}
mkdir -p ./uvlib
cp -r /g/dev_libs/ademco/uvlib/llhttp ./uvlib/
cp /g/dev_libs/ademco/uvlib/*.h ./uvlib/
cp /g/dev_libs/ademco/uvlib/*.c ./uvlib/
\ No newline at end of file
repo=/h/dev_hb/libhb
cp -r ${repo}/uvlib/llhttp ./uvlib/
cp ${repo}/uvlib/*.h ./uvlib/
cp ${repo}/uvlib/*.c ./uvlib/
\ No newline at end of file
......@@ -8,9 +8,9 @@
typedef struct machine_info_s {
char acct[ADEMCO_PACKET_ACCT_MAX_LEN + 1];
AdemcoId ademcoId;
HbMachineType type;
HbMachineStatus status;
ademco_id_t ademco_id;
hb_machine_type_t type;
hb_machine_status_t status;
}machine_info_t;
struct {
......@@ -81,7 +81,7 @@ int post(const char* json) {
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;
char* string = NULL;
int r = 0;
......@@ -110,7 +110,7 @@ void on_tcp_connection(uv_tcpserver_client_context_t* client, int connected) {
if (connected) {
machine_info_t* machine = malloc(sizeof(machine_info_t));
memset(machine->acct, '\0', sizeof(machine->acct));
machine->ademcoId = 0;
machine->ademco_id = 0;
machine->type = HMT_INVALID;
machine->status = HMS_INVALID;
client->data = machine;
......@@ -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) {
AdemcoPacket pkt;
AdemcoParseResult res = ademcoPacketParse(buf, len, &pkt, ate, NULL);
ademco_packet_t pkt;
ademco_parse_result_t res = ademco_parse_packet(buf, len, &pkt, ate, NULL);
switch (res) {
case RESULT_OK:
case ADEMCO_PARSE_RESULT_OK:
switch (pkt.id) {
case AID_NULL:
case AID_HB:
case AID_ADM_CID:
printf("C:");
ademcoPrint(pkt.raw, pkt.raw_len);
ademco_print(pkt.raw, pkt.raw_len);
if (((machine_info_t*)(client->data))->acct[0] == '\0') {
strcpy(((machine_info_t*)(client->data))->acct, pkt.acct);
relay(pkt.acct, EVENT_ONLINE, 0, 0);
}
if (pkt.data.ademcoId) {
((machine_info_t*)(client->data))->ademcoId = pkt.data.ademcoId;
if (pkt.data.ademco_id) {
((machine_info_t*)(client->data))->ademco_id = pkt.data.ademco_id;
}
if (ademcoIsMachineStatusEvent(pkt.data.ademcoEvent)) {
((machine_info_t*)(client->data))->status = hbMachineStatusFromAdemcoEvent(pkt.data.ademcoEvent);
if (ademco_is_machine_status_event(pkt.data.ademco_event)) {
((machine_info_t*)(client->data))->status = hb_machine_status_from_ademco_event(pkt.data.ademco_event);
}
if (ademcoIsMachineTypeEvent(pkt.data.ademcoEvent)) {
((machine_info_t*)(client->data))->type = hbMachineTypeFromAdemcoEvent(pkt.data.ademcoEvent);
if (ademco_is_machine_type_event(pkt.data.ademco_event)) {
((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') {
relay(((machine_info_t*)(client->data))->acct, pkt.data.ademcoEvent, pkt.data.zone, pkt.data.gg);
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.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);
printf("S:");
ademcoPrint(pkt.raw, pkt.raw_len);
ademco_print(pkt.raw, pkt.raw_len);
break;
}
return uv_tcp_parse_ok;
break;
case RESULT_NOT_ENOUGH:
case ADEMCO_PARSE_RESULT_NOT_ENOUGH:
return uv_tcp_parse_not_enough;
break;
case RESULT_ERROR:
case ADEMCO_PARSE_RESULT_ERROR:
return uv_tcp_parse_error;
break;
default:
......
......@@ -90,6 +90,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
......@@ -106,6 +107,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
......@@ -122,6 +124,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
......@@ -138,6 +141,7 @@
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(DEVLIBS);.\uvlib\llhttp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalOptions>/source-charset:utf-8 %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<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) {
}
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;
if (!newline) {
newline = "\n";
}
if (show_header) {
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");
if (show_ascii) {
mybuf_cat_printf(buf, " 0123456789ABCDEF");
}
mybuf_cat_printf(buf, "\n");
if (show_ascii)
mybuf_cat_printf(buf, " | 0123456789ABCDEF");
mybuf_cat_printf(buf, "%s", newline);
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) {
def_ascii = '.'; // default ascii
......@@ -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++) {
if (show_address) {
if (i % 16 == 0) {
mybuf_cat_printf(buf, "%04zX ", addr);
mybuf_cat_printf(buf, "%04zX | ", addr);
addr += 16;
}
}
......@@ -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, "\n");
mybuf_cat_printf(buf, "%s", newline);
} 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) {
mybuf_append(buf, tmp.buf, tmp.size);
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 @@
#pragma once
#include "uvlib_config.h"
#include <stddef.h> // size_t
#ifdef __cplusplus
......@@ -23,31 +24,37 @@ typedef struct {
size_t size, capacity;
} mybuf_t;
void mybuf_init(mybuf_t* buf);
size_t mybuf_space(mybuf_t* buf);
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_init(mybuf_t* buf);
UVLIB_EXPORT_SYMBOL size_t mybuf_space(mybuf_t* buf);
UVLIB_EXPORT_SYMBOL void mybuf_reserve(mybuf_t* buf, size_t size);
UVLIB_EXPORT_SYMBOL void mybuf_append(mybuf_t* buf, const char* data, size_t len);
/*
* append hex dump to mybuf
* show_header: show 00~0F address header, default is 0
* show_address: show 0000~FFFF address on left
* 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,
int show_header, int show_address, int show_ascii, char def_ascii);
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,
const char* newline);
#ifdef __GNUC__
void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...)
__attribute__((format(printf, 2, 3)));
UVLIB_EXPORT_SYMBOL void mybuf_cat_printf(mybuf_t* buf, const char* fmt, ...)
__attribute__((format(printf, 2, 3)));
#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
void mybuf_clear(mybuf_t* buf);
UVLIB_EXPORT_SYMBOL void mybuf_clear(mybuf_t* 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
}
......
......@@ -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);
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);
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);
int uv_httpc_stop(uv_httpc_t* httpc);
void uv_httpc_free(uv_httpc_t* httpc);
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);
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 int uv_httpc_stop(uv_httpc_t* httpc);
UVLIB_EXPORT_SYMBOL void uv_httpc_free(uv_httpc_t* httpc);
UVLIB_EXPORT_SYMBOL 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_nodup(uv_httpc_headers_t* headers, char* data);
UVLIB_EXPORT_SYMBOL uv_httpc_headers_t* uv_httpc_headers_dup(uv_httpc_headers_t* headers);
UVLIB_EXPORT_SYMBOL void uv_httpc_headers_free_all(uv_httpc_headers_t* headers, int freedata);
#ifdef WEUV_TEST
int uv_httpc_test_main(int argc, char** argv);
......
......@@ -3,6 +3,7 @@
#pragma once
#include "uvlib_config.h"
#include <uv.h>
#include "llhttp/include/llhttp.h"
......@@ -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);
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);
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);
int string0_nicmp(const char* s1, const char* s2, size_t len2);
UVLIB_EXPORT_SYMBOL void nprintf(const char* msg, size_t len, int newline);
UVLIB_EXPORT_SYMBOL int string_ncmp(const char* s1, size_t len1, const char* s2, size_t len2);
UVLIB_EXPORT_SYMBOL int string0_ncmp(const char* s1, const char* s2, size_t len2);
UVLIB_EXPORT_SYMBOL int string_nicmp(const char* s1, size_t len1, 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
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`
// if your want to use a existing `uv_loop_t`, pass it by `loop`
// 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);
void uv_httpd_stop(uv_httpd_server_t* server);
void uv_httpd_free(uv_httpd_server_t* server);
UVLIB_EXPORT_SYMBOL int uv_httpd_create(uv_httpd_server_t** server, uv_loop_t* loop, on_request_t on_request);
UVLIB_EXPORT_SYMBOL void uv_httpd_stop(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
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
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 {
......
......@@ -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,
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;
if (level < g_level || level > uv_log_level_fatal) return;
mybuf_init(&mybuf);
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);
mybuf_clear(&mybuf);
}
......
......@@ -3,6 +3,7 @@
#pragma once
#include "uvlib_config.h"
#include <stdlib.h>
#ifdef __cplusplus
......@@ -28,23 +29,25 @@ typedef enum {
uv_log_level_invalid = 1 << 11,
} uv_log_level_t;
uv_log_level_t uv_log_level_from_string(const char* str);
const char* uv_log_level_to_string(uv_log_level_t level);
void uv_log_set_level(uv_log_level_t level);
void uv_log_set_log_file(const char* file);
uv_log_level_t uv_log_get_level();
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 uv_log_level_t uv_log_level_from_string(const char* str);
UVLIB_EXPORT_SYMBOL const char* uv_log_level_to_string(uv_log_level_t level);
UVLIB_EXPORT_SYMBOL void uv_log_set_level(uv_log_level_t level);
UVLIB_EXPORT_SYMBOL void uv_log_set_log_file(const char* file);
UVLIB_EXPORT_SYMBOL uv_log_level_t uv_log_get_level();
UVLIB_EXPORT_SYMBOL void uv_log(uv_log_level_t level, const char* fmt, ...);
UVLIB_EXPORT_SYMBOL void uv_log_raw(uv_log_level_t level, const char* msg);
/**
* log hex dump
* show_header: show 00~0F address header, default is 0
* show_address: show 0000~FFFF address on left
* 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,
int show_header, int show_address, int show_ascii, char def_ascii);
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,
const char* newline);
#define uvlog_all(...) uv_log(uv_log_level_all, __VA_ARGS__)
#define uvlog_verbose(...) uv_log(uv_log_level_verbose, __VA_ARGS__)
......
......@@ -4,6 +4,7 @@
#pragma once
#include <uv.h>
#include "uvlib_config.h"
#ifdef __cplusplus
extern "C" {
......@@ -15,7 +16,7 @@ typedef enum {
uv_tcp_parse_error,
} 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
}
......
......@@ -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) {
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;
uv_tcp_parse_result_t r = cli->settings->on_parse(cli, p, total, &cb);
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) {
r = cli->settings->on_parse(cli, p, total, &cb);
}
if (r == uv_tcp_parse_error) {
mybuf_clear(&cli->buf);
} else if (p != cli->buf.buf) {
p += cb;
total -= cb;
}
if (p != cli->buf.buf) {
if (total > 0) {
mybuf_t buf;
mybuf_init(&buf);
mybuf_append(&buf, p, total);
mybuf_clear(&cli->buf);
mybuf_append(&cli->buf, buf.buf, buf.size);
mybuf_clear_append(&cli->buf, p, total);
} else {
mybuf_clear(&cli->buf);
}
......
......@@ -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_closed_t)(uv_tcpclient_t* client);
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);
void uv_tcpclient_send(uv_tcpclient_t* client, const char* buf, size_t len);
void uv_tcpclient_stop(uv_tcpclient_t* client);
void uv_tcpclient_free(uv_tcpclient_t* client);
UVLIB_EXPORT_SYMBOL int uv_tcpclient_new(uv_tcpclient_t** client, uv_loop_t* loop, uv_tcpclient_settings_t* settings);
UVLIB_EXPORT_SYMBOL int uv_tcpclient_start(uv_tcpclient_t* client, const char* domain, const char* port);
UVLIB_EXPORT_SYMBOL void uv_tcpclient_send(uv_tcpclient_t* client, const char* buf, size_t len);
UVLIB_EXPORT_SYMBOL void uv_tcpclient_stop(uv_tcpclient_t* client);
UVLIB_EXPORT_SYMBOL void uv_tcpclient_free(uv_tcpclient_t* client);
struct uv_tcpclient_settings_s {
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) {
if (cli->server->settings->on_parse) {
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;
uv_tcp_parse_result_t r = cli->server->settings->on_parse(cli, p, total, &cb);
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) {
r = cli->server->settings->on_parse(cli, p, total, &cb);
}
if (r == uv_tcp_parse_error) {
mybuf_clear(&cli->buf);
} else if (p != cli->buf.buf) {
p += cb;
total -= cb;
}
if (p != cli->buf.buf) {
if (total > 0) {
mybuf_clear_append(&cli->buf, p, total);
} else {
......
......@@ -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 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);
int uv_tcpserver_start_listen(uv_tcpserver_t* server, const char* listen_addr, int listen_port);
void uv_tcpserver_stop(uv_tcpserver_t* server);
void uv_tcpserver_free(uv_tcpserver_t* server);
void uv_tcpserver_close_cli(uv_tcpserver_client_context_t* cli);
UVLIB_EXPORT_SYMBOL int uv_tcpserver_create(uv_tcpserver_t** server, uv_loop_t* loop, uv_tcpserver_settings_t* settings);
UVLIB_EXPORT_SYMBOL int uv_tcpserver_start_listen(uv_tcpserver_t* server, const char* listen_addr, int listen_port);
UVLIB_EXPORT_SYMBOL void uv_tcpserver_stop(uv_tcpserver_t* server);
UVLIB_EXPORT_SYMBOL void uv_tcpserver_free(uv_tcpserver_t* server);
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`
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 void uv_tcpserver_free_cli_ctx(uv_tcpserver_client_context_t* cli);
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 {
void* data;
......
......@@ -14,27 +14,40 @@
#ifdef _WIN32
#define UVLIB_DIR "G:/dev_libs/ademco/"
#ifdef UVLIB_LOAD_DLL
#ifdef UVLIB_USE_MT
#define UVLIB_NAME "uvlib_mt.lib"
#else
#define UVLIB_NAME "uvlib.lib"
#endif
#define LIB_DIR "H:/dev_hb/libhb/"
#define LIB_NAME "uvlib.lib"
#elif defined(UVLIB_LINK_STATIC)
#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 _DEBUG
#pragma comment(lib, UVLIB_DIR "x64/Debug/" UVLIB_NAME)
#pragma comment(lib, LIB_DIR "x64/Debug/" LIB_NAME)
#else
#pragma comment(lib, UVLIB_DIR "x64/Release/" UVLIB_NAME)
#pragma comment(lib, LIB_DIR "x64/Release/" LIB_NAME)
#endif
#else // WIN32
#ifdef _DEBUG
#pragma comment(lib, UVLIB_DIR "Debug/" UVLIB_NAME)
#pragma comment(lib, LIB_DIR "Debug/" LIB_NAME)
#else
#pragma comment(lib, UVLIB_DIR "Release/" UVLIB_NAME)
#pragma comment(lib, LIB_DIR "Release/" LIB_NAME)
#endif
#endif
#undef LIB_DIR
#undef LIB_NAME
#endif // defined(LIB_DIR) && defined(LIB_NAME)
#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__
#define __UVLIB_VERSION_H__
#include "uvlib_config.h"
#ifdef __cplusplus
extern "C" {
#endif
......@@ -12,7 +14,7 @@ extern "C" {
#define UVLIB_VERSION_MAJOR 1
#define UVLIB_VERSION_MINOR 0
#define UVLIB_VERSION_PATCH 0
#define UVLIB_VERSION_PATCH 4
#define UVLIB_VERSION_IS_RELEASE 1
#define UVLIB_VERSION_SUFFIX ""
......@@ -20,8 +22,8 @@ extern "C" {
(UVLIB_VERSION_MINOR << 8) | \
(UVLIB_VERSION_PATCH))
unsigned int uvlib_version(void);
const char* uvlib_version_string(void);
UVLIB_EXPORT_SYMBOL unsigned int uvlib_version(void);
UVLIB_EXPORT_SYMBOL const char* uvlib_version_string(void);
#ifdef __cplusplus
}
......
......@@ -50,10 +50,10 @@ struct Buffer {
SOCKET clientSock = INVALID_SOCKET;
Buffer clientBuffer = {};
std::string clientAcct = {};
AdemcoId clientAdemcoId = 0;
ademco_id_t clientAdemcoId = 0;
std::mutex mutex = {};
std::vector<AdemcoEvent> evntsWaiting4Send = {};
std::vector<ademco_event_t> evntsWaiting4Send = {};
char pwd[1024] = {};
int setNonBlocking(SOCKET socket) {
......@@ -132,20 +132,20 @@ int main(int argc, char** argv) {
}
};
auto do_handle = []() -> AdemcoParseResult {
AdemcoPacket pkt; size_t cb = 0;
AdemcoParseResult result = ademcoPacketParse(clientBuffer.buff + clientBuffer.rpos,
auto do_handle = []() -> ademco_parse_result_t {
ademco_packet_t pkt; size_t cb = 0;
ademco_parse_result_t result = ademco_parse_packet(clientBuffer.buff + clientBuffer.rpos,
clientBuffer.wpos - clientBuffer.rpos,
&pkt,
&cb,
nullptr);
switch (result) {
case AdemcoParseResult::RESULT_OK:
case ademco_parse_result_t::ADEMCO_PARSE_RESULT_OK:
{
clientBuffer.rpos += cb;
//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) {
case AID_ACK:
// success
......@@ -154,8 +154,8 @@ int main(int argc, char** argv) {
case AID_NULL: // reply ack
{
char ack[1024];
size_t len = ademcoMakeAckPacket(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademcoPrint(ack, len);
size_t len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0);
break;
}
......@@ -164,14 +164,14 @@ int main(int argc, char** argv) {
case AID_ADM_CID:
{
clientAcct = pkt.acct;
clientAdemcoId = pkt.data.ademcoId;
clientAdemcoId = pkt.data.ademco_id;
// handle event
// reply ack
{
char ack[1024];
int len = ademcoMakeAckPacket(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademcoPrint(ack, len);
int len = ademco_make_ack_packet(ack, sizeof(ack), pkt.seq, pkt.acct, 0);
printf("S:"); ademco_print(ack, len);
send(clientSock, (const char*)ack, len, 0);
}
......@@ -184,11 +184,11 @@ int main(int argc, char** argv) {
break;
}
case AdemcoParseResult::RESULT_NOT_ENOUGH:
case ademco_parse_result_t::ADEMCO_PARSE_RESULT_NOT_ENOUGH:
// do nothing
break;
case AdemcoParseResult::RESULT_ERROR:
case ademco_parse_result_t::ADEMCO_PARSE_RESULT_ERROR:
default:
// error handle, e.g. clear buff
clientBuffer.clear();
......@@ -248,7 +248,7 @@ int main(int argc, char** argv) {
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) {
char buf[1024];
for (auto e : evntsWaiting4Send) {
if (e == EVENT_DISARM) {
AdemcoXDataSegment xdata;
ademcoMakeXData(&xdata, TWO_HEX, AdemcoXDataTransform::AdemcoXDataTransform_as_is, pwd, 6);
int len = ademcoMakeHbPacket(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata);
printf("S:"); ademcoPrint(buf, len);
ademco_xdata_t xdata;
ademco_make_xdata(&xdata, ADEMCO_XDATA_LENGTH_FMT_TWO_HEX, ADEMCO_XDATA_TRANSFORM_AS_IS, pwd, 6);
int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, &xdata);
printf("S:"); ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0);
} else {
int len = ademcoMakeHbPacket(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr);
printf("S:"); ademcoPrint(buf, len);
int len = ademco_make_hb_packet(buf, sizeof(buf), 1, clientAcct.c_str(), clientAdemcoId, e, 0, 0, nullptr);
printf("S:"); ademco_print(buf, len);
send(clientSock, (const char*)buf, len, 0);
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{
"targets":[
{
"target_name": "libademco_js",
"sources":[
"libademco_wrap.cxx",
"../ademco.c",
"../hb_com.c",
]
}
]
{
"targets":[
{
"target_name": "libademco_js",
"sources":[
"libademco_wrap.cxx",
"../ademco.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');
const libname = process.platform === "win32" ? "libademco_js" : "ademco_js";
const libademco = require(`./build/Release/${libname}`);
libademco.ademcoPrint("hello nodejs", "hello nodejs".length);
libademco.ademco_print("hello nodejs", "hello nodejs".length);
console.log(libademco);
......@@ -11,17 +11,17 @@ function 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 cb = libademco.new_size_tp();
var pkt = new libademco.AdemcoPacket();
var res = libademco.ademcoPacketParse(str, str.length, pkt, cb, null);
assert.strictEqual(res, libademco.RESULT_OK);
var pkt = new libademco.ademco_packet_t();
var res = libademco.ademco_parse_packet(str, str.length, pkt, cb, null);
assert.strictEqual(res, libademco.ADEMCO_PARSE_RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), str.length);
assert.strictEqual(pkt.crc, 0xC5C3);
assert.strictEqual(pkt.len, 0x0053);
assert.strictEqual(pkt.id, libademco.AID_HB);
assert.strictEqual(pkt.seq, 0);
assert.strictEqual(pkt.acct, "90219125916578");
assert.strictEqual(pkt.data.ademcoId, 0);
assert.strictEqual(pkt.data.ademcoEvent, libademco.EVENT_I_AM_WIRE_MACHINE);
assert.strictEqual(pkt.data.ademco_id, 0);
assert.strictEqual(pkt.data.ademco_event, libademco.EVENT_I_AM_WIRE_MACHINE);
assert.strictEqual(pkt.data.gg, 0);
assert.strictEqual(pkt.data.zone, 0);
console.log("res=%d, commited=%d", res, libademco.size_tp_value(cb));
......@@ -29,22 +29,22 @@ function test_parse() {
function test_pack() {
console.log("test pack");
var pkt = new libademco.AdemcoPacket();
libademco.ademcoMakeHbPacket2(pkt, 1, "861234567890", 666666, libademco.EVENT_ARM, 0, 0, null);
var pkt = new libademco.ademco_packet_t();
libademco.ademco_make_hb_packet2(pkt, 1, "861234567890", 666666, libademco.EVENT_ARM, 0, 0, null);
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");
var pkt2 = new libademco.AdemcoPacket();
var pkt2 = new libademco.ademco_packet_t();
var cb = libademco.new_size_tp();
var res = libademco.ademcoPacketParse(pkt.raw, pkt.raw_len, pkt2, cb, null);
assert.strictEqual(res, libademco.RESULT_OK);
var res = libademco.ademco_parse_packet(pkt.raw, pkt.raw_len, pkt2, cb, null);
assert.strictEqual(res, libademco.ADEMCO_PARSE_RESULT_OK);
assert.strictEqual(libademco.size_tp_value(cb), pkt.raw_len);
assert.strictEqual(pkt2.id, libademco.AID_HB);
assert.strictEqual(pkt2.seq, 1);
assert.strictEqual(pkt2.acct, "861234567890");
assert.strictEqual(pkt2.data.ademcoId, 666666);
assert.strictEqual(pkt2.data.ademcoEvent, libademco.EVENT_ARM);
assert.strictEqual(pkt2.data.ademco_id, 666666);
assert.strictEqual(pkt2.data.ademco_event, libademco.EVENT_ARM);
assert.strictEqual(pkt2.data.gg, 0);
assert.strictEqual(pkt2.data.zone, 0);
}
......@@ -56,11 +56,11 @@ class AlarmHost {
this.address = socket.address().address;
this.port = socket.address().port;
this.buf = null;
this.inpkt = new libademco.AdemcoPacket();
this.outpkt = new libademco.AdemcoPacket();
this.parseErr = new libademco.AdemcoParseError();
this.inpkt = new libademco.ademco_packet_t();
this.outpkt = new libademco.ademco_packet_t();
this.parseErr = new libademco.ademco_parse_error_t();
this.cb = libademco.new_size_tp();
this.ademcoId = 0;
this.ademco_id = 0;
this.acct = '';
this.seq = 1;
......@@ -69,14 +69,14 @@ class AlarmHost {
chunk = Buffer.concat([this.buf, chunk]);
}
let res = libademco.ademcoPacketParse(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr);
while (res === libademco.RESULT_OK) {
let res = libademco.ademco_parse_packet(chunk.toString(), chunk.length, this.inpkt, this.cb, this.parseErr);
while (res === libademco.ADEMCO_PARSE_RESULT_OK) {
chunk = chunk.slice(libademco.size_tp_value(this.cb));
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);
chunk = null;
}
......@@ -93,7 +93,7 @@ class AlarmHost {
handleMsg() {
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) {
case libademco.AID_NULL:
......@@ -104,7 +104,7 @@ class AlarmHost {
case libademco.AID_HB:
case libademco.AID_ADM_CID:
this.acct = this.inpkt.acct;
this.ademcoId = this.inpkt.data.ademcoId;
this.ademco_id = this.inpkt.data.ademco_id;
this.sendAck(this.inpkt.seq);
break;
......@@ -117,16 +117,16 @@ class AlarmHost {
if (this.acct) {
str += ' acct=' + this.acct;
}
if (this.ademcoId) {
str += ' ademco_id=' + this.ademcoId;
if (this.ademco_id) {
str += ' ademco_id=' + this.ademco_id;
}
return str;
}
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:');
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));
}
......
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
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
csc CSharpDemo.cs -recurse:com/hb3344/ademco/*.cs
rem CSharpDemo.exe
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
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
javac -encoding utf-8 JavaDemo.java
rem java JavaDemo
......@@ -5,11 +5,13 @@ set -e
CURRENT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd $CURRENT_DIR
cp -f /g/dev_libs/ademco/hb/ademco.h ../
cp -f /g/dev_libs/ademco/hb/ademco.c ../
cp -f /g/dev_libs/ademco/hb/hb_com.h ../
cp -f /g/dev_libs/ademco/hb/hb_com.c ../
cp -f /g/dev_libs/ademco/hb/ademco_version.h ../
cp -f /g/dev_libs/ademco/hb/ademco_config.h ../
cp -f /g/dev_libs/ademco/hb/CHANGELOG.md ../
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}/ademco_version.h ../
cp -f ${repo}/ademco_config.h ../
cp -f ${repo}/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