14d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro/* 24d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Copyright (C) 2016 The Android Open Source Project 34d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 44d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Licensed under the Apache License, Version 2.0 (the "License"); 54d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * you may not use this file except in compliance with the License. 64d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * You may obtain a copy of the License at 74d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 84d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * http://www.apache.org/licenses/LICENSE-2.0 94d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Unless required by applicable law or agreed to in writing, software 114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * distributed under the License is distributed on an "AS IS" BASIS, 124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * See the License for the specific language governing permissions and 144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * limitations under the License. 154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro */ 164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <general_test/basic_sensor_test_base.h> 184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <cinttypes> 204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <cstddef> 214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <shared/send_message.h> 234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro#include <chre.h> 254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::MessageType; 274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendFatalFailureToHost; 284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendInternalFailureToHost; 294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendStringToHost; 304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurousing nanoapp_testing::sendSuccessToHost; 314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro/* 334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Our general test flow is as follows: 344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Constructor: Send startEvent to self to start. 364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * StartEvent: Get default sensor and perform various sanity checks. Configure 374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * the sensor. 384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * At this point, it depends what kind of sensor we have for how we proceed 404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * with the test. 414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * One-shot: finishTest() 434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * On-change: Wait for one data event from sensor. Then finishTest(). 444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * Continuous: Wait for two data events from sensor. Then finishTest(). 454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * 464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * We also look for and perform basic sanity checking on sampling status 474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro * change events, as well as bias data reports. 484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro */ 494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguronamespace general_test { 524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguronamespace { 544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kStartEvent = CHRE_EVENT_FIRST_USER_VALUE; 554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint16_t kPassiveCompleteEvent = CHRE_EVENT_FIRST_USER_VALUE + 1; 564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint64_t kNanosecondsPerSecond = 1000000000; 574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguroconstexpr uint64_t kEventLoopSlack = 100000000; // 100 msec 584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurouint64_t getEventDuration(const chreSensorThreeAxisData *event) { 604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t duration = 0; 614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro for (size_t i = 0; i < event->header.readingCount; i++) { 624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro duration += event->readings[i].timestampDelta; 634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro return duration; 664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} // anonymous namespace 684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur IshiguroBasicSensorTestBase::BasicSensorTestBase() 704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro : Test(CHRE_API_VERSION_1_0), 714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mInMethod(true), 724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mExternalSamplingStatusChange(false), 734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mDoneWithPassiveConfigure(false), 744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState(State::kPreStart), 754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mInstanceId(chreGetInstanceId()) 764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro /* All other members initialized later */ { 774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::setUp(uint32_t messageSize, 804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro const void * /* message */) { 814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (messageSize != 0) { 824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost( 834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "Beginning message expects 0 additional bytes, got ", 844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &messageSize); 854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Most tests start running in the constructor. However, since this 874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // is a base class, and we invoke abstract methods when running our 884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // test, we don't start until after the class has been fully 894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // constructed. 904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSendEvent(kStartEvent, nullptr, nullptr, mInstanceId)) { 914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Failed chreSendEvent to begin test"); 924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mInMethod = false; 944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::checkPassiveConfigure() { 974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro chreSensorConfigureMode mode = isOneShotSensor() ? 984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_ONE_SHOT : 994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_CONTINUOUS; 1004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mApiVersion == CHRE_API_VERSION_1_0) { 1024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Any attempt to make a PASSIVE call with a non-default interval 1034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // or latency should fail. 1044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (chreSensorConfigure(mSensorHandle, mode, 1054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_INTERVAL_DEFAULT, 999)) { 1064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() allowed passive with " 1074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "different latency"); 1084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (chreSensorConfigure(mSensorHandle, mode, 1104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 999, CHRE_SENSOR_LATENCY_DEFAULT)) { 1114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() allowed passive with " 1124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "different interval"); 1134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // TODO: In a more in-depth test, we should test passive mode 1154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // receiving data. This is somewhat complicated by the fact that 1164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // pretty much by definition, we don't control whether a sensor 1174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // we're passively listening to is enabled or not. We could try 1184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // to control this with an additional test nanoapp toggling sensor 1194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // usage, but there's still the complication of other nanoapps in 1204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // the system. 1214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else { 1224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSensorConfigure(mSensorHandle, mode, 1234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_INTERVAL_DEFAULT, 1244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro kNanosecondsPerSecond)) { 1254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() failed passive with " 1264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "default interval and non-default latency"); 1274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!isOneShotSensor() && !chreSensorConfigure( 1294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mSensorHandle, mode, kNanosecondsPerSecond, 1304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_LATENCY_DEFAULT)) { 1314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() failed passive with " 1324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "non-default interval and default latency"); 1334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!isOneShotSensor() && !chreSensorConfigure( 1354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mSensorHandle, mode, kNanosecondsPerSecond, 1364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro kNanosecondsPerSecond)) { 1374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() failed passive with " 1384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "non-default interval and latency"); 1394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 1424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::startTest() { 1444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState = State::kPreConfigure; 1454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSensorFindDefault(getSensorType(), &mSensorHandle)) { 1464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (isRequiredSensor()) { 1474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Sensor is required, but no default found."); 1484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendStringToHost(MessageType::kSkipped, "No default sensor found for " 1504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "optional sensor."); 1514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro return; 1524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro chreSensorInfo info; 1554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreGetSensorInfo(mSensorHandle, &info)) { 1564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("GetSensorInfo() call failed"); 1574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (info.sensorName == nullptr) { 1594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorInfo::sensorName is NULL"); 1604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (info.sensorType != getSensorType()) { 1624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint32_t type = info.sensorType; 1634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorInfo::sensorType is not expected " 1644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "value, is:", &type); 1654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (info.isOnChange != isOnChangeSensor()) { 1674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorInfo::isOnChange is opposite of " 1684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "what we expected"); 1694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (info.isOneShot != isOneShotSensor()) { 1714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorInfo::isOneShot is opposite of " 1724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "what we expected"); 1734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreGetSensorSamplingStatus(mSensorHandle, &mOriginalStatus)) { 1764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreGetSensorSamplingStatus() failed"); 1774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Nanoapp may start getting events with a passive request. Set the base 1804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // timestamp to compare against before configuring the sensor. 1814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mPreTimestamp = chreGetTime(); 1824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro checkPassiveConfigure(); 1844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSendEvent(kPassiveCompleteEvent, nullptr, nullptr, mInstanceId)) { 1854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Failed chreSendEvent to complete passive test"); 1864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 1874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Default interval/latency must be accepted by all sensors. 1894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mNewStatus = { 1904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_INTERVAL_DEFAULT, /* interval */ 1914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_LATENCY_DEFAULT, /* latency */ 1924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro true /* enabled */ 1934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro }; 1944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro chreSensorConfigureMode mode = isOneShotSensor() ? 1954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_CONFIGURE_MODE_ONE_SHOT : 1964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_CONFIGURE_MODE_CONTINUOUS; 1974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 1984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSensorConfigure(mSensorHandle, mode, 1994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mNewStatus.interval, mNewStatus.latency)) { 2004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() call failed with default" 2014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro " interval and latency"); 2024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // handleEvent may start getting events, and our testing continues there. 2044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // (Note: The CHRE is not allow to call handleEvent() while we're still 2054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // in this method, so it's not a race to set this state here.) 2064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Set a new request so the test can receive events before test timeout. 2084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mNewStatus = { 2094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // This will be valid on all required sensors. 2104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // TODO: A more in-depth test could try to change this interval 2114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // from what it currently is for the sensor, and confirm it 2124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // changes back when we're DONE. But that's beyond the current 2134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // scope of this 'basic' test. 2144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro kNanosecondsPerSecond, /* interval */ 2154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // We want the test to run as quickly as possible. 2164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // TODO: Similar to the interval, we could try to test changes in 2174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // this value, but it's beyond our 'basic' scope for now. 2184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_LATENCY_ASAP, /* latency */ 2194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro true /* enabled */ 2204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro }; 2214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Skip one-shot sensors for non-default interval configurations. 2234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!isOneShotSensor() && !chreSensorConfigure( 2244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mSensorHandle, mode, mNewStatus.interval, mNewStatus.latency)) { 2254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("chreSensorConfigure() call failed"); 2264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (isOnChangeSensor()) { 2294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // We should receive the current state of this sensor after the 2304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // configure call. However, we're not assured additional events, 2314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // since we don't know if this is going to change. Thus, we jump 2324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // our testing state to waiting for the last event. 2334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState = State::kExpectingLastDataEvent; 2344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (isOneShotSensor()) { 2354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // There's no assurance we'll get any events from a one-shot 2364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // sensor, so we'll just skip to the end of the test. 2374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro finishTest(); 2384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else { 2394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState = State::kExpectingInitialDataEvent; 2404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 2424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::finishTest() { 2444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreSensorConfigureModeOnly(mSensorHandle, 2454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_SENSOR_CONFIGURE_MODE_DONE)) { 2464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Unable to configure sensor mode to DONE"); 2474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mDoneTimestamp = chreGetTime(); 2494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro chreSensorSamplingStatus status; 2504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!chreGetSensorSamplingStatus(mSensorHandle, &status)) { 2514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Could not get final sensor info"); 2524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!mExternalSamplingStatusChange) { 2544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // No one else changed this, so it should be what we had before. 2554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (status.enabled != mOriginalStatus.enabled) { 2564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorInfo.enabled not back to original"); 2574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (status.interval != mOriginalStatus.interval) { 2594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorInfo.interval not back to original"); 2604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (status.latency != mOriginalStatus.latency) { 2624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorInfo.latency not back to original"); 2634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState = State::kFinished; 2664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendSuccessToHost(); 2674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 2684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::sanityCheckHeader(const chreSensorDataHeader* header, 2704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro bool modifyTimestamps, 2714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t eventDuration) { 2724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (header->sensorHandle != mSensorHandle) { 2734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataHeader for wrong handle", 2744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &header->sensorHandle); 2754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (!isOnChangeSensor()) { 2784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // An on-change sensor is supposed to send its current state, which 2794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // could be timestamped in the past. Everything else should be 2804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // getting recent data. 2814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t *minTime = nullptr; 2824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t *timeToUpdate = nullptr; 2834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mState == State::kExpectingInitialDataEvent) { 2854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro minTime = &mPreTimestamp; 2864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro timeToUpdate = &mFirstEventTimestamp; 2874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (mState == State::kExpectingLastDataEvent) { 2884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro minTime = &mFirstEventTimestamp; 2894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro timeToUpdate = &mLastEventTimestamp; 2904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else { // State::kFinished 2914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro minTime = &mLastEventTimestamp; 2924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Go ahead and update this timestamp again. 2934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro timeToUpdate = &mLastEventTimestamp; 2944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 2954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 2964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // If there's another CHRE client requesting batched sensor data, 2974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // baseTimestamp can be before mPreTimestamp. Also allow 2984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // kEventLoopSlack to handle this nanoapp before handling the sensor 2994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // event. 3004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t minTimeWithSlack = 3014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (*minTime > eventDuration + kEventLoopSlack) ? 3024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (*minTime - eventDuration - kEventLoopSlack) : 0; 3034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (header->baseTimestamp < minTimeWithSlack) { 3044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro chreLog(CHRE_LOG_ERROR, 3054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "baseTimestamp %" PRIu64 " < minTimeWithSlack %" PRIu64 3064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro ": minTime %" PRIu64 " eventDuration %" PRIu64 3074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro " kEventLoopSlack %" PRIu64, 3084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro header->baseTimestamp, minTimeWithSlack, 3094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *minTime, eventDuration, kEventLoopSlack); 3104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataHeader is in the past"); 3114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if ((mState == State::kFinished) && 3134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (header->baseTimestamp > mDoneTimestamp)) { 3144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataHeader is from after DONE"); 3154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (modifyTimestamps) { 3174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro *timeToUpdate = header->baseTimestamp; 3184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (header->readingCount == 0) { 3214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataHeader has readingCount of 0"); 3224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if ((header->reserved[0] != 0) || (header->reserved[1] != 0)) { 3244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataHeader has non-zero reserved bytes"); 3254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 3274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleBiasEvent( 3304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint16_t eventType, const chreSensorThreeAxisData *eventData) { 3314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint8_t expectedSensorType = 0; 3324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint32_t eType = eventType; 3334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (eventType == CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO) { 3344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro expectedSensorType = CHRE_SENSOR_TYPE_GYROSCOPE; 3354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (eventType == CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO) { 3364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro expectedSensorType = CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD; 3374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else { 3384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendInternalFailureToHost("Illegal eventType in handleBiasEvent", 3394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &eType); 3404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (expectedSensorType != getSensorType()) { 3434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Unexpected bias event:", &eType); 3444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sanityCheckHeader(&eventData->header, false, getEventDuration(eventData)); 3464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // TODO: Sanity check the eventData. This check is out-of-scope for 3484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Android N testing. 3494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 3504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3514d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleSamplingChangeEvent( 3524d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro const chreSensorSamplingStatusEvent* eventData) { 3534d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (eventData->sensorHandle != mSensorHandle) { 3544d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SamplingChangeEvent for wrong sensor handle:", 3554d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &eventData->sensorHandle); 3564d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3574d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mState == State::kFinished) { 3584d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // TODO: If we strictly define whether this event is or isn't 3594d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // generated upon being DONE with a sensor, then we can perform 3604d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // a strict check here. For now, we just let this go. 3614d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro return; 3624d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3634d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Passive sensor requests do not guarantee sensors will always be enabled. 3644d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Bypass 'enabled' check for passive configurations. 3654d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mDoneWithPassiveConfigure && !eventData->status.enabled) { 3664d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SamplingChangeEvent disabled the sensor."); 3674d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3684d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3694d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if ((mNewStatus.interval != eventData->status.interval) || 3704d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (mNewStatus.latency != eventData->status.latency)) { 3714d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // This is from someone other than us. Let's note that so we know 3724d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // our sanity checks are invalid. 3734d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mExternalSamplingStatusChange = true; 3744d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3754d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 3764d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3774d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleSensorDataEvent(const void* eventData) { 3784d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if ((mState == State::kPreStart) || (mState == State::kPreConfigure)) { 3794d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("SensorDataEvent sent too early."); 3804d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 3814d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Note, if mState is kFinished, we could be getting batched data which 3824d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // hadn't been delivered yet at the time we were DONE. We'll sanity 3834d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // check it, even though in theory we're done testing. 3844d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint64_t eventDuration = getEventDuration( 3854d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro static_cast<const chreSensorThreeAxisData *>(eventData)); 3864d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sanityCheckHeader(static_cast<const chreSensorDataHeader*>(eventData), 3874d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro true, eventDuration); 3884d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 3894d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro // Send to the sensor itself for any additional checks of actual data. 3904d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro confirmDataIsSane(eventData); 3914d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mState == State::kExpectingInitialDataEvent) { 3924d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mState = State::kExpectingLastDataEvent; 3934d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (mState == State::kExpectingLastDataEvent) { 3944d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro finishTest(); 3954d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (mState != State::kFinished) { 3964d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint32_t value = static_cast<uint32_t>(mState); 3974d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendInternalFailureToHost("Illegal mState in handleSensorDataEvent:", 3984d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &value); 3994d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 4004d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 4014d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4024d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishigurovoid BasicSensorTestBase::handleEvent( 4034d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint32_t senderInstanceId, uint16_t eventType, const void* eventData) { 4044d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (mInMethod) { 4054d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("handleEvent() invoked while already in " 4064d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro "method."); 4074d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 4084d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mInMethod = true; 4094d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro const uint16_t dataEventType = 4104d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro CHRE_EVENT_SENSOR_DATA_EVENT_BASE + getSensorType(); 4114d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4124d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if (senderInstanceId == mInstanceId) { 4134d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro if ((eventType == kStartEvent) && (mState == State::kPreStart)) { 4144d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro startTest(); 4154d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (eventType == kPassiveCompleteEvent) { 4164d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mDoneWithPassiveConfigure = true; 4174d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 4184d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4194d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if ((mState == State::kPreStart) || 4204d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (mState == State::kPreConfigure)) { 4214d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro unexpectedEvent(eventType); 4224d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4234d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (senderInstanceId != CHRE_INSTANCE_ID) { 4244d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Unexpected senderInstanceId:", 4254d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro &senderInstanceId); 4264d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4274d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (eventData == nullptr) { 4284d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro uint32_t eType = eventType; 4294d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro sendFatalFailureToHost("Got NULL eventData for event:", &eType); 4304d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4314d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (eventType == dataEventType) { 4324d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro handleSensorDataEvent(eventData); 4334d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4344d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if (eventType == CHRE_EVENT_SENSOR_SAMPLING_CHANGE) { 4354d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro handleSamplingChangeEvent( 4364d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro static_cast<const chreSensorSamplingStatusEvent*>(eventData)); 4374d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4384d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else if ((eventType == CHRE_EVENT_SENSOR_GYROSCOPE_BIAS_INFO) || 4394d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro (eventType == CHRE_EVENT_SENSOR_GEOMAGNETIC_FIELD_BIAS_INFO)) { 4404d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro handleBiasEvent(eventType, 4414d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro static_cast<const chreSensorThreeAxisData*>(eventData)); 4424d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4434d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } else { 4444d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro unexpectedEvent(eventType); 4454d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro } 4464d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4474d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro mInMethod = false; 4484d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} 4494d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro 4504d04a937b1bf7a949dfb00650b2640a9ed0c8acaArthur Ishiguro} // namespace general_test 451