47755 (588501), страница 17
Текст из файла (страница 17)
static final int WKNIGHT = 0x03;
static final int WBISHOP = 0x04;
static final int WKING = 0x05;
static final int WQUEEN = 0x06;
static final int BPAWN = 0x07;
static final int BROOK = 0x08;
static final int BKNIGHT = 0x09;
static final int BBISHOP = 0x0a;
static final int BKING = 0x0b;
static final int BQUEEN = 0x0c;
boolean is_piece(int p) {
return (p==EMPTY || p==WPAWN || p==WROOK ||
p==WKNIGHT || p==WBISHOP || p==WKING ||
p==WQUEEN || p==BPAWN || p==BROOK ||
p==BKNIGHT || p==BBISHOP || p==BKING ||
p==BQUEEN);
}
static int EE_POWERUP = 0x6a;
static int EE_EOF = 0x6b;
static int EE_FOURROWS = 0x6c;
static int EE_EMPTYBOARD = 0x6d;
static int EE_DOWNLOADED = 0x6e;
static int EE_BEGINPOS = 0x6f;
static int EE_BEGINPOS_ROT = 0x7a;
static int EE_START_TAG = 0x7b;
static int EE_WATCHDOG_ACTION = 0x7c;
static int EE_NOP = 0x7f;
}
rdgtReceiver.java
---
class rdgtReceiver extends rdgtProtocol {
int messagetype;
int messagelen_msb;
int messagelen_lsb;
int[] data;
int useddata;
int state;
rdgtInterpreter interpreter;
public rdgtReceiver(rdgtInterpreter _interpreter) {
state = 0;
interpreter = _interpreter;
}
void receive(int[] d) {
char c[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
StringBuffer x = new StringBuffer("Received: ");
for (int i=0; i x.append(c[d[i]>>4]).append(c[d[i] & 0x0F]).append(" "); } if (rdgtChess.debug) System.out.println(x.toString()); _receive (d, 0); } void _receive(int[] d, int start) { if (start == d.length) return; if (state == 0) { // Find a known messageid. while (start if (is_busmessage(d[start])) { messagetype = d[start]; state = 1; _receive(d,start+1); return; } System.err.println("Did not understand 1 byte of incoming data."); start = start + 1; } return; } if (state == 1) { if ((d[start] & 0x80) > 0) { System.err.println("Did not understand 2 bytes of incoming data."); state = 0; _receive(d, start); return; } messagelen_msb = d[start]; state = 2; start = start + 1; } if (start == d.length) return; if (state == 2) { if ((d[start] & 0x80) > 0) {System.err.println("Did not understand 3 bytes of incoming data."); state = 0; _receive(d, start); return; } messagelen_lsb = d[start]; state = 3; start = start + 1; int newlen = ((int)messagelen_msb * 0x80) + (int)messagelen_lsb; if (newlen <5) { System.out.println("Too small message length: " + Integer.toString(newlen)); state = 0; _receive(d, start); return; } data = new int[newlen]; data[0] = messagetype; data[1] = messagelen_msb; data[2] = messagelen_lsb; useddata = 3; } if (start == d.length) return; if (state == 3) { while (start data[useddata]=d[start]; start = start + 1; useddata = useddata + 1; } if (useddata == data.length) { interpreter.interpret(data); start = start + 1; data = null; state = 0;} } _receive(d, start); } } rdgtSender.java --- class rdgtSender extends rdgtProtocol { rdgtSerialport com; public rdgtSender(rdgtSerialport _com) { com = _com; } void send(int message, int address) { String tmp = "Address:"+Integer.toString(address); System.out.println(); if (message==DGT_TO_BUSMODE) System.out.println("Sending message: SWITCH TO BUSMODE "+tmp); else if (message==DGT_BUS_SEND_BRD) System.out.println("Sending message: SEND BOARD "+tmp); else if (message==DGT_BUS_SEND_CHANGES) System.out.println("Sending message: SEND CHANGES "+tmp); else if (message==DGT_BUS_REPEAT_CHANGES) System.out.println("Sending message: REPEAT CHANGES "+tmp); else if (message==DGT_BUS_PING) System.out.println("Sending message: PING "+tmp); else if (message==DGT_BUS_IGNORE_NEXT_BUS_PING) System.out.println("Sending message: IGNORE NEXT PING "+tmp); else System.out.println("Sending message: (some other message)"); byte x[] = new byte[4]; x[0] = (byte)message; x[1] = (byte)((address>>7) & 0x7F); x[2] = (byte)(address & 0x7F); x[3] = (byte)(((int)x[0]+(int)x[1]+(int)x[2]) & 0x7F); com.write(x); } } rdgtSerialport.java --- class rdgtSerialport implements SerialPortEventListener { static CommPortIdentifier portid; InputStream inStream; OutputStream outStream; SerialPort serialPort; rdgtReceiver receiver; public rdgtSerialport(rdgtReceiver r) { receiver = r; } public boolean open(String portname) { CommPortIdentifier id = null; Enumeration portList; portList = CommPortIdentifier.getPortIdentifiers(); System.out.println(portList.toString()); while (portList.hasMoreElements()) { System.out.println("2"); id = (CommPortIdentifier) portList.nextElement(); if (id.getPortType() == CommPortIdentifier.PORT_SERIAL) { System.out.println("Ports: "+id.getName()); if (id.getName().equals(portname)) break; // found } id = null; } if (id == null) return false; // not found try { serialPort = (SerialPort) id.open("ttchess", 2000); inStream = serialPort.getInputStream(); outStream = serialPort.getOutputStream(); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); serialPort.setDTR(false); serialPort.setRTS(false); } catch (Exception e) { return false; } return true; } public boolean write(byte[] data) { char c[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; StringBuffer x = new StringBuffer(" Sending: "); for (int i=0; i int d = data[i]; if (d<0) d=256+d; x.append(c[d>>4]).append(c[d & 0x0F]).append(" "); } if (rdgtChess.debug) System.out.println(x.toString()); try { outStream.write(data); } catch (IOException e) { return false; } return true; } public void serialEvent(SerialPortEvent event) { switch(event.getEventType()) { case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: byte[] readBuffer = new byte[200]; try { while (inStream.available() > 0) { int numBytes = inStream.read(readBuffer); if (numBytes>0) { int[] buf = new int[numBytes]; for (int i=0; i int tmp = readBuffer[i]; if (tmp<0) tmp=256+tmp; buf[i]=tmp; } receiver.receive(buf); } } } catch (IOException e) {} break; } } } rdgtSnapshot.java --- class rdgtSnapshot extends rdgtProtocol { int[] pieces = new int[64]; Date time; rdgtChessboard board; boolean clkRunning, clkBatteryLow, clkFrontViewLeftSideHigh, clkBlackTurn, clkWhiteTurn; int clkSecWhite, clkSecBlack; public rdgtSnapshot(rdgtChessboard _board) { time = new Date(); board = _board; set_emptyboard(); } public rdgtSnapshot(rdgtSnapshot x) { for (int i=0; i<64; i=i+1) pieces[i] = x.pieces[i]; time = x.time; board = x.board; clkRunning = x.clkRunning; clkBatteryLow = x.clkBatteryLow; clkFrontViewLeftSideHigh = x.clkFrontViewLeftSideHigh; clkBlackTurn = x.clkBlackTurn; clkWhiteTurn = x.clkWhiteTurn; clkSecWhite = x.clkSecWhite; clkSecBlack = x.clkSecBlack; } rdgtSnapshot copy() { return new rdgtSnapshot(this); } void set_clockdata(boolean running, boolean batteryLow, boolean frontViewLeftSideHigh, boolean blackTurn, boolean whiteTurn, int secW, int secB) { clkRunning = running; clkBatteryLow = batteryLow; clkFrontViewLeftSideHigh = frontViewLeftSideHigh; clkBlackTurn = blackTurn; clkWhiteTurn = whiteTurn; clkSecWhite = secW; clkSecBlack = secB; } public boolean sameas(rdgtSnapshot x) { for (int i=0; i<64; i=i+1) if (pieces[i] != x.pieces[i]) return false; return true; } Date get_time() { return time; } void set_emptyboard() { time = new Date(); for (int i=0; i<64; i=i+1) pieces[i]=EMPTY; } void set_boarddump(int[] all64, int startpos) { time = new Date(); for (int i=0; i<64; i=i+1) { int p = all64[i+startpos]; if (is_piece(p)==false) { System.out.println("Confused: Boarddump contained an unknown piece"); pieces[i]=EMPTY; } else { pieces[i]=p; } } } void set_fieldupdate(int piece, int pos) { time = new Date(); if (pos 63) { System.out.println("Confused: Fieldupdate for pos outside 0..63"); return; } if (is_piece(piece)==false) { System.out.println("Confused: Fieldupdate with an unknown piece"); return; } pieces[pos]=piece; } String seconds2hms(int s) { return Integer.toString(s/36000)+Integer.toString((s%36000)/3600)+":"+ Integer.toString((s%3600)/600)+Integer.toString((s%360)/60)+":"+ Integer.toString((s%60)/10)+Integer.toString(s%10); } String debugprint_clock() { StringBuffer s = new StringBuffer(50); s.append("Clock: White "); s.append(seconds2hms(clkSecWhite)); s.append(" Black "); s.append(seconds2hms(clkSecBlack)); System.out.println(s); return s.toString(); } String getTimeWhite(){ return seconds2hms(clkSecWhite); } String getTimeBlack(){ return seconds2hms(clkSecBlack); } boolean isWhiteTurn(){ return clkFrontViewLeftSideHigh; } String debugprint() { debugprint_clock(); StringBuffer s = new StringBuffer(300); for (int i=0; i<8; i=i+1) { for (int j=0; j<8; j=j+1) { int p = pieces[(i*8)+j]; if (p==EMPTY ) s.append("."); if (p==WPAWN ) s.append("P"); if (p==WROOK ) s.append("R"); if (p==WKNIGHT) s.append("N"); if (p==WBISHOP) s.append("B"); if (p==WKING ) s.append("K"); if (p==WQUEEN ) s.append("Q"); if (p==BPAWN ) s.append("p"); if (p==BROOK ) s.append("r"); if (p==BKNIGHT) s.append("n"); if (p==BBISHOP) s.append("b"); if (p==BKING ) s.append("k"); if (p==BQUEEN ) s.append("q"); } s.append("\n"); } System.out.println(s); return s.toString(); } } Приложение Д Снимки экрана Д.1 Снимок экрана главной страницы сервера трансляции шахматных партий rDGT Д.2 Снимок экрана страницы авторизации пользователя Д.3 Снимок экрана страницы просмотра текущих online трансляций Д.4 Снимок экрана страницы просмотра шахматной партии Приложение Е Протокол DGT #ifndef dgtbrd13 #define dgtbrd13 /* Protocol description for DGT chess board. Copyright 1998 DGT Projects B.V Version: 1.03 Single computer and bus support in one .h file ********************************************************* This protocol is protected under trade mark registration and copyrights. It may not be used commercially without written permission of DGT Projects B.V. It is illegal to transfer any registered trade mark identifications by means of this protocol between any chessboard or other application and any computer. ********************************************************* Main functionality of the DGT Electronic Chess Board ---------------------------------------------------- The DGT board is basically a sensor which senses the presense of the special chess set pieces on the squares of the board. The situation on the board is measured and can be communicated with an average maximum time delay of 200 mS. Besides this detection function, the board communicates with an optional DGT TopMatch Chess Clock, to give the data of the clock available to the general interface. Finally the board is equipped with an internal storage of the measured piece positions. The board supports two methods of communication: for single-board situations a protocol for communication between one board and one computer is available. For situations with many boards a network communications protocol is available, where many boards can be connected in a bus structure. A separate communication protocol is available for this bus structure. The communication protocol for single board connections is described in the following paragraph "Single board communication protocol". This paragraph describes much more than only the communication protocol. All developers should read this paragraph, even if they would only use bus communication. The special bus communication protocol is derived from the single board communication and functionality, where the main added feature is the possibility to address a specific board on a shared communication bus. The commands and data contens are described in the paragraph "Bus Communication Protocol", Note however that the contens can not be understood without reading the single board communication paragraph. Paragraph: Single board communication protocol ---------------------------------------------- The main function of the board is to transfer piece position information. For this, three modes are available: 1. IDLE mode. This cancelles any of the two UPDATE modes. No automatic transfer of moves. 2. UPDATE_BOARD mode. On the moment that the board detects a removal, change or placing of a piece, it outputs a DGT_SEND_UPDATE message 3. UPDATE mode. As UPDATE_BOARD mode, where additional the clock data are send regularly (at least every second) The board accepts command codes from the computer RS232. The commands are 1-byte codes, sometimes followed by data (see code definition) The board can send data to the computer. Data always carries a message header. The message header contains a message code and the total message size in bytes. The start of the incoming message can be recognised by the MSB of the message identifier set to 1 (see definition). Board to computer communication interfaces: RS232 for communication with computer, receiving commands, sending data - 9600 Baud, 1 stopbit, 1 startbit, no parity - No use of handshaking, neither software nor hardware Connection between Digital Game Timer TopMatch Clock and the board: Based on NEC SBI protocol. Adaption of the definition given in the DGT TopMatch documentation. Connector assignments for DGT Electronic Board: See User and Programmers Manual Related to the before mentioned modes, and to piece position information transfer, the following commands to the board are available: 1. DGT_SEND_RESET puts the DGT Board in IDLE mode 2. DGT_SEND_CLK on which the DGT board responds with a DGT_MSG_BWTIME message containing clock information 3. DGT_SEND_BRD on which the DGT Board responds with a DGT_MSG_BOARD_DUMP message containing the actual piece exising of all fields 4. DGT_SEND_UPDATE puts the DGT Board in the UPDATE mode, FRITZ5 compatible 5. DGT_SEND_UPDATE_BRD puts the DGT Board in the UPDATE_BOARD mode 6. DGT_SEND_UPDATE_NICE puts the board in UPDATE mode, however transferring only clocktimes when any time info changed. The DGT_SEND_CLK command and the DGT_SEND_BOARD command do not affect the current board mode: i.e. when in UPDATE mode, it continues sending DGT_SEND_UPDATE messages. Board Identification: Each DGT Electronic Board carries a unique serial number, a EEPROM configuration version number and a embedded program version number. These data are unalterable by the users. Current identification is: "DGT Projects - This DGT board is produced by DGT Projects.\n DGT Projects is a registered trade mark.\n 220798 ISP/bus/8KP/8KE/P6/Fritz5 Vs 1.00. Serial nr. 00137 1.0" The board can be loaded by the user with a non-volatile one-byte bus number, for future use with multiple board configurations. On-board EEPROM: The board carries a 8 kB cyclic non-volatile memory, in which all position changes and clock information is stored during all power-up time. This file can be read and processed. Start of Definitions: ---------------------*/ /* COMMAND CODES FROM PC TO BOARD: */ /* resulting in returning message(s): */ #define DGT_SEND_CLK 0x41 /* results in a DGT_MSG_BWTIME message */ #define DGT_SEND_BRD 0x42 /* results in a DGT_MSG_BOARD_DUMP message */ #define DGT_SEND_UPDATE 0x43 /* results in DGT_MSG_FIELD_UPDATE messages and DGT_MSG_BWTIME messages as long as the board is in UPDATE mode */ #define DGT_SEND_UPDATE_BRD 0x44 /* results in DGT_MSG_FIELD_UPDATE messages as long as the board is in UPDATE_BOARD mode */ #define DGT_RETURN_SERIALNR 0x45 /* results in a DGT_MSG_SERIALNR message */ #define DGT_RETURN_BUSADRES 0x46 /* results in a DGT_MSG_BUSADRES message */ #define DGT_SEND_TRADEMARK 0x47 /* results in a DGT_MSG_TRADEMARK message */ #define DGT_SEND_VERSION 0x4d /* results in a DGT_MSG_VERSION message */ #define DGT_SEND_UPDATE_NICE 0x4b /* results in DGT_MSG_FIELD_UPDATE messages and DGT_MSG_BWTIME messages, the latter only at time changes, as long as the board is in UPDATE_NICE mode*/ #define DGT_SEND_EE_MOVES 0x49 /* results in a DGT_MSG_EE_MOVES message */ /* not resulting in returning messages: */ #define DGT_SEND_RESET 0x40 /* puts the board in IDLE mode, cancelling any UPDATE mode */ /* DESCRIPTION OF THE MESSAGES FROM BOARD TO PC A message consists of three header bytes: MESSAGE ID one byte, MSB (MESSAGE BIT) always 1 MSB of MESSAGE SIZE one byte, MSB always 0, carrying D13 to D7 of the total message length, including the 3 header byte LSB of MESSAGE SIZE one byte, MSB always 0, carrying D6 to D0 of the total message length, including the 3 header bytes followed by the data: 0 to ((2 EXP 14) minus 3) data bytes, of which the MSB is always zero. */ /* DEFINITION OF THE BOARD-TO-PC MESSAGE ID CODES and message descriptions */ /* the Message ID is the logical OR of MESSAGE_BIT and ID code */ #define MESSAGE_BIT 0x80 /* ID codes: */ #define DGT_NONE 0x00 #define DGT_BOARD_DUMP 0x06 #define DGT_BWTIME 0x0d #define DGT_FIELD_UPDATE 0x0e #define DGT_EE_MOVES 0x0f #define DGT_BUSADRES 0x10 #define DGT_SERIALNR 0x11 #define DGT_TRADEMARK 0x12 #define DGT_VERSION 0x13 /* Macros for message length coding (to avoid MSB set to 1) */ #define BYTE char #define LLL_SEVEN(a) ((BYTE)(a&0x7f)) /* 0000 0000 0111 1111 */ #define LLH_SEVEN(a) ((BYTE)((a & 0x3F80)>>7)) /* 0011 1111 1000 0000 */ /* DGT_MSG_BOARD_DUMP is the message that follows on a DGT_SEND_BOARD command */ #define DGT_MSG_BOARD_DUMP (MESSAGE_BIT|DGT_BOARD_DUMP) #define DGT_SIZE_BOARD_DUMP 67 /* message format: byte 0: DGT_MSG_BOARD_DUMP byte 1: LLH_SEVEN(DGT_SIZE_BOARD_DUMP) (=0 fixed) byte 2: LLL_SEVEN(DGT_SIZE_BOARD_DUMP) (=67 fixed) byte 3-66: Pieces on position 0-63 Board fields are numbered from 0 to 63, row by row, in normal reading sequence. When the connector is on the left hand, counting starts at the top left square. The board itself does not rotate the numbering, when black instead of white plays with the clock/connector on the left hand. In non-rotated board use, the field numbering is as follows: Field A8 is numbered 0 Field B8 is numbered 1 Field C8 is numbered 2 .. Field A7 is numbered 8 .. Field H1 is numbered 63 So the board always numbers the black edge field closest to the connector as 57. Piece codes for chess pieces: */ #define EMPTY 0x00 #define WPAWN 0x01 #define WROOK 0x02 #define WKNIGHT 0x03 #define WBISHOP 0x04 #define WKING 0x05 #define WQUEEN 0x06 #define BPAWN 0x07 #define BROOK 0x08 #define BKNIGHT 0x09 #define BBISHOP 0x0a #define BKING 0x0b #define BQUEEN 0x0c #define PIECE1 0x0d /* future use: pointing device in rest */ #define PIECE2 0x0e /* future use: pointing device right button */ #define PIECE3 0x0f /* future use: pointing device left button */ /* message format DGT_MSG_BWTIME */ #define DGT_MSG_BWTIME (MESSAGE_BIT|DGT_BWTIME) #define DGT_SIZE_BWTIME 10 /* byte 0: DGT_MSG_BWTIME byte 1: LLH_SEVEN(DGT_SIZE_BWTIME) (=0 fixed) byte 2: LLL_SEVEN(DGT_SIZE_BWTIME) (=10 fixed) byte 3: D4: 1 = Flag fallen for left player, and clock blocked to zero 0 = not the above situation D5: 1 = Time per move indicator on for left player ( i.e. Bronstein, Fischer) 0 = Time per move indicator off for left player D6: 1 = Left players flag fallen and indicated on display 0 = not the above situation (D7 is MSB) D0-D3: Hours (units, 0-9 Binary coded) white player (or player at the A side of the board) byte 4: Minutes (0-59, BCD coded) byte 5: Seconds (0-59, BCD coded) byte 6-8: the same for the other player byte 9: Clock status byte: 7 bits D0 (LSB): 1 = Clock running 0 = Clock stopped by Start/Stop D1: 1 = tumbler position high on (white) player (front view: \ , left side high) 0 = tumbler position high on the other player (front view: /, right side high) D2: 1 = Battery low indication on display 0 = no battery low indication on display D3: 1 = Black players turn 0 = not black players turn D4: 1 = White players turn 0 = not white players turn D5: 1 = No clock connected; reading invalid 0 = clock connected, reading valid D6: not used (read as 0) D7: Always 0 The function of the information bits are derived from the full information as described in the programmers reference manual for the DGT TopMatch */ /* message format DGT_MSG_FIELD_UPDATE: */ #define DGT_MSG_FIELD_UPDATE (MESSAGE_BIT|DGT_FIELD_UPDATE) #define DGT_SIZE_FIELD_UPDATE 5 /* byte 0: DGT_MSG_FIELD_UPDATE byte 1: LLH_SEVEN(DGT_SIZE_FIELD_UPDATE) (=0 fixed) byte 2: LLL_SEVEN(DGT_SIZE_FIELD_UPDATE) (=5 fixed) byte 3: field number (0-63) which changed the piece code byte 4: piece code including EMPTY, where a non-empty field became empty */ /* message format: DGT_MSG_TRADEMARK which returns a trade mark message */ #define DGT_MSG_TRADEMARK (MESSAGE_BIT|DGT_TRADEMARK) /* byte 0: DGT_MSG_TRADEMARK byte 1: LLH_SEVEN(DGT_SIZE_TRADEMARK) byte 2: LLL_SEVEN(DGT_SIZE_TRADEMARK) byte 3-end: ASCII TRADEMARK MESSAGE, codes 0 to 0x3F The value of DGT_SIZE_TRADEMARK is not known beforehand, and may be in the range of 0 to 256 Current trade mark message: ... */ /* Message format DGT_MSG_BUSADRES return message with bus adres */ #define DGT_MSG_BUSADRES (MESSAGE_BIT|DGT_BUSADRES) #define DGT_SIZE_BUSADRES 5 /* byte 0: DGT_MSG_BUSADRES byte 1: LLH_SEVEN(DGT_SIZE_BUSADRES) byte 2: LLL_SEVEN(DGT_SIZE_BUSADRES) byte 3,4: Busadres in 2 bytes of 7 bits hexadecimal value Byte 3: 0bbb bbbb with bus adres MSB 7 bits byte 4: 0bbb bbbb with bus adres LSB 7 bits The value of the 14-bit busadres is het hexadecimal representation of the (decimal coded) serial number i.e. When the serial number is "01025 1.0" the busadres will be byte 3: 0000 1000 (0x08) byte 4: 0000 0001 (0x01) */ /* Message format DGT_MSG_SERIALNR return message with bus adres */ #define DGT_MSG_SERIALNR (MESSAGE_BIT|DGT_SERIALNR) #define DGT_SIZE_SERIALNR 12 /* returns 5 ASCII decimal serial number + space + 3 byte version string: */ /* byte 0-5 serial number string, sixth byte is LSByte */ /* byte 6: space */ /* byte 7-9: Internal storage version nr: format "1.0" */ /* Message format DGT_MSG_EE_MOVES, which is the contens of the storage array */ /* Message format DGT_MSG_VERSION return message with bus adres */ #define DGT_MSG_VERSION (MESSAGE_BIT|DGT_VERSION) #define DGT_SIZE_VERSION 5 /* byte 0: DGT_MSG_VERSION byte 1: LLH_SEVEN(DGT_SIZE_VERSION) byte 2: LLL_SEVEN(DGT_SIZE_VERSION) byte 3,4: Version in 2 bytes of 7 bits hexadecimal value Byte 3: 0bbb bbbb with main version number MSB 7 bits byte 4: 0bbb bbbb with sub version number LSB 7 bits The value of the version is coded in binary i.e. When the number is "1.02" the busadres will be byte 3: 0000 0001 (0x01) byte 4: 0000 0010 (0x02) */ #define DGT_MSG_EE_MOVES (MESSAGE_BIT|DGT_EE_MOVES) /* DGT_SIZE_EE_MOVES is defined in dgt_ee1.h: current (0x2000-0x100+3) */ /* message format: byte 0: DGT_MSG_EE_MOVES byte 1: LLH_SEVEN(DGT_SIZE_EE_MOVES) byte 2: LLL_SEVEN(DGT_SIZE_EE_MOVES) byte 3-end: field change storage stream: See defines below for contens The DGT_MSG_EE_MOVES message contains the contens of the storage, starting with the oldest data, until the last written changes, and will always end with EE_EOF */ /* Description of the EEPROM data storage and dump format ------------------------------------------------------ General: The internal EEPROM storage can be seen as a cyclic buffer with length 0x1f00 bytes, with one pointer, pointing to the last written byte in the buffer.















