ansible4ozw 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (165) hide show
  1. data/lib/ansible.rb +12 -9
  2. data/lib/ansible/ansible_device.rb +1 -1
  3. data/lib/ansible/ansible_value.rb +1 -1
  4. data/lib/ansible/config.rb +8 -5
  5. data/lib/ansible/devices.rb +1 -0
  6. data/lib/ansible/knx.rb +0 -0
  7. data/lib/ansible/knx/dpt/tests/test_dpt10.rb~ +45 -0
  8. data/lib/ansible/knx/dpt/tests/test_dpt9.rb~ +55 -0
  9. data/lib/ansible/transceiver.rb +0 -3
  10. data/lib/ansible/version.rb +3 -0
  11. data/lib/ansible/zwave.rb +1 -0
  12. data/lib/ansible/{openzwave → zwave/openzwave}/ozw_constants.rb +1 -2
  13. data/lib/ansible/{openzwave → zwave/openzwave}/ozw_headers.rb +2 -6
  14. data/lib/ansible/{openzwave → zwave/openzwave}/ozw_remote_manager.rb +0 -3
  15. data/lib/ansible/{openzwave → zwave/openzwave}/ozw_types.rb +0 -0
  16. data/lib/ansible/zwave/openzwave/src/Driver.h +695 -0
  17. data/lib/ansible/zwave/openzwave/src/Notification.h +165 -0
  18. data/lib/ansible/zwave/openzwave/src/command_classes/Alarm.cpp +142 -0
  19. data/lib/ansible/zwave/openzwave/src/command_classes/Alarm.h +69 -0
  20. data/lib/ansible/zwave/openzwave/src/command_classes/ApplicationStatus.cpp +93 -0
  21. data/lib/ansible/zwave/openzwave/src/command_classes/ApplicationStatus.h +57 -0
  22. data/lib/ansible/zwave/openzwave/src/command_classes/Association.cpp +385 -0
  23. data/lib/ansible/zwave/openzwave/src/command_classes/Association.h +73 -0
  24. data/lib/ansible/zwave/openzwave/src/command_classes/AssociationCommandConfiguration.cpp +277 -0
  25. data/lib/ansible/zwave/openzwave/src/command_classes/AssociationCommandConfiguration.h +70 -0
  26. data/lib/ansible/zwave/openzwave/src/command_classes/Basic.cpp +212 -0
  27. data/lib/ansible/zwave/openzwave/src/command_classes/Basic.h +72 -0
  28. data/lib/ansible/zwave/openzwave/src/command_classes/BasicWindowCovering.cpp +118 -0
  29. data/lib/ansible/zwave/openzwave/src/command_classes/BasicWindowCovering.h +64 -0
  30. data/lib/ansible/zwave/openzwave/src/command_classes/Battery.cpp +141 -0
  31. data/lib/ansible/zwave/openzwave/src/command_classes/Battery.h +65 -0
  32. data/lib/ansible/zwave/openzwave/src/command_classes/ClimateControlSchedule.cpp +415 -0
  33. data/lib/ansible/zwave/openzwave/src/command_classes/ClimateControlSchedule.h +71 -0
  34. data/lib/ansible/zwave/openzwave/src/command_classes/Clock.cpp +227 -0
  35. data/lib/ansible/zwave/openzwave/src/command_classes/Clock.h +67 -0
  36. data/lib/ansible/zwave/openzwave/src/command_classes/CommandClass.cpp +546 -0
  37. data/lib/ansible/zwave/openzwave/src/command_classes/CommandClass.h +145 -0
  38. data/lib/ansible/zwave/openzwave/src/command_classes/CommandClasses.cpp +291 -0
  39. data/lib/ansible/zwave/openzwave/src/command_classes/CommandClasses.h +79 -0
  40. data/lib/ansible/zwave/openzwave/src/command_classes/Configuration.cpp +258 -0
  41. data/lib/ansible/zwave/openzwave/src/command_classes/Configuration.h +67 -0
  42. data/lib/ansible/zwave/openzwave/src/command_classes/ControllerReplication.cpp +142 -0
  43. data/lib/ansible/zwave/openzwave/src/command_classes/ControllerReplication.h +63 -0
  44. data/lib/ansible/zwave/openzwave/src/command_classes/EnergyProduction.cpp +163 -0
  45. data/lib/ansible/zwave/openzwave/src/command_classes/EnergyProduction.h +65 -0
  46. data/lib/ansible/zwave/openzwave/src/command_classes/Hail.cpp +68 -0
  47. data/lib/ansible/zwave/openzwave/src/command_classes/Hail.h +58 -0
  48. data/lib/ansible/zwave/openzwave/src/command_classes/Indicator.cpp +159 -0
  49. data/lib/ansible/zwave/openzwave/src/command_classes/Indicator.h +66 -0
  50. data/lib/ansible/zwave/openzwave/src/command_classes/Language.cpp +159 -0
  51. data/lib/ansible/zwave/openzwave/src/command_classes/Language.h +65 -0
  52. data/lib/ansible/zwave/openzwave/src/command_classes/Lock.cpp +159 -0
  53. data/lib/ansible/zwave/openzwave/src/command_classes/Lock.h +66 -0
  54. data/lib/ansible/zwave/openzwave/src/command_classes/ManufacturerSpecific.cpp +439 -0
  55. data/lib/ansible/zwave/openzwave/src/command_classes/ManufacturerSpecific.h +116 -0
  56. data/lib/ansible/zwave/openzwave/src/command_classes/Meter.cpp +541 -0
  57. data/lib/ansible/zwave/openzwave/src/command_classes/Meter.h +73 -0
  58. data/lib/ansible/zwave/openzwave/src/command_classes/MeterPulse.cpp +137 -0
  59. data/lib/ansible/zwave/openzwave/src/command_classes/MeterPulse.h +65 -0
  60. data/lib/ansible/zwave/openzwave/src/command_classes/MultiCmd.cpp +77 -0
  61. data/lib/ansible/zwave/openzwave/src/command_classes/MultiCmd.h +63 -0
  62. data/lib/ansible/zwave/openzwave/src/command_classes/MultiInstance.cpp +568 -0
  63. data/lib/ansible/zwave/openzwave/src/command_classes/MultiInstance.h +96 -0
  64. data/lib/ansible/zwave/openzwave/src/command_classes/MultiInstanceAssociation.cpp +61 -0
  65. data/lib/ansible/zwave/openzwave/src/command_classes/MultiInstanceAssociation.h +59 -0
  66. data/lib/ansible/zwave/openzwave/src/command_classes/NodeNaming.cpp +525 -0
  67. data/lib/ansible/zwave/openzwave/src/command_classes/NodeNaming.h +66 -0
  68. data/lib/ansible/zwave/openzwave/src/command_classes/Powerlevel.cpp +157 -0
  69. data/lib/ansible/zwave/openzwave/src/command_classes/Powerlevel.h +82 -0
  70. data/lib/ansible/zwave/openzwave/src/command_classes/Proprietary.cpp +62 -0
  71. data/lib/ansible/zwave/openzwave/src/command_classes/Proprietary.h +58 -0
  72. data/lib/ansible/zwave/openzwave/src/command_classes/Protection.cpp +177 -0
  73. data/lib/ansible/zwave/openzwave/src/command_classes/Protection.h +73 -0
  74. data/lib/ansible/zwave/openzwave/src/command_classes/SensorAlarm.cpp +208 -0
  75. data/lib/ansible/zwave/openzwave/src/command_classes/SensorAlarm.h +77 -0
  76. data/lib/ansible/zwave/openzwave/src/command_classes/SensorBinary.cpp +134 -0
  77. data/lib/ansible/zwave/openzwave/src/command_classes/SensorBinary.h +65 -0
  78. data/lib/ansible/zwave/openzwave/src/command_classes/SensorMultilevel.cpp +237 -0
  79. data/lib/ansible/zwave/openzwave/src/command_classes/SensorMultilevel.h +71 -0
  80. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchAll.cpp +219 -0
  81. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchAll.h +69 -0
  82. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchBinary.cpp +157 -0
  83. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchBinary.h +66 -0
  84. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchMultilevel.cpp +559 -0
  85. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchMultilevel.h +83 -0
  86. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchToggleBinary.cpp +151 -0
  87. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchToggleBinary.h +66 -0
  88. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchToggleMultilevel.cpp +195 -0
  89. data/lib/ansible/zwave/openzwave/src/command_classes/SwitchToggleMultilevel.h +75 -0
  90. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatFanMode.cpp +332 -0
  91. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatFanMode.h +77 -0
  92. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatFanState.cpp +149 -0
  93. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatFanState.h +71 -0
  94. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatMode.cpp +373 -0
  95. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatMode.h +76 -0
  96. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatOperatingState.cpp +147 -0
  97. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatOperatingState.h +71 -0
  98. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatSetpoint.cpp +317 -0
  99. data/lib/ansible/zwave/openzwave/src/command_classes/ThermostatSetpoint.h +73 -0
  100. data/lib/ansible/zwave/openzwave/src/command_classes/Version.cpp +255 -0
  101. data/lib/ansible/zwave/openzwave/src/command_classes/Version.h +71 -0
  102. data/lib/ansible/zwave/openzwave/src/command_classes/WakeUp.cpp +391 -0
  103. data/lib/ansible/zwave/openzwave/src/command_classes/WakeUp.h +85 -0
  104. data/lib/ansible/zwave/openzwave/src/platform/Controller.cpp +68 -0
  105. data/lib/ansible/zwave/openzwave/src/platform/Controller.h +106 -0
  106. data/lib/ansible/zwave/openzwave/src/platform/Event.cpp +102 -0
  107. data/lib/ansible/zwave/openzwave/src/platform/Event.h +91 -0
  108. data/lib/ansible/zwave/openzwave/src/platform/HidController.cpp +539 -0
  109. data/lib/ansible/zwave/openzwave/src/platform/HidController.h +147 -0
  110. data/lib/ansible/zwave/openzwave/src/platform/Log.cpp +310 -0
  111. data/lib/ansible/zwave/openzwave/src/platform/Log.h +184 -0
  112. data/lib/ansible/zwave/openzwave/src/platform/Mutex.cpp +96 -0
  113. data/lib/ansible/zwave/openzwave/src/platform/Mutex.h +88 -0
  114. data/lib/ansible/zwave/openzwave/src/platform/Ref.h +91 -0
  115. data/lib/ansible/zwave/openzwave/src/platform/SerialController.cpp +180 -0
  116. data/lib/ansible/zwave/openzwave/src/platform/SerialController.h +138 -0
  117. data/lib/ansible/zwave/openzwave/src/platform/Stream.cpp +229 -0
  118. data/lib/ansible/zwave/openzwave/src/platform/Stream.h +135 -0
  119. data/lib/ansible/zwave/openzwave/src/platform/Thread.cpp +118 -0
  120. data/lib/ansible/zwave/openzwave/src/platform/Thread.h +101 -0
  121. data/lib/ansible/zwave/openzwave/src/platform/TimeStamp.cpp +92 -0
  122. data/lib/ansible/zwave/openzwave/src/platform/TimeStamp.h +85 -0
  123. data/lib/ansible/zwave/openzwave/src/platform/Wait.cpp +176 -0
  124. data/lib/ansible/zwave/openzwave/src/platform/Wait.h +113 -0
  125. data/lib/ansible/zwave/openzwave/src/platform/unix/EventImpl.cpp +262 -0
  126. data/lib/ansible/zwave/openzwave/src/platform/unix/EventImpl.h +62 -0
  127. data/lib/ansible/zwave/openzwave/src/platform/unix/LogImpl.cpp +304 -0
  128. data/lib/ansible/zwave/openzwave/src/platform/unix/LogImpl.h +70 -0
  129. data/lib/ansible/zwave/openzwave/src/platform/unix/MutexImpl.cpp +136 -0
  130. data/lib/ansible/zwave/openzwave/src/platform/unix/MutexImpl.h +56 -0
  131. data/lib/ansible/zwave/openzwave/src/platform/unix/SerialControllerImpl.cpp +368 -0
  132. data/lib/ansible/zwave/openzwave/src/platform/unix/SerialControllerImpl.h +74 -0
  133. data/lib/ansible/zwave/openzwave/src/platform/unix/ThreadImpl.cpp +181 -0
  134. data/lib/ansible/zwave/openzwave/src/platform/unix/ThreadImpl.h +67 -0
  135. data/lib/ansible/zwave/openzwave/src/platform/unix/TimeStampImpl.cpp +121 -0
  136. data/lib/ansible/zwave/openzwave/src/platform/unix/TimeStampImpl.h +84 -0
  137. data/lib/ansible/zwave/openzwave/src/platform/unix/WaitImpl.cpp +160 -0
  138. data/lib/ansible/zwave/openzwave/src/platform/unix/WaitImpl.h +74 -0
  139. data/lib/ansible/zwave/openzwave/src/platform/windows/EventImpl.cpp +102 -0
  140. data/lib/ansible/zwave/openzwave/src/platform/windows/EventImpl.h +60 -0
  141. data/lib/ansible/zwave/openzwave/src/platform/windows/LogImpl.cpp +302 -0
  142. data/lib/ansible/zwave/openzwave/src/platform/windows/LogImpl.h +71 -0
  143. data/lib/ansible/zwave/openzwave/src/platform/windows/MutexImpl.cpp +114 -0
  144. data/lib/ansible/zwave/openzwave/src/platform/windows/MutexImpl.h +58 -0
  145. data/lib/ansible/zwave/openzwave/src/platform/windows/SerialControllerImpl.cpp +410 -0
  146. data/lib/ansible/zwave/openzwave/src/platform/windows/SerialControllerImpl.h +66 -0
  147. data/lib/ansible/zwave/openzwave/src/platform/windows/ThreadImpl.cpp +158 -0
  148. data/lib/ansible/zwave/openzwave/src/platform/windows/ThreadImpl.h +71 -0
  149. data/lib/ansible/zwave/openzwave/src/platform/windows/TimeStampImpl.cpp +95 -0
  150. data/lib/ansible/zwave/openzwave/src/platform/windows/TimeStampImpl.h +83 -0
  151. data/lib/ansible/zwave/openzwave/src/platform/windows/WaitImpl.cpp +134 -0
  152. data/lib/ansible/zwave/openzwave/src/platform/windows/WaitImpl.h +73 -0
  153. data/lib/ansible/zwave/openzwave/src/value_classes/ValueID.h +283 -0
  154. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_bool.rb +0 -0
  155. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_button.rb +0 -0
  156. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_byte.rb +0 -0
  157. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_decimal.rb +0 -0
  158. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_int.rb +0 -0
  159. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_list.rb +0 -0
  160. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_short.rb +0 -0
  161. data/lib/ansible/zwave/{types → openzwave/types}/valuetype_string.rb +0 -0
  162. data/lib/ansible/zwave/zwave_transceiver.rb +2 -8
  163. data/lib/ansible/zwave/zwave_value.rb +6 -10
  164. metadata +159 -17
  165. data/lib/ansible/zwave/zwave_node.rb +0 -5
