timex_datalink_client 0.6.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/timex_datalink_client/helpers/four_byte_formatter.rb +29 -0
- data/lib/timex_datalink_client/protocol_4/alarm.rb +59 -0
- data/lib/timex_datalink_client/protocol_4/eeprom/anniversary.rb +44 -0
- data/lib/timex_datalink_client/protocol_4/eeprom/appointment.rb +49 -0
- data/lib/timex_datalink_client/protocol_4/eeprom/list.rb +43 -0
- data/lib/timex_datalink_client/protocol_4/eeprom/phone_number.rb +56 -0
- data/lib/timex_datalink_client/protocol_4/eeprom.rb +95 -0
- data/lib/timex_datalink_client/protocol_4/end.rb +20 -0
- data/lib/timex_datalink_client/protocol_4/sound_options.rb +42 -0
- data/lib/timex_datalink_client/protocol_4/sound_theme.rb +65 -0
- data/lib/timex_datalink_client/protocol_4/start.rb +20 -0
- data/lib/timex_datalink_client/protocol_4/sync.rb +40 -0
- data/lib/timex_datalink_client/protocol_4/time.rb +77 -0
- data/lib/timex_datalink_client/protocol_4/wrist_app.rb +67 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/activity.rb +94 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/calendar/event.rb +33 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/calendar.rb +91 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/games.rb +124 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/phone_number.rb +79 -0
- data/lib/timex_datalink_client/protocol_7/eeprom/speech.rb +228 -0
- data/lib/timex_datalink_client/protocol_7/eeprom.rb +76 -0
- data/lib/timex_datalink_client/protocol_7/end.rb +20 -0
- data/lib/timex_datalink_client/protocol_7/phrase_builder.rb +70 -0
- data/lib/timex_datalink_client/protocol_7/start.rb +20 -0
- data/lib/timex_datalink_client/protocol_7/sync.rb +40 -0
- data/lib/timex_datalink_client/version.rb +1 -1
- data/lib/timex_datalink_client.rb +34 -5
- metadata +42 -3
@@ -0,0 +1,228 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "timex_datalink_client/helpers/four_byte_formatter"
|
4
|
+
|
5
|
+
class TimexDatalinkClient
|
6
|
+
class Protocol7
|
7
|
+
class Eeprom
|
8
|
+
class Speech
|
9
|
+
include Helpers::FourByteFormatter
|
10
|
+
|
11
|
+
NICKNAME_LENGTH_WITHOUT_DEVICE = 10
|
12
|
+
NICKNAME_LENGTH_WITH_DEVICE = 14
|
13
|
+
|
14
|
+
NICKNAME_SUFFIXES = [
|
15
|
+
[0x353, 0x3fd, 0x04d, 0x003, 0x28d],
|
16
|
+
[0x353, 0x3fd, 0x04d, 0x003, 0x27b],
|
17
|
+
[0x3fb, 0x363, 0x039, 0x03c],
|
18
|
+
[0x3fb, 0x361, 0x039, 0x03c, 0x194, 0x3fd, 0x04b, 0x003, 0x144, 0x327],
|
19
|
+
[0x3fb, 0x1ae, 0x030, 0x329, 0x03c, 0x3fb, 0x030, 0x320, 0x03c, 0x039, 0x124],
|
20
|
+
[0x3fb, 0x353, 0x003, 0x1ae, 0x2e6, 0x18e],
|
21
|
+
[0x361, 0x039, 0x03c, 0x144, 0x3fd, 0x04b],
|
22
|
+
[0x3fb, 0x361, 0x33e],
|
23
|
+
[0x1cb, 0x039, 0x03c, 0x144, 0x3fd, 0x04b],
|
24
|
+
[0x039, 0x35a, 0x1ae, 0x3fd, 0x04b, 0x18e, 0x381],
|
25
|
+
[0x039, 0x35a, 0x31c, 0x381],
|
26
|
+
[0x353, 0x3fd, 0x04d, 0x003, 0x28d, 0x07b, 0x094],
|
27
|
+
[0x1e0, 0x1ab],
|
28
|
+
[0x253, 0x3fd, 0x04d, 0x182],
|
29
|
+
[0x353, 0x3fd, 0x04d, 0x003, 0x357, 0x10c, 0x3fd, 0x04d]
|
30
|
+
]
|
31
|
+
|
32
|
+
HEADER_VALUE_1_BASE = 0x0b
|
33
|
+
HEADER_VALUE_1_DEVICE_NICK = 4
|
34
|
+
|
35
|
+
HEADER_VALUE_2_BASE = 0x00
|
36
|
+
HEADER_VALUE_2_PHRASES = 26
|
37
|
+
HEADER_VALUE_2_DEVICE_NICK = 8
|
38
|
+
|
39
|
+
HEADER_VALUE_3_BASE = 0x1a
|
40
|
+
HEADER_VALUE_3_PHRASES = 2
|
41
|
+
HEADER_VALUE_3_DEVICE_NICK = 8
|
42
|
+
|
43
|
+
HEADER_VALUE_4_DEVICE_BASE = 8
|
44
|
+
HEADER_VALUE_4_PHRASE = 2
|
45
|
+
|
46
|
+
HEADER_VALUE_4_BASES = [0x1a, 0x1a, 0x1a, 0x1f, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a]
|
47
|
+
HEADER_VALUE_4_DEVICE_MULTIPLIERS = [5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5]
|
48
|
+
|
49
|
+
HEADER_VALUE_4_DEVICE_INDEXES = [
|
50
|
+
[0],
|
51
|
+
[0],
|
52
|
+
[0],
|
53
|
+
[0],
|
54
|
+
[0],
|
55
|
+
[0],
|
56
|
+
[0],
|
57
|
+
[0],
|
58
|
+
[0],
|
59
|
+
[0],
|
60
|
+
[0],
|
61
|
+
[0, 1, 11],
|
62
|
+
[0, 1, 11, 12],
|
63
|
+
[0, 1, 11, 12, 13]
|
64
|
+
]
|
65
|
+
|
66
|
+
HEADER_VALUE_4_USER_MULTIPLIERS = [0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
|
67
|
+
|
68
|
+
HEADER_VALUE_4_USER_INDEXES = [
|
69
|
+
[],
|
70
|
+
[],
|
71
|
+
[2],
|
72
|
+
[2, 5],
|
73
|
+
[3, 4, 10],
|
74
|
+
[3, 4, 5, 10],
|
75
|
+
[3, 4, 5, 6, 10],
|
76
|
+
[3, 4, 5, 6, 7, 10],
|
77
|
+
[3, 4, 5, 6, 7, 8, 10],
|
78
|
+
[3, 4, 5, 6, 7, 8, 9, 10],
|
79
|
+
[2, 3, 4, 5, 6, 7, 8, 9, 10],
|
80
|
+
[2, 3, 4, 5, 6, 7, 8, 9, 10],
|
81
|
+
[2, 3, 4, 5, 6, 7, 8, 9, 10],
|
82
|
+
[2, 3, 4, 5, 6, 7, 8, 9, 10]
|
83
|
+
]
|
84
|
+
|
85
|
+
HEADER_VALUE_5_BASE = 0x8d
|
86
|
+
|
87
|
+
HEADER_VALUE_5_DEVICE_BASE = -107
|
88
|
+
HEADER_VALUE_5_DEVICE_INDEXES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
89
|
+
HEADER_VALUE_5_DEVICE_MULTIPLIER = 5
|
90
|
+
|
91
|
+
HEADER_VALUE_5_USER_BASE = 0
|
92
|
+
HEADER_VALUE_5_USER_INDEXES = [14]
|
93
|
+
HEADER_VALUE_5_USER_MULTIPLIER = 5
|
94
|
+
|
95
|
+
HEADER_VALUE_5_PHRASE = 2
|
96
|
+
HEADER_VALUE_5_PHRASE_PACKET = 5
|
97
|
+
|
98
|
+
PACKETS_TERMINATOR = 0x05
|
99
|
+
|
100
|
+
attr_accessor :phrases, :device_nickname, :user_nickname
|
101
|
+
|
102
|
+
# Create a Speech instance.
|
103
|
+
#
|
104
|
+
# @param phrases [Array<Array<Integer>>] Two-dimensional array of phrases.
|
105
|
+
# @param device_nickname [Array<Integer>] Device nickname.
|
106
|
+
# @param user_nickname [Array<Integer>] User nickname.
|
107
|
+
# @return [Speech] Speech instance.
|
108
|
+
def initialize(phrases: [], device_nickname: [], user_nickname: [])
|
109
|
+
@phrases = phrases
|
110
|
+
@device_nickname = device_nickname
|
111
|
+
@user_nickname = user_nickname
|
112
|
+
end
|
113
|
+
|
114
|
+
# Compile data for nicknames and phrases.
|
115
|
+
#
|
116
|
+
# @return [Array<Integer>] Compiled data of all nicknames and phrases.
|
117
|
+
def packet
|
118
|
+
header + nickname_bytes + formatted_phrases + [PACKETS_TERMINATOR]
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
def header
|
124
|
+
all_values = [header_value_1, header_value_2, header_value_3] + header_values_4 + header_values_5
|
125
|
+
|
126
|
+
all_values.flat_map { |value| value.divmod(256).reverse }
|
127
|
+
end
|
128
|
+
|
129
|
+
def header_value_1
|
130
|
+
value_1 = HEADER_VALUE_1_BASE + phrases.count
|
131
|
+
value_1 += HEADER_VALUE_1_DEVICE_NICK if device_nickname.any?
|
132
|
+
|
133
|
+
value_1
|
134
|
+
end
|
135
|
+
|
136
|
+
def header_value_2
|
137
|
+
value_2 = HEADER_VALUE_2_BASE
|
138
|
+
value_2 += HEADER_VALUE_2_PHRASES if phrases.any?
|
139
|
+
value_2 += HEADER_VALUE_2_DEVICE_NICK if phrases.any? && device_nickname.any?
|
140
|
+
|
141
|
+
value_2
|
142
|
+
end
|
143
|
+
|
144
|
+
def header_value_3
|
145
|
+
value_3 = HEADER_VALUE_3_BASE
|
146
|
+
value_3 += HEADER_VALUE_3_DEVICE_NICK if device_nickname.any?
|
147
|
+
value_3 += HEADER_VALUE_3_PHRASES * phrases.count
|
148
|
+
|
149
|
+
value_3
|
150
|
+
end
|
151
|
+
|
152
|
+
def header_values_4
|
153
|
+
value_4_length = device_nickname.any? ? NICKNAME_LENGTH_WITH_DEVICE : NICKNAME_LENGTH_WITHOUT_DEVICE
|
154
|
+
|
155
|
+
value_4_length.times.flat_map do |value_4_index|
|
156
|
+
device_value = HEADER_VALUE_4_DEVICE_INDEXES[value_4_index].sum { |device_index| packet_lengths[device_index] }
|
157
|
+
device_value *= HEADER_VALUE_4_DEVICE_MULTIPLIERS[value_4_index]
|
158
|
+
|
159
|
+
user_value = HEADER_VALUE_4_USER_INDEXES[value_4_index].sum { |device_index| packet_lengths[device_index] }
|
160
|
+
user_value *= HEADER_VALUE_4_USER_MULTIPLIERS[value_4_index]
|
161
|
+
|
162
|
+
value = device_value + user_value
|
163
|
+
value += HEADER_VALUE_4_BASES[value_4_index]
|
164
|
+
value += HEADER_VALUE_4_PHRASE * phrases.count
|
165
|
+
value += HEADER_VALUE_4_DEVICE_BASE if device_nickname.any?
|
166
|
+
|
167
|
+
value
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
def header_values_5
|
172
|
+
phrases.each_index.flat_map do |phrase_index|
|
173
|
+
value = HEADER_VALUE_5_BASE
|
174
|
+
|
175
|
+
if device_nickname.any?
|
176
|
+
device_value = HEADER_VALUE_5_DEVICE_INDEXES.sum { |device_index| packet_lengths[device_index] }
|
177
|
+
device_value *= HEADER_VALUE_5_DEVICE_MULTIPLIER
|
178
|
+
device_value += HEADER_VALUE_5_DEVICE_BASE
|
179
|
+
|
180
|
+
value += device_value
|
181
|
+
end
|
182
|
+
|
183
|
+
if user_nickname.any?
|
184
|
+
user_value = HEADER_VALUE_5_USER_INDEXES.sum { |device_index| packet_lengths[device_index] }
|
185
|
+
user_value *= HEADER_VALUE_5_USER_MULTIPLIER
|
186
|
+
user_value += HEADER_VALUE_5_USER_BASE
|
187
|
+
|
188
|
+
value += user_value
|
189
|
+
end
|
190
|
+
|
191
|
+
value += HEADER_VALUE_5_PHRASE * phrases.count
|
192
|
+
value += HEADER_VALUE_5_PHRASE_PACKET * phrases.first(phrase_index).sum { |phrase| 1 + phrase.length / 4 }
|
193
|
+
|
194
|
+
value
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def nickname_bytes
|
199
|
+
four_byte_format_for(nicknames_with_suffixes)
|
200
|
+
end
|
201
|
+
|
202
|
+
def packet_lengths
|
203
|
+
nicknames_with_suffixes.map { |nickname| 1 + nickname.length / 4 }
|
204
|
+
end
|
205
|
+
|
206
|
+
def nickname_format
|
207
|
+
format = [device_nickname] * 2
|
208
|
+
format += [user_nickname] * 9
|
209
|
+
format += [device_nickname] * 4 if device_nickname.any?
|
210
|
+
|
211
|
+
format
|
212
|
+
end
|
213
|
+
|
214
|
+
def nicknames_with_suffixes
|
215
|
+
nickname_format.each_with_index.map do |nickname, nickname_index|
|
216
|
+
nickname + NICKNAME_SUFFIXES[nickname_index]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def formatted_phrases
|
221
|
+
return [] if phrases.empty?
|
222
|
+
|
223
|
+
four_byte_format_for(phrases)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "timex_datalink_client/helpers/cpacket_paginator"
|
4
|
+
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
5
|
+
|
6
|
+
class TimexDatalinkClient
|
7
|
+
class Protocol7
|
8
|
+
class Eeprom
|
9
|
+
include Helpers::CpacketPaginator
|
10
|
+
prepend Helpers::CrcPacketsWrapper
|
11
|
+
|
12
|
+
# FIXME use arrays for array models
|
13
|
+
# FIXME: check Array<Integer> yardoc around places
|
14
|
+
|
15
|
+
CPACKET_SECT = [0x90, 0x05]
|
16
|
+
CPACKET_DATA = [0x91, 0x05]
|
17
|
+
CPACKET_END = [0x92, 0x05]
|
18
|
+
|
19
|
+
CPACKET_SECT_WELCOME = [
|
20
|
+
0x44, 0x53, 0x49, 0x20, 0x54, 0x6f, 0x79, 0x73, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x73, 0x2e,
|
21
|
+
0x2e, 0x2e, 0x65, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00
|
22
|
+
]
|
23
|
+
|
24
|
+
CPACKET_DATA_LENGTH = 32
|
25
|
+
|
26
|
+
attr_accessor :activities, :games, :calendar, :phone_numbers, :speech
|
27
|
+
|
28
|
+
# Create an Eeprom instance.
|
29
|
+
#
|
30
|
+
# @param activities [Array<Activity>, nil] Activities to be added to EEPROM data.
|
31
|
+
# @param games [Games, nil] Games to be added to EEPROM data.
|
32
|
+
# @param calendar [Array<Calendar>, nil] Calendar to be added to EEPROM data.
|
33
|
+
# @param phone_numbers [Array<PhoneNumber>, nil] Phone numbers to be added to EEPROM data.
|
34
|
+
# @param speech [Speech, nil] Speech to be added to EEPROM data.
|
35
|
+
# @return [Eeprom] Eeprom instance.
|
36
|
+
def initialize(activities: nil, games: nil, calendar: nil, phone_numbers: nil, speech: nil)
|
37
|
+
@activities = activities
|
38
|
+
@games = games
|
39
|
+
@calendar = calendar
|
40
|
+
@phone_numbers = phone_numbers
|
41
|
+
@speech = speech
|
42
|
+
end
|
43
|
+
|
44
|
+
# Compile packets for EEPROM data.
|
45
|
+
#
|
46
|
+
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
47
|
+
def packets
|
48
|
+
[header] + payloads + [CPACKET_END]
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def header
|
54
|
+
[
|
55
|
+
CPACKET_SECT,
|
56
|
+
payloads.length,
|
57
|
+
CPACKET_SECT_WELCOME
|
58
|
+
].flatten
|
59
|
+
end
|
60
|
+
|
61
|
+
def payloads
|
62
|
+
paginate_cpackets(header: CPACKET_DATA, length: CPACKET_DATA_LENGTH, cpackets: all_packets)
|
63
|
+
end
|
64
|
+
|
65
|
+
def all_packets
|
66
|
+
[].tap do |packets|
|
67
|
+
packets.concat(Activity.packets(activities)) if activities
|
68
|
+
packets.concat(games.packet) if games
|
69
|
+
packets.concat(calendar.packet) if calendar
|
70
|
+
packets.concat(PhoneNumber.packets(phone_numbers)) if phone_numbers
|
71
|
+
packets.concat(speech.packet) if speech
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
4
|
+
|
5
|
+
class TimexDatalinkClient
|
6
|
+
class Protocol7
|
7
|
+
class End
|
8
|
+
prepend Helpers::CrcPacketsWrapper
|
9
|
+
|
10
|
+
CPACKET_SKIP = [0x21]
|
11
|
+
|
12
|
+
# Compile packets for data end command.
|
13
|
+
#
|
14
|
+
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
15
|
+
def packets
|
16
|
+
[CPACKET_SKIP]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mdb"
|
4
|
+
|
5
|
+
class TimexDatalinkClient
|
6
|
+
class Protocol7
|
7
|
+
class PhraseBuilder
|
8
|
+
class WordNotFound < StandardError; end
|
9
|
+
|
10
|
+
attr_accessor :database
|
11
|
+
|
12
|
+
# Create a PhraseBuilder instance.
|
13
|
+
#
|
14
|
+
# @param database [String] Database file to compile phrase data from.
|
15
|
+
# @return [PhraseBuilder] PhraseBuilder instance.
|
16
|
+
def initialize(database:)
|
17
|
+
@database = database
|
18
|
+
end
|
19
|
+
|
20
|
+
# Compile vocabulary IDs for protocol 7 phrases.
|
21
|
+
#
|
22
|
+
# @param words [Array<String>] Array of words.
|
23
|
+
# @raise [WordNotFound] Word not found in protocol 7 database.
|
24
|
+
# @return [Array<Integer>] Array of protocol 7 vocabulary IDs.
|
25
|
+
def vocab_ids_for(*words)
|
26
|
+
words.flat_map do |word|
|
27
|
+
vocab = vocab_for_word(word)
|
28
|
+
|
29
|
+
raise(WordNotFound, "#{word} is not a valid word!") unless vocab
|
30
|
+
|
31
|
+
vocab_links = vocab_links_for_vocab(vocab)
|
32
|
+
|
33
|
+
vocab_links.map do |vocab_link|
|
34
|
+
linked_vocab = vocab_for_vocab_link(vocab_link)
|
35
|
+
|
36
|
+
linked_vocab[:"PC Index"].to_i
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def mdb
|
44
|
+
@mdb ||= Mdb.open(database)
|
45
|
+
end
|
46
|
+
|
47
|
+
def vocab_table
|
48
|
+
@vocab_table ||= mdb["Vocab"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def vocab_links_table
|
52
|
+
@vocab_links_table ||= mdb["Vocab Links"]
|
53
|
+
end
|
54
|
+
|
55
|
+
def vocab_for_word(word)
|
56
|
+
vocab_table.detect { |vocab| vocab[:Label].casecmp?(word) }
|
57
|
+
end
|
58
|
+
|
59
|
+
def vocab_links_for_vocab(vocab)
|
60
|
+
links = vocab_links_table.select { |vocab_link| vocab_link[:"PC Index"] == vocab[:"PC Index"] }
|
61
|
+
|
62
|
+
links.sort_by { |link| link[:Sequence].to_i }
|
63
|
+
end
|
64
|
+
|
65
|
+
def vocab_for_vocab_link(vocab_link)
|
66
|
+
vocab_table.detect { |vocab| vocab[:"PC Index"] == vocab_link[:"eBrain Index"] }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "timex_datalink_client/helpers/crc_packets_wrapper"
|
4
|
+
|
5
|
+
class TimexDatalinkClient
|
6
|
+
class Protocol7
|
7
|
+
class Start
|
8
|
+
prepend Helpers::CrcPacketsWrapper
|
9
|
+
|
10
|
+
CPACKET_START = [0x20, 0x00, 0x00, 0x07]
|
11
|
+
|
12
|
+
# Compile packets for data start command.
|
13
|
+
#
|
14
|
+
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
15
|
+
def packets
|
16
|
+
[CPACKET_START]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class TimexDatalinkClient
|
4
|
+
class Protocol7
|
5
|
+
class Sync
|
6
|
+
PING_BYTE = [0x78]
|
7
|
+
SYNC_1_BYTE = [0x55]
|
8
|
+
SYNC_2_BYTE = [0xaa]
|
9
|
+
|
10
|
+
SYNC_2_LENGTH = 5
|
11
|
+
|
12
|
+
attr_accessor :length
|
13
|
+
|
14
|
+
# Create a Sync instance.
|
15
|
+
#
|
16
|
+
# @param length [Integer] Number of 0x55 sync bytes to use.
|
17
|
+
# @return [Sync] Sync instance.
|
18
|
+
def initialize(length: 300)
|
19
|
+
@length = length
|
20
|
+
end
|
21
|
+
|
22
|
+
# Compile packets for syncronization data.
|
23
|
+
#
|
24
|
+
# @return [Array<Array<Integer>>] Two-dimensional array of integers that represent bytes.
|
25
|
+
def packets
|
26
|
+
[PING_BYTE + render_sync_1 + render_sync_2]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def render_sync_1
|
32
|
+
SYNC_1_BYTE * length
|
33
|
+
end
|
34
|
+
|
35
|
+
def render_sync_2
|
36
|
+
SYNC_2_BYTE * SYNC_2_LENGTH
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "timex_datalink_client/version"
|
4
3
|
require "timex_datalink_client/notebook_adapter"
|
4
|
+
require "timex_datalink_client/version"
|
5
5
|
|
6
6
|
require "timex_datalink_client/protocol_1/alarm"
|
7
7
|
require "timex_datalink_client/protocol_1/eeprom"
|
@@ -29,6 +29,32 @@ require "timex_datalink_client/protocol_3/sync"
|
|
29
29
|
require "timex_datalink_client/protocol_3/time"
|
30
30
|
require "timex_datalink_client/protocol_3/wrist_app"
|
31
31
|
|
32
|
+
require "timex_datalink_client/protocol_4/alarm"
|
33
|
+
require "timex_datalink_client/protocol_4/eeprom"
|
34
|
+
require "timex_datalink_client/protocol_4/eeprom/anniversary"
|
35
|
+
require "timex_datalink_client/protocol_4/eeprom/appointment"
|
36
|
+
require "timex_datalink_client/protocol_4/eeprom/list"
|
37
|
+
require "timex_datalink_client/protocol_4/eeprom/phone_number"
|
38
|
+
require "timex_datalink_client/protocol_4/end"
|
39
|
+
require "timex_datalink_client/protocol_4/sound_options"
|
40
|
+
require "timex_datalink_client/protocol_4/sound_theme"
|
41
|
+
require "timex_datalink_client/protocol_4/start"
|
42
|
+
require "timex_datalink_client/protocol_4/sync"
|
43
|
+
require "timex_datalink_client/protocol_4/time"
|
44
|
+
require "timex_datalink_client/protocol_4/wrist_app"
|
45
|
+
|
46
|
+
require "timex_datalink_client/protocol_7/eeprom"
|
47
|
+
require "timex_datalink_client/protocol_7/eeprom/activity"
|
48
|
+
require "timex_datalink_client/protocol_7/eeprom/calendar"
|
49
|
+
require "timex_datalink_client/protocol_7/eeprom/calendar/event"
|
50
|
+
require "timex_datalink_client/protocol_7/eeprom/games"
|
51
|
+
require "timex_datalink_client/protocol_7/eeprom/phone_number"
|
52
|
+
require "timex_datalink_client/protocol_7/eeprom/speech"
|
53
|
+
require "timex_datalink_client/protocol_7/end"
|
54
|
+
require "timex_datalink_client/protocol_7/phrase_builder"
|
55
|
+
require "timex_datalink_client/protocol_7/start"
|
56
|
+
require "timex_datalink_client/protocol_7/sync"
|
57
|
+
|
32
58
|
require "timex_datalink_client/protocol_9/alarm"
|
33
59
|
require "timex_datalink_client/protocol_9/eeprom"
|
34
60
|
require "timex_datalink_client/protocol_9/eeprom/chrono"
|
@@ -46,17 +72,20 @@ class TimexDatalinkClient
|
|
46
72
|
|
47
73
|
# Create a TimexDatalinkClient instance.
|
48
74
|
#
|
49
|
-
# @param serial_device [String] Path to serial device.
|
75
|
+
# @param serial_device [String, nil] Path to serial device.
|
50
76
|
# @param models [Array<Protocol1::Sync, Protocol1::Start, Protocol1::Time, Protocol1::TimeName, Protocol1::Alarm,
|
51
77
|
# Protocol1::Eeprom, Protocol1::End, Protocol3::Sync, Protocol3::Start, Protocol3::Time, Protocol3::Alarm,
|
52
78
|
# Protocol3::Eeprom, Protocol3::SoundTheme, Protocol3::SoundOptions, Protocol3::WristApp, Protocol3::End,
|
53
|
-
#
|
54
|
-
#
|
79
|
+
# Protocol4::Sync, Protocol4::Start, Protocol4::Time, Protocol4::Alarm, Protocol4::Eeprom, Protocol4::SoundTheme,
|
80
|
+
# Protocol4::SoundOptions, Protocol4::WristApp, Protocol4::End, Protocol7::Sync, Protocol7::Start,
|
81
|
+
# Protocol7::Eeprom, Protocol7::End, Protocol9::Sync, Protocol9::Start, Protocol9::Time, Protocol9::TimeName,
|
82
|
+
# Protocol9::Timer, Protocol9::Alarm, Protocol9::Eeprom, Protocol9::SoundOptions, Protocol9::End>] Models to compile
|
83
|
+
# data for.
|
55
84
|
# @param byte_sleep [Integer, nil] Time to sleep after sending byte.
|
56
85
|
# @param packet_sleep [Integer, nil] Time to sleep after sending packet of bytes.
|
57
86
|
# @param verbose [Boolean] Write verbose output to console.
|
58
87
|
# @return [TimexDatalinkClient] TimexDatalinkClient instance.
|
59
|
-
def initialize(serial_device
|
88
|
+
def initialize(serial_device: nil, models: [], byte_sleep: nil, packet_sleep: nil, verbose: false)
|
60
89
|
@serial_device = serial_device
|
61
90
|
@models = models
|
62
91
|
@byte_sleep = byte_sleep
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.8.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-
|
11
|
+
date: 2022-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: crc
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.6.0
|
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
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,6 +104,7 @@ files:
|
|
90
104
|
- lib/timex_datalink_client/helpers/char_encoders.rb
|
91
105
|
- lib/timex_datalink_client/helpers/cpacket_paginator.rb
|
92
106
|
- lib/timex_datalink_client/helpers/crc_packets_wrapper.rb
|
107
|
+
- lib/timex_datalink_client/helpers/four_byte_formatter.rb
|
93
108
|
- lib/timex_datalink_client/helpers/length_packet_wrapper.rb
|
94
109
|
- lib/timex_datalink_client/notebook_adapter.rb
|
95
110
|
- lib/timex_datalink_client/protocol_1/alarm.rb
|
@@ -116,6 +131,30 @@ files:
|
|
116
131
|
- lib/timex_datalink_client/protocol_3/sync.rb
|
117
132
|
- lib/timex_datalink_client/protocol_3/time.rb
|
118
133
|
- lib/timex_datalink_client/protocol_3/wrist_app.rb
|
134
|
+
- lib/timex_datalink_client/protocol_4/alarm.rb
|
135
|
+
- lib/timex_datalink_client/protocol_4/eeprom.rb
|
136
|
+
- lib/timex_datalink_client/protocol_4/eeprom/anniversary.rb
|
137
|
+
- lib/timex_datalink_client/protocol_4/eeprom/appointment.rb
|
138
|
+
- lib/timex_datalink_client/protocol_4/eeprom/list.rb
|
139
|
+
- lib/timex_datalink_client/protocol_4/eeprom/phone_number.rb
|
140
|
+
- lib/timex_datalink_client/protocol_4/end.rb
|
141
|
+
- lib/timex_datalink_client/protocol_4/sound_options.rb
|
142
|
+
- lib/timex_datalink_client/protocol_4/sound_theme.rb
|
143
|
+
- lib/timex_datalink_client/protocol_4/start.rb
|
144
|
+
- lib/timex_datalink_client/protocol_4/sync.rb
|
145
|
+
- lib/timex_datalink_client/protocol_4/time.rb
|
146
|
+
- lib/timex_datalink_client/protocol_4/wrist_app.rb
|
147
|
+
- lib/timex_datalink_client/protocol_7/eeprom.rb
|
148
|
+
- lib/timex_datalink_client/protocol_7/eeprom/activity.rb
|
149
|
+
- lib/timex_datalink_client/protocol_7/eeprom/calendar.rb
|
150
|
+
- lib/timex_datalink_client/protocol_7/eeprom/calendar/event.rb
|
151
|
+
- lib/timex_datalink_client/protocol_7/eeprom/games.rb
|
152
|
+
- lib/timex_datalink_client/protocol_7/eeprom/phone_number.rb
|
153
|
+
- lib/timex_datalink_client/protocol_7/eeprom/speech.rb
|
154
|
+
- lib/timex_datalink_client/protocol_7/end.rb
|
155
|
+
- lib/timex_datalink_client/protocol_7/phrase_builder.rb
|
156
|
+
- lib/timex_datalink_client/protocol_7/start.rb
|
157
|
+
- lib/timex_datalink_client/protocol_7/sync.rb
|
119
158
|
- lib/timex_datalink_client/protocol_9/alarm.rb
|
120
159
|
- lib/timex_datalink_client/protocol_9/eeprom.rb
|
121
160
|
- lib/timex_datalink_client/protocol_9/eeprom/chrono.rb
|
@@ -128,7 +167,7 @@ files:
|
|
128
167
|
- lib/timex_datalink_client/protocol_9/time_name.rb
|
129
168
|
- lib/timex_datalink_client/protocol_9/timer.rb
|
130
169
|
- lib/timex_datalink_client/version.rb
|
131
|
-
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.
|
170
|
+
homepage: https://github.com/synthead/timex_datalink_client/tree/v0.8.0
|
132
171
|
licenses:
|
133
172
|
- MIT
|
134
173
|
metadata: {}
|