Class: Oschii::Device

Inherits:
Object
  • Object
show all
Defined in:
lib/oschii/device.rb

Direct Known Subclasses

HttpDevice, SerialDevice

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDevice

Returns a new instance of Device.



15
16
17
18
# File 'lib/oschii/device.rb', line 15

def initialize
  @log_lines = []
  refresh
end

Instance Attribute Details

#log_linesObject (readonly)

Returns the value of attribute log_lines.



20
21
22
# File 'lib/oschii/device.rb', line 20

def log_lines
  @log_lines
end

Instance Method Details

#clear!Object



152
153
154
# File 'lib/oschii/device.rb', line 152

def clear!
  self.config = {}
end

#clear_logObject

Raises:



201
202
203
# File 'lib/oschii/device.rb', line 201

def clear_log
  raise NoConnection
end

#configObject



148
149
150
# File 'lib/oschii/device.rb', line 148

def config
  @config ||= Oschii::Config.new(raw_config)
end

#config=(hash) ⇒ Object



144
145
146
# File 'lib/oschii/device.rb', line 144

def config=(hash)
  self.raw_config = hash.to_json
end

#config_descriptionObject



102
103
104
# File 'lib/oschii/device.rb', line 102

def config_description
  device_details['configDescription']
end

#config_nameObject



98
99
100
# File 'lib/oschii/device.rb', line 98

def config_name
  device_details['configName']
end

#descriptionObject



94
95
96
# File 'lib/oschii/device.rb', line 94

def description
  device_details['description']
end

#device_detailsObject



77
78
79
# File 'lib/oschii/device.rb', line 77

def device_details
  @device_details ||= JSON.parse(raw_device_details)
end

#inspectObject



251
252
253
# File 'lib/oschii/device.rb', line 251

def inspect
  "<#{self.class.name}[#{name}] (v#{version})>"
end

#ipObject

Raises:



36
37
38
# File 'lib/oschii/device.rb', line 36

def ip
  raise NoConnection
end

#logObject

Logging

Raises:



197
198
199
# File 'lib/oschii/device.rb', line 197

def log
  raise NoConnection
end

#logger(params = {}) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# File 'lib/oschii/device.rb', line 216

def logger(params = {})
  current_logger = settings['logger']

  all = params[:all]

  sensors = all.nil? ? params[:sensors] : all
  drivers = all.nil? ? params[:drivers] : all
  monitors = all.nil? ? params[:monitors] : all
  listeners = all.nil? ? params[:listeners] : all
  states = all.nil? ? params[:states] : all
  timers = all.nil? ? params[:timers] : all
  subs = all.nil? ? params[:subs] : all
  pixels = all.nil? ? params[:pixels] : all
  network_in = all.nil? ? params[:network_in] : all
  network_out = all.nil? ? params[:network_out] : all
  timestamp = params[:timestamp]
  to_file = params[:to_file]

  current_logger['sensors'] = sensors unless sensors.nil?
  current_logger['drivers'] = drivers unless drivers.nil?
  current_logger['monitors'] = monitors unless monitors.nil?
  current_logger['listeners'] = listeners unless listeners.nil?
  current_logger['states'] = states unless states.nil?
  current_logger['timers'] = timers unless timers.nil?
  current_logger['subs'] = subs unless subs.nil?
  current_logger['pixels'] = pixels unless pixels.nil?
  current_logger['networkIn'] = network_in unless network_in.nil?
  current_logger['networkOut'] = network_out unless network_out.nil?
  current_logger['timestamp'] = timestamp unless timestamp.nil?
  current_logger['logToFile'] = to_file unless to_file.nil?
  update_settings({ 'logger' => current_logger })
  current_logger = settings['logger']
  puts JSON.pretty_generate current_logger
end

#nameObject



85
86
87
# File 'lib/oschii/device.rb', line 85

def name
  device_details['name']
end

#name=(new_name) ⇒ Object



89
90
91
92
# File 'lib/oschii/device.rb', line 89

def name=(new_name)
  self.settings = ({ name: new_name })
  refresh
end

#pokeObject

Raises:



40
41
42
# File 'lib/oschii/device.rb', line 40

