msr 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e05a55f89cc5ba507959b75913957939f283e039
4
+ data.tar.gz: aef2815e7192bade10ed798c073b63049cf52587
5
+ SHA512:
6
+ metadata.gz: b6e4beea042e4fba1ff9d87df4b8ce99175990b1e77f48761c9652089ae3d0a9a353e9aee1a57dd44129897bec799bb36ca66dbb5abfebc976449bf5b4f31600
7
+ data.tar.gz: 3b9c9e7f3049c7ff5a44d0499ad5c56eba6f0344f4e4a1d37db6937c9381abb25b5a68b763ef611e817b72c867c62dd5e30fb940019cbc1281d38d080f38a726
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 William Woodruff <william @ tuffbizz.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,26 @@
1
+ msr
2
+ ===
3
+
4
+ A ruby gem for controlling magnetic stripe reader-writers (on UNIX/UNIX-likes).
5
+
6
+ Uses [libmsr](https://github.com/woodruffw/libmsr).
7
+
8
+ ## Roadmap
9
+
10
+ ```ruby
11
+ require 'msr'
12
+
13
+ msr = MSR::MSR505C.new("/dev/ttyS0") # or your serial device
14
+
15
+ puts "OK" if msr.linked?
16
+
17
+ # control an LED on the reader
18
+ msr.led!(:red) # :green, :yellow, :all, :off
19
+
20
+ # get and set coercivity
21
+ msr.coercivity # => :high, :low
22
+ msr.coercivity = :high # :low
23
+
24
+ # more to come
25
+ ```
26
+
@@ -0,0 +1,4 @@
1
+ require "mkmf"
2
+
3
+ have_library("msr")
4
+ create_makefile("ext/msr")
data/ext/msr/msr.c ADDED
@@ -0,0 +1,12 @@
1
+ #include "msr.h"
2
+
3
+ VALUE mMSR = Qnil;
4
+
5
+ void Init_msr()
6
+ {
7
+ mMSR = rb_define_module("MSR");
8
+
9
+ Init_msr_msr206();
10
+ Init_msr_track();
11
+ Init_msr_tracks();
12
+ }
data/ext/msr/msr206.c ADDED
@@ -0,0 +1,251 @@
1
+ #include "msr.h"
2
+
3
+ VALUE cMSR_MSR206 = Qnil;
4
+
5
+ static VALUE allocate(VALUE klass);
6
+ static void deallocate_206_ctx(msr206_ctx_t *ctx);
7
+ static VALUE initialize(VALUE self, VALUE rb_string);
8
+ static VALUE comm_test(VALUE self);
9
+ static VALUE sensor_test(VALUE self);
10
+ static VALUE ram_test(VALUE self);
11
+ static VALUE get_coercivity(VALUE self);
12
+ static VALUE set_coercivity(VALUE self, VALUE co_sym);
13
+ static VALUE set_bpi(VALUE self, VALUE bpi);
14
+ static VALUE set_bpc(VALUE self, VALUE bpc);
15
+ static VALUE set_led(VALUE self, VALUE led_sym);
16
+ static VALUE raw_read(VALUE self);
17
+ static VALUE iso_read(VALUE self);
18
+ static VALUE raw_write(VALUE self, VALUE tks_obj);
19
+ static VALUE iso_write(VALUE self, VALUE tks_obj);
20
+
21
+ void Init_msr_msr206()
22
+ {
23
+ cMSR_MSR206 = rb_define_class_under(mMSR, "MSR206", rb_cObject);
24
+ rb_define_alloc_func(cMSR_MSR206, allocate);
25
+ rb_define_method(cMSR_MSR206, "initialize", initialize, 1);
26
+ rb_define_method(cMSR_MSR206, "comm_test!", comm_test, 0);
27
+ rb_define_method(cMSR_MSR206, "sensor_test!", sensor_test, 0);
28
+ rb_define_method(cMSR_MSR206, "ram_test!", ram_test, 0);
29
+ rb_define_method(cMSR_MSR206, "coercivity", get_coercivity, 0);
30
+ rb_define_method(cMSR_MSR206, "coercivity=", set_coercivity, 1);
31
+ rb_define_method(cMSR_MSR206, "bpi=", set_bpi, 1);
32
+ rb_define_method(cMSR_MSR206, "bpc=", set_bpc, 1);
33
+ rb_define_method(cMSR_MSR206, "led=", set_led, 1);
34
+ rb_define_method(cMSR_MSR206, "raw_read", raw_read, 0);
35
+ rb_define_method(cMSR_MSR206, "iso_read", iso_read, 0);
36
+ rb_define_method(cMSR_MSR206, "raw_write", raw_write, 1);
37
+ rb_define_method(cMSR_MSR206, "iso_write", iso_write, 1);
38
+ }
39
+
40
+ static VALUE allocate(VALUE klass)
41
+ {
42
+ msr206_ctx_t *ctx = ALLOC(msr206_ctx_t);
43
+
44
+ ctx->fd = -1;
45
+
46
+ return Data_Wrap_Struct(klass, NULL, deallocate_206_ctx, ctx);
47
+ }
48
+
49
+ static void deallocate_206_ctx(msr206_ctx_t *ctx)
50
+ {
51
+ if (ctx->fd > 0) {
52
+ msr_serial_close(ctx->fd);
53
+ }
54
+
55
+ free(ctx);
56
+ }
57
+
58
+ static VALUE initialize(VALUE self, VALUE rb_path)
59
+ {
60
+ msr206_ctx_t *ctx;
61
+ char *path_str;
62
+ int ret;
63
+
64
+ Check_Type(rb_path, T_STRING);
65
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
66
+
67
+ path_str = StringValueCStr(rb_path);
68
+
69
+ ret = msr_serial_open(path_str, &(ctx->fd), MSR_BLOCKING, MSR_BAUD);
70
+
71
+ if (ret != LIBMSR_ERR_OK) {
72
+ rb_raise(rb_eRuntimeError, "Couldn't open the device (%d)", ret);
73
+ }
74
+
75
+ ret = msr_init(ctx->fd);
76
+
77
+ if (ret != LIBMSR_ERR_OK) {
78
+ rb_raise(rb_eRuntimeError, "Couldn't initialize the device (%d)", ret);
79
+ }
80
+
81
+ return self;
82
+ }
83
+
84
+ static VALUE comm_test(VALUE self)
85
+ {
86
+ return Qnil;
87
+ }
88
+
89
+ static VALUE sensor_test(VALUE self)
90
+ {
91
+ return Qnil;
92
+ }
93
+
94
+ static VALUE ram_test(VALUE self)
95
+ {
96
+ return Qnil;
97
+ }
98
+
99
+ static VALUE get_coercivity(VALUE self)
100
+ {
101
+ VALUE hi_co = ID2SYM(rb_intern("hi"));
102
+ VALUE lo_co = ID2SYM(rb_intern("lo"));
103
+ msr206_ctx_t *ctx;
104
+ int ret;
105
+
106
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
107
+
108
+ ret = msr_get_co(ctx->fd);
109
+
110
+ if (ret == MSR_CO_HI) {
111
+ return hi_co;
112
+ }
113
+ else if (ret == MSR_CO_LO) {
114
+ return lo_co;
115
+ }
116
+ else {
117
+ rb_raise(rb_eRuntimeError, "Couldn't get coercivity (%d)", ret);
118
+ }
119
+ }
120
+
121
+ static VALUE set_coercivity(VALUE self, VALUE co_sym)
122
+ {
123
+ VALUE hi_co = ID2SYM(rb_intern("hi"));
124
+ VALUE lo_co = ID2SYM(rb_intern("lo"));
125
+ msr206_ctx_t *ctx;
126
+ int ret;
127
+
128
+ Check_Type(co_sym, T_SYMBOL);
129
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
130
+
131
+ if (co_sym == hi_co) {
132
+ ret = msr_set_hi_co(ctx->fd);
133
+ }
134
+ else if (co_sym == lo_co) {
135
+ ret = msr_set_lo_co(ctx->fd);
136
+ }
137
+ else {
138
+ rb_raise(rb_eArgError, "Unknown coercivity level");
139
+ }
140
+
141
+ if (ret != LIBMSR_ERR_OK) {
142
+ rb_raise(rb_eRuntimeError, "Couldn't change coercivity (%d)", ret);
143
+ }
144
+
145
+ return self;
146
+ }
147
+
148
+ static VALUE set_bpi(VALUE self, VALUE bpi)
149
+ {
150
+ return Qnil;
151
+ }
152
+
153
+ static VALUE set_bpc(VALUE self, VALUE bpc)
154
+ {
155
+ return Qnil;
156
+ }
157
+
158
+ static VALUE set_led(VALUE self, VALUE led_sym)
159
+ {
160
+ VALUE all = ID2SYM(rb_intern("all"));
161
+ VALUE grn = ID2SYM(rb_intern("green"));
162
+ VALUE ylw = ID2SYM(rb_intern("yellow"));
163
+ VALUE red = ID2SYM(rb_intern("red"));
164
+ VALUE off = ID2SYM(rb_intern("none"));
165
+ msr206_ctx_t *ctx;
166
+ uint8_t led;
167
+
168
+ Check_Type(led_sym, T_SYMBOL);
169
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
170
+
171
+ if (led_sym == all) {
172
+ led = MSR_CMD_LED_ON;
173
+ }
174
+ else if (led_sym == grn) {
175
+ led = MSR_CMD_LED_GRN_ON;
176
+ }
177
+ else if (led_sym == ylw) {
178
+ led = MSR_CMD_LED_YLW_ON;
179
+ }
180
+ else if (led_sym == red) {
181
+ led = MSR_CMD_LED_RED_ON;
182
+ }
183
+ else if (led_sym == off) {
184
+ led = MSR_CMD_LED_OFF;
185
+ }
186
+ else {
187
+ rb_raise(rb_eArgError, "Unknown LED color command");
188
+ }
189
+
190
+ msr_flash_led(ctx->fd, led);
191
+
192
+ return self;
193
+ }
194
+
195
+ static VALUE raw_read(VALUE self)
196
+ {
197
+ msr206_ctx_t *ctx;
198
+ msr_tracks_t tks = {0};
199
+ int ret;
200
+ VALUE tks_obj;
201
+
202
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
203
+
204
+ for (int i = 0; i < MSR_MAX_TRACKS; i++) {
205
+ tks.msr_tracks[i].msr_tk_len = MSR_MAX_TRACK_LEN;
206
+ }
207
+
208
+ ret = msr_raw_read(ctx->fd, &tks);
209
+
210
+ if (ret != LIBMSR_ERR_OK) {
211
+ rb_raise(rb_eRuntimeError, "Device read failed (%d)", ret);
212
+ }
213
+
214
+ tks_obj = msr_tracks_new(tks);
215
+
216
+ return tks_obj;
217
+ }
218
+
219
+ static VALUE iso_read(VALUE self)
220
+ {
221
+ msr206_ctx_t *ctx;
222
+ msr_tracks_t tks = {0};
223
+ int ret;
224
+ VALUE tks_obj;
225
+
226
+ Data_Get_Struct(self, msr206_ctx_t, ctx);
227
+
228
+ for (int i = 0; i < MSR_MAX_TRACKS; i++) {
229
+ tks.msr_tracks[i].msr_tk_len = MSR_MAX_TRACK_LEN;
230
+ }
231
+
232
+ ret = msr_iso_read(ctx->fd, &tks);
233
+
234
+ if (ret != LIBMSR_ERR_OK) {
235
+ rb_raise(rb_eRuntimeError, "Device read failed (%d)", ret);
236
+ }
237
+
238
+ tks_obj = msr_tracks_new(tks);
239
+
240
+ return tks_obj;
241
+ }
242
+
243
+ static VALUE raw_write(VALUE self, VALUE tks_obj)
244
+ {
245
+ return Qnil;
246
+ }
247
+
248
+ static VALUE iso_write(VALUE self, VALUE tks_obj)
249
+ {
250
+ return Qnil;
251
+ }
data/ext/msr/track.c ADDED
@@ -0,0 +1,63 @@
1
+ #include "msr.h"
2
+
3
+ static VALUE initialize(VALUE self, VALUE data);
4
+ static VALUE msr_track_data(VALUE self);
5
+ static VALUE msr_track_length(VALUE self);
6
+
7
+ VALUE c_MSR_Track = Qnil;
8
+
9
+ void Init_msr_track()
10
+ {
11
+ c_MSR_Track = rb_define_class_under(mMSR, "Track", rb_cObject);
12
+
13
+ rb_define_const(c_MSR_Track, "MAX_TRACK_LEN", INT2NUM(MSR_MAX_TRACK_LEN));
14
+
15
+ rb_define_method(c_MSR_Track, "initialize", initialize, 1);
16
+ rb_define_method(c_MSR_Track, "data", msr_track_data, 0);
17
+ rb_define_method(c_MSR_Track, "length", msr_track_length, 0);
18
+ }
19
+
20
+ /*
21
+ A convenience function for instantiating a new MSR::Track in C.
22
+ */
23
+ VALUE msr_track_new(msr_track_t tk)
24
+ {
25
+ VALUE obj = rb_obj_alloc(c_MSR_Track);
26
+
27
+ VALUE tk_data_ary = rb_ary_new();
28
+
29
+ for (int i = 0; i < tk.msr_tk_len; i++) {
30
+ rb_ary_push(tk_data_ary, INT2NUM(tk.msr_tk_data[i]));
31
+ }
32
+
33
+ return initialize(obj, tk_data_ary);
34
+ }
35
+
36
+ static VALUE initialize(VALUE self, VALUE tk_data_ary)
37
+ {
38
+ int tk_len;
39
+
40
+ Check_Type(tk_data_ary, T_ARRAY);
41
+
42
+ tk_len = RARRAY_LEN(tk_data_ary);
43
+
44
+ if (tk_len > MSR_MAX_TRACK_LEN) {
45
+ rb_raise(rb_eArgError, "Track >%d bytes", MSR_MAX_TRACK_LEN);
46
+ }
47
+
48
+ rb_iv_set(self, "@data", tk_data_ary);
49
+
50
+ return self;
51
+ }
52
+
53
+ static VALUE msr_track_data(VALUE self)
54
+ {
55
+ return rb_iv_get(self, "@data");
56
+ }
57
+
58
+ static VALUE msr_track_length(VALUE self)
59
+ {
60
+ VALUE tk_data_ary = rb_iv_get(self, "@data");
61
+
62
+ return INT2NUM(RARRAY_LEN(tk_data_ary));
63
+ }
data/ext/msr/tracks.c ADDED
@@ -0,0 +1,67 @@
1
+ #include "msr.h"
2
+
3
+ static VALUE initialize(VALUE self, VALUE tk1, VALUE tk2, VALUE tk3);
4
+ static VALUE msr_tracks_track1(VALUE self);
5
+ static VALUE msr_tracks_track2(VALUE self);
6
+ static VALUE msr_tracks_track3(VALUE self);
7
+
8
+ VALUE c_MSR_Tracks = Qnil;
9
+
10
+ void Init_msr_tracks()
11
+ {
12
+ c_MSR_Tracks = rb_define_class_under(mMSR, "Tracks", rb_cObject);
13
+
14
+ rb_define_method(c_MSR_Tracks, "initialize", initialize, 3);
15
+ rb_define_method(c_MSR_Tracks, "track1", msr_tracks_track1, 0);
16
+ rb_define_method(c_MSR_Tracks, "track2", msr_tracks_track2, 0);
17
+ rb_define_method(c_MSR_Tracks, "track3", msr_tracks_track3, 0);
18
+ }
19
+
20
+ /*
21
+ A convenience function for instantiating a new MSR::Tracks in C.
22
+ */
23
+ VALUE msr_tracks_new(msr_tracks_t tks)
24
+ {
25
+ VALUE obj = rb_obj_alloc(c_MSR_Tracks);
26
+ VALUE tk1_obj = msr_track_new(tks.msr_tracks[0]);
27
+ VALUE tk2_obj = msr_track_new(tks.msr_tracks[1]);
28
+ VALUE tk3_obj = msr_track_new(tks.msr_tracks[2]);
29
+
30
+ return initialize(obj, tk1_obj, tk2_obj, tk3_obj);
31
+ }
32
+
33
+ static VALUE initialize(VALUE self, VALUE tk1, VALUE tk2, VALUE tk3)
34
+ {
35
+ if (CLASS_OF(tk1) != c_MSR_Track) {
36
+ rb_raise(rb_eArgError, "expected track object for track 1");
37
+ }
38
+
39
+ if (CLASS_OF(tk2) != c_MSR_Track) {
40
+ rb_raise(rb_eArgError, "expected track object for track 2");
41
+ }
42
+
43
+ if (CLASS_OF(tk3) != c_MSR_Track) {
44
+ rb_raise(rb_eArgError, "expected track object for track 3");
45
+ }
46
+
47
+ rb_iv_set(self, "@track1", tk1);
48
+ rb_iv_set(self, "@track2", tk2);
49
+ rb_iv_set(self, "@track3", tk3);
50
+
51
+ return self;
52
+ }
53
+
54
+ static VALUE msr_tracks_track1(VALUE self)
55
+ {
56
+ return rb_iv_get(self, "@track1");
57
+ }
58
+
59
+ static VALUE msr_tracks_track2(VALUE self)
60
+ {
61
+ return rb_iv_get(self, "@track2");
62
+ }
63
+
64
+ static VALUE msr_tracks_track3(VALUE self)
65
+ {
66
+ return rb_iv_get(self, "@track3");
67
+ }
data/lib/msr.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative "../ext/msr/msr"
2
+ require_relative "msr/track"
3
+ require_relative "msr/msr206"
4
+
5
+ module MSR
6
+ VERSION = "0.0.1".freeze
7
+ end
data/lib/msr/msr206.rb ADDED
@@ -0,0 +1,4 @@
1
+ module MSR
2
+ class MSR206
3
+ end
4
+ end
data/lib/msr/track.rb ADDED
@@ -0,0 +1,4 @@
1
+ module MSR
2
+ class Track
3
+ end
4
+ end
data/lib/msr/tracks.rb ADDED
@@ -0,0 +1,4 @@
1
+ module MSR
2
+ class Tracks
3
+ end
4
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: msr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - William Woodruff
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-20 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A library for controlling magnetic stripe reader/writers.
14
+ email: william@tuffbizz.com
15
+ executables: []
16
+ extensions:
17
+ - ext/msr/extconf.rb
18
+ extra_rdoc_files: []
19
+ files:
20
+ - LICENSE
21
+ - README.md
22
+ - ext/msr/extconf.rb
23
+ - ext/msr/msr.c
24
+ - ext/msr/msr206.c
25
+ - ext/msr/track.c
26
+ - ext/msr/tracks.c
27
+ - lib/msr.rb
28
+ - lib/msr/msr206.rb
29
+ - lib/msr/track.rb
30
+ - lib/msr/tracks.rb
31
+ homepage: https://github.com/woodruffw/ruby-msr
32
+ licenses:
33
+ - MIT
34
+ metadata: {}
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubyforge_project:
51
+ rubygems_version: 2.5.1
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: msr - magnetic stripe reader/writer library.
55
+ test_files: []