data/lib/ansible.rb CHANGED
@@ -22,20 +22,23 @@ for more information on the LGPL, see:
22
22
  http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
23
23
  =end
24
24
 
25
+ # ruby core
25
26
  require "rubygems"
26
27
  require "bundler/setup"
27
- require 'config'
28
+ require 'onstomp'
29
+ require 'thrift'
28
30
 
29
- require 'transceiver'
30
- require 'zwave_transceiver'
31
- require 'zwave_command_classes'
31
+ # ansible core
32
+ require 'ansible/config'
33
+ # note: I would like to convert this to ansible/device
34
+ require 'ansible/ansible_device'
35
+ require 'ansible/transceiver'
32
36
 
33
- require 'knx_transceiver'
34
- require 'knx_tools'
35
- require 'knx_value'
36
-
37
- require 'ansible_device'
37
+ # ansible extensions
38
+ require 'ansible/knx'
39
+ require 'ansible/zwave'
38
40
 
41
+ # include all
39
42
  include Ansible
40
43
  include Ansible::ZWave
41
44
  include Ansible::KNX
@@ -63,6 +63,6 @@ module Ansible
63
63
 
64
64
  #
65
65
  # load all known Ansible Device classes
66
- Dir["devices/*.rb"].each { |f| load f }
66
+ Dir["devices/*.rb"].reverse.each { |f| load f }
67
67
 
