fanuc-ekg 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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