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.
Files changed (4) hide show
  1. data/extconf.rb +9 -0
  2. data/rb_gps.c +216 -0
  3. data/test.rb +19 -0
  4. metadata +55 -0
data/extconf.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'mkmf'
2
+ require 'fileutils'
3
+ dir_config('rb_gps')
4
+
5
+ have_library('gps', 'gps_open')
6
+
7
+ have_header('gps.h')
8
+ create_makefile("RbGps")
9
+
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
+