Page MenuHomec4science

led.c
No OneTemporary

File Metadata

Created
Fri, Feb 21, 16:05
#include <p33Fxxxx.h>
#include "led.h"
#define NB_LEDS 4
#define PORT_LED_GREEN_1 _LATB14 ///< Set state of LED G1.
#define PORT_LED_GREEN_1_TOGGLE (PORT_LEDG ^= 1) ///< Toggles LED G1 state.
#define PORT_LED_GREEN_1_READ _RB14 ///< Read LED G1 state.
#define PORT_LED_YELLOW _LATB15 ///< Set state of LED Y.
#define PORT_LED_YELLOW_TOGGLE (PORT_LEDA ^= 1) ///< Toggles LED Y state.
#define PORT_LED_YELLOW_READ _RB15 ///< Read LED Y state.
#define PORT_LED_GREEN_2 _LATA0 ///< Set state of LED G2.
#define PORT_LED_GREEN_2_TOGGLE (PORT_LEDB ^= 1) ///< Toggles LED G2 state.
#define PORT_LED_GREEN_2_READ _RA0 ///< Read LED G2 state.
#define PORT_LED_RED _LATA1 ///< Set state of LED R.
#define PORT_LED_RED_TOGGLE (PORT_LEDC ^= 1) ///< Toggles LED R state.
#define PORT_LED_RED_READ _RA1 ///< Read LED R state.
#define DEFAULT_HALF_PERIOD 125
enum led_state {
LED_OFF = 0x00,
LED_ON = 0x01,
LED_BLINKING = 0x02,
};
struct led_def{
const led_id id;
volatile enum led_state state;
volatile unsigned int ticks_per_half_period;
unsigned int nb_ticks;
volatile unsigned int nb_blink;
unsigned int current_nb_blinks;
};
typedef struct led_def led_definition;
led_definition leds[NB_LEDS] = {
{LED_GREEN_1, LED_ON , DEFAULT_HALF_PERIOD,0, 1, 0},
{LED_YELLOW , LED_OFF, DEFAULT_HALF_PERIOD,0, 2, 0},
{LED_GREEN_2, LED_OFF, DEFAULT_HALF_PERIOD,0, 4, 0},
{LED_RED , LED_OFF, DEFAULT_HALF_PERIOD,0, 1, 0}
};
void led_compute_and_apply_state(led_id id,
unsigned int nb_ticks) {
unsigned char led_should_be_on = 0;
switch (leds[id].state) {
case LED_OFF :
led_should_be_on = 0;
break;
case LED_ON:
led_should_be_on = 1;
break;
case LED_BLINKING : {
leds[id].nb_ticks += nb_ticks;
if (leds[id].nb_ticks < leds[id].ticks_per_half_period) {
led_should_be_on = 1;
} else if (leds[id].nb_ticks >= 2 * leds[id].ticks_per_half_period) {
leds[id].nb_ticks -= 2 * leds[id].ticks_per_half_period;
++leds[id].current_nb_blinks;
led_should_be_on = 1;
} else {
led_should_be_on = 0;
}
if (leds[id].current_nb_blinks >= leds[id].nb_blink) {
led_should_be_on = 0;
}
if (leds[id].current_nb_blinks == 2 * leds[id].nb_blink) {
leds[id].current_nb_blinks = 0;
}
break;
}
default:
break;
}
switch(id){
case LED_GREEN_1 :
PORT_LED_GREEN_1 = led_should_be_on;
break;
case LED_YELLOW:
PORT_LED_YELLOW = led_should_be_on;
break;
case LED_GREEN_2:
PORT_LED_GREEN_2 = led_should_be_on;
break;
case LED_RED :
PORT_LED_RED = led_should_be_on;
break;
default :
break;
}
}
void led_init(){
unsigned int i= 0;
for(; i < NB_LEDS; ++i) {
led_compute_and_apply_state(i,0);
}
}
void led_main(unsigned int nb_ticks){
unsigned int i = 0;
for(; i < NB_LEDS ; ++ i){
led_compute_and_apply_state(i,nb_ticks);
}
}
void led_on(led_id id){
leds[id].state = LED_ON;
}
void led_off(led_id id){
leds[id].state = LED_OFF;
}
void led_toggle(led_id id){
leds[id].state = leds[id].state == LED_OFF ? LED_ON : LED_OFF;
}
void led_blink(led_id id) {
led_definition * led = &(leds[id]);
if(led->state == LED_BLINKING) {
return;
}
led->current_nb_blinks = 0;
led->nb_ticks = 0;
led->state = LED_BLINKING;
}
void led_blink_with_params(led_id id,
unsigned int nb_blink) {
led_definition * led = &(leds[id]);
led->nb_blink = nb_blink;
led_blink(id);
}

Event Timeline