ruby_astm 1.2.2 → 1.2.3
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/lib/mappings.json +5 -0
- data/lib/publisher/poller.rb +7 -2
- data/lib/ruby_astm.rb +1 -0
- data/lib/ruby_astm/astm_server.rb +23 -9
- data/lib/ruby_astm/lab_interface.rb +20 -8
- data/lib/ruby_astm/result.rb +50 -27
- data/lib/ruby_astm/usb_module.rb +75 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e495bbce6cc215d7c08b9747276962a59e1f43bddb206b3383d709962472d140
|
4
|
+
data.tar.gz: 1b076d1c574bafae7b91fa976505cf0d23ec41cf9cc00eda5f3c899ecbc0da4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dd76d5568de871b42efbb96c3f79d82c70d43933184bc442906e965fd18fb571a024e210bf7e2952617c959efcf47027c00f284813069e276d409387b7d2415
|
7
|
+
data.tar.gz: 42e1a222ebbd3e6a215d7de88164155b833565a1c418266a5735c4026352dc29f3bfbf99c127fc861ad04ccb56813b5f9f5a43489e13291da42ae83b37777c38
|
data/lib/mappings.json
CHANGED
data/lib/publisher/poller.rb
CHANGED
@@ -167,8 +167,13 @@ class Poller
|
|
167
167
|
puts "tube is : #{tube}"
|
168
168
|
puts "tests hash is:"
|
169
169
|
puts tests_hash.to_s
|
170
|
-
|
171
|
-
|
170
|
+
|
171
|
+
tube_key = nil
|
172
|
+
unless tests_hash.keys.select{|c| c=~/#{tube}/ }.blank?
|
173
|
+
tube_key = tests_hash.keys.select{|c| c=~/#{tube}/ }[0]
|
174
|
+
tests_hash[tube_key] << machine_code
|
175
|
+
end
|
176
|
+
|
172
177
|
else
|
173
178
|
AstmServer.log("ERROR: Test: #{test} does not have an LIS code")
|
174
179
|
end
|
data/lib/ruby_astm.rb
CHANGED
@@ -8,6 +8,7 @@ require "redis"
|
|
8
8
|
class AstmServer
|
9
9
|
|
10
10
|
include LabInterface
|
11
|
+
include UsbModule
|
11
12
|
|
12
13
|
def self.log(message)
|
13
14
|
puts "" + message
|
@@ -28,27 +29,40 @@ class AstmServer
|
|
28
29
|
$record_end = "[13]"
|
29
30
|
$frame_end = "[10]"
|
30
31
|
|
31
|
-
|
32
|
+
|
33
|
+
## DEFAULT SERIAL PORT : /dev/ttyS0
|
34
|
+
## DEFAULT USB PORT : /dev/ttyUSB0
|
35
|
+
def initialize(server_ip=nil,server_port=nil,mpg=nil,respond_to_queries=false,serial_port='/dev/ttyS0',usb_port='/dev/ttyUSB0',serial_baud=9600,serial_parity=8,usb_baud=19200,usb_parity=8)
|
32
36
|
$redis = Redis.new
|
33
37
|
AstmServer.log("Initializing AstmServer")
|
34
38
|
self.server_ip = server_ip || "127.0.0.1"
|
35
39
|
self.server_port = server_port || 3000
|
36
40
|
self.respond_to_queries = respond_to_queries
|
41
|
+
self.serial_port = serial_port
|
42
|
+
self.serial_baud = serial_baud
|
43
|
+
self.serial_parity = serial_parity
|
44
|
+
self.usb_port = usb_port
|
45
|
+
self.usb_baud = usb_baud
|
46
|
+
self.usb_parity = usb_parity
|
37
47
|
$mappings = JSON.parse(IO.read(mpg || AstmServer.default_mappings))
|
38
48
|
end
|
39
49
|
|
40
50
|
def start_server
|
41
51
|
EventMachine.run {
|
42
|
-
serial = EventMachine.open_serial(
|
43
|
-
puts "RUNNING SERIAL ON
|
52
|
+
serial = EventMachine.open_serial(serial_port, serial_baud, serial_parity,LabInterface)
|
53
|
+
puts "RUNNING SERIAL ON #{serial_port} ------------ #{serial.to_s}"
|
44
54
|
self.ethernet_server = EventMachine::start_server self.server_ip, self.server_port, LabInterface
|
45
55
|
AstmServer.log("Running ETHERNET SERVER on #{server_port}")
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
56
|
+
usb = EventMachine.open_serial(usb_port,usb_baud,usb_parity)
|
57
|
+
self.usb_response_bytes = []
|
58
|
+
EM.add_periodic_timer(5) do
|
59
|
+
puts "running usb on #{usb_port}"
|
60
|
+
puts "sending machine data request #{request_results}"
|
61
|
+
usb.send_data(request_results)
|
62
|
+
end
|
63
|
+
usb.on_data do |data|
|
64
|
+
parse_usb_response(data)
|
65
|
+
end
|
52
66
|
}
|
53
67
|
end
|
54
68
|
|
@@ -11,11 +11,19 @@ module LabInterface
|
|
11
11
|
EOT = "\x04"
|
12
12
|
|
13
13
|
|
14
|
-
|
15
|
-
mattr_accessor :headers
|
16
14
|
mattr_accessor :ethernet_server
|
17
15
|
mattr_accessor :server_ip
|
18
16
|
mattr_accessor :server_port
|
17
|
+
mattr_accessor :serial_port
|
18
|
+
mattr_accessor :serial_baud
|
19
|
+
mattr_accessor :serial_parity
|
20
|
+
mattr_accessor :usb_port
|
21
|
+
mattr_accessor :usb_baud
|
22
|
+
mattr_accessor :usb_parity
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
mattr_accessor :headers
|
19
27
|
mattr_accessor :mapping
|
20
28
|
mattr_accessor :respond_to_queries
|
21
29
|
|
@@ -83,7 +91,9 @@ module LabInterface
|
|
83
91
|
|
84
92
|
def receive_data(data)
|
85
93
|
|
86
|
-
|
94
|
+
|
95
|
+
begin
|
96
|
+
|
87
97
|
|
88
98
|
self.data_buffer ||= ''
|
89
99
|
|
@@ -179,11 +189,13 @@ module LabInterface
|
|
179
189
|
send_data(ACK)
|
180
190
|
end
|
181
191
|
end
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
192
|
+
|
193
|
+
rescue => e
|
194
|
+
#self.headers = []
|
195
|
+
AstmServer.log("data was: " + self.data_buffer + "error is:" + e.backtrace.to_s)
|
196
|
+
#send_data(EOT)
|
197
|
+
end
|
198
|
+
|
187
199
|
end
|
188
200
|
|
189
201
|
def send_enq
|
data/lib/ruby_astm/result.rb
CHANGED
@@ -10,46 +10,60 @@ class Result
|
|
10
10
|
|
11
11
|
def set_name(args)
|
12
12
|
if line = args[:line]
|
13
|
-
puts line.to_s
|
14
|
-
puts line.fields[2].to_s
|
15
|
-
line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
|
16
|
-
|
17
|
-
self.name = lookup_mapping(name)
|
18
|
-
|
19
|
-
self.report_name = lookup_report_name(name)
|
20
13
|
|
21
|
-
|
14
|
+
unless line.fields[2].blank?
|
15
|
+
line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
|
16
|
+
|
17
|
+
self.name = lookup_mapping(name)
|
18
|
+
|
19
|
+
self.report_name = lookup_report_name(name)
|
22
20
|
|
23
|
-
|
21
|
+
}
|
22
|
+
end
|
24
23
|
|
25
|
-
|
24
|
+
unless self.name.blank?
|
25
|
+
self.name.scan(/(?<test_name>\d+)\/(?<dilution>\d+)\/(?<pre_dilution>[a-zA-Z0-9]+)/) { |test_name,dilution,pre_dilution|
|
26
26
|
|
27
|
-
|
27
|
+
self.name = lookup_mapping(test_name)
|
28
28
|
|
29
|
-
|
29
|
+
self.report_name = lookup_report_name(test_name)
|
30
|
+
|
31
|
+
self.dilution = dilution
|
32
|
+
|
33
|
+
}
|
34
|
+
end
|
30
35
|
|
31
|
-
}
|
32
36
|
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
40
|
def set_value(args)
|
37
41
|
if line = args[:line]
|
38
|
-
|
39
|
-
|
40
|
-
self.value =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
|
43
|
+
unless line.fields[3].blank?
|
44
|
+
self.value = line.fields[3].strip
|
45
|
+
self.value.scan(/(?<flag>\d+)\^(?<value>\d?\.?\d+)/) {|flag,value|
|
46
|
+
self.value = value
|
47
|
+
}
|
48
|
+
end
|
49
|
+
unless line.fields[2].blank?
|
50
|
+
line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
|
51
|
+
if transform_expression = lookup_transform(name)
|
52
|
+
self.value = eval(transform_expression)
|
53
|
+
end
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
47
57
|
end
|
48
58
|
end
|
49
59
|
|
50
60
|
def set_flags(args)
|
51
61
|
if line = args[:line]
|
52
|
-
|
62
|
+
|
63
|
+
unless line.fields[6].blank?
|
64
|
+
self.flags = line.fields[6].strip
|
65
|
+
end
|
66
|
+
|
53
67
|
end
|
54
68
|
end
|
55
69
|
|
@@ -69,15 +83,23 @@ class Result
|
|
69
83
|
|
70
84
|
def set_reference_ranges(args)
|
71
85
|
if line = args[:line]
|
72
|
-
|
86
|
+
|
87
|
+
unless line.fields[5].blank?
|
88
|
+
self.reference_ranges = line.fields[5].strip
|
89
|
+
end
|
90
|
+
|
73
91
|
end
|
74
92
|
end
|
75
93
|
|
76
94
|
def set_dilution(args)
|
77
95
|
if line = args[:line]
|
78
|
-
|
79
|
-
|
80
|
-
|
96
|
+
|
97
|
+
unless line.fields[2].blank?
|
98
|
+
line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
|
99
|
+
self.dilution = dilution unless self.dilution
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
81
103
|
end
|
82
104
|
end
|
83
105
|
|
@@ -114,6 +136,7 @@ class Result
|
|
114
136
|
super
|
115
137
|
end
|
116
138
|
=end
|
139
|
+
|
117
140
|
end
|
118
141
|
|
119
142
|
## @return[String] the name defined in the mappings.json file, or the name that wqs passed in.
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require "active_support/all"
|
2
|
+
|
3
|
+
module UsbModule
|
4
|
+
|
5
|
+
mattr_accessor :usb_response_bytes
|
6
|
+
|
7
|
+
def begin_patient_results
|
8
|
+
">00A00013"
|
9
|
+
end
|
10
|
+
|
11
|
+
def request_version
|
12
|
+
">00000080\r00"
|
13
|
+
end
|
14
|
+
|
15
|
+
def request_status
|
16
|
+
">00000082\r00"
|
17
|
+
end
|
18
|
+
|
19
|
+
## requests the last 5 tests performed.
|
20
|
+
## last two digits before the carriage return are 00
|
21
|
+
## if digits are 01 : will take the 5 penultimate tests
|
22
|
+
## if digits are 13 : will take the first 5 tests from memory.
|
23
|
+
def request_results
|
24
|
+
">0002009300\r00"
|
25
|
+
end
|
26
|
+
|
27
|
+
def interpret?
|
28
|
+
## if the third last is a carriage return, then interpret.l
|
29
|
+
|
30
|
+
self.usb_response_bytes[-3] == 13
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_usb_response(string_data)
|
34
|
+
string_data.bytes.to_a.each do |byte|
|
35
|
+
self.usb_response_bytes.push(byte)
|
36
|
+
end
|
37
|
+
#puts "self usb response bytes:"
|
38
|
+
#puts self.usb_response_bytes.to_s
|
39
|
+
if interpret?
|
40
|
+
#puts "interpret"
|
41
|
+
self.usb_response_bytes[13..-4].each_slice(32) do |patient_record|
|
42
|
+
bar_code = nil
|
43
|
+
bar_code = patient_record[11..23].pack('c*').gsub(/\./,'')
|
44
|
+
#puts "bar code: #{bar_code}"
|
45
|
+
unless bar_code.strip.blank?
|
46
|
+
esr = patient_record[26]
|
47
|
+
patient = Patient.new(:orders => [Order.new(:results => [Result.new(:value => esr, :name => "ESR", :report_name => "ESR")])])
|
48
|
+
patient = Patient.new({})
|
49
|
+
patient.patient_id = bar_code
|
50
|
+
patient.orders = []
|
51
|
+
order = Order.new({})
|
52
|
+
result = Result.new({})
|
53
|
+
result.value = esr.to_s
|
54
|
+
result.name = "ESR"
|
55
|
+
result.report_name = "ESR"
|
56
|
+
order.id = bar_code
|
57
|
+
order.results = []
|
58
|
+
order.results << result
|
59
|
+
patient.orders << order
|
60
|
+
#puts patient.orders.size
|
61
|
+
#puts patient.orders.first.results.size
|
62
|
+
#puts patient.orders.first.results.first.to_s
|
63
|
+
#puts "patient to json is:"
|
64
|
+
puts patient.to_json
|
65
|
+
$redis.lpush("patients",patient.to_json)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
self.usb_response_bytes = []
|
69
|
+
else
|
70
|
+
#puts "dont interpret"
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_astm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bhargav Raut
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- lib/ruby_astm/patient.rb
|
134
134
|
- lib/ruby_astm/query.rb
|
135
135
|
- lib/ruby_astm/result.rb
|
136
|
+
- lib/ruby_astm/usb_module.rb
|
136
137
|
homepage: https://www.github/com/wordjelly/ruby_astm
|
137
138
|
licenses:
|
138
139
|
- MIT
|