Ticket #5: cwiid-wminput-plugin-enhancements.diff

File cwiid-wminput-plugin-enhancements.diff, 2.8 kB (added by amp, 5 years ago)

A crude implementation of some enhancements to these algorithms

  • wminput/plugins/ir_ptr/ir_ptr.c

     
    3232        uint16_t x; 
    3333        uint16_t y; 
    3434}; 
     35int a_debounce, b_debounce; 
    3536 
    3637/* static objects are initialized to 0 by default */ 
    3738static int a_index = -1, b_index = -1; 
     
    134135                        } 
    135136                } 
    136137        } 
     138 
     139#define DEBOUNCE_THRESHOLD 50 
     140 
    137141        /* set a & b, mirror the x coordinates */ 
    138142        if (a_index == -1) { 
    139                 a.valid = 0; 
     143                a_debounce++; 
     144                if( a_debounce > DEBOUNCE_THRESHOLD ) { 
     145                        a.valid = 0; 
     146                } 
     147                else { 
     148                        a = prev_a; 
     149                } 
    140150        } 
    141151        else { 
    142152                a = ir_mesg->src[a_index]; 
    143153                a.x = WIIMOTE_IR_X_MAX - a.x; 
     154                a_debounce = 0; 
    144155        } 
    145156        if (b_index == -1) { 
    146                 b.valid = 0; 
     157                b_debounce++; 
     158                if( b_debounce > DEBOUNCE_THRESHOLD ) { 
     159                        b.valid = 0; 
     160                } 
     161                else { 
     162                        b = prev_b; 
     163                } 
    147164        } 
    148165        else { 
    149166                b = ir_mesg->src[b_index]; 
    150167                b.x = WIIMOTE_IR_X_MAX - b.x; 
     168                b_debounce = 0; 
    151169        } 
    152170 
    153171        /* if both sources are valid, calculate the center */ 
     
    216234        old_flags = flags; 
    217235 
    218236        data.axes[0].valid = data.axes[1].valid = c.valid; 
    219         data.axes[0].value = c.x; 
    220         data.axes[1].value = c.y; 
    221237 
     238#define NEW_AMOUNT 0.6 
     239#define OLD_AMOUNT (1.0-NEW_AMOUNT) 
     240 
     241        data.axes[0].value = c.x*NEW_AMOUNT + data.axes[0].value*OLD_AMOUNT; 
     242        data.axes[1].value = c.y*NEW_AMOUNT + data.axes[1].value*OLD_AMOUNT; 
     243 
    222244        return &data; 
    223245} 
    224246 
  • wminput/plugins/acc/acc.c

     
    127127        return ret; 
    128128} 
    129129 
     130#define NEW_AMOUNT 0.1 
     131#define OLD_AMOUNT (1.0-NEW_AMOUNT) 
     132double a_x = 0, a_y = 0, a_z = 0; 
     133 
    130134static void process_acc(struct wiimote_acc_mesg *mesg) 
    131135{ 
    132         double a_x, a_y, a_z, a; 
     136        double a; 
    133137        double roll, pitch; 
    134138 
    135         a_x = ((double)mesg->x - acc_zero.x) / 
    136               (acc_one.x - acc_zero.x); 
    137         a_y = ((double)mesg->y - acc_zero.y) / 
    138               (acc_one.y - acc_zero.y); 
    139         a_z = ((double)mesg->z - acc_zero.z) / 
    140               (acc_one.z - acc_zero.z); 
     139  a_x = (((double)mesg->x - acc_zero.x) / 
     140        (acc_one.x - acc_zero.x))*NEW_AMOUNT + a_x*OLD_AMOUNT; 
     141  a_y = (((double)mesg->y - acc_zero.y) / 
     142        (acc_one.y - acc_zero.y))*NEW_AMOUNT + a_y*OLD_AMOUNT; 
     143  a_z = (((double)mesg->z - acc_zero.z) / 
     144        (acc_one.z - acc_zero.z))*NEW_AMOUNT + a_z*OLD_AMOUNT; 
    141145 
    142146        a = sqrt(pow(a_x,2)+pow(a_y,2)+pow(a_z,2)); 
    143147        roll = atan(a_x/a_z); 
     
    147151 
    148152        pitch = atan(a_y/a_z*cos(roll)); 
    149153 
    150         data.axes[0].value = roll*1000; 
    151         data.axes[1].value = pitch*1000; 
     154        //printf( "roll %.2f       pitch %.2f\n", roll, pitch ); 
    152155 
     156        data.axes[0].value = roll*2000; 
     157        data.axes[1].value = pitch*2000; 
     158 
    153159        if ((a > 0.85) && (a < 1.15)) { 
    154160                if ((fabs(roll)*(180/PI) > 10) && (fabs(pitch)*(180/PI) < 80)) { 
    155161                        data.axes[2].valid = 1;