timex_datalink_client 0.9.0 → 0.11.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/char_encoders.rb +1 -1
- 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/eeprom.rb +27 -6
- 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/eeprom.rb +27 -6
- data/lib/timex_datalink_client/protocol_3/time.rb +16 -0
- 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/eeprom.rb +27 -6
- data/lib/timex_datalink_client/protocol_4/time.rb +16 -0
- 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 +7 -2
- data/lib/timex_datalink_client/protocol_7/eeprom.rb +0 -3
- 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/version.rb +1 -1
- data/lib/timex_datalink_client.rb +5 -5
- metadata +64 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10adb86fd981a90fa2e764e3dd63bbaf0b1ffa1c37b5210d510ea6aa29b76edb
|
4
|
+
data.tar.gz: 2d2b67b5b10a8a6bd7bbefd4423e9e7b661a4824649e241df0e4e3ca45e17290
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a2fca239d0220cc056a7577ec7b17d1e4e9cf9f2c706af832b38ec0d0eb5522ae4df970369fa7be882eea686fa0da0bb0f063d86f8ce3736ba24c9c0f1acca2
|
7
|
+
data.tar.gz: 4c8296686c59d03b8da2970cda23c8c525f2376a1d8bca2094c3b44955c37d59625d9cf8e9a8c9545a600421514e584a32e53d52fa537f40af0a035041f140b6
|
@@ -20,7 +20,7 @@ class TimexDatalinkClient
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def eeprom_chars_for(string_chars, length: 31)
|
23
|
-
chars = chars_for(string_chars, char_map: EEPROM_CHARS, length:
|
23
|
+
chars = chars_for(string_chars, char_map: EEPROM_CHARS, length:).append(EEPROM_TERMINATOR)
|
24
24
|
|
25
25
|
packed_int = chars.each_with_index.sum do |char, index|
|
26
26
|
char << (6 * index)
|
@@ -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,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/cpacket_paginator"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol1
|
8
10
|
class Eeprom
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CpacketPaginator
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -16,8 +19,16 @@ class TimexDatalinkClient
|
|
16
19
|
CPACKET_DATA_LENGTH = 27
|
17
20
|
START_INDEX = 14
|
18
21
|
APPOINTMENT_NO_NOTIFICATION = 0xff
|
22
|
+
APPOINTMENT_NOTIFICATION_VALID_MINUTES = (0..30).step(5)
|
23
|
+
|
24
|
+
attr_accessor :appointments, :anniversaries, :phone_numbers, :lists, :appointment_notification_minutes
|
19
25
|
|
20
|
-
|
26
|
+
validates :appointment_notification_minutes, inclusion: {
|
27
|
+
in: APPOINTMENT_NOTIFICATION_VALID_MINUTES,
|
28
|
+
allow_nil: true,
|
29
|
+
message: "value %{value} is invalid! Valid appointment notification minutes values are" \
|
30
|
+
" #{APPOINTMENT_NOTIFICATION_VALID_MINUTES.to_a} or nil."
|
31
|
+
}
|
21
32
|
|
22
33
|
# Create an Eeprom instance.
|
23
34
|
#
|
@@ -25,21 +36,25 @@ class TimexDatalinkClient
|
|
25
36
|
# @param anniversaries [Array<Anniversary>] Anniversaries to be added to EEPROM data.
|
26
37
|
# @param phone_numbers [Array<PhoneNumber>] Phone numbers to be added to EEPROM data.
|
27
38
|
# @param lists [Array<List>] Lists to be added to EEPROM data.
|
28
|
-
# @param
|
29
|
-
# notification)
|
39
|
+
# @param appointment_notification_minutes [Integer, nil] Appointment notification in minutes.
|
30
40
|
# @return [Eeprom] Eeprom instance.
|
31
|
-
def initialize(
|
41
|
+
def initialize(
|
42
|
+
appointments: [], anniversaries: [], phone_numbers: [], lists: [], appointment_notification_minutes: nil
|
43
|
+
)
|
32
44
|
@appointments = appointments
|
33
45
|
@anniversaries = anniversaries
|
34
46
|
@phone_numbers = phone_numbers
|
35
47
|
@lists = lists
|
36
|
-
@
|
48
|
+
@appointment_notification_minutes = appointment_notification_minutes
|
37
49
|
end
|
38
50
|
|
39
51
|
# Compile packets for EEPROM data.
|
40
52
|
#
|
53
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
41
54
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
42
55
|
def packets
|
56
|
+
validate!
|
57
|
+
|
43
58
|
[header] + payloads + [CPACKET_END]
|
44
59
|
end
|
45
60
|
|
@@ -57,7 +72,7 @@ class TimexDatalinkClient
|
|
57
72
|
items_indexes,
|
58
73
|
items_lengths,
|
59
74
|
earliest_appointment_year,
|
60
|
-
|
75
|
+
appointment_notification_minutes_value,
|
61
76
|
all_packets
|
62
77
|
].flatten
|
63
78
|
end
|
@@ -95,6 +110,12 @@ class TimexDatalinkClient
|
|
95
110
|
|
96
111
|
earliest_appointment.time.year % 100
|
97
112
|
end
|
113
|
+
|
114
|
+
def appointment_notification_minutes_value
|
115
|
+
return APPOINTMENT_NO_NOTIFICATION unless appointment_notification_minutes
|
116
|
+
|
117
|
+
appointment_notification_minutes / 5
|
118
|
+
end
|
98
119
|
end
|
99
120
|
end
|
100
121
|
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,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/cpacket_paginator"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol3
|
8
10
|
class Eeprom
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CpacketPaginator
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -17,8 +20,16 @@ class TimexDatalinkClient
|
|
17
20
|
CPACKET_DATA_LENGTH = 32
|
18
21
|
START_ADDRESS = 0x0236
|
19
22
|
APPOINTMENT_NO_NOTIFICATION = 0xff
|
23
|
+
APPOINTMENT_NOTIFICATION_VALID_MINUTES = (0..30).step(5)
|
24
|
+
|
25
|
+
attr_accessor :appointments, :anniversaries, :phone_numbers, :lists, :appointment_notification_minutes
|
20
26
|
|
21
|
-
|
27
|
+
validates :appointment_notification_minutes, inclusion: {
|
28
|
+
in: APPOINTMENT_NOTIFICATION_VALID_MINUTES,
|
29
|
+
allow_nil: true,
|
30
|
+
message: "value %{value} is invalid! Valid appointment notification minutes values are" \
|
31
|
+
" #{APPOINTMENT_NOTIFICATION_VALID_MINUTES.to_a} or nil."
|
32
|
+
}
|
22
33
|
|
23
34
|
# Create an Eeprom instance.
|
24
35
|
#
|
@@ -26,21 +37,25 @@ class TimexDatalinkClient
|
|
26
37
|
# @param anniversaries [Array<Anniversary>] Anniversaries to be added to EEPROM data.
|
27
38
|
# @param phone_numbers [Array<PhoneNumber>] Phone numbers to be added to EEPROM data.
|
28
39
|
# @param lists [Array<List>] Lists to be added to EEPROM data.
|
29
|
-
# @param
|
30
|
-
# notification)
|
40
|
+
# @param appointment_notification_minutes [Integer, nil] Appointment notification in minutes.
|
31
41
|
# @return [Eeprom] Eeprom instance.
|
32
|
-
def initialize(
|
42
|
+
def initialize(
|
43
|
+
appointments: [], anniversaries: [], phone_numbers: [], lists: [], appointment_notification_minutes: nil
|
44
|
+
)
|
33
45
|
@appointments = appointments
|
34
46
|
@anniversaries = anniversaries
|
35
47
|
@phone_numbers = phone_numbers
|
36
48
|
@lists = lists
|
37
|
-
@
|
49
|
+
@appointment_notification_minutes = appointment_notification_minutes
|
38
50
|
end
|
39
51
|
|
40
52
|
# Compile packets for EEPROM data.
|
41
53
|
#
|
54
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
42
55
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
43
56
|
def packets
|
57
|
+
validate!
|
58
|
+
|
44
59
|
[CPACKET_CLEAR, header] + payloads + [CPACKET_END]
|
45
60
|
end
|
46
61
|
|
@@ -53,7 +68,7 @@ class TimexDatalinkClient
|
|
53
68
|
items_addresses,
|
54
69
|
items_lengths,
|
55
70
|
earliest_appointment_year,
|
56
|
-
|
71
|
+
appointment_notification_minutes_value
|
57
72
|
].flatten
|
58
73
|
end
|
59
74
|
|
@@ -90,6 +105,12 @@ class TimexDatalinkClient
|
|
90
105
|
|
91
106
|
earliest_appointment.time.year % 100
|
92
107
|
end
|
108
|
+
|
109
|
+
def appointment_notification_minutes_value
|
110
|
+
return APPOINTMENT_NO_NOTIFICATION unless appointment_notification_minutes
|
111
|
+
|
112
|
+
appointment_notification_minutes / 5
|
113
|
+
end
|
93
114
|
end
|
94
115
|
end
|
95
116
|
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 Protocol3
|
8
10
|
class Time
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -20,6 +23,16 @@ class TimexDatalinkClient
|
|
20
23
|
"%y.%m.%d" => 6
|
21
24
|
}.freeze
|
22
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
|
+
|
23
36
|
attr_accessor :zone, :is_24h, :date_format, :time
|
24
37
|
|
25
38
|
# Create a Time instance.
|
@@ -41,8 +54,11 @@ class TimexDatalinkClient
|
|
41
54
|
|
42
55
|
# Compile packets for a time.
|
43
56
|
#
|
57
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
44
58
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
45
59
|
def packets
|
60
|
+
validate!
|
61
|
+
|
46
62
|
[
|
47
63
|
[
|
48
64
|
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 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,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_model"
|
4
|
+
|
3
5
|
require "timex_datalink_client/helpers/cpacket_paginator"
|
4
6
|
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
7
|
|
6
8
|
class TimexDatalinkClient
|
7
9
|
class Protocol4
|
8
10
|
class Eeprom
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CpacketPaginator
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -17,8 +20,16 @@ class TimexDatalinkClient
|
|
17
20
|
CPACKET_DATA_LENGTH = 32
|
18
21
|
START_ADDRESS = 0x0236
|
19
22
|
APPOINTMENT_NO_NOTIFICATION = 0xff
|
23
|
+
APPOINTMENT_NOTIFICATION_VALID_MINUTES = (0..30).step(5)
|
24
|
+
|
25
|
+
attr_accessor :appointments, :anniversaries, :phone_numbers, :lists, :appointment_notification_minutes
|
20
26
|
|
21
|
-
|
27
|
+
validates :appointment_notification_minutes, inclusion: {
|
28
|
+
in: APPOINTMENT_NOTIFICATION_VALID_MINUTES,
|
29
|
+
allow_nil: true,
|
30
|
+
message: "value %{value} is invalid! Valid appointment notification minutes values are" \
|
31
|
+
" #{APPOINTMENT_NOTIFICATION_VALID_MINUTES.to_a} or nil."
|
32
|
+
}
|
22
33
|
|
23
34
|
# Create an Eeprom instance.
|
24
35
|
#
|
@@ -26,21 +37,25 @@ class TimexDatalinkClient
|
|
26
37
|
# @param anniversaries [Array<Anniversary>] Anniversaries to be added to EEPROM data.
|
27
38
|
# @param phone_numbers [Array<PhoneNumber>] Phone numbers to be added to EEPROM data.
|
28
39
|
# @param lists [Array<List>] Lists to be added to EEPROM data.
|
29
|
-
# @param
|
30
|
-
# notification)
|
40
|
+
# @param appointment_notification_minutes [Integer, nil] Appointment notification in minutes.
|
31
41
|
# @return [Eeprom] Eeprom instance.
|
32
|
-
def initialize(
|
42
|
+
def initialize(
|
43
|
+
appointments: [], anniversaries: [], phone_numbers: [], lists: [], appointment_notification_minutes: nil
|
44
|
+
)
|
33
45
|
@appointments = appointments
|
34
46
|
@anniversaries = anniversaries
|
35
47
|
@phone_numbers = phone_numbers
|
36
48
|
@lists = lists
|
37
|
-
@
|
49
|
+
@appointment_notification_minutes = appointment_notification_minutes
|
38
50
|
end
|
39
51
|
|
40
52
|
# Compile packets for EEPROM data.
|
41
53
|
#
|
54
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
42
55
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
43
56
|
def packets
|
57
|
+
validate!
|
58
|
+
|
44
59
|
[CPACKET_CLEAR, header] + payloads + [CPACKET_END]
|
45
60
|
end
|
46
61
|
|
@@ -53,7 +68,7 @@ class TimexDatalinkClient
|
|
53
68
|
items_addresses,
|
54
69
|
items_lengths,
|
55
70
|
earliest_appointment_year,
|
56
|
-
|
71
|
+
appointment_notification_minutes_value
|
57
72
|
].flatten
|
58
73
|
end
|
59
74
|
|
@@ -90,6 +105,12 @@ class TimexDatalinkClient
|
|
90
105
|
|
91
106
|
earliest_appointment.time.year % 100
|
92
107
|
end
|
108
|
+
|
109
|
+
def appointment_notification_minutes_value
|
110
|
+
return APPOINTMENT_NO_NOTIFICATION unless appointment_notification_minutes
|
111
|
+
|
112
|
+
appointment_notification_minutes / 5
|
113
|
+
end
|
93
114
|
end
|
94
115
|
end
|
95
116
|
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 Time
|
11
|
+
include ActiveModel::Validations
|
9
12
|
include Helpers::CharEncoders
|
10
13
|
prepend Helpers::CrcPacketsWrapper
|
11
14
|
|
@@ -20,6 +23,16 @@ class TimexDatalinkClient
|
|
20
23
|
"%y.%m.%d" => 6
|
21
24
|
}.freeze
|
22
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
|
+
|
23
36
|
attr_accessor :zone, :is_24h, :date_format, :time
|
24
37
|
|
25
38
|
# Create a Time instance.
|
@@ -41,8 +54,11 @@ class TimexDatalinkClient
|
|
41
54
|
|
42
55
|
# Compile packets for a time.
|
43
56
|
#
|
57
|
+
# @raise [ActiveModel::ValidationError] One or more model values are invalid.
|
44
58
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
45
59
|
def packets
|
60
|
+
validate!
|
61
|
+
|
46
62
|
[
|
47
63
|
[
|
48
64
|
CPACKET_TIME,
|
@@ -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
|
@@ -153,7 +155,10 @@ class TimexDatalinkClient
|
|
153
155
|
value_4_length = device_nickname.any? ? NICKNAME_LENGTH_WITH_DEVICE : NICKNAME_LENGTH_WITHOUT_DEVICE
|
154
156
|
|
155
157
|
value_4_length.times.flat_map do |value_4_index|
|
156
|
-
device_value = HEADER_VALUE_4_DEVICE_INDEXES[value_4_index].sum
|
158
|
+
device_value = HEADER_VALUE_4_DEVICE_INDEXES[value_4_index].sum do |device_index|
|
159
|
+
packet_lengths[device_index]
|
160
|
+
end
|
161
|
+
|
157
162
|
device_value *= HEADER_VALUE_4_DEVICE_MULTIPLIERS[value_4_index]
|
158
163
|
|
159
164
|
user_value = HEADER_VALUE_4_USER_INDEXES[value_4_index].sum { |device_index| packet_lengths[device_index] }
|
@@ -9,9 +9,6 @@ class TimexDatalinkClient
|
|
9
9
|
include Helpers::CpacketPaginator
|
10
10
|
prepend Helpers::CrcPacketsWrapper
|
11
11
|
|
12
|
-
# FIXME use arrays for array models
|
13
|
-
# FIXME: check Array<Integer> yardoc around places
|
14
|
-
|
15
12
|
CPACKET_SECT = [0x90, 0x05]
|
16
13
|
CPACKET_DATA = [0x91, 0x05]
|
17
14
|
CPACKET_END = [0x92, 0x05]
|
@@ -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,
|
@@ -104,17 +104,17 @@ class TimexDatalinkClient
|
|
104
104
|
#
|
105
105
|
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
106
106
|
def packets
|
107
|
-
models.
|
107
|
+
models.flat_map(&:packets)
|
108
108
|
end
|
109
109
|
|
110
110
|
private
|
111
111
|
|
112
112
|
def notebook_adapter
|
113
113
|
@notebook_adapter ||= NotebookAdapter.new(
|
114
|
-
serial_device
|
115
|
-
byte_sleep
|
116
|
-
packet_sleep
|
117
|
-
verbose:
|
114
|
+
serial_device:,
|
115
|
+
byte_sleep:,
|
116
|
+
packet_sleep:,
|
117
|
+
verbose:
|
118
118
|
)
|
119
119
|
end
|
120
120
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
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.11.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-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.0.4
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 7.0.4
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: crc
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +38,20 @@ dependencies:
|
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: 0.4.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mdb
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.5.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.5.0
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rubyserial
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -39,19 +67,19 @@ dependencies:
|
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: 0.6.0
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
70
|
+
name: mdl
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
48
|
-
type: :
|
75
|
+
version: 0.12.0
|
76
|
+
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
82
|
+
version: 0.12.0
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rspec
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +94,34 @@ dependencies:
|
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: 3.11.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.41.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.41.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-github
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.20.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.20.0
|
69
125
|
- !ruby/object:Gem::Dependency
|
70
126
|
name: tzinfo
|
71
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,6 +162,7 @@ files:
|
|
106
162
|
- lib/timex_datalink_client/helpers/crc_packets_wrapper.rb
|
107
163
|
- lib/timex_datalink_client/helpers/four_byte_formatter.rb
|
108
164
|
- lib/timex_datalink_client/helpers/length_packet_wrapper.rb
|
165
|
+
- lib/timex_datalink_client/helpers/lsb_msb_formatter.rb
|
109
166
|
- lib/timex_datalink_client/notebook_adapter.rb
|
110
167
|
- lib/timex_datalink_client/protocol_1/alarm.rb
|
111
168
|
- lib/timex_datalink_client/protocol_1/eeprom.rb
|
@@ -167,7 +224,7 @@ files:
|
|
167
224
|
- lib/timex_datalink_client/protocol_9/time_name.rb
|
168
225
|
- lib/timex_datalink_client/protocol_9/timer.rb
|
169
226
|
- lib/timex_datalink_client/version.rb
|
170
|
-
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.
|
227
|
+
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.11.0
|
171
228
|
licenses:
|
172
229
|
- MIT
|
173
230
|
metadata: {}
|