feat: add FT1 factory test host and protocol updates
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user