From 7cf0583698fd2ad96845023486e70af779eea690 Mon Sep 17 00:00:00 2001
From: i7-8700 <1281261856@qq.com>
Date: Sun, 23 Aug 2020 23:22:09 +0800
Subject: [PATCH] print

---
 .../server_demo_libevent.cpp                  | 104 +++++++++++-------
 1 file changed, 67 insertions(+), 37 deletions(-)

diff --git a/examples/server_demo_libevent/server_demo_libevent.cpp b/examples/server_demo_libevent/server_demo_libevent.cpp
index b39d6dc..fa2e2fe 100644
--- a/examples/server_demo_libevent/server_demo_libevent.cpp
+++ b/examples/server_demo_libevent/server_demo_libevent.cpp
@@ -107,8 +107,12 @@ struct Client {
 	MachineStatus status3 = MachineStatus::Arm;
 	std::map<size_t, ZonePropertyAndLostConfig> zones = {};
 	QueryStage queryStage = QueryStage::None;
+	com::MachineTimer timer = {};
 
 	uint16_t nextSeq() { if (++seq == 10000) { seq = 1; } return seq; }
+
+	void printInfo() const;
+	Client& operator=(const Client&) = default;
 };
 
 struct ThreadContext {
@@ -247,17 +251,28 @@ void handle_com_passthrough(ThreadContext* context, Client& client, evbuffer* ou
 		break;
 	case com::ResponseParser::ResponseType::A6_response:
 		{
-			com::A6R resp; memcpy(resp.data, xdata.data(), resp.len);
-			com::MachineTimer t = resp.getTimer();
-			for (int i = 0; i < 2; i++) {
-				if (com::isValidMachineTimer(t.timer[i])) {
-					printf("\t\tMachine Timer#%d: Arm at %02d:%02d, Disarm at %02d:%02d\n", i + 1,
-						   t.timer[i].armAt.hour, t.timer[i].armAt.minute,
-						   t.timer[i].disarmAt.hour, t.timer[i].disarmAt.minute);
-				} else {
-					printf("\t\tMachine Timer#%d: Not Set\n", i + 1);
+			if (client.queryStage == QueryStage::QueryingTimer) {
+				client.queryStage = QueryStage::None;
+				com::A6R resp; memcpy(resp.data, xdata.data(), resp.len);
+				client.timer = resp.getTimer();
+				for (int i = 0; i < 2; i++) {
+					if (com::isValidMachineTimer(client.timer.timer[i])) {
+						printf("\t\tMachine Timer#%d: Arm at %02d:%02d, Disarm at %02d:%02d\n", i + 1,
+							   client.timer.timer[i].armAt.hour, client.timer.timer[i].armAt.minute,
+							   client.timer.timer[i].disarmAt.hour, client.timer.timer[i].disarmAt.minute);
+					} else {
+						printf("\t\tMachine Timer#%d: Not Set\n", i + 1);
+					}
 				}
-			}			
+			}
+			auto n = context->packet.make_hb(buf, sizeof(buf), client.nextSeq(), client.acct, client.ademco_id, 0,
+											 EVENT_EXIT_SET_MODE, 0);
+			evbuffer_add(output, buf, n);
+			if (!disable_data_print) {
+				printf("T#%d S#%d acct=%s ademco_id=%06zX :%s\n",
+					   context->worker_id, client.fd, client.acct.data(), client.ademco_id,
+					   context->packet.toString(detail::ToStringOption::ALL_CHAR_AS_HEX).data());
+			}
 		}
 		break;
 	case com::ResponseParser::ResponseType::A7_response:
@@ -310,15 +325,16 @@ void handle_com_passthrough(ThreadContext* context, Client& client, evbuffer* ou
 	case com::ResponseParser::ResponseType::AE_response:
 		break;
 	case com::ResponseParser::ResponseType::B1_response:
-		{
+		{			
 			com::B1R b1; memcpy(b1.data.data, xdata.data(), xdata.size());
 			client.status1 = b1.data.cmd.status1 == 0 ? MachineStatus::Arm : MachineStatus::Disarm;
 			client.status2 = b1.data.cmd.status2 == 0 ? MachineStatus::Arm : MachineStatus::Disarm;
 			client.status3 = b1.data.cmd.status3 == 0 ? MachineStatus::Arm : MachineStatus::Disarm;
 			printf("\t\t status1: %d %s\n\t\t status2: %d %s\n\t\t status3: %d %s\n",
-				   (int)client.status1, machineStatusToString(client.status1),
-				   (int)client.status2, machineStatusToString(client.status2),
-				   (int)client.status3, machineStatusToString(client.status3));
+					(int)client.status1, machineStatusToString(client.status1),
+					(int)client.status2, machineStatusToString(client.status2),
+					(int)client.status3, machineStatusToString(client.status3));			
+			
 			break;
 		}
 	case com::ResponseParser::ResponseType::Invalid_response:
@@ -920,29 +936,7 @@ int main(int argc, char** argv)
 				printf("Total connnected %zd clients:\n", copiedClients.size());
 
 				for (const auto& client : copiedClients) {
-					if (client.type == EVENT_I_AM_3_SECTION_MACHINE) {
-						printf("  fd=#%d acct=%s ademco_id=%zd type=%s\n",
-							   client.fd, client.acct.data(), client.ademco_id,
-							   machineTypeToString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)client.type)));
-						printf("    status1: %d %s    status2: %d %s    status3: %d %s\n",
-							   (int)client.status1, machineStatusToString(client.status1),
-							   (int)client.status2, machineStatusToString(client.status2),
-							   (int)client.status3, machineStatusToString(client.status3));
-					} else {
-						printf("  fd=#%d acct=%s ademco_id=%zd type=%s status=%d %s\n", 
-							   client.fd, client.acct.data(), client.ademco_id,
-							   machineTypeToString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)client.type)), 
-							   (int)client.status, machineStatusToString(client.status));
-					}
-					for (const auto& zp : client.zones) {
-						char buf[512];
-						snprintf(buf, sizeof(buf), getZoneFormatString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)client.type)), zp.first);
-						printf("    Zone:");
-						printf("%s", buf);
-						printf("  Prop:0x%02X %s     \tTamper Enabled:%s\n", 
-							   zp.second.prop, zonePropertyToStringEn(zp.second.prop), 
-							   zp.second.tamper_enabled ? "true" : "false");
-					}
+					client.printInfo();
 				}
 			}
 			break;
