timex_datalink_client 0.8.0 → 0.10.0
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/lib/timex_datalink_client/helpers/lsb_msb_formatter.rb +11 -0
- data/lib/timex_datalink_client/protocol_1/alarm.rb +48 -0
- data/lib/timex_datalink_client/protocol_1/eeprom/list.rb +17 -1
- data/lib/timex_datalink_client/protocol_1/time.rb +11 -0
- data/lib/timex_datalink_client/protocol_1/time_name.rb +11 -0
- data/lib/timex_datalink_client/protocol_3/alarm.rb +11 -0
- data/lib/timex_datalink_client/protocol_3/eeprom/list.rb +18 -2
- data/lib/timex_datalink_client/protocol_3/time.rb +32 -2
- data/lib/timex_datalink_client/protocol_4/alarm.rb +11 -0
- data/lib/timex_datalink_client/protocol_4/eeprom/list.rb +17 -1
- data/lib/timex_datalink_client/protocol_4/time.rb +32 -2
- data/lib/timex_datalink_client/protocol_7/eeprom/calendar/event.rb +5 -1
- data/lib/timex_datalink_client/protocol_7/eeprom/calendar.rb +6 -4
- data/lib/timex_datalink_client/protocol_7/eeprom/games.rb +4 -2
- data/lib/timex_datalink_client/protocol_7/eeprom/speech.rb +3 -1
- data/lib/timex_datalink_client/protocol_9/alarm.rb +48 -0
- data/lib/timex_datalink_client/protocol_9/eeprom/chrono.rb +11 -0
- data/lib/timex_datalink_client/protocol_9/time.rb +11 -0
- data/lib/timex_datalink_client/protocol_9/time_name.rb +11 -0
- data/lib/timex_datalink_client/protocol_9/timer.rb +12 -2
- data/lib/timex_datalink_client/version.rb +1 -1
- metadata +24 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bbd5ed72c50f798a4efc663846f406338e1a777cd8587ba504a283c7976e7bf
|
4
|
+
data.tar.gz: '0843b0db0875cfc5ea663e85dcf0cf007bfb88b89306945390d51ab9eba09693'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17da22510b17f02379419c84d0c80c35c9d63861d9186627d4adad2cbf7d00ed5c6aaf458316f7ec4bad5ee98fdcfa4bdbbaa96cb01b4506cce81b7193946eaa
|
7
|
+
data.tar.gz: 183bdf6f467c802df1e31c3f2b7e76d5a93a07e851fed8caf85fff56a93f3a48ef448d3b4f9b3884e46e9481e3c894702ae2994b96de92d9c09c4c1737a696af
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol1
|
8
10
|
class Alarm
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -14,8 +17,50 @@ class TimexDatalinkClient
|
|
14
17
|
|
15
18
|
ALARM_SILENT_START_INDEX = 0x61
|
16
19
|
|
20
|
+
VALID_DAYS_IN_MONTH = {
|
21
|
+
1 => 1..31,
|
22
|
+
2 => 1..29,
|
23
|
+
3 => 1..31,
|
24
|
+
4 => 1..30,
|
25
|
+
5 => 1..31,
|
26
|
+
6 => 1..30,
|
27
|
+
7 => 1..31,
|
28
|
+
8 => 1..31,
|
29
|
+
9 => 1..30,
|
30
|
+
10 => 1..31,
|
31
|
+
11 => 1..30,
|
32
|
+
12 => 1..31
|
33
|
+
}.freeze
|
34
|
+
|
17
35
|
attr_accessor :number, :audible, :time, :message, :month, :day
|
18
36
|
|
37
|
+
validates :number, inclusion: {
|
38
|
+
in: 1..5,
|
39
|
+
message: "value %{value} is invalid! Valid number values are 1..5."
|
40
|
+
}
|
41
|
+
|
42
|
+
validates :month, inclusion: {
|
43
|
+
in: 1..12,
|
44
|
+
allow_nil: true,
|
45
|
+
message: "%{value} is invalid! Valid months are 1..12 and nil."
|
46
|
+
}
|
47
|
+
|
48
|
+
validates :day, inclusion: {
|
49
|
+
if: ->(alarm) { alarm.month.nil? },
|
50
|
+
in: 1..31,
|
51
|
+
allow_nil: true,
|
52
|
+
message: "%{value} is invalid! Valid days are 1..31 and nil."
|
53
|
+
}
|
54
|
+
|
55
|
+
validates :day, inclusion: {
|
56
|
+
if: ->(alarm) { alarm.day && alarm.month },
|
57
|
+
in: ->(alarm) { VALID_DAYS_IN_MONTH[alarm.month] },
|
58
|
+
message: ->(alarm, _attributes) do
|
59
|
+
"#{alarm.day} is invalid for month #{alarm.month}! " \
|
60
|
+
"Valid days are #{VALID_DAYS_IN_MONTH[alarm.month]} and nil when month is #{alarm.month}."
|
61
|
+
end
|
62
|
+
}
|
63
|
+
|
19
64
|
# Create an Alarm instance.
|
20
65
|
#
|
21
66
|
# @param number [Integer] Alarm number (from 1 to 5).
|
@@ -36,8 +81,11 @@ class TimexDatalinkClient
|
|
36
81
|
|
37
82
|
# Compile packets for an alarm.
|
38
83
|
#
|
84
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
39
85
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
40
86
|
def packets
|
87
|
+
validate!
|
88
|
+
|
41
89
|
[alarm_data_packet].tap do |packets|
|
42
90
|
packets << alarm_silent_packet unless audible
|
43
91
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/length_packet_wrapper"
|
5
7
|
|
@@ -7,11 +9,18 @@ class TimexDatalinkClient
|
|
7
9
|
class Protocol1
|
8
10
|
class Eeprom
|
9
11
|
class List
|
12
|
+
include ActiveModel::Validations
|
10
13
|
include Helpers::CharEncoders
|
11
14
|
prepend Helpers::LengthPacketWrapper
|
12
15
|
|
13
16
|
attr_accessor :list_entry, :priority
|
14
17
|
|
18
|
+
validates :priority, inclusion: {
|
19
|
+
in: 1..5,
|
20
|
+
allow_nil: true,
|
21
|
+
message: "%{value} is invalid! Valid priorities are 1..5 or nil."
|
22
|
+
}
|
23
|
+
|
15
24
|
# Create a List instance.
|
16
25
|
#
|
17
26
|
# @param list_entry [String] List entry text.
|
@@ -24,10 +33,13 @@ class TimexDatalinkClient
|
|
24
33
|
|
25
34
|
# Compile a packet for a list.
|
26
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
27
37
|
# @return [Array<Integer>] Array of integers that represent bytes.
|
28
38
|
def packet
|
39
|
+
validate!
|
40
|
+
|
29
41
|
[
|
30
|
-
|
42
|
+
priority_value,
|
31
43
|
list_entry_characters
|
32
44
|
].flatten
|
33
45
|
end
|
@@ -37,6 +49,10 @@ class TimexDatalinkClient
|
|
37
49
|
def list_entry_characters
|
38
50
|
eeprom_chars_for(list_entry)
|
39
51
|
end
|
52
|
+
|
53
|
+
def priority_value
|
54
|
+
priority.nil? ? 0 : priority
|
55
|
+
end
|
40
56
|
end
|
41
57
|
end
|
42
58
|
end
|
@@ -1,16 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
4
6
|
|
5
7
|
class TimexDatalinkClient
|
6
8
|
class Protocol1
|
7
9
|
class Time
|
10
|
+
include ActiveModel::Validations
|
8
11
|
prepend Helpers::CrcPacketsWrapper
|
9
12
|
|
10
13
|
CPACKET_TIME = [0x30]
|
11
14
|
|
12
15
|
attr_accessor :zone, :is_24h, :time
|
13
16
|
|
17
|
+
validates :zone, inclusion: {
|
18
|
+
in: 1..2,
|
19
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
20
|
+
}
|
21
|
+
|
14
22
|
# Create a Time instance.
|
15
23
|
#
|
16
24
|
# @param zone [Integer] Time zone number (1 or 2).
|
@@ -25,8 +33,11 @@ class TimexDatalinkClient
|
|
25
33
|
|
26
34
|
# Compile packets for a time.
|
27
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
28
37
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
29
38
|
def packets
|
39
|
+
validate!
|
40
|
+
|
30
41
|
[
|
31
42
|
[
|
32
43
|
CPACKET_TIME,
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol1
|
8
10
|
class TimeName
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -13,6 +16,11 @@ class TimexDatalinkClient
|
|
13
16
|
|
14
17
|
attr_accessor :zone, :name
|
15
18
|
|
19
|
+
validates :zone, inclusion: {
|
20
|
+
in: 1..2,
|
21
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
22
|
+
}
|
23
|
+
|
16
24
|
# Create a TimeName instance.
|
17
25
|
#
|
18
26
|
# @param zone [Integer] Time zone number (1 or 2).
|
@@ -25,8 +33,11 @@ class TimexDatalinkClient
|
|
25
33
|
|
26
34
|
# Compile packets for a time name.
|
27
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
28
37
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
29
38
|
def packets
|
39
|
+
validate!
|
40
|
+
|
30
41
|
[
|
31
42
|
[
|
32
43
|
CPACKET_NAME,
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol3
|
8
10
|
class Alarm
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -13,6 +16,11 @@ class TimexDatalinkClient
|
|
13
16
|
|
14
17
|
attr_accessor :number, :audible, :time, :message
|
15
18
|
|
19
|
+
validates :number, inclusion: {
|
20
|
+
in: 1..5,
|
21
|
+
message: "value %{value} is invalid! Valid number values are 1..5."
|
22
|
+
}
|
23
|
+
|
16
24
|
# Create an Alarm instance.
|
17
25
|
#
|
18
26
|
# @param number [Integer] Alarm number (from 1 to 5).
|
@@ -29,8 +37,11 @@ class TimexDatalinkClient
|
|
29
37
|
|
30
38
|
# Compile packets for an alarm.
|
31
39
|
#
|
40
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
32
41
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
33
42
|
def packets
|
43
|
+
validate!
|
44
|
+
|
34
45
|
[
|
35
46
|
[
|
36
47
|
CPACKET_ALARM,
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/length_packet_wrapper"
|
5
7
|
|
@@ -7,15 +9,22 @@ class TimexDatalinkClient
|
|
7
9
|
class Protocol3
|
8
10
|
class Eeprom
|
9
11
|
class List
|
12
|
+
include ActiveModel::Validations
|
10
13
|
include Helpers::CharEncoders
|
11
14
|
prepend Helpers::LengthPacketWrapper
|
12
15
|
|
13
16
|
attr_accessor :list_entry, :priority
|
14
17
|
|
18
|
+
validates :priority, inclusion: {
|
19
|
+
in: 1..5,
|
20
|
+
allow_nil: true,
|
21
|
+
message: "%{value} is invalid! Valid priorities are 1..5 or nil."
|
22
|
+
}
|
23
|
+
|
15
24
|
# Create a List instance.
|
16
25
|
#
|
17
26
|
# @param list_entry [String] List entry text.
|
18
|
-
# @param priority [Integer] List priority.
|
27
|
+
# @param priority [Integer, nil] List priority.
|
19
28
|
# @return [List] List instance.
|
20
29
|
def initialize(list_entry:, priority:)
|
21
30
|
@list_entry = list_entry
|
@@ -24,10 +33,13 @@ class TimexDatalinkClient
|
|
24
33
|
|
25
34
|
# Compile a packet for a list.
|
26
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
27
37
|
# @return [Array<Integer>] Array of integers that represent bytes.
|
28
38
|
def packet
|
39
|
+
validate!
|
40
|
+
|
29
41
|
[
|
30
|
-
|
42
|
+
priority_value,
|
31
43
|
list_entry_characters
|
32
44
|
].flatten
|
33
45
|
end
|
@@ -37,6 +49,10 @@ class TimexDatalinkClient
|
|
37
49
|
def list_entry_characters
|
38
50
|
eeprom_chars_for(list_entry)
|
39
51
|
end
|
52
|
+
|
53
|
+
def priority_value
|
54
|
+
priority.nil? ? 0 : priority
|
55
|
+
end
|
40
56
|
end
|
41
57
|
end
|
42
58
|
end
|
@@ -1,23 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol3
|
8
10
|
class Time
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
12
15
|
CPACKET_TIME = [0x32]
|
13
16
|
|
17
|
+
DATE_FORMAT_MAP = {
|
18
|
+
"%_m-%d-%y" => 0,
|
19
|
+
"%_d-%m-%y" => 1,
|
20
|
+
"%y-%m-%d" => 2,
|
21
|
+
"%_m.%d.%y" => 4,
|
22
|
+
"%_d.%m.%y" => 5,
|
23
|
+
"%y.%m.%d" => 6
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
validates :zone, inclusion: {
|
27
|
+
in: 1..2,
|
28
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
29
|
+
}
|
30
|
+
|
31
|
+
validates :date_format, inclusion: {
|
32
|
+
in: DATE_FORMAT_MAP.keys,
|
33
|
+
message: "%{value} is invalid! Valid date formats are #{DATE_FORMAT_MAP.keys}."
|
34
|
+
}
|
35
|
+
|
14
36
|
attr_accessor :zone, :is_24h, :date_format, :time
|
15
37
|
|
16
38
|
# Create a Time instance.
|
17
39
|
#
|
18
40
|
# @param zone [Integer] Time zone number (1 or 2).
|
19
41
|
# @param is_24h [Boolean] Toggle 24 hour time.
|
20
|
-
# @param date_format [
|
42
|
+
# @param date_format ["%_m-%d-%y", "%_d-%m-%y", "%y-%m-%d", "%_m.%d.%y", "%_d.%m.%y", "%y.%m.%d"] Date format
|
43
|
+
# (represented by Time#strftime format).
|
21
44
|
# @param time [::Time] Time to set (including time zone).
|
22
45
|
# @param name [String, nil] Name of time zone (defaults to zone from time; 3 chars max)
|
23
46
|
# @return [Time] Time instance.
|
@@ -31,8 +54,11 @@ class TimexDatalinkClient
|
|
31
54
|
|
32
55
|
# Compile packets for a time.
|
33
56
|
#
|
57
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
34
58
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
35
59
|
def packets
|
60
|
+
validate!
|
61
|
+
|
36
62
|
[
|
37
63
|
[
|
38
64
|
CPACKET_TIME,
|
@@ -46,7 +72,7 @@ class TimexDatalinkClient
|
|
46
72
|
name_characters,
|
47
73
|
wday_from_monday,
|
48
74
|
is_24h_value,
|
49
|
-
|
75
|
+
date_format_value
|
50
76
|
].flatten
|
51
77
|
]
|
52
78
|
end
|
@@ -72,6 +98,10 @@ class TimexDatalinkClient
|
|
72
98
|
def is_24h_value
|
73
99
|
is_24h ? 2 : 1
|
74
100
|
end
|
101
|
+
|
102
|
+
def date_format_value
|
103
|
+
DATE_FORMAT_MAP.fetch(date_format)
|
104
|
+
end
|
75
105
|
end
|
76
106
|
end
|
77
107
|
end
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol4
|
8
10
|
class Alarm
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -13,6 +16,11 @@ class TimexDatalinkClient
|
|
13
16
|
|
14
17
|
attr_accessor :number, :audible, :time, :message
|
15
18
|
|
19
|
+
validates :number, inclusion: {
|
20
|
+
in: 1..5,
|
21
|
+
message: "value %{value} is invalid! Valid number values are 1..5."
|
22
|
+
}
|
23
|
+
|
16
24
|
# Create an Alarm instance.
|
17
25
|
#
|
18
26
|
# @param number [Integer] Alarm number (from 1 to 5).
|
@@ -29,8 +37,11 @@ class TimexDatalinkClient
|
|
29
37
|
|
30
38
|
# Compile packets for an alarm.
|
31
39
|
#
|
40
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
32
41
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
33
42
|
def packets
|
43
|
+
validate!
|
44
|
+
|
34
45
|
[
|
35
46
|
[
|
36
47
|
CPACKET_ALARM,
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/length_packet_wrapper"
|
5
7
|
|
@@ -7,11 +9,18 @@ class TimexDatalinkClient
|
|
7
9
|
class Protocol4
|
8
10
|
class Eeprom
|
9
11
|
class List
|
12
|
+
include ActiveModel::Validations
|
10
13
|
include Helpers::CharEncoders
|
11
14
|
prepend Helpers::LengthPacketWrapper
|
12
15
|
|
13
16
|
attr_accessor :list_entry, :priority
|
14
17
|
|
18
|
+
validates :priority, inclusion: {
|
19
|
+
in: 1..5,
|
20
|
+
allow_nil: true,
|
21
|
+
message: "%{value} is invalid! Valid priorities are 1..5 or nil."
|
22
|
+
}
|
23
|
+
|
15
24
|
# Create a List instance.
|
16
25
|
#
|
17
26
|
# @param list_entry [String] List entry text.
|
@@ -24,10 +33,13 @@ class TimexDatalinkClient
|
|
24
33
|
|
25
34
|
# Compile a packet for a list.
|
26
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
27
37
|
# @return [Array<Integer>] Array of integers that represent bytes.
|
28
38
|
def packet
|
39
|
+
validate!
|
40
|
+
|
29
41
|
[
|
30
|
-
|
42
|
+
priority_value,
|
31
43
|
list_entry_characters
|
32
44
|
].flatten
|
33
45
|
end
|
@@ -37,6 +49,10 @@ class TimexDatalinkClient
|
|
37
49
|
def list_entry_characters
|
38
50
|
eeprom_chars_for(list_entry)
|
39
51
|
end
|
52
|
+
|
53
|
+
def priority_value
|
54
|
+
priority.nil? ? 0 : priority
|
55
|
+
end
|
40
56
|
end
|
41
57
|
end
|
42
58
|
end
|
@@ -1,23 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol4
|
8
10
|
class Time
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
12
15
|
CPACKET_TIME = [0x32]
|
13
16
|
|
17
|
+
DATE_FORMAT_MAP = {
|
18
|
+
"%_m-%d-%y" => 0,
|
19
|
+
"%_d-%m-%y" => 1,
|
20
|
+
"%y-%m-%d" => 2,
|
21
|
+
"%_m.%d.%y" => 4,
|
22
|
+
"%_d.%m.%y" => 5,
|
23
|
+
"%y.%m.%d" => 6
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
validates :zone, inclusion: {
|
27
|
+
in: 1..2,
|
28
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
29
|
+
}
|
30
|
+
|
31
|
+
validates :date_format, inclusion: {
|
32
|
+
in: DATE_FORMAT_MAP.keys,
|
33
|
+
message: "%{value} is invalid! Valid date formats are #{DATE_FORMAT_MAP.keys}."
|
34
|
+
}
|
35
|
+
|
14
36
|
attr_accessor :zone, :is_24h, :date_format, :time
|
15
37
|
|
16
38
|
# Create a Time instance.
|
17
39
|
#
|
18
40
|
# @param zone [Integer] Time zone number (1 or 2).
|
19
41
|
# @param is_24h [Boolean] Toggle 24 hour time.
|
20
|
-
# @param date_format [
|
42
|
+
# @param date_format ["%_m-%d-%y", "%_d-%m-%y", "%y-%m-%d", "%_m.%d.%y", "%_d.%m.%y", "%y.%m.%d"] Date format
|
43
|
+
# (represented by Time#strftime format).
|
21
44
|
# @param time [::Time] Time to set (including time zone).
|
22
45
|
# @param name [String, nil] Name of time zone (defaults to zone from time; 3 chars max)
|
23
46
|
# @return [Time] Time instance.
|
@@ -31,8 +54,11 @@ class TimexDatalinkClient
|
|
31
54
|
|
32
55
|
# Compile packets for a time.
|
33
56
|
#
|
57
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
34
58
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
35
59
|
def packets
|
60
|
+
validate!
|
61
|
+
|
36
62
|
[
|
37
63
|
[
|
38
64
|
CPACKET_TIME,
|
@@ -46,7 +72,7 @@ class TimexDatalinkClient
|
|
46
72
|
name_characters,
|
47
73
|
wday_from_monday,
|
48
74
|
is_24h_value,
|
49
|
-
|
75
|
+
date_format_value
|
50
76
|
].flatten
|
51
77
|
]
|
52
78
|
end
|
@@ -72,6 +98,10 @@ class TimexDatalinkClient
|
|
72
98
|
def is_24h_value
|
73
99
|
is_24h ? 2 : 1
|
74
100
|
end
|
101
|
+
|
102
|
+
def date_format_value
|
103
|
+
DATE_FORMAT_MAP.fetch(date_format)
|
104
|
+
end
|
75
105
|
end
|
76
106
|
end
|
77
107
|
end
|
@@ -1,10 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "timex_datalink_client/helpers/lsb_msb_formatter"
|
4
|
+
|
3
5
|
class TimexDatalinkClient
|
4
6
|
class Protocol7
|
5
7
|
class Eeprom
|
6
8
|
class Calendar
|
7
9
|
class Event
|
10
|
+
include Helpers::LsbMsbFormatter
|
11
|
+
|
8
12
|
FIVE_MINUTES_SECONDS = 300
|
9
13
|
|
10
14
|
attr_accessor :time, :phrase
|
@@ -24,7 +28,7 @@ class TimexDatalinkClient
|
|
24
28
|
seconds = (time - device_time_midnight).to_i
|
25
29
|
five_minutes = seconds / FIVE_MINUTES_SECONDS
|
26
30
|
|
27
|
-
five_minutes
|
31
|
+
lsb_msb_format_for(five_minutes)
|
28
32
|
end
|
29
33
|
end
|
30
34
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "timex_datalink_client/helpers/four_byte_formatter"
|
4
|
+
require "timex_datalink_client/helpers/lsb_msb_formatter"
|
4
5
|
|
5
6
|
class TimexDatalinkClient
|
6
7
|
class Protocol7
|
7
8
|
class Eeprom
|
8
9
|
class Calendar
|
9
10
|
include Helpers::FourByteFormatter
|
11
|
+
include Helpers::LsbMsbFormatter
|
10
12
|
|
11
13
|
DAY_START_TIME = Time.new(2000)
|
12
14
|
DAY_SECONDS = 86400
|
@@ -48,7 +50,7 @@ class TimexDatalinkClient
|
|
48
50
|
private
|
49
51
|
|
50
52
|
def events_count
|
51
|
-
events.count
|
53
|
+
lsb_msb_format_for(events.count)
|
52
54
|
end
|
53
55
|
|
54
56
|
def event_packets
|
@@ -57,7 +59,7 @@ class TimexDatalinkClient
|
|
57
59
|
|
58
60
|
[].tap do |event_packets|
|
59
61
|
events.each_with_index do |event, event_index|
|
60
|
-
event_bytes_formatted = event_bytes
|
62
|
+
event_bytes_formatted = lsb_msb_format_for(event_bytes)
|
61
63
|
event_time_formatted = event.time_formatted(time)
|
62
64
|
|
63
65
|
event_packets << [event_time_formatted, event_bytes_formatted]
|
@@ -77,13 +79,13 @@ class TimexDatalinkClient
|
|
77
79
|
since_start_time_seconds = time - DAY_START_TIME
|
78
80
|
since_start_time_days = since_start_time_seconds.to_i / DAY_SECONDS
|
79
81
|
|
80
|
-
since_start_time_days
|
82
|
+
lsb_msb_format_for(since_start_time_days)
|
81
83
|
end
|
82
84
|
|
83
85
|
def time_formatted
|
84
86
|
five_mintes = (time.hour * 60 + time.min) / 5
|
85
87
|
|
86
|
-
five_mintes
|
88
|
+
lsb_msb_format_for(five_mintes)
|
87
89
|
end
|
88
90
|
end
|
89
91
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "timex_datalink_client/helpers/four_byte_formatter"
|
4
|
+
require "timex_datalink_client/helpers/lsb_msb_formatter"
|
4
5
|
|
5
6
|
class TimexDatalinkClient
|
6
7
|
class Protocol7
|
7
8
|
class Eeprom
|
8
9
|
class Games
|
9
10
|
include Helpers::FourByteFormatter
|
11
|
+
include Helpers::LsbMsbFormatter
|
10
12
|
|
11
13
|
COUNTDOWN_TIMER_SECONDS_DEFAULT = 60
|
12
14
|
|
@@ -85,11 +87,11 @@ class TimexDatalinkClient
|
|
85
87
|
game ? 1 << game_index : 0
|
86
88
|
end
|
87
89
|
|
88
|
-
bitmask
|
90
|
+
lsb_msb_format_for(bitmask)
|
89
91
|
end
|
90
92
|
|
91
93
|
def countdown_timer_time
|
92
|
-
(countdown_timer_seconds * 10)
|
94
|
+
lsb_msb_format_for(countdown_timer_seconds * 10)
|
93
95
|
end
|
94
96
|
|
95
97
|
def sounds
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "timex_datalink_client/helpers/four_byte_formatter"
|
4
|
+
require "timex_datalink_client/helpers/lsb_msb_formatter"
|
4
5
|
|
5
6
|
class TimexDatalinkClient
|
6
7
|
class Protocol7
|
7
8
|
class Eeprom
|
8
9
|
class Speech
|
9
10
|
include Helpers::FourByteFormatter
|
11
|
+
include Helpers::LsbMsbFormatter
|
10
12
|
|
11
13
|
NICKNAME_LENGTH_WITHOUT_DEVICE = 10
|
12
14
|
NICKNAME_LENGTH_WITH_DEVICE = 14
|
@@ -123,7 +125,7 @@ class TimexDatalinkClient
|
|
123
125
|
def header
|
124
126
|
all_values = [header_value_1, header_value_2, header_value_3] + header_values_4 + header_values_5
|
125
127
|
|
126
|
-
all_values.flat_map { |value| value
|
128
|
+
all_values.flat_map { |value| lsb_msb_format_for(value) }
|
127
129
|
end
|
128
130
|
|
129
131
|
def header_value_1
|
@@ -1,18 +1,63 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol9
|
8
10
|
class Alarm
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
12
15
|
CPACKET_ALARM = [0x50]
|
13
16
|
|
17
|
+
VALID_DAYS_IN_MONTH = {
|
18
|
+
1 => 1..31,
|
19
|
+
2 => 1..29,
|
20
|
+
3 => 1..31,
|
21
|
+
4 => 1..30,
|
22
|
+
5 => 1..31,
|
23
|
+
6 => 1..30,
|
24
|
+
7 => 1..31,
|
25
|
+
8 => 1..31,
|
26
|
+
9 => 1..30,
|
27
|
+
10 => 1..31,
|
28
|
+
11 => 1..30,
|
29
|
+
12 => 1..31
|
30
|
+
}.freeze
|
31
|
+
|
14
32
|
attr_accessor :number, :audible, :time, :message, :month, :day
|
15
33
|
|
34
|
+
validates :number, inclusion: {
|
35
|
+
in: 1..10,
|
36
|
+
message: "value %{value} is invalid! Valid number values are 1..10."
|
37
|
+
}
|
38
|
+
|
39
|
+
validates :month, inclusion: {
|
40
|
+
in: 1..12,
|
41
|
+
allow_nil: true,
|
42
|
+
message: "%{value} is invalid! Valid months are 1..12 and nil."
|
43
|
+
}
|
44
|
+
|
45
|
+
validates :day, inclusion: {
|
46
|
+
if: ->(alarm) { alarm.month.nil? },
|
47
|
+
in: 1..31,
|
48
|
+
allow_nil: true,
|
49
|
+
message: "%{value} is invalid! Valid days are 1..31 and nil."
|
50
|
+
}
|
51
|
+
|
52
|
+
validates :day, inclusion: {
|
53
|
+
if: ->(alarm) { alarm.day && alarm.month },
|
54
|
+
in: ->(alarm) { VALID_DAYS_IN_MONTH[alarm.month] },
|
55
|
+
message: ->(alarm, _attributes) do
|
56
|
+
"#{alarm.day} is invalid for month #{alarm.month}! " \
|
57
|
+
"Valid days are #{VALID_DAYS_IN_MONTH[alarm.month]} and nil when month is #{alarm.month}."
|
58
|
+
end
|
59
|
+
}
|
60
|
+
|
16
61
|
# Create an Alarm instance.
|
17
62
|
#
|
18
63
|
# @param number [Integer] Alarm number (from 1 to 10).
|
@@ -33,8 +78,11 @@ class TimexDatalinkClient
|
|
33
78
|
|
34
79
|
# Compile packets for an alarm.
|
35
80
|
#
|
81
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
36
82
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
37
83
|
def packets
|
84
|
+
validate!
|
85
|
+
|
38
86
|
[
|
39
87
|
[
|
40
88
|
CPACKET_ALARM,
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
|
5
7
|
class TimexDatalinkClient
|
6
8
|
class Protocol9
|
7
9
|
class Eeprom
|
8
10
|
class Chrono
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
|
11
14
|
CHRONO_LABEL_LENGTH = 8
|
@@ -13,6 +16,11 @@ class TimexDatalinkClient
|
|
13
16
|
|
14
17
|
attr_accessor :label, :laps
|
15
18
|
|
19
|
+
validates :laps, inclusion: {
|
20
|
+
in: 2..50,
|
21
|
+
message: "value %{value} is invalid! Valid laps values are 2..50."
|
22
|
+
}
|
23
|
+
|
16
24
|
# Create a Chrono instance.
|
17
25
|
#
|
18
26
|
# @param label [String] Label for chrono.
|
@@ -25,8 +33,11 @@ class TimexDatalinkClient
|
|
25
33
|
|
26
34
|
# Compile a packet for a chrono.
|
27
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
28
37
|
# @return [Array<Integer>] Array of integers that represent bytes.
|
29
38
|
def packet
|
39
|
+
validate!
|
40
|
+
|
30
41
|
label_characters
|
31
42
|
end
|
32
43
|
|
@@ -1,16 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
4
6
|
|
5
7
|
class TimexDatalinkClient
|
6
8
|
class Protocol9
|
7
9
|
class Time
|
10
|
+
include ActiveModel::Validations
|
8
11
|
prepend Helpers::CrcPacketsWrapper
|
9
12
|
|
10
13
|
CPACKET_TIME = [0x30]
|
11
14
|
|
12
15
|
attr_accessor :zone, :is_24h, :time
|
13
16
|
|
17
|
+
validates :zone, inclusion: {
|
18
|
+
in: 1..2,
|
19
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
20
|
+
}
|
21
|
+
|
14
22
|
# Create a Time instance.
|
15
23
|
#
|
16
24
|
# @param zone [Integer] Time zone number (1 or 2).
|
@@ -25,8 +33,11 @@ class TimexDatalinkClient
|
|
25
33
|
|
26
34
|
# Compile packets for a time.
|
27
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
28
37
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
29
38
|
def packets
|
39
|
+
validate!
|
40
|
+
|
30
41
|
[
|
31
42
|
[
|
32
43
|
CPACKET_TIME,
|
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/char_encoders"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol9
|
8
10
|
class TimeName
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -13,6 +16,11 @@ class TimexDatalinkClient
|
|
13
16
|
|
14
17
|
attr_accessor :zone, :name
|
15
18
|
|
19
|
+
validates :zone, inclusion: {
|
20
|
+
in: 1..2,
|
21
|
+
message: "%{value} is invalid! Valid zones are 1..2."
|
22
|
+
}
|
23
|
+
|
16
24
|
# Create a TimeName instance.
|
17
25
|
#
|
18
26
|
# @param zone [Integer] Time zone number (1 or 2).
|
@@ -25,8 +33,11 @@ class TimexDatalinkClient
|
|
25
33
|
|
26
34
|
# Compile packets for a time name.
|
27
35
|
#
|
36
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
28
37
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
29
38
|
def packets
|
39
|
+
validate!
|
40
|
+
|
30
41
|
[
|
31
42
|
[
|
32
43
|
CPACKET_NAME,
|
@@ -11,6 +11,12 @@ class TimexDatalinkClient
|
|
11
11
|
|
12
12
|
CPACKET_TIMER = [0x43]
|
13
13
|
|
14
|
+
ACTION_AT_END_MAP = {
|
15
|
+
stop_timer: 0,
|
16
|
+
repeat_timer: 1,
|
17
|
+
start_chrono: 2
|
18
|
+
}.freeze
|
19
|
+
|
14
20
|
attr_accessor :number, :label, :time, :action_at_end
|
15
21
|
|
16
22
|
# Create a Timer instance.
|
@@ -18,7 +24,7 @@ class TimexDatalinkClient
|
|
18
24
|
# @param number [Integer] Entry number for timer.
|
19
25
|
# @param label [String] Label for timer.
|
20
26
|
# @param time [Time] Time of timer.
|
21
|
-
# @param action_at_end [
|
27
|
+
# @param action_at_end [:stop_timer, :repeat_timer, :start_chrono] Action at end of timer.
|
22
28
|
# @return [Timer] Timer instance.
|
23
29
|
def initialize(number:, label:, time:, action_at_end:)
|
24
30
|
@number = number
|
@@ -38,7 +44,7 @@ class TimexDatalinkClient
|
|
38
44
|
time.hour,
|
39
45
|
time.min,
|
40
46
|
time.sec,
|
41
|
-
|
47
|
+
action_at_end_value,
|
42
48
|
label_characters
|
43
49
|
].flatten
|
44
50
|
]
|
@@ -46,6 +52,10 @@ class TimexDatalinkClient
|
|
46
52
|
|
47
53
|
private
|
48
54
|
|
55
|
+
def action_at_end_value
|
56
|
+
ACTION_AT_END_MAP.fetch(action_at_end)
|
57
|
+
end
|
58
|
+
|
49
59
|
def label_characters
|
50
60
|
chars_for(label, length: 8, pad: true)
|
51
61
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timex_datalink_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maxwell Pray
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activemodel
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.4
|
19
|
+
version: 7.0.4
|
20
20
|
type: :runtime
|
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: 0.4
|
26
|
+
version: 7.0.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: crc
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.4.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.4.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: mdb
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.5.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubyserial
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.6.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.6.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,6 +120,7 @@ files:
|
|
106
120
|
- lib/timex_datalink_client/helpers/crc_packets_wrapper.rb
|
107
121
|
- lib/timex_datalink_client/helpers/four_byte_formatter.rb
|
108
122
|
- lib/timex_datalink_client/helpers/length_packet_wrapper.rb
|
123
|
+
- lib/timex_datalink_client/helpers/lsb_msb_formatter.rb
|
109
124
|
- lib/timex_datalink_client/notebook_adapter.rb
|
110
125
|
- lib/timex_datalink_client/protocol_1/alarm.rb
|
111
126
|
- lib/timex_datalink_client/protocol_1/eeprom.rb
|
@@ -167,7 +182,7 @@ files:
|
|
167
182
|
- lib/timex_datalink_client/protocol_9/time_name.rb
|
168
183
|
- lib/timex_datalink_client/protocol_9/timer.rb
|
169
184
|
- lib/timex_datalink_client/version.rb
|
170
|
-
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.
|
185
|
+
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.10.0
|
171
186
|
licenses:
|
172
187
|
- MIT
|
173
188
|
metadata: {}
|