Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F102526535
led.c
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Feb 21, 16:05
Size
3 KB
Mime Type
text/x-c
Expires
Sun, Feb 23, 16:05 (2 d)
Engine
blob
Format
Raw Data
Handle
24344053
Attached To
R6617 Oncilla SBCP Master Firmware
led.c
View Options
#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
Log In to Comment