void SendSim900(uint8_t* msg) { if (FRTOS1_xSemaphoreTake(DataSendMutex,SHELL_SEND_MUTEX_WAIT_MS) == pdTRUE) { UTIL1_strcpy(buf_send, BUFFER_SIZE, msg); flag_send = TRUE; FRTOS1_xSemaphoreGive(DataSendMutex); } }
/* measure and return the microseconds */ uint16_t US_Measure_us(void) { int timeout; FRTOS1_xSemaphoreTake(mutexHandle, portMAX_DELAY); usDevice.signalState = US_SIGNAL_OK; /* default state */ /* send 10us pulse on TRIG line. */ TRIG_SetVal(usDevice.trigDevice); WAIT1_Waitus(10); usDevice.state = ECHO_TRIGGERED; TU_US_Enable(usDevice.echoDevice); TRIG_ClrVal(usDevice.trigDevice); timeout = 30; /* timout in ms */ while(usDevice.state!=ECHO_FINISHED) { /* measure echo pulse */ if (usDevice.state==ECHO_OVERFLOW) { /* measurement took too long? */ usDevice.signalState = US_SIGNAL_NO_ECHO; break; /* no echo, error case */ } WAIT1_WaitOSms(1); timeout--; if (timeout==0) { usDevice.signalState = US_SIGNAL_TIMEOUT; break; } } /* while */ if (usDevice.state==ECHO_FINISHED) { usDevice.lastValue_us = (usDevice.capture*1000UL)/(TU_US_CNT_INP_FREQ_U_0/1000); usDevice.signalState = US_SIGNAL_OK; } else { usDevice.lastValue_us = 0; /* error case */ } usDevice.state = ECHO_IDLE; FRTOS1_xSemaphoreGive(mutexHandle); return usDevice.lastValue_us; }
/* measure and return the microseconds */ uint16_t US_Measure_us(void) { int timeout; FRTOS1_xSemaphoreTake(mutexHandle, portMAX_DELAY); /* send 10us pulse on TRIG line. */ TRIG_SetVal(usDevice.trigDevice); WAIT1_Waitus(10); usDevice.state = ECHO_TRIGGERED; TRIG_ClrVal(usDevice.trigDevice); timeout = 30; while(usDevice.state!=ECHO_FINISHED && timeout>0) { /* measure echo pulse */ if (usDevice.state==ECHO_OVERFLOW) { /* measurement took too long? */ usDevice.state = ECHO_IDLE; /* go back to idle */ break; /* no echo, error case */ } WAIT1_WaitOSms(1); timeout--; } /* while */ if (usDevice.state==ECHO_FINISHED) { usDevice.lastValue_us = (usDevice.capture*1000UL)/(TU_US_CNT_INP_FREQ_U_0/1000); } else { usDevice.lastValue_us = 0; /* error case */ } usDevice.state = ECHO_IDLE; FRTOS1_xSemaphoreGive(mutexHandle); return usDevice.lastValue_us; }
static portTASK_FUNCTION(vSlaveTask, pvParameters) { xSemaphoreHandle sem; sem = (xSemaphoreHandle)pvParameters; for(;;) { if (sem != NULL) { if (FRTOS1_xSemaphoreTake(sem, portMAX_DELAY)==pdTRUE) { LED3_Neg(); } } } }
bool ReadSim900(uint8_t* bfr) { bool res; if (FRTOS1_xSemaphoreTake(DataReceivedMutex, SHELL_RECEIVE_MUTEX_WAIT_MS) == pdTRUE) { res = flag_rcv; flag_rcv = FALSE; if (res) { UTIL1_strcpy(bfr, BUFFER_SIZE, buf_rcv); } FRTOS1_xSemaphoreGive(DataReceivedMutex); } return res; }
static portTASK_FUNCTION(vSlaveTask, pvParameters) { /*! \todo Implement functionality */ xSemaphoreHandle sem; sem = (xSemaphoreHandle)pvParameters; for(;;) { if (sem != NULL) { if (FRTOS1_xSemaphoreTake(sem, portMAX_DELAY)==pdTRUE) { LED1_Neg(); } } } }
void REF_Init(void) { #if REF_START_STOP_CALIB FRTOS1_vSemaphoreCreateBinary(REF_StartStopSem); if (REF_StartStopSem==NULL) { /* semaphore creation failed */ for(;;){} /* error */ } (void)FRTOS1_xSemaphoreTake(REF_StartStopSem, 0); /* empty token */ FRTOS1_vQueueAddToRegistry(REF_StartStopSem, "RefStartStopSem"); #endif refState = REF_STATE_INIT; timerHandle = RefCnt_Init(NULL); /*! \todo You might need to adjust priority or other task settings */ if (FRTOS1_xTaskCreate(ReflTask, "Refl", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL) != pdPASS) { for(;;){} /* error */ } }
static void REF_MeasureRaw(SensorTimeType raw[NOF_SENSORS]) { uint8_t cnt; /* number of sensor */ uint8_t i; TMOUT1_CounterHandle timeout; FRTOS1_xSemaphoreTake(mutexHandle, portMAX_DELAY); if (ledON) { LED_IR_On(); /* IR LED's on */ WAIT1_Waitus(200); } for(i=0;i<NOF_SENSORS;i++) { SensorFctArray[i].SetOutput(); /* turn I/O line as output */ SensorFctArray[i].SetVal(); /* put high */ raw[i] = MAX_SENSOR_VALUE; } WAIT1_Waitus(20); /* give at least 10 us to charge the capacitor */ timeout = TMOUT1_GetCounter(20/TMOUT1_TICK_PERIOD_MS); /* set up timeout counter */ FRTOS1_vTaskSuspendAll(); (void)TU1_ResetCounter(timerHandle); /* reset timer counter */ for(i=0;i<NOF_SENSORS;i++) { SensorFctArray[i].SetInput(); /* turn I/O line as input */ } do { cnt = 0; if (TMOUT1_CounterExpired(timeout)) { break; /* get out of wile loop */ } for(i=0;i<NOF_SENSORS;i++) { if (raw[i]==MAX_SENSOR_VALUE) { /* not measured yet? */ if (SensorFctArray[i].GetVal()==0) { raw[i] = TU1_GetCounterValue(timerHandle); } } else { /* have value */ cnt++; } } } while(cnt!=NOF_SENSORS); TMOUT1_LeaveCounter(timeout); FRTOS1_xTaskResumeAll(); if (ledON) { LED_IR_Off(); /* IR LED's off */ WAIT1_Waitus(200); } FRTOS1_xSemaphoreGive(mutexHandle); }
static void REF_StateMachine(void) { int i; switch (refState) { case REF_STATE_INIT: #if PL_CONFIG_EST { SensorCalibT *ptr; ptr = (SensorCalibT*)NVMC_GetReflectanceData(); if (ptr!=NULL) { /* valid data */ SensorCalibMinMax = *ptr; refState = REF_STATE_READY; } else { refState = REF_STATE_NOT_CALIBRATED; } } #else SHELL_SendString((unsigned char*)"INFO: No calibration data present.\r\n"); refState = REF_STATE_NOT_CALIBRATED; #endif break; case REF_STATE_NOT_CALIBRATED: REF_MeasureRaw(SensorRaw); /*! \todo Add a new event to your event module...*/ #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_START_CALIBRATION; } #endif break; case REF_STATE_START_CALIBRATION: SHELL_SendString((unsigned char*)"start calibration...\r\n"); for(i=0;i<REF_NOF_SENSORS;i++) { SensorCalibMinMax.minVal[i] = MAX_SENSOR_VALUE; SensorCalibMinMax.maxVal[i] = 0; SensorCalibrated[i] = 0; } refState = REF_STATE_CALIBRATING; break; case REF_STATE_CALIBRATING: REF_CalibrateMinMax(SensorCalibMinMax.minVal, SensorCalibMinMax.maxVal, SensorRaw); #if PL_CONFIG_HAS_BUZZER startBuzzer(Middle,200); #endif #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_STOP_CALIBRATION; } #endif break; case REF_STATE_STOP_CALIBRATION: SHELL_SendString((unsigned char*)"...stopping calibration.\r\n"); #if PL_CONFIG_EST if (NVMC_SaveReflectanceData(&SensorCalibMinMax, sizeof(SensorCalibMinMax))!=ERR_OK) { SHELL_SendString((unsigned char*)"Flashing calibration data FAILED!\r\n"); } else { SHELL_SendString((unsigned char*)"Stored calibration data.\r\n"); } #endif refState = REF_STATE_READY; break; case REF_STATE_READY: REF_Measure(); #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_START_CALIBRATION; } #endif break; } /* switch */ }
bool SEM_takeRS_sem(void){ return FRTOS1_xSemaphoreTake(MySem,portMAX_DELAY); }
static void REF_StateMachine(void) { int i; switch (refState) { case REF_STATE_INIT: #if NVM_ENABLED refState = REF_GetCalibData(); #else refState = REF_STATE_NOT_CALIBRATED; SHELL_SendString("INFO: Sensor not calibrated"); #endif break; case REF_STATE_NOT_CALIBRATED: REF_MeasureRaw(SensorRaw); /*! \todo Add a new event to your event module...*/ #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_START_CALIBRATION; } #endif break; case REF_STATE_START_CALIBRATION: SHELL_SendString((unsigned char*)"start calibration...\r\n"); for(i=0;i<REF_NOF_SENSORS;i++) { SensorCalibMinMax.minVal[i] = MAX_SENSOR_VALUE; SensorCalibMinMax.maxVal[i] = 0; SensorCalibrated[i] = 0; } refState = REF_STATE_CALIBRATING; break; case REF_STATE_CALIBRATING: REF_CalibrateMinMax(SensorCalibMinMax.minVal, SensorCalibMinMax.maxVal, SensorRaw); #if PL_CONFIG_HAS_BUZZER (void)BUZ_Beep(300, 20); #endif #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_STOP_CALIBRATION; } #endif break; case REF_STATE_STOP_CALIBRATION: SHELL_SendString((unsigned char*)"...stopping calibration.\r\n"); #if NVM_ENABLED SHELL_SendString((unsigned char*)"saving calib data...\r\n"); REF_SaveCalibData(); #endif refState = REF_STATE_READY; break; case REF_STATE_READY: REF_Measure(); #if REF_START_STOP_CALIB if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) { refState = REF_STATE_START_CALIBRATION; } #endif break; } /* switch */ }