/** * @brief Calculate the data from the IR spots. Basic IR mode. * * @param wm Pointer to a wiimote_t structure. * @param data Data returned by the wiimote for the IR spots. */ void calculate_basic_ir(struct wiimote_t* wm, byte* data) { struct ir_dot_t* dot = wm->ir.dot; int i; dot[0].rx = 1023 - (data[0] | ((data[2] & 0x30) << 4)); dot[0].ry = data[1] | ((data[2] & 0xC0) << 2); dot[1].rx = 1023 - (data[3] | ((data[2] & 0x03) << 8)); dot[1].ry = data[4] | ((data[2] & 0x0C) << 6); dot[2].rx = 1023 - (data[5] | ((data[7] & 0x30) << 4)); dot[2].ry = data[6] | ((data[7] & 0xC0) << 2); dot[3].rx = 1023 - (data[8] | ((data[7] & 0x03) << 8)); dot[3].ry = data[9] | ((data[7] & 0x0C) << 6); /* set each IR spot to visible if spot is in range */ for (i = 0; i < 4; ++i) { if (dot[i].ry == 1023) dot[i].visible = 0; else { dot[i].visible = 1; dot[i].size = 0; /* since we don't know the size, set it as 0 */ } } interpret_ir_data(wm); }
/** * @brief Calculate the data from the IR spots. Extended IR mode. * * @param wm Pointer to a wiimote_t structure. * @param data Data returned by the wiimote for the IR spots. */ void calculate_extended_ir( struct wiimote_t* wm, byte* data ) { struct ir_dot_t* dot = wm->ir.dot; int i; for ( i = 0; i < 4; ++i ) { dot[i].rx = 1023 - (data[3 * i] | ((data[(3 * i) + 2] & 0x30) << 4)); dot[i].ry = data[(3 * i) + 1] | ((data[(3 * i) + 2] & 0xC0) << 2); dot[i].size = data[(3 * i) + 2] & 0x0F; /* if in range set to visible */ if ( dot[i].ry == 1023 ) dot[i].visible = 0; else dot[i].visible = 1; } interpret_ir_data( wm ); }