From: d15521469561 Date: Fri, 12 May 2023 02:11:21 +0000 (+0800) Subject: 增加main协议 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=bc77b25ae38653949a12caad9e662a57b09fe8aa;p=mirrors%2FASR1603_G5.git 增加main协议 --- diff --git a/3.code/1.watch/2.code/main_1.py b/3.code/1.watch/2.code/main_1.py index 3c5822ec..ad3dccb7 100644 --- a/3.code/1.watch/2.code/main_1.py +++ b/3.code/1.watch/2.code/main_1.py @@ -131,13 +131,13 @@ if __name__ == '__main__': from protocol import LK_ProtoCol,PING_ProtoCol,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,HRSTART_ProtoCol,CENTER_ProtoCol,UPLOAD_ProtoCol,\ - TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,\ + TEMP_ProtoCol,DLT_ProtoCol,WT_ProtoCol,UD_ProtoCol,REMIND_ProtoCol, CR_ProtoCol,KA_ProtoCol,FIND_ProtoCol,POWEROFF_ProtoCol,sosHome_dial_ProtoCol,\ ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol import mgr as mgr print("init7:{}".format(utime.localtime())) from mgr import ConfigStoreManager, LocationManager, SockManager,getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, \ - NetManager,AddrBookManager,MsgdetailManager,PhoneCallingManager,getStorageDataManager,getBrightnessManager,getHrTimeManager + NetManager,AddrBookManager,MsgdetailManager,PhoneCallingManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getSosFlagManager print("init8:{}".format(utime.localtime())) @@ -180,6 +180,7 @@ if __name__ == '__main__': app.append_manager(getStorageDataManager()) app.append_manager(getUpLoadDataManager()) app.append_manager(getVolumSizeManager()) + app.append_manager(getSosFlagManager()) print("init11:{}".format(utime.localtime())) pcr = ProtoColResolver() @@ -206,6 +207,8 @@ if __name__ == '__main__': # pcr.add_support(CENTER_ProtoCol()) pcr.add_support(CENTER_ProtoCol()) pcr.add_support(bootoff_ProtoCol()) + pcr.add_support(sosHome_dial_ProtoCol()) + sm = SockManager() sm.add_support_resolver(pcr) app.append_manager(sm) diff --git a/3.code/1.watch/2.code/mgr.py b/3.code/1.watch/2.code/mgr.py index 1ea1541a..98bf563e 100644 --- a/3.code/1.watch/2.code/mgr.py +++ b/3.code/1.watch/2.code/mgr.py @@ -19,6 +19,7 @@ from misc import USB, Power, ADC from machine import ExtInt, Pin,Timer,RTC,UART import EventMesh import audio +from machine import I2C from Gsensor import SC7A20 from Hsensor import GH3018 import quecgnss @@ -435,6 +436,10 @@ class ConfigStoreManager(Abstract): def voice_callback(args): print('voicecall iinfo:{}'.format(args)) if args[0] == 10: + get_UI_high_priority = EventMesh.publish("get_UI_high_priority")#如果在拨出去或者通话中屏蔽来电 + if get_UI_high_priority == 1: + EventMesh.publish("set_interrup_incall",1) + return print('voicecall incoming call, PhoneNO.: ', args[6]) size_len = len(str(args[6])) tmp = [] @@ -447,6 +452,12 @@ def voice_callback(args): EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)}) elif args[0] == 11: + EventMesh.publish("set_UI_high_priority",0) + sos_flag = EventMesh.publish("get_sos_flag") + if sos_flag == 1: + sos_flag = 0 + EventMesh.publish("set_sos_flag",0) + print('voicecall connected, PhoneNO.: ', args[6]) size_len = len(str(args[6])) tmp = [] @@ -458,12 +469,67 @@ def voice_callback(args): EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)}) elif args[0] == 12: + set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了 + if set_interrup_call == 1: + EventMesh.publish("set_interrup_incall",0) + return + + EventMesh.publish("set_interrup_incall",0) + EventMesh.publish("set_UI_high_priority",0) print('voicecall disconnect') - EventMesh.publish("load_screen", {"screen": "main_menu"}) + EventMesh.publish("load_screen", {"screen": "main_menu"}) + sos_flag = EventMesh.publish("get_sos_flag") + if sos_flag == 0: + EventMesh.publish("set_sos_num",0) + else: + num = EventMesh.publish("get_sos_num") + number = EventMesh.publish("get_dial_sos_number") + if len(number) > 0: + if num == None: + num = 0 + num+=1 + num_len = 0 + + if len(number) == 1: + num_len = len(number) + elif len(number) == 2: + num_len = len(number)+1 + elif len(number) == 3: + num_len = len(number)+2 + # print("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len)) + if num > num_len : + EventMesh.publish("set_sos_flag",0) + EventMesh.publish("set_sos_num",0) + else: + # print("number:{} number_len :{}".format(number,len(number))) + EventMesh.publish("set_sos_num",num) + if len(number) == 1: + EventMesh.publish("set_callnumer_cb",number[0]) + print("phone 1") + elif len(number) == 2: + if num == 1 or num == 3: + print("phone 2") + EventMesh.publish("set_callnumer_cb",number[1]) + elif num == 2: + print("phone 3") + EventMesh.publish("set_callnumer_cb",number[0]) + elif len(number) == 3: + if num == 1 or num == 4: + EventMesh.publish("set_callnumer_cb",number[1]) + print("phone 4") + elif num == 2 or num == 5: + print("phone 5") + EventMesh.publish("set_callnumer_cb",number[2]) + elif num == 3: + print("phone 6") + EventMesh.publish("set_callnumer_cb",number[0]) + print('voicecall disconnect end') + elif args[0] == 13: print('voicecall is waiting, PhoneNO.: ', args[6]) elif args[0] == 14: + print('voicecall dialing, PhoneNO.: ', args[6]) EventMesh.publish("load_screen", {"screen": "dialing"}) @@ -537,6 +603,9 @@ class DeviceInfoManager(Abstract): print('GNSS init ok.') else: print('GNSS init failed.') + + self.i2c0 = I2C(I2C.I2C0, I2C.STANDARD_MODE) + self.stop_temp( None, None) def post_processor_after_instantiation(self): print("post_processor_after_instantiation:1") @@ -575,6 +644,10 @@ class DeviceInfoManager(Abstract): EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen) EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart) + EventMesh.subscribe(constants.EVENT.START_TEMP, self.start_temp) + EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp) + EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp) + print("post_processor_after_instantiation:2") self.timer_push_schedule.start(10000, 1, self.publish_event) # self.battery_push_schedule.start(3000, 1, self.__check_battery) @@ -603,11 +676,13 @@ class DeviceInfoManager(Abstract): self.timer_push = 0 date_tmp = utime.localtime() time_tmp = utime.mktime(date_tmp) + print("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp)) + if math.fabs(time_tmp - self.KA_time) > 7*60: #7分钟一次心跳 self.KA_time = time_tmp EventMesh.publish(constants.PROTOCOL.KA_SEND) self.upload_time = EventMesh.publish("get_upload_data") - + #print("self.upload_time:{} math.fabs(time_tmp - self.UD_time):{}".format(self.upload_time,math.fabs(time_tmp - self.UD_time))) if self.upload_time != None: if math.fabs(time_tmp - self.UD_time) > self.upload_time: #7分钟一次定位 self.UD_time = time_tmp @@ -649,7 +724,7 @@ class DeviceInfoManager(Abstract): self.bat_time = 0 if battery[1] == 20: EventMesh.publish("load_screen", {"screen": "LOW_POWER"}) - print("battery:{}".format(battery)) + #消息已满 msg_nums = sms.getMsgNums() #获取短信条数 self.sms_full_flag+=10 @@ -658,12 +733,12 @@ class DeviceInfoManager(Abstract): if msg_nums >= 50: EventMesh.publish("load_screen", {"screen": "message_full"}) - #print("hr......01....{}\r\n".format(hr_time)) + if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 or battery[1] != 1: if hr_time != None: # print("hr......01....{}\r\n".format(hr_time)) if hr_time > 0: - # print("get_hr_state:{} get_spo2_state:{} self.old_time:{} hr_time:{}".format(self.get_hr_state,self.get_spo2_state,self.old_time,hr_time)) + #print("get_hr_state:{} get_spo2_state:{} self.old_time:{} hr_time:{}".format(self.get_hr_state,self.get_spo2_state,self.old_time,hr_time)) if self.get_hr_state != 1 and self.get_spo2_state != 1: if self.get_hr_state == 0 and self.get_spo2_state == 0: if self.HR_state == 0 or self.HR_state == 3: @@ -742,11 +817,10 @@ class DeviceInfoManager(Abstract): EventMesh.publish("set_old_spo2_data",spo2_value) EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value) self.HR_state = 3 - else: - self.SENSOR_time = time_tmp self.HR_state = 0 - self.old_time = 0 + self.old_time = hr_time + if self.HR_state == 3 or self.HR_state == 0:#只有不在测量的时候才测单次的 if self.get_spo2_state == 3 or self.get_hr_state == 3:#单次测量 self.HR_state = 0 @@ -830,11 +904,9 @@ class DeviceInfoManager(Abstract): else: self.HR_Onestate = 0 self.HR_OneTime = 0 - else: - # print("hr......01....{} {} self.HR_Onestate {} {}".format(self.get_hr_state,self.get_spo2_state,self.HR_OneTime,self.HR_Onestate)) + #print("hr......01....{} {} self.HR_Onestate {} {}".format(self.get_hr_state,self.get_spo2_state,self.HR_OneTime,self.HR_Onestate)) self.SENSOR_time = time_tmp#进入最后一次的时间戳 - self.old_time = 0 if self.get_hr_state != 1 and self.get_spo2_state != 1:#没有设置间隔时间单次测量 if self.get_spo2_state == 3 or self.get_hr_state == 3:#单次测量 @@ -1162,7 +1234,32 @@ class DeviceInfoManager(Abstract): def get_heart(self, topic, msg): data = self.hsensor.get_all_data() return data[0] + + def start_temp(self, topic, msg): + WHO_AM_I = bytearray([0x01, 0]) + I2C_SLAVE_ADDR = 0x49 + r_data = bytearray(2) + data = bytearray([0x61A0, 0]) # 唤醒 + return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) + def stop_temp(self, topic, msg): + WHO_AM_I = bytearray([0x01, 0]) + I2C_SLAVE_ADDR = 0x49 + r_data = bytearray(2) + data = bytearray([0x60A0, 0]) #休眠 + return self.i2c0.write(I2C_SLAVE_ADDR, WHO_AM_I, 1, data, 2) + + def get_temp(self, topic, msg): + WHO_AM_I = bytearray([0x00, 0]) + I2C_SLAVE_ADDR = 0x49 + r_data = bytearray(2) + self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0) + #print("temp_data:{}".format(r_data)) + temp_s = ((r_data[0]<<8) | (r_data[1]))>>4 + #print("temp_s:{}".format(temp_s)) + temp_data = temp_s * 0.0625 + #print("temp_data:{}".format(temp_data)) + return temp_data @@ -1263,7 +1360,7 @@ class SockManager(Abstract): _thread.start_new_thread(self.reconnect, ()) break data = data + r - if data[-1] != 0x5d and len(data)<10*1024: #']': + if data[-1] != 0x5d and len(data)<20*1024: #']': continue self.connect_tmp = 1 #有数据,就认为是连接状态 print("TCP:recv: data:{}".format(data)) @@ -1415,7 +1512,11 @@ class LocationManager(Abstract): data = "" self.location_timer_count = self.location_timer_count +1 self.location_check_data_timer_count = self.location_check_data_timer_count+1 - if self.location_check_data_timer_count > 5 :#5秒查一次 + + match_gga_data = [] + match_gsv_data = [] + + if self.location_check_data_timer_count > 2 :#5秒查一次 self.location_check_data_timer_count = 0 #print(self.location_timer_count) #检查wifi数据 @@ -1427,6 +1528,8 @@ class LocationManager(Abstract): data = quecgnss.read(4096) #print(data[1].decode()) if data[0] > 0 : #有数据 + match_gga_data = self.match.GxGGA(data[1]).split(",") + match_gsv_data = self.match.GxGSV(data[1]).split(",") if self.gps.__check_gps_valid(data[1].decode()): #数据齐全 match_gmc_data = self.match.GxRMC(data[1]).split(",") match_vtg_data = self.match.GxVTG(data[1]).split(",") @@ -1460,14 +1563,17 @@ class LocationManager(Abstract): if self.location_type == 1: #测试模式 EventMesh.publish("PUSH_LOCATION_DATA", [data,self.wifi_data,self.cell_data]) elif self.location_type == 0: #正常模式 - if self.gps_data != [] or self.location_timer_count > 60: #or( self.wifi_data != [] and self.cell_data != []): + if self.gps_data != [] or self.location_timer_count > 40: #or( self.wifi_data != [] and self.cell_data != []): #print("publish:READ_LOCATION") EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data]) EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - # if self.location_timer_count > 60 : #1分钟定位超时,超时发送数据,停止定时器及关闭定位 - # EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - # EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data])#发送数据 - + + if len(match_gsv_data) >= 3: + #print("match_gsv_data[3]:{}".format(match_gsv_data[3])) + if (int(match_gsv_data[3]) < 3 and self.wifi_data != [] and self.cell_data != [] and self.location_timer_count > 10): #超过10秒且卫星个数少于3 + #print("publish:READ_LOCATION") + EventMesh.publish(constants.EVENT.READ_LOCATION, [self.gps_data,self.wifi_data,self.cell_data]) + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 @@ -1889,7 +1995,7 @@ class getVolumSizeManager(Abstract):#设置或获取音量大小数据 self.volume_size = 8 self.read_data = {} check = ql_fs.path_exists("/ext/static/storage_file/config.json") - print("check:{}".format(check)) + if check == True: with open("/ext/static/storage_file/config.json","r") as fd: self.read_data = ujson.load(fd) @@ -1901,6 +2007,7 @@ class getVolumSizeManager(Abstract):#设置或获取音量大小数据 self.volume_size = 8 else: self.volume_size = 8 + # print("self.volume_size:{}".format(self.volume_size)) def post_processor_after_instantiation(self): EventMesh.subscribe("set_volum_size", self.set_volum_size) EventMesh.subscribe("get_volum_size", self.get_volum_size) @@ -1911,4 +2018,207 @@ class getVolumSizeManager(Abstract):#设置或获取音量大小数据 def get_volum_size(self, event, msg): return self.volume_size +class getSosFlagManager(Abstract):#设置或获取音量大小数据 + def __init__(self): + self.sos_flag = 0 + self.sos_num = 0 + self.call_timer = osTimer() + self.sos_numer1 = [] + self.callnumer ="" + self.read_data = {} + check = ql_fs.path_exists("/ext/static/storage_file/config.json") + + if check == True: + with open("/ext/static/storage_file/config.json","r") as fd: + self.read_data = ujson.load(fd) + if self.read_data != {}: + b1 = str("SOS_NUMBER1") in self.read_data.keys() + if b1 == True: + self.sos_numer1 = [self.read_data["SOS_NUMBER1"]] + b2 = str("SOS_NUMBER2") in self.read_data.keys() + if b2 == True: + self.sos_numer1 = [self.read_data["SOS_NUMBER1"], self.read_data["SOS_NUMBER2"]] + + b3 = str("SOS_NUMBER3") in self.read_data.keys() + if b3 == True: + self.sos_numer1 = [self.read_data["SOS_NUMBER1"], self.read_data["SOS_NUMBER2"],self.read_data["SOS_NUMBER3"]] + + # print("self.sos_numer1:{} self.read_data:{}".format(self.sos_numer1,self.read_data)) + + def post_processor_after_instantiation(self): + EventMesh.subscribe("set_sos_flag", self.set_sos_flag)#设置sos拨打标识 + EventMesh.subscribe("get_sos_flag", self.get_sos_flag) + + EventMesh.subscribe("set_sos_num", self.set_sos_num)#设置拨打循环次数 + EventMesh.subscribe("get_sos_num", self.get_sos_num) + + EventMesh.subscribe("set_dial_sos_number", self.set_dial_sos_number) + + EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调 + + EventMesh.subscribe("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个 + + def set_sos_flag(self, event, msg): + self.sos_flag = msg + if self.sos_flag == 1: + number = EventMesh.publish("get_dial_sos_number") + if len(number) > 0 and number != None: + EventMesh.publish("save_phonename",number[0]) + EventMesh.publish("save_phonenum",number[0]) + voiceCall.callStart(str(number[0])) + + + def set_callnumer_cb(self, event, msg): + self.callnumer = msg + self.call_timer.start(5000, 0, self.call_timer_cb)#延迟1S 继续拨打 + + def call_timer_cb(self, *args, **kwargs): + # print("call_timer_cb:{}".format(self.callnumer)) + EventMesh.publish("save_phonename",str(self.callnumer)) + EventMesh.publish("save_phonenum",str(self.callnumer)) + voiceCall.callStart(str(self.callnumer)) + + def get_sos_flag(self, event, msg): + return self.sos_flag + + def set_sos_num(self, event, msg): + self.sos_num = msg + + def get_sos_num(self, event, msg): + return self.sos_num + + def set_dial_sos_number(self, event, msg): + self.sos_numer1 = msg + # print("self.sos_numer1:{}".format(self.sos_numer1)) + + def get_dial_sos_number(self, event, msg): + return self.sos_numer1 + + +class getBootOffManager(Abstract):#开关机时间 + def __init__(self): + self.read_data = {} + self.off_msg = [] + check = ql_fs.path_exists("/ext/static/storage_file/config.json") + + if check == True: + with open("/ext/static/storage_file/config.json","r") as fd: + self.read_data = ujson.load(fd) + if self.read_data != {}: + b1 = str("off_on") in self.read_data.keys() + if b1 == True: + self.off_on = self.read_data["off_on"] + b2 = str("off_start") in self.read_data.keys() + if b2 == True: + self.off_start= self.read_data["off_start"] + + b3 = str("off_end") in self.read_data.keys() + if b3 == True: + self.off_end = self.read_data["off_end"] + + # print("self.sos_numer1:{} self.read_data:{}".format(self.sos_numer1,self.read_data)) + + def post_processor_after_instantiation(self): + EventMesh.subscribe("set_boot_off_time", self.set_boot_off_time)#设置关机时间 + EventMesh.subscribe("get_boot_off_time", self.get_boot_off_time) + + # def _rtc_callback(self,args): + # print("---!!!!!!alarm_ring!!!!!!!---,idx:",args) + + # def set_boot_off_time(self, event, msg): + + # self.off_msg = msg + # if msg[0] == 0: + # return + + # rtc_now_time = self.rtc.datetime() + + # # data = RTC().datetime() + # # hour = data[4] + # # min = data[5] + + + + # current_minute = rtc_now_time[4]*60 + rtc_now_time[5] #当前的分钟数不包含年月日 + # off_msg1 = msg[1] + # off_msg2 = msg[2] + # msg_tmp1 = off_msg1.split(':') + # msg_tmp2 = off_msg2.split(':') + # start_min = msg_tmp1[0]*60+msg_tmp1[1] + # end_min = msg_tmp2[0]*60+msg_tmp2[1] + # #9:00 6:00 + # if current_minute > start_min:#如果当前的分钟数 大于开始的关机时间分钟数 则认为是第二天6:00需要开机 23:00需要关机 + # next_alarm_time = utime.localtime(next_alarm_mktime) + # pass + + + # print("04当前的rtc_total_minutes:{}".format(current_minute)) + + # if current_minute in minute_list: + # print("当前时间和闹钟列表时间重复,删除重复的时间") + # minute_list.remove(current_minute) + + # minute_list.append(current_minute) + + # # 对分钟数列表进行排序,并获取当前时间分钟数所在的位置 + # minute_list = sorted(minute_list) + # current_index = minute_list.index(current_minute) + + # print("05将当前时间插入min_list后的min_list:{}".format(minute_list)) + # print("06当前时间所在位置:{}".format(current_index)) + + # next_index = current_index + 1 + # if next_index >= len(minute_list): + # next_minute = minute_list[0] + # print("07下一个闹钟的分钟数:", next_minute) + # else: + # next_minute = minute_list[next_index] + # print("07下一个闹钟的分钟数:", next_minute) + + # if next_minute >= current_minute: + # interval_minute = next_minute - current_minute + # print("08距离下一次响铃的的分钟数:", interval_minute) + # else: + # interval_minute = end_minute - current_minute + next_minute + # print("08距离下一次响铃的的分钟数:", interval_minute) + + # #反向获取时间戳 + # time = utime.localtime() + # print("09获取utime的时间戳:", time) + # rtc_mktime = utime.mktime(time) + # print("10反向获取utime的mktime:", rtc_mktime) + + # #加上下一次响铃需要的时间 + # next_alarm_mktime = rtc_mktime + interval_minute*60 + # print("11下一次响铃的mktime:", next_alarm_mktime) + + # #格式化时间戳,得到下一次闹钟的时间 + # next_alarm_time = utime.localtime(next_alarm_mktime) + # print("12下一次响铃的准确时间:", next_alarm_time) + # #将时间转换为rtc的格式 + # data_l = [2021, 7, 9, 5, 12, 30, 0, 0] + # #给rtc时间赋值 + # data_l[0] = next_alarm_time[0] #year + # data_l[1] = next_alarm_time[1] #month + # data_l[2] = next_alarm_time[2] #day + # data_l[4] = next_alarm_time[3] #hour + # data_l[5] = next_alarm_time[4] #minute + # #转换为元组 + # data_e=tuple(data_l) + # print("13将该时间转换为RTC元组:", data_e) + + # #设置rtc闹钟时间 + # self.rtc.register_callback(self._rtc_callback) + + # FLAG = self.rtc.set_alarm(data_e) + # if FLAG == 0: + # print("成功设置rtc的到期时间:", data_e) + # else: + # print("设置rtc的到期时间失败:", data_e) + + # self.rtc.enable_alarm(1) + + # def get_boot_off_time(self, event, msg): + # return self.off_msg + \ No newline at end of file