apex-aprs 1.0.3 → 1.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7ab4abfcc8a45fe0ed8cf65e3af8027d5ef5bcf851f70a8e9067207b51699cc8
4
- data.tar.gz: d9aeb612963bd2f85bd527d94ae8b77794326550590c98b4e51d45c3f8255991
3
+ metadata.gz: 50aaeb1837b3f6a1515f98e798727ec7ca74815b0b4c6c6e197710b11916bd04
4
+ data.tar.gz: 7a0aeaafac5d7dc07bd4d74afa2b1eaaf29fad3c64bf6eb8e160f244bd0a7bd7
5
5
  SHA512:
6
- metadata.gz: 436265f8be51ee2cb49ff0f074a60a7d87214a68c56459a4ae33346da851e2013188735a0f1bdeaca974437c49720e80b4641a91f70c04fc476f831cc6e329cb
7
- data.tar.gz: 6e1e45ee6ee7e680db9d3889a57f6a1c8fe1120fea3cc97484ee4c22158aa07949aaea97a7e2daea363a4fef4d0c09de5930ef1adffacb3b644c5a56da34b52d
6
+ metadata.gz: 4186b7b390dee0744b860b060150adb3fcbb05f9b59890eca04758ae46a60bdc1938351983a59893c27f09badcf458e7fefcd7261651afd1ef5b418311b12970
7
+ data.tar.gz: 3c772a99fe98e6049036c20465a6cf687dc04f17ca30ab1ea5fc895dcd47eda5ea82dd90328f0c4b2ebbeb77ca998a94d2e78db7caa6b97e0899cc6a86290e6e
data/CHANGELOG.md CHANGED
@@ -1,8 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.4
4
+
5
+ * Frames are now classes rather than a map
6
+ * Added mechanism for comparing frames for equivalence.
7
+
3
8
  ## 1.0.3
4
9
 
5
- * Implemented the IGateTcp class for handking internet gateways.
10
+ * Implemented the IGateTcp class for handling internet gateways.
6
11
 
7
12
  ## 1.0.2
8
13
 
data/README.md CHANGED
@@ -30,7 +30,20 @@ After checking out the repo, run `bin/setup` to install dependencies. You can al
30
30
 
31
31
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
32
 
33
- ## Contributing
33
+ ### Unit Tests
34
+
35
+ To run all unit tests first make sure you have dependencies installed:
36
+
37
+ ```bash
38
+ bundle install
39
+ ```
34
40
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/Syncleus/apex-aprs
41
+ then run the tests with:
42
+
43
+ ```bash
44
+ bundle exec rake test
45
+ ```
46
+
47
+ ## Contributing
36
48
 
49
+ Bug reports and pull requests are welcome on Git at https://git.qoto.org/digipex/apex-aprs
data/apex-aprs.gemspec CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency 'kiss-tnc', '~> 1.0'
35
35
  spec.add_development_dependency 'bundler', '~> 2.2'
36
36
  spec.add_development_dependency 'rake', '~> 13.0'
37
- spec.add_development_dependency 'rdoc', '~> 6.3'
37
+ spec.add_development_dependency 'test-unit', '~> 3.6'
38
+ #spec.add_development_dependency 'rdoc', '~> 6.3'
38
39
  spec.add_development_dependency 'aruba', '~> 2.0'
39
40
  end
data/lib/apex/app_info.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Apex
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.4"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'kiss/constants'
2
+ require 'apex/frame'
2
3
 
3
4
  module Apex
4
5
  class AprsKiss
@@ -11,7 +12,6 @@ module Apex
11
12
 
12
13
  private
13
14
  def self.decode_frame(raw_frame)
14
- frame = {}
15
15
  frame_len = raw_frame.length
16
16
 
17
17
  if frame_len > 16
@@ -22,12 +22,12 @@ module Apex
22
22
  # Less than 2 callsigns?
23
23
  if 1.0 < i and i < 11.0
24
24
  if raw_frame[raw_slice + 1] & 0x03 == 0x03 and [0xf0, 0xcf].include? raw_frame[raw_slice + 2]
25
- text_as_array = raw_frame[raw_slice + 3..-1].map { |b| b.chr }
26
- frame[:text] = text_as_array.join
27
- frame[:destination] = identity_as_string(extract_callsign(raw_frame))
28
- frame[:source] = identity_as_string(extract_callsign(raw_frame[7..-1]))
29
- frame[:path] = extract_path(i.to_i, raw_frame)
30
- return frame
25
+ payload_as_array = raw_frame[raw_slice + 3..-1].map { |b| b.chr }
26
+ payload = payload_as_array.join
27
+ destination = identity_as_string(extract_callsign(raw_frame))
28
+ source = identity_as_string(extract_callsign(raw_frame[7..-1]))
29
+ path = extract_path(i.to_i, raw_frame)
30
+ return Frame.new(source, destination, path, payload)
31
31
  end
