1 | /*
|
2 | * hsv_rgb.c
|
3 | *
|
4 | * Created on: 15.10.2011
|
5 | * Author: Frank
|
6 | */
|
7 | #include "hsv_rgb.h"
|
8 |
|
9 | void hsv_to_rgb12(colorstruc *value)
|
10 | {
|
11 | uint16_t q;
|
12 | uint16_t p;
|
13 | uint16_t t;
|
14 |
|
15 | uint8_t i;
|
16 | uint16_t f;
|
17 |
|
18 | if( value->S == 0 )
|
19 | {
|
20 | value->Pin_R = value->V;
|
21 | value->Pin_G = value->V;
|
22 | value->Pin_B = value->V;
|
23 | }
|
24 | else
|
25 | { i = value->H / 683;
|
26 | f = value->H % 683;
|
27 | p = (uint16_t)( ( value->V * ( 4095 - value->S ) ) / 4096 );
|
28 | q = (uint16_t)( ( value->V * ( ( 2796885 - ( value->S * f ) ) / 683 ) ) / 4096 );
|
29 | t = (uint16_t)( ( ( value->V * ( ( 2796885 - ( value->S * ( 683 - ( (uint32_t)f ) ) ) ) / 683 ) ) ) / 4096 );
|
30 |
|
31 | switch( i )
|
32 | {
|
33 | case 0:
|
34 | value->Pin_R = value->V; value->Pin_G = t; value->Pin_B = p; break;
|
35 |
|
36 | case 1:
|
37 | value->Pin_R = q; value->Pin_G = value->V; value->Pin_B = p; break;
|
38 |
|
39 | case 2:
|
40 | value->Pin_R = p; value->Pin_G = value->V; value->Pin_B = t; break;
|
41 |
|
42 | case 3:
|
43 | value->Pin_R = p; value->Pin_G = q; value->Pin_B = value->V; break;
|
44 |
|
45 | case 4:
|
46 | value->Pin_R = t; value->Pin_G = p; value->Pin_B = value->V; break;
|
47 |
|
48 | default:
|
49 | value->Pin_R = value->V; value->Pin_G = p; value->Pin_B = q; break;
|
50 | }
|
51 | }
|
52 | }
|