11
11
#include " ../main/SQLHelper.h"
12
12
13
13
#ifdef _DEBUG
14
- #define DEBUG_SatelIntegra
14
+ #define DEBUG_SatelIntegra
15
15
#endif
16
16
17
17
#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
56
56
memset (m_newData, 0 , sizeof (m_newData));
57
57
58
58
// 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)
60
60
{
61
61
m_zonesLastState[i] = false ;
62
62
m_outputsLastState[i] = false ;
63
63
m_isOutputSwitch[i] = false ;
64
64
m_isTemperature[i] = false ;
65
65
}
66
66
67
- for (unsigned int i = 0 ; i< 32 ; ++i)
67
+ for (unsigned int i = 0 ; i < 32 ; ++i)
68
68
{
69
69
m_isPartitions[i] = false ;
70
70
m_armLastState[i] = false ;
@@ -190,7 +190,7 @@ void SatelIntegra::Do_Work()
190
190
{
191
191
msec_poll_counter = 0 ;
192
192
#ifdef DEBUG_SatelIntegra
193
- _log.Log (LOG_STATUS, " Satel Integra: fetching changed data" );
193
+ _log.Log (LOG_STATUS, " Satel Integra: fetching changed data" );
194
194
#endif
195
195
196
196
if (ReadNewData ())
@@ -214,7 +214,7 @@ _log.Log(LOG_STATUS, "Satel Integra: fetching changed data");
214
214
ReadOutputsState ();
215
215
}
216
216
}
217
- // ReadEvents();
217
+ // ReadEvents();
218
218
}
219
219
220
220
if (msec_temp_counter >= SATEL_TEMP_POLL_INTERVAL_MS)
@@ -353,13 +353,10 @@ bool SatelIntegra::GetInfo()
353
353
cmd[0 ] = 0x7C ; // INT-RS/ETHM version
354
354
if (SendCommand (cmd, 1 , buffer, 13 ) > 0 )
355
355
{
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
360
357
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 " );
363
360
return true ;
364
361
}
365
362
else
@@ -405,7 +402,7 @@ bool SatelIntegra::ReadZonesState(const bool firstTime)
405
402
406
403
unsigned char cmd[1 ];
407
404
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 )
409
406
{
410
407
bool violate;
411
408
unsigned int byteNumber;
@@ -430,7 +427,7 @@ bool SatelIntegra::ReadZonesState(const bool firstTime)
430
427
unsigned char cmd[3 ];
431
428
cmd[0 ] = 0xEE ;
432
429
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
434
431
if (SendCommand (cmd, 3 , buffer, 21 ) > 0 )
435
432
{
436
433
m_isPartitions[buffer[20 ] - 1 ] = true ;
@@ -505,7 +502,7 @@ bool SatelIntegra::ReadTemperatures(const bool firstTime)
505
502
unsigned char cmd[3 ];
506
503
cmd[0 ] = 0xEE ;
507
504
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
509
506
if (SendCommand (cmd, 3 , buffer, 21 ) > 0 )
510
507
{
511
508
ReportTemperature (index + 1 , temp);
@@ -546,7 +543,7 @@ bool SatelIntegra::ReadOutputsState(const bool firstTime)
546
543
547
544
unsigned char cmd[1 ];
548
545
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 )
550
547
{
551
548
bool findBlindOutput = false ;
552
549
bool outputState;
@@ -576,7 +573,7 @@ bool SatelIntegra::ReadOutputsState(const bool firstTime)
576
573
unsigned char cmd[3 ];
577
574
cmd[0 ] = 0xEE ;
578
575
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
580
577
if (SendCommand (cmd, 3 , buffer, 20 ) > 0 )
581
578
{
582
579
if (buffer[3 ] != 0x00 )
@@ -736,7 +733,7 @@ bool SatelIntegra::ReadEvents()
736
733
int ret = SendCommand (cmd, 4 , buffer, 15 );
737
734
if (ret > 0 )
738
735
{
739
- std::string val (1 ,buffer[6 ]);
736
+ std::string val (1 , buffer[6 ]);
740
737
SendTextSensor (1 , 1 , 255 , val, " Events" );
741
738
}
742
739
else
@@ -776,7 +773,7 @@ void SatelIntegra::ReportOutputState(const int Idx, const bool state)
776
773
777
774
void SatelIntegra::ReportArmState (const int Idx, const bool isArm)
778
775
{
779
- m_armLastState[Idx- 1 ] = isArm;
776
+ m_armLastState[Idx - 1 ] = isArm;
780
777
781
778
SendGeneralSwitch (Idx, 2 , 255 , isArm ? gswitch_sOn : gswitch_sOff, 0 , " " );
782
779
}
@@ -1055,7 +1052,7 @@ void SatelIntegra::UpdateAlarmAndArmName()
1055
1052
std::vector<std::vector<std::string> > result;
1056
1053
1057
1054
// 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);
1059
1056
if (result.empty ())
1060
1057
{
1061
1058
// Assign name for Alarm
@@ -1066,20 +1063,20 @@ void SatelIntegra::UpdateAlarmAndArmName()
1066
1063
}
1067
1064
1068
1065
// Arm
1069
- for (unsigned int i = 0 ; i< 32 ; ++i)
1066
+ for (unsigned int i = 0 ; i < 32 ; ++i)
1070
1067
{
1071
1068
if (m_isPartitions[i])
1072
1069
{
1073
1070
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 );
1076
1073
if (result.empty ())
1077
1074
{
1078
1075
// Assign name for Arm
1079
1076
#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 );
1081
1078
#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);
1083
1080
}
1084
1081
}
1085
1082
}
@@ -1132,11 +1129,11 @@ int SatelIntegra::SendCommand(const unsigned char* cmd, const unsigned int cmdLe
1132
1129
{
1133
1130
_log.Log (LOG_ERROR, " Satel Integra: Send command '%02X' failed" , cmdPayload.first [2 ]);
1134
1131
DestroySocket ();
1135
- delete [] cmdPayload.first ;
1132
+ delete[] cmdPayload.first ;
1136
1133
return -1 ;
1137
1134
}
1138
1135
1139
- delete [] cmdPayload.first ;
1136
+ delete[] cmdPayload.first ;
1140
1137
1141
1138
unsigned char buffer[MAX_LENGTH_OF_ANSWER];
1142
1139
// Receive answer
@@ -1154,49 +1151,53 @@ int SatelIntegra::SendCommand(const unsigned char* cmd, const unsigned int cmdLe
1154
1151
return -1 ;
1155
1152
}
1156
1153
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
1160
1156
{
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);
1164
1165
1165
1166
// remove special chars
1166
1167
int offset = 0 ;
1167
- for (int i = 0 ; i < ret ; i++)
1168
+ for (int i = 0 ; i < totalRet ; i++)
1168
1169
{
1169
1170
buffer[i] = buffer[i + offset];
1170
1171
if (buffer[i] == 0xFE && buffer[i + 1 ] == 0xF0 )
1171
1172
{
1172
1173
++offset;
1173
- ret --;
1174
+ totalRet --;
1174
1175
}
1175
1176
}
1176
- buffer[ret ] = 0x00 ; // not needed but look nice :)
1177
+ buffer[totalRet ] = 0x00 ; // not needed but look nice :)
1177
1178
1178
- if (ret > 6 )
1179
+ if (totalRet > 6 )
1179
1180
{
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
1181
1182
{
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))
1185
1186
{
1186
1187
_log.Log (LOG_ERROR, " Satel Integra: bad data length received" );
1187
1188
return -1 ;
1188
1189
}
1189
1190
1190
1191
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
1192
1193
{
1193
1194
answer[i] = buffer[i + 2 ];
1194
1195
}
1195
- answerLength = ret - 6 ; // answer = frame - prefix - suffix - crc
1196
+ answerLength = totalRet - 6 ; // answer = frame - prefix - suffix - crc
1196
1197
1197
1198
unsigned short crc;
1198
1199
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
1200
1201
{
1201
1202
if (buffer[2 ] == 0xEF )
1202
1203
{
@@ -1256,7 +1257,7 @@ std::pair<unsigned char*, unsigned int> SatelIntegra::getFullFrame(const unsigne
1256
1257
{
1257
1258
std::list<unsigned char > result;
1258
1259
1259
- for (unsigned int i = 0 ; i< cmdLength; ++i)
1260
+ for (unsigned int i = 0 ; i < cmdLength; ++i)
1260
1261
{
1261
1262
result.push_back (pCmd[i]);
1262
1263
}
0 commit comments