Skip to content

Commit ffea4a7

Browse files
authored
Merge pull request #3133 from szczukot/Satel
[Satel Integra] fix for Inetgra256 and allow to change names
2 parents 65b4dd9 + 594429c commit ffea4a7

File tree

1 file changed

+45
-44
lines changed

1 file changed

+45
-44
lines changed

hardware/SatelIntegra.cpp

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "../main/SQLHelper.h"
1212

1313
#ifdef _DEBUG
14-
#define DEBUG_SatelIntegra
14+
#define DEBUG_SatelIntegra
1515
#endif
1616

1717
#define SATEL_TEMP_POLL_INTERVAL_MS 120*1000 // 120 sec
@@ -56,15 +56,15 @@ SatelIntegra::SatelIntegra(const int ID, const std::string &IPAddress, const uns
5656
memset(m_newData, 0, sizeof(m_newData));
5757

5858
// clear last local state of zones and outputs
59-
for (unsigned int i = 0; i< 256; ++i)
59+
for (unsigned int i = 0; i < 256; ++i)
6060
{
6161
m_zonesLastState[i] = false;
6262
m_outputsLastState[i] = false;
6363
m_isOutputSwitch[i] = false;
6464
m_isTemperature[i] = false;
6565
}
6666

67-
for (unsigned int i = 0; i< 32; ++i)
67+
for (unsigned int i = 0; i < 32; ++i)
6868
{
6969
m_isPartitions[i] = false;
7070
m_armLastState[i] = false;
@@ -190,7 +190,7 @@ void SatelIntegra::Do_Work()
190190
{
191191
msec_poll_counter = 0;
192192
#ifdef DEBUG_SatelIntegra
193-
_log.Log(LOG_STATUS, "Satel Integra: fetching changed data");
193+
_log.Log(LOG_STATUS, "Satel Integra: fetching changed data");
194194
#endif
195195

196196
if (ReadNewData())
@@ -214,7 +214,7 @@ _log.Log(LOG_STATUS, "Satel Integra: fetching changed data");
214214
ReadOutputsState();
215215
}
216216
}
217-
// ReadEvents();
217+
// ReadEvents();
218218
}
219219

220220
if (msec_temp_counter >= SATEL_TEMP_POLL_INTERVAL_MS)
@@ -353,13 +353,10 @@ bool SatelIntegra::GetInfo()
353353
cmd[0] = 0x7C; // INT-RS/ETHM version
354354
if (SendCommand(cmd, 1, buffer, 13) > 0)
355355
{
356-
if (buffer[12] == 1)
357-
{
358-
m_data32 = true;
359-
}
356+
m_data32 = ((buffer[12] & 1) == 1) && (m_modelIndex == 72); // supported and required 256 PLUS
360357

361-
_log.Log(LOG_STATUS, "Satel Integra: ETHM-1 ver. %c.%c%c %c%c%c%c-%c%c-%c%c",
362-
buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9], buffer[10], buffer[11]);
358+
_log.Log(LOG_STATUS, "Satel Integra: ETHM-1 ver. %c.%c%c %c%c%c%c-%c%c-%c%c (32 bytes mode = %s)",
359+
buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9], buffer[10], buffer[11], m_data32 ? "true" : "false");
363360
return true;
364361
}
365362
else
@@ -405,7 +402,7 @@ bool SatelIntegra::ReadZonesState(const bool firstTime)
405402