32
32
  end
33
33
  end
@@ -94,13 +94,13 @@ module Apex
94
94
 
95
95
  private
96
96
  def self.encode_frame(frame)
97
- enc_frame = encode_callsign(parse_identity_string(frame[:destination])) + encode_callsign(parse_identity_string(frame[:source]))
97
+ enc_frame = encode_callsign(parse_identity_string(frame.destination)) + encode_callsign(parse_identity_string(frame.source))
98
98
 
99
- frame[:path].each do |path|
99
+ frame.path.each do |path|
100
100
  enc_frame += encode_callsign(parse_identity_string(path))
101
101
  end
102
102
 
103
- return enc_frame[0...-1] + [enc_frame[-1] | 0x01] + [Kiss::SLOT_TIME] + [0xf0] + frame[:text].chars.map { |c| c.ord }
103
+ return enc_frame[0...-1] + [enc_frame[-1] | 0x01] + [Kiss::SLOT_TIME] + [0xf0] + frame.payload.chars.map { |c| c.ord }
104
104
  end
105
105
 
106
106
  private
@@ -170,4 +170,4 @@ module Apex
170
170
  end
171
171
  end
172
172
  end
173
- end
173
+ end
data/lib/apex/frame.rb ADDED
@@ -0,0 +1,124 @@
1
+ module Apex
2
+ public
3
+ class UnpathedFrame
4
+ attr_accessor :source, :destination, :payload
5
+
6
+ protected
7
+ def initialize(source, destination, payload)
8
+ @source = source
9
+ @destination = destination
10
+ @payload = payload
11
+ end
12
+
13
+ public
14
+ def path_agnostic_eql?(other)
15
+ raise ArgumentError.new("The argument must be either an UnpathedFrame or a PathAgnosticFrame") if not ((other.instance_of? UnpathedFrame) || (other.instance_of? PathAgnosticFrame))
16
+
17
+ return self == other
18
+ end
19
+
20
+ public
21
+ def path_agnostic_equality?(other)
22
+ return false if (not other.respond_to? :source) ||
23
+ (not other.respond_to? :destination) ||
24
+ (not other.respond_to? :payload)
25
+
26
+ if (self.source.eql? other.source) && (self.destination.eql? other.destination) && (self.payload.eql? other.payload)
27
+ return true
28
+ else
29
+ return false
30
+ end
31
+ end
32
+
33
+ public
34
+ def path_agnostic_hash
35
+ return [self.source, self.destination, self.payload].hash
36
+ end
37
+
38
+ public
39
+ def ==(other)
40
+ return self.path_agnostic_equality? other
41
+ end
42
+
43
+ public
44
+ def eql?(other)
45
+ self.path_agnostic_eql? other
46
+ end
47
+
48
+ public
49
+ def hash
50
+ return self.path_agnostic_hash
51
+ end
52
+ end
53
+
54
+ public
55
+ class Frame < UnpathedFrame
56
+ attr_accessor :path
57
+
58
+ protected
59
+ def initialize(source, destination, path, payload)
60
+ super(source, destination, payload)
61
+
62
+ @path = path
63
+ end
64
+
65
+ public
66
+ def eql?(other)
67
+ raise ArgumentError.new("The argument can not be a UnpathedFrame or a PathAgnosticFrame") if ((other.instance_of? UnpathedFrame) || (other.instance_of? PathAgnosticFrame))
68
+ raise ArgumentError.new("The argument must be of type Frame (or a child class).") if not other.kind_of? Frame
69
+
70
+ return self == other
71
+ end
72
+
73
+ public
74
+ def ==(other)
75
+ return false if not super(other)
76
+
77
+ return false if not other.respond_to? :path
78
+
79
+ if self.path.eql? other.path
80
+ return true
81
+ else
82
+ return false
83
+ end
84
+ end
85
+
86
+ public
87
+ def hash
88
+ return [super, self.path].hash
89
+ end
90
+
91
+ public
92
+ def path_agnostic_identity
93
+ return PathAgnosticFrame.new(self)
94
+ end
95
+ end
96
+
97
+ private
98
+ class PathAgnosticFrame < Frame
99
+ protected
100
+ def initialize(frame)
101
+ super(frame.source, frame.destination, frame.path, frame.payload)
102
+ end
103
+
104
+ public
105
+ def eql?(other)
106
+ return self.path_agnostic_eql? other
107
+ end
108
+
109
+ public
110
+ def ==(other)
111
+ return self.path_agnostic_equality? other
112
+ end
113
+
114
+ public
115
+ def hash
116
+ return self.path_agnostic_hash
117
+ end
118
+
119
+ public
120
+ def path_agnostic_identity
121
+ return self
122
+ end
123
+ end
124
+ end
@@ -7,8 +7,9 @@ module Apex
7
7
  DEFAULT_APRSIS_FILTER_PORT = 14580
