X-Git-Url: http://rtime.felk.cvut.cz/gitweb/mf624-simulink.git/blobdiff_plain/fe9f98d8a7161325b59676f5a3f9e205b1c9a4b1..3426e8bcd6d22d6cee1203bbd2a63c3c55bd4009:/sfAnalogOutput.c diff --git a/sfAnalogOutput.c b/sfAnalogOutput.c index aec11cf..d6d89a8 100644 --- a/sfAnalogOutput.c +++ b/sfAnalogOutput.c @@ -88,8 +88,8 @@ static void mdlInitializeSizes(SimStruct *S) ssSetNumSampleTimes(S, 1); ssSetNumRWork(S, 0); - ssSetNumIWork(S, 1); - ssSetNumPWork(S, 1); + ssSetNumIWork(S, 0); + ssSetNumPWork(S, 0); ssSetNumModes(S, 0); ssSetNumNonsampledZCs(S, 0); @@ -146,31 +146,10 @@ static void mdlInitializeSampleTimes(SimStruct *S) */ static void mdlStart(SimStruct *S) { - //TODO: get pointer to mfst state structure and store it in pwork - #define TEST - #if defined(TEST) - #define BUFF_SMALL 32 - mf624_state_t* mfst = malloc(sizeof(mf624_state_t)); - char buff[BUFF_SMALL]; - memset(buff, '\0', BUFF_SMALL); - mfst->uio_dev = "uio0"; - - strncat(buff, "/dev/", 5); - strncat(buff, mfst->uio_dev, sizeof(buff) - 6); - - mfst->device_fd = open_device(buff); - if (mfst->device_fd < 0) { - ssSetErrorStatus(S,"open failed"); - return; - } - if (mmap_regions(mfst) < 0) { - ssSetErrorStatus(S,"mmap_regions failed"); - return; - } - + if (mf624_init(NULL) != 0) + return; DAC_enable(mfst); - ssSetPWorkValue(S, 0, mfst); - #endif + //ssSetPWorkValue(S, 0, mfst); } #endif /* MDL_START */ @@ -184,8 +163,12 @@ static void mdlInitializeSampleTimes(SimStruct *S) static void mdlOutputs(SimStruct *S, int_T tid) { const real_T *u = (const real_T*) ssGetInputPortSignal(S,0); - mf624_state_t* mfst = ssGetPWorkValue(S,0); + //mf624_state_t* mfst = ssGetPWorkValue(S,0); int out; + + if (mf624_check(S) != 0) + return; + if(u[0] > 9.9988){ out = 0x3FFF; } @@ -195,8 +178,7 @@ static void mdlOutputs(SimStruct *S, int_T tid) else { out = (int) ((u[0] + 10) * 8192 / 10 + 0.5); } - printf("tik\n"); - DAC_write(mfst, DA0, out); + mf624_write16(out, MFST2REG(mfst, 2, dac_channel2reg[(int)CHNL_PRM(S)-1])); } @@ -239,10 +221,16 @@ static void mdlOutputs(SimStruct *S, int_T tid) */ static void mdlTerminate(SimStruct *S) { - #if defined(TEST) - free(ssGetPWorkValue(S,0)); - #endif - + //mf624_state_t* mfst = ssGetPWorkValue(S,0); + if (mf624_check(NULL) != 0) + return; + + /*At the end of simulation disable D/A outputs*/ + mf624_write32((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) + & ~GPIOC_DACEN_mask), // disable output, + MFST2REG(mfst, 0, GPIOC_reg)); + + mf624_done(); }