/* * @Description: * @Version: 2.0 * @Author: Seven * @Date: 2022-06-14 14:01:56 * @LastEditors: Seven * @LastEditTime: 2022-08-31 11:04:05 */ #include "led.h" #include "includes.h" #include "gw_ctrl.h" /// uint8_t LED_STATUS = 0; uint8_t uninit_led_state = 0; //未初始化时灯的开关状态 uint8_t loraindex_led_flag = 0;//lora信道索引指示灯显示标记 led_info_t led_info; void LED_Init(void) { //LED_RUN(PE14) GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE, GPIO_Pin_14, GPIO_Mode_Out_PP, GPIO_Speed_50MHz); LED_RUN_ON(); if(hd_id == PCB_V0) { //8引脚灯 GPIO_COMM_Init(RCC_APB2Periph_GPIOD, GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_Mode_Out_PP, GPIO_Speed_50MHz); GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9, GPIO_Mode_Out_PP, GPIO_Speed_50MHz); led_run_set(LED_ALL,LED_OFF); } else if(hd_id == PCB_V1) { //74hc595 // led_run_set(LED_ALL,LED_OFF); GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_11, GPIO_Mode_Out_PP, GPIO_Speed_50MHz); led_run_set(LED_ALL,LED_OFF); } led_info_init(); } //输出0灯亮,输出1灯灭 void led_send_byte(uint8_t data) { uint8_t i; LED_RCK_LOW(); delay_us(2); LED_SCK_HIGH(); delay_us(4); for(i = 0; i < 8; i++) { if(data&0x80) LED_SER_HIGH(); else LED_SER_LOW(); data <<= 1; LED_SCK_LOW(); delay_us(4); LED_SCK_HIGH(); delay_us(4); } LED_RCK_HIGH(); // LED_SCK_LOW(); delay_us(4); // LED_SCK_HIGH(); // delay_us(4); LED_RCK_LOW(); } //设置led灯 //status:灯的状态 //led:灯的编号 void led_run_set(uint8_t led, uint8_t status) { if(hd_id == PCB_V0) { switch(led) { case LED0: if(status == LED_ON) { LED0_ON(); } else if(status == LED_OFF) { LED0_OFF(); } break; case LED1: if(status == LED_ON) { LED1_ON(); } else if(status == LED_OFF) { LED1_OFF(); } break; case LED2: if(status == LED_ON) { LED2_ON(); } else if(status == LED_OFF) { LED2_OFF(); } break; case LED3: if(status == LED_ON) { LED3_ON(); } else if(status == LED_OFF) { LED3_OFF(); } break; case LED4: if(status == LED_ON) { LED4_ON(); } else if(status == LED_OFF) { LED4_OFF(); } break; case LED5: if(status == LED_ON) { LED5_ON(); } else if(status == LED_OFF) { LED5_OFF(); } break; case LED6: if(status == LED_ON) { LED6_ON(); } else if(status == LED_OFF) { LED6_OFF(); } break; case LED7: if(status == LED_ON) { LED7_ON(); } else if(status == LED_OFF) { LED7_OFF(); } break; case LED_ALL: if(status == LED_ON) { LED_ON_ALL(); } else if(status == LED_OFF) { LED_OFF_ALL(); } break; default: break; } } else if(hd_id == PCB_V1) { switch(led) { case LED0: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<0); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<0); } led_send_byte(LED_STATUS); break; case LED1: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<1); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<1); } led_send_byte(LED_STATUS); break; case LED2: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<2); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<2); } led_send_byte(LED_STATUS); break; case LED3: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<3); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<3); } led_send_byte(LED_STATUS); break; case LED4: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<4); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<4); } led_send_byte(LED_STATUS); break; case LED5: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<5); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<5); } led_send_byte(LED_STATUS); break; case LED6: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<6); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<6); } led_send_byte(LED_STATUS); break; case LED7: if(status == LED_ON)//输出低 { LED_STATUS &= ~(1<<7); } else if(status == LED_OFF)//输出高 { LED_STATUS |= (1<<7); } led_send_byte(LED_STATUS); break; case LED_ALL: if(status == LED_ON)//输出低 { LED_STATUS = 0; } else if(status == LED_OFF)//输出高 { LED_STATUS = 0xff; } led_send_byte(LED_STATUS); break; default: break; } } } //单个灯状态设置 void Led_Single_State_Set(uint8_t led, uint8_t state) { led_run_set(led,state); } //指示灯初始化 void led_info_init(void) { memset(&led_info,0,sizeof(led_info_t)); //运行指示灯 led_info.run_led.flag = 0xff; led_info.run_led.timeout = LED_RUN_SLOW_TIME; //报税口指示灯 led_info.tax1_rcv_led.timeout = TAX1_RCV_LED_TIME; led_info.tax1_send_led.timeout = TAX1_SEND_LED_TIME; led_info.tax2_rcv_led.timeout = TAX2_RCV_LED_TIME; led_info.tax2_send_led.timeout = TAX2_SEND_LED_TIME; //Lora指示灯 led_info.lora_rcv_led.timeout = LORA_RCV_LED_TIME; led_info.lora_send_led.timeout = LORA_SEND_LED_TIME; //未配置sn指示灯 if(device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT) //未配置sn { led_info.uninit_led.flag = 0xff; led_info.uninit_led.timeout = LED_RUN_FAST_TIME; } //显示屏指示灯 led_info.display_rcv_led.timeout = DISPLAY_RCV_LED_TIME; led_info.display_send_led.timeout = DISPLAY_SEND_LED_TIME; } //关闭其他所有指示灯 void close_all_led(void) { led_info.tax1_rcv_led.flag = 0; led_info.tax1_send_led.flag = 0; led_info.tax2_rcv_led.flag = 0; led_info.tax2_send_led.flag = 0; led_info.lora_rcv_led.flag = 0; led_info.lora_send_led.flag = 0; led_info.display_rcv_led.flag = 0; led_info.display_send_led.flag = 0; led_run_set(LED_ALL,LED_OFF); } //功能指示灯开始指示 void led_start(uint8_t state) { if(device_fixed_info.Work_State==DEV_WORK_STATE_NORMAL && loraindex_led_flag==0)//正常工作模式和未打开lora信道指示灯时 { switch(state) { case TAX1_RCV_LED: timeout_start(&led_info.tax1_rcv_led,1); Led_Single_State_Set(TAX1_RCV_LED,LED_OFF); break; case TAX1_SEND_LED: timeout_start(&led_info.tax1_send_led,1); Led_Single_State_Set(TAX1_SEND_LED,LED_OFF); break; case TAX2_RCV_LED: timeout_start(&led_info.tax2_rcv_led,1); Led_Single_State_Set(TAX2_RCV_LED,LED_OFF); break; case TAX2_SEND_LED: timeout_start(&led_info.tax2_send_led,1); Led_Single_State_Set(TAX2_SEND_LED,LED_OFF); break; case LORA_RCV_LED: timeout_start(&led_info.lora_rcv_led,1); Led_Single_State_Set(LORA_RCV_LED,LED_OFF); break; case LORA_SEND_LED: timeout_start(&led_info.lora_send_led,1); Led_Single_State_Set(LORA_SEND_LED,LED_OFF); break; case DISPLAY_RCV_LED: timeout_start(&led_info.display_rcv_led,1); Led_Single_State_Set(DISPLAY_RCV_LED,LED_OFF); break; case DISPLAY_SEND_LED: timeout_start(&led_info.display_send_led,1); Led_Single_State_Set(DISPLAY_SEND_LED,LED_OFF); break; default: break; } } } //led运行处理 void led_run(void) { //未初始化运行指示灯开关判断 if(key_info[KEY0_PRES-1].execute)//按键功能正在执行,关闭未初始化指示灯 { timeout_stop(&led_info.uninit_led); } else//按键功能执行结束,根据模式判断未初始化指示灯 { if(device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT) { if(!led_info.uninit_led.flag)//未打开,打开 { timeout_start(&led_info.uninit_led,0xff); } } else { if(led_info.uninit_led.flag)//已打开,关闭 { timeout_stop(&led_info.uninit_led); } } } //运行指示灯 if(timeout_isOut(&led_info.run_led)) { LED_RUN = !LED_RUN; } //未初始化运行指示灯 if(timeout_isOut(&led_info.uninit_led)) { Led_Single_State_Set(LED_ALL,uninit_led_state); uninit_led_state = !uninit_led_state; } //报税口指示灯 if(timeout_isOut(&led_info.tax1_rcv_led)) { Led_Single_State_Set(TAX1_RCV_LED,LED_ON); } if(timeout_isOut(&led_info.tax1_send_led)) { Led_Single_State_Set(TAX1_SEND_LED,LED_ON); } if(timeout_isOut(&led_info.tax2_rcv_led)) { Led_Single_State_Set(TAX2_RCV_LED,LED_ON); } if(timeout_isOut(&led_info.tax2_send_led)) { Led_Single_State_Set(TAX2_SEND_LED,LED_ON); } //lora指示灯 if(timeout_isOut(&led_info.lora_rcv_led)) { Led_Single_State_Set(LORA_RCV_LED,LED_ON); } if(timeout_isOut(&led_info.lora_send_led)) { Led_Single_State_Set(LORA_SEND_LED,LED_ON); } //显示屏指示灯 if(timeout_isOut(&led_info.display_rcv_led)) { Led_Single_State_Set(DISPLAY_RCV_LED,LED_ON); } if(timeout_isOut(&led_info.display_send_led)) { Led_Single_State_Set(DISPLAY_SEND_LED,LED_ON); } //lora信道指示灯 if(timeout_isOut(&led_info.tt_loraindex_led_state)) { loraindex_led_flag = 0; close_all_led(); key_info[KEY0_PRES-1].execute = 0; } } ////明文密文指示灯运行 void Encryption_type_led_run_state(uint8_t state) { int i; uint8_t cip_led = LED_ON;//密文指示灯 OS_ERR err; if(state == CIPHERTEXT) //密文 { //8个灯快闪 for(i = 0; i < 5; i++) { led_run_set(LED_ALL,cip_led); cip_led = !cip_led; OSTimeDlyHMSM(0, 0, 0, CIPHERTEXT_LED_TIME, OS_OPT_TIME_DLY, &err); } led_run_set(LED_ALL,LED_OFF); } else if(state == PLAINTEXT)//明文 { //8个灯全亮 led_run_set(LED_ALL,LED_ON); OSTimeDlyHMSM(0, 0, PLAINTEXT_LED_TIME_S, 0, OS_OPT_TIME_DLY, &err); led_run_set(LED_ALL,LED_OFF); } } //升级开始指示灯处理 void ota_start_led_init(void) { close_all_led(); Led_Single_State_Set(UPDATA_START_LED,LED_ON); } //led显示一个数的后N位,bit最大为8 void Data_lastNbit_led(uint32_t data, uint8_t bit, uint8_t signal) { int i; int state = 0,signal_tmp = 0; if(bit <= 4) { if(signal == 0) { signal_tmp = 0; } else { signal_tmp = 4; } for(i = 0; i < bit; i++) { state = (data>>i) & 0x00000001; Led_Single_State_Set(i+signal_tmp,state); } } else if(bit <= 8) { Data_last4bit_led(SOFTWARE_VERSION_APP,1); for(i = 0; i < bit-4; i++) { state = (data>>i) & 0x00000001; Led_Single_State_Set(i+0,state); } } } //显示一个数的后4位 void Data_last4bit_led(uint32_t data, uint8_t signal) { int i; int state = 0,signal_tmp = 0; if(signal == 0) { signal_tmp = 0; } else { signal_tmp = 4; } for(i = 0; i < 4; i++) { state = (data>>i) & 0x00000001; Led_Single_State_Set(i+signal_tmp,state); } } //APP版本指示灯运行 void APP_edittion_led_run(void) { OS_ERR err; Data_last4bit_led(SOFTWARE_VERSION_APP,1); Data_last4bit_led((SOFTWARE_VERSION_APP>>4),0); OSTimeDlyHMSM(0, 0, 0, LED_APP_TIME, OS_OPT_TIME_DLY, &err); led_run_set(LED_ALL,LED_OFF); }