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 |