feat: add FT1 factory test host and protocol updates
This commit is contained in:
@@ -5,7 +5,6 @@
|
||||
#include "ql_audio.h"
|
||||
#include "ql_fs.h"
|
||||
#include "ql_gpio.h"
|
||||
#include "ql_power.h"
|
||||
#include "ql_rtos.h"
|
||||
|
||||
#include "factory_audio.h"
|
||||
@@ -16,7 +15,9 @@
|
||||
#define ES8311_DEVICE_ID 0x83
|
||||
#define ES8311_VOLUME_100 0x8E
|
||||
#define FT_PCM_CHUNK_BYTES 640
|
||||
#define FT_MP3_TIMEOUT_TICKS (15000 / 5)
|
||||
#define FT_PCM_CHUNK_MS 20
|
||||
#define FT_PCM_WRITE_RETRIES 40
|
||||
#define FT_MP3_TIMEOUT_MS 15000
|
||||
|
||||
extern void sw_i2c_init(void);
|
||||
extern int8 sw_i2c_start(void);
|
||||
@@ -157,7 +158,7 @@ int factory_audio_play_prompt(const char *path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ql_rtos_semaphore_wait(g_mp3_sem, FT_MP3_TIMEOUT_TICKS);
|
||||
ret = ql_rtos_semaphore_wait(g_mp3_sem, FT_MP3_TIMEOUT_MS);
|
||||
if (ret != 0 || g_mp3_result != 2) {
|
||||
ql_stop_mp3_play(g_mp3_handle, 0);
|
||||
factory_pa_control(0);
|
||||
@@ -167,15 +168,20 @@ int factory_audio_play_prompt(const char *path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wait_pwrkey_level(unsigned char expected, u32 timeout_ms)
|
||||
static int wait_loopback_key_level(PIN_LEVEL_E expected, u32 timeout_ms)
|
||||
{
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
u32 start = ft_now_ms();
|
||||
while (ql_get_pwrkey_status() != expected) {
|
||||
if (ft_now_ms() - start >= timeout_ms) return -1;
|
||||
do {
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level == expected) {
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level == expected) return 0;
|
||||
}
|
||||
ql_rtos_task_sleep_ms(10);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
return ql_get_pwrkey_status() == expected ? 0 : -1;
|
||||
} while (ft_now_ms() - start < timeout_ms);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
@@ -187,21 +193,29 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
audio_record_handle record_handle = 0;
|
||||
audio_track_handle track_handle = 0;
|
||||
int ret = -1;
|
||||
u32 release_wait_start = 0;
|
||||
|
||||
if (recorded_ms) *recorded_ms = 0;
|
||||
if (wait_pwrkey_level(0, 10000) != 0 ||
|
||||
wait_pwrkey_level(1, wait_timeout_ms) != 0) {
|
||||
ql_gpio_init(FT_LOOPBACK_KEY_PIN, PIN_DIRECTION_IN, PIN_PULL_PU, PIN_LEVEL_HIGH);
|
||||
if (wait_loopback_key_level(PIN_LEVEL_HIGH, 5000) != 0 ||
|
||||
wait_loopback_key_level(PIN_LEVEL_LOW, wait_timeout_ms) != 0) {
|
||||
return -4;
|
||||
}
|
||||
|
||||
buffer = (unsigned char *)malloc(FT_AUDIO_BUFFER_BYTES);
|
||||
if (!buffer) return -1;
|
||||
if (!buffer) {
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
record_handle = ql_audio_record_open(FT_AUDIO_RATE_HZ, FT_AUDIO_CHANNELS,
|
||||
0, factory_record_callback);
|
||||
if (!record_handle) goto cleanup;
|
||||
|
||||
while (ql_get_pwrkey_status() && total < FT_AUDIO_BUFFER_BYTES) {
|
||||
while (total < FT_AUDIO_BUFFER_BYTES) {
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level != PIN_LEVEL_LOW) break;
|
||||
request = FT_PCM_CHUNK_BYTES;
|
||||
if (request > FT_AUDIO_BUFFER_BYTES - total) {
|
||||
request = FT_AUDIO_BUFFER_BYTES - total;
|
||||
@@ -215,10 +229,21 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
ql_audio_record_close(record_handle, 0);
|
||||
record_handle = 0;
|
||||
|
||||
if (total == FT_AUDIO_BUFFER_BYTES && ql_get_pwrkey_status()) {
|
||||
if (wait_pwrkey_level(0, 30000) != 0) goto cleanup;
|
||||
} else if (wait_pwrkey_level(0, 3000) != 0) {
|
||||
goto cleanup;
|
||||
{
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (total == FT_AUDIO_BUFFER_BYTES && level == PIN_LEVEL_LOW) {
|
||||
release_wait_start = ft_now_ms();
|
||||
while (1) {
|
||||
ql_gpio_get_level(FT_LOOPBACK_KEY_PIN, &level);
|
||||
if (level != PIN_LEVEL_LOW) break;
|
||||
if (ft_now_ms() - release_wait_start >= 30000) goto cleanup;
|
||||
ql_rtos_task_sleep_ms(10);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
} else if (wait_loopback_key_level(PIN_LEVEL_HIGH, 3000) != 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
if (total < FT_PCM_CHUNK_BYTES) {
|
||||
@@ -233,8 +258,9 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
es8311_write(0x32, ES8311_VOLUME_100);
|
||||
ql_set_volume(AUDIOHAL_SPK_VOL_11);
|
||||
factory_pa_control(1);
|
||||
/* Match the SDK PCM path and feed the asynchronous track in real time. */
|
||||
track_handle = ql_audio_track_open(FT_AUDIO_RATE_HZ, FT_AUDIO_CHANNELS,
|
||||
0, factory_track_callback);
|
||||
0x100, factory_track_callback);
|
||||
if (!track_handle) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
@@ -242,11 +268,16 @@ int factory_audio_wait_and_loopback(u32 wait_timeout_ms, u32 *recorded_ms)
|
||||
|
||||
for (offset = 0; offset < total; offset += FT_PCM_CHUNK_BYTES) {
|
||||
unsigned int size = total - offset;
|
||||
unsigned int retries = 0;
|
||||
if (size > FT_PCM_CHUNK_BYTES) size = FT_PCM_CHUNK_BYTES;
|
||||
if (ql_audio_track_write(track_handle, (char *)(buffer + offset), size) != 0) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
while (ql_audio_track_write(track_handle, (char *)(buffer + offset), size) != 0) {
|
||||
if (++retries > FT_PCM_WRITE_RETRIES) {
|
||||
ret = -3;
|
||||
goto cleanup;
|
||||
}
|
||||
ql_rtos_task_sleep_ms(5);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(FT_PCM_CHUNK_MS);
|
||||
}
|
||||
ql_rtos_task_sleep_ms(total * 1000U /
|
||||
(FT_AUDIO_RATE_HZ * 2U * FT_AUDIO_CHANNELS) + 300U);
|
||||
|
||||
@@ -32,8 +32,8 @@ u32 ft_now_ms(void)
|
||||
const char *ft_node_name(ft_node_t node)
|
||||
{
|
||||
static const char *names[FT_NODE_COUNT] = {
|
||||
"BOOT_AUDIO", "POWER_ADC", "AUDIO_LOOPBACK", "KEY_TRIPLE",
|
||||
"ESIM", "DATA_CALL", "PING", "NFC"
|
||||
"BOOT_AUDIO", "POWER_ADC", "AUDIO_LOOPBACK",
|
||||
"ESIM", "DATA_CALL", "NFC"
|
||||
};
|
||||
|
||||
if (node < 0 || node >= FT_NODE_COUNT) {
|
||||
@@ -131,11 +131,11 @@ void ft_protocol_session_start(void)
|
||||
ft_emit("{\"v\":%d,\"type\":\"session_start\",\"seq\":%lu,"
|
||||
"\"session\":\"%s\",\"uptime_ms\":%lu,\"imei\":\"%s\","
|
||||
"\"iccid\":\"%s\",\"nfc_uid\":\"%s\",\"fw\":\"%s\","
|
||||
"\"ping_host\":\"%s\",\"start_time\":%s%s%s}",
|
||||
"\"start_time\":%s%s%s}",
|
||||
FT_PROTOCOL_VERSION, (unsigned long)++g_protocol.seq,
|
||||
g_protocol.session, (unsigned long)ft_now_ms(), g_protocol.imei,
|
||||
g_protocol.iccid, g_protocol.nfc_uid, FT_FIRMWARE_VERSION,
|
||||
FT_PING_HOST, g_protocol.start_time[0] ? "\"" : "null",
|
||||
g_protocol.start_time[0] ? "\"" : "null",
|
||||
g_protocol.start_time, g_protocol.start_time[0] ? "\"" : "");
|
||||
}
|
||||
|
||||
@@ -191,9 +191,8 @@ void ft_protocol_session_result(int passed, ft_error_t code)
|
||||
"\"nfc_uid\":\"%s\",\"start_time\":%s%s%s,"
|
||||
"\"duration_ms\":%lu,\"nodes\":{"
|
||||
"\"BOOT_AUDIO\":\"%s\",\"POWER_ADC\":\"%s\","
|
||||
"\"AUDIO_LOOPBACK\":\"%s\",\"KEY_TRIPLE\":\"%s\","
|
||||
"\"ESIM\":\"%s\",\"DATA_CALL\":\"%s\","
|
||||
"\"PING\":\"%s\",\"NFC\":\"%s\"}}",
|
||||
"\"AUDIO_LOOPBACK\":\"%s\",\"ESIM\":\"%s\","
|
||||
"\"DATA_CALL\":\"%s\",\"NFC\":\"%s\"}}",
|
||||
FT_PROTOCOL_VERSION, (unsigned long)++g_protocol.seq,
|
||||
g_protocol.session, (unsigned long)ft_now_ms(), passed ? "PASS" : "FAIL",
|
||||
code, g_protocol.imei, g_protocol.iccid, g_protocol.nfc_uid,
|
||||
@@ -202,8 +201,7 @@ void ft_protocol_session_result(int passed, ft_error_t code)
|
||||
(unsigned long)(ft_now_ms() - g_protocol.start_ms),
|
||||
ft_state_name(g_protocol.nodes[0]), ft_state_name(g_protocol.nodes[1]),
|
||||
ft_state_name(g_protocol.nodes[2]), ft_state_name(g_protocol.nodes[3]),
|
||||
ft_state_name(g_protocol.nodes[4]), ft_state_name(g_protocol.nodes[5]),
|
||||
ft_state_name(g_protocol.nodes[6]), ft_state_name(g_protocol.nodes[7]));
|
||||
ft_state_name(g_protocol.nodes[4]), ft_state_name(g_protocol.nodes[5]));
|
||||
}
|
||||
|
||||
void ft_protocol_power_off(void)
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "ql_gpio.h"
|
||||
#include "ql_iic.h"
|
||||
#include "ql_nw.h"
|
||||
#include "ql_ping.h"
|
||||
#include "ql_power.h"
|
||||
#include "ql_rtos.h"
|
||||
#include "ql_sim.h"
|
||||
@@ -21,10 +20,6 @@
|
||||
#include "nfc.h"
|
||||
#include "reg.h"
|
||||
|
||||
#define FT_PING_COUNT 3
|
||||
#define FT_PING_REQUIRED 2
|
||||
#define FT_PING_TIMEOUT_MS 4000
|
||||
#define FT_PING_WAIT_TICKS (20000 / 5)
|
||||
#define FT_NFC_VERSION_EXPECTED 0x82
|
||||
|
||||
int g_testmode = 1;
|
||||
@@ -35,22 +30,14 @@ extern s8 Read_NTAG213(u8 *uid_buf, u8 *data_buf, u16 *data_len);
|
||||
void handle_nfc_bind(const char *uid) { (void)uid; }
|
||||
void handle_nfc_trigger(const char *uid) { (void)uid; }
|
||||
|
||||
static ql_sem_t g_ping_sem;
|
||||
static ql_ping_stat_t g_ping_stats;
|
||||
static volatile int g_ping_finished;
|
||||
static char g_ip_address[64];
|
||||
|
||||
static int iccid_valid(const char *iccid)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned int len;
|
||||
if (!iccid) return 0;
|
||||
len = strlen(iccid);
|
||||
if (len < 18 || len > 22) return 0;
|
||||
for (i = 0; i < len; ++i) {
|
||||
if (iccid[i] < '0' || iccid[i] > '9') return 0;
|
||||
}
|
||||
return 1;
|
||||
return len >= 18 && len <= 22;
|
||||
}
|
||||
|
||||
static ft_error_t run_boot_audio(char *data, unsigned int data_size)
|
||||
@@ -111,43 +98,6 @@ static ft_error_t run_audio_loopback(char *data, unsigned int data_size)
|
||||
return FT_OK;
|
||||
}
|
||||
|
||||
static int wait_gpio_level(unsigned int pin, PIN_LEVEL_E expected, u32 timeout_ms)
|
||||
{
|
||||
PIN_LEVEL_E level = PIN_LEVEL_HIGH;
|
||||
u32 start = ft_now_ms();
|
||||
do {
|
||||
ql_gpio_get_level(pin, &level);
|
||||
if (level == expected) {
|
||||
ql_rtos_task_sleep_ms(40);
|
||||
ql_gpio_get_level(pin, &level);
|
||||
if (level == expected) return 0;
|
||||
}
|
||||
ql_rtos_task_sleep_ms(10);
|
||||
} while (ft_now_ms() - start < timeout_ms);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static ft_error_t run_key_triple(char *data, unsigned int data_size)
|
||||
{
|
||||
int count = 0;
|
||||
u32 start = ft_now_ms();
|
||||
ql_gpio_init(FT_TRIPLE_KEY_PIN, PIN_DIRECTION_IN, PIN_PULL_PU, PIN_LEVEL_HIGH);
|
||||
|
||||
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_HIGH, 5000) != 0) {
|
||||
return FT_ERR_TRIPLE_KEY_TIMEOUT;
|
||||
}
|
||||
while (count < 3 && ft_now_ms() - start < FT_TRIPLE_KEY_TIMEOUT_MS) {
|
||||
u32 remaining = FT_TRIPLE_KEY_TIMEOUT_MS - (ft_now_ms() - start);
|
||||
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_LOW, remaining) != 0) break;
|
||||
++count;
|
||||
ft_protocol_node_progress(FT_NODE_KEY_TRIPLE, count, 3);
|
||||
remaining = FT_TRIPLE_KEY_TIMEOUT_MS - (ft_now_ms() - start);
|
||||
if (wait_gpio_level(FT_TRIPLE_KEY_PIN, PIN_LEVEL_HIGH, remaining) != 0) break;
|
||||
}
|
||||
snprintf(data, data_size, "{\"press_count\":%d,\"required\":3}", count);
|
||||
return count == 3 ? FT_OK : FT_ERR_TRIPLE_KEY_TIMEOUT;
|
||||
}
|
||||
|
||||
static ft_error_t run_esim(char *data, unsigned int data_size)
|
||||
{
|
||||
int status = QL_SIM_STATUS_UNKNOWN;
|
||||
@@ -207,54 +157,6 @@ static ft_error_t run_data_call(char *data, unsigned int data_size)
|
||||
return FT_OK;
|
||||
}
|
||||
|
||||
static void factory_ping_callback(ql_ping_state_e state, int err,
|
||||
ql_ping_stat_t *stats)
|
||||
{
|
||||
(void)err;
|
||||
if (stats) memcpy(&g_ping_stats, stats, sizeof(g_ping_stats));
|
||||
if (state == QL_PING_FINISHED) {
|
||||
g_ping_finished = 1;
|
||||
if (g_ping_sem) ql_rtos_semaphore_release(g_ping_sem);
|
||||
}
|
||||
}
|
||||
|
||||
static ft_error_t run_ping(char *data, unsigned int data_size)
|
||||
{
|
||||
ql_ping_ctx_t *ctx;
|
||||
ql_ping_cfg_t cfg = {
|
||||
.pdpCid = 1,
|
||||
.host = FT_PING_HOST,
|
||||
.timeout = FT_PING_TIMEOUT_MS,
|
||||
.dataSize = 32,
|
||||
.pingNum = FT_PING_COUNT
|
||||
};
|
||||
int ret;
|
||||
|
||||
memset(&g_ping_stats, 0, sizeof(g_ping_stats));
|
||||
g_ping_finished = 0;
|
||||
if (ql_rtos_semaphore_create(&g_ping_sem, 0) != 0) return FT_ERR_PING_INIT;
|
||||
ctx = ql_ping_init(cfg, factory_ping_callback);
|
||||
if (!ctx) {
|
||||
ql_rtos_semaphore_delete(g_ping_sem);
|
||||
g_ping_sem = NULL;
|
||||
return FT_ERR_PING_INIT;
|
||||
}
|
||||
ret = ql_ping(ctx);
|
||||
if (ret == 0) ret = ql_rtos_semaphore_wait(g_ping_sem, FT_PING_WAIT_TICKS);
|
||||
ql_ping_deinit(ctx);
|
||||
ql_rtos_semaphore_delete(g_ping_sem);
|
||||
g_ping_sem = NULL;
|
||||
|
||||
snprintf(data, data_size,
|
||||
"{\"host\":\"%s\",\"sent\":%u,\"received\":%u,"
|
||||
"\"lost\":%u,\"avg_rtt_ms\":%lu}",
|
||||
FT_PING_HOST, g_ping_stats.sentNum, g_ping_stats.rcvdNum,
|
||||
g_ping_stats.lostNum, (unsigned long)g_ping_stats.avgRtt);
|
||||
if (ret != 0 || !g_ping_finished) return FT_ERR_PING_START;
|
||||
if (g_ping_stats.rcvdNum < FT_PING_REQUIRED) return FT_ERR_PING_LOSS;
|
||||
return FT_OK;
|
||||
}
|
||||
|
||||
static ft_error_t run_nfc(char *data, unsigned int data_size)
|
||||
{
|
||||
u8 uid[7] = {0};
|
||||
@@ -292,10 +194,8 @@ static ft_error_t run_node(ft_node_t node, char *data, unsigned int data_size)
|
||||
case FT_NODE_BOOT_AUDIO: return run_boot_audio(data, data_size);
|
||||
case FT_NODE_POWER_ADC: return run_power_adc(data, data_size);
|
||||
case FT_NODE_AUDIO_LOOPBACK: return run_audio_loopback(data, data_size);
|
||||
case FT_NODE_KEY_TRIPLE: return run_key_triple(data, data_size);
|
||||
case FT_NODE_ESIM: return run_esim(data, data_size);
|
||||
case FT_NODE_DATA_CALL: return run_data_call(data, data_size);
|
||||
case FT_NODE_PING: return run_ping(data, data_size);
|
||||
case FT_NODE_NFC: return run_nfc(data, data_size);
|
||||
default: return FT_ERR_NFC_LOCKED;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
|
||||
#define FT_PROTOCOL_VERSION 1
|
||||
#define FT_FIRMWARE_VERSION "FACTORY_TEST_1.0.0"
|
||||
#define FT_PING_HOST "banban.api.talkingq.com"
|
||||
|
||||
#define FT_ADC_MIN_MV 3500
|
||||
#define FT_ADC_MAX_MV 4200
|
||||
@@ -18,11 +17,10 @@
|
||||
#define FT_AUDIO_BUFFER_BYTES (FT_AUDIO_RATE_HZ * 2 * FT_AUDIO_MAX_MS / 1000)
|
||||
|
||||
#define FT_DIALOG_KEY_TIMEOUT_MS 60000
|
||||
#define FT_TRIPLE_KEY_TIMEOUT_MS 60000
|
||||
#define FT_SIM_TIMEOUT_MS 30000
|
||||
#define FT_NFC_TIMEOUT_MS 60000
|
||||
|
||||
#define FT_TRIPLE_KEY_PIN GPIO_PIN_NO_84
|
||||
#define FT_LOOPBACK_KEY_PIN GPIO_PIN_NO_84
|
||||
#define FT_PA_PIN GPIO_PIN_NO_68
|
||||
|
||||
#define FT_AUDIO_BOOT_PATH "U:/factory_boot_zh.mp3"
|
||||
@@ -33,10 +31,8 @@ typedef enum {
|
||||
FT_NODE_BOOT_AUDIO = 0,
|
||||
FT_NODE_POWER_ADC,
|
||||
FT_NODE_AUDIO_LOOPBACK,
|
||||
FT_NODE_KEY_TRIPLE,
|
||||
FT_NODE_ESIM,
|
||||
FT_NODE_DATA_CALL,
|
||||
FT_NODE_PING,
|
||||
FT_NODE_NFC,
|
||||
FT_NODE_COUNT
|
||||
} ft_node_t;
|
||||
@@ -53,16 +49,12 @@ typedef enum {
|
||||
FT_ERR_RECORD_EMPTY = 1202,
|
||||
FT_ERR_LOOPBACK_PLAY = 1203,
|
||||
FT_ERR_DIALOG_KEY_TIMEOUT = 1204,
|
||||
FT_ERR_TRIPLE_KEY_TIMEOUT = 1301,
|
||||
FT_ERR_SIM_NOT_READY = 1401,
|
||||
FT_ERR_ICCID_READ = 1402,
|
||||
FT_ERR_ICCID_FORMAT = 1403,
|
||||
FT_ERR_NETWORK_REGISTER = 1501,
|
||||
FT_ERR_PDP_ACTIVATE = 1502,
|
||||
FT_ERR_IP_INVALID = 1503,
|
||||
FT_ERR_PING_INIT = 1601,
|
||||
FT_ERR_PING_START = 1602,
|
||||
FT_ERR_PING_LOSS = 1603,
|
||||
FT_ERR_NFC_LOCKED = 1701,
|
||||
FT_ERR_NFC_CHIP = 1702,
|
||||
FT_ERR_NFC_TIMEOUT = 1703,
|
||||
|
||||
Reference in New Issue
Block a user