This describes is the data format that the Beepwear Pro watch uses to receive data. The data is send in packets, which are a series of 8 bit numbers. While being transfered to the watch, packets are separated by a short pause. ** All packets are of the form: Byte 0: Length of packet, including length byte and crc Byte 1: Opcode Byte 2: data for opcode (not every packet has data though) Byte n-1: high byte of CRC16. The crc covers bytes 0 through n-2 of the packet. Byte n: low byte of CRC16 ** Opcodes: 0x20: Start packet 0x32: Time packet 0x93: Data Start Packet 0x90: Data Info Packet 0x91: Data Packet 0x92: Data End Packet 0x51: Alarm Packet 0x71: System Info Packet 0x21: End Packet ** Packet Details: Packets are shown here without their length or CRC. Just remember packets ALWAYS have a length and CRC. Start Packet (0x20): <0x20> opcode <0x00> unknown <0x00> unknown <0x06> unknown This packet is always sent first. I don't know what any of the bytes in this packet are for, but I suspect the "<0x06>" is a version number of the protocol. Time Packet (0x32): I don't know about this packet yet. Data Start Packet (0x93): <0x93> opcode <0x01> unknown This packet is always send before any Data Info or Data Packets are sent. I don't know what the "<0x01>" is (possibly another version number??). Essentially it kicks off a data transfer. Data Info Packet (0x90): <0x90> opcode <0x01> unknown Number of data packets to follow <0x00> unknown <0x04> unknown How many phone numbers will be transfered (in the data packets) <0x00> unknown This packet comes after the Data Start packet but before the Data packets. It tells the watch how many data packets will be transfered and how many phone numbers (total) will be transfered in those data packets. I don't know what that "<0x01>" does, and also I don't know what the "<0x00> <0x04>" part is, although in other Timex Databank watches that is the memory address that the data should be written to. The final "<0x00>" is a mystery as well. Data Packet (0x91): <0x91> opcode <0x01> unknown starts at 1, and each subsequent packet increments this. ... The data can be from 1 to 32 bytes in length (??? - I haven't ever tried sending more than 32, but the Windows program never sends more than 32). The first packet that is sent has a packet number of "1", the next is "2" and so on. The format of the data is discussed later. I still don't know what that "<0x01>" is. Data End Packet (0x92): <0x92> opcode <0x01> unknown This packet is sent after all the Data packets are sent. Theres that "<0x01>" again! Alarm Packet (0x51): <0x51> opcode 1 though 8: which alarm we're sending 24 hour... pretty self explanatory ditto Guess... 0 = disarmed, 1 = armed, 2 = unused Encoded message. Always 16 bytes long, space filled at the end. ... The Windows program always sends all 8 alarms out, even if you only have 1 set. The message is always 16 bytes long. If the message is shorter than 16 bytes, it needs to be padded with spaces. The message is NOT ASCII, its Timex's own encoding. See below for more info. Watch Options Packet (0x71): <0x71> opcode 0 = silent, 1 = chime on the hour 0 = silent, 1 = button beep 0 = slow scroll speed, 1 = medium, 2 = fast Some various watch options. Windows sends this after phone numbers and alarms. Night Mode Options Packet (0x72): <0x72> opcode 1 = Activate night mode on any alarm or page, 0 = don't How long (in hours) until night mode turns itself off How long (in seconds) until the light goes off when in night mode Some options about night mode. Windows sends this after the Pager Options packet. Pager Options Packet (0x73): <0x73> opcode 1 = Automatically turn the pager on and off every day The hour it should be turned on at (24 hour style) The minute it should be turned on at The hour it should be turned off at (24 hour style) The minute it should be turned off at 0 = Melody1, 1 = Melody2, 2 = Melody3, 3 = Melody4, 4 = Melody5, 5 = Chirp, 6 = Silent Some various pager options. Windows sends this after the Watch Options packet. End Packet (0x21): <0x21> opcode This one is a doosy. It is always the last packet of a transfer. ** Phone number (data) format: The phone numbers are stored in a series of variable length records. Each record looks like this: Byte 0: The total length of the record (including the length byte and the terminator). Byte 1 to 6: The encoded phone number. See below for more info on numer encoding. Byte 7 to n-1: The encoded name. See below for more info on string encoding. Byte n: This is always 0x5c. A terminator perhaps? Each record immediately follows the previous record in memory. The phone numbers are always 10 digits long in the form "nnnnnnnnnntt" where 'n' is the main phone number (just the numbers: no superfluous space, dashes or parenthasis) and 't' is the type of number. The Windows program only sends these types: " ": No type. " C": Cellular " F": Fax " H": Home "HF": Home Fax " P": Pager " W": Work "W2": Work 2 "WF": Work Fax Note: The watch is NOT limited to these types, or even limited to the types being the last 2 digits. In fact, it can display the whole character set in any of the digit positions. ** Encoded number format: The numbers have a limited 4 bit character set: 0x0: "0" 0x1: "1" 0x2: "2" 0x3: "3" 0x4: "4" 0x5: "5" 0x6: "6" 0x7: "7" 0x8: "8" 0x9: "9" 0xa: "C" 0xb: "F" 0xc: "H" 0xd: "P" 0xe: "W" 0xf: " " (space character) Theses digits are squished into bytes 2 at a time (since each character is only nibble). The lower byte is first, followed by the upper byte. This is weird to look at, but not difficult to program. Example: The phone number "01234567879 H" would be encoded like this: 0x10 0x32 0x54 0x76 0x98 0xcf ** Encoded string format: The strings are encoded with a different character set than the phone numbers: 0x00 0 0x20 V 0x40 ` 0x01 1 0x21 W 0x41 { 0x02 2 0x22 X 0x42 | 0x03 3 0x23 Y 0x43 } 0x04 4 0x24 Z 0x44 ~ 0x05 5 0x25 ! 0x45 @ (different looking than 0x3a) 0x06 6 0x26 " 0x46 Lightning??? Selection??? 0x07 7 0x27 # 0x47 Pound 0x08 8 0x28 $ 0x48 Yen 0x09 9 0x29 % 0x49 A: (A with 2 dots above) 0x0a 0x2a & 0x4a A. (a with 1 dot above) 0x0b A 0x2b ' 0x4b AE 0x0c B 0x2c ( 0x4c C, (French squiggly C) 0x0d C 0x2d ) 0x4d N~ (Spanish enyay) 0x0e D 0x2e * 0x4e o: (O with 2 dots above) 0x0f E 0x2f + 0x4f zero with a slash 0x10 F 0x30 , 0x50 U with tips bent in?? 0x11 G 0x31 - 0x51 German squiggly B 0x12 H 0x32 . 0x52 Upside down '!' 0x13 I 0x33 / 0x53 Upside down '?' 0x14 J 0x34 : 0x54 degree symbol with one corner weird 0x15 K 0x35 ; 0x55 degree 0x16 L 0x36 < 0x56 line accross top row of pixels 0x17 M 0x37 = 0x57 -| (line drawing style) 0x18 N 0x38 > 0x58 Thick < 0x19 O 0x39 ? 0x59 Thick > 0x1a P 0x3a @ 0x5a lower case i 0x1b Q 0x3b [ 0x5b Solid block 0x1c R 0x3c \ 0x5c 0x1d S 0x3d ] 0x5d 0x1e T 0x3e ^ 0x5e 0x1f U 0x3f _ 0x5f 0x60 to 0x7F are garbage (and they seem to mess up the digits in the upper part of the screen). 0x80 to 0xFF are repeated (they must ignore the high bit). 0x46 looks like this: \ /\ \/ \ 0x50 looks like this: x x x x x x x x xxx 0x54 looks like this: xxx x x xx x