00001
00002
00003
00004
00005
00006
00007
00008
00009 #define MAX_RECEIVE_BUFFER 10000
00010 #define TIMEOUT_MS 1000 // timout for message reception
00011
00012
00013 #include <cdm_link.h>
00014
00015 #include <qextserialport.h>
00016 #include <string.h>
00017
00018 #ifdef Q_OS_UNIX
00019 #include <unistd.h>
00020 #endif
00021
00022 static bool serial_ready = false;
00023 static QextSerialPort *port = 0;
00024
00025
00026
00027
00028
00029
00030 cdm_Error cdm_LinkInit(const char *params) {
00031
00032
00033 if (port == 0) {
00034 port = new QextSerialPort();
00035 port->setQueryMode(QextSerialPort::Polling);
00036 serial_ready = false;
00037 }
00038
00039
00040 if (serial_ready) {
00041 port->close();
00042 serial_ready = false;
00043 }
00044
00045
00046 port->setPortName(params);
00047 port->setBaudRate (BAUD9600);
00048 port->setDataBits(DATA_8);
00049 port->setStopBits(STOP_1);
00050 port->setParity(PAR_NONE);
00051 port->setFlowControl(FLOW_OFF);
00052
00053 if (!port->open(QextSerialPort::ReadWrite)) {
00054 return (CD_Error_UnableToOpenLink);
00055 }
00056
00057 serial_ready = true;
00058 return(CD_Error_NoError);
00059 }
00060
00061
00062
00063
00064 cdm_Error cdm_LinkClose(void) {
00065
00066
00067 if (port != 0) {
00068 port->close();
00069 serial_ready = false;
00070 }
00071 return(CD_Error_NoError);
00072 }
00073
00074
00075
00076
00077 cdm_Error cdm_LinkRXStr(char *receive_buffer, int max_bytes, int *received_bytes) {
00078
00079 int bytes_available;
00080
00081 if (!serial_ready) {
00082 return(CD_Error_LinkNotReady);
00083 }
00084
00085 bytes_available = port->bytesAvailable();
00086 if (bytes_available < 0) {
00087 return(CD_Error_LinkNotReady);
00088 }
00089
00090 if (bytes_available > 0) {
00091 if (bytes_available > max_bytes) {
00092 bytes_available = max_bytes;
00093 }
00094 port->read(receive_buffer, bytes_available);
00095 *received_bytes = bytes_available;
00096 } else {
00097 *received_bytes = 0;
00098 }
00099
00100 return(CD_Error_NoError);
00101 }
00102
00103
00104
00105
00106
00107 cdm_Error cdm_LinkTXStr(const char *msg) {
00108
00109 if (!serial_ready) {
00110 return(CD_Error_LinkNotReady);
00111 }
00112
00113 port->write(msg);
00114
00115 return(CD_Error_NoError);
00116 }
00117
00118
00119
00120
00121 static char receive_buffer[MAX_RECEIVE_BUFFER]="";
00122
00123
00124
00125 void cdm_LinkRXClearBuffer(void) {
00126 receive_buffer[0]='\0';
00127 }
00128
00129
00130
00131
00132 cdm_Error cdm_LinkRXMessage(char *message) {
00133
00134 int tmout = TIMEOUT_MS;
00135 int received_bytes;
00136 int len;
00137 cdm_Error cdm_result;
00138
00139 bool end_found;
00140 int end_msg;
00141 bool start_found;
00142 int start_msg;
00143
00144
00145 do {
00146
00147 len = strlen((const char*)receive_buffer);
00148 cdm_result = cdm_LinkRXStr(receive_buffer+len,MAX_RECEIVE_BUFFER-len-1,&received_bytes);
00149 if (cdm_result != CD_Error_NoError) {
00150 return(cdm_result);
00151 }
00152
00153
00154 if (received_bytes == 0) {
00155 #ifdef Q_OS_WIN
00156 Sleep(1);
00157 #else
00158 usleep(1000);
00159 #endif
00160 tmout--;
00161 } else {
00162
00163 receive_buffer[strlen((const char*)receive_buffer)+received_bytes] = '\0';
00164
00165 end_found = false;
00166 for (unsigned int i=0;i<strlen((const char*)receive_buffer);i++) {
00167 if (receive_buffer[i] == MSG_END_CHAR) {
00168 end_msg = i;
00169 end_found = true;
00170 break;
00171 }
00172 }
00173
00174 if (end_found) {
00175 start_found = false;
00176 for (int i=0;i<end_msg;i++) {
00177 if (receive_buffer[i] == MSG_START_CHAR) {
00178 start_msg = i;
00179 start_found = true;
00180 break;
00181 }
00182 }
00183
00184 if (start_found) {
00185
00186 strncpy(message,receive_buffer+start_msg+1,end_msg-start_msg-1);
00187 message[end_msg-start_msg-1] = '\0';
00188 strcpy(receive_buffer,(const char *)(receive_buffer+end_msg+1));
00189 return (CD_Error_NoError);
00190 } else {
00191
00192 strcpy(receive_buffer,(const char*)(receive_buffer+end_msg+1));
00193 }
00194 }
00195
00196 }
00197
00198
00199 } while (tmout);
00200
00201 return(CD_Error_Timeout);
00202 }
00203
00204
00205