/*! * @Brief enable the trigger source of LPTimer */ void init_trigger_source(uint32_t adcInstance) { uint32_t freqUs; lptmr_user_config_t lptmrUserConfig = { .timerMode = kLptmrTimerModeTimeCounter, .freeRunningEnable = false, .prescalerEnable = false, // bypass perscaler #if (CLOCK_INIT_CONFIG == CLOCK_VLPR) // use MCGIRCCLK, 4M or 32KHz .prescalerClockSource = kClockLptmrSrcMcgIrClk, #else // Use LPO clock 1KHz .prescalerClockSource = kClockLptmrSrcLpoClk, #endif .isInterruptEnabled = false }; // Init LPTimer driver LPTMR_DRV_Init(0, &gLPTMRState, &lptmrUserConfig); // Set the LPTimer period freqUs = 1000000U/(INPUT_SIGNAL_FREQ*NR_SAMPLES)*2; LPTMR_DRV_SetTimerPeriodUs(0, freqUs); // Start the LPTimer LPTMR_DRV_Start(0); // Configure SIM for ADC hw trigger source selection #if defined(KM34Z7_SERIES) SIM_HAL_EnableClock(gSimBase[0], kSimClockGateXbar0); SIM_HAL_SetAdcTrgSelMode(gSimBase[0], kSimAdcTrgSelXbar); XBAR_DRV_ConfigSignalConnection(kXbaraInputLPTMR0_Output, kXbaraOutputADC_TRGA); #else SIM_HAL_SetAdcAlternativeTriggerCmd(gSimBase[0], adcInstance, true); SIM_HAL_SetAdcPreTriggerMode(gSimBase[0], adcInstance, kSimAdcPretrgselA); SIM_HAL_SetAdcTriggerMode(gSimBase[0], adcInstance, kSimAdcTrgSelLptimer); #endif } /*! * @Brief disable the trigger source */ void deinit_trigger_source(uint32_t adcInstance) { LPTMR_DRV_Stop(0); LPTMR_DRV_Deinit(0); }
/*! * @Brief enable the trigger source of LPTimer */ void init_trigger_source(uint32_t adcInstance) { uint32_t freqUs; lptmr_user_config_t lptmrUserConfig = { .timerMode = kLptmrTimerModeTimeCounter, .freeRunningEnable = false, .prescalerEnable = false, // bypass perscaler .prescalerClockSource = kClockLptmrSrcMcgIrClk, // use MCGIRCCLK, 4M or 32KHz .isInterruptEnabled = false }; // Init LPTimer driver LPTMR_DRV_Init(0, &lptmrUserConfig, &gLPTMRState); // Set the LPTimer period freqUs = 1000000U/(INPUT_SIGNAL_FREQ*NR_SAMPLES)*2; LPTMR_DRV_SetTimerPeriodUs(0, freqUs); // Start the LPTimer LPTMR_DRV_Start(0); // Configure SIM for ADC hw trigger source selection SIM_HAL_SetAdcAlternativeTriggerCmd(gSimBase[0], adcInstance, true); SIM_HAL_SetAdcPreTriggerMode(gSimBase[0], adcInstance, kSimAdcPretrgselA); SIM_HAL_SetAdcTriggerMode(gSimBase[0], adcInstance, kSimAdcTrgSelLptimer); } /*! * @Brief disable the trigger source */ void deinit_trigger_source(uint32_t adcInstance) { LPTMR_DRV_Stop(0); LPTMR_DRV_Deinit(0); }
void Application() { uint32_t minutes=0, hours=0, samples=0, arrayIndex=0; static state_t currentState = RECEIVE_CONFIG; static uint32_t sendPeriodHours, samplesPerHour,minutesLeaveIdle; static uint32_t distanceSamplesArray[MAX_ALLOWED_SEND_PERIOD_HOURS]; static message_t messageType = SAMPLES; static uint16_t distance; static uint8_t HTTP_BUFFER[256]; static float temperature; static SIM800L_error_t exitCode; static MMA8451_state_t boardState; uint8_t fullAlarmSent = 0, fireAlarmSent = 0, fallAlarmSent = 0; while(1) { switch(currentState) { case RECEIVE_CONFIG: RECEIVE_CONFIG_TASK(&sendPeriodHours,&samplesPerHour,&minutesLeaveIdle); currentState = IDLE; break; case IDLE: LPTMR_DRV_SetTimerPeriodUs(LPTMR_0_IDX,LPTMR_INTERRUPT_PERIOD_US); LPTMR_DRV_Start(LPTMR_0_IDX); CONSOLE_INIT(); CONSOLE_SEND("TO IDLE...\r\n",12); /*PROCESSOR IN LOW POWER MODE*/ POWER_SYS_SetWakeupModule(kLlwuWakeupModule0,true); if( POWER_SYS_SetMode(1,kPowerManagerPolicyAgreement) != kPowerManagerSuccess) { GPIO_DRV_ClearPinOutput(LEDRGB_RED); } /*AFTER LLWU INTERRUPT*/ GPIO_DRV_TogglePinOutput(LEDRGB_BLUE); minutes++; currentState = MEASURE_TEMPERATURE; break; case MEASURE_TEMPERATURE: /*EVERY MINUTE*/ LM35_INIT(); temperature = LM35_GET_TEMPERATURE_CELSIUS(); LM35_DEINIT(); MMA8451Q_INIT(); /*TIME TO MEASURE DISTANCE*/ if(minutes == minutesLeaveIdle) { minutes=0; currentState = MEASURE_DISTANCE; } else { currentState = IDLE; } /*CONTAINER FALL*/ if ( (boardState = MMA8451_GET_STATE(MMA8451_VERTICAL)) == MMA8451_FALL) { if(!fallAlarmSent) { messageType = FALL_ALARM; currentState = SEND_DATA; } } else { /*CONTAINER AGAIN IN ITS RIGHT PLACE*/ if(fallAlarmSent) { fallAlarmSent = 0; } } /*EXTREME CASE: SET FIRE ALARM*/ if(temperature > TEMPERATURE_THRESHOLD) { if(!fireAlarmSent) { messageType = FIRE_ALARM; currentState = SEND_DATA; } } else { /*TEMPERATURE WENT DOWN*/ if(fireAlarmSent) { fireAlarmSent = 0; } } break; case MEASURE_DISTANCE: MB7360_INIT(); MB7360_START_RANGING(); distance = MB7360_GET_DISTANCE_MM(); MB7360_DEINIT(); /*ONE HOUR LAPSE*/ if (++samples == samplesPerHour) { samples = 0; distanceSamplesArray[arrayIndex++] = distance; /*SEND PERIOD HOUR LAPSE: TIME TO SEND DATA*/ if(++hours == sendPeriodHours) { hours = 0; arrayIndex = 0; LPTMR_DRV_Stop(LPTMR_0_IDX); messageType = SAMPLES; currentState = SEND_DATA; } else { currentState = IDLE; } } else { currentState = IDLE; } /*EXTREME CASE: SET FULL ALARM*/ if(distance < DISTANCE_THRESHOLD) { if(!fullAlarmSent) { messageType = FULL_ALARM; currentState = SEND_DATA; } } else { /*COINTAINER EMPTY AGAIN, PREPARE FOR NEXT FULL ALARM*/ if(fullAlarmSent) { fullAlarmSent = 0; } } break; case SEND_DATA: switch( exitCode = SEND_DATA_GPRS_TASK(messageType, distanceSamplesArray,sendPeriodHours) ) { case SIM800L_SUCCESS_GPRS: switch(messageType) { case SAMPLES: CONSOLE_SEND("SAMPLES SENT - GPRS\r\n",21); break; case FULL_ALARM: CONSOLE_SEND("FULL ALARM SENT - GPRS\r\n",24); fullAlarmSent = 1; break; case FIRE_ALARM: CONSOLE_SEND("FIRE ALARM SENT - GPRS\r\n",24); fireAlarmSent = 1; break; case FALL_ALARM: CONSOLE_SEND("FALL ALARM SENT - GPRS\r\n",24); fallAlarmSent = 1; break; default: break; } break; case SIM800L_NO_GPRS: switch( exitCode = SEND_DATA_SMS_TASK(messageType, distanceSamplesArray,sendPeriodHours)) { case SIM800L_SUCCESS_SMS: switch(messageType) { case SAMPLES: CONSOLE_SEND("SAMPLES SENT - SMS\r\n",2); break; case FULL_ALARM: CONSOLE_SEND("FULL ALARM SENT - SMS\r\n",23); fullAlarmSent = 1; break; case FIRE_ALARM: CONSOLE_SEND("FIRE ALARM SENT - SMS\r\n",23); fireAlarmSent = 1; break; case FALL_ALARM: CONSOLE_SEND("FALL ALARM SENT - SMS\r\n",23); fallAlarmSent = 1; break; default: break; } break; default: CONSOLE_SEND("COULD NOT SEND SMS\r\n",20); break; } break; /*NO GPRS OR SMS*/ default: CONSOLE_SEND("COULD NOT SEND DATA\r\n",21); break; } currentState = IDLE; break; default: break; } } }