@@ -983,3 +977,39 @@ int main(int argc, char** argv)
 
 	return 0;
 }
+
+void Client::printInfo() const
+{
+	if (type == EVENT_I_AM_3_SECTION_MACHINE) {
+		printf("  fd=#%d acct=%s ademco_id=%zd type=%s\n",
+			   fd, acct.data(), ademco_id,
+			   machineTypeToString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)type)));
+		printf("    status1: %d %s    status2: %d %s    status3: %d %s\n",
+			   (int)status1, machineStatusToString(status1),
+			   (int)status2, machineStatusToString(status2),
+			   (int)status3, machineStatusToString(status3));
+	} else {
+		printf("  fd=#%d acct=%s ademco_id=%zd type=%s status=%d %s\n",
+			   fd, acct.data(), ademco_id,
+			   machineTypeToString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)type)),
+			   (int)status, machineStatusToString(status));
+	}
+	for (const auto& zp : zones) {
+		char buf[512];
+		snprintf(buf, sizeof(buf), getZoneFormatString(machineTypeFromAdemcoEvent((ADEMCO_EVENT)type)), zp.first);
+		printf("    Zone:");
+		printf("%s", buf);
+		printf("  Prop:0x%02X %s     \tTamper Enabled:%s\n",
+			   zp.second.prop, zonePropertyToStringEn(zp.second.prop),
+			   zp.second.tamper_enabled ? "true" : "false");
+	}
+	for (int i = 0; i < 2; i++) {
+		if (com::isValidMachineTimer(timer.timer[i])) {
+			printf("    Machine Timer#%d: Arm at %02d:%02d, Disarm at %02d:%02d\n", i + 1,
+				   timer.timer[i].armAt.hour, timer.timer[i].armAt.minute,
+				   timer.timer[i].disarmAt.hour, timer.timer[i].disarmAt.minute);
+		} else {
+			printf("    Machine Timer#%d: Not Set\n", i + 1);
+		}
+	}
+}
-- 
2.18.1