summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/linuxaldl.c36
-rw-r--r--src/linuxaldl.h23
-rw-r--r--src/linuxaldl_definitions.h2
3 files changed, 37 insertions, 24 deletions
diff --git a/src/linuxaldl.c b/src/linuxaldl.c
index 8ffc4be..d898ac6 100644
--- a/src/linuxaldl.c
+++ b/src/linuxaldl.c
@@ -114,9 +114,9 @@ int main(int argc, const char* argv[]){
}
poptFreeContext(popt_aldl); // free the popt context
- // ========================================================================
- // CONNECT / VERIFY ALDL INTERFACE
- // ========================================================================
+ // =======================================================
+ // CONNECT / VERIFY ALDL INTERFACE
+ // =======================================================
// Establish a connection to the aldl
// ===================================
@@ -131,16 +131,27 @@ int main(int argc, const char* argv[]){
return -1;
}
- // set the custom baud rate:
- // the ALDL interface operates at 8192. it would be preferable to get as close to this
- // baud rate as possible. if it cannot be set; it should still work at the standard
- // baud rate of 9600; the framing errors aren't excessive enough to cause problems,
- // and will be caught by bad checksums.
+ /* Set custom baud rate:
+ ALDL has two variants;
+ 1) 160 baud with non-RS232 framing. Clock up to 1600 baud
+ and take one byte from each bit to get us the 8 data bits
+ plus one start and one stop bit.
+ 2) 8192 baud with RS232 framing.
+
+ Prefer to set exact baud rate if possible, but they are non-standard
+ PC datarates..
+
+ 8192 should work at 9600; the packets are short enough that framing
+ errors should be minimal and checksums will catch them anyway.
+ */
+
+ aldl_settings.customrate = 1;
if (set_custom_baud_rate(aldl_settings.faldl, aldl_settings.definition->ideal_baudrate)!=0) {
fprintf(stderr," Couldn't set baud rate to %d. Using standard rate (%d).\n",
aldl_settings.definition->ideal_baudrate,
aldl_settings.definition->basic_baudrate);
fprintf(stderr," There may be framing errors.\n");
+ aldl_settings.customrate = 0;
}
// verify the aldl
@@ -175,9 +186,9 @@ int main(int argc, const char* argv[]){
}
- // ========================================================================
- // CLEANUP (FLUSH SERIAL LINE, CLOSE PORT)
- // ========================================================================
+ // ============================================================
+ // CLEANUP (FLUSH SERIAL LINE, CLOSE PORT)
+ // ============================================================
// discard any unwritten data
tcflush(aldl_settings.faldl, TCIOFLUSH);
@@ -253,7 +264,7 @@ int send_aldl_message(char* msg_buf, unsigned int size)
// so that mode 8 isn't even required.
int get_mode1_message(char* inbuffer, unsigned int size)
{
- int res;
+ int res = 0;
char outbuffer[__MAX_REQUEST_SIZE]; // max request size defined in linuxaldl_definitions.h
aldl_definition* def = aldl_settings.definition;
@@ -287,6 +298,7 @@ int get_mode1_message(char* inbuffer, unsigned int size)
seq, 3, 0,
aldl_settings.scan_timeout*1000);
} else {
+ /* Wait for Framing START ? */
// XXX what sequence to match for 160baud rate?
}
diff --git a/src/linuxaldl.h b/src/linuxaldl.h
index 02c87b1..c1e457e 100644
--- a/src/linuxaldl.h
+++ b/src/linuxaldl.h
@@ -120,7 +120,7 @@ typedef struct _linuxaldl_definition {
// message is the 4th byte onward, this should be 3. (1+3 = 4)
byte_def_t* mode1_def; // pointer to start of table of byte_def_t structs.
- // the last element must be LINUXALDL_MODE1_END_DEF
+ // the last element must be LINUXALDL_MODE1_END_DEF
char mode8_request[__MAX_REQUEST_SIZE]; // the mode 8 (silence) request message, incl checksum
unsigned int mode8_request_length; // the length of the mode 8 message incl checksum
@@ -141,31 +141,32 @@ typedef struct _linuxaldl_settings
{
/* Configuration fields */
const char* aldlportname; // path to aldl interface port
- const char* logfilename; // filename for the log file
- const char* aldldefname; // name for the ALDL definition to be used
+ const char* logfilename; // filename for the log file
+ const char* aldldefname; // name for the ALDL definition to be used
unsigned int scan_interval; // msec between scan requests
unsigned int scan_timeout; // msec to timeout on scan request.
- // note that read-sequence takes timeout in usec. // usec = msec*1000
+ // note that read-sequence takes timeout in usec.
+ // usec = msec*1000
/* Data definitions */
aldl_definition** aldl_definition_table; // array of pointers to data definitions. (see linuxaldl_definitions.h)
/* Runtime stuff */
- int faldl; // aldl serial interface file descriptor
+ int customrate; // 1 if we are using accurate datarate.
+ int faldl; // aldl serial interface file descriptor
int flogfile; // file descriptor for log file
- int scanning; // 1 when the timer has been set for making scans, otherwise 0.
+ int scanning; // 1 when the timer has been set for making scans, otherwise 0.
aldl_definition* definition; // see linuxaldl_definitions.h
char* data_set_raw; // the current/most recent set of data from a mode1 message.
// this is allocated when a definition is selected
- char** data_set_strings; // pointer to array of data set in string format.
- // allocated when a definition is selected in the GUI
-
- float* data_set_floats; // data set in float format
- // allocated when a definition is selected in the GUI
+ char** data_set_strings;// pointer to array of data set in string format.
+ // allocated when a definition is selected in the GUI
+ float* data_set_floats; // data set in float format
+ // allocated when a definition is selected in the GUI
} linuxaldl_settings;
// function prototypes
diff --git a/src/linuxaldl_definitions.h b/src/linuxaldl_definitions.h
index b939fce..f18035e 100644
--- a/src/linuxaldl_definitions.h
+++ b/src/linuxaldl_definitions.h
@@ -255,7 +255,7 @@ aldl_definition aldl_9A = { .mask = "9A",
.mode1_data_offset = 1,
.mode1_def = aldl_9A_mode1,
.basic_baudrate = B4800,
- .ideal_baudrate = 160,
+ .ideal_baudrate = 1600, /* ie basic baud rate / 3 */
};
/* Definition table */