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

  1. #include "LedDriver.h"
  2. #include "../util/RuntimeError.h"
  3. enum {ALL_LEDS_ON = ~0x0000, ALL_LEDS_OFF = ~ALL_LEDS_ON};
  4. enum {FIRST_LED = 1, LAST_LED = 16};
  5. static uint16_t *ledsAddress = NULL; // LEDs memory register location
  6. static uint16_t ledsImage; // internal variable to store LEDs state
  7. static uint16_t convertLedNumberToBit(int ledNumber) {
  8. return 1 << (ledNumber - 1);
  9. }
  10. static bool IsLedOutOfBound(int ledNumber) {
  11. return (ledNumber < 1) || (ledNumber > 16);
  12. }
  13. static void SetLedImageBit(int ledNumber) {
  14. ledsImage |= convertLedNumberToBit(ledNumber);
  15. }
  16. static void ClearLedImageBit(int ledNumber) {
  17. ledsImage &= ~(convertLedNumberToBit(ledNumber));
  18. }
  19. static void updateHardware(void) {
  20. if(ledsAddress == NULL) {
  21. RUNTIME_ERROR("LED Driver: NULL pointer access", -1);
  22. return;
  23. }
  24. *ledsAddress = ledsImage;
  25. }
  26. void LedDriver_Create(uint16_t *address) {
  27. if(address == NULL) {
  28. RUNTIME_ERROR("LED Driver: NULL pointer access", -1);
  29. return;
  30. }
  31. ledsAddress = address;
  32. ledsImage = ALL_LEDS_OFF;
  33. updateHardware();
  34. }
  35. void LedDriver_Destroy(void) {
  36. }
  37. void LedDriver_TurnOn(int ledNumber) {
  38. if (IsLedOutOfBound(ledNumber)) {
  39. RUNTIME_ERROR("LED Driver: out-of-bounds LED", -1);
  40. return;
  41. }
  42. SetLedImageBit(ledNumber);
  43. updateHardware();
  44. }
  45. void LedDriver_TurnAllOn(void) {
  46. ledsImage = ALL_LEDS_ON;
  47. updateHardware();
  48. }
  49. void LedDriver_TurnOff(int ledNumber) {
  50. if (IsLedOutOfBound(ledNumber)) {
  51. RUNTIME_ERROR("LED Driver: out-of-bounds LED", -1);
  52. return;
  53. }
  54. ClearLedImageBit(ledNumber);
  55. updateHardware();
  56. }
  57. void LedDriver_TurnAllOff(void) {
  58. ledsImage = ALL_LEDS_OFF;
  59. updateHardware();
  60. }
  61. bool LedDriver_IsOn(int ledNumber) {
  62. if(IsLedOutOfBound(ledNumber)) {
  63. return false;
  64. }
  65. return ledsImage & 1 << (ledNumber - 1);
  66. }
  67. bool LedDriver_IsOff(int ledNumber) {
  68. return !(LedDriver_IsOn(ledNumber));
  69. }