msr 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/ext/msr/msr206.c +104 -11
- data/ext/msr/track.c +27 -0
- data/ext/msr/tracks.c +32 -0
- data/lib/msr.rb +2 -1
- data/lib/msr/msr206.rb +4 -0
- data/lib/msr/msr505c.rb +5 -0
- data/lib/msr/track.rb +14 -0
- data/lib/msr/tracks.rb +16 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81af545812e6fab9ed1c61e8b69d1e82b961b068
|
4
|
+
data.tar.gz: fcd4c2cd3216794423db08a215db459739f2a7a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4179c29875a10c5d015a27ffffc80e1297a67e829385a8de3166aa903287d2640635c26242120e9982a05447bc6a3d8adb83a5af16bc698eb1851d894265aa73
|
7
|
+
data.tar.gz: a398a654f8304bdc7ad1dec138917d9bf29fb95fcfe34b7e4c5a86a4890f533e07ae7e06101e0e193b67f461945a302fb4e9b362dee3ce2e17e928defe616a16
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--no-private --markup-provider=redcarpet --markup=markdown - README.md LICENSE
|
data/ext/msr/msr206.c
CHANGED
@@ -4,25 +4,114 @@ VALUE cMSR_MSR206 = Qnil;
|
|
4
4
|
|
5
5
|
static VALUE allocate(VALUE klass);
|
6
6
|
static void deallocate_206_ctx(msr206_ctx_t *ctx);
|
7
|
+
|
8
|
+
/*
|
9
|
+
Create a new {MSR::MSR206} instance for a serial device.
|
10
|
+
@param device [String] the serial device to connect to
|
11
|
+
@raise [RuntimeError] if the device can't be opened and/or initialized
|
12
|
+
@example
|
13
|
+
msr = MSR::MSR206.new("/dev/ttyUSB0")
|
14
|
+
*/
|
7
15
|
static VALUE initialize(VALUE self, VALUE rb_string);
|
16
|
+
|
17
|
+
/*
|
18
|
+
Run a communications test between the system and the device.
|
19
|
+
@return [Symbol] `:pass` if the test succeeded, or `:fail` if it failed
|
20
|
+
*/
|
8
21
|
static VALUE comm_test(VALUE self);
|
22
|
+
|
23
|
+
/*
|
24
|
+
Run a test of the device's magnetic sensor.
|
25
|
+
@return [Symbol] `:pass` if the test succeeded, or `:fail` if it failed
|
26
|
+
@note This method is interactive.
|
27
|
+
*/
|
9
28
|
static VALUE sensor_test(VALUE self);
|
29
|
+
|
30
|
+
/*
|
31
|
+
Run a test of the device's internal RAM.
|
32
|
+
@return [Symbol] `:pass` if the test succeeded, or `:fail` if it failed
|
33
|
+
*/
|
10
34
|
static VALUE ram_test(VALUE self);
|
35
|
+
|
36
|
+
|
37
|
+
/*
|
38
|
+
Reset the device to a ready state.
|
39
|
+
@note This method pauses for 100ms.
|
40
|
+
*/
|
11
41
|
static VALUE reset(VALUE self);
|
42
|
+
|
43
|
+
/*
|
44
|
+
Get the device's current coercivity level.
|
45
|
+
@return [Symbol] `:hi` if the device is in Hi-Co mode, `:lo` if Lo-Co
|
46
|
+
@raise [RuntimeError] if the device returns a bad response
|
47
|
+
*/
|
12
48
|
static VALUE get_coercivity(VALUE self);
|
49
|
+
|
50
|
+
/*
|
51
|
+
Set the device's coercivity level.
|
52
|
+
@param coercivity [Symbol] `:hi` for Hi-Co, and `:lo` for Lo-Co
|
53
|
+
@raise [ArgumentError] if the coercivity level is unrecognized
|
54
|
+
@raise [RuntimeError] if the device returns a bad response
|
55
|
+
*/
|
13
56
|
static VALUE set_coercivity(VALUE self, VALUE co_sym);
|
57
|
+
|
58
|
+
/*
|
59
|
+
Set the bits-per-inch on the second track.
|
60
|
+
@param bpi [Fixnum] the BPI setting, either 75 or 210
|
61
|
+
@raise [RuntimeError] if the device returns a bad response
|
62
|
+
@note This only applies to the second track.
|
63
|
+
*/
|
14
64
|
static VALUE set_bpi(VALUE self, VALUE bpi);
|
15
|
-
|
65
|
+
|
66
|
+
/*
|
67
|
+
Set the bits-per-character on each track.
|
68
|
+
@param bpc_ary [Array<Fixnum>] the array of BPC values
|
69
|
+
@raise [RuntimeError] if the device returns a bad response
|
70
|
+
*/
|
71
|
+
static VALUE set_bpc(VALUE self, VALUE bpc_ary);
|
72
|
+
|
73
|
+
/*
|
74
|
+
Control the LEDs on the device.
|
75
|
+
@param led [Symbol] the LED command (`:green`, `:yellow`, `:red`, `:all`,
|
76
|
+
`:none`)
|
77
|
+
@raise [ArgumentError] if the LED command is unrecognized
|
78
|
+
*/
|
16
79
|
static VALUE set_led(VALUE self, VALUE led_sym);
|
80
|
+
|
81
|
+
/*
|
82
|
+
Read raw data from a card.
|
83
|
+
@return [MSR::Tracks] a new tracks object containing the raw card data
|
84
|
+
@note This method is interactive.
|
85
|
+
*/
|
17
86
|
static VALUE raw_read(VALUE self);
|
87
|
+
|
88
|
+
/*
|
89
|
+
Read ISO-formatted data from a card.
|
90
|
+
@return [MSR::Tracks] a new tracks object containing the ISO card data
|
91
|
+
@note This method is interactive.
|
92
|
+
*/
|
18
93
|
static VALUE iso_read(VALUE self);
|
94
|
+
|
95
|
+
/*
|
96
|
+
Write raw data to a card.
|
97
|
+
@param tracks [MSR::Tracks] the raw tracks to write to the card
|
98
|
+
@note This method is interactive.
|
99
|
+
*/
|
19
100
|
static VALUE raw_write(VALUE self, VALUE tks_obj);
|
101
|
+
|
102
|
+
/*
|
103
|
+
Write ISO-formatted data to a card.
|
104
|
+
@param tracks [MSR::Tracks] the ISO tracks to write to the card
|
105
|
+
@note This method is interactive.
|
106
|
+
*/
|
20
107
|
static VALUE iso_write(VALUE self, VALUE tks_obj);
|
21
108
|
|
109
|
+
|
22
110
|
void Init_msr_msr206()
|
23
111
|
{
|
24
112
|
cMSR_MSR206 = rb_define_class_under(mMSR, "MSR206", rb_cObject);
|
25
113
|
rb_define_alloc_func(cMSR_MSR206, allocate);
|
114
|
+
|
26
115
|
rb_define_method(cMSR_MSR206, "initialize", initialize, 1);
|
27
116
|
rb_define_method(cMSR_MSR206, "comm_test!", comm_test, 0);
|
28
117
|
rb_define_method(cMSR_MSR206, "sensor_test!", sensor_test, 0);
|
@@ -31,7 +120,7 @@ void Init_msr_msr206()
|
|
31
120
|
rb_define_method(cMSR_MSR206, "coercivity", get_coercivity, 0);
|
32
121
|
rb_define_method(cMSR_MSR206, "coercivity=", set_coercivity, 1);
|
33
122
|
rb_define_method(cMSR_MSR206, "bpi=", set_bpi, 1);
|
34
|
-
rb_define_method(cMSR_MSR206, "bpc=", set_bpc,
|
123
|
+
rb_define_method(cMSR_MSR206, "bpc=", set_bpc, 1);
|
35
124
|
rb_define_method(cMSR_MSR206, "led=", set_led, 1);
|
36
125
|
rb_define_method(cMSR_MSR206, "raw_read", raw_read, 0);
|
37
126
|
rb_define_method(cMSR_MSR206, "iso_read", iso_read, 0);
|
@@ -217,22 +306,26 @@ static VALUE set_bpi(VALUE self, VALUE bpi)
|
|
217
306
|
return self;
|
218
307
|
}
|
219
308
|
|
220
|
-
static VALUE set_bpc(VALUE self, VALUE
|
309
|
+
static VALUE set_bpc(VALUE self, VALUE bpc_ary)
|
221
310
|
{
|
222
|
-
uint8_t
|
311
|
+
uint8_t bpcs[3] = {0};
|
223
312
|
msr206_ctx_t *ctx;
|
224
313
|
int ret;
|
225
314
|
|
226
|
-
Check_Type(
|
227
|
-
Check_Type(bpc2, T_FIXNUM);
|
228
|
-
Check_Type(bpc3, T_FIXNUM);
|
315
|
+
Check_Type(bpc_ary, T_ARRAY);
|
229
316
|
Data_Get_Struct(self, msr206_ctx_t, ctx);
|
230
317
|
|
231
|
-
|
232
|
-
|
233
|
-
|
318
|
+
if (RARRAY_LEN(bpc_ary) != MSR_MAX_TRACKS) {
|
319
|
+
rb_raise(rb_eArgError, "Expected %d BPC values, got %ld",
|
320
|
+
MSR_MAX_TRACKS, RARRAY_LEN(bpc_ary));
|
321
|
+
}
|
322
|
+
|
323
|
+
for (int i = 0; i < MSR_MAX_TRACKS; i++) {
|
324
|
+
Check_Type(rb_ary_entry(bpc_ary, i), T_FIXNUM);
|
325
|
+
bpcs[i] = (uint8_t) NUM2CHR(rb_ary_entry(bpc_ary, i));
|
326
|
+
}
|
234
327
|
|
235
|
-
ret = msr_set_bpc(ctx->fd,
|
328
|
+
ret = msr_set_bpc(ctx->fd, bpcs[0], bpcs[1], bpcs[2]);
|
236
329
|
|
237
330
|
if (ret != LIBMSR_ERR_OK) {
|
238
331
|
rb_raise(rb_eRuntimeError, "Couldn't change bpc (%d)", ret);
|
data/ext/msr/track.c
CHANGED
@@ -1,8 +1,23 @@
|
|
1
1
|
#include "msr.h"
|
2
2
|
|
3
|
+
/*
|
4
|
+
The data associated with the track.
|
5
|
+
@return [Array<Fixnum>] the track data
|
6
|
+
*/
|
3
7
|
static VALUE msr_track_data(VALUE self);
|
8
|
+
|
9
|
+
/*
|
10
|
+
The length of the track's data.
|
11
|
+
@return [Fixnum] the track length
|
12
|
+
*/
|
4
13
|
static VALUE msr_track_length(VALUE self);
|
5
14
|
|
15
|
+
/*
|
16
|
+
Reverse the direction of the track, returning a new object.
|
17
|
+
@return [MSR::Track] the reversed track
|
18
|
+
*/
|
19
|
+
static VALUE msr_track_reverse(VALUE self);
|
20
|
+
|
6
21
|
VALUE c_MSR_Track = Qnil;
|
7
22
|
|
8
23
|
void Init_msr_track()
|
@@ -14,6 +29,7 @@ void Init_msr_track()
|
|
14
29
|
rb_define_method(c_MSR_Track, "initialize", msr_track_initialize, 1);
|
15
30
|
rb_define_method(c_MSR_Track, "data", msr_track_data, 0);
|
16
31
|
rb_define_method(c_MSR_Track, "length", msr_track_length, 0);
|
32
|
+
rb_define_method(c_MSR_Track, "reverse", msr_track_reverse, 0);
|
17
33
|
}
|
18
34
|
|
19
35
|
VALUE msr_track_initialize(VALUE self, VALUE tk_data_ary)
|
@@ -48,3 +64,14 @@ static VALUE msr_track_length(VALUE self)
|
|
48
64
|
|
49
65
|
return INT2NUM(RARRAY_LEN(tk_data_ary));
|
50
66
|
}
|
67
|
+
|
68
|
+
static VALUE msr_track_reverse(VALUE self)
|
69
|
+
{
|
70
|
+
msr_track_t tk;
|
71
|
+
|
72
|
+
msr_unwrap_track(self, &tk);
|
73
|
+
|
74
|
+
msr_reverse_track(&tk);
|
75
|
+
|
76
|
+
return msr_track_new(tk);
|
77
|
+
}
|
data/ext/msr/tracks.c
CHANGED
@@ -1,9 +1,29 @@
|
|
1
1
|
#include "msr.h"
|
2
2
|
|
3
|
+
/*
|
4
|
+
The first track on the card.
|
5
|
+
@return [MSR::Track] the track object
|
6
|
+
*/
|
3
7
|
static VALUE msr_tracks_track1(VALUE self);
|
8
|
+
|
9
|
+
/*
|
10
|
+
The second track on the card.
|
11
|
+
@return [MSR::Track] the track object
|
12
|
+
*/
|
4
13
|
static VALUE msr_tracks_track2(VALUE self);
|
14
|
+
|
15
|
+
/*
|
16
|
+
The third track on the card.
|
17
|
+
@return [MSR::Track] the track object
|
18
|
+
*/
|
5
19
|
static VALUE msr_tracks_track3(VALUE self);
|
6
20
|
|
21
|
+
/*
|
22
|
+
Reverse the direction of the tracks, returning a new object.
|
23
|
+
@return [MSR::Tracks] the reversed tracks
|
24
|
+
*/
|
25
|
+
static VALUE msr_tracks_reverse(VALUE self);
|
26
|
+
|
7
27
|
VALUE c_MSR_Tracks = Qnil;
|
8
28
|
|
9
29
|
void Init_msr_tracks()
|
@@ -14,6 +34,7 @@ void Init_msr_tracks()
|
|
14
34
|
rb_define_method(c_MSR_Tracks, "track1", msr_tracks_track1, 0);
|
15
35
|
rb_define_method(c_MSR_Tracks, "track2", msr_tracks_track2, 0);
|
16
36
|
rb_define_method(c_MSR_Tracks, "track3", msr_tracks_track3, 0);
|
37
|
+
rb_define_method(c_MSR_Tracks, "reverse", msr_tracks_reverse, 0);
|
17
38
|
}
|
18
39
|
|
19
40
|
VALUE msr_tracks_initialize(VALUE self, VALUE tk1, VALUE tk2, VALUE tk3)
|
@@ -51,3 +72,14 @@ static VALUE msr_tracks_track3(VALUE self)
|
|
51
72
|
{
|
52
73
|
return rb_iv_get(self, "@track3");
|
53
74
|
}
|
75
|
+
|
76
|
+
static VALUE msr_tracks_reverse(VALUE self)
|
77
|
+
{
|
78
|
+
msr_tracks_t tks;
|
79
|
+
|
80
|
+
msr_unwrap_tracks(self, &tks);
|
81
|
+
|
82
|
+
msr_reverse_tracks(&tks);
|
83
|
+
|
84
|
+
return msr_tracks_new(tks);
|
85
|
+
}
|
data/lib/msr.rb
CHANGED
data/lib/msr/msr206.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
module MSR
|
2
|
+
# Represents a connection to an MSR206 (or MSR206-compatible device).
|
2
3
|
class MSR206
|
4
|
+
# Whether or not the device is currently linked.
|
5
|
+
# Corresponds to {#comm_test!} being passed.
|
6
|
+
# @return [Boolean] `true` if linked, `false` otherwise
|
3
7
|
def linked?
|
4
8
|
comm_test! == :pass
|
5
9
|
end
|
data/lib/msr/msr505c.rb
ADDED
data/lib/msr/track.rb
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
module MSR
|
2
|
+
# Represents a single track from a magnetic stripe card.
|
2
3
|
class Track
|
4
|
+
# Reverse the direction of the track, in place.
|
5
|
+
# @return [MSR::Tracks] the current instance
|
6
|
+
def reverse!
|
7
|
+
reversed = self.reverse
|
8
|
+
|
9
|
+
@data = reversed.data
|
10
|
+
|
11
|
+
self # return ourself, just for convenience
|
12
|
+
end
|
13
|
+
|
14
|
+
# Compare two tracks for equality. Two tracks are said to be equal if they
|
15
|
+
# contain the same data, in the same order.
|
16
|
+
# @return [Boolean] `true` if the two are equal, `false` otherwise
|
3
17
|
def ==(o)
|
4
18
|
return unless o.is_a?(self.class)
|
5
19
|
data == o.data
|
data/lib/msr/tracks.rb
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
module MSR
|
2
|
+
# Represents (up to) three tracks from a magnetic stripe card.
|
2
3
|
class Tracks
|
4
|
+
# Reverse the direction of the tracks, in place.
|
5
|
+
# @return [MSR::Tracks] the current instance
|
6
|
+
def reverse!
|
7
|
+
reversed = self.reverse
|
8
|
+
|
9
|
+
@track1 = reversed.track1
|
10
|
+
@track2 = reversed.track2
|
11
|
+
@track3 = reversed.track3
|
12
|
+
|
13
|
+
self # return ourself, just for convenience
|
14
|
+
end
|
15
|
+
|
16
|
+
# Compare two sets of tracks for equality. Two sets are said to be equal
|
17
|
+
# if all of their corresponding pairs are equal.
|
18
|
+
# @return [Boolean] `true` if the two are equal, `false` otherwise
|
3
19
|
def ==(o)
|
4
20
|
return unless o.is_a?(self.class)
|
5
21
|
track1 == o.track1 && track2 == o.track2 && track3 == o.track3
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: msr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Woodruff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A library for controlling magnetic stripe reader/writers.
|
14
14
|
email: william@tuffbizz.com
|
@@ -17,6 +17,7 @@ extensions:
|
|
17
17
|
- ext/msr/extconf.rb
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- ".yardopts"
|
20
21
|
- LICENSE
|
21
22
|
- README.md
|
22
23
|
- ext/msr/extconf.rb
|
@@ -27,6 +28,7 @@ files:
|
|
27
28
|
- ext/msr/tracks.c
|
28
29
|
- lib/msr.rb
|
29
30
|
- lib/msr/msr206.rb
|
31
|
+
- lib/msr/msr505c.rb
|
30
32
|
- lib/msr/track.rb
|
31
33
|
- lib/msr/tracks.rb
|
32
34
|
homepage: https://github.com/woodruffw/ruby-msr
|