The files contained in this repository can be downloaded to your computer using a svn client.
On Linux you simply type the command displayed below.

This URL has Read-Only access.

Statistics
| Revision:

root / trunk / DomotiGa / CDSC.class @ 788

History | View | Annotate | Download (20.1 kB)

1 141 rdnzl
' Gambas class file
2 141 rdnzl
3 141 rdnzl
' Description:
4 141 rdnzl
' CDSC.class
5 141 rdnzl
' Support for DSC Security Panels.
6 141 rdnzl
7 141 rdnzl
' Development Status:
8 141 rdnzl
' Beta. Needs Testing.
9 141 rdnzl
10 141 rdnzl
' DomotiGa - an open source home automation program.
11 293 rdnzl
' Copyright(C) 2008-2010 Ron Klinkien
12 415 rdnzl
13 307 rdnzl
' This module is written by and Copyright(C) 2009-2010 Timo Sariwating
14 141 rdnzl
15 141 rdnzl
' Read file called COPYING for license details.
16 141 rdnzl
17 141 rdnzl
PROPERTY Port AS String
18 141 rdnzl
PROPERTY Baud AS String
19 141 rdnzl
PROPERTY DSCDebug AS Boolean
20 141 rdnzl
21 141 rdnzl
PRIVATE sPort AS String
22 141 rdnzl
PRIVATE sBaud AS String
23 141 rdnzl
PRIVATE bDSCDebug AS Boolean
24 141 rdnzl
25 141 rdnzl
PUBLIC hDSC AS NEW SerialPort
26 141 rdnzl
PUBLIC tDSC AS NEW Timer
27 141 rdnzl
28 141 rdnzl
PUBLIC sBuffer AS String
29 141 rdnzl
30 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31 141 rdnzl
' open serial port
32 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33 141 rdnzl
PUBLIC FUNCTION Connect() AS Boolean
34 141 rdnzl
35 141 rdnzl
  ' try to close the port
36 141 rdnzl
  TRY hDSC.Close
37 141 rdnzl
38 141 rdnzl
  ' get a new one
39 141 rdnzl
  hDSC = NEW Serialport AS "DSC"
40 141 rdnzl
41 141 rdnzl
  WITH hDSC
42 141 rdnzl
    .PortName = sPort
43 141 rdnzl
    .Speed = sBaud
44 141 rdnzl
    .Parity = 0
45 141 rdnzl
    .DataBits = 8
46 141 rdnzl
    .StopBits = 1
47 141 rdnzl
    .EndOfLine = 1
48 141 rdnzl
    .Open()
49 141 rdnzl
  END WITH
50 141 rdnzl
51 141 rdnzl
  DSC_Descriptive_Arming()
52 141 rdnzl
  DSC_System_Time()
53 171 rdnzl
  DSC_LCDText()
54 148 rdnzl
  TX("001")
55 141 rdnzl
56 141 rdnzl
   ' start poll timer for DSC status LED
57 141 rdnzl
  tDSC = NEW Timer AS "tDSCLED"
58 141 rdnzl
  tDSC.Delay = 250
59 141 rdnzl
  tDSC.Stop
60 141 rdnzl
61 141 rdnzl
  ' all ok
62 141 rdnzl
  RETURN TRUE
63 141 rdnzl
64 141 rdnzl
CATCH ' some errors
65 245 rdnzl
  Main.WriteLog(("DSC Error: ") & ERROR.Text)
66 141 rdnzl
  RETURN FALSE
67 141 rdnzl
68 141 rdnzl
END
69 141 rdnzl
70 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71 141 rdnzl
' Enable Descriptive Arming
72 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 141 rdnzl
PUBLIC SUB DSC_Descriptive_Arming()
74 141 rdnzl
75 141 rdnzl
  TX("0501")
76 245 rdnzl
  Main.WriteDebugLog(("[DSC] Descriptive Arming Enabled"))
