geoptima 0.1.10 → 0.1.11
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/sample_short.json +27 -0
- data/lib/geoptima/data.rb +23 -8
- data/lib/geoptima/version.rb +1 -1
- metadata +5 -4
@@ -0,0 +1,27 @@
|
|
1
|
+
{"geoptima": {
|
2
|
+
"Version": "3.4","json-version":"2.0",
|
3
|
+
"subscriber":{
|
4
|
+
"imsi":"240084701402127","imei":"357841036600753","msisdn":"Not Available",
|
5
|
+
"Manufacturer":"HTC","Model":"HTC Desire","OS":"Android 2.2",
|
6
|
+
"start":"Jul 8 2011 18:52:23.995 GMT+02:00"},
|
7
|
+
"events-metadata": [
|
8
|
+
{"gps": ["timeoffset","latitude","longitude","altitude","accuracy","direction","speed"]},
|
9
|
+
{"signal": ["timeoffset", "strength", "rxqual", "ecio"]},
|
10
|
+
{"service": ["timeoffset", "plmn", "cell_id", "lac", "mnc", "mcc"]},
|
11
|
+
{"call": ["timeoffset", "status"]}
|
12
|
+
],
|
13
|
+
"events": [
|
14
|
+
{"gps":2, "values":[
|
15
|
+
0,"56.058200","12.966367","78.0","6.0","59.0625","83.7",
|
16
|
+
405,"56.058307","12.966710","78.0","6.0","59.414063","83.7"]},
|
17
|
+
{"signal":2, "values":[
|
18
|
+
108704,-85,"-1","-1",
|
19
|
+
111660,-83,"-1","-1"]},
|
20
|
+
{"service":2, "values":[
|
21
|
+
340980822,"20205","3371977","6014","05","202",
|
22
|
+
591987445,"24004","67575260","2311","04","240"]},
|
23
|
+
{"call":2, "values":[
|
24
|
+
340981167,"idle",
|
25
|
+
591987471,"idle"]}
|
26
|
+
]
|
27
|
+
}}
|
data/lib/geoptima/data.rb
CHANGED
@@ -94,8 +94,8 @@ module Geoptima
|
|
94
94
|
}
|
95
95
|
|
96
96
|
include ErrorCounter
|
97
|
-
attr_reader :file, :header, :name, :data, :fields, :time, :latitude, :longitude
|
98
|
-
def initialize(file,start,name,header,data)
|
97
|
+
attr_reader :file, :header, :name, :data, :fields, :time, :latitude, :longitude, :timeoffset
|
98
|
+
def initialize(file,start,name,header,data,previous=nil)
|
99
99
|
@file = file
|
100
100
|
@name = name
|
101
101
|
@header = header
|
@@ -104,11 +104,20 @@ module Geoptima
|
|
104
104
|
a[v] = check_field(@data[a.length])
|
105
105
|
a
|
106
106
|
end
|
107
|
-
timeoffset = (@fields['timeoffset'].to_f / MSPERDAY.to_f)
|
108
|
-
if(timeoffset<-0.0000001)
|
107
|
+
@timeoffset = (@fields['timeoffset'].to_f / MSPERDAY.to_f)
|
108
|
+
if(@timeoffset<-0.0000001)
|
109
109
|
puts "Have negative time offset: #{@fields['timeoffset']}" if($debug)
|
110
110
|
incr_error "#4506 negative offsets"
|
111
111
|
end
|
112
|
+
if previous
|
113
|
+
prev_to = previous.timeoffset
|
114
|
+
puts "Comparing timeoffset:#{timeoffset} to previous:#{prev_to}" if($debug)
|
115
|
+
if @timeoffset == prev_to
|
116
|
+
puts "Found the same timeoffset in consecutive events: #{name}:#{timeoffset} == #{previous.name}:#{previous.timeoffset}"
|
117
|
+
incr_error "#4576 same timeoffset"
|
118
|
+
@timeoffset = @timeoffset + 1.0 / MSPERDAY.to_f
|
119
|
+
end
|
120
|
+
end
|
112
121
|
@time = start + timeoffset
|
113
122
|
@fields.reject!{|k,v| k=~/timeoffset/}
|
114
123
|
if @fields['cell_id'].to_i > SHORT
|
@@ -235,7 +244,7 @@ module Geoptima
|
|
235
244
|
geoptima['events'].each do |data|
|
236
245
|
events = data['values']
|
237
246
|
event_type = data.keys.reject{|k| k=~/values/}[0]
|
238
|
-
event_count = data[event_type]
|
247
|
+
event_count = data[event_type].to_i
|
239
248
|
header = @events_metadata[event_type]
|
240
249
|
# If the JSON is broken (known bug on some releases of the iPhone app)
|
241
250
|
# Then get the header information from a list of known headers
|
@@ -249,9 +258,14 @@ module Geoptima
|
|
249
258
|
mismatch_records = events.length - header.length * event_count
|
250
259
|
if mismatch_records != 0
|
251
260
|
puts "'#{event_type}' header length #{header.length} incompatible with data length #{events.length} and record count #{event_count}"
|
261
|
+
proposed_header = header
|
252
262
|
header = nil
|
253
263
|
incr_error "Metadata mismatch"
|
254
|
-
if
|
264
|
+
if events.length == proposed_header.length * event_count * 2 && event_type == 'roundtrip'
|
265
|
+
incr_error "#4593 iPhone roundtrip event counts"
|
266
|
+
event_count *= 2
|
267
|
+
header = proposed_header
|
268
|
+
elsif Event::ALT_HEADERS.keys.grep(event_type).length>0
|
255
269
|
incr_error "#{Event::HEADER_BUGS[event_type]} #{event_type}"
|
256
270
|
[Event::KNOWN_HEADERS[event_type],*(Event::ALT_HEADERS[event_type])].each do |alt_header|
|
257
271
|
puts "Trying alternative header: #{alt_header.inspect}" if($debug)
|
@@ -275,13 +289,14 @@ module Geoptima
|
|
275
289
|
end
|
276
290
|
# Now process the single long data array into a list of events with timestamps
|
277
291
|
if header
|
278
|
-
events_data[event_type] = (0...
|
292
|
+
events_data[event_type] = (0...event_count).inject([]) do |a,block|
|
279
293
|
index = header.length * block
|
280
294
|
record = events[index...(index+header.length)]
|
281
295
|
if record && record.length == header.length
|
282
296
|
@count += 1
|
283
|
-
event = Event.new(self,start,event_type,header,record)
|
297
|
+
event = Event.new(self,start,event_type,header,record,a[-1])
|
284
298
|
combine_errors event
|
299
|
+
puts "About to add new event #{event} to existing list of #{a.length} events (previous: #{a[-1] && a[-1].time})" if($debug)
|
285
300
|
a << event
|
286
301
|
else
|
287
302
|
puts "Invalid '#{event_type}' data block #{block}: #{record.inspect}"
|
data/lib/geoptima/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geoptima
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 11
|
10
|
+
version: 0.1.11
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Craig Taverner
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-06-07 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: multi_json
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- examples/geoptima_file_time.rb
|
91
91
|
- examples/csv_stats.rb
|
92
92
|
- examples/sample_geoptima.json
|
93
|
+
- examples/sample_short.json
|
93
94
|
- README.rdoc
|
94
95
|
- CHANGELOG
|
95
96
|
- CONTRIBUTORS
|