68
68
  end
@@ -22,7 +22,7 @@ for more information on the LGPL, see:
22
22
  http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
23
23
  =end
24
24
 
25
- require 'ansible_callback'
25
+ require 'ansible/ansible_callback'
26
26
 
27
27
  module Ansible
28
28
 
@@ -27,9 +27,13 @@ http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
27
27
  #
28
28
 
29
29
  module Ansible
30
-
30
+
31
+ def self.root
32
+ File.expand_path '../..', __FILE__
33
+ end
34
+
31
35
  # STOMP Server URL
32
- STOMP_URL = 'stomp://192.168.10.14'
36
+ STOMP_URL = 'stomp://localhost'
33
37
 
34
38
  #
35
39
  # KNX subsystem configuration
@@ -73,8 +77,7 @@ module Ansible
73
77
 
74
78
  #################
75
79
  # OpenZWave Thrift Server URL
76
- THRIFT_URL = 'thrift://192.168.10.14'
77
- #THRIFT_URL = 'thrift://192.168.0.100'
80
+ THRIFT_URL = 'thrift://localhost'
78
81
 
79
82
  ThriftPort = 9090
80
83
 
@@ -87,6 +90,6 @@ end
87
90
  module OpenZWave
88
91
 
89
92
  # path to OpenZWave source
90
- OZW_SRC = "lib/ansible/openzwave/src"
93
+ OZW_SRC = "#{Ansible.root}/ansible/zwave/openzwave/src"
91
94
 
92
95
  end