77 141 rdnzl
78 141 rdnzl
END
79 141 rdnzl
80 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 141 rdnzl
' Send System Time to DSC Panel
82 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83 141 rdnzl
PUBLIC SUB DSC_System_Time()
84 141 rdnzl
85 141 rdnzl
  DIM sTime_Now AS String
86 141 rdnzl
87 141 rdnzl
  sTime_Now = "010" & Format$(Now, "hhnnmmddyy")
88 141 rdnzl
  TX(sTime_Now)
89 245 rdnzl
  Main.WriteDebugLog(("[DSC] System time set to ") & Now & (" on alarm system"))
90 141 rdnzl
91 141 rdnzl
END
92 141 rdnzl
93 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
94 141 rdnzl
' Read Serial Port
95 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
96 141 rdnzl
PUBLIC SUB DSC_Read()
97 141 rdnzl
98 141 rdnzl
  DIM sData AS String
99 141 rdnzl
100 141 rdnzl
  READ #hDSC, sData, 1
101 141 rdnzl
  IF sData = Chr(10) THEN ' buffer until newline then parse
102 141 rdnzl
    IF Len(sBuffer) > 1 THEN RX(sBuffer)
103 141 rdnzl
    sBuffer = NULL
104 141 rdnzl
  ELSE
105 141 rdnzl
    sBuffer &= sData
106 141 rdnzl
  END IF
107 141 rdnzl
108 141 rdnzl
END
109 141 rdnzl
110 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111 171 rdnzl
' RX - Process the Received Data
112 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
113 141 rdnzl
PUBLIC SUB RX(sStr AS String)
114 141 rdnzl
115 148 rdnzl
  DIM sString, sCommand, sData, sChecksum, sCheckSumCalculating, sCheckSumCalculated AS String
116 307 rdnzl
  DIM iCheckSumFloat, iInd, iDeviceId, iVirtDeviceId AS Integer
117 141 rdnzl
118 141 rdnzl
  ' read rs-232 datastream
119 141 rdnzl
  sCommand = Left$(sStr, 3)
120 141 rdnzl
  sData = Left$(Mid$(sStr, 4, Len(sStr)), -3)
121 141 rdnzl
  sChecksum = Right$(sStr, 3)
122 141 rdnzl
123 141 rdnzl
  ' calculate checksum
124 141 rdnzl
  FOR iInd = 1 TO Len(sCommand)
125 141 rdnzl
    sCheckSumCalculating = Asc(Mid$(sCommand, iInd, 1))
126 262 rdnzl
    iCheckSumFloat = iCheckSumFloat + sCheckSumCalculating
127 141 rdnzl
  NEXT
128 141 rdnzl
    FOR iInd = 1 TO Len(sData)
129 141 rdnzl
    sCheckSumCalculating = Asc(Mid$(sData, iInd, 1))
130 262 rdnzl
    iCheckSumFloat = iCheckSumFloat + sCheckSumCalculating
131 141 rdnzl
  NEXT
132 262 rdnzl
  sCheckSumCalculated = Right$(Hex$(iCheckSumFloat), 2)
133 141 rdnzl
134 141 rdnzl
  ' process if checksum is ok
135 141 rdnzl
  IF Val(sChecksum) = Val(sCheckSumCalculated)
136 307 rdnzl
137 307 rdnzl
    iVirtDeviceId = Devices.FindVirtualDeviceID("securitysystem")
138 307 rdnzl
139 141 rdnzl
    SELECT CASE sCommand
140 141 rdnzl
      CASE 500
141 245 rdnzl
        Main.WriteLog(("[DSC] Command Acknowledge ") & sData)
142 141 rdnzl
      CASE 501
143 245 rdnzl
        Main.WriteLog(("[DSC] Bad Checksum [501]"))
144 141 rdnzl
      CASE 502
145 141 rdnzl
        Error_Code(sData)
146 141 rdnzl
      CASE 550
147 245 rdnzl
        Main.WriteDebugLog(("[DSC] System Time ") & sData)
148 141 rdnzl
      CASE 561
149 245 rdnzl
        Main.WriteDebugLog(("[DSC] Indoor Temperature ") & sData)
150 141 rdnzl
      CASE 562
