diff --git a/apex.gemspec b/aprs.gemspec similarity index 70% rename from apex.gemspec rename to aprs.gemspec index 79889ae0c3dca44990ac2816fa49cec84d424327..caa177a493721a0bf67f03c716aba3f73accade2 100644 --- a/apex.gemspec +++ b/aprs.gemspec @@ -9,14 +9,14 @@ Gem::Specification.new do |spec| spec.authors = ['Jeffrey Phillips Freeman'] spec.email = ['jeffrey.freeman@syncleus.com'] - spec.summary = %q{Ruby library for APRS communications.} + spec.summary = %q{library for APRS communications.} spec.description = %q{Ruby library for APRS communications.} spec.homepage = 'https://github.com/Syncleus/aprs' # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host' # to allow pushing to a single host or delete this section to allow pushing to any host. if spec.respond_to?(:metadata) - spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'" + spec.metadata['allowed_push_host'] = "https://rubygems.org" else raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.' end @@ -28,11 +28,10 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ['lib'] - spec.add_dependency 'colorize' - spec.add_dependency 'abstraction' - spec.add_dependency 'json' - spec.add_development_dependency 'bundler' - spec.add_development_dependency 'rake' - spec.add_development_dependency 'rdoc' - spec.add_development_dependency 'aruba' + spec.add_dependency 'abstraction', '~> 0.0.4' + spec.add_dependency 'json', '~> 1.8' + spec.add_development_dependency 'bundler', '~> 1.13' + spec.add_development_dependency 'rake', '~> 11.3' + spec.add_development_dependency 'rdoc', '~> 4.2' + spec.add_development_dependency 'aruba', '~> 0.14' end diff --git a/lib/kiss/constants.rb b/lib/kiss/constants.rb deleted file mode 100644 index 62cc5dfc0cd7fb2197c1dacdeeeb87efd5a0ca01..0000000000000000000000000000000000000000 --- a/lib/kiss/constants.rb +++ /dev/null @@ -1,61 +0,0 @@ -module Kiss - # KISS Special Characters - # http://en.wikipedia.org/wiki/KISS_(TNC)#Special_Characters - FEND = 0xC0 - FESC = 0xDB - TFEND = 0xDC - TFESC = 0xDD - - # "FEND is sent as FESC, TFEND" - FESC_TFEND = [FESC] + [TFEND] - - # "FESC is sent as FESC, TFESC" - FESC_TFESC = [FESC] + [TFESC] - - # KISS Command Codes - # http://en.wikipedia.org/wiki/KISS_(TNC)#Command_Codes - DATA_FRAME = 0x00 - TX_DELAY = 0x01 - PERSISTENCE = 0x02 - SLOT_TIME = 0x03 - TX_TAIL = 0x04 - FULL_DUPLEX = 0x05 - SET_HARDWARE = 0x06 - RETURN = 0xFF - - DEFAULT_KISS_CONFIG_VALUES = { - :TX_DELAY => 40, - :PERSISTENCE => 63, - :SLOT_TIME => 20, - :TX_TAIL => 30, - :FULL_DUPLEX => 0 - } - - # This command will exit KISS mode - MODE_END = [192, 255, 192, 13] - - # This will start kiss on a WA8DED or LINK>.<NORD firmware - MODE_INIT_W8DED = [13, 27, 64, 75, 13] - MODE_INIT_LINKNORD = MODE_INIT_W8DED - - # Kenwood D710 - MODE_INIT_KENWOOD_D710 = [72, 66, 32, 49, 50, 48, 48, 13, # HB 1200 - 75, 73, 83, 83, 32, 79, 78, 13, # KISS ON - 82, 69, 83, 84, 65, 82, 84, 13] # RESTART - - # Kantronics TNCs - MODE_INIT_KANTRONICS = [13, # Blank - 73, 78, 84, 32, 75, 73, 83, 83, 13, # INT KISS - 82, 69, 83, 84, 65, 82, 84, 13] # RESTART - - # TINY2 TNC (TNC2) - MODE_INIT_TINY2 = [13, # Blank - 75, 73, 83, 83, 32, 79, 78, 13, # KISS ON - 82, 69, 83, 84, 65, 82, 84, 13] # RESTART - - # Advanced Electronic Application (later Timewave) PK-232 TNC - MODE_INIT_PK232 = [42, 126, 13, # *~ - 69, 88, 80, 69, 82, 84, 32, 79, 78, 13, # EXPERT ON - 75, 73, 83, 83, 32, 79, 78, 13, # KISS ON - 82, 69, 83, 84, 65, 82, 84, 13] # RESTART -end \ No newline at end of file diff --git a/lib/kiss/kiss_abstract.rb b/lib/kiss/kiss_abstract.rb deleted file mode 100644 index b4112e41f3f546600a7b8a24a2a6cf5d18f2b10b..0000000000000000000000000000000000000000 --- a/lib/kiss/kiss_abstract.rb +++ /dev/null @@ -1,153 +0,0 @@ -require 'thread' -require 'abstraction' -require 'kiss/constants' - -module Kiss - class KissAbstract - abstract - - protected - def initialize(strip_df_start=true) - @strip_df_start = strip_df_start - @frame_buffer = [] - @lock = Mutex.new - end - - private - def self.strip_df_start(frame) - while frame[0] == DATA_FRAME - frame.shift - end - while frame[0] and frame[0].chr == ' ' - frame.shift - end - while frame[-1] and frame[-1].chr == ' ' - frame.pop - end - frame - end - - private - def self.escape_special_codes(raw_code_bytes) - encoded_bytes = [] - raw_code_bytes.each do |raw_code_byte| - if raw_code_byte == FESC - encoded_bytes += FESC_TFESC - elsif raw_code_byte == FEND - encoded_bytes += FESC_TFEND - else - encoded_bytes += [raw_code_byte] - end - end - encoded_bytes - end - - private - def self.command_byte_combine(port, command_code) - if port > 127 or port < 0 - raise 'port out of range' - elsif command_code > 127 or command_code < 0 - raise 'command_Code out of range' - end - (port << 4) & command_code - end - - protected - def write_setting(command, value) - write_interface([FEND] + [command] + escape_special_codes(value) + [FEND]) - end - - private - def fill_buffer - new_frames = [] - read_buffer = [] - read_data = read_interface - while read_data and read_data.length > 0 - split_data = [[]] - read_data.each do |read_byte| - if read_byte == FEND - split_data << [] - else - split_data[-1] << read_byte - end - end - len_fend = split_data.length - - # No FEND in frame - if len_fend == 1 - read_buffer += split_data[0] - # Single FEND in frame - elsif len_fend == 2 - # Closing FEND found - if split_data[0] - # Partial frame continued, otherwise drop - new_frames << read_buffer + split_data[0] - read_buffer = [] - # Opening FEND found - else - new_frames << read_buffer - read_buffer = split_data[1] - end - # At least one complete frame received - elsif len_fend >= 3 - (0...len_fend - 1).each do |i| - read_buffer_tmp = read_buffer + split_data[i] - if read_buffer_tmp.length > 0 - new_frames << read_buffer_tmp - read_buffer = [] - end - end - if split_data[len_fend - 1] - read_buffer = split_data[len_fend - 1] - end - end - # Get anymore data that is waiting - read_data = read_interface - end - - new_frames.each do |new_frame| - if new_frame.length > 0 and new_frame[0] == 0 - if @strip_df_start - new_frame = KissAbstract.strip_df_start(new_frame) - end - @frame_buffer << new_frame - end - end - end - - public - def connect(mode_init=nil, *args, **kwargs) - end - - public - def close - end - - public - def read(*args, **kwargs) - @lock.synchronize do - if @frame_buffer.length == 0 - fill_buffer - end - - if @frame_buffer.length > 0 - return_frame = @frame_buffer[0] - @frame_buffer.shift - return return_frame - else - return nil - end - end - end - - public - def write(frame_bytes, port=0, *args, **kwargs) - @lock.synchronize do - kiss_packet = [FEND] + [KissAbstract.command_byte_combine(port, DATA_FRAME)] + - KissAbstract.escape_special_codes(frame_bytes) + [FEND] - - write_interface(kiss_packet) - end - end - end -end \ No newline at end of file diff --git a/lib/kiss/kiss_serial.rb b/lib/kiss/kiss_serial.rb deleted file mode 100644 index 5a90d70b261dfc07df46c961d2dbedbb8212eb49..0000000000000000000000000000000000000000 --- a/lib/kiss/kiss_serial.rb +++ /dev/null @@ -1,83 +0,0 @@ -require 'serialport' -require 'kiss/kiss_abstract' - -module Kiss - class KissSerial < KissAbstract - - DEFAULT_READ_BYTES = 1000 - SERIAL_READ_TIMEOUT = -1 - - protected - def initialize(com_port, - baud=38400, - parity=SerialPort::NONE, - stop_bits=1, - byte_size=8, - read_bytes=DEFAULT_READ_BYTES, - strip_df_start=true) - super(strip_df_start) - - @com_port = com_port - @baud = baud - @parity = parity - @stop_bits = stop_bits - @byte_size = byte_size - @read_bytes = read_bytes - @serial = nil - @exit_kiss = false - end - - protected - def read_interface - read_data = @serial.read(@read_bytes) - if read_data - return read_data.chars.map { |c| c.ord } - else - return nil - end - end - - protected - def write_interface(data) - @serial.write(data) - end - - public - def connect(mode_init=nil, **kwargs) - super - - @serial = SerialPort.new(@com_port, @baud, @byte_size, @stop_bits, @parity) - @serial.read_timeout = SERIAL_READ_TIMEOUT - - if mode_init - @serial.write(mode_init) - @exit_kiss = true - else - @exit_kiss = false - end - - # Previous verious defaulted to Xastir-friendly configs. Unfortunately - # those don't work with Bluetooth TNCs, so we're reverting to None. - if kwargs - kwargs.each do |name, value| - write_setting(name, value) - end - end - end - - public - def close - super - - if @exit_kiss - write_interface(MODE_END) - end - - if @serial == nil or @serial.closed? - raise 'Attempting to close before the class has been started.' - else - @serial.close - end - end - end -end \ No newline at end of file diff --git a/test/kiss_mock.rb b/test/kiss_mock.rb deleted file mode 100644 index f585e4c74326ec079ed7ab9d24aaeb8dacfd38e6..0000000000000000000000000000000000000000 --- a/test/kiss_mock.rb +++ /dev/null @@ -1,41 +0,0 @@ -require_relative '../lib/kiss/kiss_abstract' - -module Kiss - class KissMock < KissAbstract - - def initialize(strip_df_start=true) - super(strip_df_start) - @read_from_interface = [] - @sent_to_interface = [] - end - - protected - def read_interface - if @read_from_interface.length == 0 - return nil - end - return @read_from_interface.shift - end - - protected - def write_interface(data) - @sent_to_interface << data - end - - public - def clear_interface - @read_from_interface = [] - @sent_to_interface = [] - end - - public - def add_read_from_interface(raw_frame) - @read_from_interface << raw_frame - end - - public - def get_sent_to_interface - return @sent_to_interface - end - end -end \ No newline at end of file diff --git a/test/tc_aprs_kiss.rb b/test/tc_aprs_kiss.rb index 2213e70e0ed7a661c936a6250fa408400d5e1f60..929eaafcea4c27359cb0d6ea5226cf24572ca9d0 100644 --- a/test/tc_aprs_kiss.rb +++ b/test/tc_aprs_kiss.rb @@ -1,5 +1,5 @@ require 'test/unit' -require_relative 'kiss_mock' +require 'kiss/test/kiss_mock' require_relative '../lib/aprs/aprs_kiss' module Aprs diff --git a/test/tc_kiss.rb b/test/tc_kiss.rb deleted file mode 100644 index 4cf33bd93164fc571cacf3df048be1360339df10..0000000000000000000000000000000000000000 --- a/test/tc_kiss.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'test/unit' -require_relative 'kiss_mock' - -module Kiss - # KG6WTF>S7TSUV,MTOSO-2,WIDE2*,qAR,KF6FIR-10:`17El#X-/kg6wtf@gosselinfamily.com - ENCODED_FRAME = [192, 0, 75, 71, 54, 87, 84, 70, 62, 83, 55, 84, 83, 85, 86, 44, 77, 84, 79, 83, 79, 45, 50, 44, 87, 73, - 68, 69, 50, 42, 44, 113, 65, 82, 44, 75, 70, 54, 70, 73, 82, 45, 49, 48, 58, 96, 49, 55, 69, 108, 35, - 88, 45, 47, 107, 103, 54, 119, 116, 102, 64, 103, 111, 115, 115, 101, 108, 105, 110, 102, 97, 109, 105, - 108, 121, 46, 99, 111, 109, 192] - DECODED_FRAME = [75, 71, 54, 87, 84, 70, 62, 83, 55, 84, 83, 85, 86, 44, 77, 84, 79, 83, 79, 45, 50, 44, 87, 73, 68, - 69, 50, 42, 44, 113, 65, 82, 44, 75, 70, 54, 70, 73, 82, 45, 49, 48, 58, 96, 49, 55, 69, 108, 35, - 88, 45, 47, 107, 103, 54, 119, 116, 102, 64, 103, 111, 115, 115, 101, 108, 105, 110, 102, 97, 109, - 105, 108, 121, 46, 99, 111, 109] - - class TestKiss < Test::Unit::TestCase - def test_read - kiss_mock = KissMock.new - kiss_mock.add_read_from_interface(ENCODED_FRAME) - translated_frame = kiss_mock.read - assert_equal DECODED_FRAME, translated_frame - end - - def test_write - kiss_mock = KissMock.new - kiss_mock.write(DECODED_FRAME) - all_raw_frames = kiss_mock.get_sent_to_interface - assert_equal ENCODED_FRAME, all_raw_frames[0] - end - - def test_new_abstract_kiss - assert_raise(AbstractClassError) { KissAbstract.new } - end - end -end \ No newline at end of file