Class: EISCP::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/eiscp/message.rb

Overview

The EISCP::Message class is used to handle commands and responses.

Messages can be parsed directly from raw data or created with values:

receiver = Receiver.new

command = EISCP::Message.new('PWR', 'QSTN')
response = EISCP::Parser.parse(receiver.send_recv(command))

Constant Summary collapse

MAGIC =

ISCP “magic” indicates the start of an eISCP message.

'ISCP'
HEADER_SIZE =

eISCP header size, fixed length.

16
ISCP_VERSION =

ISCP protocol version.

1
RESERVED =

Reserved for future protocol updates.

"\x00\x00\x00"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(command: nil, value: '', terminator: "\r\n", unit_type: '1', start: '!') ⇒ Message

Create an ISCP message

Parameters:

  • command (String) (defaults to: nil)

    three-character length ISCP command

  • value (String) (defaults to: '')

    variable length ISCP command value

  • unit_type_character (String)

    override default unit type character, optional

  • start_character (String)

    override default start character, optional



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/eiscp/message.rb', line 57

def initialize(command: nil, value: '', terminator: "\r\n", unit_type: '1', start: '!')
  unless Dictionary.known_command?(command)
    # STDERR.puts "Unknown command #{command}"
  end

  @command = command
  @value = value
  @terminator = terminator
  @unit_type = unit_type
  @start = start
  @header = { magic: MAGIC,
              header_size: HEADER_SIZE,
              data_size: to_iscp.length,
              version: ISCP_VERSION,
              reserved: RESERVED }
  begin
    get_human_readable_attrs
  rescue StandardError
    # STDERR.puts"Couldn't get all human readable attrs"
  end
end

Instance Attribute Details

#commandObject (readonly)

ISCP Command



33
34
35
# File 'lib/eiscp/message.rb', line 33

def command
  @command
end

#command_descriptionObject (readonly)

Command description



37
38
39
# File 'lib/eiscp/message.rb', line 37

def command_description
  @command_description
end

#command_nameObject (readonly)

Human readable command name



35
36
37
# File 'lib/eiscp/message.rb', line 35

def command_name
  @command_name
end

#headerObject

EISCP header



17
18
19
# File 'lib/eiscp/message.rb', line 17

def header
  @header
end

#parsedObject (readonly)

Differentiates parsed messages from command messages



47
48
49
# File 'lib/eiscp/message.rb', line 47

def parsed
  @parsed
end

#startObject (readonly)

ISCP Start character, usually “!”



29
30
31
# File 'lib/eiscp/message.rb', line 29

def start
  @start
end

#terminatorObject (readonly)

Terminator character for eISCP packets



50
51
52
# File 'lib/eiscp/message.rb', line 50

def terminator
  @terminator
end

#unit_typeObject (readonly)

ISCP Unit Type character, usually “1”



31
32
33
# File 'lib/eiscp/message.rb', line 31

def unit_type
  @unit_type
end

#valueObject (readonly)

ISCP Command Value



39
40
41
# File 'lib/eiscp/message.rb', line 39

def value
  @value
end

#value_descriptionObject (readonly)

Value description



43
44
45
# File 'lib/eiscp/message.rb', line 43

def value_description
  @value_description
end

#value_nameObject (readonly)

Human readable value name



41
42
43
# File 'lib/eiscp/message.rb', line 41

def value_name
  @value_name
end

#zoneObject (readonly)

ISCP Zone



45
46
47
# File 'lib/eiscp/message.rb', line 45

def zone
  @zone
end

Instance Method Details

#==(other) ⇒ Object

Check if two messages are equivalent comparing their ISCP messages.



81
82
83
# File 'lib/eiscp/message.rb', line 81

def ==(other)
  to_iscp == other.to_iscp
end

#to_eiscpObject

Return EISCP Message string



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/eiscp/message.rb', line 93

def to_eiscp
  [
    @header[:magic],
    @header[:header_size].to_i,
    @header[:data_size].to_i,
    @header[:version].to_i,
    @header[:reserved],
    to_iscp.to_s,
    @terminator
  ].pack('A4NNCa3A*A*')
end

#to_iscpObject

Return ISCP Message string



87
88
89
# File 'lib/eiscp/message.rb', line 87

def to_iscp
  (@start + @unit_type + @command + @value).to_s
end

#to_sObject

Return human readable description.



107
108
109
# File 'lib/eiscp/message.rb', line 107

def to_s
  "#{@zone} - #{@command_name}:#{@value_name}"
end