static ssize_t lcd_sysfs_store_lcd_power(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { int rc; int lcd_enable; // struct lcd_setting *plcd = dev_get_drvdata(dev); struct msm_fb_data_type *mfd; mfd = dev_get_drvdata(dev); dev_info(dev, "lcd_sysfs_store_lcd_power\n"); rc = strict_strtoul(buf, 0, (unsigned long *)&lcd_enable); if (rc < 0) return rc; if(lcd_enable) { lcd_power(mfd, &s6e8aa0_lcd, FB_BLANK_UNBLANK); } else { lcd_power(mfd, &s6e8aa0_lcd, FB_BLANK_POWERDOWN); } return len; }
void reset_display (void) { switch (ui_state) { case STATE_NORM: lcd_power(1); lcd_backlight(1); lcd_write_string_XY(0, 0, " e.quinox "); if(local_ee_data.full_unlock == EE_FULL_UNLOCK_CODE){ lcd_write_string_XY(0, 1, " Unlocked"); lcd_batt_level( get_soc(), get_charging_rate() ); } else{ lcd_write_string_XY(0, 1, " days"); lcd_write_int_XY(10, 1, get_unlock_days() ); lcd_batt_level( get_soc(), get_charging_rate() ); } break; case STATE_AWAIT_PAYMENT: //lcd_power(1); //lcd_backlight(1); lcd_write_string_XY(0, 0, "Enter:__________"); lcd_write_string_XY(0, 1, " Locked"); lcd_write_string_XY(6, 0, display_str); lcd_batt_level( get_soc(), get_charging_rate() ); break; case STATE_LVDC: lcd_clear(); lcd_write_string_XY(0, 0, " Battery Low "); //if( get_charging_rate() > 0) //{ lcd_batt_level( get_soc(), get_charging_rate() ); //} break; case STATE_SETUP: //display_str [0] = '\0'; //utoa_b(display_str, local_ee_data.box_id, 10, digit_count); lcd_write_string_XY(0, 0, "Box ID: "); lcd_write_string_XY(8, 0, display_str); lcd_write_string_XY(0, 1, " Setup Mode "); break; case STATE_OFF: lcd_clear(); lcd_power(0); break; default: lcd_clear(); break; } }
/******************************************************************************** PUCK: 函数功能:获取屏幕显示信息,并显示 入口: type-----模式参数;curs-----光标位置 返回: ********************************************************************************/ void screen (u8 type, curs_t curs) { const scrn_t* p; //在此前,vlist的信息已经更新-----PUCK static scrn_t scrn={0xff,0xff,"",{0}}; //不为0,保证第一次就能更新,因为0x000000有可能第一次就是0---PUCK if(scrn.code != vlist.code) //按照全显代码检索:编码已经更新,需要根据vlist的编码获取新的显示元素-----------PUCK { for (p=&table[0];p!=&table[MAXCOUNT];++p) { if ( p->code==vlist.code) //按照显示代码检索 { scrn = *p; break; } } } if(p==&table[MAXCOUNT]) //找不到显示的代码,只显示代码,事件,其他不显示-------PUCK { lcd_code (vlist.user, curs, vlist.dlen); lcd_events(); lcd_update(); return ; } curs %= vlist.dlen; lcd_data (scrn.item, scrn.frmt,scrn.elem.signpos); //18ms lcd_code (vlist.user, curs, vlist.dlen); //26ms lcd_mode (type); ///A/B/C 3种模式 lcd_total (scrn.elem.total ); ///< "总", lcd_phase (scrn.elem.phase ); ///< "A/B/C相", lcd_voltage (scrn.elem.voltage ); ///< "电压", lcd_current (scrn.elem.current ); ///< "电流", lcd_positive (scrn.elem.positive ); ///< mode4.bit4 ? "输入" : "正向"; lcd_negative (scrn.elem.negative ); ///< mode4.bit4 ? "输出" : "反向"; lcd_reactive (scrn.elem.reactive ); ///< "无功", lcd_active (scrn.elem.active ); ///< "有功", lcd_power (scrn.elem.power ); ///< "功率", lcd_factor (scrn.elem.factor ); ///< "因数", lcd_angle (scrn.elem.angle ); ///< "相角", lcd_energy (scrn.elem.energy ); ///< "电量", lcd_demand (scrn.elem.demand ); ///< "需量", lcd_time (scrn.elem.time ); ///< "时间", lcd_charge (scrn.elem.charge ); ///< "电费", lcd_lostvolt (scrn.elem.lostvolt ); ///< "失压", lcd_lostcurt (scrn.elem.lostcurt ); ///< "失流", lcd_periods (scrn.elem.periods ); ///< "时段", lcd_feerate (scrn.elem.feerate ); ///< "费率", lcd_thismonth(scrn.elem.thismonth); ///< "本月", lcd_lastmonth(scrn.elem.lastmonth); ///< mode4.bit5 ? "上月", "上上月" : "上1月", "上2月"; lcd_assemble (scrn.elem.assemble ); ///< "无功组合方式1 or 2", mode4.bit7 ? "逆时针" : "顺时针"; lcd_quadrant (scrn.elem.quadrant ); ///< "XX象限", lcd_tariff (scrn.elem.tariff ); ///< 显示"费率Tx", lcd_times (scrn.elem.times ); ///< 显示"上XX次", lcd_events (); //8ms lcd_update (); }
void lcd_enable(bool enable) { if(lcd_active() == enable) return; lcd_set_active(enable); if(lcd_active()) { // enable spi spi_enable(true); // reset imx233_lcdif_reset_lcd(true); imx233_lcdif_reset_lcd(false); mdelay(1); imx233_lcdif_reset_lcd(true); mdelay(1); // "power" on lcd_power(true); // setup registers lcd_power_seq(); lcd_init_seq(); lcd_display_on_seq(); imx233_dma_reset_channel(APB_LCDIF); imx233_dma_start_command(APB_LCDIF, &lcdif_dma[0].dma); } else { // power down lcd_display_off_seq(); lcd_power(false); // stop lcdif BF_CLR(LCDIF_CTRL, DOTCLK_MODE); /* stmp37xx errata: clearing DOTCLK_MODE won't clear RUN: wait until * fifo is empty and then clear manually */ while(!BF_RD(LCDIF_STAT, TXFIFO_EMPTY)); BF_CLR(LCDIF_CTRL, RUN); // disable spi spi_enable(false); } }
void lcd_enable(bool enable) { if(lcd_on == enable) return; lcd_on = enable; if(lcd_on) { // enable spi spi_enable(true); // reset imx233_lcdif_reset_lcd(true); imx233_lcdif_reset_lcd(false); mdelay(1); imx233_lcdif_reset_lcd(true); mdelay(1); // "power" on lcd_power(true); // setup registers imx233_lcdif_enable_sync_signals(true); // we need frame signals during init lcd_power_seq(); lcd_init_seq(); lcd_display_on_seq(); imx233_dma_reset_channel(APB_LCDIF); imx233_dma_start_command(APB_LCDIF, &lcdif_dma[0].dma); BF_SET(LCDIF_CTRL, DOTCLK_MODE); BF_SET(LCDIF_CTRL, RUN); } else { // power down lcd_display_off_seq(); lcd_power(false); // stop lcdif BF_CLR(LCDIF_CTRL, DOTCLK_MODE); // disable spi spi_enable(false); } }
/** * @brief Task which handles all UI including keypad, LCD and all user power outputs. * Responds to events caused by other tasks and ISRs * @param None * @retval Should never exit */ __task void ui (void) { uint16_t event_flag = 0; uint8_t key; int i; uint64_t entry_code = 0; lcd_init(); keypad_init(); lcd_backlight(1); buzzer_init(); pwr_sw_init(); usb_outputs_init(); dc_outputs_init(); lcd_clear(); lcd_write_string(" e.quinox "); lcd_goto_XY(0,1); lcd_write_string(" izuba.box "); //2 second timeout os_dly_wait(200); if ( get_unlock_days () >= 0 ) { ui_state = STATE_NORM; } if( local_ee_data.lvdc_flag == 1 ) { ui_state = STATE_LVDC; } reset_display(); reset_outputs(); while(1) { //Wait for any task event or timeout after 1 second if ( os_evt_wait_or(0xFFFF, 100) == OS_R_EVT ) { //Find which event event_flag = os_evt_get(); if ( event_flag & UI_BOX_SETUP ) { ui_state = STATE_SETUP; lcd_clear(); reset_display(); reset_outputs(); } if ( (event_flag & UI_LVDC) ) { if ( (ui_state != STATE_LVDC) && (ui_state != STATE_OFF) ) { ui_state = STATE_LVDC; local_ee_data.lvdc_flag = 1; update_lvdc(1); //Turn off outputs reset_outputs(); lcd_power(1); lcd_clear(); lcd_write_string_XY(0, 0, " Battery Empty "); lcd_write_string_XY(0, 1, " Turning Off "); //Delay and Buzz //20 Seconds for ( i = 0; i < 5; i++) { buzz(1); //4 second wait os_dly_wait(400); } //Turn off Screen lcd_power(0); } } if ( event_flag & UI_PWR_SW ) { if ( ui_state != STATE_OFF) { //Turn off all outputs and UI devices //Wait only for UI_PWR_SW tasks lcd_power(0); ui_state = STATE_OFF; reset_outputs(); } else { //Re-init LCD lcd_clear(); lcd_power(1); check_display_debug(); lcd_splash_screen(2); if(get_soc() >= CHARGED) { local_ee_data.lvdc_flag = 0; update_lvdc(0); } if(local_ee_data.lvdc_flag == 1) { ui_state = STATE_LVDC; } if(ui_state != STATE_LVDC) { if (get_unlock_days () >= 0 ) ui_state = STATE_NORM; else ui_state = STATE_AWAIT_PAYMENT; } reset_outputs(); reset_display(); } //1 second delay os_dly_wait(100); EXTI_ClearITPendingBit(EXTI_Line0); } if ( event_flag & UI_EVT_USB_OC ) { os_dly_wait(100); if(EXTI_GetITStatus(EXTI_Line5) != RESET || EXTI_GetITStatus(EXTI_Line6) != RESET) { if(EXTI_GetITStatus(EXTI_Line5) != RESET) USB1_DISABLE(); if(EXTI_GetITStatus(EXTI_Line6) != RESET) USB2_DISABLE(); lcd_clear(); lcd_write_string_XY(0, 0, " USB "); lcd_write_string_XY(0, 1, " error! "); //2s wait os_dly_wait(200); reset_display(); } } if ( event_flag & (UI_EVT_KEYPAD_1 | UI_EVT_KEYPAD_2 | UI_EVT_KEYPAD_3) ) { if ( (ui_state == STATE_AWAIT_PAYMENT) || (ui_state == STATE_NORM) || (ui_state == STATE_SETUP) ) { //Read which key is pressed i = 0; do { key = keypad_get_key(); i++; os_dly_wait(1); if ( i > 20) break; } while (key == KEY_NONE); if (key != KEY_NONE) { lcd_backlight(1); buzz(1); } if (ui_state == STATE_SETUP) { //If 5 digits and tick then set box_id if (key == KEY_CROSS) { //'X' Pressed //LCDWriteString("x"); display_str[0] = '\0'; digit_count = 0; local_ee_data.box_id = 0; reset_display(); } else if (key == KEY_NONE) { //Do nothing } else if ( key == KEY_TICK ) { if(digit_count == 5){ os_dly_wait(50); //Send message to payment control task os_evt_set(PC_SET_BOX_ID, payment_control_t); ui_state = STATE_AWAIT_PAYMENT; display_str[0] = '\0'; digit_count = 0; reset_display(); reset_outputs(); } }else{ if(digit_count <5){ //Add the keypad value to the box id display_str[0] = '\0'; local_ee_data.box_id = (local_ee_data.box_id * 10) + key; utoa_b(display_str, local_ee_data.box_id, 10, digit_count); lcd_write_string_XY(7, 0, display_str); lcd_goto_XY((8 + digit_count), 0); reset_display(); } else { // do nothing } digit_count++; } } else if (ui_state == STATE_AWAIT_PAYMENT) { if (key == KEY_CROSS) { //'X' Pressed //LCDWriteString("x"); display_str[0] = '\0'; digit_count = 0; entry_code = 0; lcd_write_string_XY(6, 0, "__________"); lcd_goto_XY(6, 0); //key = KEY_NONE; } else if (key == KEY_TICK) { //Tick Pressed //LCDWriteString("./"); } else if (key == KEY_NONE) { //Tick Pressed //LCDWriteString("./"); } else { //Add the keypad to the entry code entry_code = (entry_code * 10) + key; //Make the display_str[0] = '\0'; utoa_b(display_str, entry_code, 10, digit_count); lcd_write_string_XY(6, 0, display_str); lcd_goto_XY((7 + digit_count), 0); if (digit_count++ == 9) { os_dly_wait(50); //Send code to payment control task // but send (uint32_t)entry_code if ( check_unlock_code((uint32_t)entry_code)) { TRACE_INFO("2,1,%s\n", display_str); ui_state = STATE_NORM; // Edited Code lcd_clear(); lcd_write_string_XY(0, 0, " Valid "); lcd_write_string_XY(0, 1, " code! "); entry_code = 0; digit_count = 0; display_str[0] = '\0'; //2s wait os_dly_wait(200); // End of Edit reset_display(); reset_outputs(); } else { TRACE_INFO("2,0,%s\n", display_str); // Edited Code lcd_clear(); lcd_write_string_XY(0, 0, " Wrong "); lcd_write_string_XY(0, 1, " code! "); //2s wait os_dly_wait(200); // End of Edit entry_code = 0; digit_count = 0; display_str[0] = '\0'; reset_display(); reset_outputs(); } } } } else { switch (key) { case KEY_NONE: //No Action break; //Special Key Cases case KEY_TICK: TRACE_DEBUG("Key: ./ \n"); break; case KEY_CROSS: TRACE_DEBUG("Key: X \n"); break; default: //Print the key number TRACE_DEBUG("Key: %i \n", key); } } //Wait for release of key (with time-out) i = 0; while( keypad_get_key() != KEY_NONE ) { i++; os_dly_wait(1); if ( i > 20) break; } } } if(local_ee_data.lvdc_flag == 0) { if ( event_flag & UI_PAYMENT_INVALID ) { ui_state = STATE_AWAIT_PAYMENT; lcd_clear(); reset_display(); reset_outputs(); } } if(local_ee_data.lvdc_flag == 1) { lcd_clear(); lcd_write_string_XY(0, 0, " Battery Low "); lcd_batt_level( get_soc(), get_charging_rate() ); if(get_soc() >= CHARGED) { local_ee_data.lvdc_flag = 0; update_lvdc(0); } } //clear event flags os_evt_clr(event_flag, ui_t); } /* Debugging Info on LCD sprintf(str, "P=%.2f", get_adc_voltage(ADC_SOL_V)*get_adc_voltage(ADC_SOL_I)); lcd_goto_XY(0,0); lcd_write_string(str); str[0] = NULL; sprintf(str, "T=%.2f", get_adc_voltage(ADC_TEMP)); lcd_goto_XY(8,0); lcd_write_string(str); str[0] = NULL; sprintf(str, "V=%.2f", get_adc_voltage(ADC_BATT_V)); lcd_goto_XY(0,1); lcd_write_string(str); str[0] = NULL; sprintf(str, "I=%.2f", get_adc_voltage(ADC_BATT_I)); lcd_goto_XY(8,1); lcd_write_string(str); str[0] = NULL; */ //Update battery levels, days remaining and if normal state then time/date if(local_ee_data.lvdc_flag == 1) { lcd_write_string_XY(0, 0, " Battery Low "); lcd_batt_level( get_soc(), get_charging_rate() ); if(get_soc() >= CHARGED) { local_ee_data.lvdc_flag = 0; update_lvdc(0); if(get_unlock_days () >= 0 ) { ui_state = STATE_NORM; } else { ui_state = STATE_AWAIT_PAYMENT; } reset_display(); reset_outputs(); } } if ( (ui_state == STATE_NORM) || (ui_state == STATE_AWAIT_PAYMENT) ) { lcd_batt_level( get_soc(), get_charging_rate() ); } if (ui_state == STATE_NORM) { //Update remaining days if(local_ee_data.full_unlock == EE_FULL_UNLOCK_CODE){ lcd_write_string_XY(0, 1, " Unlocked"); lcd_batt_level( get_soc(), get_charging_rate() ); } else{ lcd_write_string_XY(0, 1, " days"); lcd_write_int_XY(10, 1, get_unlock_days() ); lcd_batt_level( get_soc(), get_charging_rate() ); } } } }