LCOV - code coverage report
Current view: top level - src/AH/Hardware/LEDs - LEDs.hpp (source / functions) Hit Total Coverage
Test: 169c36a3797bc662d84b5726f34a3f37d3c58247 Lines: 23 24 95.8 %
Date: 2024-11-09 15:32:27 Functions: 17 19 89.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* ✔ */
       2             : 
       3             : #pragma once
       4             : 
       5             : #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
       6             : 
       7             : BEGIN_AH_NAMESPACE
       8             : 
       9             : /**
      10             :  * @brief   A class for collections of LEDs that can display ranges.
      11             :  * 
      12             :  * @tparam  N
      13             :  *          The number of LEDs in the collection.
      14             :  * 
      15             :  * @ingroup AH_HardwareUtils
      16             :  */
      17             : template <uint16_t N>
      18             : class LEDs {
      19             :   public:
      20             :     /**
      21             :      * @brief   Create a LEDs object.
      22             :      * 
      23             :      * @param   ledPins
      24             :      *          An array of pins with the LEDs connected.
      25             :      */
      26           3 :     LEDs(const PinList<N> &ledPins) : ledPins(ledPins) {}
      27             : 
      28             :     /**
      29             :      * @brief   Initialize (set LED pins as outputs).
      30             :      */
      31           3 :     void begin() const {
      32          24 :         for (const pin_t &pin : ledPins)
      33          21 :             ExtIO::pinMode(pin, OUTPUT);
      34           3 :     }
      35             : 
      36             :     /**
      37             :      * @brief   Turn on a range of the LEDs.
      38             :      * 
      39             :      * @param   startOn
      40             :      *          The first LED of the range to turn on (the LEDs before this one
      41             :      *          are turned off).
      42             :      * @param   startOff
      43             :      *          The first LED after the range to turn off.
      44             :      */
      45           8 :     void displayRange(uint16_t startOn, uint16_t startOff) const {
      46          14 :         for (uint16_t pin = 0; pin < startOn; pin++)
      47           6 :             clear(pin);
      48          31 :         for (uint16_t pin = startOn; pin < startOff; pin++)
      49          23 :             set(pin);
      50          34 :         for (uint16_t pin = startOff; pin < N; pin++)
      51          26 :             clear(pin);
      52           8 :     }
      53             : 
      54             :     /// Turn on the given LED.
      55          23 :     void set(uint16_t index) const {
      56             :         // TODO: bounds check?
      57          23 :         ExtIO::digitalWrite(ledPins[index], HIGH);
      58          23 :     }
      59             : 
      60             :     /// Turn off the given LED.
      61          32 :     void clear(uint16_t index) const {
      62             :         // TODO: bounds check?
      63          32 :         ExtIO::digitalWrite(ledPins[index], LOW);
      64          32 :     }
      65             : 
      66             :     /**
      67             :      * @brief   Turn on a single LED, and turn off all others.
      68             :      * 
      69             :      * @param   led
      70             :      *          The LED to turn on.
      71             :      */
      72           0 :     void displayDot(uint16_t led) const { displayRange(led, led + 1); }
      73             : 
      74             :     /**
      75             :      * @brief   Turn off all LEDs.
      76             :      */
      77           2 :     void clear() const {
      78          12 :         for (pin_t pin : ledPins)
      79          10 :             ExtIO::digitalWrite(pin, LOW);
      80           2 :     }
      81             : 
      82             :   private:
      83             :     const PinList<N> ledPins;
      84             : };
      85             : 
      86             : END_AH_NAMESPACE

Generated by: LCOV version 1.15