@@ -0,0 +1 @@
1
+
File without changes
@@ -0,0 +1,45 @@
1
+ require 'bindata'
2
+
3
+ class DPT10 < BinData::Record
4
+ bit3 :dayofweek, {
5
+ :display_name => "Day of week",
6
+ :range => 0..7, :enc => {
7
+ 0 => "(no day set)",
8
+ 1 => "Monday",
9
+ 2 => "Tuesday",
10
+ 3 => "Wednesday",
11
+ 4 => "Thursday",
12
+ 5 => "Friday",
13
+ 6 => "Saturday",
14
+ 7 => "Sunday"
15
+ }
16
+ }
17
+ bit5 :hour, {
18
+ :display_name => "Hour", :range => 0..23
19
+ }
20
+ #
21
+ bit2 :unused1
22
+ bit6 :minutes, {
23
+ :display_name => "Minutes", :range => 0..59
24
+ }
25
+ #
26
+ bit2 :unused2
27
+ bit6 :seconds, {
28
+ :display_name => "Seconds", :range => 0..59
29
+ }
30
+ end
31
+ [
32
+ [0x8e, 0x21, 0x00]
33
+ ].each {|arr|
34
+ f = DPT10.read(arr.pack('C*'))
35
+ puts arr.inspect + " ==> " + f.inspect
36
+ # f.data = -10
37
+ # puts "after set() ==> " + f.inspect + " serialized as " + f.to_binary_s.unpack("H*").join('0x')
38
+ #f.dayofweek.get_parameter(:range)
39
+ }
40
+ =begin
41
+ [
42
+ # DPT11.001 date
43
+ [0x17, 0x01, 0x0C] # 23/Jan/2012
44
+ ].each {|arr|
45
+ =end
@@ -0,0 +1,55 @@
1
+ require 'bindata'
2
+
3
+ class DPT9_Float < BinData::Primitive
4
+ endian :big
5
+ #
6
+ bit1 :sign, :display_name => "Sign"
7
+ bit4 :exp, :display_name => "Exponent"
8
+ bit11 :mant, :display_name => "Mantissa"
9
+ #
10
+ def get
11
+ #puts "get, sign=#{sign} exp=#{exp} mant=#{mant}"
12
+ mantissa = (self.sign==1) ? ~(self.mant^2047) : self.mant
13
+ return Math.ldexp((0.01*mantissa), self.exp)
14
+ end
15
+ #
16
+ def set(v)
17
+ mantissa, exponent = Math.frexp(v)
18
+ #puts "#{self}.set(#{v}) with initial mantissa=#{mantissa}, exponent=#{exponent}"
19
+ # find the minimum exponent that will upsize the normalized mantissa (0,5 to 1 range)
20
+ # in order to fit in 11 bits (-2048..2047)
21
+ max_mantissa = 0
22
+ minimum_exp = exponent.downto(0).find{ | e |
23
+ max_mantissa = Math.ldexp(100*mantissa, e).to_i
24
+ max_mantissa.between?(-2048, 2047)
25
+ }
26
+ self.sign = (mantissa < 0) ? 1 : 0
27
+ self.mant = (mantissa < 0) ? ~(max_mantissa^2047) : max_mantissa
28
+ self.exp = exponent - minimum_exp
29
+ #puts "... set(#{v}) finished: sign=#{sign}, mantissa=#{mant}, exponent=#{exp}"
30
+ end # set
31
+ end
32
+
33
+ class DPT9 < BinData::Record
34
+ dpt9_float :data
35
+ end
36
+
37
+ {
38
+ #forward test (raw data to float)
39
+ DPT9.read([0x03, 0xe8].pack('C*')).data => 10,
40
+ DPT9.read([0x84, 0x18].pack('C*')).data => -10,
41
+ DPT9.read([0x0D, 0xDC].pack('C*')).data => 30,
42
+ DPT9.read([0x8a, 0x24].pack('C*')).data => -30,
43
+ DPT9.read([0x5c, 0xc4].pack('C*')).data => 24980..25000,
44
+ DPT9.read([0xdb, 0x3c].pack('C*')).data => -25000..-24980,
45
+ #backward test (float to raw data)
46
+ "----" => "----",
47
+ DPT9_Float.new(-30).to_binary_s.unpack("C*") => [0x8a, 0x24]
48
+ }.each {|arr, test|
49
+ #f = DPT9.read(arr.pack('C*'))
50
+ puts arr.inspect + " ==> " + test.inspect + " \t TEST: " + (test === arr ? 'ok':'FAIL')
51
+ # f.data = -30
52
+ # puts "after set() ==> " + f.inspect + " serialized as " + f.to_binary_s.unpack('B*').join(' ') + " (0x" + f.to_binary_s.unpack("H*").join('') + ")"
53
+ }
54
+
55
+
@@ -22,9 +22,6 @@ for more information on the LGPL, see:
22
22
  http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
23
23
  =end
24
24
 
25
- require 'rubygems'
26
- require 'onstomp'
27
-
28
25
  module Ansible
29
26
 
30
27
  # Generic Ansible tranceiver
@@ -0,0 +1,3 @@
1
+ module Ansible
2
+ VERSION = "0.0.3".freeze
3
+ end
@@ -0,0 +1 @@
1
+ require 'ansible/zwave/zwave_transceiver'
@@ -4,8 +4,7 @@
4
4
  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
5
  #
6
6
 
7
- require 'thrift'
8
- require 'ozw_types'
7
+ require 'ansible/zwave/openzwave/ozw_types'
9
8
 
10
9
  module OpenZWave
11
10
  end
@@ -22,8 +22,6 @@ for more information on the LGPL, see:
22
22
  http://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License
23
23
  =end
24
24
 
25
- require 'config'
26
-
27
25
  # a generic Rexegp to parse C/C++ enums, must substitute %s in-place with enumeration name
28
26
  ENUM_RE = %q(.*
29
27
  enum \s* %s \s*
@@ -72,9 +70,7 @@ module OpenZWave
72
70
  ControllerStates = parse_ozw_headers( File.join(OZW_SRC, "Driver.h"), "ControllerState" )
73
71
  ValueGenres = parse_ozw_headers( File.join(OZW_SRC, "value_classes", "ValueID.h"), "ValueGenre" )
74
72
  ValueTypes = parse_ozw_headers( File.join(OZW_SRC, "value_classes", "ValueID.h"), "ValueType" )
75
-
73
+
76
74
  end
77
75
 
78
-
79
- #CommandClassesByID defined in zwave_command_classes.rb
80
-
76
+ # CommandClassesByID defined in zwave_command_classes.rb
@@ -4,9 +4,6 @@
4
4
  # DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
5
5
  #
6
6
 
7
- require 'thrift'
8
- require 'ozw_types'
9
-
10
7
  module OpenZWave
11
8
  module RemoteManager
12
9
  class Client
@@ -0,0 +1,695 @@
1
+ //-----------------------------------------------------------------------------
2
+ //
3
+ // Driver.h
4
+ //
5
+ // Communicates with a Z-Wave network
6
+ //
7
+ // Copyright (c) 2010 Mal Lansell <openzwave@lansell.org>
8
+ //
9
+ // SOFTWARE NOTICE AND LICENSE
10
+ //
11
+ // This file is part of OpenZWave.
12
+ //
13
+ // OpenZWave is free software: you can redistribute it and/or modify
14
+ // it under the terms of the GNU Lesser General Public License as published
15
+ // by the Free Software Foundation, either version 3 of the License,
16
+ // or (at your option) any later version.
17
+ //
18
+ // OpenZWave is distributed in the hope that it will be useful,
19
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21
+ // GNU Lesser General Public License for more details.
22
+ //
23
+ // You should have received a copy of the GNU Lesser General Public License
24
+ // along with OpenZWave. If not, see <http://www.gnu.org/licenses/>.
25
+ //
26
+ //-----------------------------------------------------------------------------
27
+
28
+ #ifndef _Driver_H
29
+ #define _Driver_H
30
+
31
+ #include <string>
32
+ #include <map>
33
+ #include <list>
34
+
35
+ #include "Defs.h"
36
+ #include "ValueID.h"
37
+ #include "Node.h"
38
+ #include "TimeStamp.h"
39
+
40
+ namespace OpenZWave
41
+ {
42
+ class Msg;
43
+ class Value;
44
+ class Event;
45
+ class Mutex;
46
+ class Controller;
47
+ class Thread;
48
+ class ControllerReplication;
49
+ class Notification;
50
+
51
+ /** \brief The Driver class handles communication between OpenZWave
52
+ * and a device attached via a serial port (typically a controller).
53
+ */
54
+ class Driver
55
+ {
56
+ friend class Manager;
57
+ friend class Node;
58
+ friend class Group;
59
+ friend class CommandClass;
60
+ friend class Value;
61
+ friend class ValueStore;
62
+ friend class ValueButton;
63
+ friend class Association;
64
+ friend class Basic;
65
+ friend class ManufacturerSpecific;
66
+ friend class NodeNaming;
67
+ friend class WakeUp;
68
+
69
+ //-----------------------------------------------------------------------------
70
+ // Controller Interfaces
71
+ //-----------------------------------------------------------------------------
72
+ public:
73
+ enum ControllerInterface
74
+ {
75
+ ControllerInterface_Serial = 0,
76
+ ControllerInterface_Hid
77
+ };
78
+
79
+ //-----------------------------------------------------------------------------
80
+ // Construction / Destruction
81
+ //-----------------------------------------------------------------------------
82
+ private:
83
+ /**
84
+ * Creates threads, events and initializes member variables and the node array.
85
+ */
86
+ Driver( string const& _controllerPath, ControllerInterface const& _interface );
87
+ /** Sets "exit" flags and stops the three background threads (pollThread, serialThread
88
+ * and driverThread). Then clears out the send queue and node array. Notifies
89
+ * watchers and exits.
90
+ */
91
+ virtual ~Driver();
92
+
93
+ /**
94
+ * Start the driverThread
95
+ */
96
+ void Start();
97
+ /**
98
+ * Entry point for driverThread
99
+ */
100
+ static void DriverThreadEntryPoint( Event* _exitEvent, void* _context );
101
+ /**
102
+ * ThreadProc for driverThread. This is where all the "action" takes place.
103
+ * <p>
104
+ * First, the thread is initialized by calling Init(). If Init() fails, it will be retried
105
+ * every 5 seconds for the first two minutes and every 30 seconds thereafter.
106
+ * <p>
107
+ * After the thread is successfully initialized, the thread enters a loop with the
108
+ * following elements:
109
+ * - Confirm that m_exit is still false (or exit from the thread if it is true)
110
+ * - Call ReadMsg() to consume any available messages from the controller
111
+ * - Call NotifyWatchers() to send any pending notifications
112
+ * - If the thread is not waiting for an ACK, a callback or a message reply, send [any][the next] queued message[s]
113
+ * - If there was no message read or sent (workDone=false), sleep for 5 seconds. If nothing happened
114
+ * within this time frame and something was expected (ACK, callback or reply), retrieve the
115
+ * last message from the send queue and examine GetSendAttempts(). If greater than 2, give up
116
+ * and remove the message from the queue. Otherwise, resend the message.
117
+ * - If something did happen [reset m_wakeEvent]
118
+ */
119
+ void DriverThreadProc( Event* _exitEvent );
120
+ /**
121
+ * Initialize the controller. Open the specified serial port, start the serialThread
122
+ * and pollThread, then send a NAK to the device [presumably to flush it].
123
+ * <p>
124
+ * Then queue the commands to retrieve the Z-Wave interface:
125
+ * - Get version
126
+ * - Get home and node IDs
127
+ * - Get controller capabilities
128
+ * - Get serial API capabilties
129
+ * - [Get SUC node ID]
130
+ * - Get init data [identifying the nodes on the network]
131
+ * Init() will return false if the serial port could not be opened.
132
+ */
133
+ bool Init( uint32 _attempts );
134
+
135
+ Thread* m_driverThread; /**< Thread for reading from the Z-Wave controller, and for creating and managing the other threads for sending, polling etc. */
136
+ bool m_exit; /**< Flag that is set when the application is exiting. */
137
+ bool m_init; /**< Set to true once the driver has been initialised */
138
+ bool m_awakeNodesQueried; /**< Set to true once the driver has polled all awake nodes */
139
+ bool m_allNodesQueried; /**< Set to true once the driver has polled all nodes */
140
+ bool m_notifytransactions;
141
+ TimeStamp m_startTime; /**< Time this driver started (for log report purposes) */
142
+
143
+ //-----------------------------------------------------------------------------
144
+ // Configuration
145
+ //-----------------------------------------------------------------------------
146
+ private:
147
+ void RequestConfig(); // Get the network configuration from the Z-Wave network
148
+ bool ReadConfig(); // Read the configuration from a file
149
+ void WriteConfig(); // Save the configuration to a file
150
+
151
+ //-----------------------------------------------------------------------------
152
+ // Controller
153
+ //-----------------------------------------------------------------------------
154
+ private:
155
+ // Controller Capabilities (return in FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES)
156
+ enum
157
+ {
158
+ ControllerCaps_Secondary = 0x01, /**< The controller is a secondary. */
159
+ ControllerCaps_OnOtherNetwork = 0x02, /**< The controller is not using its default HomeID. */
160
+ ControllerCaps_SIS = 0x04, /**< There is a SUC ID Server on the network. */
161
+ ControllerCaps_RealPrimary = 0x08, /**< Controller was the primary before the SIS was added. */
162
+ ControllerCaps_SUC = 0x10 /**< Controller is a static update controller. */
163
+ };
164
+
165
+ // Init Capabilities (return in FUNC_ID_SERIAL_API_GET_INIT_DATA)
166
+ enum
167
+ {
168
+ InitCaps_Slave = 0x01, /**< */
169
+ InitCaps_TimerSupport = 0x02, /**< Controller supports timers. */
170
+ InitCaps_Secondary = 0x04, /**< Controller is a secondary. */
171
+ InitCaps_SUC = 0x08, /**< Controller is a static update controller. */
172
+ };
173
+
174
+ bool IsPrimaryController()const{ return ((m_initCaps & InitCaps_Secondary) == 0); }
175
+ bool IsStaticUpdateController()const{ return ((m_initCaps & InitCaps_SUC) != 0); }
176
+ bool IsBridgeController()const{ return (m_libraryType == 7); }
177
+ bool IsInclusionController()const{ return ((m_controllerCaps & ControllerCaps_SIS) != 0); }
178
+
179
+
180
+ uint32 GetHomeId()const{ return m_homeId; }
181
+ uint8 GetNodeId()const{ return m_nodeId; }
182
+ uint16 GetManufacturerId()const{ return m_manufacturerId; }
183
+ uint16 GetProductType()const{ return m_productType; }
184
+ uint16 GetProductId()const{ return m_productId; }
185
+ string GetControllerPath()const{ return m_controllerPath; }
186
+ string GetLibraryVersion()const{ return m_libraryVersion; }
187
+ string GetLibraryTypeName()const{ return m_libraryTypeName; }
188
+ int32 GetSendQueueCount()const
189
+ {
190
+ int32 count = 0;
191
+ for( int32 i=0; i<MsgQueue_Count; ++i )
192
+ {
193
+ count += m_msgQueue[i].size();
194
+ }
195
+ return count;
196
+ }
197
+
198
+ /**
199
+ * A version of GetNode that does not have the protective "lock" and "release" requirement.
200
+ * This function can be used within driverThread, which "knows" that the node will not be
201
+ * changed or deleted while it is being used.
202
+ * \param _nodeId The nodeId (index into the node array) identifying the node to be returned
203
+ * \return
204
+ * A pointer to the specified node (if it exists) or NULL if not.
205
+ * \see GetNode
206
+ */
207
+ Node* GetNodeUnsafe( uint8 _nodeId );
208
+ /**
209
+ * Locks the node array and returns the specified node (if it exists). If a node is returned,
210
+ * the lock must be released after the node has been processed via a call to ReleaseNodes().
211
+ * If the node specified by _nodeId does not exist, the lock is released and NULL is returned.
212
+ * \param _nodeId The nodeId (index into the node array) identifying the node to be returned
213
+ * \return
214
+ * A pointer to the specified node (if it exists) or NULL if not.
215
+ * \see LockNodes, ReleaseNodes
216
+ */
217
+ Node* GetNode( uint8 _nodeId );
218
+ /**
219
+ * Lock the nodes so no other thread can modify them.
220
+ */
221
+ void LockNodes();
222
+ /**
223
+ * Release the lock on the nodes so other threads can modify them.
224
+ */
225
+ void ReleaseNodes();
226
+
227
+ ControllerInterface m_controllerInterfaceType; // Specifies the controller's hardware interface
228
+ string m_controllerPath; // name or path used to open the controller hardware.
229
+ Controller* m_controller; // Handles communications with the controller hardware.
230
+ uint32 m_homeId; // Home ID of the Z-Wave controller. Not valid until the DriverReady notification has been received.
231
+
232
+ string m_libraryVersion; // Verison of the Z-Wave Library used by the controller.
233
+ string m_libraryTypeName; // Name describing the library type.
234
+ uint8 m_libraryType; // Type of library used by the controller.
235
+
236
+ uint16 m_manufacturerId;
237
+ uint16 m_productType;
238
+ uint16 m_productId;
239
+ uint8 m_apiMask[32];
240
+
241
+ uint8 m_initVersion; // Version of the Serial API used by the controller.
242
+ uint8 m_initCaps; // Set of flags indicating the serial API capabilities (See IsSlave, HasTimerSupport, IsPrimaryController and IsStaticUpdateController above).
243
+ uint8 m_controllerCaps; // Set of flags indicating the controller's capabilities (See IsInclusionController above).
244
+ uint8 m_nodeId; // Z-Wave Controller's own node ID.
245
+ Node* m_nodes[256]; // Array containing all the node objects.
246
+ Mutex* m_nodeMutex; // Serializes access to node data
247
+
248
+ ControllerReplication* m_controllerReplication; // Controller replication is handled separately from the other command classes, due to older hand-held controllers using invalid node IDs.
249
+
250
+ //-----------------------------------------------------------------------------
251
+ // Sending Z-Wave messages
252
+ //-----------------------------------------------------------------------------
253
+ public:
254
+ enum MsgQueue
255
+ {
256
+ MsgQueue_Command = 0,
257
+ MsgQueue_WakeUp,
258
+ MsgQueue_Send,
259
+ MsgQueue_Query,
260
+ MsgQueue_Poll,
261
+ MsgQueue_Count // Number of message queues
262
+ };
263
+
264
+ void SendMsg( Msg* _msg, MsgQueue const _queue );
265
+
266
+ private:
267
+ /**
268
+ * If there are messages in the send queue (m_sendQueue), gets the next message in the
269
+ * queue and writes it to the serial port. In sending the message, SendMsg also initializes
270
+ * variables tracking the message's callback ID (m_expectedCallbackId), expected reply
271
+ * (m_expectedReply) and expected command class ID (m_expectedCommandClassId). It also
272
+ * sets m_waitingForAck to true and increments the message's send attempts counter.
273
+ * <p>
274
+ * If there are no messages in the send queue, then SendMsg checks the query queue to
275
+ * see if there are any outstanding queries that can be processed (target node not asleep).
276
+ * If so, it retrieves the Node object that needs to be queried and calls that node's
277
+ * AdvanceQueries member function. If this call results in all of the node's queries to be
278
+ * completed, SendMsg will remove the node query item from the query queue.
279
+ * \return TRUE if data was written, FALSE if not
280
+ * \see Msg, m_sendQueue, m_expectedCallbackId, m_expectedReply, m_expectedCommandClassId,
281
+ * m_waitingForAck, Msg::GetSendAttempts, Node::AdvanceQueries, GetCurrentNodeQuery,
282
+ * RemoveNodeQuery, Node::AllQueriesCompleted
283
+ */
284
+ bool WriteNextMsg( MsgQueue const _queue ); // Extracts the first message from the queue, and makes it the current one.
285
+ bool WriteMsg( string const str); // Sends the current message to the Z-Wave network
286
+ void RemoveCurrentMsg(); // Deletes the current message and cleans up the callback etc states
287
+ bool MoveMessagesToWakeUpQueue( uint8 const _targetNodeId ); // If a node does not respond, and is of a type that can sleep, this method is used to move all its pending messages to another queue ready for when it mext wakes up.
288
+ bool IsControllerCommand( uint8 const _command ); // identify controller commands
289
+ bool IsExpectedReply( uint8 const _nodeId ); // Determine if reply message is the one we are expecting
290
+ void SendQueryStageComplete( uint8 const _nodeId, Node::QueryStage const _stage, MsgQueue const _queue );
291
+ void CheckCompletedNodeQueries(); // Send notifications if all awake and/or sleeping nodes have completed their queries
292
+
293
+ // Requests to be sent to nodes are assigned to one of five queues.
294
+ // From highest to lowest priority, these are
295
+ //
296
+ // 1) The command queue, for controller commands. This is the highest
297
+ // priority send queue, because the controller command processes are not
298
+ // permitted to be interupted by other requests.
299
+ //
300
+ // 2) The wakeup queue. This holds messages that have been held for a
301
+ // sleeping device that has now woken up. These gwt a high priority
302
+ // because such devices do not stay awake for very long.
303
+ //
304
+ // 3) The send queue. This is for normal messages, usually triggered by
305
+ // a user interaction with the application.
306
+ //
307
+ // 4) The query queue. For node query messages sent when a new node is
308
+ // discovered. The query process generates a large number of requests,
309
+ // so the query queue has a low priority to avoid making the system
310
+ // unresponsive.
311
+ //
312
+ // 5) The poll queue. Requests to devices that need their state polling
313
+ // at regular intervals. These are of the lowest priority, and are only
314
+ // sent when nothing else is going on
315
+ enum MsgQueueCmd
316
+ {
317
+ MsgQueueCmd_SendMsg = 0,
318
+ MsgQueueCmd_QueryStageComplete
319
+ };
320
+
321
+ class MsgQueueItem
322
+ {
323
+ public:
324
+ bool operator == ( MsgQueueItem const& _other )const
325
+ {
326
+ if( _other.m_command == m_command )
327
+ {
328
+ if( m_command == MsgQueueCmd_SendMsg )
329
+ {
330
+ return( (*_other.m_msg) == (*m_msg) );
331
+ }
332
+ else
333
+ {
334
+ return( (_other.m_nodeId == m_nodeId) && (_other.m_queryStage == m_queryStage) );
335
+ }
336
+ }
337
+
338
+ return false;
339
+ }
340
+
341
+ MsgQueueCmd m_command;
342
+ Msg* m_msg;
343
+ uint8 m_nodeId;
344
+ Node::QueryStage m_queryStage;
345
+ };
346
+
347
+ list<MsgQueueItem> m_msgQueue[MsgQueue_Count];
348
+ Event* m_queueEvent[MsgQueue_Count]; // Events for each queue, which are signalled when the queue is not empty
349
+ Mutex* m_sendMutex; // Serialize access to the queues
350
+ Msg* m_currentMsg;
351
+ TimeStamp m_resendTimeStamp;
352
+
353
+ //-----------------------------------------------------------------------------
354
+ // Receiving Z-Wave messages
355
+ //-----------------------------------------------------------------------------
356
+ private:
357
+ bool ReadMsg();
358
+ void ProcessMsg( uint8* _data );
359
+
360
+ void HandleGetVersionResponse( uint8* _data );
361
+ void HandleGetControllerCapabilitiesResponse( uint8* _data );
362
+ void HandleGetSerialAPICapabilitiesResponse( uint8* _data );
363
+ void HandleSerialAPISoftResetResponse( uint8* _data );
364
+ void HandleEnableSUCResponse( uint8* _data );
365
+ void HandleSetSUCNodeIdResponse( uint8* _data );
366
+ void HandleGetSUCNodeIdResponse( uint8* _data );
367
+ void HandleMemoryGetIdResponse( uint8* _data );
368
+ /**
369
+ * Process a response to a FUNC_ID_SERIAL_API_GET_INIT_DATA request.
370
+ * <p>
371
+ * The response message contains a bitmap identifying which of the 232 possible nodes
372
+ * in the network are actually present. These bitmap values are compared with the
373
+ * node map (read in from zwcfg_0x[homeid].xml) to see if the node has already been registered
374
+ * by the OpenZWave library. If it has (the log will show it as "Known") and this is
375
+ * the first time this message was sent (m_init is false), then AddNodeQuery() is called
376
+ * to retrieve its current state. If this is a "New" node to OpenZWave, then InitNode()
377
+ * is called.
378
+ * \see AddNodeQuery, InitNode, GetNode, ReleaseNodes
379
+ */
380
+ void HandleSerialAPIGetInitDataResponse( uint8* _data );
381
+ void HandleGetNodeProtocolInfoResponse( uint8* _data );
382
+ bool HandleRemoveFailedNodeResponse( uint8* _data );
383
+ void HandleIsFailedNodeResponse( uint8* _data );
384
+ bool HandleReplaceFailedNodeResponse( uint8* _data );
385
+ bool HandleAssignReturnRouteResponse( uint8* _data );
386
+ bool HandleDeleteReturnRouteResponse( uint8* _data );
387
+ void HandleSendDataResponse( uint8* _data, bool _replication );
388
+ bool HandleNetworkUpdateResponse( uint8* _data );
389
+ void HandleGetRoutingInfoResponse( uint8* _data );
390
+
391
+ void HandleSendDataRequest( uint8* _data, bool _replication );
392
+ void HandleAddNodeToNetworkRequest( uint8* _data );
393
+ void HandleCreateNewPrimaryRequest( uint8* _data );
394
+ void HandleControllerChangeRequest( uint8* _data );
395
+ void HandleSetLearnModeRequest( uint8* _data );
396
+ void HandleRemoveFailedNodeRequest( uint8* _data );
397
+ void HandleReplaceFailedNodeRequest( uint8* _data );
398
+ void HandleRemoveNodeFromNetworkRequest( uint8* _data );
399
+ void HandleApplicationCommandHandlerRequest( uint8* _data );
400
+ void HandlePromiscuousApplicationCommandHandlerRequest( uint8* _data );
401
+ void HandleAssignReturnRouteRequest( uint8* _data );
402
+ void HandleDeleteReturnRouteRequest( uint8* _data );
403
+ void HandleNodeNeighborUpdateRequest( uint8* _data );
404
+ void HandleNetworkUpdateRequest( uint8* _data );
405
+ bool HandleApplicationUpdateRequest( uint8* _data );
406
+ bool HandleRfPowerLevelSetResponse( uint8* _data );
407
+ bool HandleSerialApiSetTimeoutsResponse( uint8* _data );
408
+ bool HandleMemoryGetByteResponse( uint8* _data );
409
+ bool HandleReadMemoryResponse( uint8* _data );
410
+ void HandleGetVirtualNodesResponse( uint8* _data );
411
+ bool HandleSetSlaveLearnModeResponse( uint8* _data );
412
+ void HandleSetSlaveLearnModeRequest( uint8* _data );
413
+ bool HandleSendSlaveNodeInfoResponse( uint8* _data );
414
+ void HandleSendSlaveNodeInfoRequest( uint8* _data );
415
+ void HandleApplicationSlaveCommandRequest( uint8* _data );
416
+
417
+ void CommonAddNodeStatusRequestHandler( uint8 _funcId, uint8* _data );
418
+
419
+ bool m_waitingForAck; // True when we are waiting for an ACK from the dongle
420
+ uint8 m_expectedCallbackId; // If non-zero, we wait for a message with this callback Id
421
+ uint8 m_expectedReply; // If non-zero, we wait for a message with this function Id
422
+ uint8 m_expectedCommandClassId; // If the expected reply is FUNC_ID_APPLICATION_COMMAND_HANDLER, this value stores the command class we're waiting to hear from
423
+ uint8 m_expectedNodeId; // If we are waiting for a FUNC_ID_APPLICATION_COMMAND_HANDLER, make sure we only accept it from this node.
424
+
425
+ //-----------------------------------------------------------------------------
426
+ // Polling Z-Wave devices
427
+ //-----------------------------------------------------------------------------
428
+ private:
429
+ int32 GetPollInterval(){ return m_pollInterval ; }
430
+ void SetPollInterval( int32 _milliseconds, bool _bIntervalBetweenPolls ){ m_pollInterval = _milliseconds; m_bIntervalBetweenPolls = _bIntervalBetweenPolls; }
431
+ bool EnablePoll( ValueID _valueId, uint8 _intensity = 1 );
432
+ bool DisablePoll( ValueID _valueId );
433
+ bool isPolled( ValueID _valueId );
434
+ void SetPollIntensity( ValueID _valueId, uint8 _intensity );
435
+ static void PollThreadEntryPoint( Event* _exitEvent, void* _context );
436
+ void PollThreadProc( Event* _exitEvent );
437
+
438
+ Thread* m_pollThread; // Thread for polling devices on the Z-Wave network
439
+ struct PollEntry
440
+ {
441
+ ValueID m_id;
442
+ uint8 m_pollCounter;
443
+ };
444
+ list<PollEntry> m_pollList; // List of nodes that need to be polled
445
+ Mutex* m_pollMutex; // Serialize access to the polling list
446
+ int32 m_pollInterval; // Time interval during which all nodes must be polled
447
+ bool m_bIntervalBetweenPolls; // if true, the library intersperses m_pollInterval between polls; if false, the library attempts to complete all polls within m_pollInterval
448
+
449
+ //-----------------------------------------------------------------------------
450
+ // Retrieving Node information
451
+ //-----------------------------------------------------------------------------
452
+ public:
453
+ uint8 GetNodeNumber( Msg const* _msg )const
454
+ {
455
+ if( _msg == NULL )
456
+ {
457
+ return 0;
458
+ }
459
+ else
460
+ {
461
+ return _msg->GetTargetNodeId();
462
+ }
463
+ }
464
+ private:
465
+ /**
466
+ * Creates a new Node object (deleting any previous Node object with the same nodeId) and
467
+ * queues a full query of the node's parameters (starting at the beginning of the query
468
+ * stages--Node::QueryStage_None). This function will send Notification::Type_NodeAdded
469
+ * and Notification::Type_NodeRemoved messages to identify these modifications.
470
+ * \param _nodeId The node ID of the node to create and query.
471
+ * \see Notification::Type_NodeAdded, Notification::Type_NodeRemoved, Node::QueryStage_None,
472
+ */
473
+ void InitNode( uint8 const _nodeId );
474
+
475
+ void InitAllNodes(); // Delete all nodes and fetch the data from the Z-Wave network again.
476
+
477
+ bool IsNodeListeningDevice( uint8 const _nodeId );
478
+ bool IsNodeFrequentListeningDevice( uint8 const _nodeId );
479
+ bool IsNodeBeamingDevice( uint8 const _nodeId );
480
+ bool IsNodeRoutingDevice( uint8 const _nodeId );
481
+ bool IsNodeSecurityDevice( uint8 const _nodeId );
482
+ uint32 GetNodeMaxBaudRate( uint8 const _nodeId );
483
+ uint8 GetNodeVersion( uint8 const _nodeId );
484
+ uint8 GetNodeSecurity( uint8 const _nodeId );
485
+ uint8 GetNodeBasic( uint8 const _nodeId );
486
+ uint8 GetNodeGeneric( uint8 const _nodeId );
487
+ uint8 GetNodeSpecific( uint8 const _nodeId );
488
+ string GetNodeType( uint8 const _nodeId );
489
+ uint32 GetNodeNeighbors( uint8 const _nodeId, uint8** o_neighbors );
490
+
491
+ string GetNodeManufacturerName( uint8 const _nodeId );
492
+ string GetNodeProductName( uint8 const _nodeId );
493
+ string GetNodeName( uint8 const _nodeId );
494
+ string GetNodeLocation( uint8 const _nodeId );
495
+
496
+ string GetNodeManufacturerId( uint8 const _nodeId );
497
+ string GetNodeProductType( uint8 const _nodeId );
498
+ string GetNodeProductId( uint8 const _nodeId );
499
+ void SetNodeManufacturerName( uint8 const _nodeId, string const& _manufacturerName );
500
+ void SetNodeProductName( uint8 const _nodeId, string const& _productName );
501
+ void SetNodeName( uint8 const _nodeId, string const& _nodeName );
502
+ void SetNodeLocation( uint8 const _nodeId, string const& _location );
503
+ void SetNodeLevel( uint8 const _nodeId, uint8 const _level );
504
+ void SetNodeOn( uint8 const _nodeId );
505
+ void SetNodeOff( uint8 const _nodeId );
506
+
507
+ Value* GetValue( ValueID const& _id );
508
+
509
+ bool IsAPICallSupported( uint8 const _apinum )const{ return (( m_apiMask[( _apinum - 1 ) >> 3] & ( 1 << (( _apinum - 1 ) & 0x07 ))) != 0 ); }
510
+ void SetAPICall( uint8 const _apinum, bool _toSet )
511
+ {
512
+ if( _toSet )
513
+ {
514
+ m_apiMask[( _apinum - 1 ) >> 3] |= ( 1 << (( _apinum - 1 ) & 0x07 ));
515
+ }
516
+ else
517
+ {
518
+ m_apiMask[( _apinum - 1 ) >> 3] &= ~( 1 << (( _apinum - 1 ) & 0x07 ));
519
+ }
520
+ }
521
+ uint8 NodeFromMessage( uint8 const* buffer );
522
+
523
+ //-----------------------------------------------------------------------------
524
+ // Controller commands
525
+ //-----------------------------------------------------------------------------
526
+ public:
527
+ /**
528
+ * Controller Commands.
529
+ * Commands to be used with the BeginControllerCommand method.
530
+ * \see Manager::BeginControllerCommand
531
+ */
532
+ enum ControllerCommand
533
+ {
534
+ ControllerCommand_None = 0, /**< No command. */
535
+ ControllerCommand_AddController, /**< Add a new controller to the Z-Wave network. The new controller will be a secondary. */
536
+ ControllerCommand_AddDevice, /**< Add a new device (but not a controller) to the Z-Wave network. */
537
+ ControllerCommand_CreateNewPrimary, /**< Add a new controller to the Z-Wave network. The new controller will be the primary, and the current primary will become a secondary controller. */
538
+ ControllerCommand_ReceiveConfiguration, /**< Receive Z-Wave network configuration information from another controller. */
539
+ ControllerCommand_RemoveController, /**< Remove a controller from the Z-Wave network. */
540
+ ControllerCommand_RemoveDevice, /**< Remove a new device (but not a controller) from the Z-Wave network. */
541
+ ControllerCommand_RemoveFailedNode, /**< Move a node to the controller's failed nodes list. This command will only work if the node cannot respond. */
542
+ ControllerCommand_HasNodeFailed, /**< Check whether a node is in the controller's failed nodes list. */
543
+ ControllerCommand_ReplaceFailedNode, /**< Replace a non-responding node with another. The node must be in the controller's list of failed nodes for this command to succeed. */
544
+ ControllerCommand_TransferPrimaryRole, /**< Make a different controller the primary. */
545
+ ControllerCommand_RequestNetworkUpdate, /**< Request network information from the SUC/SIS. */
546
+ ControllerCommand_RequestNodeNeighborUpdate, /**< Get a node to rebuild its neighbour list. This method also does ControllerCommand_RequestNodeNeighbors */
547
+ ControllerCommand_AssignReturnRoute, /**< Assign a network return routes to a device. */
548
+ ControllerCommand_DeleteAllReturnRoutes, /**< Delete all return routes from a device. */
549
+ ControllerCommand_CreateButton, /**< Create an id that tracks handheld button presses */
550
+ ControllerCommand_DeleteButton /**< Delete id that tracks handheld button presses */
551
+ };
552
+
553
+ /**
554
+ * Controller States.
555
+ * States reported via the callback handler passed into the BeginControllerCommand method.
556
+ * \see Manager::BeginControllerCommand
557
+ */
558
+ enum ControllerState
559
+ {
560
+ ControllerState_Normal = 0, /**< No command in progress. */
561
+ ControllerState_Waiting, /**< Controller is waiting for a user action. */
562
+ ControllerState_InProgress, /**< The controller is communicating with the other device to carry out the command. */
563
+ ControllerState_Completed, /**< The command has completed successfully. */
564
+ ControllerState_Failed, /**< The command has failed. */
565
+ ControllerState_NodeOK, /**< Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node is OK. */
566
+ ControllerState_NodeFailed /**< Used only with ControllerCommand_HasNodeFailed to indicate that the controller thinks the node has failed. */
567
+ };
568
+
569
+ typedef void (*pfnControllerCallback_t)( ControllerState _state, void* _context );
570
+
571
+ private:
572
+ // The public interface is provided via the wrappers in the Manager class
573
+ void ResetController();
574
+ void SoftReset();
575
+ void RequestNodeNeighbors( uint8 const _nodeId, uint32 const _requestFlags );
576
+
577
+ bool BeginControllerCommand( ControllerCommand _command, pfnControllerCallback_t _callback, void* _context, bool _highPower, uint8 _nodeId, uint8 _arg );
578
+ bool CancelControllerCommand();
579
+
580
+ ControllerState m_controllerState;
581
+ ControllerCommand m_controllerCommand;
582
+ pfnControllerCallback_t m_controllerCallback;
583
+ void* m_controllerCallbackContext;
584
+ bool m_controllerAdded;
585
+ uint8 m_controllerCommandNode;
586
+ uint8 m_controllerCommandArg;
587
+
588
+ uint8 m_SUCNode;
589
+
590
+ //-----------------------------------------------------------------------------
591
+ // Virtual Node commands
592
+ //-----------------------------------------------------------------------------
593
+ public:
594
+ /**
595
+ * Virtual Node Commands.
596
+ * Commands to be used with virtual nodes.
597
+ */
598
+ private:
599
+ uint32 GetVirtualNeighbors( uint8** o_neighbors );
600
+ void RequestVirtualNeighbors( MsgQueue const _queue );
601
+ bool IsVirtualNode( uint8 const _nodeId )const{ return (( m_virtualNeighbors[( _nodeId - 1 ) >> 3] & 1 << (( _nodeId - 1 ) & 0x07 )) != 0 ); }
602
+ void SendVirtualNodeInfo( uint8 const _fromNodeId, uint8 const _ToNodeId );
603
+ void SendSlaveLearnModeOff();
604
+ void SaveButtons();
605
+ void ReadButtons( uint8 const _nodeId );
606
+
607
+ bool m_virtualNeighborsReceived;
608
+ uint8 m_virtualNeighbors[NUM_NODE_BITFIELD_BYTES]; // Bitmask containing virtual neighbors
609
+
610
+ //-----------------------------------------------------------------------------
611
+ // SwitchAll
612
+ //-----------------------------------------------------------------------------
613
+ private:
614
+ // The public interface is provided via the wrappers in the Manager class
615
+ void SwitchAllOn();
616
+ void SwitchAllOff();
617
+
618
+ //-----------------------------------------------------------------------------
619
+ // Configuration Parameters (wrappers for the Node methods)
620
+ //-----------------------------------------------------------------------------
621
+ private:
622
+ // The public interface is provided via the wrappers in the Manager class
623
+ bool SetConfigParam( uint8 const _nodeId, uint8 const _param, int32 _value, uint8 const _size );
624
+ void RequestConfigParam( uint8 const _nodeId, uint8 const _param );
625
+
626
+ //-----------------------------------------------------------------------------
627
+ // Groups (wrappers for the Node methods)
628
+ //-----------------------------------------------------------------------------
629
+ private:
630
+ // The public interface is provided via the wrappers in the Manager class
631
+ uint8 GetNumGroups( uint8 const _nodeId );
632
+ uint32 GetAssociations( uint8 const _nodeId, uint8 const _groupIdx, uint8** o_associations );
633
+ uint8 GetMaxAssociations( uint8 const _nodeId, uint8 const _groupIdx );
634
+ string GetGroupLabel( uint8 const _nodeId, uint8 const _groupIdx );
635
+ void AddAssociation( uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId );
636
+ void RemoveAssociation( uint8 const _nodeId, uint8 const _groupIdx, uint8 const _targetNodeId );
637
+
638
+ //-----------------------------------------------------------------------------
639
+ // Notifications
640
+ //-----------------------------------------------------------------------------
641
+ private:
642
+ void QueueNotification( Notification* _notification ); // Adds a notification to the list. Notifications are queued until a point in the thread where we know we do not have any nodes locked.
643
+ void NotifyWatchers(); // Passes the notifications to all the registered watcher callbacks in turn.
644
+
645
+ list<Notification*> m_notifications;
646
+ Event* m_notificationsEvent;
647
+
648
+ //-----------------------------------------------------------------------------
649
+ // Statistics
650
+ //-----------------------------------------------------------------------------
651
+ public:
652
+ struct DriverData
653
+ {
654
+ uint32 s_SOFCnt; // Number of SOF bytes received
655
+ uint32 s_ACKWaiting; // Number of unsolicited messages while waiting for an ACK
656
+ uint32 s_readAborts; // Number of times read were aborted due to timeouts
657
+ uint32 s_badChecksum; // Number of bad checksums
658
+ uint32 s_readCnt; // Number of messages successfully read
659
+ uint32 s_writeCnt; // Number of messages successfully sent
660
+ uint32 s_CANCnt; // Number of CAN bytes received
661
+ uint32 s_NAKCnt; // Number of NAK bytes received
662
+ uint32 s_ACKCnt; // Number of ACK bytes received
663
+ uint32 s_OOFCnt; // Number of bytes out of framing
664
+ uint32 s_dropped; // Number of messages dropped & not delivered
665
+ uint32 s_retries; // Number of messages retransmitted
666
+ uint32 s_controllerReadCnt; // Number of controller messages read
667
+ uint32 s_controllerWriteCnt;// Number of controller messages sent
668
+ };
669
+
670
+ void LogDriverStatistics();
671
+
672
+ private:
673
+ void GetDriverStatistics( DriverData* _data );
674
+
675
+ uint32 m_SOFCnt; // Number of SOF bytes received
676
+ uint32 m_ACKWaiting; // Number of unsolcited messages while waiting for an ACK
677
+ uint32 m_readAborts; // Number of times read were aborted due to timeouts
678
+ uint32 m_badChecksum; // Number of bad checksums
679
+ uint32 m_readCnt; // Number of messages successfully read
680
+ uint32 m_writeCnt; // Number of messages successfully sent
681
+ uint32 m_CANCnt; // Number of CAN bytes received
682
+ uint32 m_NAKCnt; // Number of NAK bytes received
683
+ uint32 m_ACKCnt; // Number of ACK bytes received
684
+ uint32 m_OOFCnt; // Number of bytes out of framing
685
+ uint32 m_dropped; // Number of messages dropped & not delivered
686
+ uint32 m_retries; // Number of retransmitted messages
687
+ uint32 m_controllerReadCnt; // Number of messages read from controller
688
+ uint32 m_controllerWriteCnt;// Number of messages written to the controller
689
+ //time_t m_commandStart; // Start time of last command
690
+ //time_t m_timeoutLost; // Cumulative time lost to timeouts
691
+ };
692
+
693
+ } // namespace OpenZWave
694
+
695
+ #endif // _Driver_H