From: p15692025051 <846603105@qq.com> Date: Mon, 9 Oct 2023 08:58:30 +0000 (+0800) Subject: k01计算器文件提交 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=f7ebf97ccd969f7fa8e8b350d75465e93082e84c;p=mirrors%2FASR1603_G5.git k01计算器文件提交 --- diff --git a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py new file mode 100644 index 00000000..73d9c438 --- /dev/null +++ b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py @@ -0,0 +1,295 @@ +import lvgl as lv +import ql_fs +import EventMesh +from misc import Power +from ui import style_screen,style_font_youyuan_20_black,style_btn,style_img,Screen,style_contact_btn,style_bar,style_bar_indic +import constants +import osTimer +import audio +from machine import Pin +import usys + + +calculator_screen = lv.obj() +print("calculator_screen") +calculator_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) +calculator_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +# 创建文本框 +calculator_label = lv.textarea(calculator_screen) +calculator_label.set_one_line(True) # 关闭1行模式 +calculator_label.set_size(128, 32) # 设置宽高 +calculator_label.align(lv.ALIGN.TOP_MID, 0, -2) # 设置位置 +calculator_label.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) #不显示滚动条 +#calculator_label.add_event_cb(lambda e: self.textarea_event_handler(e, ta), lv.EVENT.READY, None) # 添加回调函数 +calculator_label.add_state(lv.STATE.FOCUSED) # 设置光标 +calculator_label.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT) + + +calculator_num = lv.btnmatrix(calculator_screen) +calculator_num.set_pos(int(0),int(30)) +calculator_num.set_size(128,90) +calculator_num.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF) +btnm_map = [ +"C","<-","=","\n", +"1","2","3","+","\n", +"4","5","6","-","\n", +"7","8","9","*","\n", +".","0","%","/",""] +calculator_num.set_map(btnm_map) +# create style style_calculator_num_main_default +style_calculator_num_main_default = lv.style_t() +style_calculator_num_main_default.init() +style_calculator_num_main_default.set_radius(4) +style_calculator_num_main_default.set_bg_color(lv.color_make(0xff,0xff,0xff)) +style_calculator_num_main_default.set_bg_grad_color(lv.color_make(0xff,0xff,0xff)) +style_calculator_num_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE) +style_calculator_num_main_default.set_bg_opa(255) +style_calculator_num_main_default.set_border_color(lv.color_make(0xff,0xff,0xff)) +style_calculator_num_main_default.set_border_width(1) +style_calculator_num_main_default.set_border_opa(255) +style_calculator_num_main_default.set_pad_left(2) +style_calculator_num_main_default.set_pad_right(0) +style_calculator_num_main_default.set_pad_top(2) +style_calculator_num_main_default.set_pad_bottom(0) +style_calculator_num_main_default.set_pad_row(1) +style_calculator_num_main_default.set_pad_column(1) + +# add style for calculator_num +calculator_num.add_style(style_calculator_num_main_default, lv.PART.MAIN|lv.STATE.DEFAULT) + +# create style style_calculator_num_items_default +style_calculator_num_items_default = lv.style_t() +style_calculator_num_items_default.init() +style_calculator_num_items_default.set_radius(4) +style_calculator_num_items_default.set_bg_color(lv.color_make(0xe6,0xe6,0xe6)) +style_calculator_num_items_default.set_bg_grad_color(lv.color_make(0xe6,0xe6,0xe6)) +style_calculator_num_items_default.set_bg_grad_dir(lv.GRAD_DIR.NONE) +style_calculator_num_items_default.set_bg_opa(255) +style_calculator_num_items_default.set_border_color(lv.color_make(0xd6,0xdd,0xe3)) +style_calculator_num_items_default.set_border_width(1) +style_calculator_num_items_default.set_border_opa(255) +style_calculator_num_items_default.set_text_color(lv.color_make(0x00,0x00,0x00)) +try: + style_calculator_num_items_default.set_text_font(lv.K01_font_16_ALL) +except AttributeError: + print("set_font:error") + +# add style for calculator_num +calculator_num.add_style(style_calculator_num_items_default, lv.PART.ITEMS|lv.STATE.DEFAULT) +def my_round(src, idx): + src_flag = 1 #正负数 + if src < 0: + src_flag = 0 + src = abs(src) + tmp_str = "{}".format(src) + tmp_str_l= tmp_str.split(".") + print("tmp_str1:{} {}".format(tmp_str,tmp_str_l)) + if len(tmp_str_l)>1 : + if len(tmp_str_l[1]) > idx: + for i in range(idx): + src *=10 + dest = int(src) + if src >= dest+0.5 : + dest += 1 + print("dest:{}".format(dest)) + tmp_str = "{}".format(dest) + if len(tmp_str) > idx: + tmp_str = tmp_str[:len(tmp_str)-idx]+'.'+tmp_str[len(tmp_str)-idx:] + else : #位数不够,补0 + zero_str = "" + for j in range(idx-len(tmp_str)): + zero_str += "0" + print("zero_str:{}".format(zero_str)) + tmp_str = '0.'+zero_str+tmp_str + tmp_str = tmp_str.rstrip('0')#去掉尾数的 0 + if "." in tmp_str: + tmp_str = tmp_str.rstrip('.')#去掉尾数的 . + # for i in range(idx): + # dest /=10 + print("tmp_str:{}".format(tmp_str)) + if src_flag == 0 : + tmp_str = "-" + tmp_str + return tmp_str + +class calculatorScreen(Screen): + NAME = "calculator" + + def __init__(self): + + super().__init__() + self.meta = None + self.calculator_num = '' + self.calculator_list = [] + self.button = 0 + self.timer = osTimer() + self.timer_cb = 0 + self.count = 0 + self.str = "" + calculator_num.add_event_cb(lambda e: self.calculator_event_cb(e,calculator_num), lv.EVENT.VALUE_CHANGED, None) + self.calculator_flag = 0 + self.result = "" + self.num_count = 0 #限制输入位数 20位 + def initialization(self): + + self.meta = calculator_screen + + def calculator_eval(self,str): + print("calculator_eval:str{}".format) + try : + num = eval(str) + ret = "{}".format((my_round(num,8))) #只保留小数点8位 + # tmp = ret.split('.') + # if len(tmp) > 1: + # if len(tmp[1]) > 8 : #保留小数点失败 + # str_tmp = tmp[0]+"."+tmp[1][:-1] + # ret = "{}".format((float(str_tmp))) + + return ret + except Exception as e: + usys.print_exception(e) + e_tmp = "{}".format(e) + if e_tmp.find("divide by zero") != -1 : + calculator_label.set_text("除数不能为0") + elif e_tmp.find("invalid syntax") != -1 : + EventMesh.txt_log("calculator:{} {}".format(self.calculator_flag,self.str)) + calculator_label.set_text("无效语法") + else : + EventMesh.txt_log("calculator:{} {}".format(self.calculator_flag,self.str)) + calculator_label.set_text("运算异常") + self.str = "" + self.calculator_flag = 0 + return -1 + def calculator_event_cb(self,e,calculator_num): + src = e.get_target() + code = e.get_code() + #print("calculator_clicked:{} {}".format(src,code)) + if code == lv.EVENT.VALUE_CHANGED: + txt = src.get_btn_text(src.get_selected_btn()) # 获取被点击的按钮的内容 + try : + if txt == "<-": # 如果是退格键,那么就删除1个字符 + if self.calculator_flag != 2 : + if len(self.str) > 1: + str_tmp = self.str[-1] + if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符 + self.calculator_flag = 0 + self.str = self.str[0:-1] + else : + self.str = "" + self.calculator_flag = 0 + if self.num_count > 0 : + self.num_count-=1 + #calculator_label.del_char() + elif txt == "C": #清除键 + self.num_count = 0 + self.str = "" + calculator_label.set_text("") + self.calculator_flag = 0 + elif txt == "=" : + if(self.calculator_flag == 1): #有运算符 + str_tmp = self.str[-1] + if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符 + return + else: + self.num_count = 0 + self.result = self.calculator_eval(self.str) + if self.result == -1: + return + self.str += txt+self.result + self.calculator_flag = 2 + elif txt == "%" : + str_tmp = self.str[-1] + if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符 + self.str = self.str[:-1] + + self.num_count = 0 + self.result = self.calculator_eval(self.str+"/100") + if self.result == -1: + return + self.str += txt+"="+self.result + self.calculator_flag = 2 + elif txt == "/" or txt == "*" or txt == "-" or txt == "+" : # 如果是符号,就运算 + self.num_count = 0 + if self.calculator_flag == 0:#无运算符 + if len(self.str) == 0: #开头不能为运算符 + return + self.calculator_flag = 1 + self.str += txt + elif self.calculator_flag == 1 : #有运算符 + str_tmp = self.str[-1] + if str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+" : #最后一个是运算符 + self.str = self.str[:-1]+txt + + elif str_tmp == ".": #最后一个是.,去除再运算 + self.str = self.str[0:-1] + self.result = self.calculator_eval(self.str) + if self.result == -1: + return + self.str = self.result+txt + else : + self.result = self.calculator_eval(self.str) + if self.result == -1: + return + self.str = self.result+txt + elif self.calculator_flag == 2 : #已经运算了一次 + self.str = self.result + txt + self.calculator_flag = 1 + elif txt == ".": + if self.num_count >=20: + return + self.num_count += 1 + str_tmp = self.str[-1] + if str_tmp == "." :#最后一个是. 不再添加 + pass + elif str_tmp == "/" or str_tmp == "*" or str_tmp == "-" or str_tmp == "+": #最后一个是符号 前面加一个0 + self.str = self.str + "0"+ txt + else : + self.str+=txt + elif txt:#数字 + if self.num_count >=20: + return + self.num_count += 1 + #calculator_label.add_text(txt) # 如果不是回车键,那么就将当前数字显示到文本框 + self.str+=txt + if self.calculator_flag == 2 : + self.str=txt + self.calculator_flag = 0 + calculator_label.set_text(self.str) + except Exception as e: + usys.print_exception(e) + e_tmp = "{}".format(e) + if e_tmp.find("divide by zero") != -1 : + calculator_label.set_text("0不能为除数") + self.str = "" + self.calculator_flag = 0 + else : + EventMesh.txt_log("calculator:{} {} {}".format(self.calculator_flag,self.str,txt)) + calculator_label.set_text("运算异常") + self.str = "" + self.calculator_flag = 0 + #print("ui_queue_thread:ERROR:{}".format(e)) + + print("calculator_clicked:flag:{} str{} ".format(self.calculator_flag,self.str)) + + + + def lcd_on(self): + if self.timer_cb != 0: + self.timer_cb = 0 + #self.timer.start(1000,1,self.refresh_line) + + def lcd_off(self): + self.timer_cb = 1 + self.timer.stop() + + + def done_return(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn1_release(self): + EventMesh.publish("load_screen", {"screen": "main_menu"}) + + def btn8_press(self): + EventMesh.publish("watch_top_show") + EventMesh.publish("load_screen", {"screen": "main_menu"}) +