8
8
 
9
9
  protected
10
- def initialize(user, password='-1')
10
+ def initialize(user, password=nil)
11
11
  @user = user
12
+ password = IGateTcp.calculatePasscode(user) if password.nil?
12
13
  @auth = ['user', user, 'pass', password, 'vers', "APEX #{VERSION}"].join(' ')
13
14
  @aprsis_sock = nil
14
15
  @data_buffer = ''
@@ -29,23 +30,23 @@ module Apex
29
30
 
30
31
  private
31
32
  def self.encode_frame(frame)
32
- formatted_frame = [frame[:source], frame[:destination]].join('>')
33
- if frame[:path] and frame[:path].length > 0
34
- formatted_frame = [formatted_frame, IGateTcp::format_path(frame[:path])].join(',')
33
+ formatted_frame = [frame.source, frame.destination].join('>')
34
+ if frame.path and frame.path.length > 0
35
+ formatted_frame = [formatted_frame, IGateTcp::format_path(frame.path)].join(',')
35
36
  end
36
37
  formatted_frame += ':'
37
- formatted_frame += frame[:text]
38
+ formatted_frame += frame.payload
38
39
  return formatted_frame
39
40
  end
40
41
 
41
42
  private
42
43
  def self.decode_frame(frame)
43
- decoded_frame = {}
44
+ decoded_source = nil
44
45
  frame_so_far = ''
45
46
  path = nil
46
47
  frame.chars.each do |char|
47
- if char == '>' and !decoded_frame.include? :source
48
- decoded_frame[:source] = frame_so_far
48
+ if char == '>' and decoded_source.nil?
49
+ decoded_source = frame_so_far
49
50
  frame_so_far = ''
50
51
  elsif char == ':' and !path
51
52
  path = frame_so_far
@@ -56,11 +57,28 @@ module Apex
56
57
  end
57
58
 
58
59
  path = path.split(',')
59
- decoded_frame[:destination] = path.shift
60
- decoded_frame[:path] = path
61
- decoded_frame[:text] = frame_so_far
60
+ decoded_destination = path.shift
61
+ decoded_path = path
62
+ decoded_payload = frame_so_far
62
63
 
63
- decoded_frame
64
+ return Frame.new(decoded_source, decoded_destination, decoded_path, decoded_payload)
65
+ end
66
+
67
+ private
68
+ def self.calculatePasscode(callsign_raw)
69
+ callsign = callsign_raw.upcase.split('-').first
70
+ hash = 0x73e2
71
+ flag = true
72
+
73
+ callsign.split('').each do |c|
74
+ hash = if flag
75
+ (hash ^ (c.ord << 8))
76
+ else
77
+ (hash ^ c.ord)
78
+ end
79
+ flag = !flag
80
+ end
81
+ hash & 0x7fff
64
82
  end
65
83
 
66
84
  public
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apex-aprs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeffrey Phillips Freeman
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-07 00:00:00.000000000 Z
11
+ date: 2023-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: abstraction
@@ -81,19 +81,19 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '13.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rdoc
84
+ name: test-unit
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '6.3'
89
+ version: '3.6'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '6.3'
96
+ version: '3.6'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: aruba
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -129,13 +129,14 @@ files:
129
129
  - lib/apex.rb
130
130
  - lib/apex/app_info.rb
131
131
  - lib/apex/aprs_kiss.rb
132
+ - lib/apex/frame.rb
132
133
  - lib/apex/igate_tcp.rb
133
134
  homepage: https://github.com/Syncleus/apex-aprs
134
135
  licenses:
135
136
  - Apache-2.0
136
137
  metadata:
137
138
  allowed_push_host: https://rubygems.org
138
- post_install_message:
139
+ post_install_message:
139
140
  rdoc_options: []
140
141
  require_paths:
141
142
  - lib
@@ -150,8 +151,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
151
  - !ruby/object:Gem::Version
151
152
  version: '0'
152
153
  requirements: []
153
- rubygems_version: 3.2.5
154
- signing_key:
154
+ rubygems_version: 3.4.16
155
+ signing_key:
155
156
  specification_version: 4
156
157
  summary: Library for APRS, Automatic Packet Reporting System, communications including
157
158
  the next-generation APEX extensions. Includes an APRS-IS client.