serial_modem 0.3.1 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50066edf3efa37206a4de8691e25cde79769b7b4
4
- data.tar.gz: 7e771e350ec2b578a836f3aaa0cdc34b30bfb408
3
+ metadata.gz: 7ac79b6bee703df41e62638e3b588409c30a4cfd
4
+ data.tar.gz: 5f18729b44e78ffe9a67a93708e36b74b589b32a
5
5
  SHA512:
6
- metadata.gz: c2fa08eb00b721d09366e970d22a941ff9402641f4003a992692ea63e172d23d6f0b4981ca7a9064f3ef904345e89ff6a8340552bb666ce3f7f8362a8a562461
7
- data.tar.gz: 964adaa40d71633bd11b67f0192c43b6fb1a85ca3daf671d366c646c274c556cc426f79cbaa32f2c04a50e10e217f7609224bbf3188c9a532573edbaae3b1333
6
+ metadata.gz: f02e06aa1f74d62968e6921c7db4e10372898b2547f9d579b251e416b81d530c7e2b1c7762d48e1bfb69ead667f0185bac5c3f780e2f79ba41d920b5c98c2403
7
+ data.tar.gz: 6e2b0792c5760afe18f10c1f418ea236b7fee1e402a06cbb1273725fa2141982dbd7b2b29d795c03bd440f5d345a0c838d54a198416ee960a4904e3f1be27b00
data/.gitignore CHANGED
@@ -15,3 +15,4 @@
15
15
  *.a
16
16
  mkmf.log
17
17
  /.idea/
18
+ /*gem
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in SerialModem.gemspec
4
4
  gemspec
5
+ gem 'helper_classes', path: '../HelperClasses'
6
+
data/lib/serial_modem.rb CHANGED
@@ -11,6 +11,7 @@ module SerialModem
11
11
  extend HelperClasses::DPuts
12
12
 
13
13
  def setup_modem(dev = nil)
14
+ # @serial_debug = true
14
15
  @serial_debug = false
15
16
  @serial_tty = @serial_tty_error = @serial_sp = nil
16
17
  @serial_replies = []
@@ -18,6 +19,7 @@ module SerialModem
18
19
  @serial_sms = {}
19
20
  # TODO: once serialmodem == class, change this into Observer
20
21
  @serial_sms_new = []
22
+ @serial_sms_new_list = []
21
23
  @serial_sms_autoscan = 20
22
24
  @serial_sms_autoscan_last = Time.now
23
25
  @serial_ussd = []
@@ -25,119 +27,135 @@ module SerialModem
25
27
  @serial_ussd_timeout = 30
26
28
  @serial_ussd_results = []
27
29
  @serial_ussd_results_max = 100
30
+ @serial_ussd_sent = 0
31
+ @serial_ussd_sent_max = 5
32
+ @serial_ussd_send_next = false
28
33
  # TODO: once serialmodem == class, change this into Observer
29
34
  @serial_ussd_new = []
30
- @serial_mutex_rcv = Mutex.new
31
- @serial_mutex_send = Mutex.new
35
+ @serial_ussd_new_list = []
36
+ @serial_mutex = Mutex.new
32
37
  # Some Huawei-modems eat SMS once they send a +CMTI-message - this
33
38
  # turns off the CMTI-messages which slows down incoming SMS detection
34
39
  @serial_eats_sms = false
35
40
  setup_tty
41
+ dp "tty is #{@serial_tty}"
36
42
  end
37
43
 
38
- def read_reply(wait = nil)
44
+ def read_reply(wait = nil, lock: true)
39
45
  @serial_debug and dputs_func
40
46
  raise IOError.new('NoModemHere') unless @serial_sp
41
- ret = []
42
47
  begin
43
- @serial_mutex_rcv.synchronize {
44
- while !@serial_sp.eof? || wait
45
- begin
46
- @serial_replies.push rep = @serial_sp.readline.chomp
47
- break if rep == wait
48
- rescue EOFError => e
49
- dputs(4) { 'Waited for string, but got nothing' }
50
- break
51
- end
52
- end
53
- }
54
-
55
- while m = @serial_replies.shift
56
- @serial_debug and dputs_func
57
- next if (m == '' || m =~ /^\^/)
58
- dputs(3) { "Reply: #{m}" }
59
- ret.push m
60
- if m =~ /\+[\w]{4}: /
61
- code, msg = m[1..4], m[7..-1]
62
- dputs(3) { "found code #{code.inspect} - #{msg.inspect}" }
63
- @serial_codes[code] = msg
64
- case code
65
- when /CMGL/
66
- # Typical input from the modem:
67
- # "0,\"REC UNREAD\",\"+23599836457\",,\"15/04/08,17:12:21+04\""
68
- # Output desired:
69
- # ["0", "REC UNREAD", "+23599836457", "", "15/04/08,17:12:21+04"]
70
- id, flag, number, unknown, date =
71
- msg.scan(/"(.*?)"|([^",]+)\s*|,,/).collect { |a, b| a.to_s + b.to_s }
72
- ret.push @serial_replies.shift
73
- sms_new(id, flag, number, date, ret.last, unknown)
74
- when /CUSD/
75
- if pdu = msg.match(/.*\"(.*)\".*/)
76
- ussd_received(pdu_to_ussd(pdu[1]))
77
- elsif msg == '2'
78
- #log_msg :serialmodem, 'Closed USSD.'
79
- #ussd_received('')
80
- #ussd_close
81
- else
82
- log_msg :serialmodem, "Unknown: CUSD - #{msg}"
83
- end
84
- when /CMTI/
85
- if msg =~ /^.ME.,/
86
- dputs(3) { "I think I got a new message: #{msg}" }
87
- sms_scan true
88
- else
89
- log_msg :serialmodem, "Unknown: CMTI - #{msg}"
90
- end
91
- @serial_eats_sms and modem_send('AT+CNMI=0,0,0,0,0', 'OK')
92
- # Probably a message or so - '+CMTI: "ME",0' is a new message
93
- end
48
+ lock and @serial_mutex.lock
49
+ while !@serial_sp.eof? || wait
50
+ begin
51
+ @serial_replies.push rep = @serial_sp.readline.chomp
52
+ break if rep == wait
53
+ rescue EOFError => e
54
+ dputs(4) { 'Waited for string, but got nothing' }
55
+ break
94
56
  end
