oschii_ruby 0.0.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +3 -3
- data/lib/oschii/cloud.rb +30 -21
- data/lib/oschii/component.rb +2 -1
- data/lib/oschii/config.rb +0 -6
- data/lib/oschii/config_file.rb +38 -0
- data/lib/oschii/device.rb +114 -182
- data/lib/oschii/device_monitor.rb +53 -0
- data/lib/oschii/helpers/prompt.rb +34 -0
- data/lib/oschii/http_device.rb +4 -0
- data/lib/oschii/logging.rb +49 -0
- data/lib/oschii/session.rb +3 -1
- data/lib/oschii/version.rb +2 -2
- data/lib/oschii.rb +9 -8
- data/oschii_ruby.gemspec +30 -0
- metadata +9 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ca8dbfc96521d361bcc916a2ef41700fc4bd587dfadd0588d060c6363d4cd20e
|
|
4
|
+
data.tar.gz: 76c261c49d53bce164dcaadd6135e0daf846178c23853d4a612e114f519be118
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 421170576e181972700e2e630e5ffde3ca70e8503ea8b559cb0b4371b979647a89d2db1a3529b316510750e989470e81149ab76dd5b5d81b5bb85b86acc62d54
|
|
7
|
+
data.tar.gz: 9f28f28926d18a20d63720292ed31fbfdbf25854213744d651c0ac93ed03ab231833d61683f2119596ad07381cbaa499da22ea3cf8ed1e9a78da24312cfa35f6
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
oschii_ruby (0.0
|
|
4
|
+
oschii_ruby (0.1.0)
|
|
5
5
|
activesupport (~> 7.1.2)
|
|
6
6
|
faye-websocket (~> 0.11.3)
|
|
7
7
|
osc-ruby (~> 1.1.4)
|
|
@@ -41,9 +41,9 @@ GEM
|
|
|
41
41
|
domain_name (~> 0.5)
|
|
42
42
|
i18n (1.14.1)
|
|
43
43
|
concurrent-ruby (~> 1.0)
|
|
44
|
-
make_menu (0.0
|
|
44
|
+
make_menu (1.0.0)
|
|
45
45
|
tty-screen (~> 0.8.2)
|
|
46
|
-
mime-types (3.5.
|
|
46
|
+
mime-types (3.5.2)
|
|
47
47
|
mime-types-data (~> 3.2015)
|
|
48
48
|
mime-types-data (3.2023.1205)
|
|
49
49
|
minitest (5.20.0)
|
data/lib/oschii/cloud.rb
CHANGED
|
@@ -13,14 +13,19 @@ module Oschii
|
|
|
13
13
|
RESPONSE_ADDR = '/i_am_oschii'
|
|
14
14
|
HTTP_PORT = 8000
|
|
15
15
|
|
|
16
|
-
def initialize(silent: false)
|
|
16
|
+
def initialize(http: false, silent: false)
|
|
17
17
|
@osc_server = OSC::EMServer.new(RESPONSE_PORT)
|
|
18
|
-
|
|
18
|
+
if http
|
|
19
|
+
@http_server = WEBrick::HTTPServer.new(
|
|
20
|
+
Port: HTTP_PORT,
|
|
21
|
+
Logger: WEBrick::Log.new('/dev/null', WEBrick::Log::FATAL)
|
|
22
|
+
)
|
|
23
|
+
end
|
|
19
24
|
|
|
20
25
|
@devices = {}
|
|
21
26
|
@silent = silent
|
|
22
27
|
|
|
23
|
-
start_listening
|
|
28
|
+
start_listening http: http
|
|
24
29
|
end
|
|
25
30
|
|
|
26
31
|
attr_reader :osc_server, :http_server, :devices, :silent
|
|
@@ -30,8 +35,9 @@ module Oschii
|
|
|
30
35
|
|
|
31
36
|
puts "\n~~> Scanning Serial Ports...."
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
Dir.glob('/dev/cu.usbserial*') do |port|
|
|
39
|
+
# 9.times do |i|
|
|
40
|
+
# port = "/dev/ttyUSB#{i}"
|
|
35
41
|
print "\n~~> #{port}: "
|
|
36
42
|
begin
|
|
37
43
|
node = ::Oschii::SerialDevice.new(port)
|
|
@@ -53,7 +59,7 @@ module Oschii
|
|
|
53
59
|
self
|
|
54
60
|
end
|
|
55
61
|
|
|
56
|
-
def start_listening
|
|
62
|
+
def start_listening(http: false)
|
|
57
63
|
osc_server.add_method RESPONSE_ADDR do |message|
|
|
58
64
|
payload = message.to_a.first
|
|
59
65
|
begin
|
|
@@ -82,19 +88,24 @@ module Oschii
|
|
|
82
88
|
end
|
|
83
89
|
|
|
84
90
|
Thread.new do
|
|
85
|
-
puts "~~> Starting OSC Server on
|
|
91
|
+
puts "~~> Starting OSC Server on #{base_ip}:#{RESPONSE_PORT}" unless silent
|
|
86
92
|
osc_server.run
|
|
87
93
|
end
|
|
88
94
|
|
|
89
|
-
trap 'INT' do
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
puts "~~> Starting HTTP Server on port #{HTTP_PORT}" unless silent
|
|
93
|
-
http_server.start
|
|
95
|
+
trap 'INT' do
|
|
96
|
+
http_server.shutdown
|
|
97
|
+
exit
|
|
94
98
|
end
|
|
95
99
|
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
if http
|
|
101
|
+
Thread.new do
|
|
102
|
+
puts "~~> Starting HTTP Server on #{base_ip}:#{HTTP_PORT}" unless silent
|
|
103
|
+
http_server.start
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
http_server.mount '/api/devices', GetDevices, self
|
|
107
|
+
http_server.mount '/api/refresh', RefreshCloud, self
|
|
108
|
+
end
|
|
98
109
|
end
|
|
99
110
|
|
|
100
111
|
def wait_for(oschii_name, timeout: 300)
|
|
@@ -156,12 +167,10 @@ module Oschii
|
|
|
156
167
|
def base_ip
|
|
157
168
|
return @base_ip if @base_ip
|
|
158
169
|
|
|
159
|
-
ip = Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
|
|
170
|
+
ip = Socket.ip_address_list.detect { |intf| intf.ipv4_private? }
|
|
160
171
|
|
|
161
172
|
addr = ip.ip_address.to_s
|
|
162
173
|
|
|
163
|
-
puts "Local IP: #{addr}"
|
|
164
|
-
|
|
165
174
|
@base_ip = addr.split('.')[0..-2].join('.')
|
|
166
175
|
|
|
167
176
|
# if File.exists? BASE_IP_FILE
|
|
@@ -277,10 +286,10 @@ module Oschii
|
|
|
277
286
|
|
|
278
287
|
def saved_devices
|
|
279
288
|
@saved_devices ||= if File.exists? '.saved_devices'
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
289
|
+
File.read('.saved_devices').split("\n")
|
|
290
|
+
else
|
|
291
|
+
[]
|
|
292
|
+
end
|
|
284
293
|
end
|
|
285
294
|
|
|
286
295
|
def save_device(ip)
|
data/lib/oschii/component.rb
CHANGED
data/lib/oschii/config.rb
CHANGED
|
@@ -3,11 +3,6 @@ require_relative 'template'
|
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
5
5
|
module Oschii
|
|
6
|
-
# LOGO = '
|
|
7
|
-
# ╔═╗┌─┐┌─┐┬ ┬┬┬
|
|
8
|
-
# ║ ║└─┐│ ├─┤││
|
|
9
|
-
# ╚═╝└─┘└─┘┴ ┴┴┴'
|
|
10
|
-
|
|
11
6
|
COMPONENT_TYPES = %w(Sensor Driver Reporter Listener Monitor State Timer Pixel I2C).freeze
|
|
12
7
|
I2C = 'I2C'.freeze
|
|
13
8
|
BASIC_COMPONENT_TYPES = COMPONENT_TYPES.reject { |t| t == I2C }.freeze
|
|
@@ -117,7 +112,6 @@ module Oschii
|
|
|
117
112
|
next unless components[target_ref].nil?
|
|
118
113
|
|
|
119
114
|
type, name = target_ref.split(':')
|
|
120
|
-
puts name
|
|
121
115
|
name = name.split('/').first
|
|
122
116
|
unless name.start_with?('*')
|
|
123
117
|
new_comp = Component.new(type, { 'name' => name, 'warning' => 'Auto-created by Oschii Parser' })
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Oschii
|
|
2
|
+
module ConfigFile
|
|
3
|
+
def upload_config(filename = nil, silent: false)
|
|
4
|
+
if filename.nil?
|
|
5
|
+
filenames = Dir.glob("configs/#{name}_*.json")
|
|
6
|
+
if filenames.empty?
|
|
7
|
+
puts 'No previous config' unless silent
|
|
8
|
+
return
|
|
9
|
+
end
|
|
10
|
+
filename = filenames.sort.last
|
|
11
|
+
|
|
12
|
+
unless silent
|
|
13
|
+
display_name = filename.split('/')[-1]
|
|
14
|
+
.split('_')[-1]
|
|
15
|
+
.split('+')[0]
|
|
16
|
+
.gsub('T', ' ')
|
|
17
|
+
.gsub('.json', '')
|
|
18
|
+
puts "Latest: #{display_name}"
|
|
19
|
+
begin
|
|
20
|
+
prompt '>> [ENTER] to upload, [ESC] to cancel <<'
|
|
21
|
+
rescue CancelSerialQuery
|
|
22
|
+
return
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
self.config = JSON.parse File.read(filename)
|
|
28
|
+
|
|
29
|
+
self
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def save_config(filename = nil, silent: false)
|
|
33
|
+
filename ||= "configs/#{name}_#{Time.now.iso8601}.json"
|
|
34
|
+
File.write filename, JSON.pretty_generate(config)
|
|
35
|
+
puts "Saved #{filename.split('/')[-1]}" unless silent
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
data/lib/oschii/device.rb
CHANGED
|
@@ -1,17 +1,29 @@
|
|
|
1
|
+
require 'byebug'
|
|
2
|
+
require 'eventmachine'
|
|
3
|
+
require 'faye/websocket'
|
|
4
|
+
require 'io/console'
|
|
5
|
+
require 'json'
|
|
1
6
|
require 'restclient'
|
|
2
7
|
require 'rubyserial'
|
|
3
|
-
require 'json'
|
|
4
|
-
require 'io/console'
|
|
5
|
-
require 'faye/websocket'
|
|
6
|
-
require 'eventmachine'
|
|
7
|
-
require 'byebug'
|
|
8
8
|
|
|
9
9
|
require_relative 'config'
|
|
10
|
+
require_relative 'device_monitor'
|
|
11
|
+
|
|
12
|
+
# mixins
|
|
13
|
+
require_relative 'config_file'
|
|
14
|
+
require_relative 'logging'
|
|
15
|
+
require_relative 'helpers/prompt'
|
|
16
|
+
|
|
10
17
|
module Oschii
|
|
18
|
+
|
|
11
19
|
DeviceUnavailable = Class.new(StandardError)
|
|
12
20
|
NoConnection = Class.new(StandardError)
|
|
13
21
|
|
|
14
22
|
class Device
|
|
23
|
+
include ConfigFile
|
|
24
|
+
include Logging
|
|
25
|
+
include Helpers::Prompt
|
|
26
|
+
|
|
15
27
|
def initialize
|
|
16
28
|
@log_lines = []
|
|
17
29
|
refresh
|
|
@@ -19,60 +31,15 @@ module Oschii
|
|
|
19
31
|
|
|
20
32
|
attr_reader :log_lines
|
|
21
33
|
|
|
22
|
-
def
|
|
23
|
-
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# Connection
|
|
27
|
-
|
|
28
|
-
def refresh
|
|
29
|
-
@device_details = nil
|
|
30
|
-
@status = nil
|
|
31
|
-
@settings = nil
|
|
32
|
-
@config = nil
|
|
33
|
-
poke!
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def ip
|
|
37
|
-
raise NoConnection
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def poke
|
|
41
|
-
raise NoConnection
|
|
34
|
+
def inspect
|
|
35
|
+
"<#{self.class.name}[#{name}] (v#{version})>"
|
|
42
36
|
end
|
|
43
37
|
|
|
44
|
-
def
|
|
45
|
-
|
|
46
|
-
while remaining_attempts > 0
|
|
47
|
-
begin
|
|
48
|
-
if poke
|
|
49
|
-
# device_details
|
|
50
|
-
return true
|
|
51
|
-
end
|
|
52
|
-
return false
|
|
53
|
-
|
|
54
|
-
rescue RubySerial::Error => e
|
|
55
|
-
raise DeviceUnavailable, case e.message
|
|
56
|
-
when 'ENOENT'
|
|
57
|
-
'(no device)'
|
|
58
|
-
when 'EBUSY'
|
|
59
|
-
'(port in use)'
|
|
60
|
-
else
|
|
61
|
-
e.message
|
|
62
|
-
end
|
|
63
|
-
rescue RestClient::Exception => e
|
|
64
|
-
raise DeviceUnavailable, e.message
|
|
65
|
-
end
|
|
66
|
-
remaining_attempts -= 1
|
|
67
|
-
end
|
|
68
|
-
raise DeviceUnavailable, '(no response)'
|
|
38
|
+
def monitor
|
|
39
|
+
DeviceMonitor.new(self).start
|
|
69
40
|
end
|
|
70
41
|
|
|
71
|
-
# Device details
|
|
72
|
-
|
|
73
|
-
def raw_device_details
|
|
74
|
-
raise NoConnection
|
|
75
|
-
end
|
|
42
|
+
# --- Device details ---
|
|
76
43
|
|
|
77
44
|
def device_details
|
|
78
45
|
@device_details ||= JSON.parse(raw_device_details)
|
|
@@ -95,193 +62,158 @@ module Oschii
|
|
|
95
62
|
device_details['description']
|
|
96
63
|
end
|
|
97
64
|
|
|
98
|
-
|
|
99
|
-
|
|
65
|
+
# --- Status ---
|
|
66
|
+
|
|
67
|
+
def status
|
|
68
|
+
@status ||= JSON.parse(raw_status)
|
|
100
69
|
end
|
|
101
70
|
|
|
102
|
-
def
|
|
103
|
-
|
|
71
|
+
def uptime
|
|
72
|
+
status['uptime']
|
|
104
73
|
end
|
|
105
74
|
|
|
106
|
-
|
|
75
|
+
def total_mem
|
|
76
|
+
status['totalHeap']
|
|
77
|
+
end
|
|
107
78
|
|
|
108
|
-
def
|
|
109
|
-
|
|
79
|
+
def mem_used
|
|
80
|
+
total_mem - status['freeHeap']
|
|
110
81
|
end
|
|
111
82
|
|
|
112
|
-
def
|
|
113
|
-
|
|
83
|
+
def mem_used_percent
|
|
84
|
+
((mem_used.to_f / total_mem.to_f) * 100.0).to_i
|
|
114
85
|
end
|
|
115
86
|
|
|
116
|
-
def
|
|
117
|
-
status['
|
|
87
|
+
def total_files
|
|
88
|
+
status['totalSPIFFS']
|
|
118
89
|
end
|
|
119
90
|
|
|
120
|
-
|
|
91
|
+
def files_used
|
|
92
|
+
total_files - status['freeSPIFFS']
|
|
93
|
+
end
|
|
121
94
|
|
|
122
|
-
def
|
|
123
|
-
|
|
95
|
+
def files_used_percent
|
|
96
|
+
((files_used.to_f / total_files.to_f) * 100.0).to_i
|
|
124
97
|
end
|
|
125
98
|
|
|
126
|
-
def
|
|
127
|
-
|
|
99
|
+
def cycle_time_micros
|
|
100
|
+
status['cycleTime']
|
|
128
101
|
end
|
|
129
102
|
|
|
103
|
+
# --- Settings ---
|
|
104
|
+
|
|
130
105
|
def settings
|
|
131
106
|
@settings ||= JSON.parse(raw_settings)
|
|
132
107
|
end
|
|
133
108
|
|
|
134
|
-
# Configuration
|
|
109
|
+
# --- Configuration ---
|
|
135
110
|
|
|
136
|
-
def
|
|
137
|
-
|
|
111
|
+
def config_name
|
|
112
|
+
device_details['configName']
|
|
138
113
|
end
|
|
139
114
|
|
|
140
|
-
def
|
|
141
|
-
|
|
115
|
+
def config_description
|
|
116
|
+
device_details['configDescription']
|
|
142
117
|
end
|
|
143
118
|
|
|
144
|
-
def
|
|
145
|
-
|
|
119
|
+
def config_valid?
|
|
120
|
+
device_details['configValid']
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def failsafe_mode?
|
|
124
|
+
device_details['failsafeMode']
|
|
146
125
|
end
|
|
147
126
|
|
|
148
127
|
def config
|
|
149
128
|
@config ||= Oschii::Config.new(raw_config)
|
|
150
129
|
end
|
|
151
130
|
|
|
152
|
-
def
|
|
153
|
-
self.
|
|
131
|
+
def config=(hash)
|
|
132
|
+
self.raw_config = hash.to_json
|
|
154
133
|
end
|
|
155
134
|
|
|
156
135
|
def update!
|
|
157
136
|
self.config = config.compacted
|
|
158
137
|
end
|
|
159
138
|
|
|
160
|
-
def
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
139
|
+
def clear!
|
|
140
|
+
self.config = {}
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# --- Connection ---
|
|
144
|
+
|
|
145
|
+
def refresh
|
|
146
|
+
@device_details = nil
|
|
147
|
+
@status = nil
|
|
148
|
+
@settings = nil
|
|
149
|
+
@config = nil
|
|
150
|
+
poke!
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def poke!
|
|
154
|
+
remaining_attempts = 3
|
|
155
|
+
|
|
156
|
+
while remaining_attempts > 0
|
|
157
|
+
begin
|
|
158
|
+
if poke
|
|
159
|
+
# device_details
|
|
160
|
+
return true
|
|
180
161
|
end
|
|
162
|
+
return false
|
|
163
|
+
|
|
164
|
+
rescue RubySerial::Error, RestClient::Exception => e
|
|
165
|
+
raise DeviceUnavailable, e.message
|
|
181
166
|
end
|
|
167
|
+
|
|
168
|
+
remaining_attempts -= 1
|
|
182
169
|
end
|
|
170
|
+
raise DeviceUnavailable, '(no response)'
|
|
171
|
+
end
|
|
183
172
|
|
|
184
|
-
|
|
173
|
+
# --- Connection-specific commands ---
|
|
185
174
|
|
|
186
|
-
|
|
175
|
+
def poke
|
|
176
|
+
raise NoConnection
|
|
187
177
|
end
|
|
188
178
|
|
|
189
|
-
def
|
|
190
|
-
|
|
191
|
-
File.write filename, JSON.pretty_generate(config)
|
|
192
|
-
puts "Saved #{filename.split('/')[-1]}" unless silent
|
|
179
|
+
def restart
|
|
180
|
+
raise NoConnection
|
|
193
181
|
end
|
|
194
182
|
|
|
195
|
-
|
|
183
|
+
def ip
|
|
184
|
+
raise NoConnection
|
|
185
|
+
end
|
|
196
186
|
|
|
197
|
-
def
|
|
187
|
+
def raw_device_details
|
|
198
188
|
raise NoConnection
|
|
199
189
|
end
|
|
200
190
|
|
|
201
|
-
def
|
|
191
|
+
def raw_status
|
|
202
192
|
raise NoConnection
|
|
203
193
|
end
|
|
204
194
|
|
|
205
|
-
def
|
|
206
|
-
|
|
207
|
-
while (line = log_lines.shift)
|
|
208
|
-
if filter.nil? || line.match?(filter)
|
|
209
|
-
puts line
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
sleep 0.05
|
|
213
|
-
end
|
|
195
|
+
def raw_settings
|
|
196
|
+
raise NoConnection
|
|
214
197
|
end
|
|
215
198
|
|
|
216
|
-
def
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
all = params[:all]
|
|
220
|
-
|
|
221
|
-
sensors = all.nil? ? params[:sensors] : all
|
|
222
|
-
drivers = all.nil? ? params[:drivers] : all
|
|
223
|
-
monitors = all.nil? ? params[:monitors] : all
|
|
224
|
-
listeners = all.nil? ? params[:listeners] : all
|
|
225
|
-
states = all.nil? ? params[:states] : all
|
|
226
|
-
timers = all.nil? ? params[:timers] : all
|
|
227
|
-
subs = all.nil? ? params[:subs] : all
|
|
228
|
-
pixels = all.nil? ? params[:pixels] : all
|
|
229
|
-
network_in = all.nil? ? params[:network_in] : all
|
|
230
|
-
network_out = all.nil? ? params[:network_out] : all
|
|
231
|
-
timestamp = params[:timestamp]
|
|
232
|
-
to_file = params[:to_file]
|
|
233
|
-
|
|
234
|
-
current_logger['sensors'] = sensors unless sensors.nil?
|
|
235
|
-
current_logger['drivers'] = drivers unless drivers.nil?
|
|
236
|
-
current_logger['monitors'] = monitors unless monitors.nil?
|
|
237
|
-
current_logger['listeners'] = listeners unless listeners.nil?
|
|
238
|
-
current_logger['states'] = states unless states.nil?
|
|
239
|
-
current_logger['timers'] = timers unless timers.nil?
|
|
240
|
-
current_logger['subs'] = subs unless subs.nil?
|
|
241
|
-
current_logger['pixels'] = pixels unless pixels.nil?
|
|
242
|
-
current_logger['networkIn'] = network_in unless network_in.nil?
|
|
243
|
-
current_logger['networkOut'] = network_out unless network_out.nil?
|
|
244
|
-
current_logger['timestamp'] = timestamp unless timestamp.nil?
|
|
245
|
-
current_logger['logToFile'] = to_file unless to_file.nil?
|
|
246
|
-
update_settings({ 'logger' => current_logger })
|
|
247
|
-
current_logger = settings['logger']
|
|
248
|
-
puts JSON.pretty_generate current_logger
|
|
199
|
+
def settings=(new_settings)
|
|
200
|
+
raise NoConnection
|
|
249
201
|
end
|
|
250
202
|
|
|
251
|
-
def
|
|
252
|
-
|
|
203
|
+
def raw_config
|
|
204
|
+
raise NoConnection
|
|
253
205
|
end
|
|
254
206
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def prompt(text, obscure: false)
|
|
258
|
-
print "#{text}: "
|
|
259
|
-
input = ''
|
|
260
|
-
char = ''
|
|
261
|
-
until !char.empty? && char.ord == 13
|
|
262
|
-
char = STDIN.getch
|
|
263
|
-
if char.ord == 127
|
|
264
|
-
# BACKSPACE
|
|
265
|
-
input = input[0..-2]
|
|
266
|
-
print "\r#{text}: #{' ' * input.size} "
|
|
267
|
-
print "\r#{text}: #{obscure ? '*' * input.size : input}"
|
|
268
|
-
elsif char.ord == 27
|
|
269
|
-
# ESC
|
|
270
|
-
raise CancelSerialQuery
|
|
271
|
-
elsif char.ord == 13
|
|
272
|
-
# ENTER
|
|
273
|
-
else
|
|
274
|
-
input += char
|
|
275
|
-
if obscure
|
|
276
|
-
print '*'
|
|
277
|
-
else
|
|
278
|
-
print char
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
end
|
|
282
|
-
puts
|
|
283
|
-
input
|
|
207
|
+
def raw_config=(json)
|
|
208
|
+
raise NoConnection
|
|
284
209
|
end
|
|
285
210
|
|
|
211
|
+
def log
|
|
212
|
+
raise NoConnection
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def clear_log
|
|
216
|
+
raise NoConnection
|
|
217
|
+
end
|
|
286
218
|
end
|
|
287
219
|
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Oschii
|
|
2
|
+
class DeviceMonitor
|
|
3
|
+
def initialize(oschii)
|
|
4
|
+
@oschii = oschii
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
attr_reader :oschii
|
|
8
|
+
|
|
9
|
+
BAR = "--------------------------------------------------"
|
|
10
|
+
|
|
11
|
+
def start
|
|
12
|
+
oschii.refresh
|
|
13
|
+
|
|
14
|
+
puts
|
|
15
|
+
puts " Device: #{oschii.name}"
|
|
16
|
+
puts " #{oschii.description}" if oschii.description
|
|
17
|
+
puts " #{oschii.class.name}"
|
|
18
|
+
puts " IP: #{oschii.ip}"
|
|
19
|
+
puts "Version: #{oschii.version}"
|
|
20
|
+
puts " Config: #{oschii.config_name} [#{oschii.config_valid? ? ' OK ' : ' INVALID '}]"
|
|
21
|
+
puts " #{oschii.config_description}" if oschii.config_description
|
|
22
|
+
puts
|
|
23
|
+
|
|
24
|
+
if oschii.failsafe_mode?
|
|
25
|
+
puts " ! IN FAILSAFE MODE !"
|
|
26
|
+
puts
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
running = true
|
|
30
|
+
|
|
31
|
+
Thread.new do
|
|
32
|
+
while running
|
|
33
|
+
print "\r"
|
|
34
|
+
print " cycle #{oschii.cycle_time_micros}µs "
|
|
35
|
+
print "- used mem #{oschii.mem_used_percent.to_s.rjust(2)}% "
|
|
36
|
+
print "- used files:#{oschii.files_used_percent.to_s.rjust(2)}% "
|
|
37
|
+
print "- uptime #{oschii.uptime} "
|
|
38
|
+
|
|
39
|
+
oschii.refresh
|
|
40
|
+
sleep 1
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
gets
|
|
45
|
+
puts
|
|
46
|
+
|
|
47
|
+
running = false
|
|
48
|
+
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Oschii
|
|
2
|
+
module Helpers
|
|
3
|
+
module Prompt
|
|
4
|
+
def prompt(text, obscure: false)
|
|
5
|
+
print "#{text}: "
|
|
6
|
+
input = ''
|
|
7
|
+
char = ''
|
|
8
|
+
until !char.empty? && char.ord == 13
|
|
9
|
+
char = STDIN.getch
|
|
10
|
+
if char.ord == 127
|
|
11
|
+
# BACKSPACE
|
|
12
|
+
input = input[0..-2]
|
|
13
|
+
print "\r#{text}: #{' ' * input.size} "
|
|
14
|
+
print "\r#{text}: #{obscure ? '*' * input.size : input}"
|
|
15
|
+
elsif char.ord == 27
|
|
16
|
+
# ESC
|
|
17
|
+
raise CancelSerialQuery
|
|
18
|
+
elsif char.ord == 13
|
|
19
|
+
# ENTER
|
|
20
|
+
else
|
|
21
|
+
input += char
|
|
22
|
+
if obscure
|
|
23
|
+
print '*'
|
|
24
|
+
else
|
|
25
|
+
print char
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
puts
|
|
30
|
+
input
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/oschii/http_device.rb
CHANGED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Oschii
|
|
2
|
+
module Logging
|
|
3
|
+
def tail(filter: nil)
|
|
4
|
+
while true
|
|
5
|
+
while (line = log_lines.shift)
|
|
6
|
+
if filter.nil? || line.match?(filter)
|
|
7
|
+
puts line
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
sleep 0.05
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def logger(params = {})
|
|
15
|
+
current_logger = settings['logger']
|
|
16
|
+
|
|
17
|
+
all = params[:all]
|
|
18
|
+
|
|
19
|
+
sensors = all.nil? ? params[:sensors] : all
|
|
20
|
+
drivers = all.nil? ? params[:drivers] : all
|
|
21
|
+
monitors = all.nil? ? params[:monitors] : all
|
|
22
|
+
listeners = all.nil? ? params[:listeners] : all
|
|
23
|
+
states = all.nil? ? params[:states] : all
|
|
24
|
+
timers = all.nil? ? params[:timers] : all
|
|
25
|
+
subs = all.nil? ? params[:subs] : all
|
|
26
|
+
pixels = all.nil? ? params[:pixels] : all
|
|
27
|
+
network_in = all.nil? ? params[:network_in] : all
|
|
28
|
+
network_out = all.nil? ? params[:network_out] : all
|
|
29
|
+
timestamp = params[:timestamp]
|
|
30
|
+
to_file = params[:to_file]
|
|
31
|
+
|
|
32
|
+
current_logger['sensors'] = sensors unless sensors.nil?
|
|
33
|
+
current_logger['drivers'] = drivers unless drivers.nil?
|
|
34
|
+
current_logger['monitors'] = monitors unless monitors.nil?
|
|
35
|
+
current_logger['listeners'] = listeners unless listeners.nil?
|
|
36
|
+
current_logger['states'] = states unless states.nil?
|
|
37
|
+
current_logger['timers'] = timers unless timers.nil?
|
|
38
|
+
current_logger['subs'] = subs unless subs.nil?
|
|
39
|
+
current_logger['pixels'] = pixels unless pixels.nil?
|
|
40
|
+
current_logger['networkIn'] = network_in unless network_in.nil?
|
|
41
|
+
current_logger['networkOut'] = network_out unless network_out.nil?
|
|
42
|
+
current_logger['timestamp'] = timestamp unless timestamp.nil?
|
|
43
|
+
current_logger['logToFile'] = to_file unless to_file.nil?
|
|
44
|
+
update_settings({ 'logger' => current_logger })
|
|
45
|
+
current_logger = settings['logger']
|
|
46
|
+
puts JSON.pretty_generate current_logger
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
data/lib/oschii/session.rb
CHANGED
data/lib/oschii/version.rb
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
module Oschii
|
|
2
|
-
VERSION = '0.0
|
|
3
|
-
end
|
|
2
|
+
VERSION = '0.1.0'
|
|
3
|
+
end
|
data/lib/oschii.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative 'oschii/version'
|
|
2
2
|
|
|
3
3
|
require_relative 'oschii/device'
|
|
4
4
|
require_relative 'oschii/http_device'
|
|
@@ -21,18 +21,19 @@ module Oschii
|
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def cloud(silent: false)
|
|
25
|
-
@cloud ||= Cloud.new(silent: silent)
|
|
24
|
+
def cloud(http: false, silent: false)
|
|
25
|
+
@cloud ||= Cloud.new(http: http, silent: silent)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def populate
|
|
29
|
-
cloud.populate
|
|
28
|
+
def populate(echo: false)
|
|
29
|
+
cloud.populate(echo: echo)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def
|
|
32
|
+
def serve_oschii_forever
|
|
33
33
|
populate
|
|
34
|
-
puts
|
|
35
|
-
|
|
34
|
+
puts "Press CTRL+C to stop server."
|
|
35
|
+
|
|
36
|
+
while true; end
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
def serial
|
data/oschii_ruby.gemspec
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require File.expand_path('lib/oschii/version', __dir__)
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |s|
|
|
4
|
+
s.name = "oschii_ruby"
|
|
5
|
+
s.version = Oschii::VERSION
|
|
6
|
+
|
|
7
|
+
s.required_ruby_version = '>= 2.7.7'
|
|
8
|
+
|
|
9
|
+
s.summary = "Gem for managing Oschiis"
|
|
10
|
+
s.description = "Interfaces with a network of Oschiis"
|
|
11
|
+
|
|
12
|
+
s.authors = ["Barri Mason"]
|
|
13
|
+
s.email = "loki@amarantha.net"
|
|
14
|
+
s.homepage = "https://github.com/MisterGrimalkin/oschii_rubygem"
|
|
15
|
+
s.license = "MIT"
|
|
16
|
+
|
|
17
|
+
s.files = Dir[
|
|
18
|
+
'lib/**/*.rb',
|
|
19
|
+
'oschii_ruby.gemspec',
|
|
20
|
+
'Gemfile',
|
|
21
|
+
'Gemfile.lock'
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
s.add_dependency 'faye-websocket', '~> 0.11.3'
|
|
25
|
+
s.add_dependency 'rest-client', '~> 2.1.0'
|
|
26
|
+
s.add_dependency 'rubyserial', '~> 0.6.0'
|
|
27
|
+
s.add_dependency 'osc-ruby', '~> 1.1.4'
|
|
28
|
+
s.add_dependency 'webrick', '~> 1.8.1'
|
|
29
|
+
s.add_dependency 'activesupport', '~> 7.1.2'
|
|
30
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: oschii_ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0
|
|
4
|
+
version: 0.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Barri Mason
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-01-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faye-websocket
|
|
@@ -106,8 +106,12 @@ files:
|
|
|
106
106
|
- lib/oschii/cloud.rb
|
|
107
107
|
- lib/oschii/component.rb
|
|
108
108
|
- lib/oschii/config.rb
|
|
109
|
+
- lib/oschii/config_file.rb
|
|
109
110
|
- lib/oschii/device.rb
|
|
111
|
+
- lib/oschii/device_monitor.rb
|
|
112
|
+
- lib/oschii/helpers/prompt.rb
|
|
110
113
|
- lib/oschii/http_device.rb
|
|
114
|
+
- lib/oschii/logging.rb
|
|
111
115
|
- lib/oschii/osc_monitor.rb
|
|
112
116
|
- lib/oschii/parser.rb
|
|
113
117
|
- lib/oschii/serial_device.rb
|
|
@@ -115,7 +119,8 @@ files:
|
|
|
115
119
|
- lib/oschii/session.rb
|
|
116
120
|
- lib/oschii/template.rb
|
|
117
121
|
- lib/oschii/version.rb
|
|
118
|
-
|
|
122
|
+
- oschii_ruby.gemspec
|
|
123
|
+
homepage: https://github.com/MisterGrimalkin/oschii_rubygem
|
|
119
124
|
licenses:
|
|
120
125
|
- MIT
|
|
121
126
|
metadata: {}
|
|
@@ -125,7 +130,7 @@ require_paths:
|
|
|
125
130
|
- lib
|
|
126
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
132
|
requirements:
|
|
128
|
-
- - "
|
|
133
|
+
- - ">="
|
|
129
134
|
- !ruby/object:Gem::Version
|
|
130
135
|
version: 2.7.7
|
|
131
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|