@@ -225,49 +225,74 @@ void apply_smoothing(struct accel_t* ac, struct orient_t* orient, int type) {
225225 }
226226}
227227
228- void calc_balanceboard_state ( struct wii_board_t * wb )
228+ static float calc_balanceboard_weight ( wii_board_t * wb , int idx )
229229{
230- /*
231- Interpolate values
232- Calculations borrowed from wiili.org - No names to mention sadly :( http://www.wiili.org/index.php/Wii_Balance_Board_PC_Drivers
233- */
234-
235- if (wb -> rtr < wb -> ctr [1 ])
236- {
237- wb -> tr = 17.0f * (f32 )(wb -> rtr - wb -> ctr [0 ])/(f32 )(wb -> ctr [1 ]- wb -> ctr [0 ]);
238- }
230+ /*
231+ * Calculations borrowed from wiili.org - No names to mention sadly :(
232+ * http://www.wiili.org/index.php/Wii_Balance_Board_PC_Drivers
233+ */
234+ short raw = wb -> raw_sensor [idx ];
235+ const wii_board_sensor_cal_t * cal = & wb -> cal_sensor [idx ];
236+ if (raw < cal -> ref_17 )
237+ return 17.0f * (raw - cal -> ref_0 ) / (cal -> ref_17 - cal -> ref_0 );
239238 else
240- {
241- wb -> tr = 17.0f * (f32 )(wb -> rtr - wb -> ctr [1 ])/(f32 )(wb -> ctr [2 ]- wb -> ctr [1 ]) + 17.0f ;
242- }
239+ return 17.0f * (raw - cal -> ref_17 ) / (cal -> ref_34 - cal -> ref_17 ) + 17.0f ;
240+ }
243241
244- if ( wb -> rtl < wb -> ctl [ 1 ] )
245- {
246- wb -> tl = 17.0f * ( f32 )( wb -> rtl - wb -> ctl [ 0 ])/( f32 )( wb -> ctl [ 1 ] - wb -> ctl [ 0 ]);
247- }
248- else
249- {
250- wb -> tl = 17.0f * ( f32 )( wb -> rtl - wb -> ctl [ 1 ])/( f32 )( wb -> ctl [ 2 ] - wb -> ctl [ 1 ]) + 17.0f ;
251- }
242+ static float calc_balanceboard_temp_correct ( float w , const wii_board_t * wb )
243+ {
244+ /* Temperature correction, based on https://wiibrew.org/wiki/Wii_Balance_Board */
245+ static const double a = 0.9990813732147217 ;
246+ static const double b = 0.007000000216066837 ;
247+ double c = 1.0 - b * ( wb -> raw_temp - wb -> cal_temp ) / 10.0 ;
248+ return a * w * c ;
249+ }
252250
253- if (wb -> rbr < wb -> cbr [1 ])
254- {
255- wb -> br = 17.0f * (f32 )(wb -> rbr - wb -> cbr [0 ])/(f32 )(wb -> cbr [1 ]- wb -> cbr [0 ]);
256- }
257- else
258- {
259- wb -> br = 17.0f * (f32 )(wb -> rbr - wb -> cbr [1 ])/(f32 )(wb -> cbr [2 ]- wb -> cbr [1 ]) + 17.0f ;
260- }
251+ static unsigned calc_balanceboard_battery_bars (const struct wii_board_t * wb )
252+ {
253+ if (wb -> raw_bat >= 0x82 )
254+ return 4 ;
255+ if (wb -> raw_bat >= 0x7d )
256+ return 3 ;
257+ if (wb -> raw_bat >= 0x78 )
258+ return 2 ;
259+ if (wb -> raw_bat >= wb -> cal_bat )
260+ return 1 ;
261+ return 0 ;
262+ }
261263
262- if (wb -> rbl < wb -> cbl [1 ])
263- {
264- wb -> bl = 17.0f * (f32 )(wb -> rbl - wb -> cbl [0 ])/(f32 )(wb -> cbl [1 ]- wb -> cbl [0 ]);
264+ void calc_balanceboard_state (struct wii_board_t * wb )
265+ {
266+ /* Convert raw sensor data to Kg. */
267+ for (unsigned i = 0 ; i < WII_BOARD_NUM_SENSORS ; ++ i )
268+ wb -> weight [i ] = calc_balanceboard_weight (wb , i );
269+
270+ /* Apply temperature and zero correction. */
271+ for (unsigned i = 0 ; i < WII_BOARD_NUM_SENSORS ; ++ i )
272+ wb -> weight [i ] = calc_balanceboard_temp_correct (wb -> weight [i ], wb );
273+
274+ wb -> total_weight = 0 ;
275+ for (unsigned i = 0 ; i < WII_BOARD_NUM_SENSORS ; ++ i )
276+ wb -> total_weight += wb -> weight [i ];
277+
278+ /* Calculate x,y members only if there's at least 2 Kg on the board. */
279+ if (wb -> total_weight >= 2.0f ) {
280+ wb -> x = ((wb -> weight [WII_BOARD_SENSOR_ID_TOP_RIGHT ] +
281+ wb -> weight [WII_BOARD_SENSOR_ID_BOT_RIGHT ])
282+ -
283+ (wb -> weight [WII_BOARD_SENSOR_ID_TOP_LEFT ] +
284+ wb -> weight [WII_BOARD_SENSOR_ID_BOT_LEFT ]))
285+ / wb -> total_weight ;
286+ wb -> y = ((wb -> weight [WII_BOARD_SENSOR_ID_TOP_RIGHT ] +
287+ wb -> weight [WII_BOARD_SENSOR_ID_TOP_LEFT ])
288+ -
289+ (wb -> weight [WII_BOARD_SENSOR_ID_BOT_RIGHT ] +
290+ wb -> weight [WII_BOARD_SENSOR_ID_BOT_LEFT ]))
291+ / wb -> total_weight ;
292+ } else {
293+ wb -> x = 0 ;
294+ wb -> y = 0 ;
265295 }
266- else
267- {
268- wb -> bl = 17.0f * (f32 )(wb -> rbl - wb -> cbl [1 ])/(f32 )(wb -> cbl [2 ]- wb -> cbl [1 ]) + 17.0f ;
269- }
270296
271- wb -> x = ((wb -> tr + wb -> br ) - (wb -> tl + wb -> bl ))/2.0f ;
272- wb -> y = ((wb -> bl + wb -> br ) - (wb -> tl + wb -> tr ))/2.0f ;
297+ wb -> battery = calc_balanceboard_battery_bars (wb );
273298}
0 commit comments