ice_tm 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 +7 -0
- data/exe/ice-tm +19 -0
- data/ext/baudrate/baudrate.c +94 -0
- data/ext/baudrate/extconf.rb +2 -0
- data/lib/ice_tm.rb +25 -0
- data/lib/ice_tm/ice_tm.rb +208 -0
- data/lib/ice_tm/version.rb +5 -0
- metadata +65 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4b75ddb028fb7f91ece76d947e7baaf49ca49834e94fd8eb511dc8bc358d320f
|
4
|
+
data.tar.gz: 102c2e59d34635e2dcdd5518e5acda17cc33c16e26eec46dff5d7e09c924c411
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7ebe5c6589697b31a5bf8b7d158bc99220eb043807720223556e4236544f8d5ce52cdcd61756a619dab0f3daa9f921c8ff0cf4c984b3cc416d21edf3d6d610f7
|
7
|
+
data.tar.gz: 41e1f87dd7ed6259ef5fd58768bbfad923c42060d036c3f35f2bd1bc651ca906d3cf7a4c383b3f701883e3799fb5cf02c78ddca6de3698cb85134392c89221f3
|
data/exe/ice-tm
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'ice_tm'
|
3
|
+
|
4
|
+
# Find Device running Ice Taskmanager
|
5
|
+
dev = nil
|
6
|
+
retry_count = 0
|
7
|
+
|
8
|
+
while(!dev)
|
9
|
+
dev = IceTM.find_device
|
10
|
+
|
11
|
+
if dev
|
12
|
+
puts "#{IceTM::BOLD}#{IceTM::GREEN}:: Device discovered successfully. Path: #{dev}#{IceTM::RESET}"
|
13
|
+
else
|
14
|
+
puts "#{IceTM::BOLD}#{IceTM::RED}:: No device found. Retrying #{retry_count += 1}#{IceTM::RESET}"
|
15
|
+
sleep 0.5
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
IceTM.start(dev)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#include <stdio.h>
|
2
|
+
#include <fcntl.h>
|
3
|
+
#include <termios.h>
|
4
|
+
#include "ruby.h"
|
5
|
+
|
6
|
+
VALUE setBaudRate(volatile VALUE obj, volatile VALUE dev, volatile VALUE speed) {
|
7
|
+
char *device = StringValuePtr(dev) ;
|
8
|
+
unsigned int spd = NUM2UINT(speed) ;
|
9
|
+
|
10
|
+
int serial_port = open(device, O_RDWR) ;
|
11
|
+
struct termios tty ;
|
12
|
+
|
13
|
+
char status = tcgetattr(serial_port, &tty) ;
|
14
|
+
|
15
|
+
// IDE sets these flags
|
16
|
+
// speed 57600 baud; line = 0;
|
17
|
+
// min = 0; time = 0;
|
18
|
+
// -brkint -icrnl -imaxbel
|
19
|
+
// -opost
|
20
|
+
// -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
|
21
|
+
|
22
|
+
if(status != 0) return Qnil ;
|
23
|
+
tty.c_cflag &= ~CSIZE ;
|
24
|
+
tty.c_cflag |= CS8 ;
|
25
|
+
tty.c_cflag |= CREAD | CLOCAL ;
|
26
|
+
tty.c_oflag &= ~OPOST ;
|
27
|
+
|
28
|
+
tty.c_lflag &= ~ECHO ;
|
29
|
+
tty.c_lflag &= ~ECHOCTL ;
|
30
|
+
tty.c_lflag &= ~ECHOK ;
|
31
|
+
tty.c_lflag &= ~ECHOE ;
|
32
|
+
tty.c_lflag &= ~ECHOKE ;
|
33
|
+
tty.c_lflag &= ~ISIG ;
|
34
|
+
tty.c_lflag &= ~ICRNL ;
|
35
|
+
tty.c_lflag &= ~IEXTEN ;
|
36
|
+
tty.c_lflag &= ~ICANON ;
|
37
|
+
|
38
|
+
tty.c_cc[VTIME] = 0 ;
|
39
|
+
tty.c_cc[VMIN] = 0 ;
|
40
|
+
|
41
|
+
cfsetispeed(&tty, spd) ;
|
42
|
+
cfsetospeed(&tty, spd) ;
|
43
|
+
status = tcsetattr(serial_port, TCSANOW, &tty) ;
|
44
|
+
|
45
|
+
if (status == 0) return Qtrue ;
|
46
|
+
else return Qfalse ;
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE getBaudRate(volatile VALUE obj, volatile VALUE dev) {
|
50
|
+
char *device = StringValuePtr(dev) ;
|
51
|
+
|
52
|
+
int serial_port = open(device, O_RDWR) ;
|
53
|
+
struct termios tty ;
|
54
|
+
|
55
|
+
char status = tcgetattr(serial_port, &tty) ;
|
56
|
+
|
57
|
+
if(status == 0) {
|
58
|
+
unsigned int in = cfgetispeed(&tty) ;
|
59
|
+
unsigned int out = cfgetospeed(&tty) ;
|
60
|
+
|
61
|
+
return rb_ary_new_from_args(2,
|
62
|
+
UINT2NUM(in), UINT2NUM(out)
|
63
|
+
) ;
|
64
|
+
}
|
65
|
+
|
66
|
+
return rb_ary_new() ;
|
67
|
+
}
|
68
|
+
|
69
|
+
void Init_baudrate() {
|
70
|
+
VALUE icetm = rb_define_module("IceTM") ;
|
71
|
+
rb_define_const(icetm, "B0", INT2FIX(B0)) ;
|
72
|
+
rb_define_const(icetm, "B50", INT2FIX(B50)) ;
|
73
|
+
rb_define_const(icetm, "B75", INT2FIX(B75)) ;
|
74
|
+
rb_define_const(icetm, "B110", INT2FIX(B110)) ;
|
75
|
+
rb_define_const(icetm, "B134", INT2FIX(B134)) ;
|
76
|
+
rb_define_const(icetm, "B150", INT2FIX(B150)) ;
|
77
|
+
rb_define_const(icetm, "B200", INT2FIX(B200)) ;
|
78
|
+
rb_define_const(icetm, "B300", INT2FIX(B300)) ;
|
79
|
+
rb_define_const(icetm, "B600", INT2FIX(B600)) ;
|
80
|
+
rb_define_const(icetm, "B1200", INT2FIX(B1200)) ;
|
81
|
+
rb_define_const(icetm, "B1800", INT2FIX(B1800)) ;
|
82
|
+
rb_define_const(icetm, "B2400", INT2FIX(B2400)) ;
|
83
|
+
rb_define_const(icetm, "B4800", INT2FIX(B4800)) ;
|
84
|
+
rb_define_const(icetm, "B9600", INT2FIX(B9600)) ;
|
85
|
+
rb_define_const(icetm, "B19200", INT2FIX(B19200)) ;
|
86
|
+
rb_define_const(icetm, "B38400", INT2FIX(B38400)) ;
|
87
|
+
rb_define_const(icetm, "B57600", INT2FIX(B57600)) ;
|
88
|
+
rb_define_const(icetm, "B115200", INT2FIX(B115200)) ;
|
89
|
+
|
90
|
+
rb_define_module_function(icetm, "set_baudrate", setBaudRate, 2) ;
|
91
|
+
|
92
|
+
rb_define_module_function(icetm, "get_baudrate", getBaudRate, 1) ;
|
93
|
+
rb_define_module_function(icetm, "baudrate", getBaudRate, 1) ;
|
94
|
+
}
|
data/lib/ice_tm.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Frozen_String_Literal: true
|
2
|
+
require 'ice_tm/baudrate'
|
3
|
+
|
4
|
+
module IceTM
|
5
|
+
# Errors
|
6
|
+
NoDeviceError = Class.new(StandardError)
|
7
|
+
|
8
|
+
# Other Important Constants
|
9
|
+
BAUDRATE = IceTM::B57600
|
10
|
+
|
11
|
+
TB = 10 ** 12
|
12
|
+
GB = 10 ** 9
|
13
|
+
MB = 10 ** 6
|
14
|
+
KB = 10 ** 3
|
15
|
+
|
16
|
+
RED = "\e[38;2;225;79;67m"
|
17
|
+
BLUE = "\e[38;2;45;125;255m"
|
18
|
+
GREEN = "\e[38;2;40;175;95m"
|
19
|
+
ORANGE = "\e[38;2;245;155;20m"
|
20
|
+
BOLD = "\e[1m"
|
21
|
+
RESET = "\e[0m"
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'ice_tm/version'
|
25
|
+
require 'ice_tm/ice_tm'
|
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
#!/usr/bin/ruby -w
|
3
|
+
# Frozen_String_Literal: true
|
4
|
+
|
5
|
+
require 'fcntl'
|
6
|
+
require 'linux_stat'
|
7
|
+
|
8
|
+
module IceTM
|
9
|
+
# Detect device
|
10
|
+
def find_device
|
11
|
+
dev = nil
|
12
|
+
|
13
|
+
Dir.glob('/sys/bus/usb/devices/*').each { |x|
|
14
|
+
v = File.join(x, 'idVendor')
|
15
|
+
vendor = IO.read(v).strip if File.readable?(v)
|
16
|
+
|
17
|
+
p = File.join(x, 'idProduct')
|
18
|
+
product = IO.read(p).strip if File.readable?(p)
|
19
|
+
|
20
|
+
if vendor == '1a86' && product == '7523'
|
21
|
+
puts "#{BOLD}#{GREEN}:: #{Time.now.strftime('%H:%M:%S.%2N')}: A potential device discovered: #{vendor}:#{product}#{RESET}"
|
22
|
+
|
23
|
+
Dir.glob('/dev/ttyUSB[0-9]*').each { |x|
|
24
|
+
if File.writable?(x)
|
25
|
+
puts "#{IceTM::BOLD}#{IceTM::BLUE}:: #{Time.now.strftime('%H:%M:%S.%2N')}: Changing `baudrate` to 57600...#{IceTM::RESET}"
|
26
|
+
IceTM.set_baudrate(x, IceTM::BAUDRATE)
|
27
|
+
else
|
28
|
+
"#{BOLD}#{RED}:: #{Time.now.strftime('%H:%M:%S.%2N')}: No permission granted to change Baudrate#{RESET}"
|
29
|
+
end
|
30
|
+
|
31
|
+
if File.readable?(x)
|
32
|
+
1000.times {
|
33
|
+
if File.open(x).gets.to_s.scrub.strip.include?("IceTM")
|
34
|
+
puts "#{BOLD}#{ORANGE}:: #{Time.now.strftime('%H:%M:%S.%2N')}: Multiple Ice Task "\
|
35
|
+
"Manager Hardware Found! "\
|
36
|
+
"Selecting: #{vendor}:#{product}#{RESET}" if dev
|
37
|
+
|
38
|
+
dev = x
|
39
|
+
break
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
}
|
46
|
+
|
47
|
+
dev
|
48
|
+
end
|
49
|
+
|
50
|
+
# Convert Numeric bytes to the format that ice-taskmanager can read
|
51
|
+
def convert_bytes(n)
|
52
|
+
if n >= TB
|
53
|
+
"%06.2f".%(n.fdiv(TB)).split('.').join + ?4
|
54
|
+
elsif n >= GB
|
55
|
+
"%06.2f".%(n.fdiv(GB)).split('.').join + ?3
|
56
|
+
elsif n >= MB
|
57
|
+
"%06.2f".%(n.fdiv(MB)).split('.').join + ?2
|
58
|
+
elsif n >= KB
|
59
|
+
"%06.2f".%(n.fdiv(KB)).split('.').join + ?1
|
60
|
+
else
|
61
|
+
"%06.2f".%(n).split('.').join + ?0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Convert percentages to the format that ice-taskmanager can read
|
66
|
+
def convert_percent(n)
|
67
|
+
"%06.2f".%(n).split('.').join
|
68
|
+
end
|
69
|
+
|
70
|
+
def start(device)
|
71
|
+
return false if(!device)
|
72
|
+
|
73
|
+
cpu_u = mem_u = swap_u = iostat = net_upload = net_download = 0
|
74
|
+
|
75
|
+
Thread.new {
|
76
|
+
while true
|
77
|
+
cpu_u = LS::CPU.total_usage(0.125).to_f
|
78
|
+
end
|
79
|
+
}
|
80
|
+
|
81
|
+
Thread.new {
|
82
|
+
while true
|
83
|
+
netstat = LS::Net::current_usage(0.1)
|
84
|
+
net_upload = netstat[:transmitted].to_i
|
85
|
+
net_download = netstat[:received].to_i
|
86
|
+
end
|
87
|
+
}
|
88
|
+
|
89
|
+
begin
|
90
|
+
in_sync = false
|
91
|
+
fd = IO.sysopen(device, Fcntl::O_RDWR | Fcntl::O_EXCL)
|
92
|
+
file = IO.open(fd)
|
93
|
+
|
94
|
+
until in_sync
|
95
|
+
file.syswrite(?! * 1000)
|
96
|
+
STDOUT.flush
|
97
|
+
|
98
|
+
begin
|
99
|
+
if file.readpartial(8000).include?(?~)
|
100
|
+
in_sync = true
|
101
|
+
break
|
102
|
+
end
|
103
|
+
rescue EOFError
|
104
|
+
retry
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
puts "#{IceTM::BOLD}#{IceTM::GREEN}:: #{Time.now.strftime('%H:%M:%S.%2N')}: Device ready!#{IceTM::RESET}"
|
109
|
+
|
110
|
+
while true
|
111
|
+
# cpu(01234) memUsed(999993) swapUsed(999992) io_active(0)
|
112
|
+
# netUpload(999991) netDownload(999990)
|
113
|
+
# disktotal(999990) diskused(999990)
|
114
|
+
|
115
|
+
memstat = LS::Memory.stat
|
116
|
+
mem_t = convert_bytes(memstat[:total].to_i.*(1000))
|
117
|
+
mem_u = convert_bytes(memstat[:used].to_i.*(1000))
|
118
|
+
mem_percent = convert_percent(memstat[:used].to_i.*(100).fdiv(memstat[:total].to_i))
|
119
|
+
|
120
|
+
swapstat = LS::Swap.stat
|
121
|
+
swap_u = convert_bytes(swapstat[:used].to_i.*(1000))
|
122
|
+
swap_percent = convert_percent(swapstat[:used].to_i.*(100).fdiv(swapstat[:total].to_i))
|
123
|
+
|
124
|
+
diskstat = LS::Filesystem.stat
|
125
|
+
disk_total = convert_bytes(diskstat[:total])
|
126
|
+
disk_used = convert_bytes(diskstat[:used])
|
127
|
+
_diskavail = LS::Filesystem.available
|
128
|
+
disk_avail = convert_bytes(_diskavail)
|
129
|
+
|
130
|
+
disk_used_percent = convert_percent(diskstat[:used].*(100).fdiv(diskstat[:total]))
|
131
|
+
disk_avail_percent = convert_percent(_diskavail.*(100).fdiv(diskstat[:total]))
|
132
|
+
|
133
|
+
total_process = LS::Process.count
|
134
|
+
ps_r = LS::Process.running.count
|
135
|
+
ps_sl = LS::Process.sleeping.count
|
136
|
+
ps_i = LS::Process.idle.count
|
137
|
+
ps_t = LS::Process.stopped.count
|
138
|
+
ps_z = LS::Process.zombie.count
|
139
|
+
|
140
|
+
# Output has to be exactly this long. If not, ice-taskmanager shows invalid result.
|
141
|
+
# No string is split inside ice-task manager, it just depends on the string length.
|
142
|
+
#
|
143
|
+
# cpu(01234) memUsed(999993) swapUsed(999992) io_active(0)
|
144
|
+
# netUpload(999991) netDownload(999990)
|
145
|
+
# disktotal(999990) diskused(999990) diskAvail(999990) totalProcess(12345678)
|
146
|
+
# memPercent(01234) swapPercent(01234) diskPercent(01234) diskAvailPercent(01234)
|
147
|
+
# psR(65536) psS(65536) psI(65536) psT(65536) psZ(65536)
|
148
|
+
|
149
|
+
# Array for better debugging
|
150
|
+
# a = [
|
151
|
+
# convert_percent(cpu_u),
|
152
|
+
# mem_u, swap_u, iostat(),
|
153
|
+
# convert_bytes(net_upload), convert_bytes(net_download),
|
154
|
+
# disk_total, disk_used, disk_avail,
|
155
|
+
# "%08d" % total_process,
|
156
|
+
# mem_percent, swap_percent, disk_used_percent, disk_avail_percent,
|
157
|
+
# "%05d" % ps_r, "%05d" % ps_sl, "%05d" % ps_i, "%05d" % ps_t, "%05d" % ps_z
|
158
|
+
# ]
|
159
|
+
|
160
|
+
str = "#{convert_percent(cpu_u)}#{mem_u}#{swap_u}#{iostat()}"\
|
161
|
+
"#{convert_bytes(net_upload)}#{convert_bytes(net_download)}"\
|
162
|
+
"#{disk_total}#{disk_used}#{disk_avail}#{"%08d" % total_process}"\
|
163
|
+
"#{mem_percent}#{swap_percent}#{disk_used_percent}#{disk_avail_percent}"\
|
164
|
+
"#{"%05d" % ps_r}#{"%05d" % ps_sl}#{"%05d" % ps_i}#{"%05d" % ps_t}#{"%05d" % ps_z}"
|
165
|
+
|
166
|
+
file.syswrite('!')
|
167
|
+
STDOUT.flush
|
168
|
+
sleep 0.0125
|
169
|
+
file.syswrite(str)
|
170
|
+
STDOUT.flush
|
171
|
+
sleep 0.0125
|
172
|
+
file.syswrite('~')
|
173
|
+
STDOUT.flush
|
174
|
+
|
175
|
+
sleep 0.1
|
176
|
+
end
|
177
|
+
rescue Interrupt, SystemExit, SignalException
|
178
|
+
file &.close
|
179
|
+
exit 0
|
180
|
+
rescue Errno::ENOENT, IceTM::NoDeviceError
|
181
|
+
device = find_device
|
182
|
+
|
183
|
+
unless device
|
184
|
+
puts "#{IceTM::BOLD}#{IceTM::RED}:: #{Time.now.strftime('%H:%M:%S.%2N')}: No device found. Retrying#{IceTM::RESET}"
|
185
|
+
sleep 0.1
|
186
|
+
end
|
187
|
+
|
188
|
+
retry
|
189
|
+
rescue Exception
|
190
|
+
puts $!.full_message
|
191
|
+
file &.close
|
192
|
+
sleep 0.1
|
193
|
+
retry
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def iostat
|
198
|
+
@@root_partition ||= IO.foreach('/proc/mounts').detect {
|
199
|
+
|x| x.split[1] == ?/
|
200
|
+
}.to_s.split[0].to_s.split(?/).to_a[-1]
|
201
|
+
|
202
|
+
iostat = IO.foreach('/proc/diskstats'.freeze).find { |x|
|
203
|
+
x.split[2] == @@root_partition
|
204
|
+
} &.split.to_a[11]
|
205
|
+
end
|
206
|
+
|
207
|
+
extend(self)
|
208
|
+
end
|
metadata
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ice_tm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sourav Goswami
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-04-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: linux_stat
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.2
|
27
|
+
description: A controller for Arduino OLED System Monitor, ICE Task Manager
|
28
|
+
email:
|
29
|
+
- souravgoswami@protonmail.com
|
30
|
+
executables:
|
31
|
+
- ice-tm
|
32
|
+
extensions:
|
33
|
+
- ext/baudrate/extconf.rb
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- exe/ice-tm
|
37
|
+
- ext/baudrate/baudrate.c
|
38
|
+
- ext/baudrate/extconf.rb
|
39
|
+
- lib/ice_tm.rb
|
40
|
+
- lib/ice_tm/ice_tm.rb
|
41
|
+
- lib/ice_tm/version.rb
|
42
|
+
homepage: https://github.com/souravgoswami/ice-tm
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 2.6.0
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubygems_version: 3.2.15
|
62
|
+
signing_key:
|
63
|
+
specification_version: 4
|
64
|
+
summary: A controller for Arduino OLED System Monitor, ICE Task Manager
|
65
|
+
test_files: []
|