406403
unsigned char cmd[1];
407404
cmd[0] = 0x00; // read zones violation
408-
if (SendCommand(cmd, 1, buffer, 17, 33) > 0)
405+
if (SendCommand(cmd, 1, buffer, 17 + m_data32 * 16, 33) > 0)
409406
{
410407
bool violate;
411408
unsigned int byteNumber;
@@ -430,7 +427,7 @@ bool SatelIntegra::ReadZonesState(const bool firstTime)
430427
unsigned char cmd[3];
431428
cmd[0] = 0xEE;
432429
cmd[1] = 0x05;
433-
cmd[2] = (unsigned char)(index + 1);
430+
cmd[2] = (index != 255) ? (index + 1) : 0; // send 0 instead of 256 in INTEGRA 256 PLUS
434431
if (SendCommand(cmd, 3, buffer, 21) > 0)
435432
{
436433
m_isPartitions[buffer[20] - 1] = true;
@@ -505,7 +502,7 @@ bool SatelIntegra::ReadTemperatures(const bool firstTime)
505502
unsigned char cmd[3];
506503
cmd[0] = 0xEE;
507504
cmd[1] = 0x05;
508-
cmd[2] = (unsigned char)(index + 1);
505+
cmd[2] = (index != 255) ? (index + 1) : 0; // send 0 instead of 256 in INTEGRA 256 PLUS
509506
if (SendCommand(cmd, 3, buffer, 21) > 0)
510507
{
511508
ReportTemperature(index + 1, temp);
@@ -546,7 +543,7 @@ bool SatelIntegra::ReadOutputsState(const bool firstTime)
546543

547544
unsigned char cmd[1];
548545
cmd[0] = 0x17; // read outputs state
549-
if (SendCommand(cmd, 1, buffer, 17, 33) > 0)
546+
if (SendCommand(cmd, 1, buffer, 17 + m_data32 * 16, 33) > 0)
550547
{
551548
bool findBlindOutput = false;
552549
bool outputState;
@@ -576,7 +573,7 @@ bool SatelIntegra::ReadOutputsState(const bool firstTime)
576573
unsigned char cmd[3];
577574
cmd[0] = 0xEE;
578575
cmd[1] = 0x04;
579-
cmd[2] = (unsigned char)(index + 1);
576+
cmd[2] = (index != 255) ? (index + 1) : 0; // send 0 instead of 256 in INTEGRA 256 PLUS
580577
if (SendCommand(cmd, 3, buffer, 20) > 0)
581578
{
582579
if (buffer[3] != 0x00)
@@ -736,7 +733,7 @@ bool SatelIntegra::ReadEvents()
736733
int ret = SendCommand(cmd, 4, buffer, 15);
737734
if (ret > 0)
738735
{
739-
std::string val(1,buffer[6]);
736+
std::string val(1, buffer[6]);
740737
SendTextSensor(1, 1, 255, val, "Events");
741738
}
742739
else
@@ -776,7 +773,7 @@ void SatelIntegra::ReportOutputState(const int Idx, const bool state)
776773

777774
void SatelIntegra::ReportArmState(const int Idx, const bool isArm)
778775
{
779-
m_armLastState[Idx-1] = isArm;
776+
m_armLastState[Idx - 1] = isArm;
780777

781778
SendGeneralSwitch(Idx, 2, 255, isArm ? gswitch_sOn : gswitch_sOff, 0, "");
782779
}
@@ -1055,7 +1052,7 @@ void SatelIntegra::UpdateAlarmAndArmName()
10551052
std::vector<std::vector<std::string> > result;
10561053

10571054
// Alarm
1058-
result = m_sql.safe_query("SELECT Name FROM DeviceStatus WHERE (HardwareID==%d) AND (DeviceID=='Alarm') AND (Name=='Alarm') AND (Unit=2)", m_HwdID);
1055+
result = m_sql.safe_query("SELECT Name FROM DeviceStatus WHERE (HardwareID==%d) AND (DeviceID=='Alarm') AND (Name!='Unknown') AND (Unit=2)", m_HwdID);
10591056
if (result.empty())
10601057
{
10611058
//Assign name for Alarm
@@ -1066,20 +1063,20 @@ void SatelIntegra::UpdateAlarmAndArmName()
10661063
}
10671064

10681065
//Arm
1069-
for (unsigned int i = 0; i< 32; ++i)
1066+
for (unsigned int i = 0; i < 32; ++i)
10701067
{
10711068
if (m_isPartitions[i])
10721069
{
10731070
char szTmp[10];
1074-
sprintf(szTmp, "%08X", (int)i+1);
1075-
result = m_sql.safe_query("SELECT Name FROM DeviceStatus WHERE (HardwareID==%d) AND (DeviceID=='%q') AND (Name=='Arm %d partition') AND (Unit=2)", m_HwdID, szTmp, i+1);
1071+
sprintf(szTmp, "%08X", (int)i + 1);
1072+
result = m_sql.safe_query("SELECT Name FROM DeviceStatus WHERE (HardwareID==%d) AND (DeviceID=='%q') AND (Name!='Unknown') AND (Unit=2)", m_HwdID, szTmp, i + 1);
10761073
if (result.empty())
10771074
{
10781075
//Assign name for Arm
10791076
#ifdef DEBUG_SatelIntegra
1080-
_log.Log(LOG_STATUS, "Satel Integra: update Arm name to 'Arm %d partition'", i+1);
1077+
_log.Log(LOG_STATUS, "Satel Integra: update Arm name to 'Arm %d partition'", i + 1);
10811078
#endif
1082-
m_sql.safe_query("UPDATE DeviceStatus SET Name='Arm %d partition' WHERE (HardwareID==%d) AND (DeviceID=='%q') AND (Unit=2)", i+1, m_HwdID, szTmp);
1079+
m_sql.safe_query("UPDATE DeviceStatus SET Name='Arm %d partition' WHERE (HardwareID==%d) AND (DeviceID=='%q') AND (Unit=2)", i + 1, m_HwdID, szTmp);
10831080
}
10841081
}
10851082
}
@@ -1132,11 +1129,11 @@ int SatelIntegra::SendCommand(const unsigned char* cmd, const unsigned int cmdLe
11321129
{
11331130
_log.Log(LOG_ERROR, "Satel Integra: Send command '%02X' failed", cmdPayload.first[2]);
11341131
DestroySocket();
1135-
delete [] cmdPayload.first;
1132+
delete[] cmdPayload.first;
11361133
return -1;
11371134
}
11381135

1139-
delete [] cmdPayload.first;
1136+
delete[] cmdPayload.first;
11401137

11411138
unsigned char buffer[MAX_LENGTH_OF_ANSWER];
11421139
// Receive answer
@@ -1154,49 +1151,53 @@ int SatelIntegra::SendCommand(const unsigned char* cmd, const unsigned int cmdLe
11541151
return -1;
11551152
}
11561153

1157-
int ret = recv(m_socket, (char*)&buffer, MAX_LENGTH_OF_ANSWER, 0);
1158-
1159-
if ((ret <= 0) || (ret >= MAX_LENGTH_OF_ANSWER))
1154+
int totalRet = 0;
1155+
do
11601156
{
1161-
_log.Log(LOG_ERROR, "Satel Integra: bad data length received (-1)");
1162-
return -1;
1163-
}
1157+
int ret = recv(m_socket, (char*)&buffer, MAX_LENGTH_OF_ANSWER - totalRet, 0);
1158+
totalRet += ret;
1159+
if ((ret <= 0) || (totalRet >= MAX_LENGTH_OF_ANSWER))
1160+
{
1161+
_log.Log(LOG_ERROR, "Satel Integra: bad data length received (-1)");
1162+
return -1;
1163+
}
1164+
} while (totalRet < expectedLength1);
11641165

11651166
// remove special chars
11661167
int offset = 0;
1167-
for (int i = 0; i < ret; i++)
1168+
for (int i = 0; i < totalRet; i++)
11681169
{
11691170
buffer[i] = buffer[i + offset];
11701171
if (buffer[i] == 0xFE && buffer[i + 1] == 0xF0)
11711172
{
11721173
++offset;
1173-
ret--;
1174+
totalRet--;
11741175
}
11751176
}
1176-
buffer[ret] = 0x00; // not needed but look nice :)
1177+
buffer[totalRet] = 0x00; // not needed but look nice :)
11771178

1178-
if (ret > 6)
1179+
if (totalRet > 6)
11791180
{
1180-
if (buffer[0] == 0xFE && buffer[1] == 0xFE && buffer[ret - 1] == 0x0D && buffer[ret - 2] == 0xFE) // check prefix and sufix
1181+
if (buffer[0] == 0xFE && buffer[1] == 0xFE && buffer[totalRet - 1] == 0x0D && buffer[totalRet - 2] == 0xFE) // check prefix and sufix
11811182
{
1182-
if ( (buffer[2] != 0xEF)
1183-
&& ((ret - 6) != expectedLength1)
1184-
&& ((ret - 6) != expectedLength2))
1183+
if ((buffer[2] != 0xEF)
1184+
&& ((totalRet - 6) != expectedLength1)
1185+
&& ((totalRet - 6) != expectedLength2))
11851186
{
11861187
_log.Log(LOG_ERROR, "Satel Integra: bad data length received");
11871188
return -1;
11881189
}
11891190

11901191
unsigned int answerLength = 0;
1191-
for (int i = 0; i < ret - 6; i++) // skip prefix, suffix and crc
1192+
for (int i = 0; i < totalRet - 6; i++) // skip prefix, suffix and crc
11921193
{
11931194
answer[i] = buffer[i + 2];
11941195
}
1195-
answerLength = ret - 6; // answer = frame - prefix - suffix - crc
1196+
answerLength = totalRet - 6; // answer = frame - prefix - suffix - crc
11961197

11971198
unsigned short crc;
11981199
calculateCRC(answer, answerLength, crc);
1199-
if ((crc & 0xFF) == buffer[ret - 3] && (crc >> 8) == buffer[ret - 4]) // check crc
1200+
if ((crc & 0xFF) == buffer[totalRet - 3] && (crc >> 8) == buffer[totalRet - 4]) // check crc
12001201
{
12011202
if (buffer[2] == 0xEF)
12021203
{
@@ -1256,7 +1257,7 @@ std::pair<unsigned char*, unsigned int> SatelIntegra::getFullFrame(const unsigne
12561257
{
12571258
std::list<unsigned char> result;
12581259

1259-
for (unsigned int i = 0; i< cmdLength; ++i)
1260+
for (unsigned int i = 0; i < cmdLength; ++i)
12601261
{
12611262
result.push_back(pCmd[i]);
12621263
}

0 commit comments

Comments
 (0)