2024-04-19 19:06:00 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "aqualink.h"
|
|
|
|
#include "net_services.h"
|
|
|
|
#include "packetLogger.h"
|
|
|
|
|
|
|
|
#define MAX_STACK 20
|
|
|
|
int _sim_stack_place = 0;
|
2024-05-13 23:45:18 +00:00
|
|
|
unsigned char _sim_commands[MAX_STACK];
|
2024-04-19 19:06:00 +00:00
|
|
|
|
|
|
|
bool push_simulator_cmd(unsigned char cmd);
|
|
|
|
|
|
|
|
int simulator_cmd_length()
|
|
|
|
{
|
|
|
|
return _sim_stack_place;
|
|
|
|
}
|
|
|
|
|
|
|
|
// External command
|
|
|
|
void simulator_send_cmd(unsigned char cmd)
|
|
|
|
{
|
|
|
|
push_simulator_cmd(cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool push_simulator_cmd(unsigned char cmd)
|
|
|
|
{
|
|
|
|
if (_sim_stack_place < MAX_STACK) {
|
2024-05-13 23:45:18 +00:00
|
|
|
_sim_commands[_sim_stack_place] = cmd;
|
2024-04-19 19:06:00 +00:00
|
|
|
_sim_stack_place++;
|
|
|
|
} else {
|
|
|
|
LOG(SIM_LOG, LOG_ERR, "Command queue overflow, too many unsent commands to RS control panel\n");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned char pop_simulator_cmd(unsigned char receive_type)
|
|
|
|
{
|
|
|
|
unsigned char cmd = NUL;
|
|
|
|
|
|
|
|
if (_sim_stack_place > 0 && receive_type == CMD_STATUS ) {
|
2024-05-13 23:45:18 +00:00
|
|
|
cmd = _sim_commands[0];
|
2024-04-19 19:06:00 +00:00
|
|
|
_sim_stack_place--;
|
2024-05-13 23:45:18 +00:00
|
|
|
memmove(&_sim_commands[0], &_sim_commands[1], sizeof(unsigned char) * _sim_stack_place ) ;
|
2024-04-19 19:06:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
LOG(SIM_LOG,LOG_DEBUG, "Sending '0x%02hhx' to controller\n", cmd);
|
|
|
|
return cmd;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool processSimulatorPacket(unsigned char *packet, int packet_length, struct aqualinkdata *aqdata)
|
|
|
|
{
|
|
|
|
// copy packed into buffer to be sent to web
|
|
|
|
//memset(aqdata->simulator_packet, 0, sizeof aqdata->simulator_packet);
|
|
|
|
memcpy(aqdata->simulator_packet, packet, packet_length);
|
|
|
|
aqdata->simulator_packet_length = packet_length;
|
|
|
|
|
|
|
|
if ( getLogLevel(SIM_LOG) >= LOG_DEBUG ) {
|
|
|
|
char buff[1000];
|
|
|
|
//sprintf("Sending control command:")
|
|
|
|
beautifyPacket(buff, packet, packet_length, false);
|
|
|
|
LOG(SIM_LOG,LOG_DEBUG, "Received message : %s", buff);
|
|
|
|
}
|
|
|
|
|
|
|
|
broadcast_simulator_message();
|
|
|
|
|
|
|
|
return true;
|
2024-04-21 03:11:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool start_simulator(struct aqualinkdata *aqdata, emulation_type type) {
|
|
|
|
|
2024-04-22 00:58:44 +00:00
|
|
|
// If we are a PDA panel and PDA sim, we are connected, so just set that
|
|
|
|
// since PDA only panel can only handle one remote ID.
|
|
|
|
if (isPDA_PANEL && type == AQUAPDA) {
|
|
|
|
aqdata->simulator_active = type;
|
|
|
|
aqdata->simulator_id = _aqconfig_.device_id;
|
|
|
|
}
|
|
|
|
|
2024-04-21 03:11:05 +00:00
|
|
|
// if type is same AND id is valid, sim is already started, their is nothing to do.
|
|
|
|
if (aqdata->simulator_active == type) {
|
|
|
|
if (aqdata->simulator_id >= 0x40 && aqdata->simulator_id <= 0x43) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "OneTouch Simulator already active!\n");
|
|
|
|
return true;
|
|
|
|
} else if (aqdata->simulator_id >= 0x08 && aqdata->simulator_id <= 0x0a) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "AllButton Simulator already active!\n");
|
|
|
|
return true;
|
|
|
|
} else if (aqdata->simulator_id >= 0x30 && aqdata->simulator_id <= 0x33) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "iAqualinkTouch Simulator already active!\n");
|
|
|
|
return true;
|
|
|
|
} else if (aqdata->simulator_id >= 0x60 && aqdata->simulator_id <= 0x63) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "PDA Simulator already active!\n");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check it's a valid request
|
|
|
|
if (type == ALLBUTTON) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "Starting AllButton Simulator!\n");
|
|
|
|
} else if (type == ONETOUCH) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "Starting OneTouch Simulator!\n");
|
|
|
|
} else if (type == AQUAPDA ) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "Starting PDA Simulator!\n");
|
|
|
|
} else if (type == IAQTOUCH) {
|
|
|
|
LOG(SIM_LOG,LOG_NOTICE, "Starting iAqualinkTouch Simulator!\n");
|
|
|
|
} else {
|
|
|
|
LOG(SIM_LOG,LOG_ERR, "Request to start simulator of unknown type : %d", type);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// start the simulator
|
|
|
|
aqdata->simulator_active = type;
|
|
|
|
aqdata->simulator_id = NUL;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool stop_simulator(struct aqualinkdata *aqdata) {
|
|
|
|
aqdata->simulator_active = SIM_NONE;
|
|
|
|
aqdata->simulator_id = NUL;
|
|
|
|
|
|
|
|
LOG(SIM_LOG,LOG_DEBUG, "Stoped Simulator Mode\n");
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool is_simulator_packet(struct aqualinkdata *aqdata, unsigned char *packet, int packet_length) {
|
|
|
|
|
|
|
|
if ( (aqdata->simulator_active == ONETOUCH && packet[PKT_DEST] >= 0x40 && packet[PKT_DEST] <= 0x43) ||
|
|
|
|
(aqdata->simulator_active == ALLBUTTON && packet[PKT_DEST] >= 0x08 && packet[PKT_DEST] <= 0x0a) ||
|
|
|
|
(aqdata->simulator_active == IAQTOUCH && packet[PKT_DEST] >= 0x30 && packet[PKT_DEST] <= 0x33) ||
|
|
|
|
(aqdata->simulator_active == AQUAPDA && packet[PKT_DEST] >= 0x60 && packet[PKT_DEST] <= 0x63) ) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
2024-04-19 19:06:00 +00:00
|
|
|
}
|