#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include "rcs_prnt.hh"
#include "emcglb.h"
#include "sim.h"
#include "inifile.h"
Include dependency graph for simdio.c:
Go to the source code of this file.
Data Structures | |
struct | sim_dio_config |
Defines | |
#define | USE_STAT_FILES |
#define | NAMELEN 8 |
#define | SIM_DIO_INPUT_BYTES 4 |
#define | SIM_DIO_OUTPUT_BYTES 4 |
#define | SIM_DIO_MAX_INPUTS (SIM_DIO_INPUT_BYTES * 8) |
#define | SIM_DIO_MAX_OUTPUTS (SIM_DIO_OUTPUT_BYTES * 8) |
#define | SIM_MAX_POS_FIELDS 20 |
#define | SIM_MAX_AXIS 8 |
Functions | |
char | __attribute__ ((unused)) ident[]="$Id |
int | btostr (char *s, unsigned char b) |
int | readPositionFile (int index, const char *filename) |
int | simDioIniLoad (const char *filename) |
void | printDioOutputs (void) |
int | simDioInit (const char *filename) |
int | simDioQuit () |
int | simDioMaxInputs () |
int | simDioMaxOutputs () |
int | current_pos_in_field (int index) |
int | simDioRead (int index, int *value) |
int | simDioWrite (int index, int value) |
int | simDioCheck (int index, int *value) |
int | simDioByteRead (int index, unsigned char *byte) |
int | simDioShortRead (int index, unsigned short *sh) |
int | simDioWordRead (int index, unsigned int *word) |
int | simDioByteWrite (int index, unsigned char byte) |
int | simDioShortWrite (int index, unsigned short sh) |
int | simDioWordWrite (int index, unsigned int word) |
int | simDioByteCheck (int index, unsigned char *byte) |
int | simDioShortCheck (int index, unsigned short *sh) |
int | simDioWordCheck (int index, unsigned int *word) |
Variables | |
sim_dio_config | dio_config [SIM_DIO_MAX_INPUTS] |
const char * | posDelimiters = " \t\r\n" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 49 of file simdio.c. 00049 : simdio.c,v 1.9 2001/06/29 20:27:29 wshackle Exp $"; 00050 00051 /* 00052 digital IO model 00053 00054 Provides for simulated digital ins, outs 00055 */ 00056 00057 #define SIM_DIO_INPUT_BYTES 4 /* bytes of digital ins */ 00058 #define SIM_DIO_OUTPUT_BYTES 4 /* bytes of digital outs */ 00059 00060 #define SIM_DIO_MAX_INPUTS (SIM_DIO_INPUT_BYTES * 8) 00061 #define SIM_DIO_MAX_OUTPUTS (SIM_DIO_OUTPUT_BYTES * 8) 00062 00063 /* the actual digital ins, outs */ 00064 00065 static unsigned char simDioInputs[SIM_DIO_INPUT_BYTES]; 00066 static unsigned char simDioOutputs[SIM_DIO_OUTPUT_BYTES]; 00067 00068 #define SIM_MAX_POS_FIELDS 20 00069 00070 #ifndef SIM_MAX_AXIS 00071 #define SIM_MAX_AXIS 8 00072 #endif 00073 00074 struct sim_dio_position_field { 00075 int start_axis_flags; // Which fields to compare/ignore in end pos 00076 int end_axis_flags; // Which fields to compare/ignore in end pos 00077 double start_pos[SIM_MAX_AXIS]; 00078 double end_pos[SIM_MAX_AXIS]; 00079 }; |
|
|
|
Definition at line 292 of file simdio.c. Referenced by simDioRead().
00293 { 00294 int i,j; 00295 int in_this_field; 00296 00297 if (index < 0 || 00298 index >= SIM_DIO_MAX_INPUTS) 00299 { 00300 return -1; 00301 } 00302 00303 if( dio_config[index].number_of_position_fields > SIM_MAX_POS_FIELDS) 00304 { 00305 dio_config[index].number_of_position_fields = SIM_MAX_POS_FIELDS; 00306 return -1; 00307 } 00308 00309 00310 for(j = 0; j < dio_config[index].number_of_position_fields; j++) 00311 { 00312 in_this_field = 1; 00313 for( i = 0; i < SIM_MAX_AXIS; i++) 00314 { 00315 if( 00316 simPos[i] < dio_config[index].pos_field[j].start_pos[i] && 00317 (dio_config[index].pos_field[j].start_axis_flags & (1 << i)) 00318 ) 00319 { 00320 in_this_field = 0; 00321 break; 00322 } 00323 if( 00324 simPos[i] > dio_config[index].pos_field[j].end_pos[i] && 00325 (dio_config[index].pos_field[j].end_axis_flags & (1 << i)) 00326 ) 00327 { 00328 in_this_field = 0; 00329 break; 00330 } 00331 } 00332 if(in_this_field) 00333 { 00334 return 1; 00335 } 00336 } 00337 return 0; 00338 } |
|
Definition at line 250 of file simdio.c. Referenced by simDioByteWrite(), simDioShortWrite(), simDioWordWrite(), and simDioWrite().
00251 { 00252 #if !defined(rtlinux) && !defined(rtai) 00253 int t; 00254 char byteString[9]; 00255 00256 if (EMC_DEBUG & EMC_DEBUG_IO_POINTS) { 00257 for (t = SIM_DIO_OUTPUT_BYTES - 1; t >= 0; t--) { 00258 btostr(byteString, simDioOutputs[t]); 00259 rcs_print("%s ", byteString); 00260 } 00261 rcs_print("\n"); 00262 } 00263 #endif 00264 } |
|
Definition at line 114 of file simdio.c. Referenced by simDioIniLoad().
00115 { 00116 FILE *f; 00117 int pos_fields_read; 00118 int axis; 00119 char *token; 00120 char linebuf[256]; 00121 00122 f = fopen(filename,"r"); 00123 if(NULL == f) 00124 { 00125 return -1; 00126 } 00127 00128 pos_fields_read = 0; 00129 while(!feof(f) && pos_fields_read < SIM_MAX_POS_FIELDS) 00130 { 00131 dio_config[index].pos_field[pos_fields_read].start_axis_flags = 0; 00132 dio_config[index].pos_field[pos_fields_read].end_axis_flags = 0; 00133 00134 fgets(linebuf,256,f); 00135 while(NULL != strchr("#;\r\n \t",linebuf[0])) 00136 { 00137 fgets(linebuf,256,0); 00138 if(feof(f)) 00139 { 00140 break; 00141 } 00142 } 00143 token = strtok(linebuf,posDelimiters); 00144 for(axis = 0; NULL != token && axis < SIM_MAX_AXIS; 00145 axis++, token = strtok(NULL,posDelimiters) ) 00146 { 00147 if(!strcmp(token,"*")) 00148 { 00149 continue; 00150 } 00151 dio_config[index].pos_field[pos_fields_read].start_pos[axis] = 00152 strtod(token,NULL); 00153 dio_config[index].pos_field[pos_fields_read].start_axis_flags |= (1 << axis); 00154 } 00155 fgets(linebuf,256,f); 00156 while(NULL != strchr("#;\r\n \t",linebuf[0])) 00157 { 00158 fgets(linebuf,256,0); 00159 if(feof(f)) 00160 { 00161 break; 00162 } 00163 } 00164 token = strtok(linebuf,posDelimiters); 00165 for(axis = 0; NULL != token && axis < SIM_MAX_AXIS; 00166 axis++, token = strtok(NULL,posDelimiters) ) 00167 { 00168 if(!strcmp(token,"*")) 00169 { 00170 continue; 00171 } 00172 dio_config[index].pos_field[pos_fields_read].end_pos[axis] = 00173 strtod(token,NULL); 00174 dio_config[index].pos_field[pos_fields_read].end_axis_flags |= (1 << axis); 00175 } 00176 pos_fields_read++; 00177 } 00178 00179 dio_config[index].number_of_position_fields = pos_fields_read; 00180 dio_config[index].use_pos_fields =1; 00181 fclose(f); 00182 00183 return 0; 00184 } |
|
Definition at line 530 of file simdio.c. Referenced by extDioByteCheck().
00531 { 00532 if (index < 0 || 00533 index >= SIM_DIO_OUTPUT_BYTES) { 00534 return -1; 00535 } 00536 00537 *byte = simDioOutputs[index]; 00538 00539 return 0; 00540 } |
|
Definition at line 444 of file simdio.c. Referenced by extDioByteRead().
00445 { 00446 if (index < 0 || 00447 index >= SIM_DIO_INPUT_BYTES) { 00448 return -1; 00449 } 00450 00451 *byte = simDioInputs[index]; 00452 00453 return 0; 00454 } |
|
Definition at line 484 of file simdio.c. Referenced by extDioByteWrite().
00485 { 00486 if (index < 0 || 00487 index >= SIM_DIO_INPUT_BYTES) { 00488 return -1; 00489 } 00490 00491 simDioInputs[index] = byte; 00492 00493 printDioOutputs(); 00494 00495 return 0; 00496 } |
|
Definition at line 426 of file simdio.c. Referenced by extDioCheck().
00427 { 00428 int byte; 00429 unsigned char mask = 0x01; 00430 00431 if (index < 0 || 00432 index >= SIM_DIO_MAX_INPUTS) { 00433 return -1; 00434 } 00435 00436 byte = index / 8; 00437 mask <<= index % 8; 00438 00439 *value = (simDioOutputs[byte] & mask) == 0 ? 0 : 1; 00440 00441 return 0; 00442 } |
|
Definition at line 186 of file simdio.c. Referenced by simDioInit().
00187 { 00188 FILE *f; 00189 const char *inistring; 00190 char section[40]; 00191 int i; 00192 int byte; 00193 unsigned char mask = 0x01; 00194 00195 // open it 00196 if( (f = fopen(filename,"r")) == NULL) { 00197 return -1; 00198 } 00199 00200 for( i = 0; i < SIM_DIO_MAX_INPUTS; i++) 00201 { 00202 sprintf(section,"SIM_DIO_%d",i); 00203 00204 dio_config[i].use_stat_file = 0; 00205 dio_config[i].use_pos_fields = 0; 00206 dio_config[i].polarity = 0; 00207 00208 if (NULL != (inistring = iniFind(f,"POLARITY", section))) 00209 { 00210 if (1 != sscanf(inistring, "%i", &dio_config[i].polarity)) 00211 { 00212 dio_config[i].polarity = 0; 00213 } 00214 byte = i / 8; 00215 mask <<= i % 8; 00216 if(dio_config[i].polarity) 00217 { 00218 simDioInputs[byte] |= mask; 00219 } 00220 else 00221 { 00222 simDioInputs[byte] &= ~mask; 00223 } 00224 } 00225 00226 if (NULL != (inistring = iniFind(f,"USE_STAT_FILE", section))) 00227 { 00228 // copy to global 00229 if (1 != sscanf(inistring, "%i", &dio_config[i].use_stat_file)) 00230 { 00231 dio_config[i].use_stat_file = 0; 00232 } 00233 } 00234 if (NULL != (inistring = iniFind(f,"POSITION_FILE", section))) 00235 { 00236 readPositionFile(i,inistring); 00237 } 00238 00239 } 00240 00241 fclose(f); 00242 00243 return 0; 00244 } |
|
Definition at line 266 of file simdio.c. Referenced by __attribute__().
00267 { 00268 #if !defined(rtlinux) && !defined(rtai) 00269 printf("simDioInit(%s)\n",filename); 00270 simDioIniLoad(filename); 00271 #endif 00272 00273 return 0; 00274 } |
|
Definition at line 281 of file simdio.c. Referenced by extDioMaxInputs().
00282 { 00283 return SIM_DIO_MAX_INPUTS; 00284 } |
|
Definition at line 286 of file simdio.c. Referenced by extDioMaxOutputs().
00287 { 00288 return SIM_DIO_MAX_OUTPUTS; 00289 } |
|
Definition at line 276 of file simdio.c. Referenced by extDioQuit().
00277 { 00278 return 0; 00279 } |
|
Definition at line 342 of file simdio.c. Referenced by extDioRead().
00343 { 00344 int byte; 00345 unsigned char mask = 0x01; 00346 #ifdef USE_STAT_FILES 00347 struct stat buf; 00348 char diFile[NAMELEN]; 00349 #endif 00350 00351 if (index < 0 || 00352 index >= SIM_DIO_MAX_INPUTS) { 00353 return -1; 00354 } 00355 00356 byte = index / 8; 00357 mask <<= index % 8; 00358 00359 #ifdef USE_STAT_FILES 00360 if(dio_config[index].use_stat_file) { 00361 /* to test Digital IO logic, this code tests for the existence 00362 of file "di<n>" for home switch on axis n. 00363 During controller debug, touch these files to create them 00364 and the controller should see the corresponding input go high. */ 00365 00366 #ifndef UNDER_CE 00367 sprintf(diFile, "di%d", index); 00368 #else 00369 strcpy(diFile,"di"); 00370 _itoa(index, diFile+2,10); 00371 #endif 00372 00373 if (0 == stat(diFile, &buf) == dio_config[index].polarity) 00374 { 00375 /* file exists */ 00376 simDioInputs[byte] |= mask; 00377 } 00378 else 00379 { 00380 simDioInputs[byte] &= ~mask; 00381 } 00382 } 00383 else if(dio_config[index].use_pos_fields) { 00384 if(current_pos_in_field(index) == dio_config[index].polarity) 00385 { 00386 simDioInputs[byte] |= mask; 00387 } 00388 else 00389 { 00390 simDioInputs[byte] &= ~mask; 00391 } 00392 } 00393 #endif 00394 00395 00396 *value = (simDioInputs[byte] & mask) == 0 ? 0 : 1; 00397 00398 return 0; 00399 } |
|
Definition at line 542 of file simdio.c. Referenced by extDioShortCheck().
00543 { 00544 index *= sizeof(unsigned short); /* convert to byte index */ 00545 00546 if (index < 0 || 00547 index >= SIM_DIO_OUTPUT_BYTES) { 00548 return -1; 00549 } 00550 00551 *sh = * ((unsigned short *) &simDioOutputs[index]); 00552 00553 return 0; 00554 } |
|
Definition at line 456 of file simdio.c. Referenced by extDioShortRead().
00457 { 00458 index *= sizeof(unsigned short); /* convert to byte index */ 00459 00460 if (index < 0 || 00461 index >= SIM_DIO_INPUT_BYTES) { 00462 return -1; 00463 } 00464 00465 *sh = *((unsigned short *) &simDioInputs[index]); 00466 00467 return 0; 00468 } |
|
Definition at line 498 of file simdio.c. Referenced by extDioShortWrite().
00499 { 00500 index *= sizeof(unsigned short); /* convert to byte index */ 00501 00502 if (index < 0 || 00503 index >= SIM_DIO_INPUT_BYTES) { 00504 return -1; 00505 } 00506 00507 *((unsigned short *) &simDioInputs[index]) = sh; 00508 00509 printDioOutputs(); 00510 00511 return 0; 00512 } |
|
Definition at line 556 of file simdio.c. Referenced by extDioWordCheck().
00557 { 00558 index *= sizeof(unsigned int); /* convert to byte index */ 00559 00560 if (index < 0 || 00561 index >= SIM_DIO_OUTPUT_BYTES) { 00562 return -1; 00563 } 00564 00565 *word = * ((unsigned int *) &simDioOutputs[index]); 00566 00567 return 0; 00568 } |
|
Definition at line 470 of file simdio.c. Referenced by extDioWordRead().
00471 { 00472 index *= sizeof(unsigned int); /* convert to byte index */ 00473 00474 if (index < 0 || 00475 index >= SIM_DIO_INPUT_BYTES) { 00476 return -1; 00477 } 00478 00479 *word = *((unsigned int *) &simDioInputs[index]); 00480 00481 return 0; 00482 } |
|
Definition at line 514 of file simdio.c. Referenced by extDioWordWrite().
00515 { 00516 index *= sizeof(unsigned int); /* convert to byte index */ 00517 00518 if (index < 0 || 00519 index >= SIM_DIO_INPUT_BYTES) { 00520 return -1; 00521 } 00522 00523 *((unsigned int *) &simDioInputs[index]) = word; 00524 00525 printDioOutputs(); 00526 00527 return 0; 00528 } |
|
Definition at line 401 of file simdio.c. Referenced by extDioWrite().
00402 { 00403 int byte; 00404 unsigned char mask = 0x01; 00405 00406 if (index < 0 || 00407 index >= SIM_DIO_MAX_OUTPUTS) { 00408 return -1; 00409 } 00410 00411 byte = index / 8; 00412 mask <<= index % 8; 00413 00414 if (value) { 00415 simDioOutputs[byte] |= mask; 00416 } 00417 else { 00418 simDioOutputs[byte] &= ~mask; 00419 } 00420 00421 printDioOutputs(); 00422 00423 return 0; 00424 } |
|
|
|
|