#include <ttymem.hh>
Inheritance diagram for TTYMEM:
Public Methods | |
TTYMEM (char *bufline, char *procline) | |
virtual | ~TTYMEM () |
void | verify_bufname () |
CMS_STATUS | clear () |
int | check_if_read () |
CMS_STATUS | read () |
CMS_STATUS | blocking_read (double) |
CMS_STATUS | peek () |
CMS_STATUS | write (void *data) |
CMS_STATUS | write_if_read (void *data) |
void | reconnect () |
void | disconnect () |
Protected Attributes | |
RCS_SERIAL_PORT_HANDLE | handle |
char | ttyDevName [80] |
rcs_serial_port_setting | settings |
char | temp_buffer [0x2000] |
int | serial_number |
int | returned_serial_number |
int | message_size |
int | id |
|
Definition at line 15 of file ttymem.cc. 00015 : 00016 CMS (bufline, procline) 00017 { 00018 serial_number = 0; 00019 returned_serial_number = 0; 00020 memset (temp_buffer, 0, 0x2000); 00021 00022 #ifdef UNIX_LIKE_PLAT 00023 char *default_dev_name = "/dev/ttyb"; 00024 #else 00025 char *default_dev_name = "COM2:"; 00026 #endif 00027 00028 char *devNameEq = strstr (procline, "serialPortDevName="); 00029 if (NULL != devNameEq) 00030 { 00031 strncpy (ttyDevName, clean_string (devNameEq + 18, 80), 80); 00032 } 00033 else 00034 { 00035 strncpy (ttyDevName, default_dev_name, 80); 00036 } 00037 00038 handle = open_serial_communications_port (ttyDevName); 00039 if (handle <= 0) 00040 { 00041 status = CMS_MISC_ERROR; 00042 return; 00043 } 00044 settings.baud_rate = 9600; 00045 settings.data_bits = 8; 00046 settings.stop_bits = 1; 00047 settings.use_parity = 0; 00048 00049 if (strstr (bufline, "evenparity")) 00050 { 00051 settings.use_parity = 1; 00052 settings.even_parity = 1; 00053 } 00054 if (strstr (bufline, "oddparity")) 00055 { 00056 settings.use_parity = 1; 00057 settings.even_parity = 0; 00058 } 00059 00060 char *baud_rate_eq = strstr (bufline, "baud_rate="); 00061 if (NULL != baud_rate_eq) 00062 { 00063 settings.baud_rate = atol (baud_rate_eq + 10); 00064 } 00065 char *data_bits_eq = strstr (bufline, "data_bits="); 00066 if (NULL != data_bits_eq) 00067 { 00068 settings.data_bits = atol (data_bits_eq + 10); 00069 } 00070 char *stop_bits_eq = strstr (bufline, "stop_bits="); 00071 if (NULL != stop_bits_eq) 00072 { 00073 settings.stop_bits = atol (stop_bits_eq + 10); 00074 } 00075 if (set_serial_port_configuration (handle, &settings) < 0) 00076 { 00077 status = CMS_MISC_ERROR; 00078 return; 00079 } 00080 verify_bufname (); 00081 } |
|
Definition at line 84 of file ttymem.cc. 00085 { 00086 close_serial_communications_port (handle); 00087 } |
|
Definition at line 91 of file ttymem.cc. Referenced by TTYMEM().
00092 { 00093 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00094 *((u_long *) temp_buffer + 1) = 00095 dl_htonl ((u_long) REMOTE_CMS_GET_BUF_NAME_REQUEST_TYPE); 00096 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00097 if (write_serial_communications_port (handle, temp_buffer, 20) < 0) 00098 { 00099 status = CMS_MISC_ERROR; 00100 return; 00101 } 00102 serial_number++; 00103 if (readn_serial_communications_port (handle, temp_buffer, 40) < 40) 00104 { 00105 status = CMS_MISC_ERROR; 00106 return; 00107 } 00108 returned_serial_number = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00109 if (returned_serial_number != serial_number) 00110 { 00111 rcs_print_error 00112 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00113 returned_serial_number, serial_number); 00114 status = CMS_MISC_ERROR; 00115 return; 00116 } 00117 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00118 if (status < 0) 00119 { 00120 return; 00121 } 00122 if (strncmp (temp_buffer + 8, BufferName, 31)) 00123 { 00124 rcs_print_error 00125 ("TTYMEM: The buffer (%s) is registered with buffer number %d.\n", 00126 ((char *) temp_buffer + 8), buffer_number); 00127 rcs_print_error 00128 ("TTYMEM: However, this process (%s) is attempting to connect to the buffer %s at the same location.\n", 00129 ProcessName, BufferName); 00130 status = CMS_RESOURCE_CONFLICT_ERROR; 00131 return; 00132 } 00133 } |
|
Reimplemented from CMS. Definition at line 511 of file ttymem.cc. 00512 { 00513 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00514 *((u_long *) temp_buffer + 1) = 00515 dl_htonl ((u_long) REMOTE_CMS_CLEAR_REQUEST_TYPE); 00516 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00517 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) current_subdivision); 00518 00519 if (write_serial_communications_port (handle, temp_buffer, 20) < 0) 00520 { 00521 return (status = CMS_MISC_ERROR); 00522 } 00523 serial_number++; 00524 if (readn_serial_communications_port (handle, temp_buffer, 8) < 0) 00525 { 00526 return (status = CMS_MISC_ERROR); 00527 } 00528 returned_serial_number = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00529 if (returned_serial_number != serial_number) 00530 { 00531 rcs_print_error 00532 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00533 returned_serial_number, serial_number); 00534 return (status = CMS_MISC_ERROR); 00535 } 00536 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00537 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 2)); 00538 return (status); 00539 } |
|
Reimplemented from CMS. Definition at line 472 of file ttymem.cc. 00473 { 00474 00475 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00476 *((u_long *) temp_buffer + 1) = 00477 dl_htonl ((u_long) REMOTE_CMS_CHECK_IF_READ_REQUEST_TYPE); 00478 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00479 int send_header_size = 20; 00480 if (total_subdivisions > 1) 00481 { 00482 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) current_subdivision); 00483 } 00484 if (write_serial_communications_port (handle, temp_buffer, send_header_size) 00485 < 0) 00486 { 00487 status = CMS_MISC_ERROR; 00488 return (0); 00489 } 00490 serial_number++; 00491 if (readn_serial_communications_port (handle, temp_buffer, 12) < 0) 00492 { 00493 status = CMS_MISC_ERROR; 00494 return 0; 00495 } 00496 returned_serial_number = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00497 if (returned_serial_number != serial_number) 00498 { 00499 rcs_print_error 00500 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00501 returned_serial_number, serial_number); 00502 return (status = CMS_MISC_ERROR); 00503 } 00504 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00505 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 2)); 00506 return (header.was_read); 00507 } |
|
Reimplemented from CMS. Definition at line 147 of file ttymem.cc. 00148 { 00149 00150 /* Produce error message if process does not have permission to read. */ 00151 if (!read_permission_flag) 00152 { 00153 rcs_print_error ("CMS: %s was not configured to read %s\n", 00154 ProcessName, BufferName); 00155 return (status = CMS_PERMISSIONS_ERROR); 00156 } 00157 00158 00159 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00160 *((u_long *) temp_buffer + 1) = 00161 dl_htonl ((u_long) REMOTE_CMS_READ_REQUEST_TYPE); 00162 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00163 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) CMS_READ_ACCESS); 00164 *((u_long *) temp_buffer + 4) = dl_htonl ((u_long) in_buffer_id); 00165 00166 int send_header_size = 20; 00167 if (total_subdivisions > 1) 00168 { 00169 *((u_long *) temp_buffer + 5) = dl_htonl ((u_long) current_subdivision); 00170 send_header_size = 24; 00171 } 00172 if (write_serial_communications_port (handle, temp_buffer, send_header_size) 00173 < 0) 00174 { 00175 rcs_print_error ("TTYMEM: Can't send READ request to server.\n"); 00176 return (status = CMS_MISC_ERROR); 00177 } 00178 serial_number++; 00179 if (readn_serial_communications_port (handle, temp_buffer, 20) < 0) 00180 { 00181 return (status = CMS_MISC_ERROR); 00182 } 00183 returned_serial_number = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00184 if (returned_serial_number != serial_number) 00185 { 00186 rcs_print_error 00187 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00188 returned_serial_number, serial_number); 00189 return (status = CMS_MISC_ERROR); 00190 } 00191 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00192 message_size = dl_ntohl (*((u_long *) temp_buffer + 2)); 00193 id = dl_ntohl (*((u_long *) temp_buffer + 3)); 00194 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 4)); 00195 if (message_size > max_encoded_message_size) 00196 { 00197 rcs_print_error ("Recieved message is too big. (%ld > %ld)\n", 00198 message_size, max_encoded_message_size); 00199 return (status = CMS_MISC_ERROR); 00200 } 00201 if (message_size > 0) 00202 { 00203 if (readn_serial_communications_port 00204 (handle, (char *) encoded_data, message_size) < 0) 00205 { 00206 return (status = CMS_MISC_ERROR); 00207 } 00208 } 00209 check_id (id); 00210 return (status); 00211 } |
|
Reimplemented from CMS. Definition at line 284 of file ttymem.cc. 00285 { 00286 rcs_print_error (" Can not call blocking_read(%f) when using TTYMEM.\n", 00287 _blocking_timeout); 00288 return (status = CMS_NO_BLOCKING_SEM_ERROR); 00289 } |
|
Reimplemented from CMS. Definition at line 217 of file ttymem.cc. 00218 { 00219 /* Produce error message if process does not have permission to read. */ 00220 if (!read_permission_flag) 00221 { 00222 rcs_print_error ("CMS: %s was not configured to read %s\n", 00223 ProcessName, BufferName); 00224 return (status = CMS_PERMISSIONS_ERROR); 00225 } 00226 00227 00228 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00229 *((u_long *) temp_buffer + 1) = 00230 dl_htonl ((u_long) REMOTE_CMS_READ_REQUEST_TYPE); 00231 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00232 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) CMS_PEEK_ACCESS); 00233 *((u_long *) temp_buffer + 4) = dl_htonl ((u_long) in_buffer_id); 00234 00235 int send_header_size = 20; 00236 if (total_subdivisions > 1) 00237 { 00238 *((u_long *) temp_buffer + 5) = dl_htonl ((u_long) current_subdivision); 00239 send_header_size = 24; 00240 } 00241 if (write_serial_communications_port (handle, temp_buffer, send_header_size) 00242 < 0) 00243 { 00244 rcs_print_error ("TTYMEM: Can't send READ request to server.\n"); 00245 return (status = CMS_MISC_ERROR); 00246 } 00247 serial_number++; 00248 if (readn_serial_communications_port (handle, temp_buffer, 20) < 0) 00249 { 00250 return (status = CMS_MISC_ERROR); 00251 } 00252 returned_serial_number = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00253 if (returned_serial_number != serial_number) 00254 { 00255 rcs_print_error 00256 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00257 returned_serial_number, serial_number); 00258 return (status = CMS_MISC_ERROR); 00259 } 00260 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00261 message_size = dl_ntohl (*((u_long *) temp_buffer + 2)); 00262 id = dl_ntohl (*((u_long *) temp_buffer + 3)); 00263 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 4)); 00264 if (message_size > max_encoded_message_size) 00265 { 00266 rcs_print_error ("Recieved message is too big. (%ld > %ld)\n", 00267 message_size, max_encoded_message_size); 00268 return (status = CMS_MISC_ERROR); 00269 } 00270 if (message_size > 0) 00271 { 00272 if (readn_serial_communications_port 00273 (handle, (char *) encoded_data, message_size) < 0) 00274 { 00275 return (status = CMS_MISC_ERROR); 00276 } 00277 } 00278 check_id (id); 00279 return (status); 00280 } |
|
Reimplemented from CMS. Definition at line 293 of file ttymem.cc. 00294 { 00295 00296 if (!force_raw) 00297 { 00298 user_data = encoded_data; 00299 } 00300 00301 if (!write_permission_flag) 00302 00303 { 00304 rcs_print_error ("CMS: %s was not configured to write to %s\n", 00305 ProcessName, BufferName); 00306 return (status = CMS_PERMISSIONS_ERROR); 00307 } 00308 00309 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00310 *((u_long *) temp_buffer + 1) = 00311 dl_htonl ((u_long) REMOTE_CMS_WRITE_REQUEST_TYPE); 00312 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00313 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) CMS_WRITE_ACCESS); 00314 *((u_long *) temp_buffer + 4) = dl_htonl ((u_long) header.in_buffer_size); 00315 int send_header_size = 20; 00316 if (total_subdivisions > 1) 00317 { 00318 *((u_long *) temp_buffer + 5) = dl_htonl ((u_long) current_subdivision); 00319 send_header_size = 24; 00320 } 00321 if (header.in_buffer_size < 0x2000 - 20 && header.in_buffer_size > 0) 00322 { 00323 memcpy (temp_buffer + send_header_size, user_data, 00324 header.in_buffer_size); 00325 if (write_serial_communications_port 00326 (handle, temp_buffer, header.in_buffer_size + send_header_size) < 0) 00327 { 00328 rcs_print_error 00329 ("TTYMEM: Failed to send message of size %d + header of size %d to the server.\n", 00330 header.in_buffer_size, send_header_size); 00331 return (status = CMS_MISC_ERROR); 00332 } 00333 } 00334 else 00335 { 00336 if (write_serial_communications_port 00337 (handle, temp_buffer, send_header_size) < 0) 00338 { 00339 rcs_print_error ("TTYMEM: Failed to send header to server.\n"); 00340 return (status = CMS_MISC_ERROR); 00341 } 00342 if (header.in_buffer_size > 0) 00343 { 00344 if (write_serial_communications_port 00345 (handle, (char *) user_data, header.in_buffer_size) < 0) 00346 { 00347 return (status = CMS_MISC_ERROR); 00348 } 00349 } 00350 } 00351 serial_number++; 00352 if ((min_compatible_version < 2.58 && min_compatible_version > 1e-6) 00353 || confirm_write) 00354 { 00355 if (readn_serial_communications_port (handle, temp_buffer, 12) < 0) 00356 { 00357 return (status = CMS_MISC_ERROR); 00358 } 00359 returned_serial_number = 00360 (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00361 if (returned_serial_number != serial_number) 00362 { 00363 rcs_print_error 00364 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00365 returned_serial_number, serial_number); 00366 return (status = CMS_MISC_ERROR); 00367 } 00368 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00369 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 2)); 00370 } 00371 else 00372 { 00373 header.was_read = 0; 00374 status = CMS_WRITE_OK; 00375 returned_serial_number = serial_number; 00376 } 00377 return (status); 00378 } |
|
Reimplemented from CMS. Definition at line 383 of file ttymem.cc. 00384 { 00385 00386 if (!force_raw) 00387 { 00388 user_data = encoded_data; 00389 } 00390 00391 if (!write_permission_flag) 00392 00393 { 00394 rcs_print_error ("CMS: %s was not configured to write to %s\n", 00395 ProcessName, BufferName); 00396 return (status = CMS_PERMISSIONS_ERROR); 00397 } 00398 00399 *((u_long *) temp_buffer) = dl_htonl ((u_long) serial_number); 00400 *((u_long *) temp_buffer + 1) = 00401 dl_htonl ((u_long) REMOTE_CMS_WRITE_REQUEST_TYPE); 00402 *((u_long *) temp_buffer + 2) = dl_htonl ((u_long) buffer_number); 00403 *((u_long *) temp_buffer + 3) = dl_htonl ((u_long) CMS_WRITE_ACCESS); 00404 *((u_long *) temp_buffer + 4) = dl_htonl ((u_long) header.in_buffer_size); 00405 int send_header_size = 20; 00406 if (total_subdivisions > 1) 00407 { 00408 *((u_long *) temp_buffer + 5) = dl_htonl ((u_long) current_subdivision); 00409 send_header_size = 24; 00410 } 00411 if (header.in_buffer_size < 0x2000 - 20 && header.in_buffer_size > 0) 00412 { 00413 memcpy (temp_buffer + send_header_size, user_data, 00414 header.in_buffer_size); 00415 if (write_serial_communications_port 00416 (handle, temp_buffer, header.in_buffer_size + send_header_size) < 0) 00417 { 00418 rcs_print_error 00419 ("TTYMEM: Failed to send message of size %d + header of size %d to the server.\n", 00420 header.in_buffer_size, send_header_size); 00421 return (status = CMS_MISC_ERROR); 00422 } 00423 } 00424 else 00425 { 00426 if (write_serial_communications_port 00427 (handle, temp_buffer, send_header_size) < 0) 00428 { 00429 rcs_print_error ("TTYMEM: Failed to send header to server.\n"); 00430 return (status = CMS_MISC_ERROR); 00431 } 00432 if (header.in_buffer_size > 0) 00433 { 00434 if (write_serial_communications_port 00435 (handle, (char *) user_data, header.in_buffer_size) < 0) 00436 { 00437 return (status = CMS_MISC_ERROR); 00438 } 00439 } 00440 } 00441 serial_number++; 00442 if ((min_compatible_version < 2.58 && min_compatible_version > 1e-6) 00443 || confirm_write) 00444 { 00445 if (readn_serial_communications_port (handle, temp_buffer, 12) < 0) 00446 { 00447 return (status = CMS_MISC_ERROR); 00448 } 00449 returned_serial_number = 00450 (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer)); 00451 if (returned_serial_number != serial_number) 00452 { 00453 rcs_print_error 00454 ("TTYMEM: Returned serial number(%d) does not match expected serial number(%d).\n", 00455 returned_serial_number, serial_number); 00456 return (status = CMS_MISC_ERROR); 00457 } 00458 status = (CMS_STATUS) dl_ntohl (*((u_long *) temp_buffer + 1)); 00459 header.was_read = dl_ntohl (*((u_long *) temp_buffer + 2)); 00460 } 00461 else 00462 { 00463 header.was_read = 0; 00464 status = CMS_WRITE_OK; 00465 returned_serial_number = serial_number; 00466 } 00467 return (status); 00468 } |
|
Reimplemented from CMS. Definition at line 137 of file ttymem.cc. 00138 { 00139 } |
|
Reimplemented from CMS. Definition at line 142 of file ttymem.cc. 00143 { 00144 } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|