def poke
  raise NoConnection
end

#poke!Object

Raises:



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/oschii/device.rb', line 44

def poke!
  remaining_attempts = 3
  while remaining_attempts > 0
    begin
      if poke
        # device_details
        return true
      end
      return false

    rescue RubySerial::Error => e
      raise DeviceUnavailable, case e.message
                               when 'ENOENT'
                                 '(no device)'
                               when 'EBUSY'
                                 '(port in use)'
                               else
                                 e.message
                               end
    rescue RestClient::Exception => e
      raise DeviceUnavailable, e.message
    end
    remaining_attempts -= 1
  end
  raise DeviceUnavailable, '(no response)'
end

#raw_configObject

Configuration

Raises:



136
137
138
# File 'lib/oschii/device.rb', line 136

def raw_config
  raise NoConnection
end

#raw_config=(json) ⇒ Object

Raises:



140
141
142
# File 'lib/oschii/device.rb', line 140

def raw_config=(json)
  raise NoConnection
end

#raw_device_detailsObject

Device details

Raises:



73
74
75
# File 'lib/oschii/device.rb', line 73

def raw_device_details
  raise NoConnection
end

#raw_settingsObject

Settings

Raises:



122
123
124
# File 'lib/oschii/device.rb', line 122

def raw_settings
  raise NoConnection
end

#raw_statusObject

Status

Raises:



108
109
110
# File 'lib/oschii/device.rb', line 108

def raw_status
  raise NoConnection
end

#refreshObject

Connection



28
29
30
31
32
33
34
# File 'lib/oschii/device.rb', line 28

def refresh
  @device_details = nil
  @status = nil
  @settings = nil
  @config = nil
  poke!
end

#restartObject

Raises:



22
23
24
# File 'lib/oschii/device.rb', line 22

def restart
  raise NoConnection
end

#save_config(filename = nil, silent: false) ⇒ Object



189
190
191
192
193
# File 'lib/oschii/device.rb', line 189

def save_config(filename = nil, silent: false)
  filename ||= "configs/#{name}_#{Time.now.iso8601}.json"
  File.write filename, JSON.pretty_generate(config)
  puts "Saved #{filename.split('/')[-1]}" unless silent
end

#settingsObject



130
131
132
# File 'lib/oschii/device.rb', line 130

def settings
  @settings ||= JSON.parse(raw_settings)
end

#settings=(new_settings) ⇒ Object

Raises:



126
127
128
# File 'lib/oschii/device.rb', line 126

def settings=(new_settings)
  raise NoConnection
end

#statusObject



112
113
114
# File 'lib/oschii/device.rb', line 112

def status
  @status ||= JSON.parse(raw_status)
end

#tail(filter: nil) ⇒ Object



205
206
207
208
209
210
211
212
213
214
# File 'lib/oschii/device.rb', line 205

def tail(filter: nil)
  while true
    while (line = log_lines.shift)
      if filter.nil? || line.match?(filter)
        puts line
      end
    end
    sleep 0.05
  end
end

#update!Object



156
157
158
# File 'lib/oschii/device.rb', line 156

def update!
  self.config = config.compacted
end

#upload_config(filename = nil, silent: false) ⇒ Object



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/oschii/device.rb', line 160

def upload_config(filename = nil, silent: false)
  if filename.nil?
    filenames = Dir.glob("configs/#{name}_*.json")
    if filenames.empty?
      puts 'No previous config' unless silent
      return
    end
    filename = filenames.sort.last

    unless silent
      display_name = filename.split('/')[-1]
                       .split('_')[-1]
                       .split('+')[0]
                       .gsub('T', ' ')
                       .gsub('.json', '')
      puts "Latest: #{display_name}"
      begin
        prompt '>> [ENTER] to upload, [ESC] to cancel <<'
      rescue CancelSerialQuery
        return
      end
    end
  end

  self.config = JSON.parse File.read(filename)

  self
end

#uptimeObject



116
117
118
# File 'lib/oschii/device.rb', line 116

def uptime
  status['uptime']
end

#versionObject



81
82
83
# File 'lib/oschii/device.rb', line 81

def version
  device_details['version']
end