fanuc-ekg 0.0.2

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.
data/History.txt ADDED
@@ -0,0 +1,9 @@
1
+ == 0.0.2 / 2010-10-14
2
+ * Support both Ruby 1.8 and Ruby 1.9
3
+
4
+ == 0.0.1 / 2010-10-13
5
+ * Change namespace to FANUC::EKG
6
+
7
+ == 0.0.1a / 2010-10-01
8
+
9
+ * Initial release!
data/README.txt ADDED
@@ -0,0 +1,54 @@
1
+ == fanuc-ekg
2
+ * by Jay Strybis
3
+ * http://strybis.com
4
+
5
+ == DESCRIPTION:
6
+
7
+ fanuc-ekg is a library for accessing the data exported from the FANUC Robotics
8
+ MotionPRO Robot EKG analysis tool.
9
+
10
+ == FEATURES/PROBLEMS:
11
+
12
+ * None yet
13
+
14
+ == SYNOPSIS:
15
+
16
+ @ekg_data = FANUC::Ekg.parse("path_to_some_ekg_file.csv")
17
+ @ekg_data.bins[:v2t1] # array of collisions by axis in BinV2T1
18
+ @ekg_data.bins[:v2t1].total # total collisions in BinV2T1
19
+ @ekg_data.bins[:v1t1][3] # number of collisions in BinV1T1 for axis 3
20
+ @ekg_data.alarms[:recent] # array of recent alarm data
21
+ @ekg_data.alarms[:worst] # array of worst alarm data
22
+
23
+ == REQUIREMENTS:
24
+
25
+ * A CSV file exported from DiagnosticsPRO
26
+
27
+ == INSTALL:
28
+
29
+ * sudo gem install fanuc-ekg
30
+
31
+ == LICENSE:
32
+
33
+ (The MIT License)
34
+
35
+ Copyright (c) 2010 Jay Strybis
36
+
37
+ Permission is hereby granted, free of charge, to any person obtaining
38
+ a copy of this software and associated documentation files (the
39
+ 'Software'), to deal in the Software without restriction, including
40
+ without limitation the rights to use, copy, modify, merge, publish,
41
+ distribute, sublicense, and/or sell copies of the Software, and to
42
+ permit persons to whom the Software is furnished to do so, subject to
43
+ the following conditions:
44
+
45
+ The above copyright notice and this permission notice shall be
46
+ included in all copies or substantial portions of the Software.
47
+
48
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
49
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
50
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
51
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
52
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
53
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
54
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ rescue LoadError
5
+ abort '### Please install the "bones" gem ###'
6
+ end
7
+
8
+ task :default => 'test:run'
9
+ task 'gem:release' => 'test:run'
10
+
11
+
12
+
13
+ Bones {
14
+ name 'fanuc-ekg'
15
+ authors 'Jay Strybis'
16
+ email 'jay.strybis@gmail.com'
17
+ url 'http://github.com/unreal/fanuc-ekg'
18
+ depend_on 'fastercsv', '1.5.3' if RUBY_VERSION.to_f < 1.9
19
+ }
20
+
data/bin/ekg ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(
4
+ File.join(File.dirname(__FILE__), %w[.. lib ekg]))
5
+
6
+ # Put your code here
7
+
data/lib/fanuc-ekg.rb ADDED
@@ -0,0 +1,218 @@
1
+ module FANUC
2
+ module Ekg
3
+
4
+ # :stopdoc:
5
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
+ # :startdoc:
8
+
9
+ # Returns the version string for the library.
10
+ #
11
+ def self.version
12
+ @version ||= File.read(path('version.txt')).strip
13
+ end
14
+
15
+ # Returns the library path for the module. If any arguments are given,
16
+ # they will be joined to the end of the libray path using
17
+ # <tt>File.join</tt>.
18
+ #
19
+ def self.libpath( *args, &block )
20
+ rv = args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
21
+ if block
22
+ begin
23
+ $LOAD_PATH.unshift LIBPATH
24
+ rv = block.call
25
+ ensure
26
+ $LOAD_PATH.shift
27
+ end
28
+ end
29
+ return rv
30
+ end
31
+
32
+ # Returns the lpath for the module. If any arguments are given,
33
+ # they will be joined to the end of the path using
34
+ # <tt>File.join</tt>.
35
+ #
36
+ def self.path( *args, &block )
37
+ rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
38
+ if block
39
+ begin
40
+ $LOAD_PATH.unshift PATH
41
+ rv = block.call
42
+ ensure
43
+ $LOAD_PATH.shift
44
+ end
45
+ end
46
+ return rv
47
+ end
48
+
49
+ # Utility method used to require all files ending in .rb that lie in the
50
+ # directory below this file that has the same name as the filename passed
51
+ # in. Optionally, a specific _directory_ name can be passed in such that
52
+ # the _filename_ does not have to be equivalent to the directory.
53
+ #
54
+ def self.require_all_libs_relative_to( fname, dir = nil )
55
+ dir ||= ::File.basename(fname, '.*')
56
+ search_me = ::File.expand_path(
57
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
58
+
59
+ Dir.glob(search_me).sort.each {|rb| require rb}
60
+ end
61
+
62
+ # what parser should we use
63
+ if RUBY_VERSION.to_f >= 1.9
64
+ require 'csv'
65
+ PARSER = CSV
66
+ else
67
+ require 'faster_csv'
68
+ PARSER = FasterCSV
69
+ end
70
+
71
+ class Bin
72
+ attr_accessor :collision_counts
73
+ def initialize
74
+ @collision_counts = []
75
+ end
76
+
77
+ def total
78
+ @collision_counts.inject {|sum,x| sum+x}
79
+ end
80
+
81
+ def [](id)
82
+ @collision_counts[id-1]
83
+ end
84
+ end
85
+
86
+ class Alarm
87
+ attr_reader :occured_at, :error_text, :safety_io, :velocity, :torque, :angle, :disturbance_torque
88
+ def initialize(options={})
89
+ @occured_at = options["DateTime"]
90
+ @error_text = options["ErrorText"]
91
+ @safety_io = options["Safety I/O"]
92
+
93
+ @velocity = {
94
+ :j1 => options["Vel J1[%]"],
95
+ :j2 => options["Vel J2[%]"],
96
+ :j3 => options["Vel J3[%]"],
97
+ :j4 => options["Vel J4[%]"],
98
+ :j5 => options["Vel J5[%]"]
99
+ }
100
+
101
+ @torque = {
102
+ :j1 => options["Torq J1[%]"],
103
+ :j2 => options["Torq J2[%]"],
104
+ :j3 => options["Torq J3[%]"],
105
+ :j4 => options["Torq J4[%]"],
106
+ :j5 => options["Torq J5[%]"]
107
+ }
108
+
109
+ @angle = {
110
+ :j1 => options["Angle J1[rad]"],
111
+ :j2 => options["Angle J2[rad]"],
112
+ :j3 => options["Angle J3[rad]"],
113
+ :j4 => options["Angle J4[rad]"],
114
+ :j5 => options["Angle J5[rad]"],
115
+ }
116
+
117
+ @disturbance_torque = {
118
+ :j1 => options["DistTorq J1[%]"],
119
+ :j2 => options["DistTorq J2[%]"],
120
+ :j3 => options["DistTorq J3[%]"],
121
+ :j4 => options["DistTorq J4[%]"],
122
+ :j5 => options["DistTorq J5[%]"]
123
+ }
124
+ end
125
+
126
+ end
127
+
128
+ class EkgData
129
+ attr_accessor :bins, :alarms
130
+ def initialize
131
+ @bins = {
132
+ :zero => Bin.new,
133
+ :v1t1 => Bin.new,
134
+ :v2t1 => Bin.new,
135
+ :v1t2 => Bin.new,
136
+ :v2t2 => Bin.new
137
+ }
138
+ @alarms = {
139
+ :recent => [],
140
+ :worst => []
141
+ }
142
+ end
143
+
144
+ def axis(id)
145
+ @sum = 0
146
+ @bins.each do |key,bin|
147
+ @sum += bin[id]
148
+ end
149
+ # should i remove bin 0?
150
+ @sum
151
+ end
152
+ end
153
+
154
+
155
+
156
+ class << self
157
+ def open(file_path)
158
+ File.open(file_path)
159
+ end
160
+
161
+ def split(file)
162
+ @output = {}
163
+ @str = ""
164
+ file.each do |line|
165
+ next if line == "Severity\n"
166
+ next if line == "Group,Bin0,BinV1T1,BinV2T1,BinV1T2,BinV2T2\n"
167
+ next if line == "MRA_Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]\n"
168
+ next if line == "Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]\n"
169
+ if line == "Most Recent Alarms(MRA) for Group 1\n"
170
+ @output[:bins] = @str
171
+ @str = ""
172
+ next
173
+ end
174
+ if line == "Worst Disturbance Alarms for Group 1\n"
175
+ @output[:recent] = @str
176
+ @str = ""
177
+ next
178
+ end
179
+ @str += line
180
+ end
181
+ @output[:worst] = @str
182
+ return @output
183
+ end
184
+
185
+
186
+ def parse(file_path)
187
+ @ekg_data = FANUC::Ekg::EkgData.new
188
+
189
+ f = open(file_path)
190
+ output = split(f) # split the output into 3 usable CSV sections
191
+
192
+ # parse bins
193
+ PARSER.parse(output[:bins],:headers=>"Group,Bin0,BinV1T1,BinV2T1,BinV1T2,BinV2T2") do |line|
194
+ @ekg_data.bins[:zero].collision_counts << line['Bin0'].to_i
195
+ @ekg_data.bins[:v1t1].collision_counts << line['BinV1T1'].to_i
196
+ @ekg_data.bins[:v2t1].collision_counts << line['BinV2T1'].to_i
197
+ @ekg_data.bins[:v1t2].collision_counts << line['BinV1T2'].to_i
198
+ @ekg_data.bins[:v2t2].collision_counts << line['BinV2T2'].to_i
199
+ end
200
+
201
+ # parse recent alarms
202
+ PARSER.parse(output[:recent],:headers => "MRA_Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]") do |line|
203
+ @ekg_data.alarms[:recent] << Ekg::Alarm.new(line.to_hash)
204
+ end
205
+
206
+ # parse worst disturbances
207
+ PARSER.parse(output[:worst],:headers=>"Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]") do |line|
208
+ @ekg_data.alarms[:worst] << Ekg::Alarm.new(line.to_hash)
209
+ end
210
+
211
+ @ekg_data
212
+ end
213
+ end
214
+
215
+ end # module Ekg
216
+ end # module FANUC
217
+ FANUC::Ekg.require_all_libs_relative_to(__FILE__)
218
+
@@ -0,0 +1,80 @@
1
+
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+
4
+ describe FANUC::Ekg do
5
+
6
+ it "should be able to open a file" do
7
+ f = FANUC::Ekg.open(File.join(File.dirname(__FILE__), %w[fixtures R14_2010_09_24.csv]))
8
+ f.should be_a_kind_of(File)
9
+ end
10
+
11
+ describe "with file" do
12
+ before(:each) do
13
+ @f = FANUC::Ekg.open(File.join(File.dirname(__FILE__), %w[fixtures R14_2010_09_24.csv]))
14
+ end
15
+
16
+ it "should split into a hash" do
17
+ @s = FANUC::Ekg.split(@f).should be_a_kind_of(Hash)
18
+ end
19
+
20
+ it "should have the right keys" do
21
+ FANUC::Ekg.split(@f).keys.should eql([:bins,:recent,:worst])
22
+ end
23
+ end
24
+
25
+ describe FANUC::Ekg::EkgData do
26
+ it "should return an FANUC::Ekg::EkgData object" do
27
+ FANUC::Ekg.parse(File.join(File.dirname(__FILE__), %w[fixtures R14_2010_09_24.csv])).should be_a_kind_of(FANUC::Ekg::EkgData)
28
+ end
29
+ before(:each) do
30
+ @ekg_data = FANUC::Ekg.parse(File.join(File.dirname(__FILE__), %w[fixtures R14_2010_09_24.csv]))
31
+ end
32
+
33
+ it "should respond to bins" do
34
+ @ekg_data.respond_to?(:bins).should be_true
35
+ end
36
+
37
+ it "should have 5 bins" do
38
+ @ekg_data.bins.length.should eql(5)
39
+ end
40
+
41
+ it "should have 10 axes in each bin" do
42
+ @ekg_data.bins.each do |key,bin|
43
+ bin.collision_counts.length.should eql(10)
44
+ end
45
+ end
46
+
47
+ describe "bins" do
48
+ it "zero should have a total of 5886" do
49
+ @ekg_data.bins[:zero].total.should eql(5886)
50
+ end
51
+
52
+ it "zero, axis 1, should have a total of 543" do
53
+ @ekg_data.bins[:zero][1].should eql(543)
54
+ end
55
+
56
+ it "v1t1, axis 3, should have a total of 299" do
57
+ @ekg_data.bins[:v1t1][3].should eql(299)
58
+ end
59
+
60
+ end
61
+
62
+ it "should be able to total collisions for each axis" do
63
+ @ekg_data.respond_to?(:axis).should be_true
64
+ end
65
+
66
+ it "should have the right total for axis 1, 1202" do
67
+ @ekg_data.axis(1).should eql(1202)
68
+ end
69
+
70
+ it "should have 10 recent alarms" do
71
+ @ekg_data.alarms[:recent].length.should eql(10)
72
+ end
73
+
74
+ it "should have 10 worst alarms" do
75
+ @ekg_data.alarms[:worst].length.should eql(10)
76
+ end
77
+
78
+ end
79
+ end
80
+
@@ -0,0 +1,36 @@
1
+ Severity
2
+ Group,Bin0,BinV1T1,BinV2T1,BinV1T2,BinV2T2
3
+ 1,543,463,179,0,17
4
+ 1,437,321,367,18,59
5
+ 1,440,299,435,10,18
6
+ 1,434,431,161,142,34
7
+ 1,426,624,132,13,7
8
+ 1,1202,0,0,0,0
9
+ 1,1202,0,0,0,0
10
+ 1,1202,0,0,0,0
11
+
12
+
13
+ Most Recent Alarms(MRA) for Group 1
14
+ MRA_Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]
15
+ 1,9/15/2010 12:27:00,Limit error (G:%d^2 A:%x^3 Hex),,2.43,25.84,19.09,7.06,7.96,0,0,0,0,1.46,0.77,0.21,0.04,0,0,0,0.72,-0.59,1.75,-1.75,3.82,0,0,0,22.4256292906178,49.9375780274657,3.51648351648352,5.55386023802258,6.18131868131868,0,0,0
16
+ 2,9/16/2010 10:12:36,Limit error (G:%d^2 A:%x^3 Hex),,1.44,11.21,8.04,2.64,2.6,0,0,0,0,0.26,0.03,0.3,0.04,0,0,0,0.47,-0.66,1.72,-1.72,3.55,0,0,0,17.162471395881,51.4357053682896,1.64835164835165,7.2627403112603,9.27197802197802,0,0,0
17
+ 3,9/16/2010 10:40:22,Limit error (G:%d^2 A:%x^3 Hex),,0.12,5.42,3.74,1.8,1.29,0,0,0,0,0.01,0.13,0,0,0,0,0,0.57,-0.6,1.75,-1.75,3.61,0,0,0,13.1578947368421,71.0362047440699,8.46153846153846,8.3613060726274,5.97527472527473,0,0,0
18
+ 4,9/16/2010 22:40:40,IMSTP input (Group:%d),Fence open\IMSTP,0.02,12.96,20.35,22.59,5.32,0,0,0,0,0.54,0,0.42,0.04,0,0,0,0.13,1.64,1.72,-1.69,-0.1,0,0,0,0,0,0,0,0,0,0,0
19
+ 5,9/20/2010 08:21:44,Collision Detect alarm (G:%d A:%d),,6.44,3.46,21.19,15.94,2.37,0,0,0,0,0.03,0.19,0.64,0.02,0,0,0,1.27,0.69,1.6,-1.6,0.28,0,0,0,29.6338672768879,7.49063670411985,25.7142857142857,150.259383582545,59.9587912087912,0,0,0
20
+ 6,9/20/2010 09:11:52,Collision Detect alarm (G:%d A:%d),,1.93,12.63,11.74,0.72,6.93,0,0,0,0,0.84,0,0.09,0.13,0,0,0,0.93,0.09,1.83,-1.83,-1.22,0,0,0,13.6155606407323,13.7328339575531,10.6593406593407,100.640830027464,23.1456043956044,0,0,0
21
+ 7,9/20/2010 10:48:18,Collision Detect alarm (G:%d A:%d),,11.3,11.29,13.59,2.07,34.08,0,0,0,0,0.45,0,0.04,0.36,0,0,0,0.95,0.21,1.85,-1.85,-0.97,0,0,0,0.91533180778032,33.3333333333333,30.3296703296703,101.312175770522,1.16758241758242,0,0,0
22
+ 8,9/21/2010 00:50:26,IMSTP input (Group:%d),Fence open\IMSTP,0.03,12.96,20.38,22.63,5.32,0,0,0,0,0.58,0,0.45,0.03,0,0,0,0.13,1.64,1.72,-1.69,-0.1,0,0,0,0,0,0,0,0,0,0,0
23
+ 9,9/22/2010 00:29:46,IMSTP input (Group:%d),Fence open\IMSTP,0.03,12.96,20.37,22.62,5.33,0,0,0,0,0.54,0,0.4,0.03,0,0,0,0.13,1.64,1.72,-1.69,-0.1,0,0,0,0,0,0,0,0,0,0,0
24
+ 10,9/23/2010 07:22:44,Collision Detect alarm (G:%d A:%d),,21.32,12.91,10.74,2.73,30.55,0,0,0,0,0.05,0.01,0.39,0.5,0,0,0,0.39,-0.3,1.83,-1.83,3.66,0,0,0,26.6590389016018,103.245942571785,123.736263736264,8.39182178822093,142.032967032967,0,0,0
25
+ Worst Disturbance Alarms for Group 1
26
+ Num,DateTime,ErrorText,Safety I/O,Vel J1[%],Vel J2[%],Vel J3[%],Vel J4[%],Vel J5[%],Vel J6[%],Vel J7[%],Vel J8[%],Torq J1[%],Torq J2[%],Torq J3[%],Torq J4[%],Torq J5[%],Torq J6[%],Torq J7[%],Torq J8[%],Angle J1[rad],Angle J2[rad],Angle J3[rad],Angle J4[rad],Angle J5[rad],Angle J6[rad],Angle J7[rad],Angle J8[rad],DistTorq J1[%],DistTorq J2[%],DistTorq J3[%],DistTorq J4[%],DistTorq J5[%],DistTorq J6[%],DistTorq J7[%],DistTorq J8[%]
27
+ 1,3/16/2010 07:04:36,Door open or E.Stop,,0.44,1.63,9.49,6.5,1.29,0,0,0,0.61,0.03,0.04,0.01,0.04,0,0,0,1.03,-0.25,1.7,-1.7,1.91,0,0,0,8.12356979405034,8.48938826466916,21.4285714285714,157.949343912115,6.11263736263736,0,0,0
28
+ 2,3/16/2010 07:04:36,Collision Detect alarm (G:%d A:%d),,0.44,1.63,9.49,6.5,1.29,0,0,0,0.61,0.03,0.04,0.01,0.04,0,0,0,1.03,-0.25,1.7,-1.7,1.91,0,0,0,8.12356979405034,8.48938826466916,21.4285714285714,157.949343912115,6.11263736263736,0,0,0
29
+ 3,4/22/2010 07:41:52,Door open or E.Stop,,2.72,0.42,7.29,6.36,0.88,0,0,0,0.29,0.48,0.01,2.05,0.21,0,0,0,1.04,-0.29,1.69,-1.69,2,0,0,0,5.49199084668192,9.86267166042447,24.7252747252747,157.094903875496,7.89835164835165,0,0,0
30
+ 4,4/22/2010 07:41:52,Collision Detect alarm (G:%d A:%d),,2.72,0.42,7.29,6.36,0.88,0,0,0,0.29,0.48,0.01,2.05,0.21,0,0,0,1.04,-0.29,1.69,-1.69,2,0,0,0,5.49199084668192,9.86267166042447,24.7252747252747,157.094903875496,7.89835164835165,0,0,0
31
+ 5,1/19/2010 15:11:40,Door open or E.Stop,,39.64,82.73,103.21,16.87,17.25,0,0,0,0.48,0.37,0.68,0.27,0.11,0,0,0,1.27,0.53,1.65,-1.65,0.15,0,0,0,25.4004576659039,14.856429463171,21.7582417582418,156.484589563625,140.865384615385,0,0,0
32
+ 6,1/19/2010 15:11:40,Collision Detect alarm (G:%d A:%d),,39.64,82.73,103.21,16.87,17.25,0,0,0,0.48,0.37,0.68,0.27,0.11,0,0,0,1.27,0.53,1.65,-1.65,0.15,0,0,0,25.4004576659039,14.856429463171,21.7582417582418,156.484589563625,140.865384615385,0,0,0
33
+ 7,7/13/2010 07:50:58,Door open or E.Stop,,9.12,6.52,1.49,3.47,5.63,0,0,0,0.44,0.01,0.01,0.1,0.06,0,0,0,0.62,-0.46,1.77,-1.77,-1,0,0,0,4.34782608695652,82.521847690387,70.3296703296703,156.393042416845,102.197802197802,0,0,0
34
+ 8,7/13/2010 07:50:58,Collision Detect alarm (G:%d A:%d),,9.12,6.52,1.49,3.47,5.63,0,0,0,0.44,0.01,0.01,0.1,0.06,0,0,0,0.62,-0.46,1.77,-1.77,-1,0,0,0,4.34782608695652,82.521847690387,70.3296703296703,156.393042416845,102.197802197802,0,0,0
35
+ 9,2/10/2010 15:29:06,Collision Detect alarm (G:%d A:%d),,0.84,7.92,13.7,5.33,2.73,0,0,0,0.18,0.15,0.12,0.14,0.05,0,0,0,-1.11,0.52,1.65,-1.65,-0.41,0,0,0,51.487414187643,109.36329588015,53.5164835164835,155.202929508697,0.343406593406593,0,0,0
36
+ 10,3/1/2010 12:48:02,Collision Detect alarm (G:%d A:%d),,82.89,97.29,88.82,9.1,5.72,0,0,0,0.41,8.41,1.96,0.15,0.05,0,0,0,1.13,0.06,1.75,-1.75,0,0,0,0,16.4759725400458,18.7265917602996,18.5714285714286,154.287458040891,12.5686813186813,0,0,0
@@ -0,0 +1,15 @@
1
+
2
+ require File.expand_path(
3
+ File.join(File.dirname(__FILE__), %w[.. lib fanuc-ekg]))
4
+
5
+ #Spec::Runner.configure do |config|
6
+ # == Mock Framework
7
+ #
8
+ # RSpec uses it's own mocking framework by default. If you prefer to
9
+ # use mocha, flexmock or RR, uncomment the appropriate line:
10
+ #
11
+ # config.mock_with :mocha
12
+ # config.mock_with :flexmock
13
+ # config.mock_with :rr
14
+ #end
15
+
data/test/test_ekg.rb ADDED
File without changes
data/version.txt ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fanuc-ekg
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 2
9
+ version: 0.0.2
10
+ platform: ruby
11
+ authors:
12
+ - Jay Strybis
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-14 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bones
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 4
31
+ - 7
32
+ version: 3.4.7
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: |-
36
+ fanuc-ekg is a library for accessing the data exported from the FANUC Robotics
37
+ MotionPRO Robot EKG analysis tool.
38
+ email: jay.strybis@gmail.com
39
+ executables:
40
+ - ekg
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - History.txt
45
+ - README.txt
46
+ - bin/ekg
47
+ - version.txt
48
+ files:
49
+ - History.txt
50
+ - README.txt
51
+ - Rakefile
52
+ - bin/ekg
53
+ - lib/fanuc-ekg.rb
54
+ - spec/fanuc-ekg_spec.rb
55
+ - spec/fixtures/R14_2010_09_24.csv
56
+ - spec/spec_helper.rb
57
+ - test/test_ekg.rb
58
+ - version.txt
59
+ has_rdoc: true
60
+ homepage: http://github.com/unreal/fanuc-ekg
61
+ licenses: []
62
+
63
+ post_install_message:
64
+ rdoc_options:
65
+ - --main
66
+ - README.txt
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ requirements: []
86
+
87
+ rubyforge_project: fanuc-ekg
88
+ rubygems_version: 1.3.7
89
+ signing_key:
90
+ specification_version: 3
91
+ summary: fanuc-ekg is a library for accessing the data exported from the FANUC Robotics MotionPRO Robot EKG analysis tool
92
+ test_files:
93
+ - test/test_ekg.rb