151 245 rdnzl
        Main.WriteDebugLog(("[DSC] Outdoor Temperature ") & sData)
152 141 rdnzl
      CASE 601
153 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & Left$(sData, 1) & (" Zone ") & Right$(sData, -1) & (" !ALARM!"))
154 693 rdnzl
        iDeviceId = Devices.Find(Right$(sData, -1), Devices.FindInterface("DSC5401 Interface"), "DSC DWS")
155 293 rdnzl
        IF iDeviceId THEN
156 293 rdnzl
          TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System in Alarm <>", Devices.FindNameForDevice(iDeviceId))
157 307 rdnzl
          IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "!ALARM!", "", Devices.FindNameForDevice(iDeviceId), "")
158 339 rdnzl
          IF Main.bSMSEnabled THEN Main.SendSMS(("DomotiGa: Security System is in Alarm! Zone: " & Devices.FindNameForDevice(iDeviceId)), Main.sSMSContact)
159 293 rdnzl
        ELSE
160 293 rdnzl
          TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System in Alarm <>", ("Zone " & Right$(sData, -1)))
161 307 rdnzl
          IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "!ALARM!", "", "Zone " & Right$(sData, -1), "")
162 339 rdnzl
          IF Main.bSMSEnabled THEN Main.SendSMS(("DomotiGa: Security System is in Alarm! Zone: " & Right$(sData, -1)), Main.sSMSContact)
163 293 rdnzl
        END IF
164 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
165 141 rdnzl
      CASE 602
166 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & Left$(sData, 1) & (" Zone ") & Right$(sData, -1) & (" Alarm Restored"))
167 141 rdnzl
      CASE 603
168 693 rdnzl
        iDeviceId = Devices.Find(Right$(sData, -1), Devices.FindInterface("DSC5401 Interface"), "DSC DWS")
169 148 rdnzl
        IF iDeviceId THEN
170 245 rdnzl
          Main.WriteLog(("[DSC] Partition ") & Left$(sData, 1) & (" Zone ") & Right$(sData, -1) & " " & Devices.FindNameForDevice(iDeviceId) & (" Tamper"))
171 148 rdnzl
          Devices.ValueUpdate(iDeviceId, "", "Tamper", "", "")
172 148 rdnzl
        END IF
173 141 rdnzl
      CASE 604
174 693 rdnzl
        iDeviceId = Devices.Find(Right$(sData, -1), Devices.FindInterface("DSC5401 Interface"), "DSC DWS")
175 148 rdnzl
        IF iDeviceId THEN
176 245 rdnzl
          Main.WriteDebugLog(("[DSC] Partition ") & Left$(sData, 1) & (" Zone ") & Right$(sData, -1) & " " & Devices.FindNameForDevice(iDeviceId) & (" Tamper Restored"))
177 148 rdnzl
          Devices.ValueUpdate(iDeviceId, "", "Secure", "", "")
178 148 rdnzl
        END IF
179 141 rdnzl
      CASE 605
180 245 rdnzl
        Main.WriteDebugLog(("[DSC] Zone ") & sData & (" Fault"))
181 141 rdnzl
      CASE 606
182 245 rdnzl
        Main.WriteDebugLog(("[DSC] Zone ") & sData & (" Fault Restored"))
183 148 rdnzl
      CASE 609
184 693 rdnzl
        iDeviceId = Devices.Find(sData, Devices.FindInterface("DSC5401 Interface"), "DSC PIR")
185 148 rdnzl
        IF bDSCDebug AND iDeviceId THEN
186 245 rdnzl
          Main.WriteDebugLog(("[DSC] Zone ") & sData & " " & Devices.FindNameForDevice(iDeviceId) & (" Open"))
187 148 rdnzl
        END IF
188 148 rdnzl
        IF iDeviceId THEN
189 293 rdnzl
          Devices.ValueUpdate(iDeviceId, "Motion", "", "", "")
190 148 rdnzl
        END IF
191 148 rdnzl
      CASE 610
