msr 0.0.2 → 0.0.3
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.
- 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
|