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 if ( HOLDTIME[ 7 ] < on ) {
58 for (
int i = 0; i < 7; i++ ) {
59 if ( on < HOLDTIME[ i + 1 ] ) {
67 if ( HOLDTIME[ 7 ] < off ) {
72 for (
int i = 0; i < 7; i++ ) {
73 if ( off < HOLDTIME[ i + 1 ] ) {
81 reg[ 0 ] = (up << 7) | (down << 6) | (iref_inc - 1);
82 reg[ 1 ] = ( cycle_time_i << 6 ) | (multi_fctr - 1);
83 reg[ 2 ] = 0xC0 | ( on_i << 3) | off_i;
86 devp->reg_access( devp->arp[ SETTING ] + group * 4, reg,
sizeof( reg ) );
88 ramp_time = ((multi_fctr * cycle_time) * (iref / iref_inc)) / 1000;
90 cycle_time = on + off;
91 cycle_time += up ? ramp_time : 0;
92 cycle_time += down ? ramp_time : 0;
101 const int n_reg = devp->n_channel / 8;
102 uint8_t reg[ n_reg ];
104 devp->reg_access_r( devp->arp[ MODE ], reg,
sizeof( reg ) );
106 for (
int i = 0; i < n_reg; i++ ) {
107 reg[ i ] |= (uint8_t)(bitmap >> (i * 8));
110 devp->reg_access( devp->arp[ MODE ], reg,
sizeof( reg ) );
115 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
116 const int n_reg = devp->n_channel / (8 / grp_shift);
117 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
118 uint8_t reg[ n_reg ];
122 devp->reg_access_r( devp->arp[ GROUP ], reg,
sizeof( reg ) );
124 for (
int i = 0; i < devp->n_channel; i++ ) {
125 if ( (bitmap >> i) & 0x1 ) {
126 r_index = i / (8 / grp_shift);
127 s_index = (i * grp_shift) % 8;
129 reg[ r_index ] = ~(bits << s_index) & reg[ r_index ];
130 reg[ r_index ] |= group << s_index;
134 devp->reg_access( devp->arp[ GROUP ], reg,
sizeof( reg ) );
139 const int grp_shift = (devp->arp[ N_GROUP ] == 4) ? 2 : 4;
140 uint8_t bits = (grp_shift == 2) ? 0x3 : 0x0F;
146 r_index = ch / (8 / grp_shift);
147 s_index = (ch * grp_shift) % 8;
149 v = devp->reg_access( devp->arp[ GROUP ] + r_index );
151 v = ~(bits << s_index) & v;
152 v |= group << s_index;
154 devp->reg_access( devp->arp[ GROUP ] + r_index, v );
156 const int n_reg = ch / 8;
158 v = devp->reg_access( devp->arp[ MODE ] + n_reg );
160 v |= (uint8_t)(0x1 << (ch % 8));
162 devp->reg_access( devp->arp[ MODE ] + n_reg, v );
173 s_index = (group * 2) % 8 + (r_index ? 4 : 0);
176 reg = devp->reg_access( devp->arp[ CNTL ] + r_index );
177 reg &= ~(0x03 << s_index);
178 reg |= ctrl << s_index;
180 devp->reg_access( devp->arp[ CNTL ] + r_index, reg );
184 control( ONE_SHOT | continuous );
193const 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)