/******************************************************************************* * @file cmd_info.c * @brief BLE command handlers ******************************************************************************/ #include #include #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; }