RbGps 0.1
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/extconf.rb +9 -0
- data/rb_gps.c +216 -0
- data/test.rb +19 -0
- metadata +55 -0
data/extconf.rb
ADDED
data/rb_gps.c
ADDED
@@ -0,0 +1,216 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
#include <ruby.h>
|
4
|
+
#include <errno.h>
|
5
|
+
#include "version.h"
|
6
|
+
#include "gps.h"
|
7
|
+
|
8
|
+
#include <stdio.h>
|
9
|
+
|
10
|
+
/* classes */
|
11
|
+
VALUE cRbGps;
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
/* the symbols in a struct as a namespace */
|
16
|
+
struct _symbols {
|
17
|
+
VALUE online;
|
18
|
+
|
19
|
+
VALUE status;
|
20
|
+
VALUE status_no_fix;
|
21
|
+
VALUE status_fix;
|
22
|
+
VALUE status_dgps_fix;
|
23
|
+
|
24
|
+
|
25
|
+
VALUE mode_not_seen;
|
26
|
+
VALUE mode_no_fix;
|
27
|
+
VALUE mode_2d;
|
28
|
+
VALUE mode_3d;
|
29
|
+
|
30
|
+
VALUE fix_time;
|
31
|
+
VALUE fix_mode;
|
32
|
+
VALUE fix_latitude;
|
33
|
+
VALUE fix_longitude;
|
34
|
+
VALUE fix_altitude;
|
35
|
+
VALUE fix_speed;
|
36
|
+
|
37
|
+
};
|
38
|
+
|
39
|
+
static struct _symbols symbolTable;
|
40
|
+
|
41
|
+
struct rb_Gps_cls_ {
|
42
|
+
struct gps_data_t *gps_data;
|
43
|
+
};
|
44
|
+
|
45
|
+
|
46
|
+
typedef struct rb_Gps_cls_ rb_Gps_cls;
|
47
|
+
|
48
|
+
|
49
|
+
static void rbGps_free(void *p) {
|
50
|
+
rb_Gps_cls *obj=(rb_Gps_cls *)p;
|
51
|
+
if (obj) {
|
52
|
+
if (obj->gps_data) {
|
53
|
+
gps_close(obj->gps_data);
|
54
|
+
}
|
55
|
+
|
56
|
+
free(obj);
|
57
|
+
obj=0;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
static VALUE rbGps_new(VALUE class,VALUE host,VALUE port) {
|
63
|
+
rb_Gps_cls *obj= ALLOC( rb_Gps_cls);
|
64
|
+
VALUE tdata = Data_Wrap_Struct(class, 0, rbGps_free, obj);
|
65
|
+
|
66
|
+
obj->gps_data=0;
|
67
|
+
|
68
|
+
VALUE argv[2];
|
69
|
+
argv[0]=host;
|
70
|
+
argv[1]=port;
|
71
|
+
rb_obj_call_init(tdata, 2, argv);
|
72
|
+
return tdata;
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
static VALUE rbGps_initialize(VALUE self,VALUE host,VALUE port) {
|
77
|
+
rb_Gps_cls *obj=0;
|
78
|
+
Data_Get_Struct(self, rb_Gps_cls, obj);
|
79
|
+
char *host_cstr=StringValueCStr(host);
|
80
|
+
char *port_cstr=StringValueCStr(port);
|
81
|
+
obj->gps_data=gps_open(host_cstr,port_cstr);
|
82
|
+
if (!obj->gps_data) {
|
83
|
+
rb_raise(rb_eRuntimeError,"no connection");
|
84
|
+
}
|
85
|
+
return self;
|
86
|
+
}
|
87
|
+
|
88
|
+
static VALUE rbGps_poll(VALUE self) {
|
89
|
+
rb_Gps_cls *obj=0;
|
90
|
+
Data_Get_Struct(self, rb_Gps_cls, obj);
|
91
|
+
if (obj->gps_data) {
|
92
|
+
gps_poll(obj->gps_data);
|
93
|
+
}
|
94
|
+
return self;
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
static VALUE rbGps_query(VALUE self,VALUE query) {
|
99
|
+
rb_Gps_cls *obj=0;
|
100
|
+
Data_Get_Struct(self, rb_Gps_cls, obj);
|
101
|
+
if (!obj->gps_data)
|
102
|
+
return Qnil;
|
103
|
+
char *query_cstr=StringValueCStr(query);
|
104
|
+
gps_query(obj->gps_data,query_cstr);
|
105
|
+
return self;
|
106
|
+
}
|
107
|
+
|
108
|
+
static VALUE rbGps_get(VALUE self) {
|
109
|
+
rb_Gps_cls *obj=0;
|
110
|
+
Data_Get_Struct(self, rb_Gps_cls, obj);
|
111
|
+
struct gps_data_t *data=obj->gps_data;
|
112
|
+
if (!obj->gps_data)
|
113
|
+
return Qnil;
|
114
|
+
const struct gps_fix_t *fix=&(data->fix);
|
115
|
+
VALUE ret=rb_hash_new();
|
116
|
+
rb_hash_aset(ret,symbolTable.online,(data->online)?Qtrue:Qfalse);
|
117
|
+
|
118
|
+
switch (data->status) {
|
119
|
+
case STATUS_FIX:
|
120
|
+
rb_hash_aset(ret,symbolTable.status,symbolTable.status_fix);
|
121
|
+
break;
|
122
|
+
case STATUS_DGPS_FIX:
|
123
|
+
rb_hash_aset(ret,symbolTable.status,symbolTable.status_dgps_fix);
|
124
|
+
break;
|
125
|
+
default:
|
126
|
+
case STATUS_NO_FIX:
|
127
|
+
rb_hash_aset(ret,symbolTable.status,symbolTable.status_dgps_fix);
|
128
|
+
break;
|
129
|
+
}
|
130
|
+
|
131
|
+
|
132
|
+
return ret;
|
133
|
+
}
|
134
|
+
|
135
|
+
|
136
|
+
static VALUE rbGps_get_fix(VALUE self) {
|
137
|
+
rb_Gps_cls *obj=0;
|
138
|
+
Data_Get_Struct(self, rb_Gps_cls, obj);
|
139
|
+
if (!obj->gps_data)
|
140
|
+
return Qnil;
|
141
|
+
const struct gps_fix_t *fix=&(obj->gps_data->fix);
|
142
|
+
if (!fix)
|
143
|
+
return Qnil;
|
144
|
+
VALUE ret=rb_hash_new();
|
145
|
+
|
146
|
+
rb_hash_aset(ret,symbolTable.fix_time,rb_float_new(fix->time));
|
147
|
+
|
148
|
+
if (fix->mode==MODE_NO_FIX) {
|
149
|
+
rb_hash_aset(ret,symbolTable.fix_mode,symbolTable.mode_no_fix);
|
150
|
+
} else if (fix->mode==MODE_2D) {
|
151
|
+
rb_hash_aset(ret,symbolTable.fix_mode,symbolTable.mode_2d);
|
152
|
+
} else if (fix->mode==MODE_3D) {
|
153
|
+
rb_hash_aset(ret,symbolTable.fix_mode,symbolTable.mode_3d);
|
154
|
+
} else {
|
155
|
+
rb_hash_aset(ret,symbolTable.fix_mode,symbolTable.mode_not_seen);
|
156
|
+
}
|
157
|
+
|
158
|
+
|
159
|
+
if (fix->mode==MODE_2D || fix->mode==MODE_3D) {
|
160
|
+
rb_hash_aset(ret,symbolTable.fix_latitude,rb_float_new(fix->latitude));
|
161
|
+
rb_hash_aset(ret,symbolTable.fix_longitude,rb_float_new(fix->longitude));
|
162
|
+
} else {
|
163
|
+
rb_hash_aset(ret,symbolTable.fix_latitude,Qnil);
|
164
|
+
rb_hash_aset(ret,symbolTable.fix_longitude,Qnil);
|
165
|
+
}
|
166
|
+
|
167
|
+
if (fix->mode==MODE_3D) {
|
168
|
+
rb_hash_aset(ret,symbolTable.fix_altitude,rb_float_new(fix->altitude));
|
169
|
+
} else {
|
170
|
+
rb_hash_aset(ret,symbolTable.fix_altitude,Qnil);
|
171
|
+
}
|
172
|
+
rb_hash_aset(ret,symbolTable.fix_speed,rb_float_new(fix->speed));
|
173
|
+
|
174
|
+
return ret;
|
175
|
+
}
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
static void fill_symbol_table() {
|
180
|
+
symbolTable.online=ID2SYM(rb_intern("online"));
|
181
|
+
|
182
|
+
symbolTable.status=ID2SYM(rb_intern("status"));
|
183
|
+
symbolTable.status_no_fix=ID2SYM(rb_intern("status_no_fix"));
|
184
|
+
symbolTable.status_fix=ID2SYM(rb_intern("status_fix"));
|
185
|
+
symbolTable.status_dgps_fix=ID2SYM(rb_intern("status_dgps_fix"));
|
186
|
+
|
187
|
+
|
188
|
+
symbolTable.mode_not_seen=ID2SYM(rb_intern("mode_not_seen"));
|
189
|
+
symbolTable.mode_no_fix =ID2SYM(rb_intern("mode_no_fix"));
|
190
|
+
symbolTable.mode_2d=ID2SYM(rb_intern("mode_2d"));
|
191
|
+
symbolTable.mode_3d=ID2SYM(rb_intern("mode_3d"));
|
192
|
+
|
193
|
+
symbolTable.fix_time=ID2SYM(rb_intern("time"));
|
194
|
+
symbolTable.fix_mode=ID2SYM(rb_intern("mode"));
|
195
|
+
symbolTable.fix_latitude=ID2SYM(rb_intern("latitude"));
|
196
|
+
symbolTable.fix_longitude=ID2SYM(rb_intern("longitude"));
|
197
|
+
symbolTable.fix_altitude=ID2SYM(rb_intern("altitude"));
|
198
|
+
symbolTable.fix_speed=ID2SYM(rb_intern("speed"));
|
199
|
+
|
200
|
+
}
|
201
|
+
|
202
|
+
|
203
|
+
void Init_RbGps() {
|
204
|
+
fill_symbol_table();
|
205
|
+
|
206
|
+
|
207
|
+
cRbGps = rb_define_class("RbGps" , rb_cObject );
|
208
|
+
rb_define_singleton_method(cRbGps, "new" , rbGps_new , 2);
|
209
|
+
|
210
|
+
rb_define_method(cRbGps, "initialize" , rbGps_initialize , 2);
|
211
|
+
rb_define_method(cRbGps, "poll" , rbGps_poll , 0);
|
212
|
+
rb_define_method(cRbGps, "get" , rbGps_get , 0);
|
213
|
+
rb_define_method(cRbGps, "get_fix" , rbGps_get_fix , 0);
|
214
|
+
rb_define_method(cRbGps, "query" , rbGps_query , 1);
|
215
|
+
|
216
|
+
}
|
data/test.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'RbGps'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
gps=RbGps.new('localhost','2947')
|
5
|
+
|
6
|
+
gps.query("w+x\n")
|
7
|
+
puts "begin loop"
|
8
|
+
loop do
|
9
|
+
gps.query("O=?")
|
10
|
+
puts "poll"
|
11
|
+
# gps.poll
|
12
|
+
puts "get"
|
13
|
+
res=gps.get
|
14
|
+
puts res.to_yaml
|
15
|
+
fix=gps.get_fix
|
16
|
+
puts fix.to_yaml
|
17
|
+
puts "next"
|
18
|
+
sleep 1
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: RbGps
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jurgen Van Ham
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-14 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: juvanham@rubyforge.org
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ./extconf.rb
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- ./rb_gps.c
|
26
|
+
- ./extconf.rb
|
27
|
+
- ./test.rb
|
28
|
+
has_rdoc: false
|
29
|
+
homepage: http://gpsd.berlios.de/
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
|
33
|
+
require_paths:
|
34
|
+
- .
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: "0"
|
40
|
+
version:
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
47
|
+
requirements: []
|
48
|
+
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 1.3.1
|
51
|
+
signing_key:
|
52
|
+
specification_version: 2
|
53
|
+
summary: Ruby binding to libgps
|
54
|
+
test_files: []
|
55
|
+
|