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 / DomotiGaServer / COneWire.class @ 626

History | View | Annotate | Download (3.3 kB)

1 239 rdnzl
' Gambas class file
2 239 rdnzl
3 239 rdnzl
' Description:
4 239 rdnzl
' COneWire.class
5 239 rdnzl
' Support for Midon's TEMP08 1-wire interface.
6 239 rdnzl
7 239 rdnzl
' Development Status:
8 239 rdnzl
' Working, but only temp sensors implemented tested yet.
9 239 rdnzl
10 239 rdnzl
' DomotiGa - an open source home automation program.
11 316 rdnzl
' Copyright(C) 2008-2010 Ron Klinkien
12 239 rdnzl
13 239 rdnzl
' Read file called COPYING for license details.
14 239 rdnzl
15 239 rdnzl
PROPERTY Port AS String
16 239 rdnzl
PROPERTY Baud AS String
17 239 rdnzl
PROPERTY OneWireDebug AS Boolean
18 239 rdnzl
19 239 rdnzl
PRIVATE sPort AS String
20 239 rdnzl
PRIVATE sBaud AS String
21 239 rdnzl
PRIVATE bOneWireDebug AS Boolean
22 239 rdnzl
23 239 rdnzl
PUBLIC hOneWire AS NEW SerialPort
24 262 rdnzl
PUBLIC tOneWire AS NEW Timer
25 239 rdnzl
26 239 rdnzl
PUBLIC sBuffer AS String
27 239 rdnzl
28 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
29 239 rdnzl
' open serial port
30 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31 239 rdnzl
PUBLIC FUNCTION Connect() AS Boolean
32 239 rdnzl
33 239 rdnzl
  ' try to close the port
34 239 rdnzl
  TRY hOneWire.Close
35 239 rdnzl
36 239 rdnzl
  ' get a new one
37 239 rdnzl
  hOneWire = NEW Serialport AS "OneWire"
38 239 rdnzl
39 239 rdnzl
  WITH hOneWire
40 239 rdnzl
    .PortName = sPort
41 239 rdnzl
    .Speed = sBaud
42 239 rdnzl
    .Parity = 0
43 239 rdnzl
    .DataBits = 8
44 239 rdnzl
    .StopBits = 1
45 239 rdnzl
    .Open()
46 239 rdnzl
  END WITH
47 239 rdnzl
48 262 rdnzl
  ' start poll timer for OneWire status LED
49 262 rdnzl
  tOneWire = NEW Timer AS "tOneWireLED"
50 262 rdnzl
  tOneWire.Delay = 250
51 262 rdnzl
  tOneWire.Stop
52 262 rdnzl
53 239 rdnzl
  ' all ok
54 239 rdnzl
  RETURN TRUE
55 239 rdnzl
56 239 rdnzl
CATCH ' some errors
57 244 rdnzl
  Main.WriteLog(("OneWire Error: ") & ERROR.Text)
58 239 rdnzl
  RETURN FALSE
59 239 rdnzl
60 239 rdnzl
END
61 239 rdnzl
62 239 rdnzl
PUBLIC SUB OneWire_Read()
63 239 rdnzl
64 239 rdnzl
  DIM sData AS String
65 239 rdnzl
66 316 rdnzl
  TRY READ #hOneWire, sData, 1
67 316 rdnzl
  IF ERROR THEN Main.WriteDebugLog(("[1-Wire] Error reading data from serial port! -> ") & Error.Text)
68 239 rdnzl
  IF sData = Chr(10) THEN ' buffer until newline then parse
69 239 rdnzl
    IF Len(sBuffer) > 1 THEN ParseLine(sBuffer)
70 239 rdnzl
    sBuffer = NULL
71 239 rdnzl
  ELSE
72 239 rdnzl
    sBuffer &= sData
73 239 rdnzl
  END IF
74 239 rdnzl
75 239 rdnzl
END
76 239 rdnzl
77 239 rdnzl
PUBLIC SUB ParseLine(sStr AS String)
78 239 rdnzl
79 239 rdnzl
  DIM iDeviceId AS Integer
80 239 rdnzl
  DIM aScan AS String[]
81 239 rdnzl
82 262 rdnzl
  Main.ControlLed("OneWire", "On")
83 465 rdnzl
  IF Main.bServer THEN tOneWire.Start
