Stefan Schuermans commited on 2017-06-11 13:35:25
Showing 2 changed files, with 45 additions and 0 deletions.
| ... | ... |
@@ -17,6 +17,9 @@ |
| 17 | 17 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 18 | 18 |
*/ |
| 19 | 19 |
|
| 20 |
+#include <math.h> |
|
| 21 |
+#include <stdint.h> |
|
| 22 |
+ |
|
| 20 | 23 |
#include "mapping.h" |
| 21 | 24 |
|
| 22 | 25 |
/// default constructor |
| ... | ... |
@@ -25,6 +28,7 @@ Mapping::Mapping(): |
| 25 | 28 |
m_factor(0.0), |
| 26 | 29 |
m_gamma(1.0) |
| 27 | 30 |
{
|
| 31 |
+ update(); |
|
| 28 | 32 |
} |
| 29 | 33 |
|
| 30 | 34 |
/// constructor based on parameters |
| ... | ... |
@@ -33,5 +37,31 @@ Mapping::Mapping(double base, double factor, double gamma): |
| 33 | 37 |
m_factor(factor), |
| 34 | 38 |
m_gamma(gamma) |
| 35 | 39 |
{
|
| 40 |
+ update(); |
|
| 41 |
+} |
|
| 42 |
+ |
|
| 43 |
+/// update internal mapping table based on parameters |
|
| 44 |
+void Mapping::update() |
|
| 45 |
+{
|
|
| 46 |
+ /* mapping formula: |
|
| 47 |
+ * display := base + factor * video ** (1.0 / gamma) |
|
| 48 |
+ * display values are coming in via IPv4/UDP |
|
| 49 |
+ * simulator needs to show video values |
|
| 50 |
+ * video := ((display - base) / factor) ** gamma |
|
| 51 |
+ */ |
|
| 52 |
+ for (unsigned int display_i = 0; display_i < 256; ++display_i) {
|
|
| 53 |
+ double display = (double)display_i / 255.0; |
|
| 54 |
+ double video = pow((display - m_base) / m_factor, m_gamma); |
|
| 55 |
+ uint8_t video_u8; |
|
| 56 |
+ if (video < 0.0) {
|
|
| 57 |
+ video_u8 = 0; |
|
| 58 |
+ } else if (video > 1.0) {
|
|
| 59 |
+ video_u8 = 255; |
|
| 60 |
+ } else {
|
|
| 61 |
+ video_u8 = (uint8_t)round(255.0 * video); |
|
| 62 |
+ } |
|
| 63 |
+ m_display2video[display_i] = video_u8; |
|
| 36 | 64 |
} |
| 65 |
+} |
|
| 66 |
+ |
|
| 37 | 67 |
|
| ... | ... |
@@ -20,6 +20,8 @@ |
| 20 | 20 |
#ifndef MAPPING_H |
| 21 | 21 |
#define MAPPING_H |
| 22 | 22 |
|
| 23 |
+#include <stdint.h> |
|
| 24 |
+ |
|
| 23 | 25 |
/// mapping of input values to LED output values for a color channel |
| 24 | 26 |
class Mapping |
| 25 | 27 |
{
|
| ... | ... |
@@ -39,6 +41,16 @@ public: |
| 39 | 41 |
/// constructor based on parameters |
| 40 | 42 |
Mapping(double base, double factor, double gamma); |
| 41 | 43 |
|
| 44 |
+ /// map display value to video value |
|
| 45 |
+ uint8_t display2video(uint8_t display) const |
|
| 46 |
+ {
|
|
| 47 |
+ return m_display2video[display]; |
|
| 48 |
+ } |
|
| 49 |
+ |
|
| 50 |
+protected: |
|
| 51 |
+ /// update internal mapping table based on parameters |
|
| 52 |
+ void update(); |
|
| 53 |
+ |
|
| 42 | 54 |
protected: |
| 43 | 55 |
/// parameters of mapping: display := base + factor * video ** (1.0 / gamma) |
| 44 | 56 |
//@{
|
| ... | ... |
@@ -46,6 +58,9 @@ protected: |
| 46 | 58 |
double m_factor; |
| 47 | 59 |
double m_gamma; |
| 48 | 60 |
//@} |
| 61 |
+ /** mapping table from display values (from IPv4/UDP) |
|
| 62 |
+ to video values (to show on screen) */ |
|
| 63 |
+ uint8_t m_display2video[256]; |
|
| 49 | 64 |
}; |
| 50 | 65 |
|
| 51 | 66 |
#endif // #ifndef MAPPING_H |
| 52 | 67 |