Learning by doing: Reading books and trying to understand the (code) examples
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

101 lines
1.9 KiB

#include "LedDriver.h"
#include "../util/RuntimeError.h"
enum {ALL_LEDS_ON = ~0x0000, ALL_LEDS_OFF = ~ALL_LEDS_ON};
enum {FIRST_LED = 1, LAST_LED = 16};
static uint16_t *ledsAddress = NULL; // LEDs memory register location
static uint16_t ledsImage; // internal variable to store LEDs state
static uint16_t convertLedNumberToBit(int ledNumber) {
return 1 << (ledNumber - 1);
}
static bool IsLedOutOfBound(int ledNumber) {
return (ledNumber < 1) || (ledNumber > 16);
}
static void SetLedImageBit(int ledNumber) {
ledsImage |= convertLedNumberToBit(ledNumber);
}
static void ClearLedImageBit(int ledNumber) {
ledsImage &= ~(convertLedNumberToBit(ledNumber));
}
static void updateHardware(void) {
if(ledsAddress == NULL) {
RUNTIME_ERROR("LED Driver: NULL pointer access", -1);
return;
}
*ledsAddress = ledsImage;
}
void LedDriver_Create(uint16_t *address) {
if(address == NULL) {
RUNTIME_ERROR("LED Driver: NULL pointer access", -1);
return;
}
ledsAddress = address;
ledsImage = ALL_LEDS_OFF;
updateHardware();
}
void LedDriver_Destroy(void) {
}
void LedDriver_TurnOn(int ledNumber) {
if (IsLedOutOfBound(ledNumber)) {
RUNTIME_ERROR("LED Driver: out-of-bounds LED", -1);
return;
}
SetLedImageBit(ledNumber);
updateHardware();
}
void LedDriver_TurnAllOn(void) {
ledsImage = ALL_LEDS_ON;
updateHardware();
}
void LedDriver_TurnOff(int ledNumber) {
if (IsLedOutOfBound(ledNumber)) {
RUNTIME_ERROR("LED Driver: out-of-bounds LED", -1);
return;
}
ClearLedImageBit(ledNumber);
updateHardware();
}
void LedDriver_TurnAllOff(void) {
ledsImage = ALL_LEDS_OFF;
updateHardware();
}
bool LedDriver_IsOn(int ledNumber) {
if(IsLedOutOfBound(ledNumber)) {
return false;
}
return ledsImage & 1 << (ledNumber - 1);
}
bool LedDriver_IsOff(int ledNumber) {
return !(LedDriver_IsOn(ledNumber));
}