Specifications

20
APPENDIX A. S-FUNCTION C-CODE
ssSetNumInputPorts(S,mxGetN(ChannelList));
for (i = 0; i < mxGetN(ChannelList); i++) {
ssSetInputPortWidth(S,i,1);
}
ssSetNumSampleTimes(S,1);
ssSetNumRWork(S,0);
ssSetNumIWork(S,0);
ssSetNumPWork(S,0);
ssSetNumDWork(S,0);
ssSetNumModes(S,0);
ssSetNumNonsampledZCs(S,0);
#ifndef MATLAB_MEX_FILE
Handle=PdAcquireSubsystem((int)mxGetPr(BoardID)[0]-1, BoardLevel, 1);
if(Handle < 0) {
printf("AO: PdAcquireSubsystem failed\n");
exit(EXIT_FAILURE);}
retVal = PdGetPciConfiguration(Handle, &pciConfig);
if(retVal != 0) {
printf("AO: PdGetPciConfiguration error %d\n", retVal);}
_PdAOutSetCfg(Handle, aoCfg, 0);
if (retVal < 0) {
printf("AO: _PdAOutSetCfg error %d\n", retVal);
exit(EXIT_FAILURE);}
retVal = iopl(3);
if(retVal != 0) {
printf("AO: iopl failed, make sure you have root permission\n");}
if((mem_fd = open("/dev/mem", O_RDWR)) < 0) {
printf("AO: open(/dev/mem) error %d\n", mem_fd);}
bar0Address = mmap(0, 16384, PROT_READ | PROT_WRITE, MAP_SHARED, mem_fd, pciConfig.BaseAddress0);
if(bar0Address == (void*)-1 || bar0Address == NULL) {
printf("AO: mmap error %d\n", (int)bar0Address);}
_PdAOutSwStartTrig(Handle);
if (retVal < 0) {
printf("AO: PdAOutSwStartTrig failed with %d.\n", retVal);
exit(EXIT_FAILURE);}
#endif }
static void mdlInitializeSampleTimes(SimStruct *S) {
ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);
ssSetOffsetTime(S,0,0.0);
}
static void mdlOutputs(SimStruct *S, int_T tid) {
InputRealPtrsType uPtrs;
#ifndef MATLAB_MEX_FILE
for(i=0; i < mxGetN(ChannelList) ; i++) {
uPtrs = ssGetInputPortRealSignalPtrs(S,i);
int ChannelNumber = mxGetPr(ChannelList)[i];
unsigned long value = ((*uPtrs[0])+10.0)/20.0*0xFFFF;
PdUModeAO32Write(ChannelNumber, value);
}
#endif }
static void mdlTerminate(SimStruct *S) { #ifndef MATLAB_MEX_FILE
munmap(bar0Address, mem_fd);
close(mem_fd);
retVal = _PdAOutReset(Handle);
if (retVal < 0) {
printf("AO: PdAOutReset error %d\n", retVal);}
retVal = _PdAO32Reset(Handle);
if (retVal < 0) {
printf("AO: PdAAO32Reset error %d\n", retVal);}