const uint16_t gamma8_12[256] = {
0,1,1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,18,20,22,25,27,
30,33,36,39,42,45,49,52,56,60,64,68,72,77,81,86,90,95,
100,105,111,116,121,127,133,139,145,151,157,163,170,176,
183,190,197,204,211,219,226,234,242,249,257,266,274,282,
291,299,308,317,326,335,344,354,363,373,383,393,403,413,
423,433,444,455,465,476,487,498,510,521,533,544,556,568,
580,592,604,617,629,642,655,668,681,694,707,721,734,748,
762,775,789,804,818,832,847,862,876,891,906,922,937,952,
968,983,999,1015,1031,1047,1064,1080,1097,1113,1130,1147,
1164,1181,1199,1216,1234,1252,1269,1287,1305,1324,1342,1360,
1379,1398,1416,1435,1454,1474,1493,1512,1532,1552,1572,1592,
1612,1632,1652,1673,1693,1714,1735,1756,1777,1798,1820,1841,
1863,1884,1906,1928,1950,1972,1995,2017,2040,2063,2086,2108,
2132,2155,2178,2202,2225,2249,2273,2297,2321,2345,2370,2394,
2419,2444,2468,2493,2519,2544,2569,2595,2620,2646,2672,2698,
2724,2750,2777,2803,2830,2857,2884,2911,2938,2965,2992,3020,
3048,3075,3103,3131,3159,3188,3216,3245,3273,3302,3331,3360,
3389,3418,3448,3477,3507,3537,3567,3597,3627,3657,3688,3718,
3749,3780,3811,3842,3873,3904,3935,3967,3999,4031,4062,4095
};
void writeGreen( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 4095-gamma8_12[pwm & 255] );
}
void writeOrange( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 4095-gamma8_12[pwm & 255] );
}
void writeRed( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 4095-gamma8_12[pwm & 255] );
}
void writeOrange2( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 4095-gamma8_12[pwm & 255] );
}
void writeWhite( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 4095-gamma8_12[pwm & 255] );
}
void writeBarGreen( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 4095-gamma8_12[pwm & 255] ); // INFO: to samoo co pomarańczowy
}
void writeBarOrange( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, 4095-gamma8_12[pwm & 255] ); // INFO: to samoo co zielony
}
void writeTarczaGreen( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, 4095-gamma8_12[pwm & 255] );
}
void writeTarczaOrange( uint16_t pwm ){
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, 4095-gamma8_12[pwm & 255] );
}
void irq1ms(){
int16_t static p[PWM_END];
uint8_t static b[PWM_END];
extern void DccIrq1ms(void);
DccIrq1ms();
if( timTest ) timTest--;
if( timSetS1 ) timSetS1--;
if( timSetS1 == 1 ) setS1();
for(uint8_t x=0; x<PWM_END; x++){
if( ! blink[x] ){ // Gdy nie ma blinka
if( p[x] < pwmS[x] << KROK_ROL ){
if( p[x] + krokUPcv < pwmS[x] << KROK_ROL ) p[x] += krokUPcv;
else p[x] = pwmS[x] << KROK_ROL;
}
if( p[x] > pwmS[x] << KROK_ROL ){
if( p[x] - krokDOWNcv > pwmS[x] << KROK_ROL ) p[x] -= krokDOWNcv;
else p[x] = pwmS[x] << KROK_ROL;
}
b[x] = 0; // Wyzeruj wirtualny PWM
}
else{
uint16_t static tim[PWM_END];
if( tim[x] ) tim[x]--;
else {
tim[x] = Fmigania << 3; // czestotliwość migania todo: z CV
b[x] ^= 1;
}
TRAP;
if( b[x] ){
TRAP;
if( p[x] < pwmS[x] << KROK_ROL ){
if( p[x] + krokUPcv < pwmS[x] << KROK_ROL ) p[x] += krokUPcv;
else p[x] = pwmS[x] << KROK_ROL;
}
}
else{
TRAP;
if( p[x] > 0 ){
if( p[x] - krokDOWNcv > 0 ) p[x] -= krokDOWNcv;
else p[x] = 0;
}
}
}
}
if( fl_PwmOn ){
writeGreen( p[PWM_GREEN] >> KROK_ROL );
writeOrange( p[PWM_ORANGE] >> KROK_ROL );
writeRed( p[PWM_RED] >> KROK_ROL );
writeOrange2( p[PWM_ORANGE2] >> KROK_ROL );
writeWhite( p[PWM_WHITE] >> KROK_ROL );
writeBarGreen( p[PWM_BAR_G] >> KROK_ROL );
writeBarOrange( p[PWM_BAR_O] >> KROK_ROL );
writeTarczaGreen( p[PWM_tGREEN] >> KROK_ROL );
writeTarczaOrange( p[PWM_tORANGE] >> KROK_ROL );
}
}