1#include <GradationControl.h>
4 devp( dev_ptr ), group( group_num )
27 iref = (int)(max_iref * 255.0);
31 step_duration = time / iref;
33 if ( 32 < step_duration ) {
42 multi_fctr = (int)(step_duration / cycle_time);
43 multi_fctr = (multi_fctr < 1) ? 1 : multi_fctr;
44 multi_fctr = (64 < multi_fctr) ? 64 : multi_fctr;
46 if ( multi_fctr == 1 )
47 iref_inc = (int)( iref / (time / cycle_time) );
53 for (
int i = 0; i < 7; i++ ) {
54 if ( on < HOLDTIME[ i + 1 ] ) {
61 for (
int i = 0; i < 7; i++ ) {
62 if ( off < HOLDTIME[ i + 1 ] ) {
69 reg[ 0 ] = (up << 7) | (down << 6) | (iref_inc - 1);
70 reg[ 1 ] = ( cycle_time_i << 6 ) | (multi_fctr - 1);
71 reg[ 2 ] = (hold_on << 7) | (hold_off << 6) | ( on_i << 3) | off_i;
74 devp->reg_access( devp->arp[ SETTING ] + group * 4, reg,
sizeof( reg ) );
76 ramp_time = ((multi_fctr * cycle_time) * (iref / iref_inc)) / 1000;
78 cycle_time = on + off;
79 cycle_time += up ? ramp_time : 0;
80 cycle_time += down ? ramp_time : 0;
89 const int n_reg = devp->n_channel / 8;
92 devp->reg_access_r( devp->arp[ MODE ], reg,
sizeof( reg ) );
94 for (
int i = 0; i < n_reg; i++ ) {
95 reg[ i ] |= (uint8_t)(bitmap >> (i * 8));
98 devp->reg_access( devp->arp[ MODE ], reg,
sizeof( reg ) );
103 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
104 const int n_reg = devp->n_channel / (8 / grp_shift);
105 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
106 uint8_t reg[ n_reg ];
110 devp->reg_access_r( devp->arp[ GROUP ], reg,
sizeof( reg ) );
112 for (
int i = 0; i < devp->n_channel; i++ ) {
113 if ( (bitmap >> i) & 0x1 ) {
114 r_index = i / (8 / grp_shift);
115 s_index = (i * grp_shift) % 8;
117 reg[ r_index ] = ~(bits << s_index) & reg[ r_index ];
118 reg[ r_index ] |= group << s_index;
122 devp->reg_access( devp->arp[ GROUP ], reg,
sizeof( reg ) );
127 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
128 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
134 r_index = ch / (8 / grp_shift);
135 s_index = (ch * grp_shift) % 8;
137 v = devp->reg_access( devp->arp[ GROUP ] + r_index );
139 v = ~(bits << s_index) & v;
140 v |= group << s_index;
142 devp->reg_access( devp->arp[ GROUP ] + r_index, v );
144 const int n_reg = ch / 8;
146 v = devp->reg_access( devp->arp[ MODE ] + n_reg );
148 v |= (uint8_t)(0x1 << (ch % 8));
150 devp->reg_access( devp->arp[ MODE ] + n_reg, v );
161 s_index = (group * 2) % 8 + (r_index ? 4 : 0);
164 reg = devp->reg_access( devp->arp[ CNTL ] + r_index );
165 reg &= ~(0x03 << s_index);
166 reg |= ctrl << s_index;
168 devp->reg_access( devp->arp[ CNTL ] + r_index, reg );
172 control( ONE_SHOT | continuous );
181const float GradationControl::HOLDTIME[] = { 0, 0.25, 0.50, 0.75, 1, 2, 4, 6, };
void start(bool continuous=true)
void gradation_channel_enable(uint32_t bitmap)
GradationControl(PCA995x *devp, int num_group, uint32_t bitmap=0x0000)
void gradation_group_assign(uint32_t bitmap)
virtual ~GradationControl()
void add_channel(uint8_t ch)
float set_gradation(float max_iref, float time, bool up=true, bool down=true, float on=0.0, float off=0.0, bool hold_on=true, bool hold_off=true)