blob: 4056218b7605d03fdc824480493facee6200a31b [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "oslo_config_test"
#include <errno.h>
#include <getopt.h>
#include <inttypes.h>
#include <limits.h>
#include <log/log.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <time.h>
#include <unistd.h>
#include "oslo_iaxxx_sensor_control.h"
#include "oslo_sound_model_control.h"
#define GETOPT_HELP_CHAR (CHAR_MIN - 2)
#define BGT60TR24C_NUM_REGISTERS 0x60
/* Oslo Calibration */
#define CAL_FILE "/persist/oslo/oslo.cal"
#define CAL_MODES_MAX 10
#define CAL_INVALID_MODE -1
#define CAL_MODE_IS_VALID(x) (x >= 0 && x < CAL_MODES_MAX)
#define CAL_VERSION_DEFAULT 1.0f
/* Transmit power */
#define TX_CAL_FILE "/persist/oslo/tx_power.cal"
typedef enum {
INJECT_MODE_OFF = 0,
INJECT_MODE_PRESENCE,
INJECT_MODE_REACH,
INJECT_MODE_NUM,
} oslo_inject_mode_t;
typedef struct {
int setting_id;
char *setting_name;
} oslo_settings_t;
/* map oslo driver setting name to param id */
static const oslo_settings_t oslo_driver_settings[] =
{
{SENSOR_PARAM_FRAMES_PROCESSED, "frames_processed"},
{SENSOR_PARAM_PRESET_RADAR_CONFIG, "preset_radar_config"},
{OSLO_CONFIG_DEFAULT, "config_default"},
{OSLO_CONFIG_PRESENCE, "config_presence"},
{OSLO_CONFIG_CONTINUOUS, "config_continuous"},
{OSLO_CONFIG_PRESENCE_SLOW, "config_presence_slow"},
{OSLO_CONFIG_FACTORY_PRESENCE, "config_factory_presence"},
{OSLO_CONFIG_FACTORY_REACH, "config_factory_reach"},
{OSLO_CONFIG_CW_MODE, "config_cw_mode"},
{OSLO_CONFIG_FACTORY_PRESENCE_V1, "config_factory_presence_v1"},
{OSLO_CONFIG_FACTORY_REACH_V1, "config_factory_reach_v1"},
{OSLO_CONFIG_REACH, "config_reach"},
{OSLO_CONFIG_PRESENCE_V1, "config_presence_v1"},
{OSLO_CONFIG_REACH_V1, "config_reach_v1"},
{OSLO_CONFIG_OFF, "config_off"},
{OSLO_CONTROL_RESTART, "oslo_control_restart"},
{OSLO_CONTROL_STRIP_HEADERS, "oslo_control_strip_headers"},
{OSLO_CONTROL_SLPI_INT, "oslo_control_slpi_interrupt"},
{OSLO_CONTROL_STOP, "oslo_control_stop"},
{OSLO_CONTROL_SIMULATE_RADAR_DATA, "oslo_control_simulate_radar_data"},
{OSLO_CONTROL_ASSERT_RESET, "oslo_control_assert_reset"},
{OSLO_PARAM_REQUEST_RATE, "param_request_rate"},
{OSLO_PARAM_REQUEST_ANTENNA_MASK, "param_request_antenna_mask"},
{OSLO_PARAM_TX_POWER, "param_tx_power"},
{OSLO_PARAM_LOWER_FREQ, "param_lower_freq"},
{OSLO_PARAM_UPPER_FREQ, "param_upper_freq"},
{OSLO_PARAM_SAMPLES_PER_CHIRP, "param_samples_per_chirp"},
{OSLO_PARAM_VGA_GAIN_CH1, "param_vga_gain_ch1"},
{OSLO_PARAM_VGA_GAIN_CH2, "param_vga_gain_ch2"},
{OSLO_PARAM_VGA_GAIN_CH3, "param_vga_gain_ch3"},
{OSLO_PARAM_VGA_GAIN_CH4, "param_vga_gain_ch4"},
{OSLO_PARAM_BURST_CHIRP_COUNT, "param_burst_chirp_count"},
{OSLO_PARAM_BURST_CHIRP_RATE, "param_burst_chirp_rate"},
{OSLO_PARAM_BURST_POWER_MODE, "param_burst_power_mode"},
{OSLO_PARAM_BURST_INTERCHIRP_POWER_MODE, "param_burst_interchirp_power_mode"},
{OSLO_PARAM_STARTUP_TIMING_WAKE_UP_TIME_100NS, "param_startup_timing_wake_up_time_100ns"},
{OSLO_PARAM_STARTUP_TIMING_PLL_SETTLE_TIME_COARSE_100NS,"param_startup_timing_pll_settle_time_coarse_100ns"},
{OSLO_PARAM_STARTUP_TIMING_PLL_SETTLE_TIME_FINE_100NS, "param_startup_timing_pll_settle_time_fine_100ns"},
{OSLO_PARAM_STARTUP_TIMING_OSCILLATOR_USEC, "param_startup_timing_oscillator_usec"},
{OSLO_PARAM_PRE_CHIRP_DELAY_100NS, "param_pre_chirp_delay_100ns"},
{OSLO_PARAM_POST_CHIRP_DELAY_100NS, "param_post_chirp_delay_100ns"},
{OSLO_PARAM_CHIRP_PA_DELAY_100NS, "param_chirp_pa_delay_100ns"},
{OSLO_PARAM_CHIRP_ADC_DELAY_100NS, "param_chirp_adc_delay_100ns"},
{OSLO_PARAM_VISUALIZER_DATA_TYPE, "param_visualizer_data_type"},
{OSLO_PARAM_OSCILLATOR_MODE, "param_oscillator_mode"},
{OSLO_PARAM_HP_GAIN_CH1, "param_hp_gain_ch1"},
{OSLO_PARAM_HP_GAIN_CH2, "param_hp_gain_ch2"},
{OSLO_PARAM_HP_GAIN_CH3, "param_hp_gain_ch3"},
{OSLO_PARAM_HP_GAIN_CH4, "param_hp_gain_ch4"},
{OSLO_PARAM_BASEBAND_RESET_PERIOD_1NS, "param_baseband_reset_period_1ns"},
{OSLO_PARAM_HP_CUTOFF_CH1, "param_hp_cutoff_ch1"},
{OSLO_PARAM_HP_CUTOFF_CH2, "param_hp_cutoff_ch2"},
{OSLO_PARAM_HP_CUTOFF_CH3, "param_hp_cutoff_ch3"},
{OSLO_PARAM_HP_CUTOFF_CH4, "param_hp_cutoff_ch4"},
{OSLO_PARAM_PHASE_CONFIG, "param_phase_config"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_PLL, "param_idle_settings_enable_pll"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_VCO, "param_idle_settings_enable_vco"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_FDIV, "param_idle_settings_enable_fdiv"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_BASEBAND, "param_idle_settings_enable_baseband"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_RF, "param_idle_settings_enable_rf"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_MADC, "param_idle_settings_enable_madc"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_MADC_BANDGAP, "param_idle_settings_enable_madc_bandgap"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_SADC, "param_idle_settings_enable_sadc"},
{OSLO_PARAM_IDLE_SETTINGS_ENABLE_SADC_BANDGAP, "param_idle_settings_enable_sadc_bandgap"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_PLL, "param_deep_sleep_settings_enable_pll"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_VCO, "param_deep_sleep_settings_enable_vco"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_FDIV, "param_deep_sleep_settings_enable_fdiv"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_BASEBAND, "param_deep_sleep_settings_enable_baseband"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_RF, "param_deep_sleep_settings_enable_rf"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_MADC, "param_deep_sleep_settings_enable_madc"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_MADC_BANDGAP, "param_deep_sleep_settings_enable_madc_bandgap"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_SADC, "param_deep_sleep_settings_enable_sadc"},
{OSLO_PARAM_DEEP_SLEEP_SETTINGS_ENABLE_SADC_BANDGAP, "param_deep_sleep_settings_enable_sadc_bandgap"},
{OSLO_PARAM_CHIRP_DIRECTION, "param_chirp_direction"},
{OSLO_PARAM_ADC_SAMPLE_RATE, "param_adc_sample_rate"},
{OSLO_PARAM_CHARGE_PUMP, "param_charge_pump"},
};
/* map oslo plugin setting name to param id */
static const oslo_settings_t oslo_plugin_settings[] =
{
{OSLO_SENSOR_PARAM_MODE, "plugin_mode"},
{OSLO_SENSOR_PARAM_SLPY_STATE, "plugin_slpy_state"},
{OSLO_SENSOR_PARAM_ENABLE_SLPY_RAW, "plugin_slpy_raw"},
{OSLO_SENSOR_PARAM_HOST, "plugin_set_host"},
{OSLO_SENSOR_STATE, "plugin_oslo_state"},
{OSLO_SENSOR_CONFIG_RECOVERY_COUNTER, "plugin_config_retries"},
{OSLO_SENSOR_PARAM_ENABLE_PRESENCE, "plugin_enable_presence"},
{OSLO_SENSOR_PARAM_ENABLE_REACH, "plugin_enable_reach"},
{OSLO_SENSOR_PARAM_ENABLE_FLICK, "plugin_enable_flick"},
{OSLO_SENSOR_PARAM_ENABLE_SWIPE, "plugin_enable_swipe"},
{OSLO_SENSOR_PARAM_ENABLE_TAP, "plugin_enable_tap"},
{OSLO_SENSOR_PARAM_ENABLE_AUDIO_FILTER, "plugin_enable_audio_filter"},
{OSLO_SENSOR_PARAM_ENABLE_WLC_FILTER, "plugin_enable_wlc_filter"},
{OSLO_SENSOR_PARAM_CPS, "plugin_cps"},
{OSLO_SENSOR_MAX_POWER_MODE, "plugin_max_power_mode"},
{OSLO_SENSOR_PARAM_SLPY_TEST_MODE, "plugin_slpy_test_mode"},
};
/* map oslo plugin test mode name to param id */
static const oslo_settings_t oslo_plugin_test_mode[] =
{
{OSLO_TESTMODE_RESET, "reset"},
{OSLO_TESTMODE_PRESENCE_ON, "presence_on"},
{OSLO_TESTMODE_PRESENCE_OFF, "presence_off"},
{OSLO_TESTMODE_SWIPE, "swipe"},
{OSLO_TESTMODE_FLICK, "flick"},
{OSLO_TESTMODE_REACH_IN, "reach_in"},
{OSLO_TESTMODE_REACH_OUT, "reach_out"},
{OSLO_TESTMODE_REACH_SWIPE, "reach+swipe"},
{OSLO_TESTMODE_REACH_FLICK, "reach+flick"},
{OSLO_TESTMODE_REACH_SWIPE_FLICK, "reach+swipe+flick"},
};
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
#define OSLO_DRIVER_SETTINGS_SIZE COUNT_OF(oslo_driver_settings)
#define OSLO_PLUGIN_SETTINGS_SIZE COUNT_OF(oslo_plugin_settings)
#define OSLO_PLUGIN_TESTMODE_SIZE COUNT_OF(oslo_plugin_test_mode)
struct cal_coefficient {
float version;
int mode;
float ch1_i_val;
float ch1_q_val;
float ch2_i_val;
float ch2_q_val;
float ch3_i_val;
float ch3_q_val;
};
static struct cal_coefficient cal_table[CAL_MODES_MAX];
static uint32_t tx_power_cal;
static struct option const long_options[] =
{
{"setparamid", required_argument, NULL, 's'},
{"value", required_argument, NULL, 'v'},
{"getparamid", required_argument, NULL, 'g'},
{"ping", required_argument, NULL, 'p'},
{"route", required_argument, NULL, 'r'},
{"readregister", required_argument, NULL, 'd'},
{"writeregister", required_argument, NULL, 'w'},
{"calibration", required_argument, NULL, 'c'},
{"tx power cal", required_argument, NULL, 'e'},
{"injection", required_argument, NULL, 'i'},
{"help", no_argument, NULL, GETOPT_HELP_CHAR},
{NULL, 0, NULL, 0}
};
void usage() {
fputs("\
USAGE -\n\
-------\n\
1) oslo_config_test -s <param_name> -v <param_val>\n\
2) oslo_config_test -g <param_name>\n\
\n\
In the first form, set a parameter with a value.\n\
In the second form, get a value of a parameter\n\
\n\
3) oslo_config_test -p <timeout>\n\
4) oslo_config_test -r <1/0>\n\
5) oslo_config_test -d <reg_addr>\n\
6) oslo_config_test -w <reg_addr> -v <reg_val>\n\
7) oslo_config_test -c 'V:<ver> M:<mode> <ch1 I_val> <ch1 Q_val> <ch2 I_val> <ch2 Q_val> <ch3 I_val> <ch3 Q_val>' \n\
8) oslo_config_test -t <test_mode> -v <elapsed time>\n\
9) oslo_config_test -i <0/1/2> # 0:off 1:entrance 2:interactive \n\
10) oslo_config_test -e '<tx_val>'\n\
", stdout);
fputs("\n\
OPTIONS - \n\
---------\n\
-s Set a parameter using its <param_name>.\n\
-v Set this value for the parameter ID that was passed with\n\
the option '-s'. Using this option alone is invalid.\n\
-g Get the value of a parameter using its <param_name>.\n\
-p Ping oslo sensor.\n\
-r Set sensor route.\n\
-d Read register.\n\
-w Write register.\n\
-c Store Calibration coefficients to persist file.\n\
-t Set the system into a test mode with optional gesture detection spoofing.\n\
-i Set the system into data injection mode.\n\
-e Store Tx power calibration to persist file.\n\
", stdout);
fputs("\n\
List of all <param_name>\n\
---------\
", stdout);
fputs("\n", stdout);
unsigned int i;
for (i = 0; i < OSLO_DRIVER_SETTINGS_SIZE; i++) {
fprintf(stdout, " %s\n", oslo_driver_settings[i].setting_name, stdout);
}
for (i = 0; i < OSLO_PLUGIN_SETTINGS_SIZE; i++) {
fprintf(stdout, " %s\n", oslo_plugin_settings[i].setting_name, stdout);
}
fputs("\n\
List of all <test_mode>\n\
---------\
", stdout);
fputs("\n", stdout);
for (i = 0; i < OSLO_PLUGIN_TESTMODE_SIZE; i++) {
fprintf(stdout, " %s\n", oslo_plugin_test_mode[i].setting_name, stdout);
}
exit(EXIT_FAILURE);
}
int oslo_driver_setting_lookup(char *in)
{
unsigned int i;
int ret = -1;
for (i = 0; i < OSLO_DRIVER_SETTINGS_SIZE; i++)
{
if (strcmp(in, oslo_driver_settings[i].setting_name) == 0)
{
ret = oslo_driver_settings[i].setting_id;
break;
}
}
return ret;
}
int oslo_plugin_setting_lookup(char *in)
{
unsigned int i;
int ret = -1;
for (i = 0; i < OSLO_PLUGIN_SETTINGS_SIZE; i++)
{
if (strcmp(in, oslo_plugin_settings[i].setting_name) == 0)
{
ret = oslo_plugin_settings[i].setting_id;
break;
}
}
return ret;
}
int oslo_plugin_test_mode_lookup(char *in)
{
unsigned int i;
int ret = -1;
for (i = 0; i < OSLO_PLUGIN_TESTMODE_SIZE; i++)
{
if (strcmp(in, oslo_plugin_test_mode[i].setting_name) == 0)
{
ret = oslo_plugin_test_mode[i].setting_id;
break;
}
}
return ret;
}
void oslo_enable(struct ia_sensor_mgr *smd, bool enable) {
if (enable) {
osloSoundModelEnable(true);
oslo_driver_set_param(smd, OSLO_CONTROL_RESTART, 1);
}
else {
oslo_driver_set_param(smd, OSLO_CONTROL_STOP, 0);
sleep(1);
osloSoundModelEnable(false);
}
}
bool ping_test(struct ia_sensor_mgr *smd, uint32_t ping_timeout_sec) {
bool ret = false;
uint32_t radar_frames_initial;
time_t start_time;
oslo_enable(smd, true);
start_time = time(NULL);
radar_frames_initial = oslo_driver_get_param(smd, SENSOR_PARAM_FRAMES_PROCESSED);
do {
uint32_t radar_frames = oslo_driver_get_param(smd, SENSOR_PARAM_FRAMES_PROCESSED);
if (radar_frames > radar_frames_initial) {
ALOGD("%s: frame number increased (%d, %d)",
__func__, radar_frames_initial, radar_frames);
ret = true;
break;
}
else
usleep(50 * 1000); // 50ms
} while (difftime(time(NULL), start_time) <= ping_timeout_sec);
oslo_enable(smd, false);
ALOGD("%s: %s", __func__, (ret ? "PASS" : "FAIL"));
fprintf(stdout, "%s: %s\n", __func__, (ret ? "PASS" : "FAIL"));
return ret;
}
void read_register(struct ia_sensor_mgr *smd, uint32_t reg_addr) {
uint32_t reg_val;
if (reg_addr >= BGT60TR24C_NUM_REGISTERS) {
fprintf(stdout, "Invalid reg addr:0x%02x\n", reg_addr);
return;
}
reg_val = oslo_driver_get_param(smd, OSLO_REGISTER_MIN + reg_addr);
ALOGD("reg[0x%02x]: 0x%06x\n", reg_addr, reg_val);
fprintf(stdout, "reg[0x%02x]: 0x%06x\n", reg_addr, reg_val);
}
void write_register(struct ia_sensor_mgr *smd, uint32_t reg_addr, uint32_t reg_val) {
if (reg_addr >= BGT60TR24C_NUM_REGISTERS) {
fprintf(stdout, "Invalid reg addr:0x%02x\n", reg_addr);
return;
}
oslo_driver_set_param(smd, OSLO_REGISTER_MIN + reg_addr, reg_val);
ALOGD("Write reg[0x%02x] val:0x%06x\n", reg_addr, reg_val);
fprintf(stdout, "Write reg[0x%02x] val:0x%06x\n", reg_addr, reg_val);
}
int cal_read_persist(void) {
FILE *fid;
struct cal_coefficient coef;
fid = fopen(CAL_FILE, "r");
if (fid == NULL) {
ALOGD("%s: Cannot open '%s'\n", __func__, CAL_FILE);
return -errno;
}
while (!feof(fid)) {
int num;
memset(&coef, 0, sizeof(coef));
coef.mode = CAL_INVALID_MODE;
num = fscanf(fid, "Version: %f\n", &coef.version);
if (num != 1) {
ALOGE("%s: Parse Version failed, num:%d\n", __func__, num);
coef.version = CAL_VERSION_DEFAULT;
}
num = fscanf(fid, "Mode: %d\n", &coef.mode);
if (num != 1) {
ALOGE("%s: Parse Mode failed, num:%d\n", __func__, num);
break;
}
num = fscanf(fid, "ch1: %f %f\n", &coef.ch1_i_val, &coef.ch1_q_val);
if (num != 2) {
ALOGE("%s: Parse ch1 failed, num:%d\n", __func__, num);
break;
}
num = fscanf(fid, "ch2: %f %f\n", &coef.ch2_i_val, &coef.ch2_q_val);
if (num != 2) {
ALOGE("%s: Parse ch2 failed, num:%d\n", __func__, num);
break;
}
num = fscanf(fid, "ch3: %f %f\n", &coef.ch3_i_val, &coef.ch3_q_val);
if (num != 2) {
ALOGE("%s: Parse ch3 failed, num:%d\n", __func__, num);
break;
}
if (CAL_MODE_IS_VALID(coef.mode)) {
memcpy(&cal_table[coef.mode], &coef, sizeof(coef));
ALOGD("%s: %.1f %d %f %f %f %f %f %f\n", __func__,
coef.version,
coef.mode,
coef.ch1_i_val, coef.ch1_q_val,
coef.ch2_i_val, coef.ch2_q_val,
coef.ch3_i_val, coef.ch3_q_val);
} else {
ALOGE("%s: Invalid mode:%d\n", __func__, coef.mode);
}
}
fclose(fid);
return 0;
}
int cal_write_persist(const struct cal_coefficient* coef) {
FILE *fid;
if (!coef) {
ALOGE("%s: Invalid coef", __func__);
fprintf(stdout, "%s: Invalid coef\n", __func__);
return -EINVAL;
}
if (!CAL_MODE_IS_VALID(coef->mode)) {
ALOGE("%s: Invalid mode:%d", __func__, coef->mode);
fprintf(stdout, "%s: Invalid mode:%d\n", __func__, coef->mode);
return -EINVAL;
}
fid = fopen(CAL_FILE, "w");
if (fid == NULL) {
ALOGE("Cannot open '%s' (%s)\n", CAL_FILE, strerror(errno));
fprintf(stdout, "Cannot open '%s' (%s)\n", CAL_FILE, strerror(errno));
return -errno;
}
memcpy(&cal_table[coef->mode], coef, sizeof(struct cal_coefficient));
for (int i = 0; i < CAL_MODES_MAX; i++) {
if (CAL_MODE_IS_VALID(cal_table[i].mode)) {
fprintf(fid, "Version: %.1f\n", cal_table[i].version);
fprintf(fid, "Mode: %u\n", cal_table[i].mode);
fprintf(fid, "ch1: %f %f\n",
cal_table[i].ch1_i_val,
cal_table[i].ch1_q_val);
fprintf(fid, "ch2: %f %f\n",
cal_table[i].ch2_i_val,
cal_table[i].ch2_q_val);
fprintf(fid, "ch3: %f %f\n",
cal_table[i].ch3_i_val,
cal_table[i].ch3_q_val);
ALOGD("%s: %.1f %d %f %f %f %f %f %f\n", __func__,
cal_table[i].version,
cal_table[i].mode,
cal_table[i].ch1_i_val, cal_table[i].ch1_q_val,
cal_table[i].ch2_i_val, cal_table[i].ch2_q_val,
cal_table[i].ch3_i_val, cal_table[i].ch3_q_val);
}
}
fclose(fid);
return 0;
}
static int read_tx_power_from_persist(void) {
FILE *fid;
uint32_t tx_power = 0;
fid = fopen(TX_CAL_FILE, "r");
if (fid == NULL) {
ALOGD("%s: Cannot open '%s'\n", __func__, TX_CAL_FILE);
return -errno;
}
while (!feof(fid)) {
int num;
num = fscanf(fid, "tx_power: %d\n", &tx_power);
if (num != 1) {
ALOGE("%s: Parse tx power failed, num:%d\n", __func__, num);
break;
}
memcpy(&tx_power_cal, &tx_power, sizeof(tx_power));
ALOGD("%s: tx_power: %d\n", __func__, tx_power);
}
fclose(fid);
return 0;
}
static int write_tx_power_to_persist(const uint32_t* tx_power) {
FILE *fid;
if (!tx_power) {
ALOGE("%s: Invalid tx power", __func__);
fprintf(stdout, "%s: Invalid tx power\n", __func__);
return -EINVAL;
}
fid = fopen(TX_CAL_FILE, "w");
if (fid == NULL) {
ALOGE("Cannot open '%s' (%s)\n", TX_CAL_FILE, strerror(errno));
fprintf(stdout, "Cannot open '%s' (%s)\n", TX_CAL_FILE, strerror(errno));
return -errno;
}
memcpy(&tx_power_cal, tx_power, sizeof(tx_power_cal));
fprintf(fid, "tx_power: %u\n", tx_power_cal);
ALOGD("%s: %d\n", __func__, tx_power_cal);
fclose(fid);
return 0;
}
int main(int argc, char *argv[]) {
struct ia_sensor_mgr * smd;
char use_case;
int driver_param_id = -1;
int plugin_param_id = -1;
int c;
float param_val = 0.0;
uint32_t ping_timeout_sec;
bool route_enable;
uint32_t reg_addr;
uint32_t reg_val;
bool reg_val_set = false;
struct cal_coefficient cal_coef = { .mode = CAL_INVALID_MODE };
uint32_t tx_power = 0;
int test_mode_param_id = -1;
oslo_inject_mode_t inject_mode = INJECT_MODE_OFF;
if (argc <= 1) {
usage();
}
while ((c = getopt_long (argc, argv, "s:v:g:p:r:d:w:c:t:i:e:", long_options, NULL)) != -1) {
switch (c) {
case 's':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, s option requires an argument");
usage();
} else {
driver_param_id = oslo_driver_setting_lookup(optarg);
plugin_param_id = oslo_plugin_setting_lookup(optarg);
if (driver_param_id == -1 && plugin_param_id == -1) {
fprintf(stderr, "Invalid setting %s", optarg);
usage();
} else {
use_case = 's';
}
}
break;
case 'v':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, v option requires an argument");
usage();
} else {
if ('s' == use_case) {
param_val = strtof(optarg, NULL);
use_case = 'v';
} else if ('w' == use_case) {
reg_val = strtoul(optarg, NULL, 0);
reg_val_set = true;
} else if ('t' == use_case) {
param_val = strtof(optarg, NULL);
use_case = 'v';
} else {
fprintf(stderr, "Incorrect usage, v option should be the second option");
usage();
}
}
break;
case 'g':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, g option requires an argument");
usage();
} else {
driver_param_id = oslo_driver_setting_lookup(optarg);
plugin_param_id = oslo_plugin_setting_lookup(optarg);
if (driver_param_id == -1 && plugin_param_id == -1) {
fprintf(stderr, "Invalid setting %s", optarg);
usage();
} else {
use_case = 'g';
}
}
break;
case 'p':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, p option requires an argument");
usage();
} else {
ping_timeout_sec = strtoul(optarg, NULL, 0);
use_case = 'p';
}
break;
case 'r':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, r option requires an argument");
usage();
} else {
route_enable = (strtoul(optarg, NULL, 0) != 0) ? true : false;
use_case = 'r';
}
break;
case 'd':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, d option requires an argument");
usage();
} else {
reg_addr = strtoul(optarg, NULL, 0);
use_case = 'd';
}
break;
case 'w':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, w option requires an argument");
usage();
} else {
reg_addr = strtoul(optarg, NULL, 0);
use_case = 'w';
}
break;
case 'c':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, c option requires an argument");
usage();
} else {
int num_matched;
num_matched = sscanf(optarg, "V:%f M:%d %f %f %f %f %f %f",
&cal_coef.version,
&cal_coef.mode,
&cal_coef.ch1_i_val, &cal_coef.ch1_q_val,
&cal_coef.ch2_i_val, &cal_coef.ch2_q_val,
&cal_coef.ch3_i_val, &cal_coef.ch3_q_val);
if (num_matched == 8) {
use_case = 'c';
} else {
fprintf(stderr, "Incorrect -c arguments %s\n", optarg);
usage();
}
}
break;
case 'e':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, e option requires an argument");
usage();
} else {
int num_matched;
num_matched = sscanf(optarg, "%d", &tx_power);
if (num_matched == 1) {
use_case = 'e';
} else {
fprintf(stderr, "Incorrect -e arguments %s \n", optarg);
usage();
}
}
break;
case 't':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, t option requires an argument");
usage();
} else {
test_mode_param_id = oslo_plugin_test_mode_lookup(optarg);
if (test_mode_param_id == -1) {
fprintf(stderr, "Invalid setting %s", optarg);
usage();
} else {
use_case = 't';
fprintf(stderr, "Executing test mode %s\n", optarg);
}
}
break;
case 'i':
if (NULL == optarg) {
fprintf(stderr, "Incorrect usage, i option requires an argument");
usage();
} else {
inject_mode = strtoul(optarg, NULL, 0);
if (inject_mode >= INJECT_MODE_NUM) {
fprintf(stderr, "Invalid setting %s", optarg);
usage();
} else {
use_case = 'i';
}
}
break;
case GETOPT_HELP_CHAR:
default:
usage();
break;
}
smd = iaxxx_sensor_mgr_init();
if (NULL == smd) {
ALOGE("%s: ERROR Failed to init ia_sensor_mgr", __func__);
return -EINVAL;
}
if ('v' == use_case) {
if (driver_param_id != -1) {
oslo_driver_set_param(smd, driver_param_id, param_val);
} else if (plugin_param_id != -1) {
oslo_plugin_set_param(plugin_param_id, param_val);
} else if (test_mode_param_id != -1) {
uint32_t integer_param = (uint32_t)lrintf(param_val);
if (param_val < 0) {
ALOGD("%s: Test mode: %d with no event", __func__, test_mode_param_id);
integer_param = UINT32_MAX;
} else if (param_val > 0) {
ALOGD("%s: Test mode: %d with duration: %" PRIu32, __func__, test_mode_param_id, integer_param);
} else {
ALOGD("%s: Test mode: %d with no duration", __func__, test_mode_param_id);
}
oslo_plugin_set_param(test_mode_param_id, integer_param);
}
} else if ('g' == use_case) {
if (driver_param_id != -1) {
oslo_driver_get_param(smd, driver_param_id);
} else if (plugin_param_id != -1) {
oslo_plugin_get_param(plugin_param_id);
}
} else if ('p' == use_case) {
ping_test(smd, ping_timeout_sec);
} else if ('r' == use_case) {
route_enable ? osloSoundModelEnable(true) : oslo_enable(smd, false);
} else if ('d' == use_case) {
read_register(smd, reg_addr);
} else if ('w' == use_case) {
if (reg_val_set)
write_register(smd, reg_addr, reg_val);
} else if ('c' == use_case) {
for (int i = 0; i < CAL_MODES_MAX; i++) {
cal_table[i].mode = CAL_INVALID_MODE;
}
cal_read_persist();
cal_write_persist(&cal_coef);
} else if ('e' == use_case) {
read_tx_power_from_persist();
write_tx_power_to_persist(&tx_power);
} else if ('i' == use_case) {
oslo_plugin_set_param(OSLO_SENSOR_PARAM_SLPY_STATE, 0);
oslo_driver_set_param(smd, OSLO_CONTROL_INJECT_RADAR_DATA, inject_mode);
oslo_plugin_set_param(OSLO_SENSOR_PARAM_SLPY_STATE, inject_mode);
}
iaxxx_sensor_mgr_deinit(smd);
}
return 0;
}