ESPixelStick Firmware
Firmware for the ESPixelStick
Loading...
Searching...
No Matches
OutputPixel.hpp
Go to the documentation of this file.
1#pragma once
2/*
3* OutputPixel.h - Pixel driver code for ESPixelStick
4*
5* Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver
6* Copyright (c) 2015, 2022 Shelby Merrick
7* http://www.forkineye.com
8*
9* This program is provided free for you to use in any way that you wish,
10* subject to the laws and regulations where you are using it. Due diligence
11* is strongly suggested before using this code. Please give credit where due.
12*
13* The Author makes no warranty of any kind, express or implied, with regard
14* to this program or the documentation contained in this document. The
15* Author shall not be liable in any event for incidental or consequential
16* damages in connection with, or arising out of, the furnishing, performance
17* or use of these programs.
18*
19* This is a derived class that converts data in the output buffer into
20* pixel intensities and then transmits them through the configured serial
21* interface.
22*
23*/
24
25#include "OutputCommon.hpp"
26
28{
29protected:
30
31 void SetFramePrependInformation (const uint8_t* data, uint32_t len);
32 void SetFrameAppendInformation (const uint8_t* data, uint32_t len);
33 void SetPixelPrependInformation (const uint8_t* data, uint32_t len);
34
36
37 void SetFrameDurration (float IntensityBitTimeInUs, uint16_t BlockSize = 1, float BlockDelayUs = 0.0);
38
39private:
40#define PIXEL_DEFAULT_INTENSITY_BYTES_PER_PIXEL 3
41
43
44 uint8_t * NextPixelToSend = nullptr;
45 uint32_t pixel_count = 100;
46 uint32_t SentPixelsCount = 0;
49
50 uint8_t * pFramePrependData = nullptr;
53
54 uint8_t * pFrameAppendData = nullptr;
55 uint32_t FrameAppendDataSize = 0;
57
58 uint8_t * PixelPrependData = nullptr;
61
62 uint32_t PixelGroupSize = 1;
63 uint32_t PixelGroups = 1;
64
66 uint32_t BlockSize = 1;
67 float BlockDelayUs = 0.0;
68
69 uint32_t zig_size = 1;
70
73
76
77 bool InvertData = false;
78 uint32_t IntensityMultiplier = 1;
79
80// #define USE_PIXEL_DEBUG_COUNTERS
81#ifdef USE_PIXEL_DEBUG_COUNTERS
82 uint32_t PixelsToSend = 0;
83 uint32_t IntensityBytesSent = 0;
84 uint32_t IntensityBytesSentLastFrame = 0;
85 uint32_t FrameStartCounter = 0;
86 uint32_t FrameEndCounter = 0;
87 uint32_t SentPixels = 0;
88 uint32_t AbortFrameCounter = 0;
89 uint32_t FramePrependDataCounter = 0;
90 uint32_t FrameSendPixelsCounter = 0;
91 uint32_t FrameAppendDataCounter = 0;
92 uint32_t FrameDoneCounter = 0;
93 uint32_t FrameStateUnknownCounter = 0;
94 uint32_t PixelPrependNullsCounter = 0;
95 uint32_t PixelSendIntensityCounter = 0;
96 uint32_t PixelAppendNullsCounter = 0;
97 uint32_t PixelUnkownState = 0;
98 uint32_t GetNextIntensityToSendCounter = 0;
99 uint32_t GetNextIntensityToSendFailedCounter = 0;
100 uint32_t LastGECEdataSent = uint32_t(-1);
101 uint32_t NumGECEdataSent = 0;
102#endif // def USE_PIXEL_DEBUG_COUNTERS
103
104 // functions used to implement pixel FSM
105 uint32_t IRAM_ATTR FramePrependData();
106 uint32_t IRAM_ATTR PixelPrependNulls();
107 uint32_t IRAM_ATTR PixelSendPrependIntensity();
108#ifdef SUPPORT_OutputType_GECE
109 uint32_t IRAM_ATTR PixelSendGECEIntensity();
110#endif // def SUPPORT_OutputType_GECE
111 uint32_t IRAM_ATTR PixelSendIntensity();
112 uint32_t IRAM_ATTR PixelAppendNulls();
113 uint32_t IRAM_ATTR FrameAppendData();
114 uint32_t IRAM_ATTR FrameDone();
115
116 void IRAM_ATTR SetStartingSendPixelState();
118
119 typedef union ColorOffsets_s
120 {
121 struct offsets
122 {
123 uint8_t r;
124 uint8_t g;
125 uint8_t b;
126 uint8_t w;
128 uint8_t Array[4];
131
132 uint8_t gamma_table[256] = { 0 };
133 float gamma = 1.0;
134 uint8_t brightness = 100;
135 uint32_t AdjustedBrightness = 256;
136 uint32_t GECEPixelId = 0;
137 uint32_t GECEBrightness = 255;
138
139 // JSON configuration parameters
140 String color_order = "rgb";
141
142 // Internal variables
143
144 void updateGammaTable();
146 bool validate ();
147 inline uint32_t CalculateIntensityOffset(uint32_t ChannelId);
148 uint32_t IRAM_ATTR GetIntensityData();
149
150public:
152 gpio_num_t outputGpio,
153 uart_port_t uart,
154 c_OutputMgr::e_OutputType outputType);
155 virtual ~c_OutputPixel ();
156
157 // functions to be provided by the derived class
158 virtual bool SetConfig (ArduinoJson::JsonObject & jsonConfig);
159 virtual void GetConfig (ArduinoJson::JsonObject & jsonConfig);
160 virtual void GetStatus (ArduinoJson::JsonObject& jsonStatus);
163 virtual void SetOutputBufferSize (uint32_t NumChannelsAvailable);
164 void SetInvertData (bool _InvertData) { InvertData = _InvertData; }
165 virtual void WriteChannelData (uint32_t StartChannelId, uint32_t ChannelCount, byte *pSourceData);
166 virtual void ReadChannelData (uint32_t StartChannelId, uint32_t ChannelCount, byte *pTargetData);
167 inline void SetIntensityBitTimeInUS (float value) { IntensityBitTimeInUs = value; }
168 void SetIntensityDataWidth(uint32_t value);
169 void StartNewFrame();
170 inline bool IRAM_ATTR ISR_MoreDataToSend () {return (&c_OutputPixel::FrameDone != FrameStateFuncPtr);}
171 bool IRAM_ATTR ISR_GetNextIntensityToSend (uint32_t &DataToSend);
172 void SetPixelCount(uint32_t value) {pixel_count = value;}
173 uint32_t GetPixelCount() {return pixel_count;}
174
175}; // c_OutputPixel
#define PIXEL_DEFAULT_INTENSITY_BYTES_PER_PIXEL
Definition OutputPixel.hpp:40
Definition OutputCommon.hpp:31
OID_t OutputChannelId
Definition OutputCommon.hpp:76
e_OutputChannelIds
Definition OutputMgr.hpp:67
e_OutputType
Definition OutputMgr.hpp:126
Definition OutputPixel.hpp:28
void SetPixelPrependInformation(const uint8_t *data, uint32_t len)
Definition OutputPixel.cpp:159
uint32_t PixelIntensityCurrentIndex
Definition OutputPixel.hpp:47
uint32_t PixelGroupSize
Definition OutputPixel.hpp:62
uint32_t AdjustedBrightness
Definition OutputPixel.hpp:135
void SetPixelCount(uint32_t value)
Definition OutputPixel.hpp:172
virtual ~c_OutputPixel()
Definition OutputPixel.cpp:42
uint32_t FrameAppendDataSize
Definition OutputPixel.hpp:55
ColorOffsets_t ColorOffsets
Definition OutputPixel.hpp:130
virtual void SetOutputBufferSize(uint32_t NumChannelsAvailable)
Definition OutputPixel.cpp:106
uint8_t * NextPixelToSend
Definition OutputPixel.hpp:44
uint8_t gamma_table[256]
Gamma Adjustment table.
Definition OutputPixel.hpp:132
c_OutputPixel(c_OutputMgr::e_OutputChannelIds OutputChannelId, gpio_num_t outputGpio, uart_port_t uart, c_OutputMgr::e_OutputType outputType)
Definition OutputPixel.cpp:25
uint32_t PixelPrependDataCurrentIndex
Definition OutputPixel.hpp:60
uint8_t * PixelPrependData
Definition OutputPixel.hpp:58
virtual void WriteChannelData(uint32_t StartChannelId, uint32_t ChannelCount, byte *pSourceData)
Definition OutputPixel.cpp:765
uint32_t zig_size
Definition OutputPixel.hpp:69
virtual void GetStatus(ArduinoJson::JsonObject &jsonStatus)
Definition OutputPixel.cpp:70
float BlockDelayUs
Definition OutputPixel.hpp:67
uint32_t PixelGroups
Definition OutputPixel.hpp:63
uint32_t FramePrependDataCurrentIndex
Definition OutputPixel.hpp:52
void SetFrameDurration(float IntensityBitTimeInUs, uint16_t BlockSize=1, float BlockDelayUs=0.0)
Definition OutputPixel.cpp:309
uint32_t PrependNullPixelCount
Definition OutputPixel.hpp:71
uint32_t IRAM_ATTR FrameAppendData()
Definition OutputPixel.cpp:617
uint32_t GetNumOutputBufferChannelsServiced()
Definition OutputPixel.hpp:162
uint32_t IRAM_ATTR PixelAppendNulls()
Definition OutputPixel.cpp:574
uint32_t IntensityMultiplier
Definition OutputPixel.hpp:78
union c_OutputPixel::ColorOffsets_s ColorOffsets_t
void StartNewFrame()
Definition OutputPixel.cpp:375
bool validate()
confirm that the current configuration is valid
Definition OutputPixel.cpp:272
uint32_t IRAM_ATTR FrameDone()
Definition OutputPixel.cpp:634
void SetIntensityBitTimeInUS(float value)
Definition OutputPixel.hpp:167
uint32_t SentPixelsCount
Definition OutputPixel.hpp:46
virtual void ReadChannelData(uint32_t StartChannelId, uint32_t ChannelCount, byte *pTargetData)
Definition OutputPixel.cpp:795
uint32_t GECEPixelId
Definition OutputPixel.hpp:136
uint32_t IRAM_ATTR FramePrependData()
Definition OutputPixel.cpp:432
uint32_t FrameAppendDataCurrentIndex
Definition OutputPixel.hpp:56
uint32_t(c_OutputPixel::* FrameStateFuncPtr)()
Definition OutputPixel.hpp:117
uint32_t GetNumOutputBufferBytesNeeded()
Definition OutputPixel.hpp:161
uint32_t PixelIntensityCurrentColor
Definition OutputPixel.hpp:48
void SetInvertData(bool _InvertData)
Definition OutputPixel.hpp:164
uint32_t CalculateIntensityOffset(uint32_t ChannelId)
Definition OutputPixel.cpp:709
void IRAM_ATTR SetStartingSendPixelState()
Definition OutputPixel.cpp:350
void SetIntensityDataWidth(uint32_t value)
Definition OutputPixel.cpp:424
uint32_t IRAM_ATTR PixelSendPrependIntensity()
Definition OutputPixel.cpp:500
void updateColorOrderOffsets()
Update color order.
Definition OutputPixel.cpp:236
uint32_t IRAM_ATTR PixelPrependNulls()
Definition OutputPixel.cpp:459
bool IRAM_ATTR ISR_MoreDataToSend()
Definition OutputPixel.hpp:170
uint32_t AppendNullPixelCount
Definition OutputPixel.hpp:74
uint32_t PixelPrependDataSize
Definition OutputPixel.hpp:59
uint32_t GECEBrightness
Definition OutputPixel.hpp:137
uint16_t InterFrameGapInMicroSec
Definition OutputPixel.hpp:35
uint32_t pixel_count
Definition OutputPixel.hpp:45
uint8_t brightness
Definition OutputPixel.hpp:134
virtual bool SetConfig(ArduinoJson::JsonObject &jsonConfig)
Set a new config in the driver.
Definition OutputPixel.cpp:171
virtual void GetConfig(ArduinoJson::JsonObject &jsonConfig)
Get the current config used by the driver.
Definition OutputPixel.cpp:50
uint8_t * pFrameAppendData
Definition OutputPixel.hpp:54
uint8_t * pFramePrependData
Definition OutputPixel.hpp:50
float gamma
gamma value to use
Definition OutputPixel.hpp:133
bool InvertData
Definition OutputPixel.hpp:77
void SetFramePrependInformation(const uint8_t *data, uint32_t len)
Definition OutputPixel.cpp:135
uint32_t GetPixelCount()
Definition OutputPixel.hpp:173
void SetFrameAppendInformation(const uint8_t *data, uint32_t len)
Definition OutputPixel.cpp:147
uint32_t FramePrependDataSize
Definition OutputPixel.hpp:51
float IntensityBitTimeInUs
Definition OutputPixel.hpp:65
void updateGammaTable()
Generate gamma correction table.
Definition OutputPixel.cpp:218
bool IRAM_ATTR ISR_GetNextIntensityToSend(uint32_t &DataToSend)
Definition OutputPixel.cpp:643
uint32_t PrependNullPixelCurrentCount
Definition OutputPixel.hpp:72
uint32_t AppendNullPixelCurrentCount
Definition OutputPixel.hpp:75
uint32_t BlockSize
Definition OutputPixel.hpp:66
uint32_t NumIntensityBytesPerPixel
Definition OutputPixel.hpp:42
uint32_t IRAM_ATTR GetIntensityData()
Definition OutputPixel.cpp:666
uint32_t IRAM_ATTR PixelSendIntensity()
Definition OutputPixel.cpp:563
String color_order
Pixel color order.
Definition OutputPixel.hpp:140
Definition OutputPixel.hpp:122
uint8_t b
Definition OutputPixel.hpp:125
uint8_t g
Definition OutputPixel.hpp:124
uint8_t w
Definition OutputPixel.hpp:126
uint8_t r
Definition OutputPixel.hpp:123
Definition OutputPixel.hpp:120
struct c_OutputPixel::ColorOffsets_s::offsets offset
uint8_t Array[4]
Definition OutputPixel.hpp:128