192 693 rdnzl
        iDeviceId = Devices.Find(sData, Devices.FindInterface("DSC5401 Interface"), "DSC PIR")
193 148 rdnzl
        IF bDSCDebug AND iDeviceId THEN
194 245 rdnzl
          Main.WriteDebugLog(("[DSC] Zone ") & sData & " " & Devices.FindNameForDevice(iDeviceId) & (" Restored"))
195 148 rdnzl
        END IF
196 148 rdnzl
        IF iDeviceId THEN
197 148 rdnzl
          Devices.ValueUpdate(iDeviceId, "No Motion", "", "", "")
198 148 rdnzl
        END IF
199 148 rdnzl
      CASE 620
200 148 rdnzl
        IF bDSCDebug THEN
201 245 rdnzl
          Main.WriteDebugLog(("[DSC] Duress Alarm ") & sData)
202 148 rdnzl
        END IF
203 141 rdnzl
      CASE 621
204 245 rdnzl
        Main.WriteLog(("[DSC] Fire Alarm Key Activated"))
205 141 rdnzl
      CASE 622
206 245 rdnzl
        Main.WriteDebugLog(("[DSC] Fire Alarm Key Restored"))
207 141 rdnzl
      CASE 623
208 245 rdnzl
        Main.WriteLog(("[DSC] Key Alarm Key Activated"))
209 141 rdnzl
      CASE 624
210 245 rdnzl
        Main.WriteDebugLog(("[DSC] Key Alarm Restored"))
211 141 rdnzl
      CASE 625
212 245 rdnzl
        Main.WriteLog(("[DSC] Panic Key Alarm Activated"))
213 141 rdnzl
      CASE 626
214 245 rdnzl
        Main.WriteDebugLog(("[DSC] Panel Key Alarm Restored"))
215 141 rdnzl
      CASE 631
216 245 rdnzl
        Main.WriteDebugLog(("[DSC] 2-Wire Smoke Alarm Activated"))
217 693 rdnzl
        iDeviceId = Devices.Find(sData, Devices.FindInterface("DSC5401 Interface"), "DSC SMOKE")
218 693 rdnzl
        IF iDeviceId THEN
219 693 rdnzl
          Devices.ValueUpdate(iDeviceId, "Panic", "", "", "")
220 693 rdnzl
        END IF
221 141 rdnzl
      CASE 632
222 245 rdnzl
        Main.WriteDebugLog(("[DSC] 2-Wire Smoke Alarm Restored"))
223 693 rdnzl
        iDeviceId = Devices.Find(sData, Devices.FindInterface("DSC5401 Interface"), "DSC SMOKE")
224 693 rdnzl
        IF iDeviceId THEN
225 693 rdnzl
          Devices.ValueUpdate(iDeviceId, "Normal", "", "", "")
226 693 rdnzl
        END IF
227 148 rdnzl
      CASE 650
228 148 rdnzl
        IF bDSCDebug THEN
229 148 rdnzl
          Main.WriteDebugLog("[DSC] Partition " & sData & " Ready")
230 148 rdnzl
        END IF
231 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET ready = TRUE WHERE id = 0")
232 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "Ready", "", "")
233 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
234 148 rdnzl
      CASE 651
235 148 rdnzl
        IF bDSCDebug THEN
236 293 rdnzl
          Main.WriteDebugLog(("[DSC] Partition ") & sData & (" Not Ready"))
237 148 rdnzl
        END IF
238 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET ready = FALSE WHERE id = 0")
239 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "Not Ready", "", "")
240 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
241 141 rdnzl
      CASE 652
242 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET ready = FALSE, armed = TRUE WHERE id = 0")
243 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", " ", "", "")
244 141 rdnzl
        SELECT CASE Right$(sData)
245 307 rdnzl
          CASE 0
246 307 rdnzl
            Main.WriteLog(("[DSC] Partition ") & Left$(sData) & (" Armed Away"))
247 307 rdnzl
            TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System Armed", "in Away Mode <>")
248 307 rdnzl
            IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Armed Away", "", "", "")
