Files
firmware-test/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.c
jhchun 831dbc2844 fix: BLE TX 먹통 해결 및 메모리 안전성 개선
- binary_tx_handler를 dr_binary_tx_safe로 전체 교체 (APP_ERROR_CHECK 제거)
- data_tx_handler APP_ERROR_CHECK → DBG_PRINTF 교체
- memset/memcpy 하드코딩 크기를 define 상수로 교체 (버퍼 오버런 수정)
- SERIAL_NO_LENGTH, HW_NO_LENGTH, PASSKEY_LENGTH를 main.h로 통합
- 미사용 HW 드라이버/EEPROM 코드 삭제, TWI를 i2c_manager.c로 통합
- EEPROM → FDS 전환, 코드 리뷰 현황 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 16:39:26 +09:00

1012 lines
26 KiB
C
Raw Blame History

/***********************************************
EEPROM ADDRESS
HW_NO[12]
SERIAL_NO[12]
v1.17 p1,p2 parssurer
***********************************************/
#include <cmd_parse.h>
#include "debug_print.h"
#include "fstorage.h"
#define DEVICE_VERSION "FW25LIT2B102"
#define DEVICE_NAME "MEDIDEV_2004"
#define err_code1 65535 //length
#define err_code2 65534 //activate
#define err_code3 65533 //param
#define err_code4 65532 //? missing
#define err_code5 65531 //CMD wrong
#define err_code6 65530 //CRC wrong
#define SERIAL_NO_LENGTH 12
#include "i2c_manager.h"
#include "app_timer.h"
#include "parser.h"
// 0x0060 bonding address.....
extern uint8_t m_reset_status;
char SERIAL_NO[12]; //for eeprom r/write 30
bool bond_data_delete; //for eeprom r/write 50
char m_static_passkey[6] = "123456";//uint8_t static_passkey[6]; eeprom r/write 20
uint32_t m_life_cycle; //for eeprom r/write 90
uint8_t resetCount = 0; //cj add
char HW_NO[12]; //for eeprom r/write 10
bool info4;
extern bool motion_raw_data_enabled;
extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN];
extern bool device_status; /* true : Device has been activated, false : Device entered sleep mode */
extern bool device_reset;
//static uint32_t processing_start_time=0;
static uint32_t processing_start_tick = 0;
//ble_status_t ble_connection_st = BLE_DISCONNECTED_ST;
extern volatile bool ble_connection_st;
extern volatile bool data_tx_in_progress;
uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] = {0};
extern bool go_device_power_off;
extern bool go_sleep_mode_enter;
extern bool go_NVIC_SystemReset;
extern bool go_temp;
extern bool go_batt;
extern bool ble_got_new_data;
extern bool motion_data_once;
extern dr_platform_if_t g_plat;
extern bool g_log_enable;
extern int dr_cmd_parser(const uint8_t *buf, uint8_t len);
uint16_t imsi_value;
ParsedCmd scmd;
/**@brief Function for handling app_uart events.
*
* @details This function will receive a single character from the app_uart module and append it to
* a string. The string will be be sent over BLE when the last character received was a
* 'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
*/
/**@snippet [Handling the data received over UART & BLE] */
bool is_valid_serial_no(const char *serial)
{
// Check for all same characters (e.g., all 'F' or all '0')
bool all_same = true;
for (int i = 1; i < SERIAL_NO_LENGTH; i++) {
if (serial[i] != serial[0]) {
all_same = false;
break;
}
}
if (all_same) {
return false; // reject "FFFFFFFF..." or "00000000..."
}
// Check all characters are alphanumeric
for (int i = 0; i < SERIAL_NO_LENGTH; i++) {
char c = serial[i];
if (c == '\0' || c == (char)0xFF || !isalnum((unsigned char)c)) {
return false;
}
}
return true;
}
bool is_valid_passkey(const char *passkey)
{
for(uint8_t i = 0 ; i<6 ;i++)
{
DBG_PRINTF("check passkey :%2X \r\n",passkey[i]);
}
// Check for NULL pointer
if (passkey == NULL) {
return false;
}
// Check that the length is exactly 6 and all characters are digits
for (int i = 0; i < 6; i++) {
if (passkey[i] == '\0' || !isdigit((unsigned char)passkey[i])) {
return false;
}
}
// Ensure the 7th character is null terminator
// if (passkey[6] != '\0') {
// return false;
// }
return true;
}
bool crc16_check(uint8_t const * p_data, uint32_t data_len, uint16_t expected_crc)
{
uint16_t computed_crc = crc16_compute(p_data, data_len, NULL);
return (computed_crc == expected_crc);
}
bool crc16_check_packet(uint8_t const * packet, uint32_t packet_len)
{
if (packet_len < 2) return false;
uint32_t data_len = packet_len - 2;
uint16_t expected_crc = (packet[packet_len - 1] << 8) | packet[packet_len - 2]; // Big endian
//DBG_PRINTF("\r\n expecterrrd_data_delete :%02X \n", expected_crc);
return crc16_check(packet, data_len, expected_crc);
}
bool parse_cmd(const uint8_t *buffer, ParsedCmd *cmd_out, uint8_t length) {
// Extract 4-character command
for (int i = 0; i < 4; i++) {
cmd_out->tag[i] = (char)buffer[i];
}
cmd_out->tag[4] = '\0'; // Null-terminate
// Extract 16-bit value (little-endian)
cmd_out->value0 = (uint16_t)buffer[5] | ((uint16_t)buffer[4] << 8);
cmd_out->value1 = (uint16_t)buffer[7] | ((uint16_t)buffer[6] << 8);
cmd_out->value2 = (uint16_t)buffer[9] | ((uint16_t)buffer[8] << 8);
cmd_out->value3 = (uint16_t)buffer[11] | ((uint16_t)buffer[10] << 8);
cmd_out->value4 = (uint16_t)buffer[13] | ((uint16_t)buffer[12] << 8);
for (int i = 0; i < length; i++) {
cmd_out->values[i] = buffer[i];
}
for (int i = 0; i < 12; i++) {
cmd_out->value_ascii[i] = (char)buffer[i+4];
}
cmd_out->value_ascii[12]= '\0'; // Null-terminate
return true; // You could return false on validation failure
}
bool length_error(const char *cmd , uint8_t target_length, uint8_t length)
{
if (target_length == length)
{
return true;
}
else
{
char resp_error[4];
resp_error[0] = 'r';
resp_error[1] = cmd[1]; // 2nd letter (index 1)
resp_error[2] = cmd[2]; // 3rd letter (index 2)
resp_error[3] = '!';
single_format_data(ble_bin_buffer, resp_error, err_code1);
dr_binary_tx_safe(ble_bin_buffer,3);
return false;
}
}
bool activate_error(const char *cmd , bool device_status)
{
if (device_status == true)
{
return true;
}
else
{
char resp_error[4];
resp_error[0] = 'r';
resp_error[1] = cmd[1]; // 2nd letter (index 1)
resp_error[2] = cmd[2]; // 3rd letter (index 2)
resp_error[3] = '!';
single_format_data(ble_bin_buffer, resp_error, err_code2);
dr_binary_tx_safe(ble_bin_buffer,3);
return false;
}
}
void param_error(const char *cmd )
{
char resp_error[4];
resp_error[0] = 'r';
resp_error[1] = cmd[1]; // 2nd letter (index 1)
resp_error[2] = cmd[2]; // 3rd letter (index 2)
resp_error[3] = '!';
single_format_data(ble_bin_buffer, resp_error, err_code3);
dr_binary_tx_safe(ble_bin_buffer,3);
}
void quest_error(const char *cmd )
{
char resp_error[4];
const char pass_init[6] = "123456";
if( (cmd[0] == '*') && (cmd[1] == '*') && (cmd[2] == '*') && (cmd[3] == '*')){
memcpy(m_config.static_passkey, pass_init, 6);
config_save();
resp_error[0] = '*';
resp_error[1] = cmd[1]; // 2nd letter (index 1)
resp_error[2] = cmd[2]; // 3rd letter (index 2)
resp_error[3] = '*';
single_format_data(ble_bin_buffer, resp_error, err_code4);
dr_binary_tx_safe(ble_bin_buffer,3);
}
else{
resp_error[0] = 'r';
resp_error[1] = cmd[1]; // 2nd letter (index 1)
resp_error[2] = cmd[2]; // 3rd letter (index 2)
resp_error[3] = '!';
single_format_data(ble_bin_buffer, resp_error, err_code4);
dr_binary_tx_safe(ble_bin_buffer,3);
}
}
//uint32_t serial_to_passkey_hash(const char *input)
//{
// uint32_t hash = 1026;
// while (*input)
// {
// hash = ((hash << 5) + hash) + (uint8_t)(*input++); // hash * 33 + c
// }
// return hash % 1000000; // 6-digit range
//}
//void test_eeprom_page_rw(void)
//{
// uint8_t tx_data[EEPROM_PAGE_SIZE];
// uint8_t rx_data[EEPROM_PAGE_SIZE];
// // Fill tx_data with example values
// for (int i = 0; i < EEPROM_PAGE_SIZE; i++) {
// tx_data[i] = i*10;
// }
// uint16_t test_address = 0x0000;
// if (eeprom_write_page(test_address, tx_data) == NRF_SUCCESS) {
// DBG_PRINTF("Write OK\r\n");
// }
// if (eeprom_read_page(test_address, rx_data) == NRF_SUCCESS) {
// DBG_PRINTF("Read OK\n");
// }
// // Verify
// for (int i = 0; i < EEPROM_PAGE_SIZE; i++) {
// if (rx_data[i] != tx_data[i]) {
// DBG_PRINTF("Mismatch at %d: wrote %02X, read %02X\n", i, tx_data[i], rx_data[i]);
// }
// }
//}
/* eeprom_init_values_read() 삭제됨 — FDS config_load()가 동일 역할 수행 - jhChun 26.03.16 */
static void log_printf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
void received_command_process (uint8_t const *data_array, which_cmd_t cmd_t, uint8_t length )
{
uint8_t r_data[BLE_NUS_MAX_DATA_LEN]={0,};
uint16_t result_data[BLE_NUS_MAX_DATA_LEN];
int parser_result; // ? ??
ble_got_new_data = true;
memset( ble_tx_buffer, 0, BLE_NUS_MAX_DATA_LEN);
for( uint16_t i = 0; i < length ; i++ ) {
r_data[i] = data_array[i];
}
DBG_PRINTF("data : %s\r\n",r_data);
DBG_PRINTF("Length : %d\r\n",length);
// ========================================
// Initialize parser (once)
// ========================================
static bool parser_initialized = false;
if (!parser_initialized) {
// Setup platform interface
g_plat.log = log_printf; // printf
g_plat.tx_bin = dr_binary_tx_safe;
g_plat.crc_check = true; // CRC
g_log_enable = true;
parser_initialized = true;
DBG_PRINTF(">>> NEW parser initialized\r\n");
}
// ========================================
// NEW PARSER: Try first
// ========================================
parser_result = dr_cmd_parser(r_data, length);
if (parser_result > 0) {
// Success - handled by new parser
DBG_PRINTF(">>> Handled by NEW parser\r\n");
return;
}
//
parse_cmd(r_data, &scmd,length);
DBG_PRINTF("parsed.tag ? %s,%d,%d,%d\r\n",scmd.tag,scmd.value0,scmd.value1,scmd.value2);
if(scmd.tag[3] != '?' )
{
quest_error(scmd.tag );
return;
}
else if(!crc16_check_packet(data_array , length)){
char resp_error[4];
resp_error[0] = 'c';
resp_error[1] = 'r'; // 2nd letter (index 1)
resp_error[2] = 'c'; // 3rd letter (index 2)
resp_error[3] = '!';
single_format_data(ble_bin_buffer, resp_error, err_code6);
dr_binary_tx_safe(ble_bin_buffer,3);
return ;
}
else if(processing == true)
{
// DBG_PRINTF("mmm....\r\n");
uint32_t now = app_timer_cnt_get();
if (processing_start_tick == 0)
{
processing_start_tick = now;
}
//
if (app_timer_cnt_diff_compute(now, processing_start_tick) > APP_TIMER_TICKS(5000)) //add cj
{
processing = false;
processing_start_tick = 0;
DBG_PRINTF("processing timeout -> force reset to false\r\n");
}
else
{
DBG_PRINTF("mmm....\r\n");
}
return;
}
else
{
#if 0 //spas
// if((data_array[0] == 'p')&&(data_array[1] == 'a')&&(data_array[2] == 's')&&(data_array[3] == 's')&&(data_array[4] == 'k')&&(data_array[5] == 'e')&&(data_array[6] == 'y')) { // Write, Passkey
//
// if(data_array[7] == '='){
//
//
//
// if ((data_array[8] >=0x30 && data_array[8] <=0x39) //only number is available
// &&(data_array[9] >=0x30 && data_array[9] <=0x39)
// &&(data_array[10] >=0x30 && data_array[10] <=0x39)
// &&(data_array[11] >=0x30 && data_array[11] <=0x39)
// &&(data_array[12] >=0x30 && data_array[12] <=0x39)
// &&(data_array[13] >=0x30 && data_array[13] <=0x39))
//
// {
// memcpy(m_config.static_passkey, data_array+8, 6);
//
// DBG_PRINTF("m_config.static_passkey = %s\r\n", m_config.static_passkey);
//
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("Passkey Ok\r\n");
// } else if(cmd_t == CMD_BLE) {
// sprintf(ble_tx_buffer, "Passkey Ok\r\n");
// data_tx_handler(ble_tx_buffer);
// }
// }
// else{ DBG_PRINTF("Nondigit!! \r\n");
//
// }
//
// }else if(data_array[7] == '?'){
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("Passkey: %s\r\n", m_config.static_passkey);
// } else if(cmd_t == CMD_BLE) {
// sprintf(ble_tx_buffer, "Passkey: %s\r\n", m_config.static_passkey);
// data_tx_handler(ble_tx_buffer);
// }
// }else {
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("ERR!!! Passkey failed!\r\n\r\n");
// } else if(cmd_t == CMD_BLE) {
// sprintf(ble_tx_buffer, "ERR!!! Passkey failed!\r\n\r\n");
// data_tx_handler(ble_tx_buffer);
// }
// }
// } else
//if((data_array[0] == 's')&&(data_array[1] == 't')&&(data_array[2] == 'a')&&(data_array[3] == '?')) {
#endif //sta sta `
// sta
if((scmd.tag[0] == 's')&&(scmd.tag[1] == 't')&&(scmd.tag[2] == 'a')&&(scmd.tag[3] == '?')) {
//sta sta sta sta
resetCount=0; //reset hear cj chun
if(length_error(scmd.tag,8,length)==false)
{
return;
}
if(scmd.value0 == 1) {
if(device_activated() == 0) {
device_status = true;
}
}else if(scmd.value0 == 0) {
if(device_status == true) {
if(device_sleep_mode() == 0) {
device_status = false;
}
}
}else if(data_array[6] == '?') {
/* Nothing to do */
}else {
if(cmd_t == CMD_UART) {
DBG_PRINTF("ERR!!! Status failed!\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag );
}
}
if(cmd_t == CMD_UART) {
DBG_PRINTF("Return%d\r\n\r\n", device_status);
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rta:", scmd.value0);
dr_binary_tx_safe(ble_bin_buffer,3);
}
}
// str
else if((scmd.tag[0] == 's')&&(scmd.tag[1] == 't')&&(scmd.tag[2] == 'r')&&(scmd.tag[3] == '?')) {
if(length_error(scmd.tag,6,length)==false)
{
return;
}
// else {
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("ERR!!! Status failed!\r\n\r\n");
// } else if(cmd_t == CMD_BLE) {
// param_error(scmd.tag );
// }
// }
if(cmd_t == CMD_UART) {
DBG_PRINTF("Return%d\r\n\r\n", device_status);
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rtr:", (uint8_t)device_status);
dr_binary_tx_safe(ble_bin_buffer,3);
}
}
else if(scmd.tag[0] == 's') {
// ssn
if((scmd.tag[1] == 's') && (scmd.tag[2] == 'n')){ // Measuring the Battery level
battery_level_meas();
}
// spn
else if((scmd.tag[1] == 'p') && (scmd.tag[2] == 'n')){ // Measuring the pressure1 level read
pressure_all_level_meas(); // pressure1 + pressure2
}
// sso
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'o')){ // Measuring the Temperature of LED
if(length_error(scmd.tag,6,length)==false)
{
return;
}
else if(activate_error(scmd.tag,device_status)==false)
{
return;
}
else{
tmp235_voltage_level_meas();
}
}
// ssp
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'p')){ // Measuring the raw data of 6-axis motion sensor
hw_i2c_init_once();
motion_raw_data_enabled = true;
hw_i2c_init_once();
ble_got_new_data =false;
if(data_array[2] == 'c')
{
motion_data_once = false;
}
else
{
motion_data_once = true;
}
main_timer_start();
// }else if((scmd.tag[1] == 'P') && (scmd.tag[2] == 'p')){ // Measuring the raw data of 6-axis motion sensor
// motion_raw_data_enabled = true;
// ble_got_new_data =false;
//
//
// motion_data_once = false;
//
// main_timer_start();
}
// ssq
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'q')){ // Device power off
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tq\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rsq:", scmd.value0);
dr_binary_tx_safe(ble_bin_buffer,2);
// sprintf(ble_tx_buffer, "Tq\r\n");
// data_tx_handler(ble_tx_buffer);
}
go_device_power_off = true;
main_timer_start();
#if FEATURE_SECURE_CONNECTION
}
// ssr
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'r')){ // Bond Info Delete
// ret_code_t err_code;
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tr\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rsr:", scmd.value0);
dr_binary_tx_safe(ble_bin_buffer,2);
}
bond_data_delete = true;
m_config.bond_data_delete = (uint8_t)bond_data_delete;
m_reset_status = 2;
m_config.reset_status = m_reset_status;
config_save();
nrf_delay_ms(5);
go_NVIC_SystemReset = true;
main_timer_start();
#endif
}
// sss
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 's')){ //Device reset(Reboot)
// ret_code_t err_code;
// err_code = eeprom_write_byte(0x0060, 0x00);
//ret_code_t err_code;
if(cmd_t == CMD_UART) {
DBG_PRINTF("Ts\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rss:", scmd.value0);
dr_binary_tx_safe(ble_bin_buffer,2);
}
go_NVIC_SystemReset = true;
//m_config.reset_status = 2;
m_reset_status = 2;
m_config.reset_status = m_reset_status;
config_save();
nrf_delay_ms(5);
go_NVIC_SystemReset = true;
main_timer_start();
}
// sst
else if((scmd.tag[1] == 's') && (scmd.tag[2] == 't')){ // Auto Gain Control
if(cmd_t == CMD_UART) {
DBG_PRINTF("Ready\r\n\r\nREADY\r\n");
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "rst:", scmd.value0);
dr_binary_tx_safe(ble_bin_buffer,2);
}
}
// ssv — DISABLED: use ssv? in pc_firm/parser.c
else if(0 && (scmd.tag[1] == 's') && (scmd.tag[2] == 'v')){ // Auto Gain Control
if(cmd_t == CMD_UART) {
DBG_PRINTF("%s\r\n",DEVICE_VERSION);
} else if(cmd_t == CMD_BLE) {
ascii_format_data(ble_bin_buffer, "rsv:", DEVICE_VERSION,12);
dr_binary_tx_safe(ble_bin_buffer,8);
//test_eeprom_page_rw();
}
}
// ssz - Write Serial Number (FDS only) — DISABLED: use mws? in pc_firm/parser.c
else if(0 && (scmd.tag[1] == 's') && (scmd.tag[2] == 'z')){
if(length_error(scmd.tag,18,length)==false)
{
return;
}
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz0\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
memcpy(SERIAL_NO, scmd.value_ascii, 12);
memcpy(m_config.serial_no, scmd.value_ascii, 12);
config_save();
DBG_PRINTF("[ssz] S/N=%s saved to FDS\r\n", m_config.serial_no);
ascii_format_data(ble_bin_buffer, "rsz:", scmd.value_ascii,12);
dr_binary_tx_safe(ble_bin_buffer,8);
}
else{
DBG_PRINTF("ERR!!! Serial_number 12\r\n\r\n");
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz0FF\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag );
}
}
}
// spz
else if((scmd.tag[1] == 'p') && (scmd.tag[2] == 'z')){ //Write, passkey
if(length_error(scmd.tag,12,length)==false)
{
return;
}
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz0\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
memcpy(m_static_passkey, scmd.value_ascii, 6);
memcpy(m_config.static_passkey, m_static_passkey, 6);
config_save();
DBG_PRINTF("Passkey saved: %.6s\n", m_static_passkey);
ascii_format_data(ble_bin_buffer, "rpz:", scmd.value_ascii,6);
dr_binary_tx_safe(ble_bin_buffer,5);
}
else{
DBG_PRINTF("ERR!!! passkey 6\r\n\r\n");
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tpz0FF\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag );
}
}
}
// sqz
else if((scmd.tag[1] == 'q') && (scmd.tag[2] == 'z')){ // Read, Serial Number
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz1,%s\r\n\r\n", SERIAL_NO);
} else if(cmd_t == CMD_BLE) {
memcpy(m_static_passkey, m_config.static_passkey, 6);
ascii_format_data(ble_bin_buffer, "rqz:", m_static_passkey,6);
dr_binary_tx_safe(ble_bin_buffer,5);
}
}
// srz - Read Serial Number (FDS only) — DISABLED: use mrs? in pc_firm/parser.c
else if(0 && (scmd.tag[1] == 'r') && (scmd.tag[2] == 'z')){
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz1,%s\r\n\r\n", SERIAL_NO);
} else if(cmd_t == CMD_BLE) {
memcpy(SERIAL_NO, m_config.serial_no, 12);
ascii_format_data(ble_bin_buffer, "rrz:", SERIAL_NO, 12);
dr_binary_tx_safe(ble_bin_buffer, 8);
}
#if 0 // ===== EEPROM start block =====
// }else if((scmd.tag[1] == 'a') && (scmd.tag[2] == 'z')){ // write bytes
//
//
// uint8_t write_data[64];
//
// memcpy(write_data,scmd.value_ascii,12);
// eeprom_write_bytes(scmd.value0,write_data,12);
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("Tz2,%s\r\n\r\n",write_data);
// } else if(cmd_t == CMD_BLE) {
// sprintf(ble_tx_buffer, "Tz22,%s\r\n", write_data);
// data_tx_handler(ble_tx_buffer);
// }
// }else if((scmd.tag[1] == 'b') && (scmd.tag[2] == 'z')){
//
// unsigned char *read_data;
//
// eeprom_read_bytes(scmd.value0,read_data,12);
//
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("Tz3,%s,%s\r\n\r\n", read_data,read_data);
// } else if(cmd_t == CMD_BLE) {
// sprintf(ble_tx_buffer, "Tz3,%s\r\n",read_data);
// data_tx_handler(ble_tx_buffer);
// }
// }else if((scmd.tag[1] == 'c') && (scmd.tag[2] == 'z')){ // write page
//
// //unsigned char read_data[EEPROM_PAGE_SIZE];
// uint8_t write_data[64];
// for(uint8_t i=0 ; i<64 ;i++){
// write_data[i] = scmd.values[i+6];
// }
//
// //memcpy(write_data,scmd.value_ascii,12);
// eeprom_write_page (scmd.value0,write_data);
//
// if(cmd_t == CMD_UART) {
// DBG_PRINTF("Tz3,%s\r\n\r\n", write_data);
// } else if(cmd_t == CMD_BLE) {
//// sprintf(ble_tx_buffer, "Tz3,%s\r\n",read_data
// ascii_format_data(ble_bin_buffer, "rcz:", "ok",3);
// dr_binary_tx_safe(ble_bin_buffer,5);
//// data_tx_handler(ble_tx_buffer);
// }
//
//
//
//
//
// }else if((scmd.tag[1] == 'd') && (scmd.tag[2] == 'z')){ // Read page
//
// uint8_t read_data[64];
// eeprom_read_page (scmd.value0,read_data);
//
// if(cmd_t == CMD_UART) {
// // DBG_PRINTF("Tz3,%s,%s\r\n\r\n", read_data,read_data);
// } else if(cmd_t == CMD_BLE) {
// for (int i = 0; i < EEPROM_PAGE_SIZE; i++) {
//
// DBG_PRINTF("%02X,", read_data[i]);
// }
//
//
// format_data_byte(ble_bin_buffer, "rdz:", read_data,64);
// dr_binary_tx_safe(ble_bin_buffer,34);
// }
//ret_code_t eeprom_write_uint16_array(uint16_t start_address, const uint16_t *data, size_t count)
#endif // ===== EEPROM block End =====
}
// sez
else if((scmd.tag[1] == 'e') && (scmd.tag[2] == 'z')){ // Read, Serial Number
/* AGC gain array — AD5272/MCP4725 HW 제거됨, 명령 비활성화 - jhChun 26.03.16 */
if(cmd_t == CMD_UART) {
DBG_PRINTF("sez: HW not present\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag);
}
}
// sfz
else if((scmd.tag[1] == 'f') && (scmd.tag[2] == 'z')){ // Read, Serial Number sfz arry eeprom read
if(length_error(scmd.tag,8,length)==false)
{
return;
}
// else if(activate_error(scmd.tag,device_status)==false)
// {
// return;
// }
else{
/* AGC gain array — AD5272/MCP4725 HW 제거됨, 명령 비활성화 - jhChun 26.03.16 */
if(cmd_t == CMD_UART) {
DBG_PRINTF("sfz: HW not present\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag);
}
}
}
// siz - Read HW Number (FDS only) — DISABLED: use mrh? in pc_firm/parser.c
else if(0 && (scmd.tag[1] == 'i') && (scmd.tag[2] == 'z')){
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz1,%s\r\n\r\n", HW_NO);
} else if(cmd_t == CMD_BLE) {
memcpy(HW_NO, m_config.hw_no, 12);
ascii_format_data(ble_bin_buffer, "riz:", HW_NO, 12);
dr_binary_tx_safe(ble_bin_buffer, 8);
}
}
// shz - Write HW Number (FDS only) — DISABLED: use mwh? in pc_firm/parser.c
else if(0 && (scmd.tag[1] == 'h') && (scmd.tag[2] == 'z')){
if(length_error(scmd.tag,18,length)==false)
{
return;
}
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tz0\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
memcpy(HW_NO, scmd.value_ascii, 12);
memcpy(m_config.hw_no, scmd.value_ascii, 12);
config_save();
DBG_PRINTF("[shz] HW=%s saved to FDS\r\n", m_config.hw_no);
ascii_format_data(ble_bin_buffer, "rhz:", scmd.value_ascii,12);
dr_binary_tx_safe(ble_bin_buffer,8);
}
else{
DBG_PRINTF("ERR!!! HW_NO 12\r\n\r\n");
if(cmd_t == CMD_UART) {
DBG_PRINTF("Tpz0FF\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag );
}
}
}
// sxz
else if((scmd.tag[1] == 'x') && (scmd.tag[2] == 'z')){ // Set the delay for PD stabilization. 0<>s ~ FFFF(65535)<29>s
m_life_cycle = ((uint16_t)scmd.value0 << 16) | ((uint16_t)scmd.value1 & 0xFFFF);
result_data[0] = scmd.value0;
result_data[1] = scmd.value1;
if(length_error(scmd.tag,10,length)==false)
{
return;
}
else if((m_life_cycle > 0)||(m_life_cycle <= 99999999)) {
if(cmd_t == CMD_UART) {
DBG_PRINTF("rxz\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
m_config.life_cycle = m_life_cycle;
config_save();
format_data(ble_bin_buffer, "rxz:", result_data,2);
dr_binary_tx_safe(ble_bin_buffer,4);
}
}else{
if(cmd_t == CMD_UART) {
DBG_PRINTF("ERR!!! pd_delay_us failed!\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
param_error(scmd.tag );
}
}
}
// syz
else if((scmd.tag[1] == 'y') && (scmd.tag[2] == 'z')){ //
if(length_error(scmd.tag,6,length)==false)
{
return;
}
else {
m_life_cycle = m_config.life_cycle;
result_data[0] = (uint16_t)(m_life_cycle >> 16);
result_data[1] = (uint16_t)(m_life_cycle & 0xFFFF);
if(cmd_t == CMD_UART) {
DBG_PRINTF("ryz:\r\n\r\n");
} else if(cmd_t == CMD_BLE) {
format_data(ble_bin_buffer, "ryz:", result_data,4);
dr_binary_tx_safe(ble_bin_buffer,4);
}
}
//ret_code_t eeprom_write_uint32(uint16_t mem_address, uint32_t data);
}else {
if(cmd_t == CMD_UART) {
DBG_PRINTF("ERR!!! UART Command Failed, %c%c%c%c\r\n",data_array[0], data_array[1], data_array[2], data_array[3]);
} else if(cmd_t == CMD_BLE) {
single_format_data(ble_bin_buffer, "err!", err_code5);
dr_binary_tx_safe(ble_bin_buffer,3);
}
}
}
}
}
/**
* @}
*/
//0x0A