84 262 rdnzl
85 239 rdnzl
  ' example output
86 239 rdnzl
  ' SUN 00:36:20
87 239 rdnzl
  ' Reading Sensors...
88 239 rdnzl
  ' Voltage #01[4 D0000004FC78A26] = 00.32 V 04.98 V
89 239 rdnzl
  ' Temp #01[4D0000004FC78A26]=23.75C
90 239 rdnzl
  ' Temp #02[150008013A024910]=22.43C
91 239 rdnzl
  ' Temp #03[7A0008014A6BC310]=22.68C
92 239 rdnzl
93 239 rdnzl
  IF bOneWireDebug THEN Main.WriteDebugLog("[1-Wire] " & sStr)
94 239 rdnzl
95 239 rdnzl
  ' 1-wire temp sensor support
96 239 rdnzl
  IF Mid$(sStr, 1, 4) = "Temp" THEN
97 244 rdnzl
    IF bOneWireDebug THEN Main.WriteDebugLog(("[1-Wire] We got DS1820 temperature data."))
98 239 rdnzl
    aScan = Scan(sStr, "*[[]*]=*")
99 239 rdnzl
    IF aScan.Count = 3 THEN
100 262 rdnzl
      iDeviceId = Devices.Find(aScan[1], Devices.FindInterface("Midon TEMP08"), "Dallas DS1820")
101 262 rdnzl
      IF iDeviceId THEN Devices.ValueUpdate(iDeviceId, LTrim(Left(aScan[2], -2)), "", "", "")
102 239 rdnzl
    END IF
103 239 rdnzl
  END IF
104 239 rdnzl
  ' put support for other sensortypes here
105 239 rdnzl
106 239 rdnzl
END
107 239 rdnzl
108 262 rdnzl
PUBLIC SUB tOneWireLED_Timer()
109 262 rdnzl
110 262 rdnzl
  Main.ControlLed("OneWire", "Off")
111 262 rdnzl
  tOneWire.Stop
112 262 rdnzl
113 262 rdnzl
END
114 262 rdnzl
115 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
116 239 rdnzl
' close port
117 239 rdnzl
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118 239 rdnzl
PUBLIC FUNCTION Disconnect() AS Boolean
119 239 rdnzl
120 239 rdnzl
  ' try to close the connection
121 239 rdnzl
  TRY hOneWire.Close
122 244 rdnzl
  Main.WriteLog(("OneWire serial port close."))
123 239 rdnzl
124 239 rdnzl
  ' all ok
125 239 rdnzl
  RETURN TRUE
126 239 rdnzl
127 239 rdnzl
CATCH ' some errors
128 244 rdnzl
  Main.WriteLog(("1-Wire Error: ") & ERROR.Text)
129 239 rdnzl
  RETURN FALSE
130 239 rdnzl
131 239 rdnzl
END
132 239 rdnzl
133 239 rdnzl
' implement properties
134 239 rdnzl
FUNCTION Port_Read() AS String
135 239 rdnzl
136 239 rdnzl
  RETURN sPort
137 239 rdnzl
138 239 rdnzl
END
139 239 rdnzl
140 239 rdnzl
SUB Port_Write(Value AS String)
141 239 rdnzl
142 239 rdnzl
  sPort = Value
143 239 rdnzl
144 239 rdnzl
END
145 239 rdnzl
146 239 rdnzl
PRIVATE FUNCTION Baud_Read() AS String
147 239 rdnzl
148 239 rdnzl
  RETURN sBaud
149 239 rdnzl
150 239 rdnzl
END
151 239 rdnzl
152 239 rdnzl
PRIVATE SUB Baud_Write(Value AS String)
153 239 rdnzl
154 239 rdnzl
  sBaud = Value
155 239 rdnzl
156 239 rdnzl
END
157 239 rdnzl
158 239 rdnzl
PRIVATE FUNCTION OneWireDebug_Read() AS Boolean
159 239 rdnzl
160 239 rdnzl
  RETURN bOneWireDebug
161 239 rdnzl
162 239 rdnzl
END
163 239 rdnzl
164 239 rdnzl
PRIVATE SUB OneWireDebug_Write(Value AS Boolean)
165 239 rdnzl
166 239 rdnzl
  bOneWireDebug = Value
167 239 rdnzl
168 239 rdnzl
END