diff --git a/main.c b/main.c index 6f56897..7607c34 100644 --- a/main.c +++ b/main.c @@ -59,7 +59,7 @@ int fd; int UPCASE=0; int count_value=0; int getPayloadTime=120*1000;//usecond -char softwareVersion[16]="1.1.17"; +char softwareVersion[16]="1.1.18"; char stationsn[16]="TJ251372224247";//TJ250995217957 char productid[8]="10045"; char appKey[32]="fdhQmhqhvbL1cf1K9mUqt"; @@ -110,8 +110,20 @@ int mqtt_port=1883; static time_t last_2323_time = 0; // 记录上次收到0x2323的时间 static bool waiting_for_4646 = false; // 是否在等待0x4646 +// ====== 3015合并点亮相关全局变量 ====== +#define MAX_LIGHTSN_BUFFER 30 +static char lightsn_buffer[MAX_LIGHTSN_BUFFER][32] = {0}; +static char color_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 颜色缓冲区,与sn一一对应 +static char sound_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 声音缓冲区 +static char flash_buffer[MAX_LIGHTSN_BUFFER][8] = {0}; // 闪光缓冲区 +static int lightsn_buffer_count = 0; +static time_t first_3015_time = 0; +static bool is_3015_collecting = false; +static pthread_mutex_t lightsn_buffer_mutex = PTHREAD_MUTEX_INITIALIZER; + // 函数声明 void *thread_timeout_check(void *arg); +void *thread_3015_lighton_merge(void *arg); int getLedOtaVersion(char *filename); int getApOtaVersion(char *filename,char *modename); @@ -1379,74 +1391,82 @@ void *thread_uart_recv_ack(void *arg){ time(&last_2323_time); waiting_for_4646 = true; if(isLightOn){ - char *flash=mqtt_parm.msg_flash; - char *light=mqtt_parm.msg_lightDuration; - uint32_t tag1=strtol(lightsn1,NULL,16); - uint32_t tag2=strtol(lightsn2,NULL,16); - uint32_t tag3=strtol(lightsn3,NULL,16); - uint32_t tag4=strtol(lightsn4,NULL,16); - uint32_t tag5=strtol(lightsn5,NULL,16); - uint32_t tag6=strtol(lightsn6,NULL,16); - uint32_t tag7=strtol(lightsn7,NULL,16); - uint32_t tag8=strtol(lightsn8,NULL,16); - uint32_t tag9=strtol(lightsn9,NULL,16); - uint32_t tag10=strtol(lightsn10,NULL,16); - uint32_t tag11=strtol(lightsn11,NULL,16); - uint32_t tag12=strtol(lightsn12,NULL,16); - uint32_t tag13=strtol(lightsn13,NULL,16); - uint32_t tag14=strtol(lightsn14,NULL,16); - uint32_t tag15=strtol(lightsn15,NULL,16); - uint32_t tag16=strtol(lightsn16,NULL,16); - uint32_t tag17=strtol(lightsn17,NULL,16); - uint32_t tag18=strtol(lightsn18,NULL,16); - uint32_t tag19=strtol(lightsn19,NULL,16); - uint32_t tag20=strtol(lightsn20,NULL,16); - uint32_t tag21=strtol(lightsn21,NULL,16); - uint32_t tag22=strtol(lightsn22,NULL,16); - uint32_t tag23=strtol(lightsn23,NULL,16); - uint32_t tag24=strtol(lightsn24,NULL,16); - uint32_t tag25=strtol(lightsn25,NULL,16); - uint32_t tag26=strtol(lightsn26,NULL,16); - uint32_t tag27=strtol(lightsn27,NULL,16); - uint32_t tag28=strtol(lightsn28,NULL,16); - uint32_t tag29=strtol(lightsn29,NULL,16); - uint32_t tag30=strtol(lightsn30,NULL,16); - uint8_t changecolor=0; - //8灭 1红 2黄 3蓝 4绿 5青 6白 7紫 xitu - //0灭 1蓝 2绿 3青 4红 5紫 6黄 7白 yitaile - if(strcmp(mqtt_parm.msg_color,"1")==0){ - changecolor=4; - }else if(strcmp(mqtt_parm.msg_color,"2")==0){ - changecolor=6; - }else if(strcmp(mqtt_parm.msg_color,"3")==0){ - changecolor=1; - }else if(strcmp(mqtt_parm.msg_color,"4")==0){ - changecolor=2; - }else if(strcmp(mqtt_parm.msg_color,"5")==0){ - changecolor=3; - }else if(strcmp(mqtt_parm.msg_color,"6")==0){ - changecolor=7; - }else if(strcmp(mqtt_parm.msg_color,"7")==0){ - changecolor=5; - }else if(strcmp(mqtt_parm.msg_color,"8")==0){ - changecolor=0; + uint32_t tags[30] = {0}; + uint8_t tag_leds[30] = {0}; + int valid_count = 0; + for (int i = 0; i < lightsn_buffer_count; ++i) { + // 1. SN转MAC(HEX字符串转uint32_t) + if (strlen(lightsn_buffer[i]) == 8) { + tags[valid_count] = (uint32_t)strtoul(lightsn_buffer[i], NULL, 16); + } else { + LOG_I("[WARN] tag[%d] sn格式非法: %s, 跳过", i, lightsn_buffer[i]); + continue; + } + // 2. 颜色+闪光+声音合成LED控制字节(协议格式) + int flash = (strlen(flash_buffer[i]) > 0) ? atoi(flash_buffer[i]) : atoi(mqtt_parm.msg_flash); // "1"=闪光, "0"=常亮 + int sound = (strlen(sound_buffer[i]) > 0) ? atoi(sound_buffer[i]) : atoi(mqtt_parm.msg_sound); // "1"=有声, "0"=无声 + int changecolor = 0; + if(strcmp(color_buffer[i],"1")==0){ + changecolor=4; + }else if(strcmp(color_buffer[i],"2")==0){ + changecolor=6; + }else if(strcmp(color_buffer[i],"3")==0){ + changecolor=1; + }else if(strcmp(color_buffer[i],"4")==0){ + changecolor=2; + }else if(strcmp(color_buffer[i],"5")==0){ + changecolor=3; + }else if(strcmp(color_buffer[i],"6")==0){ + changecolor=7; + }else if(strcmp(color_buffer[i],"7")==0){ + changecolor=5; + }else if(strcmp(color_buffer[i],"8")==0){ + changecolor=0; + } + uint8_t led_val = 0; + if (flash) led_val |= 0x40; // Bit6 + if (sound) led_val |= 0x10; // Bit4 + led_val |= (changecolor & 0x0F); // 低4位为颜色 + tag_leds[valid_count] = led_val; + LOG_I("tag[%d]: sn=%s, color=%s, led=0x%02X ", + valid_count, lightsn_buffer[i], color_buffer[i], tag_leds[valid_count]); + valid_count++; + } + if (valid_count > 0) { + uint8_t changecolor=0; + if(strcmp(mqtt_parm.msg_color,"1")==0){ + changecolor=4; + }else if(strcmp(mqtt_parm.msg_color,"2")==0){ + changecolor=6; + }else if(strcmp(mqtt_parm.msg_color,"3")==0){ + changecolor=1; + }else if(strcmp(mqtt_parm.msg_color,"4")==0){ + changecolor=2; + }else if(strcmp(mqtt_parm.msg_color,"5")==0){ + changecolor=3; + }else if(strcmp(mqtt_parm.msg_color,"6")==0){ + changecolor=7; + }else if(strcmp(mqtt_parm.msg_color,"7")==0){ + changecolor=5; + }else if(strcmp(mqtt_parm.msg_color,"8")==0){ + changecolor=0; + } + jt_ledctrl_package_t led_ctrl={ + .s.color=changecolor, + .s.sound=atoi(mqtt_parm.msg_sound), + .s.flash=atoi(mqtt_parm.msg_flash), + }; + uart_data_send_lightband(&uartSend, led_ctrl.ch, atoi(mqtt_parm.msg_flash), atoi(mqtt_parm.msg_lightDuration), tags, tag_leds, valid_count); } - - jt_ledctrl_package_t led_ctrl={ - .s.color=changecolor, - .s.sound=atoi(mqtt_parm.msg_sound), - .s.flash=atoi(mqtt_parm.msg_flash), - }; - //uart_data_send_head_lighton(&uartSend, 5, lightsnNum); - uart_data_send_lighton(&uartSend, led_ctrl.ch, atoi(flash), atoi(light), - tag1, tag2, tag3, tag4, tag5, - tag6, tag7, tag8, tag9, tag10, - tag11, tag12, tag13, tag14, tag15, - tag16, tag17, tag18, tag19, tag20, - tag21, tag22, tag23, tag24, tag25, - tag26, tag27, tag28, tag29, tag30, - lightsnNum); isLightOn=false; + // 处理完成后清空buffer + pthread_mutex_lock(&lightsn_buffer_mutex); + lightsn_buffer_count = 0; + memset(lightsn_buffer, 0, sizeof(lightsn_buffer)); + memset(color_buffer, 0, sizeof(color_buffer)); + memset(sound_buffer, 0, sizeof(sound_buffer)); + memset(flash_buffer, 0, sizeof(flash_buffer)); + pthread_mutex_unlock(&lightsn_buffer_mutex); } #if 0 if(isSearchLabel){ @@ -1554,7 +1574,7 @@ void *thread_uart_recv_ack(void *arg){ uart_data_receive_version(&uartSend); isSendComEnd=true; isAPOtaSuccess=true; - }else if(parm_ack==0x5454){ + }else if(parm_ack==0x6464){ last_2323_time = 0; // 重置时间 waiting_for_4646 = false; // 重置等待状态 isSendComEnd=true; @@ -1907,138 +1927,52 @@ void *thread_mqtt_recv(void *arg){ LOG_I("searchTimeOld:%d\n",searchTimeOld); isSearchLabelOn=true; }else if(strcmp(mqtt_parm.msg_type,"3015")==0){ - LOG_I("3015 light on\n"); + LOG_I("3015 light on (merge mode)\n"); get_string_from_json_string_by_key_unescape(msg_data, "scene", mqtt_parm.msg_scene, sizeof(mqtt_parm.msg_scene)); - LOG_I("scene:%s\n",mqtt_parm.msg_scene); - + LOG_I("scene:%s\n",mqtt_parm.msg_scene); get_string_from_json_string_by_key_unescape(msg_data, "lights", mqtt_parm.msg_lights, sizeof(mqtt_parm.msg_lights)); - LOG_I("lights:%s\n",mqtt_parm.msg_lights); - + LOG_I("lights:%s\n",mqtt_parm.msg_lights); get_size_from_json_string_arry_by_key(msg_data, "lights", &mqtt_parm.msg_opNumber); LOG_I("lights size = %d\n", mqtt_parm.msg_opNumber); - lightsnNum=mqtt_parm.msg_opNumber; - for(int i = 0; i < mqtt_parm.msg_opNumber; i++){ - get_string_from_json_string_arry_by_key(msg_data,"lights",msg_lightsn_value,128,i); - snprintf(msg_lightsn, sizeof(msg_lightsn), "{%s}", msg_lightsn_value); - get_string_from_json_string_by_key_unescape(msg_lightsn, "sn", mqtt_parm.msg_sn,sizeof(mqtt_parm.msg_sn)); - LOG_I("sn:%s\n",mqtt_parm.msg_sn); - if(i==0){ - memset(lightsn1,0,32); - memcpy(lightsn1,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==1){ - memset(lightsn2,0,32); - memcpy(lightsn2,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==2){ - memset(lightsn3,0,32); - memcpy(lightsn3,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==3){ - memset(lightsn4,0,32); - memcpy(lightsn4,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==4){ - memset(lightsn5,0,32); - memcpy(lightsn5,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==5){ - memset(lightsn6,0,32); - memcpy(lightsn6,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==6){ - memset(lightsn7,0,32); - memcpy(lightsn7,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==7){ - memset(lightsn8,0,32); - memcpy(lightsn8,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==8){ - memset(lightsn9,0,32); - memcpy(lightsn9,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==9){ - memset(lightsn10,0,32); - memcpy(lightsn10,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==10){ - memset(lightsn11,0,32); - memcpy(lightsn11,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==11){ - memset(lightsn12,0,32); - memcpy(lightsn12,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==12){ - memset(lightsn13,0,32); - memcpy(lightsn13,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==13){ - memset(lightsn14,0,32); - memcpy(lightsn14,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==14){ - memset(lightsn15,0,32); - memcpy(lightsn15,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==15){ - memset(lightsn16,0,32); - memcpy(lightsn16,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==16){ - memset(lightsn17,0,32); - memcpy(lightsn17,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==17){ - memset(lightsn18,0,32); - memcpy(lightsn18,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==18){ - memset(lightsn19,0,32); - memcpy(lightsn19,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==19){ - memset(lightsn20,0,32); - memcpy(lightsn20,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==20){ - memset(lightsn21,0,32); - memcpy(lightsn21,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==21){ - memset(lightsn22,0,32); - memcpy(lightsn22,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==22){ - memset(lightsn23,0,32); - memcpy(lightsn23,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==23){ - memset(lightsn24,0,32); - memcpy(lightsn24,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==24){ - memset(lightsn25,0,32); - memcpy(lightsn25,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==25){ - memset(lightsn26,0,32); - memcpy(lightsn26,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==26){ - memset(lightsn27,0,32); - memcpy(lightsn27,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==27){ - memset(lightsn28,0,32); - memcpy(lightsn28,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==28){ - memset(lightsn29,0,32); - memcpy(lightsn29,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - }else if(i==29){ - memset(lightsn30,0,32); - memcpy(lightsn30,mqtt_parm.msg_sn,strlen(mqtt_parm.msg_sn)); - } - } - get_string_from_json_string_by_key_unescape(msg_data, "color", mqtt_parm.msg_color, sizeof(mqtt_parm.msg_color)); - LOG_I("color:%s\n",mqtt_parm.msg_color); + LOG_I("color:%s\n",mqtt_parm.msg_color); get_string_from_json_string_by_key_unescape(msg_data, "sound", mqtt_parm.msg_sound, sizeof(mqtt_parm.msg_sound)); - LOG_I("sound:%s\n",mqtt_parm.msg_sound); + LOG_I("sound:%s\n",mqtt_parm.msg_sound); get_string_from_json_string_by_key_unescape(msg_data, "flash", mqtt_parm.msg_flash, sizeof(mqtt_parm.msg_flash)); - LOG_I("flash:%s\n",mqtt_parm.msg_flash); - get_string_from_json_string_by_key_unescape(msg_data, "flashInterval", mqtt_parm.msg_flashInterval, - sizeof(mqtt_parm.msg_flashInterval)); - LOG_I("flashInterval:%s\n",mqtt_parm.msg_flashInterval); - get_string_from_json_string_by_key_unescape(msg_data, "lightDuration", mqtt_parm.msg_lightDuration, - sizeof(mqtt_parm.msg_lightDuration)); - LOG_I("lightDuration:%s\n",mqtt_parm.msg_lightDuration); - - if(isLightEnable && (mqtt_parm.msg_opNumber>0)){ - mqtt_service_reply(stationsn,mqtt_parm.msg_messageId,"ok",1,productid); - isSendComEnd=false; - isLightOn=true; - isLightOnByRule=false; - isLabelUp=false; - //isSearchLabel=false; - uart_data_send_head_lighton(&uartSend,5,lightsnNum); - }else{ - mqtt_service_reply(stationsn,mqtt_parm.msg_messageId,"light disabled or sn is null",0,productid); + LOG_I("flash:%s\n",mqtt_parm.msg_flash); + get_string_from_json_string_by_key_unescape(msg_data, "flashInterval", mqtt_parm.msg_flashInterval, sizeof(mqtt_parm.msg_flashInterval)); + LOG_I("flashInterval:%s\n",mqtt_parm.msg_flashInterval); + get_string_from_json_string_by_key_unescape(msg_data, "lightDuration", mqtt_parm.msg_lightDuration, sizeof(mqtt_parm.msg_lightDuration)); + LOG_I("lightDuration:%s\n",mqtt_parm.msg_lightDuration); + pthread_mutex_lock(&lightsn_buffer_mutex); + if (!is_3015_collecting) { + is_3015_collecting = true; + first_3015_time = time(NULL); + lightsn_buffer_count = 0; + memset(lightsn_buffer, 0, sizeof(lightsn_buffer)); + memset(color_buffer, 0, sizeof(color_buffer)); + memset(sound_buffer, 0, sizeof(sound_buffer)); + memset(flash_buffer, 0, sizeof(flash_buffer)); } + int i; + char msg_lightsn_value[128] = {0}; + char msg_lightsn[128] = {0}; + for (i = 0; i < mqtt_parm.msg_opNumber && lightsn_buffer_count < MAX_LIGHTSN_BUFFER; i++) { + get_string_from_json_string_arry_by_key(msg_data, "lights", msg_lightsn_value, 128, i); + snprintf(msg_lightsn, sizeof(msg_lightsn), "{%s}", msg_lightsn_value); + get_string_from_json_string_by_key_unescape(msg_lightsn, "sn", lightsn_buffer[lightsn_buffer_count], 32); + get_string_from_json_string_by_key_unescape(msg_lightsn, "color", color_buffer[lightsn_buffer_count], 8); + get_string_from_json_string_by_key_unescape(msg_lightsn, "sound", sound_buffer[lightsn_buffer_count], 8); + get_string_from_json_string_by_key_unescape(msg_lightsn, "flash", flash_buffer[lightsn_buffer_count], 8); + // 如果没有单独字段,使用全局默认 + if (strlen(color_buffer[lightsn_buffer_count]) == 0) strcpy(color_buffer[lightsn_buffer_count], mqtt_parm.msg_color); + if (strlen(sound_buffer[lightsn_buffer_count]) == 0) strcpy(sound_buffer[lightsn_buffer_count], mqtt_parm.msg_sound); + if (strlen(flash_buffer[lightsn_buffer_count]) == 0) strcpy(flash_buffer[lightsn_buffer_count], mqtt_parm.msg_flash); + LOG_I("buffered sn: %s, color: %s, sound: %s, flash: %s\n", lightsn_buffer[lightsn_buffer_count], color_buffer[lightsn_buffer_count], sound_buffer[lightsn_buffer_count], flash_buffer[lightsn_buffer_count]); + lightsn_buffer_count++; + } + pthread_mutex_unlock(&lightsn_buffer_mutex); + mqtt_service_reply(stationsn, mqtt_parm.msg_messageId, "ok", 1, productid); }else if(strcmp(mqtt_parm.msg_type,"3022")==0){ LOG_I("3022 updata lable\n"); get_string_from_json_string_by_key_unescape(msg_data, "label1", mqtt_parm.msg_label1, sizeof(mqtt_parm.msg_label1)); @@ -2338,6 +2272,15 @@ int main(int argc, char *argv[]) char syscmd[256]={0}; LOG_I("version:%s\n",softwareVersion); + + FILE *fp = fopen("/userdata/tx_version", "w"); + if (fp) { + fprintf(fp, "%s\n", softwareVersion); + fclose(fp); + } else { + LOG_I("Failed to write /userdata/tx_version\n"); + } + #if 1 system("insmod /system/lib/modules/wk2xxx_spi.ko"); snprintf(syscmd, sizeof(syscmd), "ls Log.*|xargs rm -fr"); @@ -2496,6 +2439,16 @@ int main(int argc, char *argv[]) pthread_detach(timeout_thread); } + // 创建3015合并点亮线程 + pthread_t pt_3015_merge; + ret = pthread_create(&pt_3015_merge, NULL, thread_3015_lighton_merge, NULL); + if (ret != 0) { + LOG_I("pthread_create 3015_merge fail\n"); + } else { + pthread_detach(pt_3015_merge); + LOG_I("pthread_create 3015_merge success\n"); + } + ret = pthread_create(&pt_ota,NULL,thread_ota,NULL); if(ret!=0){ LOG_I("pthread_create ota fail\n"); @@ -2618,3 +2571,71 @@ void *thread_timeout_check(void *arg) { return NULL; } +// 合并点亮线程 +void *thread_3015_lighton_merge(void *arg) { + while (1) { + pthread_mutex_lock(&lightsn_buffer_mutex); + if (is_3015_collecting) { + time_t now = time(NULL); + if ((now - first_3015_time >= 5) || (lightsn_buffer_count >= MAX_LIGHTSN_BUFFER)) { + int i; + lightsnNum = lightsn_buffer_count; + for (i = 0; i < lightsn_buffer_count; i++) { + switch(i) { + case 0: memcpy(lightsn1, lightsn_buffer[i], 32); break; + case 1: memcpy(lightsn2, lightsn_buffer[i], 32); break; + case 2: memcpy(lightsn3, lightsn_buffer[i], 32); break; + case 3: memcpy(lightsn4, lightsn_buffer[i], 32); break; + case 4: memcpy(lightsn5, lightsn_buffer[i], 32); break; + case 5: memcpy(lightsn6, lightsn_buffer[i], 32); break; + case 6: memcpy(lightsn7, lightsn_buffer[i], 32); break; + case 7: memcpy(lightsn8, lightsn_buffer[i], 32); break; + case 8: memcpy(lightsn9, lightsn_buffer[i], 32); break; + case 9: memcpy(lightsn10, lightsn_buffer[i], 32); break; + case 10: memcpy(lightsn11, lightsn_buffer[i], 32); break; + case 11: memcpy(lightsn12, lightsn_buffer[i], 32); break; + case 12: memcpy(lightsn13, lightsn_buffer[i], 32); break; + case 13: memcpy(lightsn14, lightsn_buffer[i], 32); break; + case 14: memcpy(lightsn15, lightsn_buffer[i], 32); break; + case 15: memcpy(lightsn16, lightsn_buffer[i], 32); break; + case 16: memcpy(lightsn17, lightsn_buffer[i], 32); break; + case 17: memcpy(lightsn18, lightsn_buffer[i], 32); break; + case 18: memcpy(lightsn19, lightsn_buffer[i], 32); break; + case 19: memcpy(lightsn20, lightsn_buffer[i], 32); break; + case 20: memcpy(lightsn21, lightsn_buffer[i], 32); break; + case 21: memcpy(lightsn22, lightsn_buffer[i], 32); break; + case 22: memcpy(lightsn23, lightsn_buffer[i], 32); break; + case 23: memcpy(lightsn24, lightsn_buffer[i], 32); break; + case 24: memcpy(lightsn25, lightsn_buffer[i], 32); break; + case 25: memcpy(lightsn26, lightsn_buffer[i], 32); break; + case 26: memcpy(lightsn27, lightsn_buffer[i], 32); break; + case 27: memcpy(lightsn28, lightsn_buffer[i], 32); break; + case 28: memcpy(lightsn29, lightsn_buffer[i], 32); break; + case 29: memcpy(lightsn30, lightsn_buffer[i], 32); break; + } + } + + if (isLightEnable && (lightsnNum > 0)) { + //isSendComEnd = false; + isLightOn = true; + isLightOnByRule = false; + isLabelUp = false; + for (int i = 0; i < lightsnNum; i++) { + LOG_I("sn[%d]=%s\n", i+1, lightsn_buffer[i]); + } + uart_data_send_head_lightband(&uartSend, 5, lightsnNum); + } + + // 不要立即清空buffer,等待isLightOn处理完成 + // lightsn_buffer_count = 0; + // memset(lightsn_buffer, 0, sizeof(lightsn_buffer)); + is_3015_collecting = false; + first_3015_time = 0; + } + } + pthread_mutex_unlock(&lightsn_buffer_mutex); + usleep(100*1000); + } + return NULL; +} + diff --git a/uart_can/uart_can.c b/uart_can/uart_can.c index 8f9bae2..ffd00f9 100644 --- a/uart_can/uart_can.c +++ b/uart_can/uart_can.c @@ -188,68 +188,7 @@ error: int uart_data_send_head_lighton(uart_utils_t *uart,uint8_t wakeup_time,uint16_t tag_num){ int ret = 0; - uint8_t data_len=0; - if(tag_num==1){ - data_len=14; - }else if(tag_num==2){ - data_len=18; - }else if(tag_num==3){ - data_len=22; - }else if(tag_num==4){ - data_len=26; - }else if(tag_num==5){ - data_len=30; - }else if(tag_num==6){ - data_len=34; - }else if(tag_num==7){ - data_len=38; - }else if(tag_num==8){ - data_len=42; - }else if(tag_num==9){ - data_len=46; - }else if(tag_num==10){ - data_len=50; - }else if(tag_num==11){ - data_len=54; - }else if(tag_num==12){ - data_len=58; - }else if(tag_num==13){ - data_len=62; - }else if(tag_num==14){ - data_len=66; - }else if(tag_num==15){ - data_len=70; - }else if(tag_num==16){ - data_len=74; - }else if(tag_num==17){ - data_len=78; - }else if(tag_num==18){ - data_len=82; - }else if(tag_num==19){ - data_len=86; - }else if(tag_num==20){ - data_len=90; - }else if(tag_num==21){ - data_len=94; - }else if(tag_num==22){ - data_len=98; - }else if(tag_num==23){ - data_len=102; - }else if(tag_num==24){ - data_len=106; - }else if(tag_num==25){ - data_len=110; - }else if(tag_num==26){ - data_len=114; - }else if(tag_num==27){ - data_len=118; - }else if(tag_num==28){ - data_len=122; - }else if(tag_num==29){ - data_len=126; - }else if(tag_num==30){ - data_len=130; - } + uint8_t data_len = 8 + tag_num * 4 + 2; jt_head_package_t jt_head_package ={ .pre=0x2323,//# 0x23 $ 0x24 .wakeupTime=wakeup_time,//5s,<120s @@ -774,7 +713,7 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui uint8_t light_d_h=(light_d>>8)&0xFF; uint8_t light_d_l=(light_d)&0xFF; - // 计算数据包长度:基础长度(8) + tag数量 * 4 + CRC(2) + // 计算数据包长度:基础长度(7) + tag数量 * 4 + CRC(2) uint8_t data_len = 8 + tag_num * 4 + 2; uint8_t *buf = (uint8_t *)malloc(data_len); if (buf == NULL) { @@ -786,7 +725,7 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui // 填充基础数据 buf[0] = 0x00; buf[1] = 0x00; // len1 - buf[2] = data_len - 2; // len2 (修改:减去2而不是3,因为len2不包含CRC) + buf[2] = data_len - 3; // len2 (修改:减去3,因为len2不包含CRC和len1、len2本身) buf[3] = ledctl; // ledCtr buf[4] = flash_i_h; // flashInterval buf[5] = flash_i_l; @@ -805,24 +744,29 @@ int uart_data_send_lighton(uart_utils_t *uart,uint8_t ledctl,uint16_t flash_i,ui buf[11 + i * 4] = tags[i] & 0xFF; } - // 计算CRC + // 计算CRC - 计算除了CRC本身之外的所有数据 uint16_t crc_c = CRC16_XMODEM(buf, data_len - 2); buf[data_len - 2] = (crc_c >> 8) & 0xFF; buf[data_len - 1] = crc_c & 0xFF; - // 打印调试信息 - for (int i = 0; i < data_len; i++) { - printf("%02x ", buf[i]); + // 打印CRC计算详情 + printf("[uart_data_send_lighton] CRC calculation: "); + for (int i = 0; i < data_len - 2; ++i) { + printf("%02X ", buf[i]); } - DEBUG_TX("\r\n"); - DEBUG_TX("%s XModem_CRC16 = %04x\r\n", __func__, crc_c); + printf(" -> CRC: %04X\n", crc_c); + + // 打印发送数据内容 + printf("[uart_data_send_lighton] send: "); + for (int i = 0; i < data_len; ++i) { + printf("%02X ", buf[i]); + } + printf("\n"); // 发送数据 - if (data_len == write(uart->uart_fd, buf, data_len)) { - ret = 0; - } else { - ret = -4; - } + int write_ret = write(uart->uart_fd, buf, data_len); + LOG_I("[uart_data_send_lighton] write_ret=%d, data_len=%d", write_ret, data_len); + if (write_ret == data_len) ret = 0; else ret = -4; free(buf); DEBUG_TX("lightsnNum = %d\n", tag_num); @@ -932,3 +876,105 @@ int uart_data_receive_data_back(uart_utils_t *uart,uint16_t *parmAck,uint32_t *t return ret; } + +// 修正版:点亮灯带下行帧头,严格按协议示例 +int uart_data_send_head_lightband(uart_utils_t *uart, uint8_t wakeup_time, uint16_t tag_num) { + int ret = 0; + // 帧头中的len2 = tag_num * 9 + 5 + uint8_t data_len = tag_num * 9 + 5; + jt_head_package_t jt_head_package = { + .pre = 0x2323, // ## + .wakeupTime = wakeup_time, // 5s,<120s + .func = 'E', // 功能码E + .len1 = 0x0000, // 固定为0 + .len2 = data_len, // tag_num*9+5 + .reserve = htons(0x0003), + .lableNum = htons(tag_num), + }; + + LOG_I("%s:HEAD:%04x,%02x,%02x,%04x,%02x,%04x,%04x\r\n", __func__, + jt_head_package.pre, jt_head_package.wakeupTime, jt_head_package.func, + jt_head_package.len1, jt_head_package.len2, jt_head_package.reserve, jt_head_package.lableNum); + + if (uart == NULL) { + LOG_I("uart NULL pointer\n"); + ret = -1; + goto error; + } + + if (sizeof(jt_head_package) == write(uart->uart_fd, &jt_head_package, sizeof(jt_head_package))) { + ret = 0; + LOG_I("!!%s:HEAD:%04x,%02x,%02x,%04x,%02x,%04x,%04x\r\n", __func__, + jt_head_package.pre, jt_head_package.wakeupTime, jt_head_package.func, + jt_head_package.len1, jt_head_package.len2, jt_head_package.reserve, jt_head_package.lableNum); + //LOG_I("%s success\n",__func__); + } else { + //LOG_I("%s fail\n", __func__); + ret = -2; + goto error; + } +error: + return ret; +} + +// 修正版:点亮灯带下行数据,严格按协议示例 +int uart_data_send_lightband(uart_utils_t *uart, uint8_t ledctl, uint16_t flash_i, uint16_t light_d, uint32_t tags[], uint8_t tag_leds[], uint16_t tag_num) { + int ret = 0; + + // 检查tag数量限制 + if (tag_num > 30) { + LOG_I("[uart_data_send_lightband] tag_num too large: %d, max 30\n", tag_num); + return -4; + } + + // 数据包总长度: 3字节头 + tag_num * 9字节 + 2字节CRC + int data_len = 3 + tag_num * 9 + 2; + uint8_t *buf = malloc(data_len); + if (!buf) return -2; + memset(buf, 0, data_len); + + buf[0] = 0x00; // len1 + buf[1] = 0x00; // len2 + buf[2] = tag_num * 9 + 2; // 数据区长度(含CRC) + + // 填充tag数据 - 每个tag 9字节 + for (int i = 0; i < tag_num; ++i) { + int base = 3 + i * 9; + buf[base + 0] = (tags[i] >> 24) & 0xFF; // MAC高字节 + buf[base + 1] = (tags[i] >> 16) & 0xFF; // MAC次高字节 + buf[base + 2] = (tags[i] >> 8) & 0xFF; // MAC次低字节 + buf[base + 3] = tags[i] & 0xFF; // MAC低字节 + buf[base + 4] = tag_leds[i]; // LED控制 + buf[base + 5] = (flash_i >> 8) & 0xFF; // 闪烁间隔高字节 + buf[base + 6] = flash_i & 0xFF; // 闪烁间隔低字节 + buf[base + 7] = (light_d >> 8) & 0xFF; // 点灯时长高字节 + buf[base + 8] = light_d & 0xFF; // 点灯时长低字节 + } + + // CRC16(XMODEM),不含最后2字节 + uint16_t crc = CRC16_XMODEM(buf, data_len - 2); + buf[data_len - 2] = (crc >> 8) & 0xFF; + buf[data_len - 1] = crc & 0xFF; + + // 打印CRC计算详情 + printf("[uart_data_send_lightband] tag_num=%d, data_len=%d\n", tag_num, data_len); + printf("[uart_data_send_lightband] CRC calculation: "); + for (int i = 0; i < data_len - 2; ++i) { + printf("%02X ", buf[i]); + } + printf(" -> CRC: %04X\n", crc); + + // 打印发送数据内容 + printf("[uart_data_send_lightband] send: "); + for (int i = 0; i < data_len; ++i) { + printf("%02X ", buf[i]); + } + printf("\n"); + + if (uart == NULL) { free(buf); return -1; } + int write_ret = write(uart->uart_fd, buf, data_len); + LOG_I("[uart_data_send_lightband] write_ret=%d, data_len=%d", write_ret, data_len); + if (write_ret == data_len) ret = 0; else ret = -3; + free(buf); + return ret; +} diff --git a/uart_can/uart_can.h b/uart_can/uart_can.h index 1866561..fa01847 100644 --- a/uart_can/uart_can.h +++ b/uart_can/uart_can.h @@ -329,4 +329,7 @@ int uart_data_send_ledota(uart_utils_t *uart,char *data,int size); int uart_data_send_head_apota(uart_utils_t *uart,uint32_t datalen,uint16_t packagenum); int uart_data_send_apota(uart_utils_t *uart,uint8_t dataori[],int datalen,uint16_t pnum,uint16_t datacrc); int uart_data_receive_version(uart_utils_t *uart); + +int uart_data_send_head_lightband(uart_utils_t *uart, uint8_t wakeup_time, uint16_t tag_num); +int uart_data_send_lightband(uart_utils_t *uart, uint8_t ledctl, uint16_t flash_i, uint16_t light_d, uint32_t tags[], uint8_t tag_leds[], uint16_t tag_num); #endif