249 307 rdnzl
            Main.BroadcastEvent("[SecurityUpdate]")
250 307 rdnzl
          CASE 1
251 307 rdnzl
            Main.WriteLog(("[DSC] Partition ") & Left$(sData) & (" Armed Stay"))
252 307 rdnzl
            TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System Armed", "in Stay Mode <>")
253 307 rdnzl
            IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Armed Stay", "", "", "")
254 307 rdnzl
            Main.BroadcastEvent("[SecurityUpdate]")
255 307 rdnzl
          CASE 2
256 307 rdnzl
            Main.WriteLog(("[DSC] Partition ") & Left$(sData) & (" Armed Zero Entry Away"))
257 307 rdnzl
            TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System Armed", "in Zero Entry Away Mode <>")
258 307 rdnzl
            IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Armed Zero Entry Away", "", "", "")
259 307 rdnzl
            Main.BroadcastEvent("[SecurityUpdate]")
260 307 rdnzl
          CASE 3
261 307 rdnzl
            Main.WriteLog(("[DSC] Partition ") & Left$(sData) & (" Armed Zero Entry Stay"))
262 307 rdnzl
            TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "System Armed", "in Zero Entry Stay Mode <>")
263 307 rdnzl
            IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Armed Zero Entry Stay", "", "", "")
264 307 rdnzl
            Main.BroadcastEvent("[SecurityUpdate]")
265 141 rdnzl
        END SELECT
266 141 rdnzl
      CASE 654
267 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & sData & (" !ALARM!"))
268 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "!ALARM!", "Partition " & sData, "", "")
269 141 rdnzl
      CASE 655
270 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & sData & (" Disarmed"))
271 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET ready = TRUE, armed = FALSE WHERE id = 0")
272 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Disarmed", "Ready", "", "")
273 171 rdnzl
        DSC_LCDText()
274 141 rdnzl
      CASE 656
275 245 rdnzl
        Main.WriteLog(("[DSC] Exit Delay Partition ") & sData)
276 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET armed = TRUE, lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "Exit Delay in", "Progress")
277 309 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Exit Delay", "Arming", "", "")
278 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
279 141 rdnzl
      CASE 657
280 245 rdnzl
        Main.WriteLog(("[DSC] Entry Delay Partition ") & sData)
281 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "Entry Active", "Enter Your Code")
282 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Entry Delay", "", "", "")
283 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate] Entry")
284 141 rdnzl
      CASE 658
285 245 rdnzl
        Main.WriteLog(("[DSC] Keypad Lock-out Partition ") & sData)
286 141 rdnzl
      CASE 670
287 245 rdnzl
        Main.WriteLog(("[DSC] Invalid Acces Code Partition ") & sData)
288 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "Invalid Access Code", "")
289 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "Invalid Access Code", "", "", "")
290 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
291 141 rdnzl
      CASE 671
292 245 rdnzl
        Main.WriteDebugLog(("[DSC] Function Not Available Partition ") & sData)
293 141 rdnzl
      CASE 700
294 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & Left$(sData, 1) & (" armed by user ") & Right$(sData, -1))
295 141 rdnzl
      CASE 701
296 245 rdnzl
        Main.WriteLog(("[DSC] Special Closing Partition ") & sData)
297 141 rdnzl
      CASE 702
298 245 rdnzl
        Main.WriteLog(("[DSC] Partial Closing Partition ") & sData)
299 141 rdnzl
      CASE 750
300 245 rdnzl
        Main.WriteLog(("[DSC] Partition ") & Left$(sData, 1) & (" disarmed by user ") & Right$(sData, -1))
301 141 rdnzl
      CASE 751
302 245 rdnzl
        Main.WriteLog(("[DSC] Special Opening Partition ") & sData)
303 141 rdnzl
      CASE 800
304 245 rdnzl
        Main.WriteLog(("[DSC] Panel Battery Trouble"))
305 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "Battery Trouble", "")
306 141 rdnzl
      CASE 801
307 245 rdnzl
        Main.WriteDebugLog(("[DSC] Panel Battery Trouble Restore"))
