mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
Motion sense calculations do not require huge amounts of precision, so
fixed point is plenty accurate. And fixed point works on Cortex-M0,
which lacks a FPU.
BUG=chrome-os-partner:36126
BRANCH=minnie (samus already works with the FPU, but could grab this if we
want additional testing)
TEST=manual
1. Boot system
2. At EC console: accelinfo on 250
3. Move lid through several different angles (30 degrees to max open) and
see that it updates correctly and relatively smoothly. A few degrees
of angle jitter is normal.
4. At several angles, rotate the chromebook around and see that the lid
angle remains relatively stable.
5. If the hinge is made normal to the ground (or within 15 degrees of
vertical), the angle should read 500, since the acceleration vectors
don't yield good results in that orientation (for either fixed or float
math).
And run 'make buildall -j', which tests arc_cos() and lid angle calculations
Change-Id: I70a0d08b8914629a3e21ae5578cbe8e50f29ad68
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/244116
Reviewed-by: Alec Berg <alecaberg@chromium.org>
56 lines
1.4 KiB
C
56 lines
1.4 KiB
C
/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*
|
|
* Test motion sense code.
|
|
*/
|
|
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include "common.h"
|
|
#include "math_util.h"
|
|
#include "motion_sense.h"
|
|
#include "test_util.h"
|
|
#include "util.h"
|
|
|
|
/*****************************************************************************/
|
|
/*
|
|
* Need to define motion sensor globals just to compile.
|
|
* We include motion task to force the inclusion of math_util.c
|
|
*/
|
|
struct motion_sensor_t motion_sensors[] = {};
|
|
const unsigned int motion_sensor_count = ARRAY_SIZE(motion_sensors);
|
|
|
|
/*****************************************************************************/
|
|
/* Test utilities */
|
|
|
|
/* Macro to compare two floats and check if they are equal within diff. */
|
|
#define IS_FLOAT_EQUAL(a, b, diff) ((a) >= ((b) - diff) && (a) <= ((b) + diff))
|
|
|
|
#define ACOS_TOLERANCE_DEG 0.5f
|
|
#define RAD_TO_DEG (180.0f / 3.1415926f)
|
|
|
|
static int test_acos(void)
|
|
{
|
|
float a, b;
|
|
float test;
|
|
|
|
/* Test a handful of values. */
|
|
for (test = -1.0; test <= 1.0; test += 0.01) {
|
|
a = FP_TO_FLOAT(arc_cos(FLOAT_TO_FP(test)));
|
|
b = acos(test) * RAD_TO_DEG;
|
|
TEST_ASSERT(IS_FLOAT_EQUAL(a, b, ACOS_TOLERANCE_DEG));
|
|
}
|
|
|
|
return EC_SUCCESS;
|
|
}
|
|
|
|
void run_test(void)
|
|
{
|
|
test_reset();
|
|
|
|
RUN_TEST(test_acos);
|
|
|
|
test_print_result();
|
|
}
|