95
57
  end
58
+ lock and @serial_mutex.unlock
59
+
60
+ ret = interpret_serial_reply
96
61
  rescue IOError => e
97
62
  raise e
98
- =begin
99
- rescue Exception => e
100
- puts "#{e.inspect}"
101
- puts "#{e.to_s}"
102
- puts e.backtrace
103
- =end
104
63
  end
105
64
  ret
106
65
  end
107
66
 
67
+ def interpret_serial_reply
68
+ ret = []
69
+ @serial_replies.each { |s| dputs(3) { s } }
70
+ while m = @serial_replies.shift
71
+ @serial_debug and dputs_func
72
+ dputs(3) { "Reply: #{m}" }
73
+ next if (m == '' || m =~ /^\^/)
74
+ ret.push m
75
+ if m =~ /\+[\w]{4}: /
76
+ code, msg = m[1..4], m[7..-1]
77
+ dputs(3) { "found code #{code.inspect} - #{msg.inspect}" }
78
+ @serial_codes[code] = msg
79
+ case code
80
+ when /CMGL/
81
+ # Typical input from the modem:
82
+ # "0,\"REC UNREAD\",\"+23599836457\",,\"15/04/08,17:12:21+04\""
83
+ # Output desired:
84
+ # ["0", "REC UNREAD", "+23599836457", "", "15/04/08,17:12:21+04"]
85
+ id, flag, number, unknown, date =
86
+ msg.scan(/"(.*?)"|([^",]+)\s*|,,/m).collect { |a, b| a.to_s + b.to_s }
87
+ msg = []
88
+ # Read all lines up to an empty line or a +CMGL: which indicates
89
+ # a new message
90
+ while @serial_replies[0] &&
91
+ @serial_replies[0] != '' &&
92
+ !(@serial_replies[0] =~ /^\+CMGL:/)
93
+ msg.push @serial_replies.shift
94
+ end
95
+ # If we finish with an empty line, delete it and the 'OK' that follows
96
+ if @serial_replies[0] == ''
97
+ @serial_replies.shift(2)
98
+ end
99
+ ret.push msg.join("\n")
100
+ sms_new(id, flag, number, date, ret.last, unknown)
101
+ when /CUSD/
102
+ if pdu = msg.match(/.*\"(.*)\".*/)
103
+ ussd_received(pdu_to_ussd(pdu[1]))
104
+ elsif msg == '2'
105
+ #log_msg :serialmodem, 'Closed USSD.'
106
+ #ussd_received('')
107
+ #ussd_close
108
+ else
109
+ log_msg :serialmodem, "Unknown: CUSD - #{msg}"
110
+ end
111
+ when /CMTI/
112
+ if msg =~ /^.ME.,/
113
+ dputs(3) { "I think I got a new message: #{msg}" }
114
+ @serial_sms_autoscan_last = Time.now - @serial_sms_autoscan
115
+ else
116
+ log_msg :serialmodem, "Unknown: CMTI - #{msg}"
117
+ end
118
+ # Probably a message or so - '+CMTI: "ME",0' is a new message
119
+ end
120
+ end
121
+ end
122
+ end
123
+
108
124
  def sms_new(id, flag, number, date, msg, unknown = nil)
109
125
  sms = {flag: flag, number: number, unknown: unknown, date: date,
110
126
  msg: msg, id: id}
111
127
  @serial_sms[id.to_s] = sms
112
- if flag =~ /unread/i
113
- log_msg :SerialModem, "New SMS: #{sms.inspect}"
114
- rescue_all do
115
- @serial_sms_new.each { |s|
116
- s.call(sms)
117
- }
118
- end
119
- end
128
+ log_msg :SerialModem, "New SMS: #{sms.inspect}"
129
+ @serial_sms_new_list.push(sms)
120
130
  sms
121
131
  end
122
132
 
123
- def modem_send(str, reply = true)
133
+ def modem_send(str, reply = true, lock: true)
124
134
  return unless @serial_sp
125
135
  @serial_debug and dputs_func
126
136
  dputs(3) { "Sending string #{str} to modem" }
127
- @serial_mutex_send.synchronize {
128
- begin
129
- @serial_sp.write("#{str}\r\n")
130
- rescue Errno::EIO => e
131
- log_msg :SerialModem, "Couldn't write to device"
132
- kill
133
- return
134
- rescue Errno::ENODEV => e
135
- log_msg :SerialModem, 'Device is not here anymore'
136
- kill
137
- return
138
- end
137
+ lock and @serial_mutex.lock
138
+ begin
139
+ @serial_sp.write("#{str}\r\n")
140
+ rescue Errno::EIO => e
141
+ log_msg :SerialModem, "Couldn't write to device"
142
+ kill
143
+ return
144
+ rescue Errno::ENODEV => e
145
+ log_msg :SerialModem, 'Device is not here anymore'
146
+ kill
147
+ return
148
+ end
149
+ read_reply(reply, lock: false)
150
+ lock and @serial_mutex.unlock
151
+ end
152
+
153
+ def modem_send_array(cmds)
154
+ @serial_mutex.synchronize {
155
+ cmds.each { |str, reply=true|
156
+ modem_send(str, reply, lock: false)
157
+ }
139
158
  }
140
- read_reply(reply)
141
159
  end
142
160
 
143
161
  def switch_to_hilink
@@ -155,7 +173,7 @@ module SerialModem
155
173
 
156
174
  def pdu_to_ussd(str)
157
175
  [str].pack('H*').unpack('b*').join.scan(/.{7}/).
158
- map { |s| [s+"0"].pack('b*') }.join
176
+ map { |s| [s+'0'].pack('b*') }.join
159
177
  end
160
178
 
161
179
  def ussd_send_now
@@ -164,7 +182,7 @@ module SerialModem
164
182
  @serial_ussd_last = Time.now
165
183
  if str_send
166
184
  #log_msg :SerialModem, "Sending ussd-string #{str_send} with add of #{@ussd_add} "+
167
- "and queue #{@serial_ussd}"
185
+ #"and queue #{@serial_ussd}"
168
186
  modem_send("AT+CUSD=1,\"#{ussd_to_pdu(str_send)}\"#{@ussd_add}", 'OK')
169
187
  else
170
188
  dputs(2) { 'Sending ussd-close' }
@@ -179,6 +197,7 @@ module SerialModem
179
197
  end
180
198
 
181
199
  def ussd_send(str)
200
+ # dputs_func
182
201
  if str.class == String
183
202
  dputs(3) { "Sending ussd-code #{str}" }
184
203
  @serial_ussd.push str
@@ -189,6 +208,7 @@ module SerialModem
189
208
  @serial_ussd.push nil
190
209
  @serial_ussd.length == str.length + 1 and ussd_send_now
191
210
  end
211
+ @serial_ussd_sent = 0
192
212
  end
193
213
 
194
214
  def ussd_store_result(str)
@@ -199,7 +219,8 @@ module SerialModem
199
219
  code: code, result: str)
200
220
  @serial_ussd_results.shift([0, @serial_ussd_results.length -
201
221
  @serial_ussd_results_max].max)
202
- ussd_send_now
222
+ @serial_ussd_send_next = true
223
+ @serial_ussd_sent = 0
203
224
  code
204
225
  else
205
226
  #log_msg :serialmodem, "Got unasked code #{str}"
@@ -210,9 +231,7 @@ module SerialModem
210
231
  def ussd_received(str)
211
232
  code = ussd_store_result(str)
212
233
  dputs(2) { "Got result for #{code}: -#{str}-" }
213
- @serial_ussd_new.each { |s|
214
- s.call(code, str)
215
- }
234
+ @serial_ussd_new_list.push([code, str])
216
235
  end
217
236
 
218
237
  def ussd_fetch(str)
@@ -224,9 +243,9 @@ module SerialModem
224
243
 
225
244
  def sms_send(number, msg)
226
245
  log_msg :SerialModem, "Sending SMS --#{msg.inspect}-- to --#{number.inspect}--"
227
- modem_send('AT+CMGF=1', 'OK')
228
- modem_send("AT+CMGS=\"#{number}\"")
229
- modem_send("#{msg}\x1a", 'OK')
246
+ modem_send_array([['AT+CMGF=1', 'OK'],
247
+ ["AT+CMGS=\"#{number}\""],
248
+ ["#{msg}\x1a", 'OK']])
230
249
  end
231
250
 
232
251
  def sms_scan(force = false)
@@ -234,8 +253,10 @@ module SerialModem
234
253
  Time.now - @serial_sms_autoscan_last > @serial_sms_autoscan)
235
254
  dputs(3) { 'Auto-scanning sms' }
236
255
  @serial_sms_autoscan_last = Time.now
237
- modem_send('AT+CMGF=1', 'OK')
238
- modem_send('AT+CMGL="ALL"', 'OK')
256
+ req = [['AT+CMGF=1', 'OK'],
257
+ ['AT+CMGL="ALL"', 'OK']]
258
+ @serial_eats_sms and req.push(['AT+CNMI=0,0,0,0,0', 'OK'])
259
+ modem_send_array(req)
239
260
  end
240
261
  end
241
262
 
@@ -249,8 +270,8 @@ module SerialModem
249
270
  end
250
271
 
251
272
  def get_operator
252
- modem_send('AT+COPS=3,0', 'OK')
253
- modem_send('AT+COPS?', 'OK')
273
+ modem_send_array([['AT+COPS=3,0', 'OK'],
274
+ ['AT+COPS?', 'OK']])
254
275
  (1..6).each {
255
276
  if @serial_codes.has_key? 'COPS'
256
277
  return '' if @serial_codes['COPS'] == '0'
@@ -288,39 +309,46 @@ module SerialModem
288
309
  def setup_tty
289
310
  check_presence
290
311
 
291
- @serial_mutex_rcv.synchronize {
312
+ @serial_mutex.synchronize {
292
313
  if !@serial_sp && @serial_tty
293
314
  if File.exists? @serial_tty
294
- dputs(2){ 'setting up SerialPort'}
315
+ dputs(2) { 'setting up SerialPort' }
295
316
  @serial_sp = SerialPort.new(@serial_tty, 115200)
296
317
  @serial_sp.read_timeout = 500
297
318
  end
298
319
  elsif @serial_sp &&
299
320
  (!@serial_tty||(@serial_tty && !File.exists?(@serial_tty)))
300
- dputs(2){'disconnecting modem'}
321
+ dputs(2) { 'disconnecting modem' }
301
322
  kill
302
323
  end
303
324
  }
304
325
  if @serial_sp
305
- dputs(2){'initialising modem'}
326
+ dputs(2) { 'initialising modem' }
306
327
  init_modem
307
328
  start_serial_thread
308
329
  if !@serial_sp
309
- dputs(2){'Lost serial-connection while initialising - trying again'}
330
+ dputs(2) { 'Lost serial-connection while initialising - killing and reloading' }
310
331
  kill
311
332
  reload_option
312
- setup_tty
313
- return
333
+ return false
314
334
  end
315
- dputs(2){'finished connecting'}
335
+ dputs(2) { 'finished connecting' }
316
336
  end
337
+ return @serial_sp != nil
317
338
  end
318
339
 
319
340
  def check_presence
320
- @serial_mutex_rcv.synchronize {
341
+ @serial_mutex.synchronize {
321
342
  @serial_tty.to_s.length > 0 and File.exists?(@serial_tty) and return
343
+ System.exists?('lsusb') or return
322
344
  case lsusb = System.run_str('lsusb')
323
- when /12d1:1506/, /12d1:14ac/, /12d1:1c05/
345
+ when /19d2:fff1/
346
+ log_msg :SerialModem, 'Found CDMA-modem with ttyUSB0-ttyUSB4'
347
+ @serial_tty_error = '/dev/ttyUSB5'
348
+ @serial_tty = '/dev/ttyUSB1'
349
+ @ussd_add = ''
350
+ @serial_eats_sms = true
351
+ when /12d1:1506/, /12d1:14ac/, /12d1:1c05/, /12d1:1001/
324
352
  log_msg :SerialModem, 'Found 3G-modem with ttyUSB0-ttyUSB2'
325
353
  @serial_tty_error = '/dev/ttyUSB3'
326
354
  @serial_tty = '/dev/ttyUSB2'
@@ -335,8 +363,8 @@ module SerialModem
335
363
  #puts caller.join("\n")
336
364
  @serial_tty = @serial_tty_error = nil
337
365
  end
338
- dputs(2){"serial_tty is #{@serial_tty.inspect} and exists " +
339
- "#{File.exists?(@serial_tty.to_s)}"}
366
+ dputs(2) { "serial_tty is #{@serial_tty.inspect} and exists " +
367
+ "#{File.exists?(@serial_tty.to_s)}" }
340
368
  if @serial_tty_error && File.exists?(@serial_tty_error)
341
369
  log_msg :SerialModem, 'resetting modem'
342
370
  reload_option
@@ -346,27 +374,53 @@ module SerialModem
346
374
 
347
375
  def start_serial_thread
348
376
  @serial_thread = Thread.new {
349
- #dputs_func
350
- dputs(2){'Thread started'}
351
- loop {
377
+ # dputs_func
378
+ dputs(2) { 'Thread started' }
379
+ while @serial_sp do
352
380
  begin
353
- dputs(5) { 'Reading out modem' }
354
- if read_reply.length == 0
355
- #@serial_sms.each { |id, sms|
356
- # ddputs(3) { "Deleting sms #{sms.inspect} afterwards" }
357
- # sms_delete(id)
358
- #}
359
- end
381
+ dputs(3) { 'Reading out modem' }
382
+ read_reply
360
383
 
361
384
  dputs(4) { (Time.now - @serial_ussd_last).to_s }
362
- if (Time.now - @serial_ussd_last > @serial_ussd_timeout) &&
363
- (@serial_ussd.length > 0)
364
- log_msg :SerialModem, "Re-sending #{@serial_ussd.first}"
385
+ if @serial_ussd_send_next
386
+ @serial_ussd_send_next = false
365
387
  ussd_send_now
388
+ elsif ((Time.now - @serial_ussd_last > @serial_ussd_timeout) &&
389
+ (@serial_ussd.length > 0)) || @serial_ussd_send_next
390
+ if (@serial_ussd_sent += 1) <= @serial_ussd_sent_max
391
+ log_msg :SerialModem, "Re-sending #{@serial_ussd.first} for #{@serial_ussd_sent}"
392
+ ussd_send_now
393
+ else
394
+ log_msg :SerialModem, "Discarding #{@serial_ussd.first}"
395
+ @serial_ussd.shift
396
+ @serial_ussd_sent = 0
397
+ end
366
398
  end
367
399
 
368
400
  sms_scan
369
401
 
402
+ # Check for any new sms and call attached methods
403
+ while (sms = @serial_sms_new_list.shift) do
404
+ rescue_all do
405
+ if sms._flag =~ /unread/i
406
+ @serial_sms_new.each { |s|
407
+ s.call(sms)
408
+ }
409
+ else
410
+ dputs(2) { "Already read sms: #{sms}" }
411
+ end
412
+ sms_delete(sms._id)
413
+ end
414
+ end
415
+
416
+ # Check for any new ussds and call attached methods
417
+ while (ussd = @serial_ussd_new_list.shift) do
418
+ code, str = ussd
419
+ @serial_ussd_new.each { |s|
420
+ s.call(code, str)
421
+ }
422
+ end
423
+
370
424
  sleep 0.5
371
425
  rescue IOError
372
426
  log_msg :SerialModem, 'IOError - killing modem'
@@ -378,8 +432,8 @@ module SerialModem
378
432
  e.backtrace.each { |l| dputs(0) { l } }
379
433
  end
380
434
  dputs(5) { 'Finished' }
381
- }
382
- dputs(1) { 'Finished thread' }
435
+ end
436
+ dputs(0) { '@serial_sp disappeared - quitting' }
383
437
  }
384
438
  end
385
439
 
@@ -387,7 +441,7 @@ module SerialModem
387
441
  @serial_sp and @serial_sp.close
388
442
  @serial_sp = nil
389
443
  dputs(1) { 'Trying to reload modem-driver - killing and reloading' }
390
- %w( chat ppp).each { |pro|
444
+ %w(chat ppp).each { |pro|
391
445
  System.run_str("killall -9 #{pro}")
392
446
  }
393
447
  %w(rmmod modprobe).each { |cmd|
@@ -397,6 +451,7 @@ module SerialModem
397
451
 
398
452
  def kill
399
453
  #dputs_func
454
+ #puts "Killed by \n" + caller.join("\n")
400
455
  if @serial_thread
401
456
  if @serial_thread.alive?
402
457
  dputs(3) { 'Killing thread' }
data/lib/test ADDED
@@ -0,0 +1,5 @@
1
+ /serial_modem.rb:326:in `synchronize'
2
+ /serial_modem.rb:326:in `check_presence'
3
+ /serial_modem.rb:295:in `setup_tty'
4
+ /serial_modem.rb:318:in `setup_tty'
5
+ /serial_modem.rb:38:in `setup_modem'
data/serial_modem.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'serial_modem'
7
- spec.version = '0.3.1'
7
+ spec.version = '0.3.5'
8
8
  spec.authors = ['Linus Gasser']
9
9
  spec.email = ['ineiti@linusetviviane.ch']
10
10
  spec.summary = %q{Interface to serial-usb-modems}
@@ -12,12 +12,12 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = 'https://github.com/ineiti/SerialModem'
13
13
  spec.license = 'GPLv3'
14
14
 
15
- spec.files = `git ls-files -z`.split("\x0")
15
+ spec.files = `if [ -d '.git' ]; then git ls-files -z; fi`.split("\x0")
16
16
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ['lib']
19
19
 
20
- spec.add_development_dependency 'bundler', '~> 1.7'
20
+ spec.add_development_dependency 'bundler', '~> 1.9'
21
21
  spec.add_development_dependency 'rake', '~> 10.0'
22
22
  spec.add_runtime_dependency 'serialport', '1.3.1'
23
23
  end
File without changes
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require 'thread'
3
+
4
+ $m = Mutex.new
5
+
6
+ def killme
7
+ t.kill
8
+ t.join
9
+ end
10
+
11
+ $t = Thread.new {
12
+ $m.synchronize {
13
+ loop do
14
+ puts "In thread"
15
+ sleep 1
16
+ killme
17
+ end
18
+ }
19
+ }
20
+
21
+ sleep 2
22
+
23
+ $m.synchronize {
24
+ puts "OK to synch here"
25
+ }
@@ -0,0 +1,58 @@
1
+ require 'test/unit'
2
+ require 'serial_modem'
3
+
4
+ class SM_receive < Test::Unit::TestCase
5
+ include SerialModem
6
+
7
+ def setup
8
+ setup_modem
9
+ end
10
+
11
+ def teardown
12
+
13
+ end
14
+
15
+ def test_receive_sms
16
+ str = 'AT+CMGL="ALL"
17
+ +CMGL: 1,"REC UNREAD","192",,"15/06/24,09:14:06+04"
18
+ Souscription reussie:GPRS 3030. 10240MB valable 30 jours. Cout 50000F
19
+
20
+ OK'
21
+ @serial_replies = str.split("\n")
22
+ interpret_serial_reply
23
+ assert_equal({'1' =>
24
+ {:flag => 'REC UNREAD',
25
+ :number => '192',
26
+ :unknown => '',
27
+ :date => '15/06/24,09:14:06+04',
28
+ :msg =>
29
+ 'Souscription reussie:GPRS 3030. 10240MB valable 30 jours. Cout 50000F',
30
+ :id => '1'}}, @serial_sms)
31
+ end
32
+
33
+ def test_receive_two_sms
34
+ str = 'AT+CMGL="ALL"
35
+ +CMGL: 0,"REC UNREAD","+121",,"15/06/24,21:20:01+04"
36
+ Cmd: stat1
37
+ +CMGL: 1,"REC UNREAD","+121",,"15/06/24,21:20:01+04"
38
+ Cmd: stat2
39
+
40
+ OK'
41
+ @serial_replies = str.split("\n")
42
+ interpret_serial_reply
43
+ assert_equal({'0' =>
44
+ {:flag => 'REC UNREAD',
45
+ :number => '+121',
46
+ :unknown => '',
47
+ :date => '15/06/24,21:20:01+04',
48
+ :msg => 'Cmd: stat1',
49
+ :id => '0'},
50
+ '1' =>
51
+ {:flag => 'REC UNREAD',
52
+ :number => '+121',
53
+ :unknown => '',
54
+ :date => '15/06/24,21:20:01+04',
55
+ :msg => 'Cmd: stat2',
56
+ :id => '1'}}, @serial_sms)
57
+ end
58
+ end
data/test/test.rb ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require 'bundler/setup'
3
+ require 'test/unit'
4
+ require 'fileutils'
5
+
6
+ DEBUG_LVL=3
7
+
8
+ require 'serial_modem'
9
+
10
+ tests = Dir.glob('sm_*.rb')
11
+ tests = %w( receive )
12
+
13
+ $LOAD_PATH.push '.'
14
+ tests.each { |t|
15
+ begin
16
+ require "sm_#{t}"
17
+ rescue LoadError => e
18
+ require t
19
+ end
20
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serial_modem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Linus Gasser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-14 00:00:00.000000000 Z
11
+ date: 2017-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '1.9'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.7'
26
+ version: '1.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,9 +66,13 @@ files:
66
66
  - Rakefile
67
67
  - commit
68
68
  - lib/serial_modem.rb
69
+ - lib/test
69
70
  - serial_modem.gemspec
71
+ - test/run_hw.rb
70
72
  - test/run_test
71
- - test/test_hw.rb
73
+ - test/run_thread.rb
74
+ - test/sm_receive.rb
75
+ - test/test.rb
72
76
  homepage: https://github.com/ineiti/SerialModem
73
77
  licenses:
74
78
  - GPLv3
@@ -89,10 +93,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
93
  version: '0'
90
94
  requirements: []
91
95
  rubyforge_project:
92
- rubygems_version: 2.2.2
96
+ rubygems_version: 2.6.13
93
97
  signing_key:
94
98
  specification_version: 4
95
99
  summary: Interface to serial-usb-modems
96
100
  test_files:
101
+ - test/run_hw.rb
97
102
  - test/run_test
98
- - test/test_hw.rb
103
+ - test/run_thread.rb
104
+ - test/sm_receive.rb
105
+ - test/test.rb