308 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
309 141 rdnzl
      CASE 802
310 245 rdnzl
        Main.WriteLog(("[DSC] Panel AC Trouble"))
311 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "AC Trouble", "")
312 141 rdnzl
      CASE 803
313 245 rdnzl
        Main.WriteLog(("[DSC] Panel AC Trouble Restore"))
314 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
315 141 rdnzl
      CASE 806
316 245 rdnzl
        Main.WriteLog(("[DSC] System Bell Trouble"))
317 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "Bell Trouble", "")
318 141 rdnzl
      CASE 807
319 245 rdnzl
        Main.WriteDebugLog(("[DSC] System Bell Trouble Restored"))
320 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
321 141 rdnzl
      CASE 810
322 245 rdnzl
        Main.WriteLog(("[DSC] TLM Trouble"))
323 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "TLM Trouble", "")
324 141 rdnzl
      CASE 811
325 245 rdnzl
        Main.WriteDebugLog(("[DSC] TLM Trouble Restored"))
326 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
327 141 rdnzl
      CASE 812
328 245 rdnzl
        Main.WriteLog(("[DSC] TLM Line 2 Trouble"))
329 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "TLM Line 2 Trouble", "")
330 141 rdnzl
      CASE 813
331 245 rdnzl
        Main.WriteDebugLog(("[DSC] TLM Line 2 Trouble Restored"))
332 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
333 141 rdnzl
      CASE 814
334 245 rdnzl
        Main.WriteLog(("[DSC] FTC Trouble"))
335 141 rdnzl
      CASE 816
336 245 rdnzl
        Main.WriteLog(("[DSC] Event Buffer Near Full"))
337 141 rdnzl
      CASE 821
338 245 rdnzl
        Main.WriteLog(("[DSC] Wireless Low Battery Zone ") & sData)
339 141 rdnzl
      CASE 822
340 245 rdnzl
        Main.WriteDebugLog(("[DSC] Wireless Low Battery Restore Zone ") & sData)
341 141 rdnzl
      CASE 825
342 245 rdnzl
        Main.WriteLog(("[DSC] Wireless Low Battery Key ") & sData)
343 141 rdnzl
      CASE 826
344 245 rdnzl
        Main.WriteDebugLog(("[DSC] Wireless Low Battery Restore Key ") & sData)
345 141 rdnzl
      CASE 827
346 245 rdnzl
        Main.WriteLog(("[DSC] Wireless Low Battery Handheld ") & sData)
347 141 rdnzl
      CASE 828
348 245 rdnzl
        Main.WriteDebugLog(("[DSC] Wireless Low Battery Restore Handheld ") & sData)
349 141 rdnzl
      CASE 829
350 245 rdnzl
        Main.WriteLog(("[DSC] General System Tamper"))
351 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "System Tamper", "")
352 141 rdnzl
      CASE 830
353 245 rdnzl
        Main.WriteDebugLog(("[DSC] General System Tamper Restored"))
354 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
355 141 rdnzl
      CASE 831
356 245 rdnzl
        Main.WriteLog(("[DSC] ESCORT 5580TC Trouble"))
357 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "ESCORT 5580TC Trouble", "")
358 141 rdnzl
      CASE 832
359 245 rdnzl
        Main.WriteDebugLog(("[DSC] ESCORT 5580TC Trouble Restored"))
360 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
361 141 rdnzl
      CASE 840
362 245 rdnzl
        Main.WriteDebugLog(("[DSC] Trouble Status Partition ") & sData)
363 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET trouble = TRUE WHERE id = 0")
364 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "Trouble " & sData, "")
365 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
366 141 rdnzl
      CASE 841
367 245 rdnzl
        Main.WriteDebugLog(("[DSC] Trouble Status Partition ") & sData & (" Restored"))
368 293 rdnzl
        TRY Main.hDB.Exec("UPDATE security SET trouble = FALSE WHERE id = 0")
369 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
370 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate]")
371 141 rdnzl
      CASE 842
372 245 rdnzl
        Main.WriteLog(("[DSC] Fire Trouble Alarm"))
