diff --git a/Software/src/devboard/safety/safety.cpp b/Software/src/devboard/safety/safety.cpp index 36137fba..a07d3fa9 100644 --- a/Software/src/devboard/safety/safety.cpp +++ b/Software/src/devboard/safety/safety.cpp @@ -26,7 +26,7 @@ void update_machineryprotection() { /* Check if the ESP32 CPU running the Battery-Emulator is too hot. We start with a warning, you can start to see Wifi issues if it becomes too hot If the chip starts to approach the design limit, we perform a graceful shutdown */ - if (datalayer.system.info.CPU_temperature > 80.0f) { + if (datalayer.system.info.CPU_temperature > 87.0f) { set_event(EVENT_CPU_OVERHEATING, 0); } else { clear_event(EVENT_CPU_OVERHEATING); diff --git a/Software/src/devboard/utils/led_handler.cpp b/Software/src/devboard/utils/led_handler.cpp index 9c217a3d..73fefb4d 100644 --- a/Software/src/devboard/utils/led_handler.cpp +++ b/Software/src/devboard/utils/led_handler.cpp @@ -24,7 +24,6 @@ bool led_init(void) { } led = new LED(datalayer.battery.status.led_mode, esp32hal->LED_PIN(), esp32hal->LED_MAX_BRIGHTNESS()); - led->init(); return true; } @@ -57,20 +56,20 @@ void LED::exe(void) { switch (get_event_level()) { case EVENT_LEVEL_INFO: color = led_color::GREEN; - pixels.setPixelColor(0, COLOR_GREEN(brightness)); // Green pulsing LED + pixels.setPixelColor(COLOR_GREEN(brightness)); // Green pulsing LED break; case EVENT_LEVEL_WARNING: color = led_color::YELLOW; - pixels.setPixelColor(0, COLOR_YELLOW(brightness)); // Yellow pulsing LED + pixels.setPixelColor(COLOR_YELLOW(brightness)); // Yellow pulsing LED break; case EVENT_LEVEL_DEBUG: case EVENT_LEVEL_UPDATE: color = led_color::BLUE; - pixels.setPixelColor(0, COLOR_BLUE(brightness)); // Blue pulsing LED + pixels.setPixelColor(COLOR_BLUE(brightness)); // Blue pulsing LED break; case EVENT_LEVEL_ERROR: color = led_color::RED; - pixels.setPixelColor(0, COLOR_RED(esp32hal->LED_MAX_BRIGHTNESS())); // Red LED full brightness + pixels.setPixelColor(COLOR_RED(esp32hal->LED_MAX_BRIGHTNESS())); // Red LED full brightness break; default: break; diff --git a/Software/src/devboard/utils/led_handler.h b/Software/src/devboard/utils/led_handler.h index 60c18d8c..4d8e01ee 100644 --- a/Software/src/devboard/utils/led_handler.h +++ b/Software/src/devboard/utils/led_handler.h @@ -9,16 +9,12 @@ class LED { led_color color = led_color::GREEN; LED(gpio_num_t pin, uint8_t maxBrightness) - : pixels(1, pin, NEO_GRB), - max_brightness(maxBrightness), - brightness(maxBrightness), - mode(led_mode_enum::CLASSIC) {} + : pixels(pin), max_brightness(maxBrightness), brightness(maxBrightness), mode(led_mode_enum::CLASSIC) {} LED(led_mode_enum mode, gpio_num_t pin, uint8_t maxBrightness) - : pixels(1, pin, NEO_GRB), max_brightness(maxBrightness), brightness(maxBrightness), mode(mode) {} + : pixels(pin), max_brightness(maxBrightness), brightness(maxBrightness), mode(mode) {} void exe(void); - void init(void) { pixels.begin(); } private: Adafruit_NeoPixel pixels; diff --git a/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.cpp b/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.cpp index 06e964a0..540890bb 100644 --- a/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.cpp +++ b/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.cpp @@ -1,368 +1,38 @@ -/*! - * @file Adafruit_NeoPixel.cpp - * - * @mainpage Arduino Library for driving Adafruit NeoPixel addressable LEDs, - * FLORA RGB Smart Pixels and compatible devicess -- WS2811, WS2812, WS2812B, - * SK6812, etc. - * - * @section intro_sec Introduction - * - * This is the documentation for Adafruit's NeoPixel library for the - * Arduino platform, allowing a broad range of microcontroller boards - * (most AVR boards, many ARM devices, ESP8266 and ESP32, among others) - * to control Adafruit NeoPixels, FLORA RGB Smart Pixels and compatible - * devices -- WS2811, WS2812, WS2812B, SK6812, etc. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit and open-source hardware by purchasing products - * from Adafruit! - * - * @section author Author - * - * Written by Phil "Paint Your Dragon" Burgess for Adafruit Industries, - * with contributions by PJRC, Michael Miller and other members of the - * open source community. - * - * @section license License - * - * This file is part of the Adafruit_NeoPixel library. - * - * Adafruit_NeoPixel is free software: you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * Adafruit_NeoPixel is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with NeoPixel. If not, see - * . - * - */ +/*Based on the Adafruit Neopixel library, which has been heavily modified to support only 1x RGB LED for lowest possible CPU usage*/ #include "Adafruit_NeoPixel.h" -/*! - @brief NeoPixel constructor when length, pin and pixel type are known - at compile-time. - @param n Number of NeoPixels in strand. - @param p Arduino pin number which will drive the NeoPixel data in. - @param t Pixel type -- add together NEO_* constants defined in - Adafruit_NeoPixel.h, for example NEO_GRB+NEO_KHZ800 for - NeoPixels expecting an 800 KHz (vs 400 KHz) data stream - with color bytes expressed in green, red, blue order per - pixel. - @return Adafruit_NeoPixel object. Call the begin() function before use. -*/ -Adafruit_NeoPixel::Adafruit_NeoPixel(uint16_t n, int16_t p, neoPixelType t) - : begun(false), brightness(0), pixels(NULL), endTime(0) { - updateType(t); - updateLength(n); +extern "C" void espShow(uint16_t pin, uint8_t *pixels, uint8_t numBytes); + +Adafruit_NeoPixel::Adafruit_NeoPixel(int16_t p) : pixels(NULL) { + updateLength(); setPin(p); } -/*! - @brief "Empty" NeoPixel constructor when length, pin and/or pixel type - are not known at compile-time, and must be initialized later with - updateType(), updateLength() and setPin(). - @return Adafruit_NeoPixel object. Call the begin() function before use. - @note This function is deprecated, here only for old projects that - may still be calling it. New projects should instead use the - 'new' keyword with the first constructor syntax (length, pin, - type). -*/ -Adafruit_NeoPixel::Adafruit_NeoPixel() - : - begun(false), numLEDs(0), numBytes(0), pin(-1), brightness(0), - pixels(NULL), rOffset(1), gOffset(0), bOffset(2), wOffset(1), endTime(0) { -} - -/*! - @brief Deallocate Adafruit_NeoPixel object, set data pin back to INPUT. -*/ -Adafruit_NeoPixel::~Adafruit_NeoPixel() { +void Adafruit_NeoPixel::updateLength(void) { free(pixels); - if (pin >= 0) - pinMode(pin, INPUT); + pixels = (uint8_t *)malloc(numBytes); + if (pixels) memset(pixels, 0, numBytes); } -/*! - @brief Configure NeoPixel pin for output. -*/ -void Adafruit_NeoPixel::begin(void) { - if (pin >= 0) { - pinMode(pin, OUTPUT); - digitalWrite(pin, LOW); - } - begun = true; -} - -/*! - @brief Change the length of a previously-declared Adafruit_NeoPixel - strip object. Old data is deallocated and new data is cleared. - Pin number and pixel format are unchanged. - @param n New length of strip, in pixels. - @note This function is deprecated, here only for old projects that - may still be calling it. New projects should instead use the - 'new' keyword with the first constructor syntax (length, pin, - type). -*/ -void Adafruit_NeoPixel::updateLength(uint16_t n) { - free(pixels); // Free existing data (if any) - - // Allocate new data -- note: ALL PIXELS ARE CLEARED - numBytes = n * ((wOffset == rOffset) ? 3 : 4); - if ((pixels = (uint8_t *)malloc(numBytes))) { - memset(pixels, 0, numBytes); - numLEDs = n; - } else { - numLEDs = numBytes = 0; - } -} - -/*! - @brief Change the pixel format of a previously-declared - Adafruit_NeoPixel strip object. If format changes from one of - the RGB variants to an RGBW variant (or RGBW to RGB), the old - data will be deallocated and new data is cleared. Otherwise, - the old data will remain in RAM and is not reordered to the - new format, so it's advisable to follow up with clear(). - @param t Pixel type -- add together NEO_* constants defined in - Adafruit_NeoPixel.h, for example NEO_GRB+NEO_KHZ800 for - NeoPixels expecting an 800 KHz (vs 400 KHz) data stream - with color bytes expressed in green, red, blue order per - pixel. - @note This function is deprecated, here only for old projects that - may still be calling it. New projects should instead use the - 'new' keyword with the first constructor syntax - (length, pin, type). -*/ -void Adafruit_NeoPixel::updateType(neoPixelType t) { - bool oldThreeBytesPerPixel = (wOffset == rOffset); // false if RGBW - - wOffset = (t >> 6) & 0b11; // See notes in header file - rOffset = (t >> 4) & 0b11; // regarding R/G/B/W offsets - gOffset = (t >> 2) & 0b11; - bOffset = t & 0b11; - - // If bytes-per-pixel has changed (and pixel data was previously - // allocated), re-allocate to new size. Will clear any data. - if (pixels) { - bool newThreeBytesPerPixel = (wOffset == rOffset); - if (newThreeBytesPerPixel != oldThreeBytesPerPixel) - updateLength(numLEDs); - } -} - -extern "C" void espShow(uint16_t pin, uint8_t *pixels, uint32_t numBytes); - -/*! - @brief Transmit pixel data in RAM to NeoPixels. - @note On most architectures, interrupts are temporarily disabled in - order to achieve the correct NeoPixel signal timing. This means - that the Arduino millis() and micros() functions, which require - interrupts, will lose small intervals of time whenever this - function is called (about 30 microseconds per RGB pixel, 40 for - RGBW pixels). There's no easy fix for this, but a few - specialized alternative or companion libraries exist that use - very device-specific peripherals to work around it. -*/ -void Adafruit_NeoPixel::show(void) { - - if (!pixels) - return; - - // Data latch = 300+ microsecond pause in the output stream. Rather than - // put a delay at the end of the function, the ending time is noted and - // the function will simply hold off (if needed) on issuing the - // subsequent round of data until the latch time has elapsed. This - // allows the mainline code to start generating the next frame of data - // rather than stalling for the latch. - while (!canShow()) - ; - // endTime is a private member (rather than global var) so that multiple - // instances on different pins can be quickly issued in succession (each - // instance doesn't delay the next). - - // In order to make this code runtime-configurable to work with any pin, - // SBI/CBI instructions are eschewed in favor of full PORT writes via the - // OUT or ST instructions. It relies on two facts: that peripheral - // functions (such as PWM) take precedence on output pins, so our PORT- - // wide writes won't interfere, and that interrupts are globally disabled - // while data is being issued to the LEDs, so no other code will be - // accessing the PORT. The code takes an initial 'snapshot' of the PORT - // state, computes 'pin high' and 'pin low' values, and writes these back - // to the PORT register as needed. - - // NRF52 may use PWM + DMA (if available), may not need to disable interrupt - // ESP32 may not disable interrupts because espShow() uses RMT which tries to acquire locks - - espShow(pin, pixels, numBytes); - - endTime = micros(); // Save EOD time for latch on next call -} - -/*! - @brief Set/change the NeoPixel output pin number. Previous pin, - if any, is set to INPUT and the new pin is set to OUTPUT. - @param p Arduino pin number (-1 = no pin). -*/ void Adafruit_NeoPixel::setPin(int16_t p) { - if (begun && (pin >= 0)) - pinMode(pin, INPUT); // Disable existing out pin + if (pin >= 0) pinMode(pin, INPUT); pin = p; - if (begun) { + if ((p >= 0)) { pinMode(p, OUTPUT); digitalWrite(p, LOW); } } -/*! - @brief Set a pixel's color using separate red, green and blue - components. If using RGBW pixels, white will be set to 0. - @param n Pixel index, starting from 0. - @param r Red brightness, 0 = minimum (off), 255 = maximum. - @param g Green brightness, 0 = minimum (off), 255 = maximum. - @param b Blue brightness, 0 = minimum (off), 255 = maximum. -*/ -void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint8_t r, uint8_t g, - uint8_t b) { - - if (n < numLEDs) { - if (brightness) { // See notes in setBrightness() - r = (r * brightness) >> 8; - g = (g * brightness) >> 8; - b = (b * brightness) >> 8; - } - uint8_t *p; - if (wOffset == rOffset) { // Is an RGB-type strip - p = &pixels[n * 3]; // 3 bytes per pixel - } else { // Is a WRGB-type strip - p = &pixels[n * 4]; // 4 bytes per pixel - p[wOffset] = 0; // But only R,G,B passed -- set W to 0 - } - p[rOffset] = r; // R,G,B always stored - p[gOffset] = g; - p[bOffset] = b; - } +void Adafruit_NeoPixel::show(void) { + if (!pixels) return; + espShow(pin, pixels, numBytes); } -/*! - @brief Set a pixel's color using separate red, green, blue and white - components (for RGBW NeoPixels only). - @param n Pixel index, starting from 0. - @param r Red brightness, 0 = minimum (off), 255 = maximum. - @param g Green brightness, 0 = minimum (off), 255 = maximum. - @param b Blue brightness, 0 = minimum (off), 255 = maximum. - @param w White brightness, 0 = minimum (off), 255 = maximum, ignored - if using RGB pixels. -*/ -void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint8_t r, uint8_t g, - uint8_t b, uint8_t w) { - - if (n < numLEDs) { - if (brightness) { // See notes in setBrightness() - r = (r * brightness) >> 8; - g = (g * brightness) >> 8; - b = (b * brightness) >> 8; - w = (w * brightness) >> 8; - } - uint8_t *p; - if (wOffset == rOffset) { // Is an RGB-type strip - p = &pixels[n * 3]; // 3 bytes per pixel (ignore W) - } else { // Is a WRGB-type strip - p = &pixels[n * 4]; // 4 bytes per pixel - p[wOffset] = w; // Store W - } - p[rOffset] = r; // Store R,G,B - p[gOffset] = g; - p[bOffset] = b; - } -} - -/*! - @brief Set a pixel's color using a 32-bit 'packed' RGB or RGBW value. - @param n Pixel index, starting from 0. - @param c 32-bit color value. Most significant byte is white (for RGBW - pixels) or ignored (for RGB pixels), next is red, then green, - and least significant byte is blue. -*/ -void Adafruit_NeoPixel::setPixelColor(uint16_t n, uint32_t c) { - if (n < numLEDs) { - uint8_t *p, r = (uint8_t)(c >> 16), g = (uint8_t)(c >> 8), b = (uint8_t)c; - if (brightness) { // See notes in setBrightness() - r = (r * brightness) >> 8; - g = (g * brightness) >> 8; - b = (b * brightness) >> 8; - } - if (wOffset == rOffset) { - p = &pixels[n * 3]; - } else { - p = &pixels[n * 4]; - uint8_t w = (uint8_t)(c >> 24); - p[wOffset] = brightness ? ((w * brightness) >> 8) : w; - } - p[rOffset] = r; - p[gOffset] = g; - p[bOffset] = b; - } -} - -/*! - @brief Adjust output brightness. Does not immediately affect what's - currently displayed on the LEDs. The next call to show() will - refresh the LEDs at this level. - @param b Brightness setting, 0=minimum (off), 255=brightest. - @note This was intended for one-time use in one's setup() function, - not as an animation effect in itself. Because of the way this - library "pre-multiplies" LED colors in RAM, changing the - brightness is often a "lossy" operation -- what you write to - pixels isn't necessary the same as what you'll read back. - Repeated brightness changes using this function exacerbate the - problem. Smart programs therefore treat the strip as a - write-only resource, maintaining their own state to render each - frame of an animation, not relying on read-modify-write. -*/ -void Adafruit_NeoPixel::setBrightness(uint8_t b) { - // Stored brightness value is different than what's passed. - // This simplifies the actual scaling math later, allowing a fast - // 8x8-bit multiply and taking the MSB. 'brightness' is a uint8_t, - // adding 1 here may (intentionally) roll over...so 0 = max brightness - // (color values are interpreted literally; no scaling), 1 = min - // brightness (off), 255 = just below max brightness. - uint8_t newBrightness = b + 1; - if (newBrightness != brightness) { // Compare against prior value - // Brightness has changed -- re-scale existing data in RAM, - // This process is potentially "lossy," especially when increasing - // brightness. The tight timing in the WS2811/WS2812 code means there - // aren't enough free cycles to perform this scaling on the fly as data - // is issued. So we make a pass through the existing color data in RAM - // and scale it (subsequent graphics commands also work at this - // brightness level). If there's a significant step up in brightness, - // the limited number of steps (quantization) in the old data will be - // quite visible in the re-scaled version. For a non-destructive - // change, you'll need to re-render the full strip data. C'est la vie. - uint8_t c, *ptr = pixels, - oldBrightness = brightness - 1; // De-wrap old brightness value - uint16_t scale; - if (oldBrightness == 0) - scale = 0; // Avoid /0 - else if (b == 255) - scale = 65535 / oldBrightness; - else - scale = (((uint16_t)newBrightness << 8) - 1) / oldBrightness; - for (uint16_t i = 0; i < numBytes; i++) { - c = *ptr; - *ptr++ = (c * scale) >> 8; - } - brightness = newBrightness; - } -} - -/*! - @brief Fill the whole NeoPixel strip with 0 / black / off. -*/ -void Adafruit_NeoPixel::clear(void) { memset(pixels, 0, numBytes); } +void Adafruit_NeoPixel::setPixelColor(uint32_t c) { + uint8_t *p = pixels; + uint8_t r = (uint8_t)(c >> 16), g = (uint8_t)(c >> 8), b = (uint8_t)c; + p[rOffset] = r; + p[gOffset] = g; + p[bOffset] = b; +} \ No newline at end of file diff --git a/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.h b/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.h index 541145ed..d4f4c1fc 100644 --- a/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.h +++ b/Software/src/lib/adafruit-Adafruit_NeoPixel/Adafruit_NeoPixel.h @@ -38,52 +38,6 @@ #include -// The order of primary colors in the NeoPixel data stream can vary among -// device types, manufacturers and even different revisions of the same -// item. The third parameter to the Adafruit_NeoPixel constructor encodes -// the per-pixel byte offsets of the red, green and blue primaries (plus -// white, if present) in the data stream -- the following #defines provide -// an easier-to-use named version for each permutation. e.g. NEO_GRB -// indicates a NeoPixel-compatible device expecting three bytes per pixel, -// with the first byte transmitted containing the green value, second -// containing red and third containing blue. The in-memory representation -// of a chain of NeoPixels is the same as the data-stream order; no -// re-ordering of bytes is required when issuing data to the chain. -// Most of these values won't exist in real-world devices, but it's done -// this way so we're ready for it (also, if using the WS2811 driver IC, -// one might have their pixels set up in any weird permutation). - -// Bits 5,4 of this value are the offset (0-3) from the first byte of a -// pixel to the location of the red color byte. Bits 3,2 are the green -// offset and 1,0 are the blue offset. If it is an RGBW-type device -// (supporting a white primary in addition to R,G,B), bits 7,6 are the -// offset to the white byte...otherwise, bits 7,6 are set to the same value -// as 5,4 (red) to indicate an RGB (not RGBW) device. -// i.e. binary representation: -// 0bWWRRGGBB for RGBW devices -// 0bRRRRGGBB for RGB - -// RGB NeoPixel permutations; white and red offsets are always same -// Offset: W R G B -#define NEO_RGB ((0 << 6) | (0 << 4) | (1 << 2) | (2)) ///< Transmit as R,G,B -#define NEO_RBG ((0 << 6) | (0 << 4) | (2 << 2) | (1)) ///< Transmit as R,B,G -#define NEO_GRB ((1 << 6) | (1 << 4) | (0 << 2) | (2)) ///< Transmit as G,R,B -#define NEO_GBR ((2 << 6) | (2 << 4) | (0 << 2) | (1)) ///< Transmit as G,B,R -#define NEO_BRG ((1 << 6) | (1 << 4) | (2 << 2) | (0)) ///< Transmit as B,R,G -#define NEO_BGR ((2 << 6) | (2 << 4) | (1 << 2) | (0)) ///< Transmit as B,G,R - -// Add NEO_KHZ400 to the color order value to indicate a 400 KHz device. -// All but the earliest v1 NeoPixels expect an 800 KHz data stream, this is -// the default if unspecified. Because flash space is very limited on ATtiny -// devices (e.g. Trinket, Gemma), v1 NeoPixels aren't handled by default on -// those chips, though it can be enabled by removing the ifndef/endif below, -// but code will be bigger. Conversely, can disable the NEO_KHZ400 line on -// other MCUs to remove v1 support and save a little space. - -#define NEO_KHZ400 0x0100 ///< 400 KHz data transmission - -typedef uint16_t neoPixelType; ///< 3rd arg to Adafruit_NeoPixel constructor - /*! @brief Class that stores state and functions for interacting with Adafruit NeoPixels and compatible devices. @@ -92,112 +46,23 @@ class Adafruit_NeoPixel { public: // Constructor: number of LEDs, pin number, LED type - Adafruit_NeoPixel(uint16_t n, int16_t pin = 6, - neoPixelType type = NEO_GRB); + Adafruit_NeoPixel(int16_t pin = -1); Adafruit_NeoPixel(void); - ~Adafruit_NeoPixel(); - void begin(void); void show(void); void setPin(int16_t p); - void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b); - void setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w); - void setPixelColor(uint16_t n, uint32_t c); - void setBrightness(uint8_t); - void clear(void); - void updateLength(uint16_t n); - void updateType(neoPixelType t); - /*! - @brief Check whether a call to show() will start sending data - immediately or will 'block' for a required interval. NeoPixels - require a short quiet time (about 300 microseconds) after the - last bit is received before the data 'latches' and new data can - start being received. Usually one's sketch is implicitly using - this time to generate a new frame of animation...but if it - finishes very quickly, this function could be used to see if - there's some idle time available for some low-priority - concurrent task. - @return 1 or true if show() will start sending immediately, 0 or false - if show() would block (meaning some idle time is available). - */ - bool canShow(void) { - // It's normal and possible for endTime to exceed micros() if the - // 32-bit clock counter has rolled over (about every 70 minutes). - // Since both are uint32_t, a negative delta correctly maps back to - // positive space, and it would seem like the subtraction below would - // suffice. But a problem arises if code invokes show() very - // infrequently...the micros() counter may roll over MULTIPLE times in - // that interval, the delta calculation is no longer correct and the - // next update may stall for a very long time. The check below resets - // the latch counter if a rollover has occurred. This can cause an - // extra delay of up to 300 microseconds in the rare case where a - // show() call happens precisely around the rollover, but that's - // neither likely nor especially harmful, vs. other code that might - // stall for 30+ minutes, or having to document and frequently remind - // and/or provide tech support explaining an unintuitive need for - // show() calls at least once an hour. - uint32_t now = micros(); - if (endTime > now) { - endTime = now; - } - return (now - endTime) >= 300L; - } - - /*! - @brief Retrieve the pin number used for NeoPixel data output. - @return Arduino pin number (-1 if not set). - */ - int16_t getPin(void) const { return pin; }; - /*! - @brief Return the number of pixels in an Adafruit_NeoPixel strip object. - @return Pixel count (0 if not set). - */ - uint16_t numPixels(void) const { return numLEDs; } - - /*! - @brief Convert separate red, green and blue values into a single - "packed" 32-bit RGB color. - @param r Red brightness, 0 to 255. - @param g Green brightness, 0 to 255. - @param b Blue brightness, 0 to 255. - @return 32-bit packed RGB value, which can then be assigned to a - variable for later use or passed to the setPixelColor() - function. Packed RGB format is predictable, regardless of - LED strand color order. - */ - static uint32_t Color(uint8_t r, uint8_t g, uint8_t b) { - return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; - } - /*! - @brief Convert separate red, green, blue and white values into a - single "packed" 32-bit WRGB color. - @param r Red brightness, 0 to 255. - @param g Green brightness, 0 to 255. - @param b Blue brightness, 0 to 255. - @param w White brightness, 0 to 255. - @return 32-bit packed WRGB value, which can then be assigned to a - variable for later use or passed to the setPixelColor() - function. Packed WRGB format is predictable, regardless of - LED strand color order. - */ - static uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { - return ((uint32_t)w << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b; - } + void setPixelColor(uint32_t c); + void updateLength(void); private: protected: - bool begun; ///< true if begin() previously called - uint16_t numLEDs; ///< Number of RGB LEDs in strip - uint16_t numBytes; ///< Size of 'pixels' buffer below + uint8_t numBytes = 3; ///< Size of 'pixels' buffer below int16_t pin; ///< Output pin number (-1 if not yet set) - uint8_t brightness; ///< Strip brightness 0-255 (stored as +1) uint8_t *pixels; ///< Holds LED color values (3 or 4 bytes each) - uint8_t rOffset; ///< Red index within each 3- or 4-byte pixel - uint8_t gOffset; ///< Index of green byte - uint8_t bOffset; ///< Index of blue byte - uint8_t wOffset; ///< Index of white (==rOffset if no white) - uint32_t endTime; ///< Latch timing reference + uint8_t rOffset = 0b01; ///< Red index within each 3- or 4-byte pixel + uint8_t gOffset = 0b00; ///< Index of green byte + uint8_t bOffset = 0b10; ///< Index of blue byte }; #endif // ADAFRUIT_NEOPIXEL_H diff --git a/test/safety_tests.cpp b/test/safety_tests.cpp index d6f5b55f..edaf6fce 100644 --- a/test/safety_tests.cpp +++ b/test/safety_tests.cpp @@ -6,7 +6,7 @@ TEST(SafetyTests, ShouldSetEventWhenTemperatureTooHigh) { init_events(); - datalayer.system.info.CPU_temperature = 82; + datalayer.system.info.CPU_temperature = 88; update_machineryprotection(); auto event_pointer = get_event_pointer(EVENT_CPU_OVERHEATING);