blob: eab1cd633ca8e5cc28e592811bac23a20c8b1d0c [file] [log] [blame]
/*
* Copyright (c) 2017 FH Dortmund.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Description:
* A4MCAR Project - Low-level Module Light System Task
*
* Authors:
* M. Ozcelikors <mozcelikors@gmail.com>
*
* Update History:
*
*/
#include "light_system.h"
#include "core_debug.h"
/***
* Function Name: GetLightSystemPeriodsFromLightState
* Function Description : Gets light system pwm on periods for pins p_TH and p_ST
*
* Argument Type Description
* lightstate short int Light state
*
* Returns : {uint32_t on_period_TH, uint32_t on_period_ST}
*/
{uint32_t, uint32_t} GetLightSystemPeriodsFromLightState (short int lightstate)
{
uint32_t on_period_TH, on_period_ST;
switch (lightstate)
{
case 2: //Front and back lights ON
on_period_TH = LIGHTSYSTEM_BRAKELIGHTS_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_BRAKELIGHTS_TH_PERIOD;
break;
case 3: //Front lights Blink
on_period_TH = LIGHTSYSTEM_FRONTBLINK_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_FRONTBLINK_ST_PERIOD;
break;
case 4: //Left lights Blink
on_period_TH = LIGHTSYSTEM_LEFTBLINK_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_LEFTBLINK_ST_PERIOD;
break;
case 5: //Right lights Blink
on_period_TH = LIGHTSYSTEM_RIGHTBLINK_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_RIGHTBLINK_ST_PERIOD;
break;
case 6: //Back-lit lights and piezo beeps
on_period_TH = LIGHTSYSTEM_BRAKELIGHTS_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_BRAKELIGHTS_TH_PERIOD;
break;
case 0: //Warning blink
on_period_TH = LIGHTSYSTEM_WARN_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_WARN_ST_PERIOD;
break;
default: case 1: //Front and back on //Brake lights
on_period_TH = LIGHTSYSTEM_BRAKELIGHTS_TH_PERIOD;
on_period_ST = LIGHTSYSTEM_BRAKELIGHTS_ST_PERIOD;
break;
}
return {on_period_TH, on_period_ST};
}
/***
* Function Name: Task_ControlLightSystem
* Function Description : Task that manages two channel-pwm for ports p_TH and p_ST using the state info from
* lightstate_interface
*
* Argument Type Description
* p_TH port TH port (related to driving) for light system
* p_ST port ST port (related to steering) for light system
* lightstate_inteface server lightstate_if Lightstate server interface to receive light state information
*/
[[combinable]]
void Task_ControlLightSystem (port p_TH, port p_ST, server lightstate_if lightstate_interface)
{
uint32_t overall_pwm_period = LIGHTSYSTEM_PWM_PERIOD ;
uint32_t on_period_TH, on_period_ST;
uint32_t off_period_TH, off_period_ST;
uint32_t time_TH, time_ST;
int port_state_TH = 0;
int port_state_ST = 0;
int toggle_port_TH = 0;
int toggle_port_ST = 0;
timer tmr_TH, tmr_ST;
short int lightstate_val;
PrintCoreAndTileInformation("Task_ControlLightSystem");
//Initialization for some variables
lightstate_val = 1;
{on_period_TH, on_period_ST} = GetLightSystemPeriodsFromLightState (lightstate_val);
off_period_ST = overall_pwm_period - on_period_ST;
off_period_TH = overall_pwm_period - on_period_TH;
//printf("%d %d %d %d", on_period_TH, on_period_ST, off_period_TH, off_period_ST);
while(1)
{
select
{
//Uncomment the following to enable Light System
//Wait for the lightstate value (Event)
/*case lightstate_interface.ShareLightSystemState (short int state):
lightstate_val = state;
//printf("lst = %d\n",lightstate_val);
{on_period_TH, on_period_ST} = GetLightSystemPeriodsFromLightState (lightstate_val);
//calculations
off_period_TH = overall_pwm_period - on_period_TH;
off_period_ST = overall_pwm_period - on_period_ST;
break;*/
//Port p_ST PWM Timer Event
case tmr_ST when timerafter(time_ST) :> void :
tmr_ST :> time_ST;
//PWM Port Toggling
if(port_state_ST == 0)
{
p_ST <: 1;
port_state_ST = 1;
time_ST += on_period_ST; //Extend timer deadline
}
else if(port_state_ST == 1)
{
p_ST <: 0;
port_state_ST = 0;
time_ST += off_period_ST; //Extend timer deadline
}
break;
//Port p_TH PWM Timer Event
case tmr_TH when timerafter(time_TH) :> void :
tmr_TH :> time_TH;
//PWM Port Toggling
if(port_state_TH == 0)
{
p_TH <: 1;
port_state_TH = 1;
time_TH += on_period_TH; //Extend timer deadline
}
else if(port_state_TH == 1)
{
p_TH <: 0;
port_state_TH = 0;
time_TH += off_period_TH; //Extend timer deadline
}
break;
}
}
}