373 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", "Fire Trouble", "")
374 141 rdnzl
      CASE 843
375 245 rdnzl
        Main.WriteDebugLog(("[DSC] Fire Trouble Restored"))
376 307 rdnzl
        IF iVirtDeviceId THEN Devices.ValueUpdate(iVirtDeviceId, "", "", " ", "")
377 141 rdnzl
      CASE 900
378 245 rdnzl
        Main.WriteLog(("[DSC] Code Required"))
379 293 rdnzl
        Main.BroadcastEvent("[SecurityUpdate] Entry")
380 261 rdnzl
    END SELECT
381 293 rdnzl
    ' checksum not ok
382 148 rdnzl
  ELSE
383 245 rdnzl
    Main.WriteDebugLog(("[DSC] Bad CheckSum"))
384 141 rdnzl
  END IF
385 141 rdnzl
386 339 rdnzl
  Main.ControlLed("DSC", "On")
387 141 rdnzl
  tDSC.Start
388 141 rdnzl
389 141 rdnzl
END
390 141 rdnzl
391 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
392 141 rdnzl
' Process Error Codes
393 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
394 141 rdnzl
PUBLIC SUB Error_Code(sStr AS String)
395 141 rdnzl
396 141 rdnzl
  SELECT CASE Val(sStr)
397 141 rdnzl
    CASE 000
398 245 rdnzl
      Main.WriteLog(("[DSC] System Error - No Error"))
399 141 rdnzl
    CASE 001
400 245 rdnzl
      Main.WriteLog(("[DSC] System Error - RS-232 Receive Buffer Overrun"))
401 141 rdnzl
    CASE 002
402 245 rdnzl
      Main.WriteLog(("[DSC] System Error - RS-232 Receive Buffer Overfow"))
403 141 rdnzl
    CASE 003
404 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Transmit Buffer Overrun"))
405 141 rdnzl
    CASE 010
406 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Transmit Buffer Overrun"))
407 141 rdnzl
    CASE 011
408 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Transmit Time Timeout"))
409 141 rdnzl
    CASE 012
410 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Transmit Mode Timeout"))
411 141 rdnzl
    CASE 013
412 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Transmit Keystring Timeout"))
413 141 rdnzl
    CASE 014
414 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Not Functioning"))
415 141 rdnzl
    CASE 015
416 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Busy (Attempting to Arm / Disarm)"))
417 141 rdnzl
    CASE 016
418 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Busy (Lockout)"))
419 141 rdnzl
    CASE 017
420 245 rdnzl
      Main.WriteLog(("[DSC] System Error - Keybus Busy (Installers Mode)"))
421 141 rdnzl
    CASE 020
422 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API Command Syntax Error"))
423 141 rdnzl
    CASE 021
424 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API Command Partition Error"))
425 141 rdnzl
    CASE 022
426 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API Command Not Supported"))
427 141 rdnzl
    CASE 023
428 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API System Not Armed"))
429 141 rdnzl
    CASE 024
430 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API System Not Ready to Arm"))
431 293 rdnzl
      TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1 WHERE id = 0", "System not Ready to Arm")
432 293 rdnzl
      Main.BroadcastEvent("[SecurityUpdate]")
433 141 rdnzl
    CASE 025
434 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API Command Invalid Length"))
435 141 rdnzl
    CASE 026
436 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API User Code Not Required"))
437 141 rdnzl
    CASE 027
438 245 rdnzl
      Main.WriteLog(("[DSC] System Error - API Invalid Characters in Command"))
439 261 rdnzl
    CASE ELSE
440 245 rdnzl
      Main.WriteLog(("[DSC] System Error - ") & sStr)
441 141 rdnzl
  END SELECT
442 141 rdnzl
443 141 rdnzl
END
444 141 rdnzl
445 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
446 141 rdnzl
' TX - Calculate the CheckSum and Transmit the data
447 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
448 141 rdnzl
PUBLIC SUB TX(sStr AS String)
449 141 rdnzl
450 141 rdnzl
  DIM sCheckSumCalculating, sCheckSumCalculated AS String
