* @param style style of the image object (unused now but certain formats might use it)
* @return pointer to the decoded image or `LV_IMG_DECODER_OPEN_FAIL` if failed
*/
+uint16_t rgb888_to_rgb565(uint8_t r, uint8_t g, uint8_t b) {
+ return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
+}
+
+typedef struct {
+ uint8_t red;
+ uint8_t green;
+ uint8_t blue;
+} _lv_color24_t;
+static void convert_color_depth1(uint8_t * img, uint32_t px_cnt)
+{
+ uint16_t color = 0;
+ int i = 0;
+ _lv_color24_t *img_rgb888 = (_lv_color24_t*)img;
+ for(i = 0; i < px_cnt; i++) {
+ color = rgb888_to_rgb565(img_rgb888[i].red, img_rgb888[i].green, img_rgb888[i].blue);
+ img[i * 3 + 2] = 255;
+ img[i * 3 + 1] = color >> 8;
+ img[i * 3 + 0] = color & 0xFF;
+ }
+}
+
static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc)
{
uint32_t error; /*For the return values of PNG decoder functions*/
uint8_t * img_data = NULL;
+ uint8_t * img_data_cov = NULL;
/*If it's a PNG file...*/
if(dsc->src_type == LV_IMG_SRC_FILE) {
LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error));
return LV_RES_INV;
}
-
/*Convert the image to the system's color depth*/
convert_color_depth(img_data, png_width * png_height);
- dsc->img_data = img_data;
+
+ if(img_data) {
+ img_data_cov = lv_mem_alloc(png_width * png_height * 3);
+ if(img_data_cov) {
+ lv_memcpy(img_data_cov, img_data, png_width * png_height * 3);
+ lv_mem_free(img_data);
+ img_data = NULL;
+ }
+ }
+
+ dsc->img_data = img_data_cov;
return LV_RES_OK; /*The image is fully decoded. Return with its pointer*/
}
}
uint32_t png_height; /*No used, just required by he decoder*/
/*Decode the image in ARGB8888 */
- error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size);
+ error = lodepng_decode24(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size);
if(error) {
return LV_RES_INV;
}
/*Convert the image to the system's color depth*/
- convert_color_depth(img_data, png_width * png_height);
+ //convert_color_depth(img_data, png_width * png_height);
dsc->img_data = img_data;
return LV_RES_OK; /*Return with its pointer*/
#self.__city = None
#self.__location = None
self.timer_push_schedule = osTimer()
+ self.timer_pusht_test = osTimer()
self.usb = USB()
#self.battery_push_schedule = osTimer()
self.check_battery_list = []
print("post_processor_after_instantiation:2")
self.timer_push_schedule.start(10000, 1, self.publish_event)
- # self.timer_push_schedule.start(2000, 1, self.publish_test)
+ # self.timer_pusht_test.start(2000, 1, self.publish_test)
# self.battery_push_schedule.start(3000, 1, self.__check_battery)
self.log.debug("post_processor_after_instantiation finished")
#EventMesh.publish(constants.EVENT.START_HEART)
self.sock.close()
self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
self.sock.connect(("api.xcloudtech.com", 9000))
+ _thread.stack_size(24*1024)
_thread.start_new_thread(self.recv, ())
+ _thread.stack_size(8*1024)
utime.sleep(1)
# 发送数据
EventMesh.publish(constants.PROTOCOL.LK_SEND)
EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网
if(self.sock != None) :
self.sock.close()
+ _thread.stack_size(24*1024)
_thread.start_new_thread(self.reconnect, ()) #重连
+ _thread.stack_size(8*1024)
self.connect_tmp = 0
self.connect()
def send(self, topic, msg):
- print("TCP:send data:{}".format(msg))
+ # print("TCP:send data:{}".format(msg))
self.sock.send(msg)
def recv(self):
self.run_flag = False
if(self.sock != None) :
self.sock.close()
+ _thread.stack_size(24*1024)
_thread.start_new_thread(self.reconnect, ())
+ _thread.stack_size(8*1024)
break
if not r:
self.run_flag = False
if(self.sock != None) :
self.sock.close()
+ _thread.stack_size(24*1024)
_thread.start_new_thread(self.reconnect, ())
+ _thread.stack_size(8*1024)
break
data = data + r
if data[-1] != 0x5d and len(data)<20*1024: #']':
continue
self.connect_tmp = 1 #有数据,就认为是连接状态
- # print("TCP:recv: data:{}".format(data))
+ print("TCP recv: data:len:{}".format(len(data)))
EventMesh.publish(constants.EVENT.SET_CONNECT, 1)
data_str = data.decode('ascii')
data_str = data_str.split(']')
self.location_timer_count = 0
self.location_check_data_timer_count = 0
self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+ self.location_thread_flag = 0
@staticmethod
def get_date():
return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
EventMesh.publish(constants.EVENT.GPSOPEN)
self.location_timer_count = 0
self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+ if self.location_thread_flag == 0:
+ _thread.start_new_thread(self.location_thread, ())
self.wifi_data = []
self.gps_data = []
self.cell_data = []
self.gps.power_switch(0)
wifiScan.control(0)
self.timer_read_GPS_info.stop()
+ self.location_timer_count = 5*60 #让线程结束
+
def WIFI_INFO(self, event, msg):
self.wifi_data = msg
self.location_timer_count = self.location_timer_count +1
self.location_check_data_timer_count = self.location_check_data_timer_count+1
- 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数据
- if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
- EventMesh.publish(constants.EVENT.WIFISCANOPEN)
- #检查GNSS数据
- if self.gps_data == [] and quecgnss.get_state() == 2:
- self.gps.__gps_nmea_data_clean()
- 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(",")
+ def location_thread(self):
+ self.location_thread_flag = 1
+ while True:
+ match_gga_data = []
+ match_gsv_data = []
+
+ if self.location_check_data_timer_count > 3 :#5秒查一次
+ self.location_check_data_timer_count = 0
+ #print(self.location_timer_count)
+ #检查wifi数据
+ if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0:
+ EventMesh.publish(constants.EVENT.WIFISCANOPEN)
+ #检查GNSS数据
+ if self.gps_data == [] and quecgnss.get_state() == 2:
+ self.gps.__gps_nmea_data_clean()
+ data = quecgnss.read(4096)
+ #print(data[1].decode())
+ if data[0] > 0 : #有数据
match_gga_data = self.match.GxGGA(data[1]).split(",")
- data = self.gps.read_coordinates(data[1])
- latitude_tmp = str(data[1]).split(".")
- if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
- latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
- latitude = "%s,%s"%(latitude,match_gmc_data[4] )
- longitude_tmp = str(data[0]).split(".")
- if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
- longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
- longitude = "%s,%s"%(longitude,match_gmc_data[6] ) #match_gmc_data[6] + str(data[1])
- high = str(data[2])
- self.gps_data = {
- "latitude": latitude,
- "longitude": longitude,
- "high": high,
- "direction": match_vtg_data[1],
- "speed": match_vtg_data[5],
- "number": match_gga_data[7],
- }
- #检查基站数据
- if self.cell_data == []:
-
- self.cell_data = net.getCellInfo()
- for cell in self.cell_data:
- if cell and cell[0][0] == 0 :
- self.cell_data = cell
- break
- 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 > 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 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
+ 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(",")
+ match_gga_data = self.match.GxGGA(data[1]).split(",")
+ data = self.gps.read_coordinates(data[1])
+ latitude_tmp = str(data[1]).split(".")
+ if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5:
+ latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6])
+ latitude = "%s,%s"%(latitude,match_gmc_data[4] )
+ longitude_tmp = str(data[0]).split(".")
+ if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5:
+ longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6])
+ longitude = "%s,%s"%(longitude,match_gmc_data[6] ) #match_gmc_data[6] + str(data[1])
+ high = str(data[2])
+ self.gps_data = {
+ "latitude": latitude,
+ "longitude": longitude,
+ "high": high,
+ "direction": match_vtg_data[1],
+ "speed": match_vtg_data[5],
+ "number": match_gga_data[7],
+ }
+ #检查基站数据
+ if self.cell_data == []:
+ self.cell_data = net.getCellInfo()
+ for cell in self.cell_data:
+ if cell and cell[0][0] == 0 :
+ self.cell_data = cell
+ break
+ if self.location_timer_count >= 60*4 : #4分钟关闭线程
+ break
+ 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 > 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)#关闭定位
-
+ EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+ break
+ 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)#关闭定位
+ break
+ utime.sleep_ms(1000)
+ self.location_thread_flag = 0
# class AddrBookManager(Abstract):
MainMenu2_img_alipay = lv.img(MainMenu2_alipay)
MainMenu2_img_alipay.set_size(160,160)
MainMenu2_img_alipay.set_pos(40,20)
-MainMenu2_img_alipay.set_src("E:/static/main_menu/main_menu2/alipay_.png")
+MainMenu2_img_alipay.set_src("U:/static/alipay_.png")
MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_phone = lv.img(MainMenu2_phone)
MainMenu2_img_phone.set_size(160,160)
MainMenu2_img_phone.set_pos(40,20)
-MainMenu2_img_phone.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CALL.png")
+MainMenu2_img_phone.set_src("U:/static/IMAGE_ONE_PAGE_CALL.png")
MainMenu2_img_phone.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_phone.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_contacts = lv.img(MainMenu2_contacts)
MainMenu2_img_contacts.set_size(160,160)
MainMenu2_img_contacts.set_pos(40,20)
-MainMenu2_img_contacts.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_CONTACTS.png")
+MainMenu2_img_contacts.set_src("U:/static/IMAGE_ONE_PAGE_CONTACTS.png")
MainMenu2_img_contacts.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_contacts.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_heartrate = lv.img(MainMenu2_heartrate)
MainMenu2_img_heartrate.set_size(160,160)
MainMenu2_img_heartrate.set_pos(40,20)
-MainMenu2_img_heartrate.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png")
+MainMenu2_img_heartrate.set_src("U:/static/IMAGE_ONE_PAGE_HEART_RATE_HEALTH_DETECT.png")
MainMenu2_img_heartrate.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_heartrate.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_spo2 = lv.img(MainMenu2_spo2)
MainMenu2_img_spo2.set_size(160,160)
MainMenu2_img_spo2.set_pos(40,20)
-MainMenu2_img_spo2.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SPO2_DETECT.png")
+MainMenu2_img_spo2.set_src("U:/static/IMAGE_ONE_PAGE_SPO2_DETECT.png")
MainMenu2_img_spo2.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_spo2.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_toolbox = lv.img(MainMenu2_toolbox)
MainMenu2_img_toolbox.set_size(160,160)
MainMenu2_img_toolbox.set_pos(40,20)
-MainMenu2_img_toolbox.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TOOLS.png")
+MainMenu2_img_toolbox.set_src("U:/static/IMAGE_ONE_PAGE_TOOLS.png")
MainMenu2_img_toolbox.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_setting = lv.img(MainMenu2_setting)
MainMenu2_img_setting.set_size(160,160)
MainMenu2_img_setting.set_pos(40,20)
-MainMenu2_img_setting.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_SETTINGS.png")
+MainMenu2_img_setting.set_src("U:/static/IMAGE_ONE_PAGE_SETTINGS.png")
MainMenu2_img_setting.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_temperature = lv.img(MainMenu2_temperature)
MainMenu2_img_temperature.set_size(160,160)
MainMenu2_img_temperature.set_pos(40,20)
-MainMenu2_img_temperature.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_TEMPERATURE.png")
+MainMenu2_img_temperature.set_src("U:/static/IMAGE_ONE_PAGE_TEMPERATURE.png")
MainMenu2_img_temperature.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_temperature.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
MainMenu2_img_wechat = lv.img(MainMenu2_wechat)
MainMenu2_img_wechat.set_size(160,160)
MainMenu2_img_wechat.set_pos(40,20)
-MainMenu2_img_wechat.set_src("E:/static/main_menu/main_menu2/IMAGE_ONE_PAGE_WECHAT.png")
+MainMenu2_img_wechat.set_src("U:/static/IMAGE_ONE_PAGE_WECHAT.png")
MainMenu2_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE)
MainMenu2_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)