eab562d52e
- serial number / HW version / passkey write 명령 해당 - production_done NVS 플래그 추가 - 기존 passkey_changed 플래그 제거 - production_done=0 상태에서만 Serial/HW/Passkey Write 허용 - production_done=1 상태에서는 생산용 Write 명령을 rxd 응답으로 차단 - msr 본딩 삭제 성공 시 production_done=1 저장
206 lines
4.2 KiB
C
206 lines
4.2 KiB
C
/*******************************************************************************
|
|
* @file cmd_info.c
|
|
* @brief BLE command handlers
|
|
******************************************************************************/
|
|
#include <zephyr/sys/util.h>
|
|
#include <string.h>
|
|
|
|
#include "cmd_common.h"
|
|
#include "main.h"
|
|
#include "debug_print.h"
|
|
#include "app_nvs.h"
|
|
#include "cmd_info.h"
|
|
|
|
/* Production Mode - Serial Number, HW Version, Passkey write command lock */
|
|
static bool cmd_info_write_locked(const char *cmd_tag)
|
|
{
|
|
if (m_production_done == 0U)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
cmd_send_response_tag_echo("rxd:", cmd_tag);
|
|
DBG_PRINTF("[CMD] production write disabled: %s\r\n", cmd_tag);
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
* mfv: firmware version read
|
|
*/
|
|
int cmd_mfv(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
char fw_version[SERIAL_NO_LENGTH];
|
|
int err;
|
|
|
|
ARG_UNUSED(data);
|
|
ARG_UNUSED(data_len);
|
|
|
|
cmd_copy_fixed_ascii(fw_version, sizeof(fw_version), FIRMWARE_VERSION, strlen(FIRMWARE_VERSION));
|
|
err = cmd_send_response_ascii("rfv:", fw_version, sizeof(fw_version));
|
|
if (err)
|
|
{
|
|
DBG_ERR("[CMD] mfv tx failed err=%d\r\n", err);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mid: device information(hw version + fw version + serial number) read
|
|
*/
|
|
int cmd_mid(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
int err;
|
|
|
|
ARG_UNUSED(data);
|
|
ARG_UNUSED(data_len);
|
|
|
|
err = cmd_send_response_identity();
|
|
if (err)
|
|
{
|
|
DBG_ERR("[CMD] mid tx failed err=%d\r\n", err);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mwh: hardware version write
|
|
*/
|
|
int cmd_mwh(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
if (cmd_info_write_locked("mwh?"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (data_len < HW_NO_LENGTH)
|
|
{
|
|
cmd_send_response_u16("rwh:", 0xFFFF);
|
|
return 1;
|
|
}
|
|
|
|
memset(HW_NO, 0, sizeof(HW_NO));
|
|
memcpy(HW_NO, data, HW_NO_LENGTH);
|
|
int err = app_nvs_save_hw_no(HW_NO);
|
|
if (err)
|
|
{
|
|
cmd_send_response_u16("rwh:", 0xFFFD);
|
|
return 1;
|
|
}
|
|
|
|
cmd_send_response_ascii("rwh:", HW_NO, HW_NO_LENGTH);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mrh: hardware version read
|
|
*/
|
|
int cmd_mrh(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
int err;
|
|
|
|
ARG_UNUSED(data);
|
|
ARG_UNUSED(data_len);
|
|
|
|
err = cmd_send_response_ascii("rrh:", HW_NO, HW_NO_LENGTH);
|
|
if (err)
|
|
{
|
|
DBG_ERR("[CMD] mrh tx failed err=%d\r\n", err);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mws: serial number write
|
|
*/
|
|
int cmd_mws(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
if (cmd_info_write_locked("mws?"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (data_len < SERIAL_NO_LENGTH)
|
|
{
|
|
cmd_send_response_u16("rws:", 0xFFFF);
|
|
return 1;
|
|
}
|
|
|
|
memset(SERIAL_NO, 0, sizeof(SERIAL_NO));
|
|
memcpy(SERIAL_NO, data, SERIAL_NO_LENGTH);
|
|
int err = app_nvs_save_serial_no(SERIAL_NO);
|
|
if (err)
|
|
{
|
|
cmd_send_response_u16("rws:", 0xFFFD);
|
|
return 1;
|
|
}
|
|
|
|
cmd_send_response_ascii("rws:", SERIAL_NO, SERIAL_NO_LENGTH);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mrs: serial number read
|
|
*/
|
|
int cmd_mrs(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
int err;
|
|
|
|
ARG_UNUSED(data);
|
|
ARG_UNUSED(data_len);
|
|
|
|
err = cmd_send_response_ascii("rrs:", SERIAL_NO, SERIAL_NO_LENGTH);
|
|
if (err)
|
|
{
|
|
DBG_ERR("[CMD] mrs tx failed err=%d\r\n", err);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mpz: passkey write
|
|
*/
|
|
int cmd_mpz(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
if (cmd_info_write_locked("mpz?"))
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
if (data_len < PASSKEY_LENGTH)
|
|
{
|
|
cmd_send_response_u16("rpz:", 0xFFFF);
|
|
return 1;
|
|
}
|
|
|
|
|
|
// NVS 저장이 모두 성공한 뒤 RAM 값 확정
|
|
char new_passkey[PASSKEY_BUF_SIZE];
|
|
memset(new_passkey, 0, sizeof(new_passkey));
|
|
memcpy(new_passkey, data, PASSKEY_LENGTH);
|
|
|
|
int err = app_nvs_save_passkey(new_passkey);
|
|
if (err)
|
|
{
|
|
cmd_send_response_u16("rpz:", 0xFFFD);
|
|
return 1;
|
|
}
|
|
|
|
|
|
memset(m_static_passkey, 0, sizeof(m_static_passkey));
|
|
memcpy(m_static_passkey, new_passkey, PASSKEY_LENGTH);
|
|
|
|
cmd_send_response_ascii("rpz:", m_static_passkey, PASSKEY_LENGTH);
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* mqz: passkey read (삭제 예정)
|
|
*/
|
|
int cmd_mqz(const uint8_t *data, uint8_t data_len)
|
|
{
|
|
ARG_UNUSED(data);
|
|
ARG_UNUSED(data_len);
|
|
|
|
cmd_send_response_ascii("rqz:", m_static_passkey, PASSKEY_LENGTH);
|
|
return 1;
|
|
} |