451 262 rdnzl
  DIM iCheckSumFloat, iInd AS Integer
452 141 rdnzl
453 141 rdnzl
  ' calculate checksum
454 141 rdnzl
  FOR iInd = 1 TO Len(sStr)
455 141 rdnzl
    sCheckSumCalculating = Asc(Mid$(sStr, iInd, 1))
456 262 rdnzl
    iCheckSumFloat = iCheckSumFloat + sCheckSumCalculating
457 141 rdnzl
  NEXT
458 262 rdnzl
  sCheckSumCalculated = Right(Hex$(iCheckSumFloat), 2)
459 141 rdnzl
460 141 rdnzl
  PRINT #hDSC, sStr & sCheckSumCalculated
461 141 rdnzl
462 141 rdnzl
END
463 141 rdnzl
464 141 rdnzl
PUBLIC SUB tDSCLED_Timer()
465 141 rdnzl
466 339 rdnzl
  Main.ControlLed("DSC", "Off")
467 141 rdnzl
  tDSC.Stop
468 141 rdnzl
469 141 rdnzl
END
470 141 rdnzl
471 171 rdnzl
PUBLIC SUB DSC_LCDText()
472 171 rdnzl
473 293 rdnzl
  DIM sLCDTime AS String = Format$(Now(), "dd/mmmm/yyyy hh:nn")
474 171 rdnzl
475 293 rdnzl
  TRY Main.hDB.Exec("UPDATE security SET lcd_line1 = &1, lcd_line2 = &2 WHERE id = 0", "DSC Security", sLCDTime)
476 293 rdnzl
  Main.BroadcastEvent("[SecurityUpdate]")
477 293 rdnzl
478 171 rdnzl
END
479 171 rdnzl
480 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
481 141 rdnzl
' close port
482 141 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
483 141 rdnzl
PUBLIC FUNCTION Disconnect() AS Boolean
484 141 rdnzl
485 141 rdnzl
  ' try to close the connection
486 141 rdnzl
  TRY hDSC.Close
487 245 rdnzl
  Main.WriteLog(("DSC serial port close."))
488 141 rdnzl
489 141 rdnzl
  ' all ok
490 141 rdnzl
  RETURN TRUE
491 141 rdnzl
492 141 rdnzl
CATCH ' some errors
493 245 rdnzl
  Main.WriteLog(("DSC Error: ") & ERROR.Text)
494 141 rdnzl
  RETURN FALSE
495 141 rdnzl
496 141 rdnzl
END
497 141 rdnzl
498 141 rdnzl
' implement properties
499 172 rdnzl
PRIVATE FUNCTION Port_Read() AS String
500 141 rdnzl
501 141 rdnzl
  RETURN sPort
502 141 rdnzl
503 141 rdnzl
END
504 141 rdnzl
505 141 rdnzl
SUB Port_Write(Value AS String)
506 141 rdnzl
507 141 rdnzl
  sPort = Value
508 141 rdnzl
509 141 rdnzl
END
510 141 rdnzl
511 141 rdnzl
PRIVATE FUNCTION Baud_Read() AS String
512 141 rdnzl
513 141 rdnzl
  RETURN sBaud
514 141 rdnzl
515 141 rdnzl
END
516 141 rdnzl
517 141 rdnzl
PRIVATE SUB Baud_Write(Value AS String)
518 141 rdnzl
519 141 rdnzl
  sBaud = Value
520 141 rdnzl
521 141 rdnzl
END
522 141 rdnzl
523 141 rdnzl
PRIVATE FUNCTION DSCDebug_Read() AS Boolean
524 141 rdnzl
525 141 rdnzl
  RETURN bDSCDebug
526 141 rdnzl
527 141 rdnzl
END
528 141 rdnzl
529 141 rdnzl
PRIVATE SUB DSCDebug_Write(Value AS Boolean)
530 141 rdnzl
531 141 rdnzl
  bDSCDebug = Value
532 141 rdnzl
533 141 rdnzl
END