20250103备份
authorp15692025051 <846603105@qq.com>
Fri, 3 Jan 2025 02:01:18 +0000 (10:01 +0800)
committerp15692025051 <846603105@qq.com>
Fri, 3 Jan 2025 02:01:18 +0000 (10:01 +0800)
519 files changed:
2.sdk-ZY/project/K01/sdk/services/microPython/ports/quectel/core/ai.py
2.sdk/Helios_SDK/Makefile
2.sdk/Helios_SDK/compilerules.mk
2.sdk/Helios_SDK/components/GMSSL/include/gmssl/error.h
2.sdk/Helios_SDK/components/GMSSL/src/sm2_alg.c
2.sdk/Helios_SDK/components/audio/audio.mk
2.sdk/Helios_SDK/components/audio/audio_option.in
2.sdk/Helios_SDK/components/audio/helios_audio_amr.c
2.sdk/Helios_SDK/components/audio/helios_audio_amr.h
2.sdk/Helios_SDK/components/audio/helios_audio_montage.c
2.sdk/Helios_SDK/components/audio/helios_audio_montage.h
2.sdk/Helios_SDK/components/audio/helios_audio_mp3.c
2.sdk/Helios_SDK/components/audio/helios_audio_py.c
2.sdk/Helios_SDK/components/audio/helios_audio_py.h
2.sdk/Helios_SDK/components/audio/mp3/mp3_dec/src/api/mp3dec_api.cpp
2.sdk/Helios_SDK/components/fs/fatfs/include/ffconf.h
2.sdk/Helios_SDK/components/fs/fatfs/spi_sdcard_driver.c
2.sdk/Helios_SDK/components/fs/yaffs/src/port/helios_spinand.c
2.sdk/Helios_SDK/components/poc/bnd_xin/inc/broad_xin.h
2.sdk/Helios_SDK/components/poc/bnd_xin/inc/type_bnd_xin.h
2.sdk/Helios_SDK/components/poc/bnd_xin/lib/broad.lib
2.sdk/Helios_SDK/components/poc/poc.c
2.sdk/Helios_SDK/components/poc/poc.h
2.sdk/Helios_SDK/components/poc/poc.mk
2.sdk/Helios_SDK/components/poc/poc_option.in
2.sdk/Helios_SDK/components/poc/qs/inc/poc_interface.h
2.sdk/Helios_SDK/components/poc/qs/inc/ql_poc_qs.h
2.sdk/Helios_SDK/components/poc/qs/src/poc_qs_adaper.c
2.sdk/Helios_SDK/components/poc/slpoc/inc/broad.h
2.sdk/Helios_SDK/components/poc/slpoc/inc/poc_slpoc.h
2.sdk/Helios_SDK/components/poc/slpoc/inc/type.h
2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib
2.sdk/Helios_SDK/components/poc/slpoc/src/modpoc_slpoc.c
2.sdk/Helios_SDK/components/poc/slpoc/src/poc_slpoc.c
2.sdk/Helios_SDK/components/poc/ydwl/inc/poc_ydwl_api.h
2.sdk/Helios_SDK/components/poc/ydwl/src/poc_ydwl_api.c
2.sdk/Helios_SDK/components/poc/zzd/src/poc_zzd_api.c
2.sdk/Helios_SDK/components/quecsdk/driverLayer/qhal_Dev.c
2.sdk/Helios_SDK/components/quecsdk/driverLayer/qhal_FlashOpt.c
2.sdk/Helios_SDK/components/quecsdk/driverLayer/qhal_FlashOpt.h
2.sdk/Helios_SDK/components/quecsdk/driverLayer/qhal_Socket.c
2.sdk/Helios_SDK/components/quecsdk/driverLayer/qhal_property.c
2.sdk/Helios_SDK/components/rtmpdump/librtmp/inc/rtmp_sys.h
2.sdk/Helios_SDK/components/rtmpdump/librtmp/src/rtmp.c
2.sdk/Helios_SDK/config/autoconf.h
2.sdk/Helios_SDK/config/config.in
2.sdk/Helios_SDK/config/config.mk
2.sdk/Helios_SDK/demos/BSP/example_iic.c
2.sdk/Helios_SDK/demos/BSP/example_spi.c
2.sdk/Helios_SDK/demos/BSP/example_timer.c
2.sdk/Helios_SDK/driver/lcd/qpy_lcd.c
2.sdk/Helios_SDK/peripheral/helios_camera.h
2.sdk/Helios_SDK/peripheral/helios_dm9051.h
2.sdk/Helios_SDK/peripheral/helios_flash.h
2.sdk/Helios_SDK/peripheral/helios_lcd.h
2.sdk/Helios_SDK/peripheral/helios_w5500.h
2.sdk/Helios_SDK/peripheral/helios_wlan.h
2.sdk/Helios_SDK/peripheral/helios_wlan5803.h
2.sdk/Helios_SDK/peripheral/helios_yt8512h.h
2.sdk/Helios_SDK/plat.mk
2.sdk/Helios_SDK/services/microPython/config/config.in
2.sdk/Helios_SDK/services/microPython/config/lvgl_option.in
2.sdk/Helios_SDK/services/microPython/extmod/modhash.c
2.sdk/Helios_SDK/services/microPython/extmod/modhash.h
2.sdk/Helios_SDK/services/microPython/extmod/moducryptolib.c
2.sdk/Helios_SDK/services/microPython/extmod/moduhashlib.c
2.sdk/Helios_SDK/services/microPython/extmod/modussl_mbedtls.c
2.sdk/Helios_SDK/services/microPython/extmod/moduwebsocket.c
2.sdk/Helios_SDK/services/microPython/extmod/moduwebsocket.h
2.sdk/Helios_SDK/services/microPython/extmod/moduzlib.c
2.sdk/Helios_SDK/services/microPython/extmod/utime_mphal.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_efs.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_lfs.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_lfsx.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_lfsx_file.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_temp.c
2.sdk/Helios_SDK/services/microPython/extmod/vfs_temp.h
2.sdk/Helios_SDK/services/microPython/extmod/vfs_temp_file.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/benchmark/lv_demo_benchmark.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/benchmark/lv_demo_benchmark.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/keypad_encoder/lv_demo_keypad_encoder.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music_list.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music_list.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music_main.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/music/lv_demo_music_main.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/stress/lv_demo_stress.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/stress/lv_demo_stress.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/widgets/lv_demo_widgets.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/demos/widgets/lv_demo_widgets.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/CHANGELOG.md
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/get-started/platforms/index.md
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/intro/index.md
2.sdk/Helios_SDK/services/microPython/lib/lvgl/docs/porting/display.md
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.lvgl.pdsc
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/LVGL.pidx
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/cmsis-pack/lv_conf_cmsis.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/env_support/rt-thread/squareline/SConscript
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/examples/widgets/tabview/lv_example_tabview_2.py
2.sdk/Helios_SDK/services/microPython/lib/lvgl/freetype-2.11.1/include/freetype/config/ftstdlib.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/library.json
2.sdk/Helios_SDK/services/microPython/lib/lvgl/library.properties
2.sdk/Helios_SDK/services/microPython/lib/lvgl/lv_conf.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/lv_conf_template.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/lvgl.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_indev.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_indev_scroll.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_obj.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_obj.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_obj_style.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_obj_tree.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/core/lv_refr.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/arm2d/lv_gpu_arm2d.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_img.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_label.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_label.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_line.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_line.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_mask.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_mask.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_rect.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_draw_rect.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_img_cache.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/lv_img_decoder.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_blend.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_blend.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_dither.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_dither.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_gradient.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_img.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_letter.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_line.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/draw/sw/lv_draw_sw_rect.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/freetype/lv_freetype.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/libs/fsdrv/lv_fs_helios.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/others/ime/lv_ime_pinyin.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/widgets/chart/lv_chart.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/widgets/imgbtn/lv_imgbtn.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/widgets/tabview/lv_tabview.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/extra/widgets/tabview/lv_tabview.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/font/lv_font_70_bold.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/hal/lv_hal_disp.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/hal/lv_hal_disp.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/hal/lv_hal_indev.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/hal/lv_hal_tick.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/hal/lv_hal_tick.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/lv_conf_kconfig.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_color.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_color.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_math.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_math.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_mem.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_mem.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_timer.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/misc/lv_timer.h
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/widgets/lv_btnmatrix.c
2.sdk/Helios_SDK/services/microPython/lib/lvgl/src/widgets/lv_img.c
2.sdk/Helios_SDK/services/microPython/microPython.mk
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/_boot.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/_boot_RDA.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/aLiYun.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/app_fota.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/app_fota_download.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/app_fota_updater.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/backup_restore.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/bak_util.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/cellLocator.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/dataCall.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ftplib.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ftplibtls.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/motor.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ntptime.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ql_fs.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/request.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_audio.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_queue.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_record.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/audio_tts.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/callbackdeal.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/devreport.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/gccollect.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/locator.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/lpm_wakeup.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_extint.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_hw_spi.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_iic.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_iic_simulation.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_key.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_keypad.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_lcd.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_one_wire.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_pin.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_rtc.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_timer.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/machine_uart.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_adc.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_power.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_powerkey.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_pwm.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_usb.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/misc_usbnet.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modGsensor_SC7A20.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modVideoCall_juphoon.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modatcmd.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modaudio.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modble.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modcan_mcp2515.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modcelllocator_qpy.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modcsd.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/moddatacall.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/moddev.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modethernet.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modethernet_ch395.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modethernet_dm9051.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modethernet_w5500.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modethernet_yt8512h.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modextgpio_aw9523.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modextuart_wk2114.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modfota.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgnss.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlpm.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlvgl.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlwm2m.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modlwm2m_parase.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modmachine.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modmachine.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modmisc.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modnet.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modnetwork.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modpoc.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modrsa.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsensor.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsensor.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsim.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modslipif.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsms.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modsocket.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modtp.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/moduos.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modutime.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modvoicecall.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modwifiscan.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modwlan.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modwlan_ASR5803.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpconfigport.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mphalport.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mphalport.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpthreadport.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpthreadport.h
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/quecpython.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/random.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/sim_esim.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/tp_cst816.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/tp_gt9xx.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/tp_xpt2046.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/umqtt.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/uping.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/uwebsocket.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/wifilocator.py
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/ymodem.py
2.sdk/Helios_SDK/services/microPython/py/builtin.h
2.sdk/Helios_SDK/services/microPython/py/malloc.c
2.sdk/Helios_SDK/services/microPython/py/objfun.c
2.sdk/Helios_SDK/services/microPython/py/objmodule.c
2.sdk/Helios_SDK/services/microPython/py/objstr.c
2.sdk/Helios_SDK/services/microPython/py/runtime.c
2.sdk/Helios_SDK/services/microPython/py/scheduler.c
2.sdk/Helios_SDK/services/microPython/py/stream.c
2.sdk/Helios_SDK/system/at/at.mk
2.sdk/Helios_SDK/system/at/helios_atcmd.h
2.sdk/Helios_SDK/system/bt/helios_btble.h
2.sdk/Helios_SDK/system/debug/helios_debug.h
2.sdk/Helios_SDK/system/dev/helios_dev.h
2.sdk/Helios_SDK/system/esim/helios_esim.h
2.sdk/Helios_SDK/system/fota/helios_fota.h
2.sdk/Helios_SDK/system/fs/helios_fs.h
2.sdk/Helios_SDK/system/fs/helios_python_fs.c
2.sdk/Helios_SDK/system/gnss/helios_gnss.h
2.sdk/Helios_SDK/system/hal/helios_audio.h
2.sdk/Helios_SDK/system/hal/helios_extint.h
2.sdk/Helios_SDK/system/hal/helios_gpio.h
2.sdk/Helios_SDK/system/hal/helios_iic.h
2.sdk/Helios_SDK/system/hal/helios_keypad.h
2.sdk/Helios_SDK/system/hal/helios_lpm.h
2.sdk/Helios_SDK/system/hal/helios_pin.h
2.sdk/Helios_SDK/system/hal/helios_power.h
2.sdk/Helios_SDK/system/hal/helios_pwm.h
2.sdk/Helios_SDK/system/hal/helios_rtc.h
2.sdk/Helios_SDK/system/hal/helios_spi.h
2.sdk/Helios_SDK/system/hal/helios_uart.h
2.sdk/Helios_SDK/system/hal/helios_uart_slip.h
2.sdk/Helios_SDK/system/hal/helios_usb.h
2.sdk/Helios_SDK/system/hal/helios_usbnet.h
2.sdk/Helios_SDK/system/hal/helios_wakeup.h
2.sdk/Helios_SDK/system/lwip/ASR/include/netif.h
2.sdk/Helios_SDK/system/lwip/ASR_1606/include/def.h
2.sdk/Helios_SDK/system/lwip/ASR_1606/include/netdb.h
2.sdk/Helios_SDK/system/lwip/ASR_1606/include/sockets.h
2.sdk/Helios_SDK/system/lwip/ASR_1803s/include/netif.h
2.sdk/Helios_SDK/system/lwip/ASR_1803s/include/slipif.h
2.sdk/Helios_SDK/system/lwip/Qualcomm/include/helios_socket.h
2.sdk/Helios_SDK/system/lwip/RDA/src/include/lwip/sockets.h
2.sdk/Helios_SDK/system/lwip/Unisoc/src/include/lwip/netif.h
2.sdk/Helios_SDK/system/lwip/Unisoc/src/include/lwip/sockets.h
2.sdk/Helios_SDK/system/lwip/Unisoc_8910_R05/src/include/lwip/errno.h
2.sdk/Helios_SDK/system/lwip/Unisoc_8910_R05/src/include/lwip/sockets.h
2.sdk/Helios_SDK/system/mbedtls/include/mbedtls/config.h
2.sdk/Helios_SDK/system/mbedtls/include/mbedtls/platform.h
2.sdk/Helios_SDK/system/mbedtls/library/bignum.c
2.sdk/Helios_SDK/system/mbedtls/library/entropy.c
2.sdk/Helios_SDK/system/mbedtls/library/net_sockets.c
2.sdk/Helios_SDK/system/mbedtls/library/pkparse.c
2.sdk/Helios_SDK/system/mbedtls/library/platform.c
2.sdk/Helios_SDK/system/mbedtls/port/helios/src/mbedtls_init.c
2.sdk/Helios_SDK/system/mbedtls/port/helios/src/timing_alt.c
2.sdk/Helios_SDK/system/network/helios_datacall.h
2.sdk/Helios_SDK/system/network/helios_lwm2m.h
2.sdk/Helios_SDK/system/network/helios_nw.h
2.sdk/Helios_SDK/system/network/helios_sim.h
2.sdk/Helios_SDK/system/network/helios_sms.h
2.sdk/Helios_SDK/system/network/helios_voicecall.h
2.sdk/Helios_SDK/system/os/helios_os.h
2.sdk/Helios_SDK/system/os/os.mk
2.sdk/Helios_SDK/system/startup/helios_startup.c
2.sdk/Helios_SDK/system/startup/helios_startup.h
2.sdk/Helios_SDK/system/system.mk
2.sdk/project/7PIN/audio/IMEIhao.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/Low_power_warning.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_CHARGE_FULL.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_CHARGE_IN.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_CHARGE_OUT.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_0.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_1.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_2.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_3.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_4.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_5.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_6.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_7.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_8.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_9.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_A.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_B.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_C.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_D.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_E.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_F.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_G.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_H.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_I.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_J.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_K.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_L.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_M.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_N.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_O.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_P.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_Q.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_R.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_S.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_T.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_U.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_V.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_W.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_X.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_Y.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/R_READ_TIME_Z.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/jianquancuowu.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/key_prompt.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/liuliangtishi.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/shouhou.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/xinhaoruo1.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/audio/zhengzaiguanji.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/list.json [new file with mode: 0644]
2.sdk/project/7PIN/merge_bin.py [new file with mode: 0644]
2.sdk/project/7PIN/new.bat [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/EventMesh.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/Makefile [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/TTS音频生成.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_7PIN.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_G15.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_t.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_gain.nvm [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_ve.nvm [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/config.json [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/constants.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led_d15.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_1.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_init.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr_d15.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/motor.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/protocol.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/sleep_test.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tesr.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ui.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py [new file with mode: 0644]
2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/test.mp3 [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib [new file with mode: 0644]
2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib [new file with mode: 0644]
2.sdk/project/7PIN/usr/audio_gain.nvm [new file with mode: 0644]
2.sdk/project/7PIN/usr/audio_ve.nvm [new file with mode: 0644]
2.sdk/project/7PIN/usr/main.py [new file with mode: 0644]
2.sdk/project/7PIN/usr/static/audio.bin [new file with mode: 0644]
2.sdk/project/7PIN/usr/static/storage_file/wechat_record.json [new file with mode: 0644]
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/D10/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
2.sdk/project/K01/new.bat
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/EventMesh.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/alarm.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/appWechat.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/calculator.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/constants.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/lcd.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/main_init.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/pp_main.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/protocol.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/ui_main_menu.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/ui_setting.py
2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
2.sdk/project/K01/usr/static/IMAGE_APP_QR_CODE.png
2.sdk/project/K01/usr/static/R_CALL_mp3.mp3
2.sdk/project/K01/usr/static/setting_poweroff_bg.png
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ai.py
2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
2.sdk/project/W8/ext/static/DIAL_PREV01.png
2.sdk/project/W8/ext/static/DIAL_PREV02.png
2.sdk/project/W8/ext/static/bg.png
2.sdk/project/W8/images/customer_fs.bin
2.sdk/project/W8/images/ext_fs.bin
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ai.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/appAlipay.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/capacitive_hynitron_cst816d_update.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/main_init.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/ui_main_menu.py
2.sdk/project/W8/sdk/services/microPython/ports/quectel/core/versions.py
2.sdk/project/W8/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/config/mpconfigboard.h
2.sdk/project/W8/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip
2.sdk/project/W8/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/include/app_link_start_addr.h

index f932016..32ae864 100644 (file)
@@ -1790,6 +1790,25 @@ class AIScreen(Screen):#AI_GUI
         return sign_data
 #####################################################
     #AI识别链路
+    {
+        "header": {
+        "namespace": "VoiceChat",
+        "name": "Start",
+        "appkey": "appkey",
+        "message_id":"d2a2987e2f8a4ed7464d9593",
+        "task_id": "b39398c9dd8147:35cdea81f7"
+        },
+        "payload": {
+            "user_agent": "python", 
+            "device_id": "test_device_id", 
+            "dialog_attributes": {
+                "model_id": "qwen-plus",
+                "prompt": "你是一个有用的语音助手",
+                "voice": "longxiaochun"
+                }
+        }
+    }
+
     def websocket_connect_chat(self):
         print("websocket_connect_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_chat_isconnect))
         #if self.AI_client_chat_isconnect == 0:
index 6449b46..5de35b1 100644 (file)
@@ -252,6 +252,7 @@ export TARGET_BIN = $(OUTPUT_BIN_PATH)/$(FW_NAME).bin
 export TARGET_HEX = $(OUTPUT_BIN_PATH)/$(FW_NAME).hex
 export TARGET_ELF = $(OUTPUT_BIN_PATH)/$(FW_NAME).elf
 export TARGET_MAP = $(OUTPUT_BIN_PATH)/$(FW_NAME).map
+export TARGET_SIZE = $(OUTPUT_BIN_PATH)/$(FW_NAME).size
 
 
 
@@ -370,7 +371,23 @@ $(OUTPUT_PLAT_PRIVATE_CFG_FILE): $(PLAT_PRIVATE_CFG_FILE)
        @echo ----- $@ updated
 
 end: $(OUTPUT_PLAT_PRIVATE_CFG_FILE)
+ifneq ($(PLAT),aic8800m40)
        @make --no-print-directory -f $(PLAT_PRIVATE_MK_FILE)
+endif
+ifeq ($(PLAT),aic8800m40)
+       cp system/platform/aic8800m40/boards/FCM362K/bin/AIC8800M40_*.bin output/bin
+       py_dir=system/platform/aic8800m40/scripts
+       ./merge.sh system/platform/aic8800m40/scripts $(OUTPUT_BIN_PATH) $(FW_NAME) FCM362K $(FW_NAME)
+       rm -rf output/release/bin
+       rm -rf output/release/DBG
+       mkdir output/release/bin
+       mkdir output/release/DBG
+       cp output/bin/AIC8800M40_*.bin output/release/bin
+       cp output/bin/$(FW_NAME).elf output/release/DBG
+       cp output/bin/$(FW_NAME).hex output/release/DBG
+       cp output/bin/$(FW_NAME).map output/release/DBG
+
+endif
        @echo we have building done.>$(OUTPUT_TMP_PATH)/$(BUILD_SUCESS_FILE)
        @echo
        @echo ====================================================
@@ -403,13 +420,73 @@ clean: private_clean common_clean
 #                                                               #
 #################################################################
 
+# If in CMD environment
+ifeq ($(findstring cmd.exe,$(COMSPEC)),cmd.exe)
+# Get helios version
+HELIOS_VERSION := $(shell cmd /c get_helios_version.bat)
+# Define a macro to check if a string represents a number
+define is_number
+$(shell cmd /c check_number.bat $1)
+endef
+
+# Else, in BASH environment
+else
+
+# Get helios version
+ifeq ($(shell type -P helios),)
+    HELIOS_VERSION :=
+else
+    HELIOS_VERSION := $(shell helios --version | grep -Po 'Helios \(released by Quectel\) \K[^\s]+')
+endif
+# Define a macro to check if a string represents a number
+define is_number
+$(shell echo "$1" | grep -q '^[0-9]\+$' && echo "true" || echo "false")
+endef
+
+endif
+
+# Check if HELIOS_VERSION is empty or not
+ifeq ($(HELIOS_VERSION),)
+    IS_NEWER_THAN_1_4_1 := false
+else ifeq ($(HELIOS_VERSION),1.4.1)
+    IS_NEWER_THAN_1_4_1 := true
+else
+    # Split the version into parts
+    HELIOS_VERSION_PARTS := $(subst ., ,$(HELIOS_VERSION))
+    # Check if major, minor, and patch are numbers
+    IS_MAJOR_NUMBER := $(call is_number,$(word 1,$(HELIOS_VERSION_PARTS)))
+    IS_MINOR_NUMBER := $(call is_number,$(word 2,$(HELIOS_VERSION_PARTS)))
+    IS_PATCH_NUMBER := $(call is_number,$(word 3,$(HELIOS_VERSION_PARTS)))
+
+    # If any part is not a number, report an error
+    ifneq ($(IS_MAJOR_NUMBER)$(IS_MINOR_NUMBER)$(IS_PATCH_NUMBER),truetruetrue)
+        $(error "Unexpected version format: $(HELIOS_VERSION)")
+    else
+        # Compare the version with 1.4.1
+        IS_NEWER_THAN_1_4_1 := $(shell echo "$(HELIOS_VERSION)" | awk -F. '{if ($$1 > 1 || ($$1 == 1 && $$2 >= 4 && $$3 >= 1)) print "true"; else print "false"}')
+    endif
+endif
+
 export KCONFIG_CONFIG = config.mk
 export KCONFIG_AUTOHEADER = autoconf.h
+
+# If the version number of helios is >= 1.4.1.
+ifeq ($(IS_NEWER_THAN_1_4_1),true)
+export KCONFIG_ENTRY = config.in
+# Else
+else
 export KCONFIG_INCLUDE_DIR = include/config
 export MENUCONFIG_CMD_PATH = ../tools/common/$(strip $(HOST))/menuconfig/bin/
 ifeq ($(strip $(HOST)),win32)
 WIN32_CLEANUP = && make --no-print-directory -f cleanup.mk
 WIN32_BASH = git-bash
 endif
+
+endif
+
 menuconfig:
-       @cd config/ && mkdir -p $(KCONFIG_INCLUDE_DIR) && $(WIN32_BASH) ./menuconfig.sh $(WIN32_CLEANUP)
+       @if [ "$(IS_NEWER_THAN_1_4_1)" = "true" ]; then \
+               cd config/ && $(PY) -c "from kconfiglib import Kconfig;from menuconfig import menuconfig;kconf=Kconfig(filename=\"$(KCONFIG_ENTRY)\");menuconfig(kconf);kconf.write_autoconf();"; \
+       else \
+               cd config/ && mkdir -p $(KCONFIG_INCLUDE_DIR) && $(WIN32_BASH) ./menuconfig.sh $(WIN32_CLEANUP); \
+       fi
index 486e152..77858b2 100644 (file)
@@ -19,20 +19,28 @@ make_dep_fnc = $(OUTPUT_OBJ_PATH)/$(strip $(1)).d
 COMP_MK = $(call make_mk_fnc,$(COMP_PATH))
 include $(COMP_MK)
 
-OBJECTS := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS))), $(call make_obj_fnc, $(n)))
-DEPENDS := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS))), $(call make_dep_fnc, $(n)))
-OBJECTS += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_2))), $(call make_obj_fnc, $(n)))
-DEPENDS += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_2))), $(call make_dep_fnc, $(n)))
-OBJECTS += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_3))), $(call make_obj_fnc, $(n)))
-DEPENDS += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_3))), $(call make_dep_fnc, $(n)))
-ARCHIVE := $(OUTPUT_OBJ_PATH)/$(COMP_PATH)/lib$(notdir $(COMP_PATH)).a
+OBJECTS_1 := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS))), $(call make_obj_fnc, $(n)))
+DEPENDS   := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS))), $(call make_dep_fnc, $(n)))
+OBJECTS_2 := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_2))), $(call make_obj_fnc, $(n)))
+DEPENDS   += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_2))), $(call make_dep_fnc, $(n)))
+OBJECTS_3 := $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_3))), $(call make_obj_fnc, $(n)))
+DEPENDS   += $(foreach n, $(addprefix $(COMP_PATH)/,$(strip $($(NAME)_SRCS_3))), $(call make_dep_fnc, $(n)))
+ARCHIVE   := $(OUTPUT_OBJ_PATH)/$(COMP_PATH)/lib$(notdir $(COMP_PATH)).a
 
-$(ARCHIVE): $(OBJECTS)
+$(ARCHIVE): $(OBJECTS_1) $(OBJECTS_2) $(OBJECTS_3)
        @echo ----- archiving $@
        @-rm -f $@
-       $(Q)$(AR) -rc $@ $^
+ifneq ($(strip $(OBJECTS_1)),)
+       $(Q)$(AR) -rc $@ $(OBJECTS_1)
+endif
+ifneq ($(strip $(OBJECTS_2)),)
+       $(Q)$(AR) -rc $@ $(OBJECTS_2)
+endif
+ifneq ($(strip $(OBJECTS_3)),)
+       $(Q)$(AR) -rc $@ $(OBJECTS_3)
+endif
 
-$(OBJECTS):$(OUTPUT_OBJ_PATH)/%.o:%
+$(OBJECTS_1) $(OBJECTS_2) $(OBJECTS_3):$(OUTPUT_OBJ_PATH)/%.o:%
        @echo ----- compiling $<
        @mkdir -p $(OUTPUT_OBJ_PATH)/$(dir $<)
        $(Q)$(cc) $($(NAME)_CFLAGS) -c $< $(foreach i, $(COMP_IFLAGS) $(IFLAGS), -I$(i)) $(foreach d, $(DFLAGS) $(COMP_DFLAGS), -D$(d)) -o $@ -MMD -MF $(OUTPUT_OBJ_PATH)/$<.d.tmp -MP || (rm -f $(ARCHIVE); exit 1)
index e55a579..46c3c36 100644 (file)
@@ -35,19 +35,19 @@ extern "C" {
 
 /*#define warning_print() \
        do { if (DEBUG) fprintf(stderr, "%s:%d:%s():\n",__FILE__, __LINE__, __func__); } while (0)*/
-#define warning_print() custom_log(stderr, "%s:%d:%s():\n",__FILE__, __LINE__, __func__)
+#define warning_print() custom_log(stderr, "[GMSSL], %s:%d:%s():\n",__FILE__, __LINE__, __func__)
 
 /*#define error_print() \
        do { if (DEBUG) fprintf(stderr, "%s:%d:%s():\n",__FILE__, __LINE__, __func__); } while (0)*/
-#define error_print() custom_log(stderr, "%s:%d:%s():\n", __FILE__, __LINE__, __func__)
+#define error_print() custom_log(stderr, "[GMSSL], %s:%d:%s():\n", __FILE__, __LINE__, __func__)
 
 /*#define error_print_msg(fmt, ...) \
        do { if (DEBUG) fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, __LINE__, __func__, __VA_ARGS__); } while (0)*/
-#define error_print_msg(fmt, ...) custom_log(stderr, "%s:%d:%s():\n", __FILE__, __LINE__, __func__, __VA_ARGS__)
+#define error_print_msg(fmt, ...) custom_log(stderr, "[GMSSL], %s:%d:%s():\n", __FILE__, __LINE__, __func__, __VA_ARGS__)
 
 /*#define error_puts(str) \
             do { if (DEBUG) fprintf(stderr, "%s: %d: %s: %s", __FILE__, __LINE__, __func__, str); } while (0)*/
-#define error_puts(str) custom_log(stderr, "%s: %d: %s: %s", __FILE__, __LINE__, __func__, str)
+#define error_puts(str) custom_log(stderr, "[GMSSL], %s: %d: %s: %s", __FILE__, __LINE__, __func__, str)
 
 
 void print_der(const uint8_t *in, size_t inlen);
index dbc0565..348fc36 100644 (file)
@@ -321,7 +321,7 @@ void sm2_bn_sub(SM2_BN ret, const SM2_BN a, const SM2_BN b)
 }
 
 #define RAND_MAX_BUF_SIZE 256 // requirement of getentropy()
-
+extern uint32_t qpy_rng_get(void);
 int rand_bytes(uint8_t *buf, size_t len)
 {
     int i;
@@ -333,9 +333,10 @@ int rand_bytes(uint8_t *buf, size_t len)
                error_print();
                return -1;
        }
-       srand(time(NULL));
+       //srand(time(NULL));
     for (i = 0; i < len; i++) {
-        buf[i] = rand() % 256;
+        //buf[i] = rand() % 256;
+        buf[i] = qpy_rng_get() % 256;
     }
        return 1;
 }
index 6c70c7a..4cd1623 100644 (file)
@@ -26,6 +26,12 @@ $(NAME)_SRCS += \
        G711/g711.c
 endif
 
+ifeq ($(CONFIG_AUDIO_G722_COMPRESS), y)
+$(NAME)_SRCS += \
+       G722/g722_decode.c \
+       G722/g722_encode.c
+endif
+
 ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)
 $(NAME)_SRCS += \
        G729/src/adaptativeCodebookSearch.c \
@@ -180,6 +186,11 @@ GLOBAL_INCS += \
        G711
 endif
 
+ifeq ($(CONFIG_AUDIO_G722_COMPRESS), y)
+GLOBAL_INCS += \
+       G722
+endif
+
 ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)
 GLOBAL_INCS += \
        G729 \
@@ -277,7 +288,8 @@ $(NAME)_SRCS += \
        
 endif
 
-ifeq ($(CONFIG_AUDIO_RECORD_AMRNB), y)
+result3 := $(sort $(filter y,$(CONFIG_POC_QS_R07) $(CONFIG_AUDIO_RECORD_AMRNB)))
+ifeq ($(result3), y)
 $(NAME)_SRCS += \
        amr/amrnb/enc/src/amrencode.cpp    \
        amr/amrnb/enc/src/autocorr.cpp    \
index 3134f6b..8543bf1 100644 (file)
@@ -65,6 +65,12 @@ config AUDIO_G729_COMPRESS
 help 
     Enable G729(BGG729) compression function.
 
+config AUDIO_G722_COMPRESS
+    bool "Enable G722 compression"
+    default n
+help 
+    Enable G722 compression function.
+
 config AUD_RECORD 
     bool "Enable Audio Record" 
     default n 
index d44622e..c90d690 100644 (file)
 #include "sp_dec.h"
 #include "helios_audio_amr.h"
 
+#if defined(CONFIG_POC_QS_R07)
+#include "amrnb_enc_api.h"
+
+amrnb_enc_config amr_enc_config = { 0 };
+amrnb_enc_handle amr_enc_handle = 0;
+static int helios_amr_record_dtx_enable = 0;
+#endif
 /*==========================================================*/
 /*                  ql amr interfaces start                 */
 /*==========================================================*/
@@ -43,9 +50,10 @@ cb_on_player aud_play_cb = NULL;
 static bool _audio_play_state = 0;
 
 
-#if (defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-    ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
+#if (defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
+    ||defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)|| defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) || defined(PLAT_ASR_1609) || defined(BOARD_EC800MCN_LF_CCG)) \
+       || defined(BOARD_EC600MCN_LF_SPISD)
 
 #define USR_HELIOS_AUDIO 1
 
@@ -111,15 +119,21 @@ static int amr_vm_deinit(void)
 }
 
 
-#if defined(PLAT_ASR_1803s)    || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-    || defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-     || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
+#ifdef USR_HELIOS_AUDIO
 static void __pcm_play_cb(void *handle, int event){
        AUDLOGE("__pcm_play_cb event[%d]\n",event);
 
        
-       if(event == HELIOS_AUD_PLAYER_NODATA_STRAT || event == HELIOS_AUD_PLAYER_FINISHED || event == HELIOS_AUD_PLAYER_CLOSE || event == HELIOS_AUD_PLAYER_REQURST_CLOSE) {
-               if(g_arm_stream_cxt.pcm_whdl){
+       if(event == HELIOS_AUD_PLAYER_NODATA_STRAT 
+       || event == HELIOS_AUD_PLAYER_FINISHED 
+       || event == HELIOS_AUD_PLAYER_CLOSE 
+#if 0//ifdef BOARD_EC800MCN_LF_CCG
+       || ((event == HELIOS_AUD_PLAYER_REQURST_CLOSE) && (helios_stream_init_flag == HELIOS_NOT_INITED))) // elian.wang 2024.02.23 博大项目流播音频时音频数据播放结束之后不关闭codec 
+#else 
+       || event == HELIOS_AUD_PLAYER_REQURST_CLOSE)
+#endif
+       {
+               if(g_arm_stream_cxt.pcm_whdl) {
                        Helios_PCM_Close(g_arm_stream_cxt.pcm_whdl);
                        g_arm_stream_cxt.pcm_whdl = NULL;
                }
@@ -203,9 +217,7 @@ static void amr_dec_task(void *arg)
                {
                        if (aud_play_cb)
                        {
-#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-        ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-        || defined(BOARD_EC800KCN_CC_TTS)) || defined(BOARD_EC600KCN_CC_TTS)
+#ifndef USR_HELIOS_AUDIO
                                aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_START);
 #endif
                        }
@@ -297,18 +309,21 @@ static void amr_dec_task(void *arg)
                        }
                }
                AUDLOGI("amr_dec_task stop\n");
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
+               if (g_arm_stream_cxt.is_playing == 0) {
+                       Helios_PCM_buffer_Reset(g_arm_stream_cxt.pcm_whdl);
+               }
+#endif
                Helios_Mutex_Lock(g_arm_stream_cxt.playflag_mux, HELIOS_WAIT_FOREVER);
                Helios_msleep(32);
 #ifdef CONFIG_AUDIO_PWM
                Helios_Aud_PWM_Close(g_arm_stream_cxt.pcm_whdl);
 #else
-#if defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                void Helios_aud_data_done(void);
                Helios_aud_data_done();
 #endif
-#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-            ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-            || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
+#ifndef USR_HELIOS_AUDIO
                Helios_PCM_Close(g_arm_stream_cxt.pcm_whdl);
                g_arm_stream_cxt.pcm_whdl = NULL;
 #endif
@@ -321,11 +336,11 @@ static void amr_dec_task(void *arg)
                }
                if (is_amr == 0)
                {
+                       // avoid twice audio callback
+                       is_amr = -1;
                        if (aud_play_cb)
                        {
-#if !(defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-    ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
+#ifndef USR_HELIOS_AUDIO
                                aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_FINISHED);
 #endif
                        }
@@ -378,7 +393,7 @@ static int arm_dec_task_init()
        Helios_ThreadAttr attr = {0};
        attr.name = "amr_dec_task";
        attr.stack_size = 1024 * 6;
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
        attr.priority = 90;
 #else
        attr.priority = 75;
@@ -469,14 +484,13 @@ int helios_amr_stream_write(void *data, unsigned int count)
        }
 
 #ifdef USR_HELIOS_AUDIO        
-       while(_audio_play_state == 1 && g_arm_stream_cxt.pcm_whdl == NULL && _count-- > 1){
+       while(_audio_play_state == 1 && g_arm_stream_cxt.pcm_whdl == NULL && _count-- > 1) {
                AUDLOGE("audio is playing, waiting[%d]...\n",_count);
                Helios_msleep(20);
        }
 #endif
 
        Helios_Mutex_Lock(g_arm_stream_cxt.playflag_mux, HELIOS_WAIT_FOREVER);
-
        g_arm_stream_cxt.is_playing = true;
        Helios_Mutex_Unlock(g_arm_stream_cxt.playflag_mux);
 
@@ -520,6 +534,7 @@ int helios_amr_stream_write(void *data, unsigned int count)
 }
 int helios_amr_stream_close()
 {
+       AUDLOGD("helios_amr_stream_close !!!\n");
        if (!g_arm_stream_cxt.is_playing)
        {
                AUDLOGE("helios_amr_stream_close error, is not playing\n");
@@ -609,7 +624,6 @@ int helios_amr_file_start(char *file_name, cb_on_player aud_cb)
                Helios_Aud_fclose(g_amr_file_cxt.fd);
                return -1;
        }
-
        g_amr_file_cxt.is_playing = true;
 
        helios_amr_stream_open();
@@ -680,3 +694,66 @@ int helios_amr_set_callback(cb_on_player aud_cb)
        aud_play_cb = aud_cb;
        return 0;
 }
+
+#if defined(CONFIG_POC_QS_R07)
+int helios_amrnbenc_init(unsigned int mode, unsigned int format)
+{
+       int ret = 0;
+       if(amr_enc_handle){
+               AUDLOGE("amrnb encode is opening !\n");
+               return -1;
+       }
+       amr_enc_config.mode = mode;
+       amr_enc_config.output_format = format;
+       amr_enc_config.dtx_mode = helios_amr_record_dtx_enable;
+       ret = amrnb_encode_open(&amr_enc_config, &amr_enc_handle);
+       if(ret < 0){
+               AUDLOGE("amrnb encode open failed !\n");
+               return -1;
+       }
+       return 0;
+}
+
+int helios_amrnbenc_do(unsigned char *input_buff, unsigned char *output_buff)
+{
+       int ret = 0, output_size = 0;
+       
+       if(amr_enc_handle == 0){
+               return -1;
+       }
+       ret = amrnb_encode_set(amr_enc_handle, input_buff, 320);
+       if(ret < 0){
+               AUDLOGE("amrnb encode set error !\n");
+               return -2;
+       }
+       ret = amrnb_encode_do(amr_enc_handle);
+       if (ret != 0){
+               AUDLOGE("amrnb encode error \n");
+               return -3;
+       }
+       ret = amrnb_encode_get(amr_enc_handle, output_buff, &output_size);
+       if(ret < 0){
+               AUDLOGE("amrnb encode get error !\n");
+               return -4;
+       }
+
+       return output_size;
+}
+
+int helios_amrnbenc_deinit(void)
+{
+       int ret = 0;
+       if(!amr_enc_handle){
+               AUDLOGE("amrnb encode is not open !\n");
+               return -1;
+       }
+       ret = amrnb_encode_close(amr_enc_handle);
+       if(ret < 0){
+               AUDLOGE("amrnb encode close failed !\n");
+               return -1;
+       }
+       amr_enc_handle = 0;
+       return 0;
+}
+#endif
+
index df6a6c3..398d970 100644 (file)
@@ -17,5 +17,9 @@ int helios_amr_file_end();
 
 int helios_amr_set_callback(cb_on_player aud_cb);
 
+int helios_amrnbenc_init(unsigned int mode, unsigned int format);
 
+int helios_amrnbenc_do(unsigned char *input_buff, unsigned char *output_buff);
+
+int helios_amrnbenc_deinit(void);
 #endif
index 99f3094..e68c116 100644 (file)
@@ -100,7 +100,7 @@ static char __Get_idle_preprocessing_array()
     return ret;
 }
 
-// 预处理过ç¨?
+// 预处理过�?
 static char __montage_file_preprocessing(char *montage_name)
 {
     char montage_buf[MONTAGE_FLAGE_LEN + 1] = {0};
@@ -313,11 +313,16 @@ static void audio_file_list_destroy(struct audio_file_list *head)
     } while (head->next != NULL);
 }
 
-void helios_audio_montage_stop()
-{
-    montage_is_break = 1;
+int helios_set_montage_break_flag(char set){
+       if(set == 1 || set == 0)
+       {
+               montage_is_break = set;
+               return 0;
+       }
+       return -1;
 }
 
+
 static int helios_audio_play_morefiles(montage_play_elem *play_elem)
 {
     struct audio_file_list list_head = {.next = NULL};
@@ -658,7 +663,7 @@ int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helio
     {
         attr.name = "audio_montage_play";
         attr.stack_size = 1024*2;
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
        attr.priority = 90;
 #else
        attr.priority = 74;
index 28c39a5..a7c17b3 100644 (file)
@@ -36,7 +36,5 @@ enum
 };
 
 int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, uint8_t device);
-
-void helios_audio_montage_stop();
-
+int helios_set_montage_break_flag(char set);
 #endif
index d719361..fad2cdd 100644 (file)
@@ -22,9 +22,10 @@ static bool _audio_play_state = 0;
 static bool _mp3_stream_change_rate = false;
 
 
-#if (defined(PLAT_ASR_1803s) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
-    ||defined(PLAT_Unisoc_8850) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
-    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
+#if (defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) \
+    ||defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)|| defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) || defined(PLAT_ASR_1609) || defined(BOARD_EC800MCN_LF_CCG)) \
+       || defined(BOARD_EC600MCN_LF_SPISD)
 
 #define USR_HELIOS_AUDIO 1
 
@@ -43,6 +44,7 @@ typedef struct Helios_ring_buf_struct
 } Helios_ring_buf_t;
 
 Helios_ring_buf_t *Helios_ring_buf = NULL;
+Helios_ring_buf_t *pcm_ring_buf = NULL;
 
 static Helios_Mutex_t Helios_mp3_read_mutex = 0;
 static int open_flag = 1;
@@ -606,10 +608,6 @@ static int get_mp3_frame(void *buffer, uint32_t *size)
                        {
                                return -3;
                        }
-
-                       // status = Helios_Semaphore_Acquire(Helios_ring_buf->rcond, HELIOS_WAIT_FOREVER);
-                       ////assert(status == 0);
-                       //                      return -2;
                }
                else
                {
@@ -655,10 +653,7 @@ int Helios_mp3_get_cache_size()
 #define Helios_PCM_TASK_MASK (Helios_PCM_STOP | Helios_PCM_TASK_CONTINUE)
 
 #define PCM_PINGPANG_BUF_LEN 4608
-
 static Helios_OSFlag_t dec_pcm_flag_Ref;
-static unsigned short dec_pcm_pingpong_buffer[PCM_PINGPANG_BUF_LEN * 2] = {0}; // two frame
-static unsigned short pMp3_OutputBuf[PCM_PINGPANG_BUF_LEN] = {0};
 
 void Helios_wait(void)
 {
@@ -768,9 +763,10 @@ int Helios_mp3_dec(void)
        int is_silence = 0;
        char is_mutex = 0;
        char _change_tmp = 1;
+       int pcm_frame_len = 320;
 
        buff = (unsigned char *)malloc(1024*2);
-       Helios_pcm_outbuf = (unsigned short *)malloc(4608*2);
+       Helios_pcm_outbuf = (unsigned short *)malloc(PCM_PINGPANG_BUF_LEN*2);
        if(!buff || !Helios_pcm_outbuf){
                if(buff) free(buff);
                if(Helios_pcm_outbuf) free(Helios_pcm_outbuf);
@@ -865,14 +861,10 @@ int Helios_mp3_dec(void)
                }
                
                length = ql_decode_start(buff, Helios_pcm_outbuf, bytesRead);
-
+               
                AUDLOGD("Helios_decode_start decode output length = %d\n", length);
                if (length <= 0)
                {
-                       // if(aud_play_cb)
-                       //{
-                       //              aud_play_cb(NULL, 0, HELIOS_AUD_PLAYER_ERROR);
-                       // }
                        AUDLOGE("Helios_decode_start failed length = %d\n", length);
                        Helios_Semaphore_Poll(Helios_ring_buf->wcond, &ret);
                        if (ret == 0)
@@ -893,8 +885,15 @@ int Helios_mp3_dec(void)
                        __jump_cnt --;
                        continue;
                }
-
                
+               // 使用ringbuffer 缓存,保证pcm底层数据发送是完整一帧(320 or 640 or other)
+               pcm_frame_len = mp3_sample_rate * sizeof(int16_t) * 20 / 1000;
+               Helios_rb_write(pcm_ring_buf, Helios_pcm_outbuf, length);
+               length = Helios_rb_data_space(pcm_ring_buf);
+               AUDLOGD("pcm_ring_buf data len:%d !!!\n", length);
+               length = length / pcm_frame_len * pcm_frame_len;
+               length = Helios_rb_read(pcm_ring_buf, Helios_pcm_outbuf, length);
+               AUDLOGD("Helios_rb_read len : %d\n", length);
 
                rc = Helios_play_stream_start(Helios_config.samplerate, Helios_config.channels, Helios_pcm_outbuf, length);
                
@@ -905,10 +904,16 @@ int Helios_mp3_dec(void)
                        break;
                }
                Helios_wait();
-               AUDLOGI("Helios_aud_stop_play_flag[%d]\n", Helios_aud_stop_play_flag);
                if (Helios_aud_stop_play_flag)
                {
-                       // Helios_aud_stop_play_flag = 0;
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
+                       Helios_PCM_buffer_Reset(mp3_pcm_whdl);
+#endif
+
+#if defined(PLAT_ASR_1609) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1602)
+                       Helios_PCM_Close(mp3_pcm_whdl); // pcm close提前调用,此时底层pcm有缓存数据,停止播音会进行缓降,降低pop音。
+                       mp3_pcm_whdl = NULL;
+#endif
                        ret = -1;
                        break;
                }
@@ -924,7 +929,7 @@ int Helios_mp3_dec(void)
                Helios_PCM_Close(mp3_pcm_whdl);
                mp3_pcm_whdl = NULL;
 #endif
-#if defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                void Helios_aud_data_done(void);
                Helios_aud_data_done();
 #endif
@@ -934,8 +939,6 @@ int Helios_mp3_dec(void)
 
        if (0 == rc)
        {
-               // Helios_pcm_stop();
-
                if (aud_play_cb)
                {
 #ifndef USR_HELIOS_AUDIO
@@ -944,11 +947,12 @@ int Helios_mp3_dec(void)
                }
        }
 
-       
-
-
        free(buff);
        free(Helios_pcm_outbuf);
+       // add by elian.wang @202240516 
+       // 增加清理mp3解码缓存,解决当音频文件未播放完成stop,再次播放mp3文件会解码出错误pcm数据
+       ql_release();
+
        if (ret == -1)
        {
                Helios_Semaphore_Poll(Helios_mp3_stop_sema, &ret);
@@ -960,6 +964,7 @@ int Helios_mp3_dec(void)
        Helios_aud_stop_play_flag = 1;
        Helios_Mutex_Lock(Helios_mp3_read_mutex, HELIOS_WAIT_FOREVER);
        Helios_rb_init(Helios_ring_buf);
+       Helios_rb_init(pcm_ring_buf);
        Helios_Mutex_Unlock(Helios_mp3_read_mutex);
        return ret;
 }
@@ -974,7 +979,6 @@ int Helios_mp3_stream_play(void)
        {
                is_mp3_playing = 0;
                status = Helios_Semaphore_Acquire(Helios_mp3_Sema, HELIOS_WAIT_FOREVER);
-               ////assert(status == OS_SUCCESS);
 
                Helios_Mutex_Lock(Helios_mp3_read_mutex, HELIOS_WAIT_FOREVER);
                Helios_rb_init(Helios_ring_buf);
@@ -1002,6 +1006,12 @@ int Helios_mp3_stream_play(void)
                Helios_ring_buf = NULL;
        }
        Helios_Mutex_Unlock(Helios_mp3_read_mutex);
+
+       if (pcm_ring_buf)
+       {
+               free(pcm_ring_buf);
+               pcm_ring_buf = NULL;
+       }
        return 0;
 }
 
@@ -1009,7 +1019,7 @@ void Helios_mp3_stream_dec_task_init(void)
 {
        static int inited = 0;
        size_t mp3_stackSize = 1024 * 8;
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
        int mp3_thread_priority = 95;
 #else
        int mp3_thread_priority = 75;
@@ -1067,13 +1077,20 @@ int Helios_play_mp3_stream_start(void *mp3_buff, int mp3_size)
                Helios_rb_init(Helios_ring_buf);
                Helios_ring_buf->capacity = (Helios_config.len_size);
                Helios_ring_buf->wcond = Helios_Semaphore_Create(1, 0);
-
                assert(Helios_ring_buf->wcond != 0);
                Helios_ring_buf->rcond = Helios_Semaphore_Create(1, 0);
                assert(Helios_ring_buf->rcond != 0);
        }
 
-       
+       if (pcm_ring_buf == NULL) {
+               pcm_ring_buf = malloc(sizeof(Helios_ring_buf_t) + PCM_PINGPANG_BUF_LEN*4);
+               if (!pcm_ring_buf) {
+                       AUDLOGE("malloc pcm_ring_buf failed !!!\n");
+                       return -1;
+               }
+               Helios_rb_init(pcm_ring_buf);
+               pcm_ring_buf->capacity = PCM_PINGPANG_BUF_LEN*4;
+       }       
 
        if (Helios_mp3_read_mutex == 0)
        {
@@ -1183,6 +1200,7 @@ int Helios_play_mp3_stream_stop()
        Helios_rb_init(Helios_ring_buf);
        Helios_Mutex_Unlock(Helios_mp3_read_mutex);
 
+
        return 0;
 }
 int Helios_play_mp3_stream_drain()
@@ -1444,9 +1462,9 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
                if (frame_count == __jump_count) {
                    break;
                }
-               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // 跳过帧数æ\8d?
-               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // 跳过帧数æ\9d?
-               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // è·³è¿\87帧æ\95°ï¿??
+               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // 跳过帧数�?
+               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // 跳过帧数�?
+               Helios_Aud_fseek(fd, frame_length - 4, SEEK_CUR); // è·³è¿\87帧æ\95°ï¿½??
                frame_count++;
            }
                AUDLOGD("jump size[%d],pos[%d],offset[%d]\n",pos + offset, pos, offset);
@@ -1471,7 +1489,7 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
        {
                // memset(mp3_buf, 0, read_size);
 #ifdef USR_HELIOS_AUDIO
-               if(Helios_aud_stop_play_flag){
+               if(Helios_aud_stop_play_flag) {
                        break;
                }
 #endif
@@ -1498,10 +1516,10 @@ int Helios_mp3_file_start(char *file_name, cb_on_player aud_cb)
 
 int Helios_mp3_file_stop()
 {
-       AUDLOGD("mp3Stop");
+       AUDLOGD("Helios_mp3_file_stop");
 
        int count = 0;
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        Helios_aud_stop_play_flag = 1;
 
        if(mp3_pcm_whdl) {
@@ -1516,12 +1534,11 @@ int Helios_mp3_file_stop()
                AUDLOGE("error, mp3 is not playing\n");
                return -1;
        }
-#ifndef USR_HELIOS_AUDIO
+#ifdef USR_HELIOS_AUDIO
        Helios_aud_stop_play_flag = 1;
 #endif
 
        Helios_Flag_Release(dec_pcm_flag_Ref, Helios_PCM_STOP, Helios_FLAG_OR);
-       
        while (is_mp3_playing && count < 100)
        {
                Helios_msleep(15);
index 674dec8..be048c7 100644 (file)
@@ -28,19 +28,6 @@ static Helios_AudOutputType cur_AudType =  HELIOS_OUTPUT_RECEIVER;
 #define    STRICMP(strFirst,strSecond)    strcasecmp((char *)(strFirst), (char *)(strSecond))
 
 
-
-typedef enum
-{
-       HELIOS_NOT_INITED,
-       HELIOS_INITED,
-} HELIOS_STREAM_INIT_STATE;
-
-typedef enum
-{
-       HELIOS_STREAM_SEND_FINISH,
-       HELIOS_STREAM_SEND_NOT_FINISH,
-} HELIOS_STREAM_FINISH_STATE;
-
 #define HELIOS_PCM_BLOCK_FLAG (0x01)
 #define HELIOS_PCM_NONBLOCK_FLAG (0x02)
 #define HELIOS_PCM_READ_FLAG (0x04)
@@ -49,7 +36,7 @@ typedef enum
 
 #define PACKET_WRITE_MAX_SIZE 3 * 1024
 
-static HELIOS_STREAM_INIT_STATE helios_stream_init_flag = HELIOS_NOT_INITED;
+HELIOS_STREAM_INIT_STATE helios_stream_init_flag = HELIOS_NOT_INITED;
 static HELIOS_STREAM_FINISH_STATE helios_stream_send_flag = HELIOS_STREAM_SEND_FINISH;
 
 static helios_cb_on_player play_stream_user_cb = NULL;
@@ -122,8 +109,6 @@ int Helios_Audio_StreamPlayStart(Helios_AudStreamFormat format, const void *buf,
 {
        int cnt = 0, total_cnt = 0, err = 0;
        play_user_cb = usr_cb;
-               // ql_audio_play_init(helios_audio_stream_play_callback);
-
 #if CONFIG_AUDIO_MP3
        helios_mp3_set_callback(helios_audio_play_callback);
 #endif
@@ -138,7 +123,6 @@ int Helios_Audio_StreamPlayStart(Helios_AudStreamFormat format, const void *buf,
 #if CONFIG_AUDIO_WAV
                case HELIOS_AUDIO_FORMAT_WAVPCM:
                {
-
                        int samplerate = 0;
                        HELIOS_WAV_TAG wav_tag;
                        memset(&wav_tag,0,sizeof(HELIOS_WAV_TAG));
@@ -151,20 +135,16 @@ int Helios_Audio_StreamPlayStart(Helios_AudStreamFormat format, const void *buf,
                                AUDLOGI("wav init failed samplerate not support check the stream\n");
                                return(-1);
                        }
-//                     memset(&wav_config, 0, sizeof(Helios_PCM_CONFIG_T));
-//                     wav_config.channels = wav_tag.NumChannels;
-//                     wav_config.samplerate = samplerate;
-//                     wav_config.periodcnt = 0;
-//                     write_hdl = Helios_PCM_Open(&wav_config, HELIOS_PCM_WRITE_FLAG|HELIOS_PCM_BLOCK_FLAG);
                        if(!write_hdl) {
                                write_hdl = Helios_PCM_Open(wav_tag.NumChannels, samplerate, HELIOS_PCM_WRITE_FLAG | HELIOS_PCM_BLOCK_FLAG);
                        }
-                       if(write_hdl==NULL){
+                       if(write_hdl==NULL) {
                                AUDLOGI("wav init failed pcm open failed\n");
                                return(-1);
                        }
-//                     AUDLOGI("wav fomat init completed channels:%d,samplerate:%d\n",wav_config.channels,wav_config.samplerate);
                        helios_stream_init_flag = HELIOS_INITED;
+                       // ²¥·ÅÒôÆµÊ±Ìø¹ýtagÊý¾Ý
+                       total_cnt += sizeof(HELIOS_WAV_TAG);
 #if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                        Helios_PCM_Play_Cb(write_hdl, __pcm_play_cb);
 #endif
@@ -382,7 +362,6 @@ exit:
                AUDLOGI("pcm close\n");
                write_hdl=NULL;
        } 
-       
        helios_stream_init_flag = HELIOS_NOT_INITED;
        
        play_stream_user_cb = NULL;
@@ -694,7 +673,9 @@ struct data_chunk{
         }
         
         if(is_jump_pa == 0) {
+#if !( defined(BOARD_EC600MCN_LF_SLPOC) )
                __audio_pa_callback(event);
+#endif
         }
 
         if(play_user_cb != NULL) {
@@ -814,7 +795,7 @@ static void __Helios_audio_file_play_task_init(void)
  {
         static int inited = 0;
         size_t audio_stackSize = 1024*2;
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int audio_thread_priority = 95;
 #else
         int audio_thread_priority = 74;
@@ -969,6 +950,7 @@ static int Helios_Audio_Find_Files_by_name(char *file_name)
 #if CONFIG_AUDIO_MP3
                  case 1:
                          Helios_mp3_file_stop();
+                         Helios_play_mp3_stream_stop();
                          break;
 #endif
 #if CONFIG_AUDIO_WAV
@@ -979,6 +961,7 @@ static int Helios_Audio_Find_Files_by_name(char *file_name)
 #if CONFIG_AUDIO_AMR
                  case 3:
                          helios_amr_file_end();
+                         helios_amr_stream_close();
                          break;
 #endif
 #if CONFIG_AUDIO_SND
index ddcd53a..9a03526 100644 (file)
@@ -93,6 +93,19 @@ typedef enum{
 }aud_stream_format;
 
 
+typedef enum
+{
+       HELIOS_NOT_INITED,
+       HELIOS_INITED,
+} HELIOS_STREAM_INIT_STATE;
+
+typedef enum
+{
+       HELIOS_STREAM_SEND_FINISH,
+       HELIOS_STREAM_SEND_NOT_FINISH,
+} HELIOS_STREAM_FINISH_STATE;
+
+extern HELIOS_STREAM_INIT_STATE helios_stream_init_flag;
 
 /**
  ******************************************************************************
@@ -114,6 +127,7 @@ int Helios_PCM_Close(void *handle);
 int Helios_PCM_Write(void *handle, void *data, unsigned int count);
 int Helios_PCM_Read(void *handle, void *data, unsigned int count);
 int Helios_set_mic_channel(int channel);
+int Helios_PCM_buffer_Reset(void* handle);
 
 int Helios_Audio_FilePlayStart_PY(char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb);
 
index 66fc010..6b0d9af 100644 (file)
@@ -119,6 +119,10 @@ void ql_release(void)
 {
        if(quec_decoder_buf)
                free(quec_decoder_buf);
+
+       if (dec_flag == 0) {
+               dec_flag = 1;
+       }
 }
 /*end add*/
 
index f5fa6ec..8957ecd 100644 (file)
 /  bit1=1: Do not trust last allocated cluster number in the FSINFO.
 */
 
-
+#if defined(BOARD_EC600MCN_LF_SPISD)
+#define FF_FS_LOCK             0
+#else   
 #define FF_FS_LOCK             12
+#endif
 /* The option FF_FS_LOCK switches file lock function to control duplicated file open
 /  and illegal operation to open objects. This option must be 0 when FF_FS_READONLY
 /  is 1.
index b227c9c..fc31360 100644 (file)
@@ -82,7 +82,11 @@ spi_hw_config spi_config = {1, 0, 4, HELIOS_GPIOMAX};
 
 static void spi_init(void)
 {
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, 0, 0);//812.5KHz
+#else
        Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, 0);//812.5KHz
+#endif
 
        if(spi_config.spics != HELIOS_GPIOMAX)
        {
@@ -113,7 +117,7 @@ static void spi_cs_control(int i)
        }
 }
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 extern int Helios_SPI_Transfer_Pio(Helios_SPINum spi_port,void *inbuf,size_t inlen,void *outbuf, size_t outlen);
 #endif
 
@@ -123,7 +127,7 @@ static u8 SPI_Read_Write_Byte(u8 TxData)
        u8 read_Data;
        u8 write_Data = TxData;
        
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
        Helios_SPI_Transfer_Pio(spi_config.spi_port, &read_Data, 1, &write_Data, 1);//write and read spi fifo mode
 #else
        Helios_SPI_WriteRead(spi_config.spi_port, &read_Data, 1, &write_Data, 1);
@@ -134,14 +138,14 @@ static u8 SPI_Read_Write_Byte(u8 TxData)
 
 //spiдһ¸öbuffer
 static u8 SPI_Write_Buf(u8 *buf, u32 len)
-{     
+{  
        u8 write_buf[512]; 
 
        if(len > 512)
        {
                return 1;
        }
-       
+
        memcpy(write_buf, buf, len);
        Helios_SPI_Write(spi_config.spi_port, write_buf, len);
 
@@ -161,11 +165,19 @@ static void SPI_Set_Speed(u8 high)
 {
        if(high)
        {
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+               Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, spi_config.spiclk, 0);
+#else
                Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, spi_config.spiclk);
+#endif
        }
        else
        {
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+               Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, 0, 0);//812.5KHz
+#else
                Helios_SPI_Init(spi_config.spi_port, spi_config.spimode, 0);//812.5KHz
+#endif
        }
 }
 
@@ -183,13 +195,12 @@ static u8 SD_Wait_Ready(void)
        do
        {
                if(SPI_Read_Write_Byte(0xff)==0xff)
-               {
+               {       
                        return 0;//OK
                }
 
-               retry++;                        
-       }while(retry<0xffff);
-               
+               retry++;
+       }while(retry<0x3fff);//need wait more time,0x3ff is not long enough @jimmy 20240507
        return 1;
 }
 
@@ -200,10 +211,11 @@ static u8 SD_Select(void)
        spi_cs_control(0);
        
        if(SD_Wait_Ready()==0)
+       {
                return 0;
+       }
        
        SD_DisSelect();
-       
        return 1;
 }
 
@@ -273,7 +285,7 @@ static u8 SD_Send_Block(u8*buf,u8 cmd)
                        return 2;                                                                                                               
                }
        }               
-       
+
        return 0;
 }
 
@@ -437,7 +449,7 @@ u8 SD_Init_Config(int spi_port, int spimode, unsigned int spiclk, int spics)
 
                        if(buf[2] == 0x01 && buf[3] == 0xAA)//¿¨ÊÇ·ñÖ§³Ö2.7~3.6V
                        {
-                               retry = 0xfffe;
+                               retry = 0x3fe;
                                do
                                {
                                        SD_Send_Cmd(CMD55,0,0x01);      //·¢ËÍCMD55
@@ -465,7 +477,7 @@ u8 SD_Init_Config(int spi_port, int spimode, unsigned int spiclk, int spics)
                        if(response <= 1)
                        {               
                                SD_Type = SD_TYPE_V1;
-                               retry = 0xfffe;
+                               retry = 0x3fe;
                                do 
                                {
                                        SD_Send_Cmd(CMD55,0,0x01);      //·¢ËÍCMD55
@@ -475,7 +487,7 @@ u8 SD_Init_Config(int spi_port, int spimode, unsigned int spiclk, int spics)
                        else
                        {
                                SD_Type = SD_TYPE_MMC;//MMC V3
-                               retry = 0xfffe;
+                               retry = 0x3fe;
                                do 
                                {                                                                                           
                                        response = SD_Send_Cmd(CMD1,0,0x01);
index 50e648c..18fc114 100644 (file)
@@ -1424,9 +1424,12 @@ unsigned int  SPINANDDevice_Init()
                return 0xFF;
 
        memset(spinand,0,sizeof(struct spinand_device));//somer add 20201214
-       
+       #if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       Helios_SPI_Init(HELIOS_SPI1,HELIOS_SPIMODE0,6,0);
+       #else
        //init_ssp_port(2, (SSP_Clock)1);
        Helios_SPI_Init(HELIOS_SPI1,HELIOS_SPIMODE0,6);
+       #endif
        set_ssp_port(2);
        
 
index cc62377..129cd2e 100644 (file)
@@ -28,6 +28,7 @@ typedef enum VOL_TYPE{
     BND_TTS,
     BND_TONE
 }VOL_TYPE;
+
 typedef enum CALL_TYPE{
     ALL_NOT_CALL,
     QPY_SDK_CALL,
@@ -35,72 +36,78 @@ typedef enum CALL_TYPE{
     QPY_APP_NOT_CALL,
     QPY_ALL_CALL
 }CALL_TYPE;
+
+/*
+    broad_report_sos :海外伯纳德和善理国内和国外
+    broad_sos_start : 国内的伯纳德
+*/
+
 /*
-    FUN:init_cb ¿â³õʼ»¯½á¹û»Øµ÷
+    FUN:init_cb 库初始化结果回调
     PARAM:
-        ret: 0:ʧ°Ü£» 1:³É¹¦
+        ret: 0:失败; 1:成功
 */
 typedef void(*init_cb)(int ret);
 
 /*
-    FUN:login_state_cb µÇ¼״̬»Øµ÷
+    FUN:login_state_cb 登录状态回调
     PARAM:
         online:USER_OFFLINE/USER_ONLINE
 */
 typedef void(*login_state_cb)(int online);
 
 /*
-    FUN:join_group_cb ½ø×黨µ÷,´¥·¢Ô´°üÀ¨Ö÷¶¯½ø×éºÍ±»¶¯½ø×é
+    FUN:join_group_cb 进组回调,触发源包括主动进组和被动进组
     PARAM:
-        groupname:µ±Ç°Èº×éµÄÃû×Ö
-        gid£ºµ±Ç°Èº×égid
+        groupname:当前群组的名字
+        gid:当前群组gid
 */
 typedef void(*join_group_cb)(const char* groupname, bnd_gid_t gid);
 
 /*
-    FUN:audio_cb ÒôƵµÄ»Øµ÷
+    FUN:audio_cb 音频的回调
     PARAM:
-        state:µ±Ç°ÓïÒô״̬:ÊÕÌý/½²»°/TTS/TONE
-        uid£ºµ±Ç°²Ù×÷Óû§uid£¬½²»°/TTS/TONEʱΪ0
-        name:µ±Ç°²Ù×÷Óû§Ãû×Ö£¬½²»°/TTS/TONEʱΪNULL
-        flag:Èç¹ûstateΪBND_LISTEN_START,flag==1±íʾ±¾»ú¿ÉÒÔ´ò¶Ï¶Ô·½½²»°,flag==0±íʾ±¾»ú²»ÄÜ´ò¶Ï¶Ô·½½²»°
+        state:当前语音状态:收听/讲话/TTS/TONE
+        uid:当前操作用户uid,讲话/TTS/TONE时为0
+        name:当前操作用户名字,讲话/TTS/TONE时为NULL
+        flag:如果state为BND_LISTEN_START,flag==1表示本机可以打断对方讲话,flag==0表示本机不能打断对方讲话
 */
 typedef void(*audio_cb)(AUDIO_STATE state, bnd_uid_t uid, const char* name, int flag);
 
 /*
-    FUN:callmember_cb µ¥ºôµÄ»Øµ÷
+    FUN:callmember_cb 单呼的回调
     PARAM:
-        ret:1->³É¹¦£¬0->ʧ°Ü
+        ret:1->成功,0->失败
 */
 typedef void(*callmember_cb)(int ret);
 
 /*
-    FUN:listupdate_cb Êý¾Ý±ä»¯µÄ»Øµ÷
+    FUN:listupdate_cb 数据变化的回调
     PARAM:
-        flag:1£ºÈº×éÁбí±ä»¯£¬ 2£º³ÉÔ±Áбí±ä»¯
+        flag:1:群组列表变化, 2:成员列表变化
 */
 typedef void(*listupdate_cb)(int flag);
 
 /*
-    FUN:member_change_cb Êý¾Ý±ä»¯µÄ»Øµ÷
+    FUN:member_change_cb 数据变化的回调
     PARAM:
-        flag:1 Àë×é
-        num:¸öÊý
-        uids:uid¼¯ºÏ
+        flag:1 离组
+        num:个数
+        uids:uid集合
 */
 typedef void(*member_change_cb)(int flag, int nun, bnd_uid_t* uids);
 
 /*
-    FUN:error_cb Òì³£´íÎóÐÅÏ¢µÄ»Øµ÷
+    FUN:error_cb 异常错误信息的回调
     PARAM:
-        info: Òì³£ÐÅÏ¢
+        info: 异常信息
 */
 typedef void(*error_cb)(const char* info);
 
 /*
-    FUN:poc_at_cb AT͸´«»Øµ÷£¬ÓÃÓÚ½ÓÊÕPOC´¦ÀíºóµÄ·µ»ØATÊý¾Ý
+    FUN:poc_at_cb AT透传回调,用于接收POC处理后的返回AT数据
     PARAM:
-        at: POC´¦ÀíºóµÄ·µ»ØATÊý¾Ý
+        at: POC处理后的返回AT数据
 */
 typedef void(*poc_at_cb)(char* at);
 typedef void(*upgrade_cb)(int ret);
@@ -111,24 +118,43 @@ typedef void(*request_lbs_info_cb)(char *z8filename,char *z12filename, char *z16
 typedef void(*location_change_cb)(int location_switch, int report_rate);
 typedef void(*weather_info_cb)(char *lbs_tts,char is_lbs_tts);
 /*
-    reason  ¾Ü¾øµÄÔ­Òò//0-Õý³£¾Ü¾ø 1-½Óµç»° 2-Ãâ´òÈÅ
-    result -2 ¶Ô·½²»Ö§³Ö -1 ¶Ô·½ÕýÔÚ½²»°£¬»òÕß¶Ô·½²»ÔÊÐí±»ºô½ÐµÈ´íÎó
+    reason  拒绝的原因//0-正常拒绝 1-接电话 2-免打扰
+    result -2 对方不支持 -1 对方正在讲话,或者对方不允许被呼叫等错误
 */ 
 typedef void(*request_invite_ack_cb)(uint64_t invite_id, int32_t result, uint32_t *invites, int invites_count, int reason);
 /*
-    result -1 µ±Ç°Óû§±»½ûÑÔ£¬»òÕ߯äËûÒì³£
+    result -1 当前用户被禁言,或者其他异常
 */
 typedef void(*response_invite_ack_cb)(int32_t result, uint32_t is_timeout);
 typedef void(*push_invite_cb)(uint64_t invite_id, uint32_t inviter);
 /*
-    reason  ¾Ü¾øµÄÔ­Òò//0-Õý³£¾Ü¾ø 1-½Óµç»° 2-Ãâ´òÈÅ
+    reason  拒绝的原因//0-正常拒绝 1-接电话 2-免打扰
 */ 
 typedef void(*push_response_invite_cb)(uint64_t invite_id, uint32_t invitee, uint32_t accept, int reason);
 typedef void(*sos_status_cb)(char send_sos_status);//0 success 1 error 2 timeout 3 not enable send sos
 typedef void(*sos_map_cb)(char *z8filename,char *z12filename, char *z16filename,char is_sos_map);
 typedef void(*recv_sos_info_cb)(char *sendname, char *timestamp, double lon, double lat);
-typedef void(*recv_enclosure_alarm_cb)(int alarm, char *tips);//1 Ô½½ç 0Ïû³ý
-typedef void(*recv_broadcast_info_cb)(int flags, char *tts);//1 ¿ªÊ¼²¥·Å¹ã²¥ 0Í£Ö¹²¥·Å¹ã²¥
+typedef void(*recv_enclosure_alarm_cb)(int alarm, char *tips);//1 越界 0消除
+typedef void(*recv_broadcast_info_cb)(int flags, char *tts);//1 开始播放广播 0停止播放广播
+typedef void(*recv_http_request_status_cb)(int status);//0成功 1失败
+typedef void(*recv_http_request_add_group_status_cb)(int status, int gid, char *group_name, char *invite_code);//0成功 1失败
+typedef void(*recv_http_get_invitation_code_cb)(int status, char *invitation_code);//0成功 1失败
+typedef void(*recv_http_request_timeout_cb)();
+typedef void(*create_group_cb)(int create_group_switch);
+/*
+       reporter  上报者uid
+       uuid  sos 唯一标示
+       longitude 经度
+       latitude 纬度
+       gid  群组id
+*/
+typedef void(*recv_sos_alarm_cb)(uint32_t reporter, uint64_t uuid, double lon , double lat, uint32_t gid);
+
+typedef void(*recv_report_sos_ack_cb)(int result);//result 0 成功 其他失败
+typedef void(*recv_report_sos_ack_timeout_cb)();//发送sos超时
+
+typedef void(*recv_close_sos_cb)(int uid, uint64_t uuid);//uid 发送者 uuid 此sos唯一标示
+typedef void(*sos_switch_cb)(int sos_switch);//0 关闭 1 打开 2 请求开关超时
 void broad_init(init_cb cb);
 void broad_free(void);
 void broad_log(boolean enable);
@@ -140,38 +166,38 @@ int broad_leavegroup(void);
 int broad_speak(boolean start);
 int broad_calluser(const bnd_uid_t uid ,callmember_cb cb);
 int broad_callusers( const bnd_uid_t* uids, int num, callmember_cb cb );
-//°´Ë÷Òý²éѯȺ×éÐÅÏ¢
+//按索引查询群组信息
 int broad_group_getbyindex(int index,bnd_group_t* dst);
 
-//Èç¹ûgid´«Èë0,¿É²éѯµ±Ç°Èº×éÐÅÏ¢
+//如果gid传入0,可查询当前群组信息
 int broad_group_getbyid(bnd_gid_t gid,bnd_group_t* dst);
 
-//Èç¹ûuid´«Èë0,¿É²éѯµ±Ç°µÇ¼Óû§ÐÅÏ¢
+//如果uid传入0,可查询当前登录用户信息
 int broad_member_getbyid(bnd_uid_t uid,bnd_member_t* dst);
 int broad_get_loginstate(void);
 int broad_get_groupcount(void);
 
 /*
-    FUN£ºbroad_get_grouplist
-    PARAM£º
-        dstºÍdst_sizeΪµ÷ÓÃÕßµÄÊý×é¿Õ¼ä¼°Êý×é´óС
-        index_beginΪ²éѯµÄË÷ÒýÆðʼֵ
-        countΪ¼Æ»®²éѯµÄ¸öÊý
-    RETURN£º
-        Êµ¼Ê²éѯµ½µÄ¸öÊý
+    FUN:broad_get_grouplist
+    PARAM:
+        dst和dst_size为调用者的数组空间及数组大小
+        index_begin为查询的索引起始值
+        count为计划查询的个数
+    RETURN:
+        实际查询到的个数
 */
 int broad_get_grouplist(bnd_group_t* dst, int dst_size, int index_begin, int count);
 
 const int broad_get_membercount(bnd_gid_t gid );
 /*
-    FUN£ºbroad_get_memberlist
-    PARAM£º
-        gidΪȺ×éid
-        dstºÍdst_sizeΪµ÷ÓÃÕßµÄÊý×é¿Õ¼ä¼°Êý×é´óС
-        index_beginΪ²éѯµÄË÷ÒýÆðʼֵ
-        countΪ¼Æ»®²éѯµÄ¸öÊý
-    RETURN£º
-        Êµ¼Ê²éѯµ½µÄ¸öÊý
+    FUN:broad_get_memberlist
+    PARAM:
+        gid为群组id
+        dst和dst_size为调用者的数组空间及数组大小
+        index_begin为查询的索引起始值
+        count为计划查询的个数
+    RETURN:
+        实际查询到的个数
 */
 const int broad_get_memberlist(bnd_gid_t gid, bnd_member_t* dst, int dst_size, int index_begin, int count);
 
@@ -182,7 +208,7 @@ int broad_play_tts(const char* tts, boolean interrupt);
 
 int broad_send_ping(void);
 
-//lat£ºÎ³¶È£¬ lon£º ¾­¶È£¬ time£º ¶¨Î»Ê±¼ä
+//lat:纬度, lon: 经度, time: 定位时间
 int broad_send_gpsinfo(double lon,double lat,bnd_time_t time, double alt, double speed, double dirang);
 void broad_get_version(char* ver);
 int broad_current_zone_time(bnd_time_t* now, int zone);
@@ -191,7 +217,7 @@ int broad_current_zone_time(bnd_time_t* now, int zone);
 int broad_set_tts_enable(boolean enable);
 int broad_set_vol(VOL_TYPE type, int vol);
 int broad_get_vol(VOL_TYPE type);
-//»ñÈ¡ÕʺſÉÓÃÌìÊý
+//获取帐号可用天数
 int broad_get_account_day(void);
 
 //mode:1->open; 0->close; 2->clear all history
@@ -199,10 +225,10 @@ int broad_set_rec_audio_mode(unsigned char mode);
 
 int broad_get_rec_audio_count(void);
 
-//index:¼ÒôÁбíË÷Òý, name:½²»°µÄÓû§Ãûutf8¸ñʽ, delay:ÓïÒôʱ³¤(µ¥Î»Ãë), time:Â¼ÖÆÊ±¼ä
+//index:录音列表索引, name:讲话的用户名utf8格式, delay:语音时长(单位秒), time:录制时间
 int broad_get_rec_audio_info(int index, char* name, unsigned char* delay, bnd_time_t* time);
 
-//index:¼ÒôÁбíË÷Òý
+//index:录音列表索引
 int broad_play_rec_audio(int index);
 
 int broad_stop_play_rec_audio(void);
@@ -229,17 +255,57 @@ void broad_register_sos_map_cb(sos_map_cb cb);
 void broad_register_recv_sos_info_cb(recv_sos_info_cb cb);
 void broad_register_recv_enclosure_alarm_cb(recv_enclosure_alarm_cb cb);
 void broad_register_recv_broadcast_info_cb(recv_broadcast_info_cb cb);
-//½¨Òébroad_set_poc_uart_deviceÓÃÓÚbroad_init(init_cb cb)×¢²áµÄ»Øµ÷Àï
+void broad_register_recv_http_add_group_cb(recv_http_request_add_group_status_cb cb);
+void broad_register_recv_http_add_members_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_remove_members_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_delete_group_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_update_group_owner_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_get_invitation_code_cb(recv_http_get_invitation_code_cb cb);
+void broad_register_recv_http_join_group_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_exit_group_cb(recv_http_request_status_cb cb);
+void broad_register_recv_http_request_timeout_cb(recv_http_request_timeout_cb cb);
+void broad_register_create_group_switch_cb(create_group_cb cb);
+/**
+ * @brief 注册接受sos 通知
+ * 
+ * @param cb 
+ */
+void broad_register_recv_sos_alarm_cb(recv_sos_alarm_cb cb);
+/**
+ * @brief 注册接受发送sos 回应通知
+ * 
+ * @param cb 
+ */
+void broad_register_recv_report_sos_ack_cb(recv_report_sos_ack_cb cb);
+/**
+ * @brief 注册sos 超时回调函数
+ * 
+ * @param cb 
+ */
+void broad_register_recv_report_sos_ack_timeout_cb(recv_report_sos_ack_timeout_cb cb);
+/**
+ * @brief 注册接受关闭sos通知
+ * 
+ * @param cb 
+ */
+void broad_register_recv_close_sos_cb(recv_close_sos_cb cb);
+/**
+ * @brief 注册sos 开关通知
+ * 
+ * @param cb 
+ */
+void broad_register_sos_switch_cb(sos_switch_cb cb);
+//建议broad_set_poc_uart_device用于broad_init(init_cb cb)注册的回调里
 /*
        void ui_init(int ret){
                broad_set_poc_uart_device(0);
        }
        broad_init(ui_init);
 */
-int broad_set_poc_uart_device(int open); //ĬÈÏuartÉ豸ÊÇ´ò¿ªµÄ£¬ÈçÐè¹Ø±ÕÇëÉèÖÃΪ0
-//AT Í¸´«½Ó¿Ú
-int broad_send_at(char* at); //·¢ËÍ
-void broad_register_poc_at_cb(poc_at_cb cb);//×¢²á½ÓÊջص÷
+int broad_set_poc_uart_device(int open); //默认uart设备是打开的,如需关闭请设置为0
+//AT 透传接口
+int broad_send_at(char* at); //发送
+void broad_register_poc_at_cb(poc_at_cb cb);//注册接收回调
 int broad_set_call_end_timeptr(int timeptr);
 int broad_set_call_auto_leave_temp_group(int flag);
 int broad_write_custom(BND_CUSTOM_TYPE type, const char* value);
@@ -249,39 +315,71 @@ int broad_set_solution(char *solution);
 int broad_set_solution_version(char *version);
 int broad_set_productInfo(char *productInfo);
 int broad_set_manufacturer(char *manufacturer);
-int broad_request_upgrade();
-int broad_get_init_status();
+int broad_request_upgrade(void);
+int broad_get_init_status(void);
 int broad_set_tone_enable(int flags);
 void broad_get_upgrade_version(char* ver);
 int broad_request_lbs_info(int w, int h, double lon, double lat);
 int broad_request_weather_info(double lon,double lat);
-//ÒÔÏÂÈý¸ö½Ó¿ÚÊÔÓÃÓÚ ÉÆÀí1.0Õ˺ŵǽµÄ·½Ê½
+//以下三个接口试用于 善理1.0账号登陆的方式
 int broad_login_by_saved(login_state_cb cb);
 int broad_change_logininfo(const char* account,const char* pwd);
 int broad_get_logininfo(char* account, char* pwd);
 /*
-    FUN£ºbroad_request_create_full_duplex_group
-    PARAM£º
-        invites Îª³ÉÔ±idÊý×é
-        size ³ÉÔ±µÄ¸öÊý
-    RETURN£º
-        ·¢ËÍÇëÇó´´½¨È«Ë«¹¤ÁÙʱȺ×é
+    FUN:broad_request_create_full_duplex_group
+    PARAM:
+        invites 为成员id数组
+        size 成员的个数
+    RETURN:
+        发送请求创建全双工临时群组
 */
 int broad_request_create_full_duplex_group(uint32_t* invites, uint32_t size);
 
 /*
-    FUN£ºbroad_response_create_full_duplex_group
-    PARAM£º
-        invite_id ´Ë´ÎÇëÇóµÄ»á»°id,ͨ¹ýpoc֪ͨÄõ½
-        inviter ·¢ÆðÇëÇóµÄuid£¬Í¨¹ýpoc֪ͨÄõ½
-        accept  ÊÇ·ñͬÒâ´Ë´ÎÇëÇó
-        reason  ¾Ü¾øµÄÔ­Òò//0-Õý³£¾Ü¾ø 1-½Óµç»° 2-Ãâ´òÈÅ
-    RETURN£º
-        ·¢ËÍÇëÇó´´½¨È«Ë«¹¤ÁÙʱȺ×é
+    FUN:broad_response_create_full_duplex_group
+    PARAM:
+        invite_id 此次请求的会话id,通过poc通知拿到
+        inviter 发起请求的uid,通过poc通知拿到
+        accept  是否同意此次请求
+        reason  拒绝的原因//0-正常拒绝 1-接电话 2-免打扰
+    RETURN:
+        发送请求创建全双工临时群组
 */
 int broad_response_create_full_duplex_group(uint64_t invite_id, uint32_t inviter, uint32_t accept, int reason);
 int broad_sos_start(double lon, double lat);
 int broad_query_sos_map(int w, int h, double lon, double lat);
+const int broad_get_contactlist_count(void);
+const int broad_get_contactlist(bnd_contact_t* dst, int dst_size);
+int broad_http_add_group(int *members, int member_count);
+int broad_http_add_members(int gid, int *members, int member_count);
+int broad_http_remove_members(int gid, int *members, int member_count);
+int broad_http_delete_group(int gid);
+int broad_http_update_group_owner(int gid, int new_owner_uid);
+int broad_http_get_invitation_code_group(int uid, int gid);
+int broad_http_join_group(int uid, char *invitation_code);
+int broad_http_exit_group(int uid, int gid);
+/**
+ * @brief broad_report_sos 发送sos
+ * 
+ * @param lon 经度
+ * @param lat 纬度
+ * @param time 时间
+ * @param alt 海拔
+ * @param speed 速度
+ * @param dirang 方向
+ * @return int 0 成功  -1 内部错误 -2 发送sos 频繁
+ */
+int broad_report_sos(double lon,double lat,bnd_time_t time, double alt, double speed, double dirang);
+
+/**
+ * @brief broad_set_terminal_info 设置或更新终端当前电量(1~100%)和4G信号等级(1~5个等级)信息
+ * @brief 此函数设置的信息不会立即上报 跟随下一个心跳(broad_send_ping)上报到服务器
+ * @param battery_level        电量(1~100%)
+ * @param signal_level  4G信号等级(1~5个等级)
+ * @return int 0 成功  -1 内部错误
+ */
+int broad_set_terminal_info(int battery_level, int signal_level);
+
 #ifdef __cplusplus
 }
 #endif
index 7ea46a5..aebcf6f 100644 (file)
@@ -5,10 +5,10 @@
 extern "C" {
 #endif
 #include <stdint.h>
-#include <stddef.h>
 typedef unsigned int                   bnd_uid_t;
 typedef unsigned int                   bnd_gid_t;
 typedef unsigned char                  boolean;
+
 #define USER_ONLINE    1
 #define USER_OFFLINE   2
 #define USER_INGROUP   3
@@ -36,6 +36,10 @@ typedef enum BND_CUSTOM_TYPE{
        SET_BND_IMEI_LOGIN,
        SET_IS_BROAD,
        SET_IS_ABROAD,
+       SET_URL_INFO,
+       SET_CREATE_GROUP_URL_INFO,//配置自建组域名
+       SET_SOS_AUTO_RELEASE_TIME,//配置sos 发送的间隔限制 1~5s
+       SET_ALWAYS_JOIN_LAST_GROUP,//配置进组超时,总是进入超时的群组
 }BND_CUSTOM_TYPE;
 
 //群组结构
@@ -45,6 +49,7 @@ typedef struct bnd_group_t
        char            name[BRD_NAME_LEN];             //群组名
        BRD_GROUP_TYPE  type;           //群组类型
        int                     index;
+       unsigned int creator_uid;               ///群组创建者
 } bnd_group_t;
 
 typedef struct _bnd_member_t {
@@ -66,6 +71,17 @@ typedef struct bnd_time_t {
        unsigned short  millisecond;
 } bnd_time_t;
 
+//好友结构
+typedef struct bnd_contact_t
+{
+       bnd_uid_t uid;
+       char name[BRD_NAME_LEN];
+       int state; //1在线,2,离线,3在线在组
+       unsigned int prior;             ///< 优先级
+       int index;
+       char role;//0 普通成员 3调度员
+} bnd_contact_t;
+
 #ifdef __cplusplus
 }
 #endif
index fad6d76..b1865bf 100644 (file)
Binary files a/2.sdk/Helios_SDK/components/poc/bnd_xin/lib/broad.lib and b/2.sdk/Helios_SDK/components/poc/bnd_xin/lib/broad.lib differ
index 10c7bef..d515cd8 100644 (file)
@@ -7,6 +7,12 @@
 #elif CONFIG_POC_RDA_BND
 #include "poc_rda.c"
 
+#elif CONFIG_POC_RDA_BND_XIN
+#include "poc_rda.c"
+
+#elif CONFIG_POC_TID
+#include "poc_tid.c"
+
 #else 
 
 #if defined(CONFIG_POC_SL)
@@ -128,10 +134,14 @@ static const poc_ops_t poc_ops = {
     .send_gpsinfo = broad_send_gpsinfo,
     .register_member_audio_enable_cb = broad_register_member_audio_enable_cb,
     .sos_start              = broad_sos_start,
+    .report_sos              = broad_report_sos,
     .query_sos_map          = broad_query_sos_map,
     .register_sos_status_cb = broad_register_sos_status_cb,
     .register_sos_map_cb    = broad_register_sos_map_cb,
+    .register_recv_sos_alarm_cb    = broad_register_recv_sos_alarm_cb,
     .register_recv_sos_info_cb  = broad_register_recv_sos_info_cb,
+    .register_recv_report_sos_ack_cb = broad_register_recv_report_sos_ack_cb,
+    .register_recv_report_sos_ack_timeout_cb = broad_register_recv_report_sos_ack_timeout_cb,
     .register_recv_enclosure_alarm_cb = broad_register_recv_enclosure_alarm_cb,
     .current_zone_time               = broad_current_zone_time,
 
@@ -139,11 +149,12 @@ static const poc_ops_t poc_ops = {
     .login_by_saved = broad_login_by_saved,
     .change_logininfo = broad_change_logininfo,
     .get_logininfo = broad_get_logininfo,
+    .set_terminal_info = broad_set_terminal_info,
     
        #endif
 };
 
-#elif defined(CONFIG_POC_QS) 
+#elif defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
 
 static const poc_ops_t poc_ops = {
     .init = py_qs_poc_init,
@@ -178,8 +189,7 @@ static const poc_ops_t poc_ops = {
     .get_iscalling              =  py_qs_poc_get_iscalling,
     .get_isenable_friend        =  py_qs_poc_get_isenable_friend,
     .request_flush_member       =  py_qs_poc_request_flush_member,
-    .set_ptt_status             =  py_qs_poc_set_ptt_status,
-    
+    .set_ptt_status             =  py_qs_poc_set_ptt_status,    
     .get_is_support_location    = py_qs_poc_get_is_support_location,
     .get_is_support_gps         = py_qs_poc_get_is_support_gps,
     .get_is_support_wifi        = py_qs_poc_get_is_support_wifi,
@@ -198,6 +208,75 @@ static const poc_ops_t poc_ops = {
     .play_tone                                 = py_qs_poc_pttTone_play,
     .set_tone_codecGain                        = py_qs_poc_pttTone_CodecGain,
     .set_dev_location_type      = py_qs_poc_set_dev_location_type,
+    .get_is_device_paused       = py_qs_poc_get_is_device_paused,
+       .get_playing_status                     = py_qs_poc_get_dev_playing_status,
+       .get_recording_status           = py_qs_poc_get_dev_recording_status,
+       .check_update_werther           = py_qs_poc_checkUpdateWeatherForecastIfNeed,
+       .get_weather_info                       = py_qs_poc_GetWeatherForecastDataUtf8,
+    .get_is_support_weather     = py_qs_poc_getIsSupportWeather,
+    .set_is_support_weather     = py_qs_poc_setIsSupportWeather,
+       .send_address_request           = py_qs_poc_sendAddressRequest,
+       .get_address_data                       = py_qs_poc_getAddressData,
+       .taskrun                                                       = py_qs_poc_taskrun,
+    .setaccountandpassword                             = py_qs_poc_setaccountandpassword,
+    .exitsingleormulticall                             = py_qs_poc_exitsingleormulticall,
+    .refreshmulticallmember                            = py_qs_poc_refreshmulticallmember,
+    .getisintempgroup                                  = py_qs_poc_getisintempgroup,
+    .getissinglecall                                   = py_qs_poc_getissinglecall,
+    .getismulticall                                    = py_qs_poc_getismulticall,
+    .getmulticallid                                    = py_qs_poc_getmulticallid,
+    .getisactivesinglecall                             = py_qs_poc_getisactivesinglecall,
+    .getisactivemulticall                              = py_qs_poc_getisactivemulticall,
+    .getactivesingleormulticallusercount               = py_qs_poc_getactivesingleormulticallusercount,
+    .getsingleormulticalluserdata                      = py_qs_poc_getsingleormulticalluserdata,
+    .getsinglegroupdata                                = py_qs_poc_getsinglegroupdata,
+    .getcurrentgroupid                                 = py_qs_poc_getcurrentgroupid,
+    .getcurrentgroupnamemutex                          = py_qs_poc_getcurrentgroupnamemutex,
+    .refreshgrouplist                                  = py_qs_poc_refreshgrouplist,
+    .getcurrentgroupmemberlistcount                    = py_qs_poc_getcurrentgroupmemberlistcount,
+    .getcurrentgrouponlinemembercount                  = py_qs_poc_getcurrentgrouponlinemembercount,
+    .getcurrentgroupmemberuserdata                     = py_qs_poc_getcurrentgroupmemberuserdata,                             
+    .refreshgroupmemberlist                            = py_qs_poc_refreshgroupmemberlist,
+    .getfriendmemberlistcount                          = py_qs_poc_getfriendmemberlistcount,
+    .getfriendmemberuserdata                           = py_qs_poc_getfriendmemberuserdata,
+    .refreshfriendmemberlist                           = py_qs_poc_refreshfriendmemberlist,
+    .getaccountnickname                                = py_qs_poc_getaccountnickname,
+    .getfriendisenable                                 = py_qs_poc_getfriendisenable,
+    .getcurrentstate                                   = py_qs_poc_getcurrentstate,
+    .updatetailkerwithuserid                           = py_qs_poc_updatetailkerwithuserid,
+    .handlesocketpackage                               = py_qs_poc_handlesocketpackage,
+    .getdeviceuserid                                   = py_qs_poc_getdeviceuserid,
+    .getisvoicepacket                                  = py_qs_poc_getisvoicepacket,
+    .getdevicevoicepriority                            = py_qs_poc_getdevicevoicepriority,
+    .getreceivevoicepriorityafterhandlesocketpackage   = py_qs_poc_getreceivevoicepriorityafterhandlesocketpackage,
+    .uploadgpsdata                                     = py_qs_poc_uploadgpsdata,
+    .islistenchannel                                   = py_qs_poc_islistenchannel,
+    .addlistenchannel                                  = py_qs_poc_addlistenchannel,
+    .removelistenchannel                               = py_qs_poc_removelistenchannel,
+    .getlistenchannelcount                             = py_qs_poc_getlistenchannelcount,
+    .refreshmultichannellistenlist                     = py_qs_poc_refreshmultichannellistenlist,
+    .refreshalllistengroupmember                       = py_qs_poc_refreshalllistengroupmember,
+    .getonegroupmemberlistcount                        = py_qs_poc_getonegroupmemberlistcount,
+    .getonegroupmemberuserdata                         = py_qs_poc_getonegroupmemberuserdata,
+    .refreshonegroupmember                             = py_qs_poc_refreshonegroupmember,
+    .deleteterminalgroup                               = py_qs_poc_deleteterminalgroup,
+    .exitterminalgroup                                 = py_qs_poc_exitterminalgroup,
+    .addterminalgroupmember                            = py_qs_poc_addterminalgroupmember,
+    .removeterminalgroupmember                         = py_qs_poc_removeterminalgroupmember,
+    .createterminalgroup                               = py_qs_poc_createterminalgroup,
+    .requestterminalgroupname                          = py_qs_poc_requestterminalgroupname,
+    .getterminalgroupnamecount                         = py_qs_poc_getterminalgroupnamecount,
+    .getterminalgroupnamelistdata                      = py_qs_poc_getterminalgroupnamelistdata,
+    .getisinbroadcastgroup                             = py_qs_poc_getisinbroadcastgroup,
+    .enterbroadcast                                    = py_qs_poc_enterbroadcast,
+    .exitbroadcast                                     = py_qs_poc_exitbroadcast,
+    .resetlistenautoguardaftersetting                  = py_qs_poc_resetlistenautoguardaftersetting,
+    .getlistenautoguardleftseconds                     = py_qs_poc_getlistenautoguardleftseconds,
+    .entrySingleOrMultiCall                            = py_qs_poc_entrysingleormulticall,                                                          
+    .getInactiveSingleOrMultiCallUserCount             = py_qs_poc_getinactivesingleormulticallusercount,
+    .get_3days_weather_info            = py_qs_poc_get3daysWeather,
+    .register_get_3days_weather_cb = py_qs_poc_register_get_3days_weather_cb,
+                                
 };
 
 #elif defined(CONFIG_POC_ZZD)
@@ -232,6 +311,7 @@ static const poc_ops_t poc_ops = {
     .register_audio_cb = py_zzd_poc_register_audio_cb,
     .register_join_group_cb = py_zzd_poc_register_join_group_cb,
     .register_listupdate_cb = py_zzd_poc_register_listupdate_cb,
+    
 };
 
 #elif defined(CONFIG_POC_YDWL)
@@ -246,7 +326,6 @@ static const poc_ops_t poc_ops = {
     .joingroup = py_ydwl_poc_joingroup,
     .monitor_group = py_ydwl_poc_monitor_group,
     .monitor_group_cancel = py_ydwl_poc_monitor_group_cancel,
-    // .leavegroup = py_ydwl_poc_leavegroup,
     .speak = py_ydwl_poc_speak,
     .calluser = py_ydwl_poc_calluser,
     .get_loginstate = py_ydwl_poc_get_loginstate,
@@ -254,23 +333,40 @@ static const poc_ops_t poc_ops = {
     .get_grouplist = py_ydwl_poc_get_grouplist,
     .get_membercount = py_ydwl_poc_get_membercount,
     .get_memberlist = py_ydwl_poc_get_memberlist,
-    .request_weather_info = py_ydwl_poc_get_weather,
+    .request_weather_info = py_ydwl_poc_request_weather,
+    .get_weather_info = py_ydwl_poc_get_weather,
     .get_version = py_ydwl_poc_get_version,
     .register_audio_cb = py_ydwl_poc_register_audio_cb,
     .register_join_group_cb = py_ydwl_poc_register_join_group_cb,
     .register_listupdate_cb = py_ydwl_poc_register_listupdate_cb,
     .register_notify_spker_cb = py_ydwl_poc_register_notify_spker_cb,
     .record_onoff = py_ydwl_poc_record_onoff,
-    // .record_clear = py_ydwl_poc_record_clear,
-    .record_get_list = py_ydwl_poc_record_get_list,
+    .record_get_folder_list = py_ydwl_poc_record_get_folder_list,
+    .record_get_file_list = py_ydwl_poc_record_get_file_list,
     .record_req_play = py_ydwl_poc_record_req_play,
     .record_stop_play = py_ydwl_poc_record_stop_play,
-    // .record_save_flash = py_ydwl_poc_record_save_flash,
     .record_get_state = py_ydwl_poc_record_get_state,
     .tts_init = py_ydwl_tts_init,
     .tts_play = py_ydwl_tts_play,
     .set_vol = py_ydwl_set_volume,
     .get_map_png = py_ydwl_poc_send_map_request,
+    .poc_get_account_info = py_ydwl_poc_get_account_info,
+    .report_alarm = py_ydwl_poc_report_alarm,
+    .stop_alarm = py_ydwl_poc_stop_alarm,
+    .ignore_alarm = py_ydwl_poc_ignore_alarm,
+    .register_sos_cb = py_ydwl_poc_register_sos_cb,
+    .register_invite_info_cb = py_ydwl_poc_register_invite_info_cb,
+    .register_cell_locator_cb = py_ydwl_poc_register_cell_locator_info_cb,
+    .gps_send_location = py_ydwl_poc_gps_send_location,
+    .get_cfg_from_file = ydwl_poc_get_cfg_from_file,
+    .get_login_from_file = ydwl_poc_get_login_from_file,
+    .set_cfg = ydwl_poc_set_cfg,
+    .get_cfg = ydwl_poc_get_cfg,
+    .register_ctrl_pa_cb = py_ydwl_poc_register_ctrl_pa_cb,
+    .set_icmic_gain = py_ydwl_set_icmic_gain,
+    .register_weather_info_cb = py_ydwl_poc_register_weather_info_cb,
+    .register_map_png_cb = py_ydwl_poc_register_map_png_cb,
+    .register_login_sta_cb = py_ydwl_poc_register_login_sta_cb,
 };
 
 #else 
index 7c6a660..e76eb65 100644 (file)
@@ -2,6 +2,10 @@
 #include "poc_slpoc.h"
 #elif CONFIG_POC_RDA_BND
 #include "poc_rda.h"
+#elif CONFIG_POC_RDA_BND_XIN
+#include "poc_rda.h"
+#elif CONFIG_POC_TID
+#include "poc_tid.h"
 #else 
 #if defined(CONFIG_POC_SL)
 #include "type_sl.h"
@@ -28,7 +32,7 @@ typedef bnd_group_t group_t;
 typedef bnd_member_t member_t;
 
 typedef  BND_CUSTOM_TYPE Helios_Poc_Platform_Type;
-#elif defined(CONFIG_POC_QS)
+#elif defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
 
 #include "poc_interface.h"
 typedef qs_uid_t poc_gid_t;
@@ -78,8 +82,11 @@ typedef struct {
     int (*calluser)(const poc_uid_t uid ,callmember_cb cb);
     int (*group_getbyindex)(int index,group_t* dst);
     int (*member_getbyid)(poc_uid_t uid,member_t* dst);
-
+#if defined(CONFIG_POC_YDWL)
+    login_sta_t* (*get_loginstate)();
+#else
     int (*get_loginstate)();
+#endif
     int (*get_groupcount)();
 
     void (*get_version)(char* ver);
@@ -112,27 +119,45 @@ typedef struct {
 
 #if defined(CONFIG_POC_YDWL)
     int (*set_account)(char *ip, char *account, char * password);
-    int  (*request_weather_info)(stWeather_info ** weather_info);
+    int  (*request_weather_info)(void);
+    int  (*get_weather_info)(stWeather_info ** weather_info);
     void (*register_notify_spker_cb)(notify_spker_cb cb);
     int (*record_onoff)(boolean enable);
-    // int (*record_clear)(void);
-    int (*record_get_list)(ydwl_record_list_t **dst);
+    int (*record_get_folder_list)(ydwl_record_list_t **dst);
+    int (*record_get_file_list)(ydwl_record_list_t **dst, int index);
     int (*record_req_play)(char* record_file);
     int (*record_stop_play)(void);
-    // int (*record_save_flash)(void);
     int (*record_get_state)(void);
     void (*tts_init)(ydwl_tts_cb_type usr_cb);
     void (*tts_play)(const char* string, unsigned int len);
+    account_info_t * (*poc_get_account_info)(void);
+    int (*report_alarm)(double lat, double lng);
+    int (*stop_alarm)(void);
+    int (*ignore_alarm)(void);
+    void (*register_sos_cb)(sos_cb cb);
+    void (*register_invite_info_cb)(invite_info_cb cb);
+    void (*register_cell_locator_cb)(cell_locator_info_cb cb);
+    int (*gps_send_location)(double lat, double lng);
+    stPocSetPar * (*get_cfg_from_file)(void);
+    stLoginCfg * (*get_login_from_file)(void);
+    int (*set_cfg)(uint8_t *data, int len);
+    stPocSetPar * (*get_cfg)(void);
+    void (*register_ctrl_pa_cb)(ctrl_pa_cb cb);
+    void (*register_weather_info_cb)(weather_info_cb cb);
+    void (*register_map_png_cb)(map_png_cb cb);
+    void (*register_login_sta_cb)(get_login_sta_cb cb);
+    int (*set_icmic_gain)(int ana_gain, int adc_gain);
 #endif
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
        int (*set_tone_enable)(int flags);
     void (*play_tone)(void);
        int (*set_tone_codecGain)(float dB);
+    int (*get_is_device_paused)(void);
 #endif
 
 
-#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL) && !defined(CONFIG_POC_QS_R07)
     AUDIO_STATE (*get_audiostate)();
        
 
@@ -179,10 +204,14 @@ typedef struct {
     void (*register_member_audio_enable_cb)(member_audio_enable cb);
     
     int  (*sos_start)(double lon, double lat);
+    int  (*report_sos)(double lon,double lat,bnd_time_t time, double alt, double speed, double dirang);
     int  (*query_sos_map)(int w, int h, double lon, double lat);
     void (*register_sos_status_cb)(sos_status_cb cb);
     void (*register_sos_map_cb)(sos_map_cb cb);
+    void (*register_recv_sos_alarm_cb)(recv_sos_alarm_cb cb);
     void (*register_recv_sos_info_cb)(recv_sos_info_cb cb);
+    void (*register_recv_report_sos_ack_cb)(recv_report_sos_ack_cb cb);
+    void (*register_recv_report_sos_ack_timeout_cb)(recv_report_sos_ack_timeout_cb cb);
     void (*register_recv_enclosure_alarm_cb)(recv_enclosure_alarm_cb cb);
     int  (*current_zone_time)(bnd_time_t* now, int zone);
     
@@ -190,12 +219,17 @@ typedef struct {
     int  (*login_by_saved)(login_state_cb cb);
     int (*change_logininfo)(const char* account,const char* pwd);
     int (*get_logininfo)(char* account, char* pwd);
+       int (*set_terminal_info)(int battery_level, int signal_level);
 
     #endif
 #else
+       #if defined( CONFIG_POC_QS ) || defined(CONFIG_POC_QS_R07)
+    void (*set_login_account)(char* account, char* password, int aliTestServerIndex);
+       #else
     void (*set_login_account)(char* account, char* password);
+       #endif
 #endif  //  CONFIG_POC_QS
-    #if defined( CONFIG_POC_QS )
+    #if defined( CONFIG_POC_QS ) || defined(CONFIG_POC_QS_R07)
     void (*register_error_cb)(error_cb cb);
     int (*get_friendlist)(member_t* friendlist, int count);
     int (*get_friendcount)();
@@ -224,10 +258,91 @@ typedef struct {
     void (*upload_wifi_data)(char* arg1,int arg2,int* arg3,int arg4,int arg5);
     void (*send_heart_package)(void);
     void (*set_dev_location_type)(LOCATION_TYPE location_type,int is_enable);
+       int (*get_playing_status)(void);
+       int (*get_recording_status)(void);
+       void (*check_update_werther)(void);
+       int (*get_weather_info)(int* pWeatherTemperature,char* pWeatherTextUtf8,int weatherTextUtf8BytesLength,
+        char* pWeatherWindDirectionUtf8,int weatherWindDirectionUtf8BytesLength,char* pWeatherWindClassUtf8,int weatherWindClassUtf8BytesLength,
+        char* pWeatherUtf8City,int weatherUtf8CityBytesLength);
+    int (*get_is_support_weather)(void);
+    void (*set_is_support_weather)(int is_enable);
+       void (*send_address_request)(void);
+       int (*get_address_data)(char* pWeatherTextUtf8,int weatherTextUtf8BytesLength);
+    void   (*taskrun)(void);
+    void   (*setaccountandpassword)(const char* account, const char* password,int aliTestServerIndex);
+    void   (*exitsingleormulticall)(int isNeedSendExitReq);
+    void   (*refreshmulticallmember)(void);
+    int    (*getisintempgroup)(void);
+    int    (*getissinglecall)(void);
+    int    (*getismulticall)(void);
+    int    (*sendTestData)(void);
+    uint64 (*getmulticallid)(void);
+    int    (*getisactivesinglecall)(void);
+    int    (*getisactivemulticall)(void);
+    int    (*getactivesingleormulticallusercount)(void);
+    void   (*getsingleormulticalluserdata)(int index,uint64* pUserId, char* pStatus, char* pUtf8Name,int utf8ByteLength);
+    void   (*getsinglegroupdata)(int groupIndex, int* pGroupId,  char* pUtf8NameBuf,int utf8NameBytesLength,int* pIsTerminalGroup,int* pIsMeCreate);
+    int    (*getcurrentgroupid)(void);
+    void   (*getcurrentgroupnamemutex)(char* pUtf8Name,int utf8BytesLength);
+    void   (*refreshgrouplist)(void);
+    int    (*getcurrentgroupmemberlistcount)(void);
+    int    (*getcurrentgrouponlinemembercount)(void);
+
+    
+    void   (*getcurrentgroupmemberuserdata)(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
+    void   (*refreshgroupmemberlist)(void);
+    int    (*getfriendmemberlistcount)(void);
+    void   (*getfriendmemberuserdata)(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+    void   (*refreshfriendmemberlist)(void);
+    void   (*getaccountnickname)(char* pUtf8Name,int utf8BytesLength);
+    int    (*getfriendisenable)(void);
+    int    (*getcurrentstate)(void);
+    void   (*updatetailkerwithuserid)(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId);
+    void   (*handlesocketpackage)(int dataBytesLength, char* pData);
+    int    (*getdeviceuserid)(void);
+    int    (*getisvoicepacket)(int dataBytesLength, char* pData);
+    int    (*getdevicevoicepriority)(void);
+    int    (*getreceivevoicepriorityafterhandlesocketpackage)(void);
+    int    (*getreceivevoicepriority)(int wParam, int dwParam);
+    void   (*uploadgpsdata)(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount);
+    int    (*islistenchannel)(int groupId);
+    void   (*addlistenchannel)(int groupId);
+    void   (*removelistenchannel)(int groupId);
+    int    (*getlistenchannelcount)(void);
+    void   (*refreshmultichannellistenlist)(void);
+    void   (*refreshalllistengroupmember)(void);
+    int    (*getonegroupmemberlistcount)(int groupId);
+    void   (*getonegroupmemberuserdata)(int groupId,int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+    void   (*refreshonegroupmember)(int groupId);
+    void   (*deleteterminalgroup)(int groupId);
+    void   (*exitterminalgroup)(int groupId);
+    void   (*addterminalgroupmember)(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+    void   (*removeterminalgroupmember)(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+    void   (*createterminalgroup)(uint64* pArrayMemberUserId,int arrayMemberUserIdCount,char* pNameUtf8Buffer);
+    void   (*requestterminalgroupname)(void);
+    int    (*getterminalgroupnamecount)(void);
+    void   (*getterminalgroupnamelistdata)(int index, char* pUtf8NameBuf,int utf8NameBufferBytesLength);
+    int    (*getisinbroadcastgroup)(void);
+    void   (*enterbroadcast)(int* pArrayGroupId,int arrayGroupIdCount);
+    void   (*exitbroadcast)(int isNeedSendExitReq);
+    void   (*resetlistenautoguardaftersetting)(void);
+    int    (*getlistenautoguardleftseconds)(void);
+
+    void   (*entrySingleOrMultiCall)(uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+    int    (*getInactiveSingleOrMultiCallUserCount)(void);
+
+    void   (*register_get_3days_weather_cb)(get_3days_weather_cb cb);
+    int    (*get_3days_weather_info)(char* pWeatherTodayUtf8Text,int weatherTodayUtf8TextBytesLength, 
+                            int* pWeatherTodayMinTemperature, int* pWeatherTodayMaxTemperature,
+                            char* pWeatherTomorrowUtf8Text,int weatherTomorrowUtf8TextBytesLength, 
+                            int* pWeatherTomorrowMinTemperature, int* pWeatherTomorrowMaxTemperature,
+                            char* pWeatherDayAfterTomorrowUtf8Text,int weatherDayAfterTomorrowUtf8TextBytesLength, 
+                            int* pWeatherDayAfterTomorrowMinTemperature, int* pWeatherDayAfterTomorrowMaxTemperature );
     #endif
 }poc_ops_t;
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)
+#if defined(BOARD_EC600MCN_LA_POC_XBND)   || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
 typedef enum
 {
        DEAL_BY_USER,
index 8050b81..3d519ef 100644 (file)
@@ -26,9 +26,24 @@ GLOBAL_INCS += sl/inc
 $(NAME)_ARCHIVES := sl/poclib.lib
 endif
 ifeq ($(CONFIG_POC_QS), y)
+GLOBAL_INCS += qs/inc 
+$(NAME)_ARCHIVES := qs/lib/poc.lib
 $(NAME)_SRCS += \
-    qs/src/poc_qs_adaper.c 
+       qs/src/poc_device.c \
+       qs/src/poc_gps.c \
+       qs/src/poc_qs_callback.c \
+       qs/src/poc_qs_adaper.c
+endif
+
+#Carlos.Meng add 2024/02/22
+ifeq ($(CONFIG_POC_QS_R07), y)
 GLOBAL_INCS += qs/inc 
+$(NAME)_ARCHIVES := qs/lib/poc.lib
+$(NAME)_SRCS += \
+       qs/src/poc_device.c \
+       qs/src/poc_gps.c \
+       qs/src/poc_qs_callback.c \
+       qs/src/poc_qs_adaper.c
 endif
 
 #Stephen.Gao add 2022/11/23
@@ -55,6 +70,14 @@ ifeq ($(CONFIG_POC_RDA_BND), y)
 GLOBAL_INCS += rda_bnd/inc rda_bnd/src
 endif
 
+ifeq ($(CONFIG_POC_RDA_BND_XIN), y)
+GLOBAL_INCS += rda_bnd_xin/inc rda_bnd_xin/src
+endif
+
+ifeq ($(CONFIG_POC_TID), y)
+GLOBAL_INCS += tid/inc tid/src
+$(NAME)_ARCHIVES :=tid/lib/libTID.lib
+endif
 
 $(NAME)_CFLAGS = \
        -Wno-error=ignored-qualifiers \
index 83264d7..058edda 100644 (file)
@@ -21,6 +21,8 @@ config POC_BND_XIN
    bool "bnd_xin platform"
 config POC_QS
    bool "poc qs platform"
+config POC_QS_R07
+   bool "poc qs asr_r07 platform"
 config POC_ZZD
    bool "poc zzd platform"
 config POC_YDWL
@@ -29,4 +31,8 @@ config POC_SLPOC
    bool "poc POC_SLPOC platform"
 config POC_RDA_BND
    bool "poc POC_RDA_BND platform"
+config POC_RDA_BND_XIN
+   bool "poc POC_RDA_BND_XIN platform"
+config POC_TID
+   bool "poc POC_TID platform"
 endchoice
index 84bf9bd..9de2196 100644 (file)
@@ -5,22 +5,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
-#if 0
-#include "ql_application.h"
-#include "ql_rtos.h"
-#include "ql_dev.h"
-#include "ql_data_call.h"
-#include "ql_sim.h"
-#include "ql_nw.h"
-#include "sockets.h"
-
-#include "ql_uart.h"
-#include "ql_gpio.h"
-#endif
+#include "ql_type.h"
 //设备型号
 #define DEVICE_MODEL    "PC01"
 typedef unsigned int                   qs_uid_t;
-typedef unsigned int                   qs_gid_t;
+typedef int                    qs_gid_t;
 typedef unsigned char                  boolean;
 
 typedef void (*join_group_cb)(char *groupname,int groupid);
@@ -31,8 +20,10 @@ typedef void(*audio_cb)(int state,int uid,char *name,int flag);
 typedef void(*callmember_cb)(int ret);
 typedef void(*error_cb)(const char* info);
 typedef void(*online_state_cb)(int ret);
-typedef void(*called_cb)(unsigned char *data);
-
+typedef void(*called_cb)(int ret);
+typedef void(*callmember_cb_t)(int ret);
+typedef void(*get_3days_weather_cb)(void);
+static volatile int mIsPttKeyDown = 0;
 
 int poc_state_transation(int state);
 
@@ -41,11 +32,6 @@ typedef enum{
     Init_Success,
 }Init_Result;
 
-typedef enum {
-    CHANGE_GROUP_LIST=1,
-    CHANGE_MEMBER_LIST,
-}Change_Type;
-
 typedef enum VOL_TYPE{
     BND_VOICE,
     BND_TTS,
@@ -86,7 +72,12 @@ typedef enum AUDIO_STATE{
     BND_REC_PLAY_START,
     BND_REC_PLAY_STOP,
 }AUDIO_STATE;
-
+typedef enum {
+    CHANGE_GROUP_LIST=1,
+    CHANGE_MEMBER_LIST,
+    UPDATE_SINGLECALL_MEMBER_LIST, 
+    UPDATE_MULTICALL_MEMBERLIST
+}Change_Type;
 typedef enum __LOCATION_TYPE_E{
        LOCATION_TYPE_GPS=0,
        LOCATION_TYPE_CELL,
@@ -97,7 +88,7 @@ typedef enum __LOCATION_TYPE_E{
 typedef struct QS_group_t
 {
        qs_uid_t                gid;            //群组ID
-       char            name[QS_NAME_LEN];              //群组�??
+       char            name[QS_NAME_LEN];
        QS_GROUP_TYPE   type;           //群组类型
        int                     index;
 } qs_group_t;
@@ -105,8 +96,8 @@ typedef struct QS_group_t
 typedef struct _qs_member_t {
        qs_uid_t uid;
        char name[QS_NAME_LEN];
-       int state; //1在线�??2,离线�??3在线在组
-       unsigned int prior;             ///< 优先�??
+       int state;
+       unsigned int prior;
        int index;
 }qs_member_t;
 
@@ -118,306 +109,139 @@ typedef enum{
     
 }qs_audio_state_t;
 
+typedef enum {
+    LEAVE_TEMP_GROUP=0,
+    ENTER_INACTIVE_TEMP_GROUP,
+    ENTER_ACTIVE_TEMP_GROUP, 
+    EXIT_ACTIVE_TEMP_GROUP
+}Called_Type;
+
 typedef void(*audio_cb)(int state,int uid,char *name,int flag);
 
-//mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
 extern volatile short mAppMobileCountryCode ;
-//mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �?? 中国移动 , 01,06 �?? 中国联�?
 extern volatile char  mAppMobileNetworkCode;
 
-// locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�??
 extern volatile int mLocationAreaCode;
 //cellTowerId;//4个字节,当前网络是中国移动或中国联通时:Cid(Cell Tower ID):基站Id
 extern volatile int mCellTowerId;
 
 typedef struct _WifiInformation {
     char            mac[6];//MAC(Medium/Media Access Control)地址,采用十六进制数表示,共六个字节(48位)
-    unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�??
+    unsigned char   rssi;
 }WifiInformation;
 
 //协议栈库的初始化
 void POC_Init(void);
 
-// 主线程,需要在里面挂起,不然程序会直接执行完成退�??
 void POC_TaskRun(void);
-//获取后台协议栈的库文件的版本号,格式是vx.xx.xx,例如v1.0.1
-//char* pProtocolVersion : 传入传出参数,获取协议栈库版本号的指�??
-//int protocolVersionByteLength : 传入参数,获取协议栈库版本号的指针所指向的内存块的字节长�??
 void POC_getProtocolVersion(char* pProtocolVersion,int protocolVersionByteLength);
-//     功能:设置登录的账号和密�??
-//               account 账号,以''\0“为结束符的字符�??
-//               password  密码,以''\0“为结束符的字符�??
-void POC_SetAccountAndPassword(const char* account, const char* password);
-//调用POC_SetAccountAndPassword,设置账号和密码后,才调用POC_Login进行登录操作
+void POC_SetAccountAndPassword(const char* account, const char* password,int aliTestServerIndex);
 void POC_Login(void);
-
-//将指定groupId的群组设置为当前群组
 void POC_setToCurrentGroup(unsigned int groupId);
-//终端主动发起单呼,建立临时群�??
-//unsigned int* memberUserId :  被叫方的用户id,从群组成员列表或者好友列表中获取用户id
-//int num �?? 数组aUserId为单�?? num为单呼人数,固定�??1�??
-void POC_startSingleCall(unsigned int* memberUserId, int num,callmember_cb cb);
-//终端主动退出单呼,退出临时群�??
-//unsigned int isNeedSendExitReq :是否需要向服务器后台发送退出请求指令,一般情况下需要向服务器后台发送退出请求指�??
-void POC_endSingleCall(unsigned int isNeedSendExitReq);
-
-//用户按下ptt键后,开始发起呼叫,如果当前没有主动建立成功单呼,或者也没有被动建立成功单呼,那么当前就在群组呼叫状态,
-//进行的是群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的单�??
+void POC_entrySingleOrMultiCall(uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+int POC_getReceiveVoicePriority(int wParam, int dwParam);
 void POC_StartPTT(void);
-
-//ptt键弹起后,开始结束呼叫,如果当前没有主动建立成功单呼,或者也没有被动建立成功单呼,那么当前就在群组呼叫状态,
-//进行的是结束群组呼叫,否则无论是主动建立成功单呼或被动建立成功单呼,当前就是进行的结束单�??
 void POC_EndPTT(void);
 //获取群组列表中群组的个数
 int POC_getGroupListCount(void);
+void POC_getSingleGroupData(int groupIndex, int* pGroupId,  char* pUtf8NameBuf,int utf8NameBytesLength,int* pIsTerminalGroup,int* pIsMeCreate);
 
-//获取单个群组的数�??
-//获取群组下标为groupIndex的群组信息,groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
-//unsigned int* pGroupId :群组的id,这个是从服务器后台获取的id数据 
-//int* pIsInTempGroup :当前是否正在进行临时群组,也就是当前在单呼状态,值为0:没有在进行临时群组;值为�??0:正在进行临时群�??,可能是主动建立成功单呼或者被动建立成功单�??
-//unsigned char* pUtf8NameBuffer : 获取返回的utf8编码的群组名称的buffer
-//int utf8NameBufferByteLength : 获取返回的utf8编码的群组名称的buffer的字节长�??
-void POC_getSingleGroupData(int groupIndex, unsigned int* pGroupId, int* pIsInTempGroup,unsigned char* pUtf8NameBuffer,int utf8NameBufferByteLength);
-//获取群组下标为groupIndex的群组成员总数,groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
-//int groupIndex :groupIndex�??0开始计数,小于POC_GroupCount群组总个�??
-//返回值:群组下标为groupIndex的群组成员总数
-int POC_getGroupMemberListCount(int groupIndex);
+//获取当前被叫单呼或被叫多呼的用户个数,如果当前是单呼,就返回被叫单呼的用户个数,否则就返回被叫多呼的用户个数,
+//建议跟POC_getSingleOrMultiCallUserData配合使用
+int POC_getInactiveSingleOrMultiCallUserCount(void);
 
 //获取好友成员总数
-int POC_getFriendMemberListCount(void);
-
-//获取当前临时群组成员的数据,目前只支�??1个成员单呼,如果POC_getIsInTempGroup返回0,说明当前没有进行临时群组,没有主动建立成功单呼�??
-//也没有被动建立成功临时群�??,这个时候,本接口不会返回数据,只有POC_getIsInTempGroup返回�??0,才会返回数�??
-//unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�??  3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
-//int memberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
-void POC_getSingleCallMemberData(unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-
-//获取群组成员下标为groupMemberIndex的群组成员的数据,groupMemberIndex�??0开始计数,小于POC_GroupMemberListCount群组成员总个数,
-//int groupMemberIndex : 群组成员下标,groupMemberIndex�??0开始计数,小于POC_GroupMemberListCount群组成员总个�??
-//unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�??3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
-//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
-void POC_getSingleGroupMemberData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-//获取好友成员下标为groupMemberIndex的好友成员的数据,groupMemberIndex�??0开始计数,小于POC_FriendMemberListCount好友成员总个数,
-//int groupMemberIndex : 好友成员下标,groupMemberIndex�??0开始计数,小于POC_FriendMemberListCount好友成员总个�??
-//unsigned int* pMemberUserId :返回的成员id,这个是从服务器后台获取的id数据 
-//char* pMemberStatus:成员状态:1离线�??  3在此群组中(在线)�?
-//unsigned char* pUtf8MemberNameBuffer �?? 获取返回的utf8编码的成员名称的buffer
-//int utf8MemberNameBufferByteLength : 获取返回的utf8编码的成员名称的buffer的字节长�??
-void POC_getSingleFriendMemberData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-
-//设置定位纬度和经度数�??
-//float latitude : 纬度, float longitude : 经度
-void POC_SetLatitudeAndLongitude(float latitude, float longitude);
-
-//获取GPS上传时间
-//返回值:返回秒数,如果返回0xFF,表示关闭GPS
-int POC_GetGpsIntervalTime(void);
-//     功能:平台返回一个或多个wifi ap信息,如果没有使用到wifi,请忽略这个接�??
-//     参数:unsigned char nWifi : wifi ap的个数,终端可以搜索到多个wifi ap,最多返�??8个,如果�??0,表示没有搜到wifi ap
-//     参数: WifiInformation **wifiInformations : 返回的wifi ap数组,如果为NULL,表示没有搜到wifi ap
-//    typedef struct _WifiInformation {
-//        char            mac[6];//MAC(Medium/Media Access Control)地址,采用十六进制数表示,共六个字节(48位)
-//        unsigned char   rssi;//wifi 信号强度,dBm的绝对值(范围0-255�??
-//    }WifiInformation;
-void POC_SetWifiInformation(unsigned char nWifiAp,WifiInformation **wifiInformations);
-//     功能:wifi上传时间间隔
-//     返回值:返回秒数
-int POC_GetWifiInformationInterval(void);
-//    功能:上传中国电信基站定位信�??
-//    参数:short mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
-//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代�??,03,05 �?? 中国电信
-//    参数:short systemId : 当前网络是中国电信时,表示SID (System ID):系统标识号
-//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�??
-//    参数:    signed long int netWorkId;// 4个字节,当前网络是中国电信时:NID (Network ID):网络标识号
-//    参数:    signed long int baseStationId;// 4个字节,当前网络是中国电信时:BID(Base Station ID): 基站�??
-void POC_SetChinaTelecom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode,short systemId, unsigned char  rssi,signed long int netWorkId,signed long int baseStationId);
-//    功能:上传中国移动或中国联通基站定位信�??
-//    参数:short mobileCountryCode : MCC  (Mobile Country Code): 国家代码,中国大陆的国家代码是 460
-//    参数:char mobileNetworkCode: MNC (Mobile Network Code): 运营商代码,00,02,07 �?? 中国移动 , 01,06 �?? 中国联�?
-//    参数:    unsigned char   rssi;//LBS信号强度,dBm的绝对值(范围0-255�??
-//    参数:    signed long int locationAreaCode;// 4个字节,当前网络是中国移动或中国联通时:LAC (Location Area Code): 小区�??
-//    参数:    signed long int cellTowerId;//4个字节,当前网络是中国移动或中国联通时:Cid(Cell Tower ID):基站Id
-void POC_SetChinaMobileOrUnicom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode, unsigned char  rssi,signed long int locationAreaCode,signed long int cellTowerId);
+int POC_GetFriendMemberListCount(void);
+void POC_GetCurrentGroupMemberUserData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
+
+
 
 //获取当前群组id,这个是从服务器后台获取的id数据 
-unsigned int POC_GetActiveGroupId(void);
+int POC_GetCurrentGroupId(void);
 
 //获取当前群组的名字,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存
 const unsigned char* POC_GetActiveGroupName(void);
 
 int POC_getDeviceUserId(void);
-//获取本机账号昵称,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
-const unsigned char* POC_GetAccountNickName(void);
+void POC_GetAccountNickName(char* pUtf8Name,int utf8BytesLength);
 
-//获取当前登录状�?
-//返回值:离线,STATE_OFFLINE 0
-//登录中:STATE_LOGINING 1
-//在线:STATE_ONLINE 2  
 int POC_GetCurrentState(void);
-
-
-//     功能:日志开�?? 日志文件�?? /data/ptt_log.txt
-//     参数�??0表示关闭日志
-//               1表示打开日志
-//void POC_SetWriteLog(int type){
-       //Log("type=%d", type);
-//     log2FileEnable = (0 == type) ? FALSE : TRUE;
-
-//}
-
-//设置当前网络类型
-//参数:type:0-2G;1-3G,2-4G
-void POC_SetNetworkType(int type);
-
-//    功能:获取对讲机是否可以使用好友功能
-//    返回值:1: 可以正常使用好友功能�??0: 不能使用好友功能
-//    备注: 好友功能禁止,用户进入好友列表,语音提醒“无法进入好友列表,网页请先勾选好友”,并且不进入好友列�??
-int POC_getIsFriendEnable(void);
-
-//     获取登录的账号名�??,以utf8编码的字符串�??
-//  unsigned char* account,用户传入的内存,获取登录的账号名称,以utf8编码的字符串
-//  unsigned int maxByteAccountName,account内存的字节长度,返回的内容不超过这个内存字节长度
-//     返回值:0成功 -1失败
 int POC_GetLoginAccount(unsigned char* account, unsigned int maxByteAccountName);
-
-//设置当前登录状�?
-//返回值:离线,STATE_OFFLINE 0
-//登录中:STATE_LOGINING 1
-//在线:STATE_ONLINE 2  
 void POC_SetCurrentState(int state);
 
-//获取临时群组对方名称,也就是单呼时对方的名称,最大长�??20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
-unsigned char* POC_GetSingleCallOtherSideName(void);
-
 //当前是否正在播放来话语音数据
 unsigned int POC_GetIsPlayingAudio(void);
 
 //当前是否正在录音
 unsigned int POC_GetIsRecordingAudio(void);
-
-//获取对讲机是否有单呼功能,这个是从服务器后台获取的数�??
 int POC_getIsSingleCallEnable(void);
-//获取是否已从服务器后台获取日期时间,并且已经将获取到的日期时间,设置为系统日期时�??
-//返回值非0 :已从服务器后台获取日期时间,并且已经将获取到的日期时间,设置为系统日期时间
-//返回�??0:没有从服务器后台获取到日期时间,并且也没有将获取到的日期时间,设置为系统日期时�??
-int POC_getIsSetSystemTimeFromServer(void);
-//获取对讲机是否有定位功能,这个是从服务器后台获取的数�??
+
+
 int POC_getIsGpsEnable(void);
-//获取本机的通话等级,是否比正在接收语音的用户的通话等级高,
-//返回值非0 :本机的通话等级比正在接收语音的用户的通话等级�??
-//返回�??0:本机的通话等级,小于或者等于正在接收语音的用户的通话等级
-int POC_getIsVoicePriorityHigh(void);
-//清除协议栈库中保存在本地的登录账号和密码
-void POC_cleanSavedAccountAndPassword(void);
-//获取当前是否是账号或密码错误
-//返回值非0 :当前是账号或密码错�??
-//返回�??0:当前没有账号或密码错误
+
 int POC_getLoginFailAccountOrPassword(void);
-//获取当前是否是设备已暂停
-//返回值非0 :当前设备已暂停
-//返回�??0:当前没有设备已暂停
+
 int POC_getIsDevicePaused(void);
 
-//获取当前是否正在从服务器后台接收语音数据�??
-//返回值非0 :当前正在从服务器后台接收语音数据包
-//返回�??0:当前没有从服务器后台接收语音数据包
-unsigned char POC_GetIsReceivingAudioFrame(void);
-//发起从服务器后台获取群组列表数据的请�??
+
 void POC_refreshGroupList(void);
 
-//发起从服务器后台获取当前群组成员数据的请�??
+
 void POC_refreshGroupMemberList(void);
-//发起从服务器后台获取当前好友成员数据的请�??
+
 void POC_refreshFriendMemberList(void);
-//获取协议栈库中保存的ptt是否按下的状态数�??
-//返回值非0 :协议栈库中保存的ptt已经按下
-//返回�??0:协议栈库中保存的ptt没有按下
+
 int POC_getIsPttPressed(void);
-//设置协议栈库中保存的ptt是否按下的状态数�??
-//int isPressed :�??0 :设置协议栈库中保存的ptt已经按下
-//0:设置协议栈库中保存的ptt没有按下
+
 void POC_setIsPttPressed(int isPressed);
-//获取当前是否正在提示''未设置账号和密码''
-//返回值非0 :当前正在提�??''未设置账号和密码''
-//返回�??0:当前没有正在提�??''未设置账号和密码''
+
 int POC_getIsNoUserNameOrPassword(void);
-//获取当前是否正在提示''账号或密码不正确''
-//返回值非0 :当前正在提�??''账号或密码不正确''
-//返回�??0:当前没有正在提�??''账号或密码不正确''
+
 int POC_getIsLoginUserNameOrPasswordWrong(void);
 
-//boolean POC_getWriteLogToFileState(void){
-//     return log2FileEnable;
-//}
-//根据groupMemberId获取这个成员的名称,以utf8编码的字符串,这个是从服务器后台获取的数�?? 
-//unsigned int groupMemberId �?? 是群组成员的id,或者是好友成员的id,这个是从POC_getTempGroupMemberData,POC_getSingleGroupMemberData,POC_getSingleFriendMemberData,其中之一获取到MemberUserId
-//char* pUserNameUft8:获取返回的utf8编码的成员名称的buffer
-//int userNameUtf8ByteLength :获取返回的utf8编码的成员名称的buffer的字节长�??
-void POC_updateTailkerWithUserId(unsigned int groupMemberId,char* pUserNameUtf8,int userNameUtf8ByteLength);
-//获取当前是否正在临时群组,是否正在单�??
-//返回值非0 :当前正在临时群组,也就是正在单�??
-//返回�??0:当前没有正在临时群组,也就是没有正在单�??
-int POC_getIsInSingleCall(void);
-//设置协议栈库中的终端序列�??
-//char *pSource : 传入的系统序列号
-//int pSourceByteLength :传入的系统序列号的字节长度
+
+void POC_updateTailkerWithUserId(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId);
+
 void POC_setSystemSerialNumber(char *pSource,int pSourceByteLength);
-//设置协议栈库中的IMEI
-//char *pSource : 传入的系统IMEI
-//int pSourceByteLength :传入的系统IMEI的字节长�??
+
 void POC_setSystemSystemIMEI(char *pSource,int pSourceByteLength);
-//设置协议栈库中的IMSI
-//char *pSource : 传入的系统IMSI
-//int pSourceByteLength :传入的系统IMSI的字节长�??
+
 void POC_setSystemSystemImsi(char *pSource,int pSourceByteLength);
-//设置协议栈库中的Iccid
-//char *pSource : 传入的系统Iccid
-//int pSourceByteLength :传入的系统Iccid的字节长�??
+
 void POC_setSystemSystemIccid(char *pSource,int pSourceByteLength);
 //获取socket的端口号
 unsigned short POC_getSocketIpPort(void);
-//获取socket的ip地址
-//char* pResult : 获取返回的ip地址的buffer
-//int resultByteLength:获取返回的ip地址的buffer的字节长�??
+
 void POC_getSocketIp(char* pResult,int resultByteLength);
 //获取协议栈库中的保存接收到socket数据的buffer,这块内存是由协议栈来维护,调用者不需释放这块内存
 unsigned char* POC_getReceiveSocketDataBufferPointer(void);
-//获取协议栈库中的保存接收到socket数据的buffer的字节长�??,这块内存是由协议栈来维护,调用者不需释放这块内存
+
 unsigned int POC_getReceiveSocketDataBufferByteLength(void);
-//获取是否有其他终端,以本机的账号和密码登录到服务器后�??
-//返回值非0 :已经有其他终端,以本机的账号和密码登录到服务器后台
-//返回�??0:没有其他终端,以本机的账号和密码登录到服务器后�??
+
 int POC_getIsOtherDeviceLoginWithSameAccount(void);
 //发送录音语音数据包
 void POC_SendMListData(char* pAmrData,int amrDataLength);
 //一次性发送心跳包
 void POC_SendHeartPackageWithoutTimer(void);
-//协议栈库处理收到的socket数据�??
-void POC_handleSocketPackage(int wParam, int dwParam);
-//停止获取登录ip和端口的定时�??
+//协议栈库处理收到的socket数据包
+//int dataBytesLength:socket数据包的字节长度
+//char* pData:socket数据包的地址指针
+void POC_handleSocketPackage(int dataBytesLength, char* pData);
+
 void POC_stopGetIpAndPortProcessTimer(void);
-//开始发送登录请�??
+
 void POC_startSetUpUdpConnect(void);
 //在恢复出厂值过程中,删掉协议栈的产生的文件
 void POC_clearProtocolDataForFactory(void);
-//向服务器后台发送退出登录请�??
+
 void POC_sendLogOutRequest(void);
 //设置登录成功后是否播放登录成功的tts,此接口只是修改内部变量,没有保存到nv
 void POC_setLoginSuccessTts(unsigned char b);
 //获取当前是否在获取登录的ip地址和端口号的过程中,返回值非0,当前正在获取登录的ip地址和端口号的过程中;返回值为0,当前没有在获取登录的ip地址和端口号的过程中
 int POC_getIsInGetIpAndPortProcess(void);
-//屏幕由灭屏状态,用户任意键后,屏幕变换为点亮状�?
+
 void POC_onScreenFromClosedToOpened(void);
-//终端是被叫单呼,并且已经建立单呼成功后,协议栈库会回调这个接口,终端在回调中,去更新主叫单呼的名�??
-//unsigned char *otherSideName : 临时群组对方名称,也就是单呼时对方的名称,最大长�??20 * 2字节,以utf8编码的字符串,这块内存是由协议栈来维护,调用者不需释放这块内存,这个是从服务器后台获取的数�?? 
-void Device_AfterInactiveSingleCall(unsigned char *otherSideName);
-//打印版本的编译时间,ota升级时,会使用编译时间这个数�??
 void POC_printfOTABuildTime(void);
-//根据输入的日期时间,获取时间�??
 unsigned int POC_getUTCSeconds(        unsigned int nYear,unsigned int nMonth ,unsigned int nDay,unsigned int nHour,unsigned int nMin,unsigned int nSec);
 
 void POC_register_join_group_cb(join_group_cb callback_cb );
@@ -429,6 +253,7 @@ void POC_register_error_cb(error_cb cb);
 
 void POC_register_online_state_cb(online_state_cb cb );
 void POC_register_called_cb(called_cb cb);
+void POC_register_get_3days_weather_cb(get_3days_weather_cb callback_cb );
 
 int poc_state_transation(int state);
 void POC_set_ptt_status(int status);
@@ -438,7 +263,7 @@ int Device_getIsSupportGps(void);
 int Device_getIsSupportWifi(void);
 void Device_open_gps(void);
 void Device_close_gps(void);
-void Device_upload_gps_data(double longitude,double latitude,double accuracy);
+void Device_upload_gps_data(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount);
 int Device_getGpsSettingValue(void);
 void Device_changeGpsSetting(int value);
 void Device_PlayTts_request_location_permission(void);
@@ -452,10 +277,26 @@ void Device_uploadWifiData(char* pLocationWifiMac32bytesArray,int locationWifiMa
        int* pLocationWifiRssiArray,int locationWifiRssiArrayBytesLength,
        int locationWifiMacCount);
 void Device_restartHeartTimerAndSendHeartPackage(void);
+int Device_getIsSupportWeather(void);
+void Device_setIsSupportWeather(int is_enable);
+
+void POC_sendAddressRequest(void);
+int POC_getAddressData(char* pWeatherUtf8Text,int weatherUtf8TextBytesLength);
+int POC_GetWeatherUtf8DataTodayTomorrowDayAfterTomorrow( char* pWeatherTodayUtf8Text,int weatherTodayUtf8TextBytesLength, 
+                                                        int* pWeatherTodayMinTemperature, int* pWeatherTodayMaxTemperature,
+                                                        char* pWeatherTomorrowUtf8Text,int weatherTomorrowUtf8TextBytesLength, 
+                                                        int* pWeatherTomorrowMinTemperature, int* pWeatherTomorrowMaxTemperature,
+                                                        char* pWeatherDayAfterTomorrowUtf8Text,int weatherDayAfterTomorrowUtf8TextBytesLength, 
+                                                        int* pWeatherDayAfterTomorrowMinTemperature, int* pWeatherDayAfterTomorrowMaxTemperature );
 
 void Device_PTTtone_switch(int onoff);
 void Device_PTTtone_play(void);
 int Device_PTTtone_CodecGain(float dB);
+void POC_checkUpdateWeatherForecastIfNeed(void);
+int POC_GetWeatherForecastDataUtf8(int* pWeatherTemperature,char* pWeatherTextUtf8,int weatherTextUtf8BytesLength,
+       char* pWeatherWindDirectionUtf8,int weatherWindDirectionUtf8BytesLength,char* pWeatherWindClassUtf8,int weatherWindClassUtf8BytesLength,
+       char* pWeatherUtf8City,int weatherUtf8CityBytesLength);
+
    
 void Device_quec_set_location_support_type(LOCATION_TYPE location_type,int is_enable);
 void py_qs_poc_init(init_cb cb);
@@ -481,6 +322,7 @@ void py_qs_poc_register_listupdate_cb(listupdate_cb cb);
 void py_qs_poc_register_error_cb(error_cb cb);
 void py_qs_poc_register_online_state_cb(online_state_cb cb);
 void py_qs_poc_register_called_cb(called_cb cb);
+void py_qs_poc_register_get_3days_weather_cb(get_3days_weather_cb cb);
 int py_qs_poc_get_isenable_single_call(void);
 int py_qs_poc_get_isenable_gprs(void);
 int py_qs_poc_get_ishigth_prio(void);
@@ -498,7 +340,7 @@ int   py_qs_poc_get_is_support_gps(void);
 int   py_qs_poc_get_is_support_wifi(void);
 void  py_qs_poc_open_gps(void);
 void  py_qs_poc_close_gps(void);
-void  py_qs_poc_upload_gps_data(double longitude,double latitude,double accuracy);
+void  py_qs_poc_upload_gps_data(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount);
 int   py_qs_poc_get_gps_set_value(void);
 void  py_qs_poc_set_gps_value(int value);
 void  py_qs_poc_play_tts_request_location_permission(void);
@@ -511,4 +353,340 @@ void  py_qs_poc_pttTone_Switch(int onoff);
 void  py_qs_poc_pttTone_play(void);
 int  py_qs_poc_pttTone_CodecGain(float dB);
 void  py_qs_poc_set_dev_location_type(LOCATION_TYPE location_type,int is_enable);
+int py_qs_poc_get_is_device_paused(void);
+int py_qs_poc_get_dev_recording_status(void);
+int py_qs_poc_get_dev_playing_status(void);
+void py_qs_poc_checkUpdateWeatherForecastIfNeed(void);
+int py_qs_poc_GetWeatherForecastDataUtf8(int* pWeatherTemperature,char* pWeatherTextUtf8,int weatherTextUtf8BytesLength,
+       char* pWeatherWindDirectionUtf8,int weatherWindDirectionUtf8BytesLength,char* pWeatherWindClassUtf8,int weatherWindClassUtf8BytesLength,
+       char* pWeatherUtf8City,int weatherUtf8CityBytesLength);
+int py_qs_poc_getIsSupportWeather(void);
+void py_qs_poc_setIsSupportWeather(int is_enable);
+void py_qs_poc_sendAddressRequest(void);
+int py_qs_poc_getAddressData(char* pWeatherUtf8Text,int weatherUtf8TextBytesLength);
+
+//2.0
+void py_qs_poc_taskrun(void);
+void py_qs_poc_setaccountandpassword(const char* account, const char* password,int aliTestServerIndex);
+void py_qs_poc_entrysingleormulticall(uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+void py_qs_poc_exitsingleormulticall(int isNeedSendExitReq);
+void py_qs_poc_refreshmulticallmember(void);
+int py_qs_poc_getisintempgroup(void);
+int py_qs_poc_getissinglecall(void);
+int py_qs_poc_getismulticall(void);
+uint64 py_qs_poc_getmulticallid(void);
+int py_qs_poc_getisactivesinglecall(void);
+int py_qs_poc_getisactivemulticall(void);
+int py_qs_poc_getactivesingleormulticallusercount(void);
+void py_qs_poc_getsingleormulticalluserdata(int index,uint64* pUserId, char* pStatus, char* pUtf8Name,int utf8ByteLength);
+void py_qs_poc_getsinglegroupdata(int groupIndex, int* pGroupId,  char* pUtf8NameBuf,int utf8NameBytesLength,int* pIsTerminalGroup,int* pIsMeCreate);
+int py_qs_poc_getcurrentgroupid(void);
+void py_qs_poc_getcurrentgroupnamemutex(char* pUtf8Name,int utf8BytesLength);
+void py_qs_poc_refreshgrouplist(void);
+int py_qs_poc_getcurrentgroupmemberlistcount(void);
+int py_qs_poc_getcurrentgrouponlinemembercount(void);
+void py_qs_poc_getcurrentgroupmemberuserdata(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
+void py_qs_poc_refreshgroupmemberlist(void);
+int py_qs_poc_getfriendmemberlistcount(void);
+void py_qs_poc_getfriendmemberuserdata(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+void py_qs_poc_refreshfriendmemberlist(void);
+void py_qs_poc_getaccountnickname(char* pUtf8Name,int utf8BytesLength);
+int py_qs_poc_getfriendisenable(void);
+int py_qs_poc_getcurrentstate(void);
+void py_qs_poc_updatetailkerwithuserid(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId);
+void py_qs_poc_handlesocketpackage(int dataBytesLength, char* pData);
+int py_qs_poc_getdeviceuserid(void);
+int py_qs_poc_getisvoicepacket(int dataBytesLength, char* pData);
+int py_qs_poc_getdevicevoicepriority(void);
+int py_qs_poc_getreceivevoicepriorityafterhandlesocketpackage(void);
+int py_qs_poc_getreceivevoicepriority(int wParam, int dwParam);
+void py_qs_poc_uploadgpsdata(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount);
+int py_qs_poc_islistenchannel(int groupId);
+void py_qs_poc_addlistenchannel(int groupId);
+void py_qs_poc_removelistenchannel(int groupId);
+int py_qs_poc_getlistenchannelcount(void);
+void py_qs_poc_refreshmultichannellistenlist(void);
+void py_qs_poc_refreshalllistengroupmember(void);
+int py_qs_poc_getonegroupmemberlistcount(int groupId);
+void py_qs_poc_getonegroupmemberuserdata(int groupId,int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+void py_qs_poc_refreshonegroupmember(int groupId);
+void py_qs_poc_deleteterminalgroup(int groupId);
+void py_qs_poc_exitterminalgroup(int groupId);
+void py_qs_poc_addterminalgroupmember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+void py_qs_poc_removeterminalgroupmember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+void py_qs_poc_createterminalgroup(uint64* pArrayMemberUserId,int arrayMemberUserIdCount,char* pNameUtf8Buffer);
+void py_qs_poc_requestterminalgroupname(void);
+int py_qs_poc_getterminalgroupnamecount(void);
+void py_qs_poc_getterminalgroupnamelistdata(int index, char* pUtf8NameBuf,int utf8NameBufferBytesLength);
+int py_qs_poc_getisinbroadcastgroup(void);
+void py_qs_poc_enterbroadcast(int* pArrayGroupId,int arrayGroupIdCount);
+void py_qs_poc_exitbroadcast(int isNeedSendExitReq);
+void py_qs_poc_resetlistenautoguardaftersetting(void);
+int py_qs_poc_getlistenautoguardleftseconds(void);
+int py_qs_poc_getinactivesingleormulticallusercount(void);
+int py_qs_poc_get3daysWeather(char* pWeatherTodayUtf8Text,int weatherTodayUtf8TextBytesLength, 
+                                int* pWeatherTodayMinTemperature, int* pWeatherTodayMaxTemperature,
+                                char* pWeatherTomorrowUtf8Text,int weatherTomorrowUtf8TextBytesLength, 
+                                int* pWeatherTomorrowMinTemperature, int* pWeatherTomorrowMaxTemperature,
+                                char* pWeatherDayAfterTomorrowUtf8Text,int weatherDayAfterTomorrowUtf8TextBytesLength, 
+                                int* pWeatherDayAfterTomorrowMinTemperature, int* pWeatherDayAfterTomorrowMaxTemperature );
+//2.0
+//退出广播
+//int isNeedSendExitReq :是否需要向泊舟后台发送退出广播请求指令,一般情况下需要向服务器后台发送退出请求指令
+//0 == isNeedSendExitReq:不需要向泊舟后台发送退出广播请求指令
+//1 == isNeedSendExitReq:需要向泊舟后台发送退出广播请求指令
+//协议栈lib库,回调这个函数Device_UI_ExitEnterBroadcastGroup(int isNeedTtsExitTempGroup ),通知ui退出广播,int isNeedTtsExitTempGroup: 值为1,需要tts语音播放,中文"退出广播",英文“quit broadcasting”;值为0,不需tts语音播放
+void POC_ExitBroadcast(int isNeedSendExitReq);
+//1.在用户开启或关闭监听自动守候后,app需要调用这个接口,来重置一些内部状态变量
+//2.在用户更改守候时间(15秒/30秒/60秒),只要用户更改后,app需要调用这个接口,来重置一些内部状态变量
+void POC_resetListenAutoGuardAfterSetting(void);
+//中文提示,“监听自动守候剩xx秒”;英文提示,“xx seconds left for monitoring automatic waiting",其中,xx是剩余的秒数
+//app通过这个接口,来获取监听自动守候的剩余秒数,如果为0,就不用显示了;
+//如果当前正“本机正在讲话”,或者正在接收来话,就不显示监听自动守候的剩余秒数,只有空闲时,才显示监听自动守候的剩余秒数
+int POC_getListenAutoGuardLeftSeconds(void);
+//从泊舟后台获取到天气预报或我的位置信息后,协议栈lib库会回调此接口
+void Device_AfterGetWeatherForecastData(void);
+//向泊舟后台请求,进入广播状态
+//int* pArrayGroupId:请求进入广播状态的多个群组id数组,只有包含在这个数组中的群组成员,并且以这些群组中的某一个作为当前群组,才会收到广播,
+//比如群组A,如果终端B的当前群组是群组A,终端B才会收到广播,
+//也就是广播,只向以这些群组为当前群组的终端发送出去
+//int arrayGroupIdCount : 请求进入广播状态的多个群组id数组个数
+//进入广播的结果,是通过协议栈lib库,回调Device_UI_UpdateEnterBroadcastGroup(int isSuccess),通知成功或失败
+void POC_EnterBroadcast(int* pArrayGroupId,int arrayGroupIdCount);
+
+//获取当前是否正处在广播状态,值为1,当前正处在广播状态;值为0,当前没有在广播状态
+int POC_getIsInBroadcastGroup(void);
+
+//获取某个终端群组名称
+//int index:终端群组名称的索引值,从0开始,小于 POC_GetTerminalGroupNameCount
+//char* pUtf8NameBuf:以utf8格式编码的终端群组名称
+//int utf8NameBufferBytesLength:以utf8格式编码的终端群组名称的字节长度
+void POC_GetTerminalGroupNameListData(int index, char* pUtf8NameBuf,int utf8NameBufferBytesLength);
+
+//从泊舟后台,获取到推荐的终端群组名称总数
+int POC_GetTerminalGroupNameCount(void);
+//向泊舟后台发起请求,请求获取推荐的终端群组名称列表
+void POC_requestTerminalGroupName(void);
+// 创建终端群组的成员个数,建议不超过100个
+//uint64* pArrayMemberUserId:删除的群组成员id数组,建议不超过100个
+//int arrayMemberUserIdCount:删除的群组成员个数,建议不超过100个
+//char* pNameUtf8Buffer:以utf8格式编码的终端群组名称,先向泊舟后台发起请求POC_requestTerminalGroupName,然后POC_GetTerminalGroupNameCount,获取总数,
+//再从每个POC_GetTerminalGroupNameListData中选择,要求选择的名称,在界面上不能显示为乱码,比如包含一个或多个"?"
+void POC_createTerminalGroup(uint64* pArrayMemberUserId,int arrayMemberUserIdCount,char* pNameUtf8Buffer);
+
+//本机是这个终端群组的创建者,才能移除终端群组成员,判断方式是从POC_getSingleGroupData,获取的数据pIsTerminalGroup和pIsMeCreate来判断
+//int groupId:要删除成员的终端群组id
+//uint64* pArrayMemberUserId:删除的群组成员id数组,建议不超过100个
+//int arrayMemberUserIdCount:删除的群组成员个数,建议不超过100个
+void POC_removeTerminalGroupMember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+//本机是这个终端群组的创建者,才能加入终端群组成员,判断方式是从POC_getSingleGroupData,获取的数据pIsTerminalGroup和pIsMeCreate来判断
+//int groupId:要增加成员的终端群组id
+//uint64* pArrayMemberUserId:增加的群组成员id数组,建议不超过100个
+//int arrayMemberUserIdCount:增加的群组成员个数,建议不超过100个
+void POC_addTerminalGroupMember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+
+//本机不是这个终端群组的创建者,本机只能退出终端群组,判断方式是从POC_getSingleGroupData,获取的数据pIsTerminalGroup和pIsMeCreate来判断
+void POC_exitTerminalGroup(int groupId);
+//本机是这个终端群组的创建者,才能删除这个终端群组,判断方式是从POC_getSingleGroupData,获取的数据pIsTerminalGroup和pIsMeCreate来判断
+void POC_deleteTerminalGroup(int groupId);
+//从泊舟后台获取指定群组id的群组成员数据,建议每隔6秒更新一次,不能太频繁更新
+void POC_refreshOneGroupMember(int groupId);
+
+//根据群组id,和成员索引,获取这个群组的某个成员数据
+//int groupId:群组id
+//int userIndex:成员索引值,从0开始,小于总数POC_GetOneGroupMemberListCount
+//uint64* pUserId:获取的成员id
+//char* pStatus:成员状态:1离线, 2在线(不在此群组中), 3在此群组中(在线)。
+//char* pUtf8Name:以utf8格式编码的成员名称
+//int utf8ByteLength:以utf8格式编码的成员名称的字节长度
+void POC_GetOneGroupMemberUserData(int groupId,int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+
+//根据群组id,获取这个群组的成员总数
+int POC_GetOneGroupMemberListCount(int groupId);
+//从泊舟后台获取已经进行监听的所有群组成员数据,建议每隔6秒更新一次,不能太频繁更新
+void POC_refreshAllListenGroupMember(void);
+//最多监听频道的个数是10个
+int POC_getListenChannelCount(void);
+//根据群组id,将某个群组,移除出监听频道,也就是设置这个群组为非监听频道,取消监听
+void POC_removeListenChannel(int groupId);
+
+//根据群组id,将某个群组,添加进监听频道,也就是设置这个群组为监听频道
+//最多监听频道的个数是10个
+void POC_addListenChannel(int groupId);
+//根据群组id,获取这个群组是否是已经被监听,
+//返回值1,这个群组已经被监听
+//返回值0,这个群组没有被监听
+int POC_isListenChannel(int groupId);
+//从gps模块获取到gps数据后上传到上层
+//double longitude:经度数据
+//double latitude:纬度数据
+//char latitudeDirection:纬度半球,'N'或'S',如果没有获取到,就传入0
+//char longitudeDirection:经度半球,'E'或'W',如果没有获取到,就传入0
+//double precision : 精度,m,以米为单位,如果没有获取到,就传入0
+//int gpsCount:搜索到的gps卫星数量,如果没有获取到,就传入0
+void POC_uploadGpsData(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount);
+
+// //获取正在接收语音的用户优先级
+// int POC_getReceiveVoicePriority(int wParam, int dwParam);
+
+//获取当前数据包是否是语音包
+//int dataBytesLength:数据包的字节长度
+//char* pData:数据包的地址指针
+int POC_getIsVoicePacket(int dataBytesLength, char* pData);
+
+//获取当前群组成员,正处在当前群组,并且在线的成员个数,排除掉不处在当前群组并且在线的情况
+int POC_GetCurrentGroupOnlineMemberCount(void);
+
+//char* pUtf8Name:以utf8编码的当前群组名称
+//int utf8BytesLength:以utf8编码的当前群组名称的buffer的字节长度
+void POC_GetCurrentGroupNameMutex(char* pUtf8Name,int utf8BytesLength);
+
+//根据索引值index,获取单呼或多呼的成员信息,
+//uint64* pUserId:成员的用户id
+//char* pStatus:成员的状态信息,成员状态:1离线, 2在线(不在此群组中), 3在此群组中(在线),4.正在多呼中,并且在线。5.等待对方应答多呼(同意或拒绝)
+//char* pUtf8Name:以utf8格式编码的对方名称,最大长度40字节
+//int utf8ByteLength :pUtf8Name的字节长度
+void POC_getSingleOrMultiCallUserData(int index,uint64* pUserId, char* pStatus, char* pUtf8Name,int utf8ByteLength);
+//获取当前主叫单呼或主叫多呼的用户个数,如果当前是单呼状态,就返回主叫单呼的用户个数,否则就返回主叫多呼的用户个数
+int POC_getActiveSingleOrMultiCallUserCount(void);
+//获取当前是否是主叫多呼,如果当前是主叫多呼,就返回1,否则,就返回0
+int POC_getIsActiveMultiCall(void);
+//获取当前是否是主叫单呼,如果当前是主叫单呼,就返回1,否则,就返回0
+int POC_getIsActiveSingleCall(void);
+//获取当前多呼id,如果当前已经建立多呼,那么返回多呼id(非0值),建议跟POC_getIsMultiCall配合使用
+uint64 POC_getMultiCallId(void);
+
+//如果当前处于多呼状态,就返回1,否则,就返回0
+int POC_getIsMultiCall(void);
+
+//单呼或者多呼都属于临时群组,如果正处在单呼,或者正处在多呼,就返回1;
+//如果当前不是正在单呼,并且也不是正在多呼,就返回0
+int POC_getIsInTempGroup(void);
+//从泊舟后台获取多呼成员列表数据,建议每隔6秒更新一次,不能太频繁更新
+void POC_refreshMulticallMember(void);
+//终端主动退出单呼或多呼,也就是退出临时群组
+//int isNeedSendExitReq :是否需要向泊舟后台发送退出多呼请求指令,一般情况下需要向服务器后台发送退出请求指令
+//0 == isNeedSendExitReq:不需要向泊舟后台发送退出多呼请求指令
+//1 == isNeedSendExitReq:需要向泊舟后台发送退出多呼请求指令
+void POC_exitSingleOrMultiCall(int isNeedSendExitReq);
+
+/********************************************************
+    函数:boolean POC_getFriendIsEnable(void)
+    功能:获取对讲机是否可以使用好友功能
+    参数:无
+    返回值:1: 可以正常使用好友功能;0: 不能使用好友功能
+    备注: 好友功能禁止,用户进入好友列表,语音提醒“无法进入好友列表,网页请先勾选好友”,
+        并且不进入好友列表,在两个入口都需要添加,
+        a,在待机界面按向下方向键,进入好友列表;
+        b,主菜单-》好友列表,进入好友列表
+*********************************************************/
+int POC_getFriendIsEnable(void);
+
+//如果当前处于单呼状态,就返回1,否则,就返回0
+int POC_getIsSingleCall(void);
+
+//获取当前来话的来话者的优先级
+int POC_getReceiveVoicePriorityAfterHandleSocketPackage(void);
+
+//获取本机的优先级
+int POC_getDeviceVoicePriority(void);
+
+//获取好友成员下标为userIndex的好友成员的数据,
+//int userIndex : 好友成员下标,userIndex从0开始计数,小于POC_GetFriendMemberListCount好友成员总个数
+//uint64* pUserId :返回的成员id,这个是从服务器后台获取的id数据 
+//char* pStatus:成员状态:1离线, 2在线(不在此群组中), 3在此群组中(在线)。
+//char* pUtf8Name : 获取返回的utf8编码的成员名称的buffer
+//int utf8ByteLength : 获取返回的utf8编码的成员名称的buffer的字节长度
+void POC_GetFriendMemberUserData(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+
+void POC_entrySingleOrMultiCall_cb(unsigned int* memberUserId, int num,callmember_cb cb);
+
+int POC_GetCurrentGroupMemberListCount(void);
+//从泊舟后台获取多频道监听列表数据,建议每隔6秒更新一次,不能太频繁更新
+void POC_refreshMultiChannelListenList(void);
+//上传获取wifi mac地址和信号数据,仅在硬件上支持扫描wifi时,才使用到这个接口
+//pLocationWifiMac32bytesArray,是一个[6][32]的二维数组
+//locationWifiMac32bytesArrayBytesLength,是这个二维数组的字节长度,比如有6个元素,每个元素32字节,则为6*32
+//pLocationWifiRssiArray,是一个最多6个int的一维数组
+//locationWifiRssiArrayBytesLength.是pLocationWifiRssiArray的字节长度,比如有6个int,则为6* 4
+//locationWifiMacCount:总共扫描到多少个wifi mac地址,最多6个
+void POC_uploadWifiData(char* pLocationWifiMac32bytesArray,int locationWifiMac32bytesArrayBytesLength,
+       int* pLocationWifiRssiArray,int locationWifiRssiArrayBytesLength,
+       int locationWifiMacCount);
+// 新增
+//在上层,用户更改了定位设置后,需要立即调用POC_changeGpsSetting,以便让这些设置立即生效
+void POC_changeGpsSetting(int gpsSettingValue);
+
+void POC_checkDmUploadIfNeed();
+void TimerCallback_dmOneHourTimer();
+void TimerCallback_dmRtcOneHourTimer();
+void TimerCallback_dmRetryTimer();
+void TimerCallback_dmRetryRTCEvent();
+void TimerCallback_GetGpsTimeoutTimerCallback();
+void TimerCallback_UploadGpsTimerCallback();
+void TimerCallback_onceGetGpsTimerCallback();
+void bzfota_EventStartTimer();
+void bzfota_CheckFOTAPermission() ;
+void bzfota_GetFOTAPackageURL() ;
+void bzfota_DoFOTAUpgrade();
+void bzfota_quit() ;
+void POC_initDmHttp();
+void POC_sendDmHttp(int needRestartTimer);
+//设置当前是否正在录音,0 : 当前没有录音;1: 当前正在录音
+void POC_SetIsRecordingAudio(int i);
+
+void TimerCallback_BroadcastGroupStateCheckWhenLoginTimerCallback(void);
+void TimerCallback_EnterBroadcastGroupNotResponsedTimerCallback(void);
+void TimerCallback_CheckIsLeaveExitBroadcastGroupTimerCallback(void);
+void TimerCallback_BroadcastGroupNopTimerCallback(void);
+void TimerCallback_PocFriendMemberDownloadTimerCallback(void);
+void TimerCallback_DownLoadGroupListTimerCallback(void);
+void TimerCallback_PocGroupMemberDownloadTimerCallback(void);
+void TimerCallback_RtcHeartTimerCallback(void);
+void TimerCallback_LoginTimerCallback(void);
+void TimerCallback_SingleCallStateCheckWhenLoginTimerCallback(void);
+void TimerCallback_userNameOrPasswordWrongTimerCallback(void);
+void TimerCallback_NoUserNamePasswordTimerCallback(void);
+void TimerCallback_LoginAccountPausedTimerCallback(void);
+void TimerCallback_loginNeedRechargeTimerCallback(void);
+void TimerCallback_LoginIllegalAccountTimerCallback(void);
+void TimerCallback_MultiCallStateCheckWhenLoginTimerCallback(void);
+void TimerCallback_DownloadListenMemberTimerCallback(void);
+void TimerCallback_DownLoadMultiChannelListenTimerCallback(void);
+void TimerCallback_DownloadMulticallMemberTimerCallback(void);
+void TimerCallback_UpdateMulticallMemberTimerCallback(void);
+void TimerCallback_InviteMultiCallNotResponsedTimerCallback(void);
+void TimerCallback_CheckIsActiveLeaveMultiCallTimerCallback(void);
+void TimerCallback_MulticallNopTimerCallback(void);
+void TimerCallback_DownloadOneMemberTimerCallback(void);
+void TimerCallback_InviteSingleCallNotResponsedTimer(void);
+void TimerCallback_CheckIsActiveLeaveSingleCallTimerCallback(void);
+void TimerCallback_SinglecallNopTimerCallback(void);
+void TimerCallback_userOrPasswordFailNotifyTimerCallback(void);
+void TimerCallback_DelaySendendflagpakTimerCallback(void);
+void TimerCallback_Helper_BeepToStopRecTimerCallback(void);
+void TimerCallback_AfterExitTempGroupDelayStopRecordTimerCallback(void);
+void TimerCallback_needRechargeNotifyTimerCallback(void);
+void TimerCallback_AddTerminalGroupMemberCallback(void);
+void TimerCallback_RemoveTerminalGroupMemberCallback(void);
+void TimerCallback_CreateTerminalGroupMemberCallback(void);
+void TimerCallback_ReceiveVoiceEndTimer(void);
+void TimerCallback_NetworkIsNotAvailableOrSimIsArrearageTimerCallback(void);
+void TimerCallback_GroupPausedNotifyTimerCallback(void);
+void TimerCallback_DevicePausedNotifyTimerCallback(void);
+void TimerCallback_otherDeviceLoginNotifyTimerCallback(void);
+void TimerCallback_PocTestCallback(void);
+// callback deal
+// void get_device_info(void);
+// int get_state(int state);
+// void deal_login_cb(void);
+// void deal_join_group_cb(void);
+// void deal_updatelist_cb(Change_Type update_type);
+// void deal_audio_cb(int state,int uid,char *name,int flag);
+// void deal_init_cb(Init_Result init_state);
+// void deal_error_cb(const char* info);
+// void deal_call_cb( int result );
+// void deal_on_or_offline(int ret );
+// void deal_called_cb(int ret);
+// void deal_get_3days_weather_cb(void);
 #endif
index 8edca1b..d0dabb5 100644 (file)
@@ -82,11 +82,12 @@ void POC_getProtocolVersion(char* pProtocolVersion,int protocolVersionByteLength
 * Parameters:
 *      account  [const char *]  :account
 *   password [const char *]  :password
+*   aliTestServerIndex [int] :aliTestServerIndex(0~19)
 * Return:
 *      void
 *
 *****************************************************************/
-void POC_SetAccountAndPassword(const char* account, const char* password);
+void POC_SetAccountAndPassword(const char* account, const char* password, int aliTestServerIndex);
 /*****************************************************************
 * Function: POC_Login
 *
@@ -113,7 +114,7 @@ void POC_Login(void);
 *****************************************************************/
 void POC_setToCurrentGroup(unsigned int groupId);
 /*****************************************************************
-* Function: POC_startSingleCall
+* Function: POC_entrySingleOrMultiCall
 *
 * Description:
 *       The terminal actively initiates a single call to establish a temporary group
@@ -125,9 +126,9 @@ void POC_setToCurrentGroup(unsigned int groupId);
 *      void
 *
 *****************************************************************/
-void POC_startSingleCall(unsigned int* memberUserId, int num);
+void POC_entrySingleOrMultiCall(uint64_t* pArrayMemberUserId,int arrayMemberUserIdCount);
 /*****************************************************************
-* Function: POC_endSingleCall
+* Function: POC_exitSingleOrMultiCall
 *
 * Description:
 *       The terminal actively exits the single call and exits the temporary group
@@ -139,7 +140,7 @@ void POC_startSingleCall(unsigned int* memberUserId, int num);
 *      void
 *
 *****************************************************************/
-void POC_endSingleCall(unsigned int isNeedSendExitReq);
+void POC_exitSingleOrMultiCall(unsigned int isNeedSendExitReq);
 /*****************************************************************
 * Function: POC_StartPTT
 *
@@ -212,23 +213,9 @@ int POC_getGroupListCount(void);
 *      void
 *
 *****************************************************************/
-void POC_getSingleGroupData(int groupIndex, unsigned int* pGroupId, int* pIsInTempGroup,unsigned char* pUtf8NameBuffer,int utf8NameBufferByteLength);
+void POC_getSingleGroupData(int groupIndex, int* pGroupId,  char* pUtf8NameBuf,int utf8NameBytesLength,int* pIsTerminalGroup,int* pIsMeCreate);
 /*****************************************************************
-* Function: POC_getGroupMemberListCount
-*
-* Description:
-*       Get the total number of group members whose group index is groupIndex. 
-* The groupIndex starts from 0 and is less than the total number of groups in POC_GroupCount
-* 
-* Parameters:
-*      groupIndex  [int ] groupIndex starts counting from 0 and is less than the total number of POC_GroupCount groups
-* Return:
-*      int :The total number of group members whose group index is groupIndex
-*
-*****************************************************************/
-int POC_getGroupMemberListCount(int groupIndex);
-/*****************************************************************
-* Function: POC_getFriendMemberListCount
+* Function: POC_GetFriendMemberListCount
 *
 * Description:
 *       Get the total number of friends members
@@ -239,26 +226,9 @@ int POC_getGroupMemberListCount(int groupIndex);
 *      void
 *
 *****************************************************************/
-int POC_getFriendMemberListCount(void);
+int POC_GetFriendMemberListCount(void);
 /*****************************************************************
-* Function: POC_getSingleCallMemberData
-*
-* Description:
-*   Get the data of the current temporary group members. Currently, only one member single call is supported. 
-* If POC_getIsInTempGroup returns 0, it means that there is no temporary group currently, and no successful single 
-* call has been established actively, and no temporary group has been passively established successfully. At this time, 
-* This interface will not return data, only if POC_getIsInTempGroup returns non-zero, data will be returned
-* 
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_getSingleCallMemberData(unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-/*****************************************************************
-* Function: POC_getSingleGroupMemberData
+* Function: POC_GetCurrentGroupMemberUserData
 *
 * Description:
 *       
@@ -268,9 +238,9 @@ void POC_getSingleCallMemberData(unsigned int* pMemberUserId, char* pMemberStatu
 *      void
 *
 *****************************************************************/
-void POC_getSingleGroupMemberData(int groupMemberIndex, unsigned int* pMemberUserId,   char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
+void POC_GetCurrentGroupMemberUserData(int groupMemberIndex, unsigned int* pMemberUserId,      char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
 /*****************************************************************
-* Function: POC_getSingleFriendMemberData
+* Function: POC_GetCurrentGroupId
 *
 * Description:
 *       The main thread needs to be suspended in it, otherwise the
@@ -282,105 +252,7 @@ void POC_getSingleGroupMemberData(int groupMemberIndex, unsigned int* pMemberUse
 *      void
 *
 *****************************************************************/
-void POC_getSingleFriendMemberData(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength);
-/*****************************************************************
-* Function: POC_SetLatitudeAndLongitude
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_SetLatitudeAndLongitude(float latitude, float longitude);
-/*****************************************************************
-* Function: POC_GetGpsIntervalTime
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-int POC_GetGpsIntervalTime(void);
-/*****************************************************************
-* Function: POC_SetWifiInformation
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_SetWifiInformation(unsigned char nWifiAp,WifiInformation **wifiInformations);
-/*****************************************************************
-* Function: POC_GetWifiInformationInterval
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-int POC_GetWifiInformationInterval(void);
-/*****************************************************************
-* Function: POC_SetChinaTelecom_BaseStationInformation
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_SetChinaTelecom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode,short systemId, unsigned char  rssi,signed long int netWorkId,signed long int baseStationId);
-/*****************************************************************
-* Function: POC_SetChinaMobileOrUnicom_BaseStationInformation
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_SetChinaMobileOrUnicom_BaseStationInformation(short mobileCountryCode,char mobileNetworkCode, unsigned char  rssi,signed long int locationAreaCode,signed long int cellTowerId);
-/*****************************************************************
-* Function: POC_GetActiveGroupId
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-unsigned int POC_GetActiveGroupId(void);
+int POC_GetCurrentGroupId(void);
 /*****************************************************************
 * Function: POC_GetActiveGroupName
 *
@@ -408,7 +280,7 @@ const unsigned char* POC_GetActiveGroupName(void);
 *      void
 *
 *****************************************************************/
-const unsigned char* POC_GetAccountNickName(void);
+void POC_GetAccountNickName(char* pUtf8Name,int utf8BytesLength);
 /*****************************************************************
 * Function: POC_GetCurrentState
 *
@@ -423,34 +295,7 @@ const unsigned char* POC_GetAccountNickName(void);
 *
 *****************************************************************/
 int POC_GetCurrentState(void);
-/*****************************************************************
-* Function: POC_SetNetworkType
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_SetNetworkType(int type);
-/*****************************************************************
-* Function: POC_getIsFriendEnable
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-int POC_getIsFriendEnable(void);
+
 /*****************************************************************
 * Function: POC_GetLoginAccount
 *
@@ -480,20 +325,6 @@ int POC_GetLoginAccount(unsigned char* account, unsigned int maxByteAccountName)
 *****************************************************************/
 void POC_SetCurrentState(int state);
 /*****************************************************************
-* Function: POC_GetSingleCallOtherSideName
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-unsigned char* POC_GetSingleCallOtherSideName(void);
-/*****************************************************************
 * Function: POC_GetIsPlayingAudio
 *
 * Description:
@@ -535,20 +366,7 @@ unsigned int POC_GetIsRecordingAudio(void);
 *
 *****************************************************************/
 int POC_getIsSingleCallEnable(void);
-/*****************************************************************
-* Function: POC_getIsSetSystemTimeFromServer
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-int POC_getIsSetSystemTimeFromServer(void);
+
 /*****************************************************************
 * Function: POC_getIsGpsEnable
 *
@@ -564,34 +382,6 @@ int POC_getIsSetSystemTimeFromServer(void);
 *****************************************************************/
 int POC_getIsGpsEnable(void);
 /*****************************************************************
-* Function: POC_getIsVoicePriorityHigh
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-int POC_getIsVoicePriorityHigh(void);
-/*****************************************************************
-* Function: POC_cleanSavedAccountAndPassword
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void POC_cleanSavedAccountAndPassword(void);
-/*****************************************************************
 * Function: POC_getLoginFailAccountOrPassword
 *
 * Description:
@@ -620,20 +410,6 @@ int POC_getLoginFailAccountOrPassword(void);
 *****************************************************************/
 int POC_getIsDevicePaused(void);
 /*****************************************************************
-* Function: POC_GetIsReceivingAudioFrame
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-unsigned char POC_GetIsReceivingAudioFrame(void);
-/*****************************************************************
 * Function: POC_refreshGroupList
 *
 * Description:
@@ -744,9 +520,9 @@ int POC_getIsLoginUserNameOrPasswordWrong(void);
 *      void
 *
 *****************************************************************/
-void POC_updateTailkerWithUserId(unsigned int groupMemberId,char* pUserNameUtf8,int userNameUtf8ByteLength);
+void POC_updateTailkerWithUserId(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId);
 /*****************************************************************
-* Function: POC_getIsInSingleCall
+* Function: POC_getIsSingleCall
 *
 * Description:
 *       The main thread needs to be suspended in it, otherwise the
@@ -758,7 +534,7 @@ void POC_updateTailkerWithUserId(unsigned int groupMemberId,char* pUserNameUtf8,
 *      void
 *
 *****************************************************************/
-int POC_getIsInSingleCall(void);
+int POC_getIsSingleCall(void);
 /*****************************************************************
 * Function: POC_setSystemSerialNumber
 *
@@ -926,7 +702,7 @@ void POC_SendHeartPackageWithoutTimer(void);
 *      void
 *
 *****************************************************************/
-void POC_handleSocketPackage(int wParam, int dwParam);
+void POC_handleSocketPackage(int dataBytesLength, char* pData);
 /*****************************************************************
 * Function: POC_stopGetIpAndPortProcessTimer
 *
@@ -1026,20 +802,6 @@ int POC_getIsInGetIpAndPortProcess(void);
 *****************************************************************/
 void POC_onScreenFromClosedToOpened(void);
 /*****************************************************************
-* Function: Device_AfterInactiveSingleCall
-*
-* Description:
-*       The main thread needs to be suspended in it, otherwise the
-* program will execute directly and exit
-* 
-* Parameters:
-*      void
-* Return:
-*      void
-*
-*****************************************************************/
-void Device_AfterInactiveSingleCall(unsigned char *otherSideName);
-/*****************************************************************
 * Function: POC_printfOTABuildTime
 *
 * Description:
@@ -1067,4 +829,20 @@ void POC_printfOTABuildTime(void);
 *
 *****************************************************************/
 unsigned int POC_getUTCSeconds(        unsigned int nYear,unsigned int nMonth ,unsigned int nDay,      unsigned int nHour,unsigned int nMin,unsigned int nSec);
+
+//2.0
+//获取当前来话的来话者的优先级
+int POC_getReceiveVoicePriorityAfterHandleSocketPackage();
+
+//获取本机的优先级
+int POC_getDeviceVoicePriority(void);
+
+void POC_GetFriendMemberUserData(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+
+void POC_entrySingleOrMultiCall_cb(unsigned int* memberUserId, int num,callmember_cb_t cb);
+
+int POC_GetCurrentGroupMemberListCount(void);
+
+
+
 #endif /* __QL_POC_QS_H__ */
\ No newline at end of file
index ea3686e..b230e75 100644 (file)
@@ -3,9 +3,23 @@
 #include "helios_debug.h"
 #include "helios_nw.h"
 #include "helios_datacall.h"
+#include "ql_type.h"
 
 #define QS_POC_LOG(msg, ...)      custom_log(poc, msg, ##__VA_ARGS__)
 
+// --start burols.wang copy from poc_device.h //depot3/ASR/3601/dev/R06_Helios/
+typedef enum{
+    PDP_ACTIVE_IND = 1,
+    NETWORK_RECONNECTED,    
+    NETWORK_RECONNECTED_AND_SEND_HEART,
+    NETWORK_DISCONNECTED,
+    PDP_DEACTIVE_ABNORMALLY_IND,
+    PDP_REACTIVATE,
+    PDP_RELEASE_AND_ACTIVE,    
+    PDP_RESET_NETWORK_STATUS_CHANGE_QUEUE,    
+}Network_Stauts_E;
+//--end
+
 enum {
     Helios_Poc_Login_OnlyOnline = 0,
     Helios_Poc_Login_Online ,
@@ -15,10 +29,7 @@ enum {
 
 static audio_cb audio_callback = NULL;
 
-//获取当前登录状�?
-//返回值:离线,STATE_OFFLINE 0
-//登录中:STATE_LOGINING 1
-//在线:STATE_ONLINE 2  
+
 int poc_state_transation(int state){
     if ( state == 0  )
     {
@@ -36,6 +47,7 @@ int poc_state_transation(int state){
         return state;
     }
 }
+
 void py_qs_poc_datacall_callback(int32_t profile_idx, uint8_t sim_id, int32_t nw_status){
     (void )profile_idx;
     (void )sim_id;
@@ -47,8 +59,46 @@ void py_qs_poc_datacall_callback(int32_t profile_idx, uint8_t sim_id, int32_t nw
         // poc network task need 4
         POC_notify_network_status(4);
     }
-    POC_notify_network_status(nw_status);
+    //POC_notify_network_status(nw_status);
 }
+
+static void qpy_qs_poc_net_callback(uint8_t sim_id, int32_t event_id, void *ctx)
+{
+       (void)sim_id;
+       
+       switch (event_id)
+       {
+               case HELIOS_NW_DATA_REG_STATUS_IND:
+               {
+                       Helios_NwRegisterInfoStruct *nw_register_status = (Helios_NwRegisterInfoStruct *)ctx;
+                       
+                       if ((nw_register_status->status == 1) || (nw_register_status->status == 5))
+                       {
+                               //NETWORK_RECONNECTED
+                               //POC_notify_network_status(2);
+                POC_notify_network_status(NETWORK_RECONNECTED_AND_SEND_HEART);
+                       }
+                       else if (nw_register_status->status == 0)
+                       {
+                               //NETWORK_DISCONNECTED
+                               POC_notify_network_status(NETWORK_DISCONNECTED);
+                       }
+                       else
+                       {
+                               //NETWORK_DISCONNECTED
+                               //POC_notify_network_status(4);
+                       }
+                       
+                       break;
+               }
+               default:
+               {
+                       break;
+               }
+       }
+}
+
+
 void py_qs_poc_init(init_cb cb){
     extern int _get_current_simid(void);
     POC_register_init_cb(cb);
@@ -64,11 +114,16 @@ void py_qs_poc_init(init_cb cb){
     if ( ret == 0 && info.data_reg.status == 1 )
     {
         // poc network task need 1
-        POC_notify_network_status(1);
+        POC_notify_network_status(PDP_ACTIVE_IND);
     }else{
         // poc network task need 4
-        POC_notify_network_status(4);
+        POC_notify_network_status(NETWORK_DISCONNECTED);
     }
+
+       Helios_NwInitStruct nw_info;
+    memset(&nw_info, 0, sizeof(Helios_NwInitStruct));
+       nw_info.user_cb = qpy_qs_poc_net_callback;
+       Helios_Nw_Init(&nw_info);
 }
 
 void py_qs_poc_free(void){
@@ -111,9 +166,9 @@ int py_qs_poc_speak(int start){
         return 0;
     }else if ( start == 2 ){
         //如果在单呼中,结束单呼
-        if (POC_getIsInSingleCall())
+        if (POC_getIsSingleCall())
         {
-            POC_endSingleCall(1);
+            POC_exitSingleOrMultiCall(1);
         }
         if ( audio_callback != NULL )
         {
@@ -126,18 +181,21 @@ int py_qs_poc_speak(int start){
 }
 
 int py_qs_poc_calluser(const qs_uid_t uid ,callmember_cb cb){
-    POC_startSingleCall(&uid,1,cb);
+    POC_entrySingleOrMultiCall_cb(&uid,1,cb);
     return 0;
 }
 
 int py_qs_poc_group_getbyindex(int index,qs_group_t * dst){
-    unsigned int groupid=0;
+    int groupid=0;
     int state = 0;
     char * groupname = ( char *) calloc(1,QS_NAME_LEN+1);
     if ( groupname == NULL ){
         return -1;
     }
-    POC_getSingleGroupData(index,&groupid,&state,(unsigned char *)groupname,QS_NAME_LEN);
+       int isTerminalGroup = 0;
+       int isMeCreate = 0;
+
+    POC_getSingleGroupData(index,&groupid,groupname,QS_NAME_LEN,&isTerminalGroup,&isMeCreate);
     dst->gid = groupid;
     memcpy(dst->name,groupname,QS_NAME_LEN);
     free(groupname);
@@ -147,21 +205,26 @@ int py_qs_poc_group_getbyindex(int index,qs_group_t * dst){
 }
 
 int py_qs_poc_group_getbyid(qs_gid_t gid,qs_group_t* dst){
-    unsigned int groupid=0;
+    int groupid=0;
     int state = 0;
+    int isMeCreate = 0;
+    int isTerminalGroup = 0;
+
     char * groupname = ( char *) calloc(1,QS_NAME_LEN+1);
     if ( groupname == NULL ){
         return -1;
     }
     int group_count = POC_getGroupListCount();
-    int current_groupid = POC_GetActiveGroupId();
+    int current_groupid = POC_GetCurrentGroupId();
+    QS_POC_LOG("oak current_groupid is %d",current_groupid);
+
     if ( gid == 0 ){
         gid = current_groupid;
     }
     for ( int i =0 ; i<group_count;i++ ){
         
         memset(groupname,0x00,QS_NAME_LEN+1);
-        POC_getSingleGroupData(i,&groupid,&state,(unsigned char *)groupname,QS_NAME_LEN);
+        POC_getSingleGroupData(i,&groupid,groupname,QS_NAME_LEN,&isTerminalGroup,&isMeCreate);
         if ( groupid == gid ){
             dst->gid = groupid;
             memcpy(dst->name,groupname,QS_NAME_LEN);
@@ -179,19 +242,26 @@ int py_qs_poc_member_getbyid(qs_uid_t in_uid,qs_member_t* dst){
     {
         int uid = POC_getDeviceUserId();
         QS_POC_LOG("User id is %d",uid);
-        const unsigned char * memname=POC_GetAccountNickName();
+        // const unsigned char * memname=POC_GetAccountNickName();
+        char memname[64] = {0};
+        memset(memname,0,sizeof(memname));
+        POC_GetAccountNickName(memname,sizeof(memname));
+
         if ( memname == NULL ){
             return -1;
         }
         memcpy(dst->name,memname,QS_NAME_LEN);
+
+
         dst->index = 0;
         dst->uid = (qs_uid_t)uid;
         dst->state = poc_state_transation(POC_GetCurrentState());
         dst->prior = 0;
 
     }else{
+        //int POC_GetCurrentGroupMemberListCount();
 
-        int memcount = POC_getGroupMemberListCount(0);
+        int memcount = POC_GetCurrentGroupMemberListCount();
         unsigned uid = 0;
         char    status =  0;
         int rel_num = 0;
@@ -204,7 +274,7 @@ int py_qs_poc_member_getbyid(qs_uid_t in_uid,qs_member_t* dst){
         for ( int i = 0;i< memcount;i++ ){
 
             memset(membername,0x00,QS_NAME_LEN+1);
-            POC_getSingleGroupMemberData(i,&uid,&status,(unsigned char *)membername,QS_NAME_LEN);
+            POC_GetCurrentGroupMemberUserData(i,&uid,&status,(unsigned char *)membername,QS_NAME_LEN);
             
             if ( in_uid ==  uid )
             {
@@ -244,7 +314,7 @@ int py_qs_poc_get_grouplist(qs_group_t* dst, int dst_size, int index_begin, int
     if (  group_count < index_begin ){
         return 0;
     }
-    unsigned int groupid=0;
+    int groupid=0;
     int state = 0;
     char * groupname = ( char *) calloc(1,QS_NAME_LEN+1);
     if ( groupname == NULL ){
@@ -252,13 +322,16 @@ int py_qs_poc_get_grouplist(qs_group_t* dst, int dst_size, int index_begin, int
     }
     int i = 0;
     int rel_num = 0;
+    int isMeCreate = 0;
+    int isTerminalGroup = 0;
+
     for ( i=0;i<count;i++ ){
         
         memset(groupname,0x00,QS_NAME_LEN+1);
         if ( i < index_begin ){
             continue;
         }
-        POC_getSingleGroupData(i,&groupid,&state,(unsigned char *)groupname,QS_NAME_LEN);
+        POC_getSingleGroupData(i,&groupid,groupname,QS_NAME_LEN,&isTerminalGroup,&isMeCreate);
         dst[i-index_begin].gid = groupid;
         dst[i-index_begin].type = state;
         dst[i-index_begin].index = i;
@@ -271,12 +344,12 @@ int py_qs_poc_get_grouplist(qs_group_t* dst, int dst_size, int index_begin, int
 }
 
 int py_qs_poc_get_membercount(qs_gid_t gid){
-    return  POC_getGroupMemberListCount(gid);
+    return  POC_GetCurrentGroupMemberListCount();
 }
 
 int py_qs_poc_get_memberlist(qs_gid_t gid, qs_member_t* dst, int dst_size, int index_begin, int count){
     (void) dst_size;
-    int memcount = POC_getGroupMemberListCount(gid);
+    int memcount = POC_GetCurrentGroupMemberListCount();
     if ( dst == NULL || memcount < index_begin ){
         return 0;
     }
@@ -292,7 +365,7 @@ int py_qs_poc_get_memberlist(qs_gid_t gid, qs_member_t* dst, int dst_size, int i
     }
     for ( int i = index_begin;i< memcount;i++ ){
         memset(membername,0x00,QS_NAME_LEN+1);
-        POC_getSingleGroupMemberData(i,&uid,&status,(unsigned char *)membername,QS_NAME_LEN);
+        POC_GetCurrentGroupMemberUserData(i,&uid,&status,(unsigned char *)membername,QS_NAME_LEN);
         dst[i-index_begin].uid =uid; 
         if ( status == 1 )
             dst[i-index_begin].state = 2;
@@ -350,6 +423,9 @@ void py_qs_poc_register_online_state_cb(online_state_cb cb){
 void py_qs_poc_register_called_cb(called_cb cb){
     POC_register_called_cb(cb);
 }
+void py_qs_poc_register_get_3days_weather_cb(get_3days_weather_cb cb){
+    POC_register_get_3days_weather_cb(cb);
+}
 
 int py_qs_poc_get_isenable_single_call(void){
     return POC_getIsSingleCallEnable();
@@ -359,19 +435,19 @@ int py_qs_poc_get_isenable_gprs(void){
 }
 // 0 - low prio !0 - hight 
 int py_qs_poc_get_ishigth_prio(void){
-    return POC_getIsVoicePriorityHigh();
+    return POC_getDeviceVoicePriority() <= POC_getReceiveVoicePriorityAfterHandleSocketPackage() ? 0 : 1;
 }
 // 0 - not calling !0 - calling
 int py_qs_poc_get_iscalling(void){
-    return POC_getIsInSingleCall();
+    return POC_getIsSingleCall();
 }
 // 0 - disable 1-enable
 int py_qs_poc_get_isenable_friend(void){
-    return POC_getIsFriendEnable();
+    return POC_getFriendIsEnable();
 }
 
 int  py_qs_poc_get_friend_count(void){
-    return POC_getFriendMemberListCount();
+    return POC_GetFriendMemberListCount();
 }
 
 int py_qs_poc_get_friend_list(qs_member_t *friend_list,int count){
@@ -389,7 +465,7 @@ int py_qs_poc_get_friend_list(qs_member_t *friend_list,int count){
         for ( int i = 0;i < friend_count;i++)
         {
             memset(friend_name,0x00,QS_NAME_LEN+1);
-            POC_getSingleFriendMemberData(i,&friend_id,&friend_status,(unsigned char *)friend_name,QS_NAME_LEN);
+            POC_GetFriendMemberUserData(i,&friend_id,&friend_status,( char *)friend_name,QS_NAME_LEN);
             friend_list[i].uid =friend_id; 
             friend_list[i].state = friend_status;
             friend_list[i].prior = 0;
@@ -415,8 +491,9 @@ void  py_qs_poc_open_gps(void){
 void  py_qs_poc_close_gps(void){
     return Device_close_gps();
 }
-void  py_qs_poc_upload_gps_data(double longitude,double latitude,double accuracy){
-    return Device_upload_gps_data(longitude,latitude,accuracy);
+void  py_qs_poc_upload_gps_data(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount){
+    return Device_upload_gps_data(longitude, latitude, latitudeDirection, longitudeDirection, precision, gpsCount);
+
 }
 int  py_qs_poc_get_gps_set_value(void){
     return Device_getGpsSettingValue();
@@ -455,6 +532,11 @@ void  py_qs_poc_pttTone_play(void)
     Device_PTTtone_play();
 }
 
+int py_qs_poc_get_is_device_paused(void)
+{
+    return POC_getIsDevicePaused();
+}
+
 int  py_qs_poc_pttTone_CodecGain(float dB)
 {
     return Device_PTTtone_CodecGain(dB);
@@ -464,7 +546,325 @@ void  py_qs_poc_set_dev_location_type(LOCATION_TYPE location_type,int is_enable)
     return Device_quec_set_location_support_type(location_type,is_enable);
 }
 
+int py_qs_poc_get_dev_recording_status(void){
+    return POC_GetIsRecordingAudio();
+}
+
+int py_qs_poc_get_dev_playing_status(void){
+    return POC_GetIsPlayingAudio();
+}
+
+void py_qs_poc_checkUpdateWeatherForecastIfNeed(void) {
+       POC_checkUpdateWeatherForecastIfNeed();
+}
+
+int py_qs_poc_GetWeatherForecastDataUtf8(int* pWeatherTemperature,char* pWeatherTextUtf8,int weatherTextUtf8BytesLength,
+       char* pWeatherWindDirectionUtf8,int weatherWindDirectionUtf8BytesLength,char* pWeatherWindClassUtf8,int weatherWindClassUtf8BytesLength,
+       char* pWeatherUtf8City,int weatherUtf8CityBytesLength) {
+       return POC_GetWeatherForecastDataUtf8(pWeatherTemperature, pWeatherTextUtf8, weatherTextUtf8BytesLength, pWeatherWindDirectionUtf8, 
+       weatherWindDirectionUtf8BytesLength, pWeatherWindClassUtf8, weatherWindClassUtf8BytesLength, pWeatherUtf8City, weatherUtf8CityBytesLength);
+}
+
+int py_qs_poc_getIsSupportWeather(void) {
+    return Device_getIsSupportWeather();
+}
+
+void py_qs_poc_setIsSupportWeather(int is_enable) {
+    return Device_setIsSupportWeather(is_enable);
+}
+
+void py_qs_poc_sendAddressRequest(void) {
+    return POC_sendAddressRequest();
+}
+
+int py_qs_poc_getAddressData(char* pWeatherUtf8Text,int weatherUtf8TextBytesLength){
+    return POC_getAddressData(pWeatherUtf8Text, weatherUtf8TextBytesLength);
+}
+
+//2.0
+void py_qs_poc_taskrun(void){
+    return POC_TaskRun();
+}
+
+void py_qs_poc_setaccountandpassword(const char* account, const char* password,int aliTestServerIndex){
+    return POC_SetAccountAndPassword(account, password,aliTestServerIndex);
+}
+
+// 终端可以通过POC_exitSingleOrMultiCall主动退出单呼或多呼
+void py_qs_poc_entrysingleormulticall(uint64* pArrayMemberUserId,int arrayMemberUserIdCount){
+    return POC_entrySingleOrMultiCall(pArrayMemberUserId,arrayMemberUserIdCount);
+}
+
+int py_qs_poc_getinactivesingleormulticallusercount(void){
+    return POC_getInactiveSingleOrMultiCallUserCount();
+}
+
+
+void py_qs_poc_exitsingleormulticall(int isNeedSendExitReq){
+    return POC_exitSingleOrMultiCall(isNeedSendExitReq);
+}
 
+void py_qs_poc_refreshmulticallmember(void){
+    return POC_refreshMulticallMember();
 
+}
+
+int py_qs_poc_getisintempgroup(void){
+    return POC_getIsInTempGroup();
+
+}
+
+int py_qs_poc_getissinglecall(void){
+    return POC_getIsSingleCall();
+
+}
+
+int py_qs_poc_getismulticall(void){
+    return POC_getIsMultiCall();
+
+}
+
+uint64 py_qs_poc_getmulticallid(void){
+    return POC_getMultiCallId();
+}
+
+int py_qs_poc_getisactivesinglecall(void){
+    return POC_getIsActiveSingleCall();
+}
+
+int py_qs_poc_getisactivemulticall(void){
+    return POC_getIsActiveMultiCall();
+}
+
+int py_qs_poc_getactivesingleormulticallusercount(void){
+    return POC_getActiveSingleOrMultiCallUserCount();
+}
+
+void py_qs_poc_getsingleormulticalluserdata(int index,uint64* pUserId, char* pStatus, char* pUtf8Name,int utf8ByteLength){
+    return POC_getSingleOrMultiCallUserData(index,pUserId, pStatus, pUtf8Name,utf8ByteLength);
+}
+
+void py_qs_poc_getsinglegroupdata(int groupIndex, int* pGroupId,  char* pUtf8NameBuf,int utf8NameBytesLength,int* pIsTerminalGroup,int* pIsMeCreate){
+    return POC_getSingleGroupData(groupIndex, pGroupId,  pUtf8NameBuf,utf8NameBytesLength,pIsTerminalGroup,pIsMeCreate);
+
+}
+
+int py_qs_poc_getcurrentgroupid(void){
+    return POC_GetCurrentGroupId();
+
+}
+
+void py_qs_poc_getcurrentgroupnamemutex(char* pUtf8Name,int utf8BytesLength){
+    return POC_GetCurrentGroupNameMutex(pUtf8Name,utf8BytesLength);
+}
+void py_qs_poc_refreshgrouplist(void){
+    return POC_refreshGroupList();
+
+}
+
+int py_qs_poc_getcurrentgroupmemberlistcount(void){
+    return POC_GetCurrentGroupMemberListCount();
+}
+
+int py_qs_poc_getcurrentgrouponlinemembercount(void){
+    return POC_GetCurrentGroupOnlineMemberCount();
+}
+
+void py_qs_poc_getcurrentgroupmemberuserdata(int groupMemberIndex, unsigned int* pMemberUserId, char* pMemberStatus, unsigned char* pUtf8MemberNameBuffer,int utf8MemberNameBufferByteLength){
+    return POC_GetCurrentGroupMemberUserData(groupMemberIndex, pMemberUserId, pMemberStatus, pUtf8MemberNameBuffer,utf8MemberNameBufferByteLength);
+
+}
+
+void py_qs_poc_refreshgroupmemberlist(void){
+    return POC_refreshGroupMemberList();
+
+}
+int py_qs_poc_getfriendmemberlistcount(void){
+    return POC_GetFriendMemberListCount();
+
+}
+
+void py_qs_poc_getfriendmemberuserdata(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength){
+    return POC_GetFriendMemberUserData(userIndex, pUserId, pStatus,  pUtf8Name,utf8ByteLength);
+
+}
+
+void py_qs_poc_refreshfriendmemberlist(void){
+    return POC_refreshFriendMemberList();
+
+}
+
+void py_qs_poc_getaccountnickname(char* pUtf8Name,int utf8BytesLength){
+    return POC_GetAccountNickName(pUtf8Name,utf8BytesLength);
+
+}
+
+int py_qs_poc_getfriendisenable(void){
+    return POC_getFriendIsEnable();
+}
+
+int py_qs_poc_getcurrentstate(void){
+    return POC_GetCurrentState();
+
+}
+
+void py_qs_poc_updatetailkerwithuserid(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId){
+    return POC_updateTailkerWithUserId(pUserNameUtf8,userNameUtf8ByteLength,useId,groupId,environmentId);
+
+}
+
+void py_qs_poc_handlesocketpackage(int dataBytesLength, char* pData){
+    return POC_handleSocketPackage(dataBytesLength, pData);
+
+}
+
+int py_qs_poc_getdeviceuserid(void){
+    return POC_getDeviceUserId();
+
+}
+
+int py_qs_poc_getisvoicepacket(int dataBytesLength, char* pData){
+    return POC_getIsVoicePacket(dataBytesLength, pData);
+
+}
+
+int py_qs_poc_getdevicevoicepriority(void){
+    return POC_getDeviceVoicePriority();
+
+}
+int py_qs_poc_getreceivevoicepriorityafterhandlesocketpackage(void){
+    return POC_getReceiveVoicePriorityAfterHandleSocketPackage();
+
+}
+
+// int py_qs_poc_getreceivevoicepriority(int wParam, int dwParam){
+//     return POC_getReceiveVoicePriority(wParam, dwParam);
+
+// }
+
+void py_qs_poc_uploadgpsdata(double longitude,double latitude,char latitudeDirection,char longitudeDirection,double precision, int gpsCount){
+    return POC_uploadGpsData( longitude, latitude, latitudeDirection, longitudeDirection, precision,  gpsCount);
+
+}
+
+int py_qs_poc_islistenchannel(int groupId){
+    return POC_isListenChannel(groupId);
+
+}
+
+void py_qs_poc_addlistenchannel(int groupId){
+    return POC_addListenChannel(groupId);
+
+}
+
+void py_qs_poc_removelistenchannel(int groupId){
+    return POC_removeListenChannel(groupId);
+}
+
+int py_qs_poc_getlistenchannelcount(void)
+{
+    return POC_getListenChannelCount();
+
+}
+
+void py_qs_poc_refreshmultichannellistenlist(void){
+    return POC_refreshMultiChannelListenList();
+
+}
+
+void py_qs_poc_refreshalllistengroupmember(void){
+    return POC_refreshAllListenGroupMember();
+}
+
+int py_qs_poc_getonegroupmemberlistcount(int groupId){
+    return POC_GetOneGroupMemberListCount(groupId);
+
+}
+
+void py_qs_poc_getonegroupmemberuserdata(int groupId,int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength){
+    return POC_GetOneGroupMemberUserData(groupId,userIndex, pUserId, pStatus,  pUtf8Name,utf8ByteLength);
+
+}
+
+void py_qs_poc_refreshonegroupmember(int groupId){
+    return POC_refreshOneGroupMember(groupId);
+}
+
+void py_qs_poc_deleteterminalgroup(int groupId){
+    return POC_deleteTerminalGroup(groupId);
+
+}
+
+void py_qs_poc_exitterminalgroup(int groupId){
+    return POC_exitTerminalGroup(groupId);
+}
+
+void py_qs_poc_addterminalgroupmember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount){
+    return POC_addTerminalGroupMember(groupId,pArrayMemberUserId,arrayMemberUserIdCount);
+
+}
+
+void py_qs_poc_removeterminalgroupmember(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount){
+    return POC_removeTerminalGroupMember(groupId,pArrayMemberUserId,arrayMemberUserIdCount);
+
+}
+
+void py_qs_poc_createterminalgroup(uint64* pArrayMemberUserId,int arrayMemberUserIdCount,char* pNameUtf8Buffer){
+    return POC_createTerminalGroup(pArrayMemberUserId,arrayMemberUserIdCount,pNameUtf8Buffer);
+
+}
+
+void py_qs_poc_getterminalgroupnamelistdata(int index, char* pUtf8NameBuf,int utf8NameBufferBytesLength){
+    return POC_GetTerminalGroupNameListData(index, pUtf8NameBuf,utf8NameBufferBytesLength);
+
+}
+
+int py_qs_poc_getisinbroadcastgroup(void){
+    return POC_getIsInBroadcastGroup();
+
+}
+
+void py_qs_poc_enterbroadcast(int* pArrayGroupId,int arrayGroupIdCount){
+    return POC_EnterBroadcast(pArrayGroupId,arrayGroupIdCount);
+
+}
+
+void py_qs_poc_exitbroadcast(int isNeedSendExitReq){
+    return POC_ExitBroadcast(isNeedSendExitReq);
+
+}
+
+void py_qs_poc_resetlistenautoguardaftersetting(void){
+    return POC_resetListenAutoGuardAfterSetting();
+
+}
+
+int py_qs_poc_getlistenautoguardleftseconds(void){
+    return POC_getListenAutoGuardLeftSeconds();
+
+}
+
+
+void py_qs_poc_requestterminalgroupname(void){
+    return POC_requestTerminalGroupName();
+
+}
+
+int py_qs_poc_getterminalgroupnamecount(void){
+    return POC_GetTerminalGroupNameCount();
+
+}
+int py_qs_poc_get3daysWeather(char* pWeatherTodayUtf8Text,int weatherTodayUtf8TextBytesLength, 
+                                int* pWeatherTodayMinTemperature, int* pWeatherTodayMaxTemperature,
+                                char* pWeatherTomorrowUtf8Text,int weatherTomorrowUtf8TextBytesLength, 
+                                int* pWeatherTomorrowMinTemperature, int* pWeatherTomorrowMaxTemperature,
+                                char* pWeatherDayAfterTomorrowUtf8Text,int weatherDayAfterTomorrowUtf8TextBytesLength, 
+                                int* pWeatherDayAfterTomorrowMinTemperature, int* pWeatherDayAfterTomorrowMaxTemperature ) {
+
+    return POC_GetWeatherUtf8DataTodayTomorrowDayAfterTomorrow(pWeatherTodayUtf8Text, weatherTodayUtf8TextBytesLength, pWeatherTodayMinTemperature,
+                                                        pWeatherTodayMaxTemperature, pWeatherTomorrowUtf8Text, weatherTomorrowUtf8TextBytesLength,
+                                                        pWeatherTomorrowMinTemperature, pWeatherTomorrowMaxTemperature, pWeatherDayAfterTomorrowUtf8Text,
+                                                        weatherDayAfterTomorrowUtf8TextBytesLength, pWeatherDayAfterTomorrowMinTemperature, pWeatherDayAfterTomorrowMaxTemperature);
+}
 
 
index 90e914c..1a580b8 100644 (file)
@@ -29,6 +29,9 @@ typedef enum VOL_TYPE {
     BROAD_TTS,
     BROAD_TONE
 } VOL_TYPE;
+
+typedef unsigned int                   bnd_uid_t;
+
 typedef void (*ui_notify_cb)(void *notify);
 /*
     FUN:login_state_cb 登录状态回调
@@ -86,14 +89,24 @@ typedef void (*member_change_cb)(int flag, broad_gid_t gid, int nun, broad_uid_t
         info: 异常信息
 */
 typedef void (*error_cb)(const char *info);
+
+/*
+    FUN:callmember_cb 单呼的回调
+    PARAM:
+        ret:1->成功,0->失败
+*/
+typedef void(*callmember_cb)(int ret);
+
 /*
     FUN:location_cb GPS定位信息变化通知
     PARAM:
         location_switch: 定位开关, 1是开启,0是关闭
         report_rate: 定位上报间隔,单位秒
 */
-typedef void (*location_change_cb)(int location_switch, int report_rate);
+typedef void(*request_lbs_info_cb)(char *z8filename,char *z12filename, char *z16filename, char *lbs_tts,char is_lbs_tts, char is_static_map);
+typedef void(*location_change_cb)(int location_switch, int report_rate);
 typedef void (*member_audio_enable)(int enable);
+typedef void(*weather_info_cb)(char *lbs_tts,char is_lbs_tts);
 int broad_set_thread_priority(int priority);
 /*
     FUN:broad_init 平台初始化
@@ -192,7 +205,16 @@ void broad_register_member_list_update_cb(member_list_update_cb cb);
 void broad_register_member_change_cb(member_change_cb cb);
 void broad_register_member_audio_enable_cb(member_audio_enable cb);
 void broad_register_error_cb(error_cb cb);
+
+int broad_request_weather_info(double lon,double lat);
+void broad_register_weather_info_cb(weather_info_cb cb);
+
+void broad_register_request_lbs_info_cb(request_lbs_info_cb cb);
 void broad_register_location_change_cb(location_change_cb cb);
+void broad_register_cell_location_change_cb(location_change_cb cb);
+int broad_request_lbs_info(int w, int h, double lon, double lat);
+
+int broad_callusers( const bnd_uid_t* uids, int num, callmember_cb cb );
 
 #ifdef __cplusplus
 }
index 32cd111..15f3212 100644 (file)
@@ -20,6 +20,14 @@ typedef struct __slpoc_info{
     int     is_abroad;
 }slpoc_info_t;
 
+typedef enum CALL_TYPE{
+    ALL_NOT_CALL,
+    QPY_SDK_CALL,
+    QPY_APP_CALL,
+    QPY_APP_NOT_CALL,
+    QPY_ALL_CALL
+}CALL_TYPE;
+
 typedef struct {
     int (*set_thread_priority)(int priority);
     void (*init)(char *default_platform, char *default_dns, int is_broad, int is_abroad);
@@ -56,6 +64,9 @@ typedef struct {
     int  (*write_custom)(BROAD_CUSTOM_TYPE type, const char* value);
     int  (*read_custom)(BROAD_CUSTOM_TYPE type, const char* value);
     void (*register_location_change_cb)(location_change_cb cb);
+    void (*register_cell_location_change_cb)(location_change_cb cb);
+    void (*register_request_lbs_info_cb)(request_lbs_info_cb cb);
+    int  (*request_lbs_info)(int w, int h, double lon, double lat);
     void (*register_error_cb)(error_cb cb);
     int  (*send_gpsinfo)(double lon,double lat,broad_time_t time, double alt, double speed, double dirang);
     void (*register_member_audio_enable_cb)(member_audio_enable cb);
@@ -66,6 +77,11 @@ typedef struct {
     int (*login_by_saved)(login_state_cb cb);
     int (*change_logininfo)(const char* account,const char* pwd);
     int (*get_logininfo)(char* account, char* pwd);
+
+    void (*register_weather_info_cb)(weather_info_cb cb);
+    int  (*request_weather_info)(double lon,double lat);
+
+    int  (*callusers)( const bnd_uid_t* uids, int num, callmember_cb cb );
     
 }poc_ops_t;
 
index f178afe..54c831d 100644 (file)
@@ -39,6 +39,7 @@ typedef enum BROAD_CUSTOM_TYPE {
     SET_APN_MODEL,
     SET_CURRENT_GROUP_AHEAD,
     CLEAR_GROUP_MEMBER,
+       SET_LBS_MAP_SWITCH, //配置是否下载地图 1 下载 0 不下载
 } BROAD_CUSTOM_TYPE;
 
 //群组类型
index 0faa55e..28be08d 100644 (file)
Binary files a/2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib and b/2.sdk/Helios_SDK/components/poc/slpoc/lib/broad.lib differ
index 4d2eed5..24b850d 100644 (file)
@@ -50,9 +50,12 @@ typedef struct _poc_obj_t
     c_callback_t register_member_audio_enable_cb;
     c_callback_t register_error_callback;
     c_callback_t location_change_callback;
+    c_callback_t cell_location_change_callback;
+    c_callback_t register_request_lbs_info_cb;
     c_callback_t register_member_list_update_cb;
     c_callback_t login_by_saved_cb;
-
+    c_callback_t weather_info_callback;
+    c_callback_t callusers_callback;
 } poc_obj_t;
 // Default configuration for domestic 'Xin' platforms
 static slpoc_info_t slpoc_info = {
@@ -1159,6 +1162,8 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     poc_ops->register_error_cb(NULL);
     poc_ops->register_location_change_cb(NULL);
     poc_ops->login_by_saved(NULL);
+    poc_ops->register_weather_info_cb(NULL);
+    poc_ops->register_request_lbs_info_cb(NULL);
     
     int log_status = poc_ops->get_loginstate();
     if ( log_status == 1 ){ 
@@ -1174,7 +1179,12 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     qpy_poc_deregister_cb(&poc_obj.register_member_audio_enable_cb);
     qpy_poc_deregister_cb(&poc_obj.register_error_callback);
     qpy_poc_deregister_cb(&poc_obj.location_change_callback);
+    qpy_poc_deregister_cb(&poc_obj.cell_location_change_callback);
+    qpy_poc_deregister_cb(&poc_obj.register_request_lbs_info_cb);
     qpy_poc_deregister_cb(&poc_obj.login_by_saved_cb);
+    qpy_poc_deregister_cb(&poc_obj.weather_info_callback);
+    qpy_poc_deregister_cb(&poc_obj.callusers_callback);
+
     // init config info
     memset(slpoc_info.default_platform,0x00,SLPOC_PLATFORM_NAME_LEN+1);
     memset(slpoc_info.default_dns,0x00,SLPOC_PLATFORM_NAME_LEN+1);  
@@ -1285,6 +1295,186 @@ STATIC mp_obj_t qpy_poc_get_logininfo(mp_obj_t account, mp_obj_t pwd)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_get_logininfo_obj, qpy_poc_get_logininfo);
 
+STATIC void qpy_poc_weather_info_callback(char* lbs_tts, char is_lbs_tts) {
+    if (!(poc_obj.weather_info_callback.cb)) return;
+    st_CallBack_POC* poc_para = qpy_poc_pushCallBack(2);
+    if (poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_STR;
+    poc_para->para[0].data = calloc(1, strlen(lbs_tts) + 1);
+    poc_para->para[1].type = POC_CAL_ELEM_INT;
+    poc_para->para[1].data = calloc(1, sizeof(int));
+    memcpy(poc_para->para[0].data, lbs_tts, strlen(lbs_tts));
+    *(int*)poc_para->para[1].data = is_lbs_tts;
+    poc_para->callback = poc_obj.weather_info_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    return;
+}
+
+STATIC mp_obj_t qpy_poc_register_weather_info_cb(mp_obj_t args) {
+    poc_ops_t* poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.weather_info_callback), args);
+    MP_THREAD_GIL_EXIT();
+    poc_ops->register_weather_info_cb(qpy_poc_weather_info_callback);
+    MP_THREAD_GIL_ENTER();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_weather_info_cb_obj, qpy_poc_register_weather_info_cb);
+
+STATIC mp_obj_t qpy_poc_request_weather_info(mp_obj_t lon, mp_obj_t lat) {
+    if (!mp_obj_is_float(lon) || !mp_obj_is_float(lat)) {
+        return mp_obj_new_int(-1);
+    }
+    double dlon = (double)mp_obj_float_get(lon);
+    double dlat = (double)mp_obj_float_get(lat);
+    poc_ops_t* poc_ops = poc_get_ops();
+    int ret = poc_ops->request_weather_info(dlon, dlat);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_request_weather_info_obj, qpy_poc_request_weather_info);
+
+CALL_TYPE is_cell_location_called = ALL_NOT_CALL;
+int location_switch = 0;
+int report_rate = 0;
+
+STATIC void qpy_poc_cell_location_change_callback(int location_switch, int report_rate) {
+    if (!(poc_obj.cell_location_change_callback.cb)) return;
+    st_CallBack_POC* poc_para = qpy_poc_pushCallBack(2);
+    if (poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    poc_para->para[1].type = POC_CAL_ELEM_INT;
+    poc_para->para[1].data = calloc(1, sizeof(int));
+
+    *(int*)poc_para->para[0].data = location_switch;
+    *(int*)poc_para->para[1].data = report_rate;
+    poc_para->callback = poc_obj.cell_location_change_callback;
+    is_cell_location_called = QPY_ALL_CALL;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    return;
+}
+
+STATIC void qpy_poc_register_request_lbs_info_callback(char* z8filename, char* z12filename, char* z16filename, char* lbs_tts, char is_lbs_tts, char is_static_map) {
+
+    POC_LOG("poc enter qpy_poc_register_request_lbs_info_callback [%s][%s][%s][%s][%d][%d]\n", z8filename, z12filename, z16filename, lbs_tts, is_lbs_tts, is_static_map);
+    if (!(poc_obj.register_request_lbs_info_cb.cb)) return;
+
+    st_CallBack_POC* poc_para = qpy_poc_pushCallBack(6);
+    if (poc_para == NULL) {
+        return;
+    }
+    POC_LOG("set poc qpy_poc_register_request_lbs_info_callback \n");
+    poc_para->para[0].type = POC_CAL_ELEM_STR;
+    poc_para->para[0].data = calloc(1, strlen(z8filename) + 1);
+
+    poc_para->para[1].type = POC_CAL_ELEM_STR;
+    poc_para->para[1].data = calloc(1, strlen(z12filename) + 1);
+
+    poc_para->para[2].type = POC_CAL_ELEM_STR;
+    poc_para->para[2].data = calloc(1, strlen(z16filename) + 1);
+
+    poc_para->para[3].type = POC_CAL_ELEM_STR;
+    poc_para->para[3].data = calloc(1, strlen(lbs_tts) + 1);
+
+    poc_para->para[4].type = POC_CAL_ELEM_INT;
+    poc_para->para[4].data = calloc(1, sizeof(int));
+
+    poc_para->para[5].type = POC_CAL_ELEM_INT;
+    poc_para->para[5].data = calloc(1, sizeof(int));
+
+    memcpy(poc_para->para[0].data, z8filename, strlen(z8filename));
+    memcpy(poc_para->para[1].data, z12filename, strlen(z12filename));
+    memcpy(poc_para->para[2].data, z16filename, strlen(z16filename));
+    memcpy(poc_para->para[3].data, lbs_tts, strlen(lbs_tts));
+    *(int*)poc_para->para[4].data = is_lbs_tts;
+    *(int*)poc_para->para[5].data = is_static_map;
+    POC_LOG("set poc qpy_poc_register_request_lbs_info_callback2 \n");
+    poc_para->callback = poc_obj.register_request_lbs_info_cb;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+
+    return;
+}
+
+STATIC mp_obj_t qpy_poc_register_cell_location_change_cb(mp_obj_t args) {
+    poc_ops_t* poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.cell_location_change_callback), args);
+    if (is_cell_location_called == QPY_SDK_CALL) {
+        // for deal kernel poc callback too fast 
+        qpy_poc_cell_location_change_callback(location_switch, report_rate);
+        // recover use  function qpy_poc_cell_location_change_callback to call poc callback function
+        poc_ops->register_cell_location_change_cb(qpy_poc_cell_location_change_callback);
+    } else {
+        is_cell_location_called = QPY_APP_NOT_CALL; // app not run this callback
+    }
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_cell_location_change_cb_obj, qpy_poc_register_cell_location_change_cb);
+
+STATIC mp_obj_t qpy_poc_register_request_lbs_info_cb(mp_obj_t args)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.register_request_lbs_info_cb), args);
+    MP_THREAD_GIL_EXIT();
+    poc_ops->register_request_lbs_info_cb(qpy_poc_register_request_lbs_info_callback);
+    MP_THREAD_GIL_ENTER();
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_request_lbs_info_cb_obj, qpy_poc_register_request_lbs_info_cb);
+
+STATIC mp_obj_t qpy_poc_request_lbs_info(size_t n_args, const mp_obj_t* args) {
+    if (!mp_obj_is_int(args[0]) || !mp_obj_is_int(args[1]) || 
+        !mp_obj_is_float(args[2]) || !mp_obj_is_float(args[3])) {
+        return mp_obj_new_int(-1);
+    }
+    int w = mp_obj_get_int(args[0]);
+    int h = mp_obj_get_int(args[1]);
+    double lon = (double)mp_obj_get_float(args[2]);
+    double  lat = (double)mp_obj_get_float(args[3]);
+    poc_ops_t* poc_ops = poc_get_ops();
+    int ret = poc_ops->request_lbs_info(w, h, lon, lat);
+    return  mp_obj_new_int(ret);
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_request_lbs_info_obj, 4, 4, qpy_poc_request_lbs_info);
+
+int qpy_poc_callusers_callback(int ret) {
+    if(poc_obj.callusers_callback.cb) {
+        st_CallBack_POC *poc_para = qpy_poc_pushCallBack_1elem(ret);
+        if(poc_para == NULL) {
+            return -1;
+        }
+        poc_para->callback = poc_obj.callusers_callback;
+        qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    }
+    return ret;
+}
+
+STATIC mp_obj_t qpy_poc_callusers(mp_obj_t poc_uid, mp_obj_t poc_cb)
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    mp_obj_t *items = NULL;
+       size_t len = 0;
+       mp_obj_list_get(poc_uid, &len, &items);
+    poc_uid_t * uids =(poc_uid_t *) calloc(len,sizeof(poc_uid_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0 ;i<len ;i++){
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (poc_uid_t) mp_obj_get_int(items[i]);
+    }
+    mp_sched_schedule_callback_register(&(poc_obj.callusers_callback), poc_cb);
+    ret = poc_ops->callusers(uids,len,qpy_poc_callusers_callback);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_callusers_obj, qpy_poc_callusers);
 
 STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
 
@@ -1353,6 +1543,12 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_Set_Current_Groupahead), MP_ROM_INT(SET_CURRENT_GROUP_AHEAD) },
     { MP_ROM_QSTR(MP_QSTR_Clear_Group_Member), MP_ROM_INT(CLEAR_GROUP_MEMBER) },
     
+    { MP_ROM_QSTR(MP_QSTR_register_weather_info_cb), MP_ROM_PTR(&qpy_poc_register_weather_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_request_weather_info), MP_ROM_PTR(&qpy_poc_request_weather_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_cell_location_change_cb), MP_ROM_PTR(&qpy_poc_register_cell_location_change_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_request_lbs_info_cb), MP_ROM_PTR(&qpy_poc_register_request_lbs_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_request_lbs_info), MP_ROM_PTR(&qpy_poc_request_lbs_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_callusers), MP_ROM_PTR(&qpy_poc_callusers_obj) },
 };
 
 STATIC MP_DEFINE_CONST_DICT(mp_module_poc_globals, mp_module_poc_globals_table);
index 5b38b08..ca541a6 100644 (file)
@@ -43,11 +43,19 @@ static const poc_ops_t poc_ops = {
     .set_is_destroy_temp_call = broad_set_is_destroy_temp_call,
     .set_tone_enable = broad_set_tone_enable,
     .register_location_change_cb = broad_register_location_change_cb,
+    .register_cell_location_change_cb = broad_register_cell_location_change_cb,
+    .register_request_lbs_info_cb = broad_register_request_lbs_info_cb,
+    .request_lbs_info = broad_request_lbs_info,
     .register_member_list_update_cb = broad_register_member_list_update_cb,
     
     .login_by_saved   = broad_login_by_saved,
     .change_logininfo = broad_change_logininfo,
     .get_logininfo = broad_get_logininfo,
+
+    .register_weather_info_cb = broad_register_weather_info_cb,
+    .request_weather_info = broad_request_weather_info,
+
+    .callusers = broad_callusers,
 };
 
 poc_ops_t* poc_get_ops() {
index 362256e..76f7416 100644 (file)
@@ -38,6 +38,20 @@ typedef unsigned int ydwl_rid_t;
 #define YDWL_GROUP_NUM_MAX 64
 #define YDWL_RECORD_NUM_MAX 64
 #define YDWL_MEMBER_NUM_MAX 1024
+#define YDWL_LOCATION_ADDR_NUM_MAX 256
+
+#define MCU_SETING_IP_MAX_LEN          16
+#define MCU_SETING_ACC_MAX_LEN         20
+#define MCU_SETING_PASS_MAX_LEN                20
+#define MCU_SETING_DOMAIN_MAX_LEN      50
+
+#define MCU_SETING_APN_INFOR_LEN       50
+#define MCU_SETING_AGENT_PWD_LEN       20
+
+#define ZMCU_SETING_VALID_FLG          0xa0a0a0a0
+#define YDWL_CFG_FILE_PATH                     "UFS:CFG.bin"  
+#define YDWL_LOGIN_FILE_PATH           "UFS:LOGIN.CFG"
+#define PWD_SUPER_USER                 "TYTYD998"
 
 typedef enum AUDIO_STATE{
     AUDIO_IDLE,
@@ -74,7 +88,7 @@ typedef enum YDWL_CUSTOM_TYPE{
 typedef struct _ydwl_group_t
 {
        ydwl_gid_t              gid;            //群组ID
-       char            name[YDWL_NAME_LEN];            //群组名
+       char            name[YDWL_NAME_LEN];            //群组�?
        // YDWL_GROUP_TYPE      type;           //群组类型
        int                     index;
 } ydwl_group_t;
@@ -82,8 +96,8 @@ typedef struct _ydwl_group_t
 typedef struct _ydwl_member_t {
        ydwl_uid_t uid;
        char name[YDWL_NAME_LEN];
-       int state; //1å\9c¨çº¿ï¼\8c2,离线ï¼\8c3在线在组
-       // unsigned int prior;          ///< 优先级
+       int state; //1å\9c¨çº¿ï¿½?2,离线�?3在线在组
+       // unsigned int prior;          ///< 优先�?
        int index;
 }ydwl_member_t;
 
@@ -95,7 +109,6 @@ typedef struct
        unsigned char ucTotRecord;
        unsigned char ucAddPtr;
        unsigned char ucFoldercnt;
-    char FolderName[RECORD_MAX_SIZE][FILE_NAME_MAX_SIZE];
        char ucFolderName[RECORD_MAX_SIZE][FILE_NAME_MAX_SIZE];
        char ucFileName[RECORD_MAX_SIZE][FILE_NAME_MAX_SIZE];
        char ucUserName[RECORD_MAX_SIZE][FILE_NAME_MAX_SIZE];
@@ -169,11 +182,25 @@ typedef struct
        st_weather iWeather[4];
 }stWeather_info;
 
+typedef struct
+{
+       int state;
+       ydwl_uid_t uid;
+       char name[YDWL_NAME_LEN];
+}login_sta_t;
+
+typedef struct
+{
+       char ip[64];
+       char account[64];
+       unsigned char inv;
+}account_info_t;
+
 typedef struct
 {
        double lat;
     double lng;
-    char addr[128];
+    char addr[YDWL_LOCATION_ADDR_NUM_MAX];
 }st_location;
 
 typedef enum {
@@ -183,6 +210,65 @@ typedef enum {
     RECORD_STATE_NO_SDCARD,
 }record_state_e;
 
+typedef enum {
+       INVITE_DEFAULT = 0,
+    INVITE_OK,                 //呼叫成功
+       INVITE_FAILD,           //呼叫失败
+       SINGLE_INVITE_FAILD,//单呼呼叫失败
+       EXIT_INVITE,            //退出临时呼叫
+       BEINVITE,                       // 被呼叫
+       ACCOUNT_OR_PASSWORD_INCORRECT, // 账号或者密码错误
+       BORDCAST_MESSAGE,
+}invite_info_e;
+
+typedef enum
+{
+       WRITE_CODE_CMD_NO,
+       WRITE_CODE_CMD_VER,
+       WRITE_CODE_CMD_APN_ID,
+       WRITE_CODE_CMD_APN_PWD,
+       WRITE_CODE_CMD_MCU_ID,
+       WRITE_CODE_CMD_MCU_PWD,
+       WRITE_CODE_CMD_MCU_IP,
+       WRITE_CODE_CMD_DEALERS_PWD,
+       WRITE_CODE_CMD_GPS_ENABLE,
+       WRITE_CODE_CMD_OUTLINE_SOUND,
+       WRITE_CODE_CMD_CALL_ENABLE,
+       WRITE_CODE_PARA_RUN,
+       WRITE_CODE_CMD_PAT_IP = 0x10,
+       WRITE_CODE_CMD_USING_ICCID,
+       WRITE_CODE_CMD_GPS_IP,
+       WRITE_CODE_CMD_GPS_PORT,
+       WRITE_CODE_END,
+}WRITE_CODE_CMD;
+
+typedef struct
+{
+       char ip[MCU_SETING_IP_MAX_LEN];
+       char account[MCU_SETING_ACC_MAX_LEN];
+       char passwd[MCU_SETING_PASS_MAX_LEN];
+
+       char apnname[MCU_SETING_APN_INFOR_LEN];
+       char apnacc[MCU_SETING_APN_INFOR_LEN];
+       char apnpwd[MCU_SETING_APN_INFOR_LEN];
+
+       char agentpwd[MCU_SETING_AGENT_PWD_LEN];
+
+       char inviteFlg;
+       char offlineFlg;
+       char gps_sw;
+
+       unsigned int uiApnValidFlg;
+       unsigned int uiServerCfg;
+       unsigned int ucValidFlg;
+}stPocSetPar;
+
+typedef struct tagLoginCfg
+{
+       char cDefAddr[MCU_SETING_IP_MAX_LEN];
+       unsigned int uiLoginType;
+       unsigned int uiValidFlg;
+}stLoginCfg;
 
 typedef void (*join_group_cb)(char *groupname,int groupid);
 typedef void(*login_state_cb)(int logstate);
@@ -190,8 +276,14 @@ typedef void(*init_cb)(int initstate);
 typedef void(*listupdate_cb)(int change);
 typedef void(*audio_cb)(int state,int uid,char *name,int flag);
 typedef void(*callmember_cb)(int ret);
-typedef void(*weather_info_cb)(char *lbs_tts, char is_lbs_tts);
-typedef void(*notify_spker_cb)(int allow_speak, ydwl_uid_t uid);
+typedef void(*notify_spker_cb)(int allow_speak, ydwl_uid_t uid, char *name);
+typedef void (*sos_cb)(char *sos_name);
+typedef void (*ctrl_pa_cb)(int pa_sta);
+typedef void (*invite_info_cb)(int invite_info, char *user_name);
+typedef void (*cell_locator_info_cb)(float lat, float lng);
+typedef void(*weather_info_cb)(void);
+typedef void(*map_png_cb)(int state);
+typedef void(*get_login_sta_cb)(int state, int uid, char* name);
 
 extern int ydmain_task_init(void *arg);
 
@@ -210,7 +302,7 @@ int py_ydwl_poc_calluser(const ydwl_uid_t uid ,callmember_cb cb);
 int py_ydwl_poc_group_getbyindex(int index,ydwl_group_t * dst);
 // int py_ydwl_poc_group_getbyid(ydwl_gid_t gid,ydwl_group_t* dst);
 int py_ydwl_poc_member_getbyid(ydwl_uid_t uid,ydwl_member_t* dst);
-int py_ydwl_poc_get_loginstate(void);
+login_sta_t* py_ydwl_poc_get_loginstate(void);
 int py_ydwl_poc_get_groupcount(void);
 int py_ydwl_poc_get_grouplist(ydwl_group_t** dst);
 int py_ydwl_poc_get_membercount(ydwl_gid_t gid);
@@ -219,18 +311,37 @@ void py_ydwl_poc_get_version(char* ver);
 void py_ydwl_poc_register_audio_cb(audio_cb cb);
 void py_ydwl_poc_register_join_group_cb(join_group_cb cb);
 void py_ydwl_poc_register_listupdate_cb(listupdate_cb cb);
+int py_ydwl_poc_request_weather(void);
 int py_ydwl_poc_get_weather(stWeather_info ** weather_info);
 void py_ydwl_poc_register_notify_spker_cb(notify_spker_cb cb);
+void py_ydwl_poc_register_sos_cb(sos_cb cb);
+void py_ydwl_poc_register_ctrl_pa_cb(ctrl_pa_cb cb);
+void py_ydwl_poc_register_weather_info_cb(weather_info_cb cb);
+void py_ydwl_poc_register_map_png_cb(map_png_cb cb);
+void py_ydwl_poc_register_login_sta_cb(get_login_sta_cb cb);
+
 int py_ydwl_poc_record_onoff(boolean enable);
-// int py_ydwl_poc_record_clear(void);
-int py_ydwl_poc_record_get_list(ydwl_record_list_t **dst);
+int py_ydwl_poc_record_get_folder_list(ydwl_record_list_t **dst);
+int py_ydwl_poc_record_get_file_list(ydwl_record_list_t **dst, int index);
 int py_ydwl_poc_record_req_play(char* record_file);
 int py_ydwl_poc_record_stop_play(void);
-// int py_ydwl_poc_record_save_flash(void);
+
 record_state_e py_ydwl_poc_record_get_state(void);
 void py_ydwl_tts_init(ydwl_tts_cb_type usr_cb);
 void py_ydwl_tts_play(const char* string, unsigned int len);
 int py_ydwl_set_volume(int type, int vol);
 int py_ydwl_poc_send_map_request(double lat, double lng, int w, int h);
+account_info_t * py_ydwl_poc_get_account_info(void);
+int py_ydwl_poc_report_alarm(double lat, double lng);
+int py_ydwl_poc_stop_alarm(void);
+int py_ydwl_poc_ignore_alarm(void);
+void py_ydwl_poc_register_invite_info_cb(invite_info_cb cb);
+void py_ydwl_poc_register_cell_locator_info_cb(cell_locator_info_cb cb);
+int py_ydwl_poc_gps_send_location(double lat, double lng);
+stPocSetPar * ydwl_poc_get_cfg_from_file(void);
+stLoginCfg * ydwl_poc_get_login_from_file(void);
+int ydwl_poc_set_cfg(uint8_t *data, int len);
+stPocSetPar * ydwl_poc_get_cfg(void);
+int py_ydwl_set_icmic_gain(int ana_gain, int adc_gain);
 
 #endif // __POC_YDWL_API_H__
index b18e05e..fc0d679 100644 (file)
@@ -1,3 +1,8 @@
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
 
 #include "poc_ydwl_api.h"
 #include "helios.h"
 #include "helios_audio.h"
 
 
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
 
-#define ydwl_poc_debug(fmt, ...) custom_log(APP, fmt, ##__VA_ARGS__)
+#define ydwl_poc_debug(fmt, ...) custom_log("ydwl", fmt, ##__VA_ARGS__)
 
 
 extern QDIR* Helios_fdiropen(const char *path);
@@ -34,54 +35,38 @@ extern int Helios_fdirclose(QDIR *pdir);
 #define SIM_ID 0
 #define CORGET_PROFILE_IDX 1
 #define RECORD_MAX_SIZE 30
-#define AUDIO_PA_CONTRL_PIN HELIOS_GPIO3 //外接硬件
-
 #define CMD_MAX_LEN 512
 
-typedef struct {
-       Helios_GPIONum                  gpio_num;
-       Helios_GPIOInitStruct   gpio_struct;
-}GPIOP_CFG;
-
-static GPIOP_CFG _gpio_cfg[] = 
-{      /* gpio_num             gpio_dir                        gpio_pull                       gpio_lvl    */
-    {  AUDIO_PA_CONTRL_PIN,    {HELIOS_GPIO_OUTPUT,    HELIOS_PULL_UP,       HELIOS_LVL_LOW }},
-};
-
-#define USE_CORGET_POC_UART 0
-
-#if USE_CORGET_POC_UART
-#define CORGET_USE_DEFAULT_UART 1
-#endif
-
-// static uint8_t data_call_success = 0;
-// static void *ptt_key_event_flag = NULL;
-
 static init_cb init_callback = NULL;
 static login_state_cb login_cb = NULL;
 static join_group_cb join_group_callback = NULL;
+static sos_cb sos_callback = NULL;
 static callmember_cb callmember_callback = NULL;
 static listupdate_cb listupdate_callback = NULL;
-static weather_info_cb weather_info_callback = NULL;
 static notify_spker_cb notify_spker_callback = NULL;
-// static audio_cb audio_callback = NULL;
-
+static invite_info_cb invite_info_callback = NULL;
+static cell_locator_info_cb cell_locator_info_callback = NULL;
+static ctrl_pa_cb ctrl_pa_callback = NULL;
+static weather_info_cb weather_info_callback = NULL;
+static map_png_cb map_png_callback = NULL;
+static get_login_sta_cb get_login_sta_callback = NULL;
 static int ydwl_poc_is_init = 0;
 
 static char group_name[YDWL_NAME_LEN] = {0};
 static ydwl_gid_t group_id = 0;
-static int poc_login_state = 0; // 0:离线, 1:登录中, 2:登录成功, 3:注销中, 
+static int poc_login_state = 0; // 0:离线, 1:登录�?, 2:登录成功, 3:注销�?, 
 
 
 ydwl_group_t ydwl_group[YDWL_GROUP_NUM_MAX] = {0};
 ydwl_member_t ydwl_member[YDWL_MEMBER_NUM_MAX] = {0};
 ydwl_record_list_t ydwl_record_list = {0};
-char recordFolder[12];
 unsigned char ucRecordSel;
+stPocSetPar iPocSet = {0};
+stLoginCfg iLoginCfg;
 
 Helios_MsgQ_t ydwl_msg_queue_t = 0;
-Helios_Sem_t ydwl_weather_sem = 0;
-Helios_MsgQ_t ydwl_map_queue = 0;
+Helios_Sem_t ydwl_get_account_sem = 0;
+
 
 #define AT_BUF_SIZE                            512
 #define POC_AT_NET_PORT                        10086
@@ -93,12 +78,18 @@ struct sockaddr_in gmcusin;
 Helios_Thread_t at_recv_task_id = 0;
 stWeather_info iWeather;
 st_location    location;
+login_sta_t login_sta;
+account_info_t act_info;
+static char sos_name[YDWL_NAME_LEN] = {0};
+static char user_single_call_name[YDWL_NAME_LEN] = {0};
+static char user_call_name[YDWL_NAME_LEN] = {0};
 
 int ydwl_poc_cmd_write(char *pCmd, long Leng);
 
 unsigned char ucMcuReady = 0;
 
 record_state_e record_state = RECORD_STATE_DEFAULT;
+const char *pDefaultIp = "114.141.132.4";
 
 extern int ydmain_task_init(void *arg);
 
@@ -112,28 +103,42 @@ static void string2hex(char *str, char *hex, int length)
        }
 }
 
-// static char ascii_to_char(char a, char b) {
-//     char high = 0, low = 0;
+static char ascii_to_char(char a, char b) {
+    char high = 0, low = 0;
 
-//     if (a >= '0' && a <= '9') {
-//         high = a - '0';
-//     } else if (a >= 'A' && a <= 'F') {
-//         high = a - 'A' + 10;
-//     } else if (a >= 'a' && a <= 'f') {
-//         high = a - 'a' + 10;
-//     }
+    if (a >= '0' && a <= '9') {
+        high = a - '0';
+    } else if (a >= 'A' && a <= 'F') {
+        high = a - 'A' + 10;
+    } else if (a >= 'a' && a <= 'f') {
+        high = a - 'a' + 10;
+    }
 
-//     if (b >= '0' && b <= '9') {
-//         low = b - '0';
-//     } else if (b >= 'A' && b <= 'F') {
-//         low = b - 'A' + 10;
-//     } else if (b >= 'a' && b <= 'f') {
-//         low = b - 'a' + 10;
-//     }
+    if (b >= '0' && b <= '9') {
+        low = b - '0';
+    } else if (b >= 'A' && b <= 'F') {
+        low = b - 'A' + 10;
+    } else if (b >= 'a' && b <= 'f') {
+        low = b - 'a' + 10;
+    }
 
-//     char ascii_code = (high << 4) | low; 
-//     return ascii_code;
-// }
+    char ascii_code = (high << 4) | low; 
+    return ascii_code;
+}
+
+const  double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
+static void bd_encrypt(double gg_lat,double gg_lon)//火星坐标转百度坐标
+{
+    double x,y,z,theta;
+  
+    x = gg_lon;
+       y = gg_lat;
+    z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);
+    theta = atan2(y, x) + 0.000003 * cos(x * x_pi);
+    location.lng = z * cos(theta) + 0.0065;
+    location.lat = z * sin(theta) + 0.006;
+
+}
 
 static char char_to_ascii(char c)
 {
@@ -216,7 +221,7 @@ static int unicode2utf8(unsigned char *src, int slen, char *dst,int dlen)
        if(!src || !dst || !dlen)
                return -1;
 
-       // 长度必须为2的倍数,需转换成unsigned short类型
+       // 长度必须�?2的倍数,需转换成unsigned short类型
        if(slen%2)
                return -2;
 
@@ -229,13 +234,13 @@ static int unicode2utf8(unsigned char *src, int slen, char *dst,int dlen)
                // printf("[%s](%d) unicode=%x\n",__func__,__LINE__,unicode);
                if(unicode == 0)
                        break;
-               // 预留3个字节,不足则错误
+               // 预留3个字节,不足则错�?
                if(olen > (dlen-3)){
                        olen = -3;
                        break;
                }
 
-               if ( unicode <= 0x0000007F ){   //1个字节
+               if ( unicode <= 0x0000007F ){   //1个字�?
                        // U-00000000 - U-0000007F:  0xxxxxxx
                        *dst++  = (unicode & 0x7F);
                        olen += 1;
@@ -244,7 +249,7 @@ static int unicode2utf8(unsigned char *src, int slen, char *dst,int dlen)
                        *dst++  = ((unicode >> 6) & 0x1F) | 0xC0;
                        *dst++  = (unicode & 0x3F) | 0x80;
                        olen += 2;
-               }else if ( unicode >= 0x00000800 && unicode <= 0x0000FFFF ){                    //3个字节
+               }else if ( unicode >= 0x00000800 && unicode <= 0x0000FFFF ){                    //3个字�?
                        // U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
                        *dst++  = ((unicode >> 12) & 0x0F) | 0xE0;
                        *dst++  = ((unicode >>  6) & 0x3F) | 0x80;
@@ -586,37 +591,88 @@ static void ydwl_poc_notify_status_cmd_notify(char *data, int len) {
     // add member_list not end
     // +POC:82 02 000b25e7 797213661a904b6dd58bf696f696004e0000
     char state_char[3] = {0};
-    char user_id_char[8] = {0}; 
+    char user_id_char[10] = {0}; 
+    char *name_char = NULL;
 
     memcpy(state_char, data+7, 2);
-    poc_login_state = hex2dec(state_char);
-    ydwl_poc_debug("poc_login_state :%s,%d\n", state_char, poc_login_state);
+    login_sta.state = hex2dec(state_char);
+    ydwl_poc_debug("login_sta.state :%s,%d\n", state_char, login_sta.state);
+
+    if (login_sta.state == 2) {
+        memcpy(user_id_char, data+9, 8);
+        login_sta.uid = (ydwl_uid_t)hex2dec(user_id_char);
+
+        if (login_sta.name[0] != '\0')
+        {
+            memset(login_sta.name, 0, 64);
+        }
+        int info_len = strlen(data)-7-2-8-4-1;
+        name_char = malloc(info_len+1);
+        if (name_char == NULL) {
+            printf("name_char malloc failed.");
+            return;
+        }
+        memset(name_char, 0, info_len+1);
+        memcpy(name_char, data+17, info_len);
+
+        unsigned char *name_hex = NULL;
+        name_hex = malloc(strlen(name_char)/2);
+        if (name_hex == NULL) {
+            printf("name_hex malloc failed.");
+            return;
+        }
+
+        HexStrToByte(name_char, name_hex, strlen(name_char));
+        unsigned short *hex = name_hex;
+        unicode2utf8((unsigned char *)hex, strlen(name_char)/2, login_sta.name, 64);
+        ydwl_poc_debug("login_sta.name :%s, decode name:%s\n", name_char, login_sta.name);
+        if(name_char)
+        {
+            free(name_char);
+            name_char= NULL;
+        }
+        if(name_hex)
+        {
+            free(name_hex);
+            name_hex= NULL;
+        }
+    }
+    
 }
 
 static void ydwl_poc_notify_spker_cmd_notify(char *data, int len) {
     // +POC:83 01 ffffffff0000
     // +POC:83 00 000b26c4 4b6dd58b3a6733000000
+    // +POC:83 01 000b26c4 4b6dd58b3a6733000000
     int spk_allow = 0;
     ydwl_uid_t spk_uid = 0; 
     char spk_allow_char[3] = {0};
     char spk_uid_char[10] = {0};
-
+    ydwl_poc_debug("spker_cmd_notify data :%s\n", data);
     memcpy(spk_allow_char, data+7, 2);
     spk_allow = hex2dec(spk_allow_char);
-    if (spk_allow == 0) {
-        memcpy(spk_uid_char, data+9, 8);
-        spk_uid = (ydwl_uid_t)hex2dec(spk_uid_char);
+    if(strncmp(&data[9], "ffff", 4) == 0) {
+        spk_uid = 0;
     }
     else {
-        spk_uid = 0;
+        memcpy(spk_uid_char, data+9, 8);
+        spk_uid = (ydwl_uid_t)hex2dec(spk_uid_char);
+        char name_char[48] = {0};
+        char name_hex[48] = {0};
+        strcpy(name_char, &data[17]);
+        HexStrToByte(name_char, (unsigned char*)name_hex, strlen(name_char));
+        unsigned short *hex = name_hex;
+        unicode2utf8((unsigned char *)hex, strlen(name_char)/2, user_call_name, 64);
+        ydwl_poc_debug("user_call_name-%s!\n", user_call_name); 
     }
+    ydwl_poc_debug("spk_allow:%d, spk_uid:%d\n", spk_allow, spk_uid);
     
     if (notify_spker_callback) {
-        notify_spker_callback(spk_allow, spk_uid);
+        notify_spker_callback(spk_allow, spk_uid, user_call_name);
     }
 }
 
-// 该函数用于向发送 POC 应用指令之后接收指令响应和接收 POC 的状态通知
+// 该函数用于向发�? POC 应用指令之后接收指令响应和接�? POC 的状态通知
 static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
 {
     ydwl_poc_debug("recv ydwl cmd rsp, data:%s, len:%d, type:%d\n", data, len, type);
@@ -636,17 +692,65 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
     else if (!strncmp(data, "+POC:82", 7))
     {
         ydwl_poc_notify_status_cmd_notify(data, len);
+        if (get_login_sta_callback) {
+            get_login_sta_callback(login_sta.state, (int)login_sta.uid, login_sta.name);
+        }
     }
-     //POC notify speaker
+    //POC notify speaker
     else if (!strncmp(data, "+POC:83", 7))
     {
         ydwl_poc_notify_spker_cmd_notify(data, len);
     }
+    //POC notify info
+    else if (!strncmp(data, "+POC:84", 7))
+    {   
+        int invite_info = INVITE_DEFAULT;
+        if(strncmp(&data[9], "7c54eb5310629f52", 16) == 0)             //0: 呼叫成功
+               {
+            invite_info = INVITE_DEFAULT;
+               }
+               else if(strncmp(&data[9], "0090fa51344ef6657c54eb53", 24) == 0)//4: 退出临时呼叫
+               {                                                       
+            invite_info = EXIT_INVITE;
+               }               
+               else if(strncmp(&data[9], "7c54eb533159258d", 16) == 0)//3: 单呼呼叫失败
+               {
+            invite_info = SINGLE_INVITE_FAILD;
+               }
+               else if(strncmp(&data[9], "7c54fa513159258d", 16) == 0) //2: 呼出失败(按PTT时异常提醒)
+               {
+            invite_info = INVITE_FAILD; // release ptt
+               }
+               else if(strncmp(&data[9], "344ef6657c54eb53", 16) == 0) //5:被单呼呼叫
+               {
+                       invite_info = BEINVITE;
+            char name_char[48] = {0};
+            char name_hex[48] = {0};
+            strcpy(name_char, &data[25]);
+            HexStrToByte(name_char, (unsigned char*)name_hex, strlen(name_char));
+            unsigned short *hex = name_hex;
+            unicode2utf8((unsigned char *)hex, strlen(name_char)/2, user_single_call_name, 64);
+            ydwl_poc_debug("user_single_call_name-%s!\n", user_single_call_name); 
+               }
+        else if(strncmp(&data[9], "8d2653f762165bc6780195198bef", 28) == 0)    //6: 账号或密码错误
+               {
+            invite_info = ACCOUNT_OR_PASSWORD_INCORRECT; 
+               }
+               else
+               {
+                       invite_info = BORDCAST_MESSAGE;
+               }       
+        if (invite_info_callback) {
+            invite_info_callback(invite_info, user_single_call_name);
+        }
+    }
     //current group
     //+POC:86 00(01) 000a8d81 fb79dc8f216a5757038cd58b32000000
     //+POC:86 00 ffffffff 0000
     else if ((len > 25) && (strstr(data, "+POC:860")))
     {
+        login_sta.state = 2; // ydwl特殊策略,上电登录过一次以后登录状态就不会再上报了,以群组更新指令86为准,此时认为登录
+        ydwl_poc_debug("recv +POC:860, login_sta:%d!\n", login_sta.state);
         join_group_handler(data, len);
     }
     // call_user_callback
@@ -717,50 +821,51 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
     // open poc ack
     else if(strncmp(data, "+POC:8b000", 10) == 0)
        {
-               // if(data[10] == '1' )
-               // {
-               //      // 打开PA
-               //      ydwl_poc_debug("[open pa]+POC:8b0001\n");       
-               //      Helios_GPIO_SetLevel(_gpio_cfg[0].gpio_num, HELIOS_LVL_HIGH);
-               // }
-               // else if(data[10] == '2')
-               // {
-               //      ydwl_poc_debug("[open pa]+POC:8b0002\n");
-        //     Helios_GPIO_SetLevel(_gpio_cfg[0].gpio_num, HELIOS_LVL_HIGH);
-               // }
-               // else
-               // {
-        //     ydwl_poc_debug("[close pa]+POC:8b0000\n");
-               //      // 关闭PA
-        //     Helios_GPIO_SetLevel(_gpio_cfg[0].gpio_num, HELIOS_LVL_LOW);
-               // }
+        int pa_ctrl = 0;
+        if(data[10] == '1') {
+            pa_ctrl = 1; 
+        }
+        else if(data[10] == '2') {
+            pa_ctrl = 2;
+        }
+        else {
+            pa_ctrl = 0;
+        }
+        if (ctrl_pa_callback) {
+            ctrl_pa_callback(pa_ctrl);
+        }
        }
-    // This interface is no longer used
-    // else if (strncmp(data, "+POC:90", 7) == 0)
-    // {
-    //     // 获取录音列表
-    //     //Recv AT:+POC:9000000003323032313036303531303034333428373330363239292e7761760000
-    //     if (ydwl_record_cur < YDWL_RECORD_NUM_MAX)
-       //      {
-       //              unsigned char index;
-       //              unsigned char i = 0;
-
-       //              for (index = 15; index < 43; index += 2)
-       //              {
-       //                      ydwl_record_list[ydwl_record_cur].FileName[i++] = ascii_to_char(data[index], data[index + 1]);
-       //              }
-
-       //              i = 0;
-       //              index = 45;
-       //              while (ascii_to_char(data[index], data[index + 1]) != '.' && index < strlen(data))
-       //              {
-       //                      ydwl_record_list[ydwl_record_cur].UserName[i++] = ascii_to_char(data[index], data[index + 1]);
-       //                      index += 2;
-       //              }
+    else if(strncmp(data, "+POC:8e00", 9) == 0)
+       {
+               data[len-1] = 0;
+               data[len-2] = 0;        
+               unsigned char ucLen = strlen(data);
+               unsigned char ucIdx;
+        char name_char[64] = {0};
+        char name_hex[64] = {0};
+               for(ucIdx=13; ucIdx<ucLen; ucIdx+=2)
+               {
+                       if(data[ucIdx]=='0' && data[ucIdx+1]=='0')
+                       {
+                               strcpy(name_char, &data[ucIdx+2]);
+                               break;
+                       }
+               }
+        HexStrToByte(name_char, (unsigned char*)name_hex, strlen(name_char));
+        unsigned short *hex = name_hex;
+        unicode2utf8((unsigned char *)hex, strlen(name_char)/2, sos_name, 64);
+        ydwl_poc_debug("sos_name-%s!\n", sos_name); 
         
-       //              ydwl_record_cur++;
-       //      }
-    // }
+        if (sos_callback) {
+            sos_callback(sos_name);
+        }
+       }
+    else if(strncmp(data, "+POC:8f00", 9) == 0) {
+        memset(sos_name, 0, YDWL_NAME_LEN);
+        if (sos_callback) {
+            sos_callback(sos_name);
+        }
+    }
     else if(strncmp(data, "+POC:9500", 9) == 0)
        {
                static unsigned int ucIdx_i = 0,ucIdx_cnt = 0;
@@ -826,26 +931,120 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
                if(ucIdx_cnt >= 2)
                {
                        ucIdx_cnt = 0;
-                       Helios_Semaphore_Release(ydwl_weather_sem);
+                       if (weather_info_callback) {
+                weather_info_callback();
+            }
                }
                else
                {
                        ucIdx_cnt++;
                }
        }
+    else if(strncmp(data, "+POC:0200", 9) == 0)
+       {
+               unsigned int ucIdx = 0;
+
+
+        memset(act_info.account, 0, 64);
+        memset(act_info.ip, 0, 64);
+               char *pAcc = strstr(data, "69643d");//id=
+               pAcc += 6;
+               while(*pAcc != 0)
+               {
+                       if(*pAcc == '3' && *(pAcc+1) == 'b')
+                               break;
+                       
+                       act_info.account[ucIdx++] = ascii_to_char(*pAcc, *(pAcc+1));
+                       pAcc += 2;
+               }
+               act_info.account[ucIdx] = 0;
+                       
+               ucIdx = 0;
+               pAcc = strstr(data, "69703d");//ip=
+               pAcc += 6;
+               while(*pAcc != 0)
+               {
+                       if(*pAcc == '3' && *(pAcc+1) == 'b')
+                               break;          
+                       
+                       act_info.ip[ucIdx++] = ascii_to_char(*pAcc, *(pAcc+1));
+                       pAcc += 2;
+               }
+               act_info.ip[ucIdx] = 0;
+
+        ucIdx = 0;
+               pAcc = strstr(data, "696e763d");//inv=
+               pAcc += 9;
+        if(*pAcc == '1')
+                       act_info.inv = 1;
+               else
+                       act_info.inv = 0;
+        Helios_Semaphore_Release(ydwl_get_account_sem);
+    }
        else if(strncmp(data, "+POC:9600", 9) == 0)
        {
-               
+               unsigned int ucIdx_ii = 0;
+               unsigned int ucIdx = 0; 
+               char buf[24]={0};
+        char* haystack = &data[9];
+        char needle[]="2c00";
+        char* ret = strstr(haystack, needle);  
+               memset(&location, 0, sizeof(location));
+               while( ret != NULL)
+               {
+                       ret[0]='\0';
+                   switch(ucIdx_ii)
+                       {
+                               case 0:
+                               while(*haystack != 0)
+                               {
+                                       if(*haystack == '3' && *(haystack+1) == 'b')
+                                       break;
+                                       
+                                       buf[ucIdx++] = ascii_to_char(*haystack, *(haystack+1));
+                                       haystack += 4;
+                               }
+                               buf[ucIdx] = 0; 
+                               location.lat = atof(buf); 
+                               break;
+                               case 1:
+                               ucIdx = 0;
+                               while(*haystack != 0)
+                               {
+                                       if(*haystack == '3' && *(haystack+1) == 'b')
+                                       break;
+                                       
+                                       buf[ucIdx++] = ascii_to_char(*haystack, *(haystack+1));
+                                       haystack += 4;
+                               }
+                buf[ucIdx] = 0; 
+                               location.lng = atof(buf);
+                               break;  
+                       }
+                       haystack = ret + strlen(needle);
+                       ret = strstr( haystack, needle);
+                       ucIdx_ii++;
+               }
+               strncpy(location.addr, haystack, YDWL_LOCATION_ADDR_NUM_MAX-1);
+               ydwl_poc_debug( "addr->:%s-%d\r\n ",location.addr, ucIdx_ii);
+
+               bd_encrypt(location.lat, location.lng);
+        ydwl_poc_debug( "location.lat->:%f, lng:%f\r\n ",location.lat, location.lng);
+        if (cell_locator_info_callback) {
+            cell_locator_info_callback((float)location.lat, (float)location.lng);
+        }
        }
     else if(strncmp(data, "+POC:9700", 9) == 0) // receive map png
        {
-               uint8_t msg = 1;
-        Helios_MsgQ_Put(ydwl_map_queue, (void *)&msg, sizeof(uint8_t), HELIOS_WAIT_FOREVER);
+               if (map_png_callback) {
+            map_png_callback(1);
+        }
        }
     else if(strncmp(data, "+POC:9701", 9) == 0) // receive map png fail
        {
-               uint8_t msg = 0;
-        Helios_MsgQ_Put(ydwl_map_queue, (void *)&msg, sizeof(uint8_t), HELIOS_WAIT_FOREVER);
+               if (map_png_callback) {
+            map_png_callback(0);
+        }
        }
     else if (strncmp(data, "+POC:720000", 11) == 0) //record state
     {
@@ -874,7 +1073,7 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
     else
     {
         /*
-        // 未登录时候查询信息
+        // 未登录时候查询信�?
         if((action == GET_GROUP_COUNT || action == GET_GROUP_LIST))
         {
             ydwl_poc_debug("An error occurred when querying information\n");
@@ -887,13 +1086,9 @@ static int ydwl_poc_cmd_notify(char *data, int len, ENUM_MSG_TYPE type)
     return 0;
 }
 
-// audio 初始化
+// audio 初始�?
 static int ydwl_audio_init(void)
 {
-/*
-       Helios_GPIO_Deinit(_gpio_cfg[0].gpio_num);
-       Helios_GPIO_Init(_gpio_cfg[0].gpio_num, &(_gpio_cfg[0].gpio_struct));
-*/
     int ret = 0;
     ret = Helios_Audio_SetOutputChannle(HELIOS_OUTPUT_HEADPHONE);
     ret |= Helios_Audio_SetInputChannle(HELIOS_INPUT_MAINMIC);
@@ -1059,7 +1254,12 @@ int py_ydwl_poc_calluser(const ydwl_uid_t uid, callmember_cb cb)
     callmember_callback = cb;
     sprintf(cmd, "AT+POC=0A0000%08x\r\n", uid);
     ydwl_poc_debug("cmd: %s,cmd len is %d\n", cmd, strlen(cmd));
-    ret = ydwl_poc_cmd_write(cmd, strlen(cmd));
+    if (ydwl_poc_cmd_write(cmd, strlen(cmd)) >= 0) {
+        ret = 0;
+    }
+    else {
+        ret = -1;
+    }
     return ret;
 }
 
@@ -1080,10 +1280,13 @@ int py_ydwl_poc_group_getbyindex(int index,ydwl_group_t * dst){
 }
 
 
-int py_ydwl_poc_get_loginstate(void){
-    //int ret = POC_GetCurrentState();
-    //ret = poc_state_transation(ret);
-    return poc_login_state;
+login_sta_t* py_ydwl_poc_get_loginstate(void){
+    if (login_sta.state == 2) {
+        return &login_sta;
+    }
+    else {
+        return NULL;
+    }
 }
 
 int py_ydwl_poc_get_grouplist(ydwl_group_t** dst)
@@ -1182,18 +1385,20 @@ int py_ydwl_poc_get_memberlist(ydwl_gid_t gid, ydwl_member_t** dst)
     }
 }
 
-int py_ydwl_poc_get_weather(stWeather_info ** weather_info) {
+int py_ydwl_poc_request_weather(void) {
     int ret=0;
     char cmd[32]= {0};
     sprintf(cmd, "AT+POC=15000000\r\n");
     ydwl_poc_debug("cmd: %s,cmd len is %d\n", cmd, strlen(cmd));
     ydwl_poc_cmd_write(cmd, strlen(cmd));
-    ret = Helios_Semaphore_Acquire(ydwl_weather_sem, 10000);
-    ydwl_poc_debug("get weather ret: %d", ret);
-    *weather_info = &iWeather;
     return ret;
 }
 
+int py_ydwl_poc_get_weather(stWeather_info ** weather_info) {
+    *weather_info = &iWeather;
+    return 0;
+}
+
 void py_ydwl_poc_get_version(char* ver){
     //POC_getProtocolVersion(ver,64);
 }
@@ -1219,6 +1424,9 @@ static int record_folder_handle(void)
     qdirent *pDirInfo = NULL;
     int iOffset = 0,iFileCnt = 0;
     
+    ydwl_record_list.ucFoldercnt = 0;
+    memset(ydwl_record_list.ucFolderName, 0, sizeof(ydwl_record_list.ucFolderName));
+    
        pSdRoot = Helios_fdiropen("SD:/");
    
        if(pSdRoot == NULL)
@@ -1241,7 +1449,7 @@ static int record_folder_handle(void)
                if((pDirInfo->d_type == 4)&&(strlen(pDirInfo->d_name)<=10))
                {
 
-                       iFileCnt++;//获取文件夹个数
+                       iFileCnt++;//获取文件夹个�?
                        ydwl_poc_debug("[ poc SD]name:%s iFileCnt:%d\r\n",pDirInfo->d_name,iFileCnt); 
                }
                
@@ -1252,7 +1460,7 @@ static int record_folder_handle(void)
        }
        else
        {
-               iOffset = iFileCnt%RECORD_MAX_SIZE+RECORD_MAX_SIZE*(iFileCnt/RECORD_MAX_SIZE-1);        //超过30个文件 要读取的偏移位置
+               iOffset = iFileCnt%RECORD_MAX_SIZE+RECORD_MAX_SIZE*(iFileCnt/RECORD_MAX_SIZE-1);        //超过30个文�? 要读取的偏移位置
        }
        iFileCnt = 0;
 
@@ -1282,134 +1490,118 @@ static int record_folder_handle(void)
                        
                }
        }
-    // ydwl_poc_debug("[SD1]record Foldercnt :%d\r\n",ydwl_record_list.ucFoldercnt);
-    // int i;
-    // for (i=0;i<ydwl_record_list.ucFoldercnt;i++) {
-    //     ydwl_poc_debug("[SD1]record %d Folder name:%s\r\n",i+1,ydwl_record_list.ucFolderName[i]);
-    // }
        Helios_fdirclose(pSdRoot);
     return 0;
 }
 
-int record_file_handle(void)
+int record_file_handle(int index)
 {
     QDIR *pSdRoot;
        qdirent *pDirInfo;
        int iOffset = 0,iFileCnt = 0;
-       char cFilePath[20];
+       char cFilePath[40] = {0};
     int current_max_size = 30;
+    char recordFolder[12] = {0};
 
-    int i;
-    //从最后一个文件夹开始遍历录音文件
-    for (i=ydwl_record_list.ucFoldercnt;i>0;i--) 
-    {
-        // if record_list already fullsize then break
-        if ((ydwl_record_list.ucTotRecord >= RECORD_MAX_SIZE))
-        {
-            break;
-        }
-        ydwl_poc_debug("[SD1]record %d Folder name:%s\r\n",i,ydwl_record_list.ucFolderName[i-1]);
+    ydwl_record_list.ucAddPtr = 0;
+    ydwl_record_list.ucTotRecord = 0;
+    memset(ydwl_record_list.ucFileName, 0, sizeof(ydwl_record_list.ucFileName));
+    memset(ydwl_record_list.ucUserName, 0, sizeof(ydwl_record_list.ucUserName));
 
-        current_max_size = RECORD_MAX_SIZE - ydwl_record_list.ucTotRecord;
-        ydwl_poc_debug("[SD1]current_max_size left is %d\r\n",current_max_size);
-        memset(recordFolder, 0, sizeof(recordFolder));
-        memset(cFilePath, 0, sizeof(cFilePath));
+    if (index >= RECORD_MAX_SIZE) {
+        ydwl_poc_debug("index value exceeded the directory length..\n");
+        return -1;
+    }
 
-               memcpy(&recordFolder, &ydwl_record_list.ucFolderName[i-1],10);
-        sprintf(cFilePath, "%s/%s", "SD:", recordFolder);
+    memcpy(&recordFolder, &ydwl_record_list.ucFolderName[index], 10);
+    sprintf(cFilePath, "%s/%s", "SD:", recordFolder);
 
-        pSdRoot = Helios_fdiropen(cFilePath);//SD:2022042422
-        if(pSdRoot == NULL)
+    pSdRoot = Helios_fdiropen(cFilePath);//SD:2022042422
+    if(pSdRoot == NULL)
+    {
+        ydwl_poc_debug("record_file_handle open [ poc SD] error.\n");
+        return -1;
+    }
+    ydwl_poc_debug("record_file_handle [SD]Open SD root ok!!\r\n");
+
+    iFileCnt = 0;
+    while((pDirInfo = Helios_fdirread(pSdRoot))!=NULL)
+    {
+        if(pDirInfo->d_type == 8)
         {
-            ydwl_poc_debug("record_file_handle open [ poc SD] error.\n");
-            return -1;
+            iFileCnt++;//获取文件个数
+            ydwl_poc_debug("[SD]name:%s file_cnt:%d\r\n",pDirInfo->d_name,iFileCnt); 
         }
-        ydwl_poc_debug("record_file_handle [SD]Open SD root ok!!\r\n");
+        
+    }
+    if(iFileCnt<=RECORD_MAX_SIZE)
+    {
+        iOffset = 0;
+        ydwl_record_list.ucAddPtr = iFileCnt-1;
+    }
+    else
+    {
+        iOffset = iFileCnt%RECORD_MAX_SIZE + RECORD_MAX_SIZE*(iFileCnt/RECORD_MAX_SIZE-1);
+        ydwl_record_list.ucAddPtr = RECORD_MAX_SIZE - 1;
+    }
+    iFileCnt = 0;
 
-        iFileCnt = 0;
-        while((pDirInfo = Helios_fdirread(pSdRoot))!=NULL)
+    ydwl_poc_debug("[SD]iOffset:%d ydwl_record_list.ucAddPtr:%d \r\n", iOffset,ydwl_record_list.ucAddPtr); 
+    Helios_fdirseek(pSdRoot,0);
+    while((pDirInfo = Helios_fdirread(pSdRoot))!=NULL)
+    {
+        if((pDirInfo->d_type == 8)&&(ydwl_record_list.ucTotRecord < RECORD_MAX_SIZE))
         {
-            // type == 8 means type is file
-            if(pDirInfo->d_type == 8)
+            iFileCnt ++;
+            if(iOffset == 0)
             {
-                iFileCnt++;//获取文件个数
-                ydwl_poc_debug("[SD]name:%s file_cnt:%d\r\n",pDirInfo->d_name,iFileCnt); 
+                memcpy(ydwl_record_list.ucFileName[ydwl_record_list.ucAddPtr], pDirInfo->d_name, 17);          
+                memcpy(ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr], &pDirInfo->d_name[7], strlen(pDirInfo->d_name)-11);     
+                ydwl_record_list.ucAddPtr--;
+                ydwl_record_list.ucTotRecord++; 
             }
-            
-        }
-        if(iFileCnt<=current_max_size)
-        {
-            iOffset = 0;
-            ydwl_record_list.ucAddPtr = iFileCnt-1;
-        }
-        else
-        {
-            iOffset = iFileCnt%current_max_size+current_max_size*(iFileCnt/current_max_size-1);
-            ydwl_record_list.ucAddPtr = current_max_size - 1;
-        }
-        iFileCnt = 0;
-
-        ydwl_poc_debug("[SD]iOffset:%d ydwl_record_list.ucAddPtr:%d \r\n", iOffset,ydwl_record_list.ucAddPtr); 
-        Helios_fdirseek(pSdRoot,0);
-        // ydwl_poc_debug("[SD]readdir again iOffset:%d--offset:%d\r\n",iOffset,ql_seekdir(pSdRoot,0));
-        while((pDirInfo = Helios_fdirread(pSdRoot))!=NULL)
-        {
-            // ydwl_poc_debug("[SD1]readdir type:%d name:%s len:%d ucAddPtr:%d\r\n", pDirInfo->d_type, pDirInfo->d_name,strlen(pDirInfo->d_name),ydwl_record_list.ucAddPtr);   
-            if((pDirInfo->d_type == 8)&&(ydwl_record_list.ucTotRecord < RECORD_MAX_SIZE))
+            else
             {
-                iFileCnt ++;
-                if(iOffset == 0)
+                if(iFileCnt > iOffset)
                 {
-                    memcpy(ydwl_record_list.FolderName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], recordFolder, 10);
-                    memcpy(ydwl_record_list.ucFileName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], pDirInfo->d_name, 17);               
-                    memcpy(ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], &pDirInfo->d_name[7], strlen(pDirInfo->d_name)-11);  
+                    memcpy(ydwl_record_list.ucFileName[ydwl_record_list.ucAddPtr], pDirInfo->d_name, 17);              
+                    memcpy(ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr], &pDirInfo->d_name[7], strlen(pDirInfo->d_name)-11); 
                     ydwl_record_list.ucAddPtr--;
-                    ydwl_record_list.ucTotRecord++; 
-                    // ydwl_poc_debug("[SD]ucAddPtr:%d ucTotRecord:%d,ucUserName:%s\r\n", ydwl_record_list.ucAddPtr+1,ydwl_record_list.ucTotRecord, ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr+1]);
-                }
-                else
-                {
-                    if(iFileCnt > iOffset)
-                    {
-                        memcpy(ydwl_record_list.FolderName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], recordFolder, 10);
-                        memcpy(ydwl_record_list.ucFileName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], pDirInfo->d_name, 17);           
-                        memcpy(ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr + (RECORD_MAX_SIZE - current_max_size)], &pDirInfo->d_name[7], strlen(pDirInfo->d_name)-11);      
-                        ydwl_record_list.ucAddPtr--;
-                        ydwl_record_list.ucTotRecord++;
-                        // ydwl_poc_debug("[SD]ucAddPtr:%d ucTotRecord:%d,ucUserName:%s\r\n", ydwl_record_list.ucAddPtr+1,ydwl_record_list.ucTotRecord, ydwl_record_list.ucUserName[ydwl_record_list.ucAddPtr+1]);
-                    }
-                    
-                }
-                
-            }
+                    ydwl_record_list.ucTotRecord++;
+                }    
+            } 
         }
-        Helios_fdirclose(pSdRoot);
     }
-
-    // ydwl_poc_debug("[SD]record file cnt :%d\r\n",ydwl_record_list.ucTotRecord);
-    // int j;
-    // for (j=0;j<ydwl_record_list.ucTotRecord;j++) {
-    //     ydwl_poc_debug("[SD]record total %d file name:%s,username name:%s\r\n",ydwl_record_list.ucTotRecord,ydwl_record_list.ucFileName[j],ydwl_record_list.ucUserName[j]);
-    // }
+    Helios_fdirclose(pSdRoot);
     return 0 ;
 }
 
 // dir SD card to get 
-int py_ydwl_poc_record_get_list(ydwl_record_list_t **dst) 
+int py_ydwl_poc_record_get_folder_list(ydwl_record_list_t **dst) 
 {
     int ret = 0;
-    memset(&ydwl_record_list, 0, sizeof(ydwl_record_list));
 
     ret = record_folder_handle();
     if (ret != 0)
     {
         return ret;
     }
-    ret = record_file_handle();
+
+    *dst = &ydwl_record_list;
+    ret = ydwl_record_list.ucFoldercnt;
+    return ret;
+}
+
+int py_ydwl_poc_record_get_file_list(ydwl_record_list_t **dst, int index) 
+{
+    int ret = 0;
+
+    ret = record_file_handle(index);
     if (ret != 0)
     {
         return ret;
     }
+
     *dst = &ydwl_record_list;
     ret = ydwl_record_list.ucTotRecord;
     return ret;
@@ -1470,6 +1662,35 @@ void py_ydwl_poc_register_notify_spker_cb(notify_spker_cb cb) {
     notify_spker_callback = cb;
 }
 
+void py_ydwl_poc_register_sos_cb(sos_cb cb) {
+    sos_callback = cb;
+}
+
+void py_ydwl_poc_register_invite_info_cb(invite_info_cb cb) {
+    invite_info_callback = cb;
+}
+
+void py_ydwl_poc_register_cell_locator_info_cb(cell_locator_info_cb cb) {
+    cell_locator_info_callback = cb;
+}
+
+void py_ydwl_poc_register_ctrl_pa_cb(ctrl_pa_cb cb) {
+    ctrl_pa_callback = cb;
+}
+
+void py_ydwl_poc_register_weather_info_cb(weather_info_cb cb) {
+    weather_info_callback = cb;
+}
+
+
+void py_ydwl_poc_register_map_png_cb(map_png_cb cb) {
+    map_png_callback = cb;
+}
+
+void py_ydwl_poc_register_login_sta_cb(get_login_sta_cb cb) {
+    get_login_sta_callback = cb;
+}
+
 int py_ydwl_poc_send_map_request(double lat, double lng, int w, int h) {
     int i, j;
        char cCmd[128] = {0};
@@ -1490,15 +1711,84 @@ int py_ydwl_poc_send_map_request(double lat, double lng, int w, int h) {
     
     ydwl_poc_debug("cmd: %s,cmd len is %d\n", cCmd, strlen(cCmd));
     ydwl_poc_cmd_write(cCmd, strlen(cCmd));
-    uint8_t msg = 0;
-    int ret = -1;
-    if(Helios_MsgQ_Get(ydwl_map_queue, &msg, sizeof(uint8_t), 10000) == 0) {
-        if (msg == 1) {
-            ret = 0;
-        }
+    
+    return 1;
+}
+
+account_info_t * py_ydwl_poc_get_account_info(void) {
+    int ret=0;
+    char cmd[32]= {0};
+    sprintf(cmd, "AT+POC=45000000\r\n");
+    ydwl_poc_cmd_write(cmd, strlen(cmd));
+    ret = Helios_Semaphore_Acquire(ydwl_get_account_sem, HELIOS_WAIT_FOREVER);
+    ydwl_poc_debug("get account ret: %d", ret);
+    if (ret == 0) {
+        return &act_info;
+    }
+    else {
+        return NULL;
+    }
+}
+
+int py_ydwl_poc_report_alarm(double lat, double lng) {
+    int i, j;
+       char cCmd[128] = {0};
+    char cTmpDat[64] = {0};
+    memset(cCmd, 0, sizeof(cCmd));
+    sprintf(cTmpDat, "%lf,%lf",lat,lng);
+    strcat(cCmd, "AT+POC=530000");
+    j = strlen(cCmd);
+    i = 0;
+    while (cTmpDat[i])
+    {
+        cCmd[j++] = char_to_ascii(cTmpDat[i]>>4);
+        cCmd[j++] = char_to_ascii(cTmpDat[i]&0x0f);
+        i++;
+    }
+    cCmd[j++] = '0';
+    cCmd[j++] = '0';
+    
+    ydwl_poc_debug("cmd: %s,cmd len is %d\n", cCmd, strlen(cCmd));
+    int ret = ydwl_poc_cmd_write(cCmd, strlen(cCmd));
+    return ret;
+}
+
+int py_ydwl_poc_gps_send_location(double lat, double lng) {
+    int i, j;
+       char cCmd[128] = {0};
+    char cTmpDat[64] = {0};
+    memset(cCmd, 0, sizeof(cCmd));
+    sprintf(cTmpDat, "%lf,%lf",lat,lng);
+    strcat(cCmd, "AT+POC=110000");
+    j = strlen(cCmd);
+    i = 0;
+    while (cTmpDat[i])
+    {
+        cCmd[j++] = char_to_ascii(cTmpDat[i]>>4);
+        cCmd[j++] = char_to_ascii(cTmpDat[i]&0x0f);
+        i++;
     }
+    cCmd[j++] = '0';
+    cCmd[j++] = '0';
     
-    ydwl_poc_debug("get map ret: %d", ret);
+    ydwl_poc_debug("cmd: %s,cmd len is %d\n", cCmd, strlen(cCmd));
+    int ret = ydwl_poc_cmd_write(cCmd, strlen(cCmd));
+    return ret;
+}
+
+int py_ydwl_poc_stop_alarm(void) {
+    int ret = 0;
+    char *cmd = "AT+POC=540000\r\n";
+    ydwl_poc_debug("cmd: %s,cmd len is %d\n",cmd,strlen(cmd));
+    ret = ydwl_poc_cmd_write(cmd, strlen(cmd));
+    return ret;
+}
+
+int py_ydwl_poc_ignore_alarm(void) {
+    int ret = 0;
+    char *cmd = "AT+POC=680000\r\n";
+    ydwl_poc_debug("cmd: %s,cmd len is %d\n",cmd,strlen(cmd));
+    ret = ydwl_poc_cmd_write(cmd, strlen(cmd));
     return ret;
 }
 
@@ -1508,6 +1798,274 @@ int ydwl_poc_cmd_write(char *pCmd, long Leng)
        return sendto(iAtMcuFd, pCmd, Leng+1, 0, (struct sockaddr*)&gmcusin, sizeof(struct sockaddr_in));       
 }
 
+stPocSetPar * ydwl_poc_get_cfg_from_file(void) {
+    HeliosFILE * fd = NULL;
+    fd = Helios_fopen(YDWL_CFG_FILE_PATH, "r");
+
+       if(NULL == fd)
+       {
+        ydwl_poc_debug("open file error\n");
+               return NULL;
+       }
+    if (Helios_fread((void*)&iPocSet, sizeof(stPocSetPar), 1, fd) <= 0) {
+        ydwl_poc_debug("Helios_fread error\n");
+        Helios_fclose(fd);
+        return NULL;
+    }
+    
+    if(iPocSet.ucValidFlg != ZMCU_SETING_VALID_FLG)
+       {
+               Helios_fclose(fd);
+               return NULL;            
+       }
+    ydwl_poc_debug("get agentpwd pwd:%s\r\n", iPocSet.agentpwd);
+    Helios_fclose(fd);
+    if(iPocSet.inviteFlg == '0') {
+        iPocSet.inviteFlg = 0;
+    }
+    else if (iPocSet.inviteFlg == '1') {
+        iPocSet.inviteFlg = 1;
+    }
+    if(iPocSet.gps_sw == '0') {
+        iPocSet.gps_sw = 0;
+    }
+    else if (iPocSet.gps_sw == '1') {
+        iPocSet.gps_sw = 1;
+    }
+    if(iPocSet.offlineFlg == '0') {
+        iPocSet.offlineFlg = 0;
+    }
+    else if (iPocSet.offlineFlg == '1') {
+        iPocSet.offlineFlg = 1;
+    }
+    return &iPocSet;
+}
+
+
+
+stPocSetPar * ydwl_poc_get_cfg(void) {
+    
+    if(iPocSet.inviteFlg == '0') {
+        iPocSet.inviteFlg = 0;
+    }
+    else if (iPocSet.inviteFlg == '1') {
+        iPocSet.inviteFlg = 1;
+    }
+    if(iPocSet.gps_sw == '0') {
+        iPocSet.gps_sw = 0;
+    }
+    else if (iPocSet.gps_sw == '1') {
+        iPocSet.gps_sw = 1;
+    }
+    if(iPocSet.offlineFlg == '0') {
+        iPocSet.offlineFlg = 0;
+    }
+    else if (iPocSet.offlineFlg == '1') {
+        iPocSet.offlineFlg = 1;
+    }
+    return &iPocSet;
+}
+
+stLoginCfg * ydwl_poc_get_login_from_file(void)
+{
+       HeliosFILE *fd = Helios_fopen(YDWL_LOGIN_FILE_PATH, "r");
+       
+       if(fd == NULL)
+       {
+               ydwl_poc_debug("Open login Faild!\r\n");
+               return NULL;
+       }       
+    if(0 >= Helios_fread((void*)&iLoginCfg, sizeof(stLoginCfg), 1, fd))
+       {
+               ydwl_poc_debug("Read login File Faild!!\r\n");
+               Helios_fclose(fd);
+               return NULL;
+       }
+    
+    ydwl_poc_debug("Read login File success!!cDefAddr:%s,uiLoginType:%d\r\n",iLoginCfg.cDefAddr,iLoginCfg.uiLoginType);  
+
+       Helios_fclose(fd);
+    
+    if(iLoginCfg.uiLoginType == '0') {
+        iLoginCfg.uiLoginType = 0;
+    }
+    else if (iLoginCfg.uiLoginType == '1') {
+        iLoginCfg.uiLoginType = 1;
+    }
+    else if (iLoginCfg.uiLoginType == '2') {
+        iLoginCfg.uiLoginType = 2;
+    }
+       return &iLoginCfg;
+}
+
+int set_cfg_to_file(void)
+{
+       HeliosFILE * fd = Helios_fopen(YDWL_CFG_FILE_PATH, "wb");
+       
+       if(fd == NULL)
+       {
+               ydwl_poc_debug("Open File Faild!\r\n");
+               return 0;
+       }       
+
+       if(0 > Helios_fwrite((void*)&iPocSet, sizeof(iPocSet), 1, fd))
+       {
+               ydwl_poc_debug("Write Cfg File Faild!!\r\n");
+               Helios_fclose(fd);
+               return 0;
+       }
+
+       Helios_fclose(fd);
+       return 1;
+}
+
+int set_login_to_file(void)
+{
+       HeliosFILE *fd = Helios_fopen(YDWL_LOGIN_FILE_PATH, "w");
+       
+       if(fd == NULL)
+       {
+               ydwl_poc_debug("Create login Faild!\r\n");
+               return 0;
+       }       
+
+       if(0 > Helios_fwrite((void*)&iLoginCfg, sizeof(iLoginCfg), 1, fd))
+       {
+               ydwl_poc_debug("Write login File Faild!!\r\n");
+               Helios_fclose(fd);
+               return 0;
+       }
+
+       Helios_fclose(fd);
+       return 1;
+}
+
+unsigned char check_sum(unsigned char *msg, unsigned short msglen)
+{
+       unsigned short i;
+       unsigned char sum=0;
+       
+       for(i=0;i<msglen;i++)
+       {
+               sum+=msg[i];
+       }
+       return sum;
+}
+
+int ydwl_poc_set_cfg(uint8_t *data, int len) {
+    if (memcmp(data, "AT+SET=", 7) == 0) {
+        uint8_t dealers_pwd_len = *(data+7);
+        if(memcmp(data+8, PWD_SUPER_USER, strlen(PWD_SUPER_USER)) == 0 || memcmp(data+8, iPocSet.agentpwd, strlen(iPocSet.agentpwd)) == 0)
+               {
+                       if(*(data+len-3) != check_sum((unsigned char*)(data+10+dealers_pwd_len),*(data+9+dealers_pwd_len)) && *(data+9+dealers_pwd_len)>0)
+                       {       
+                               return 0; // 校验值失败
+                       }
+                       if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_APN_ID)
+                       {
+                               memset(iPocSet.apnacc, 0, sizeof(iPocSet.apnacc));
+                               memcpy(iPocSet.apnacc, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.apnacc)));
+                               ydwl_poc_debug("apn account:%s\r\n", iPocSet.apnacc);
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_APN_PWD)
+                       {
+                               memset(iPocSet.apnpwd, 0, sizeof(iPocSet.apnpwd));
+                               memcpy(iPocSet.apnpwd, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.apnpwd)));          
+
+                               ydwl_poc_debug("apn pwd:%s\r\n", iPocSet.apnpwd);
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_MCU_ID)
+                       {
+                               memset(iPocSet.account, 0, sizeof(iPocSet.account));
+                               memcpy(iPocSet.account, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.account)));
+                ydwl_poc_debug("iPocSet.account:%s\r\n", iPocSet.account);                     
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_MCU_PWD)
+                       {
+                               memset(iPocSet.passwd, 0, sizeof(iPocSet.passwd));
+                               memcpy(iPocSet.passwd,data+10+dealers_pwd_len,(*(data+9+dealers_pwd_len))%(sizeof(iPocSet.passwd)));
+                ydwl_poc_debug("iPocSet.passwd:%s\r\n", iPocSet.passwd);       
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_MCU_IP)
+                       {
+                               memset(iPocSet.ip, 0, sizeof(iPocSet.ip));
+                               memcpy(iPocSet.ip, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.ip)));
+                ydwl_poc_debug("iPocSet.ip:%s\r\n", iPocSet.ip);                                               
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_DEALERS_PWD)
+                       {
+                               memset(iPocSet.agentpwd, 0, sizeof(iPocSet.agentpwd));
+                               memcpy(iPocSet.agentpwd, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.agentpwd)));
+                ydwl_poc_debug("agentpwd pwd:%s\r\n", iPocSet.agentpwd);
+                       }
+            else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_GPS_ENABLE)
+                       {
+                               iPocSet.gps_sw = 0;
+                               memcpy(&iPocSet.gps_sw, data+10+dealers_pwd_len, sizeof(iPocSet.gps_sw));                       
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_OUTLINE_SOUND)
+                       {
+                               iPocSet.offlineFlg = 0;
+                               memcpy(&iPocSet.offlineFlg, data+10+dealers_pwd_len, sizeof(iPocSet.offlineFlg));                       
+                       }
+                       else if(*(data+8+dealers_pwd_len) == WRITE_CODE_CMD_CALL_ENABLE)
+                       {
+                               iPocSet.inviteFlg = 0;
+                               memcpy(&iPocSet.inviteFlg, data+10+dealers_pwd_len, sizeof(iPocSet.inviteFlg));                                         
+                       }
+                       else if(*(data+8+dealers_pwd_len) == 0x0b)
+                       {       
+                ydwl_poc_debug("recv 0x0b \r\n");
+                iPocSet.ucValidFlg = ZMCU_SETING_VALID_FLG;
+                               iPocSet.uiApnValidFlg = 0;
+                               set_cfg_to_file();                      
+                       }       
+            else if(*(data+8+dealers_pwd_len) == 0x0D)
+                       {
+                               memset(iPocSet.apnname, 0, 32);
+                               memcpy(iPocSet.apnname, data+10+dealers_pwd_len, (*(data+9+dealers_pwd_len))%(sizeof(iPocSet.apnname)));
+
+                               ydwl_poc_debug("apn name:%s\r\n", iPocSet.apnname);
+                       }
+                       else if(*(data+8+dealers_pwd_len) == 0x11)
+                       {
+                           iLoginCfg.uiLoginType = 0;
+                               memcpy(&iLoginCfg.uiLoginType, data+10+dealers_pwd_len,1);//sizeof(iLoginCfg.uiLoginType)
+                               if(iLoginCfg.uiLoginType == '0')
+                               {
+                                       iLoginCfg.uiLoginType = 0;
+                               }
+                               else if(iLoginCfg.uiLoginType == '1')
+                               {
+                                       iLoginCfg.uiLoginType = 1;
+                               }
+                               else if(iLoginCfg.uiLoginType == '2')
+                               {
+                                       iLoginCfg.uiLoginType = 2;
+                               }
+                               memset(iLoginCfg.cDefAddr,0,16);
+                               memcpy(iLoginCfg.cDefAddr, pDefaultIp, 16);
+                               iLoginCfg.uiValidFlg = ZMCU_SETING_VALID_FLG;
+                               set_login_to_file();
+                               ydwl_poc_debug("uiLoginType:%d,cDefAddr:%s\r\n", iLoginCfg.uiLoginType,iLoginCfg.cDefAddr);
+                       }       
+                       else
+                       {
+                ydwl_poc_debug("return -3 \r\n");
+                               return -3; // 无法识别的命令
+                       }
+            return 1;
+        }
+        else {
+            ydwl_poc_debug("return -1 \r\n");
+            return -1; // 无法识别的命令
+        }
+    }
+    else {
+        ydwl_poc_debug("return -2 \r\n");
+        return -1; // 无法识别的命令
+    }
+}
 
 void at_push_cmd_msg(char* pBuf, unsigned short usLen)
 {
@@ -1607,9 +2165,11 @@ void py_ydwl_poc_init(init_cb cb)
     }      
 
        int ret = 0;
-    ret |= ydwl_audio_init();
-
+    ydwl_poc_debug("[elian]ydmain_task_init start !!!");
     ret |= ydmain_task_init(NULL);
+    ydwl_poc_debug("[elian]ydmain_task_init finish !!!");
+    // set TTS Digit mode:TTS_DIGIT_NUMBER
+    Helios_TTS_SetDigits(1);
     Helios_msleep(200);
 
        if (ydwl_msg_queue_t == 0) 
@@ -1620,22 +2180,13 @@ void py_ydwl_poc_init(init_cb cb)
             ydwl_poc_debug("create at data queue failed, can not create msgQ.");
                }
        }
-
-    if (ydwl_weather_sem == 0) 
-       {
-               ydwl_weather_sem = Helios_Semaphore_Create(1, 0);
-               if (!ydwl_weather_sem)
-        {
-            ydwl_poc_debug("create weather sem error.");
-               }
-       }
-       
-       if (ydwl_map_queue == 0) 
+    
+    if (ydwl_get_account_sem == 0) 
        {
-               ydwl_map_queue = Helios_MsgQ_Create(10, sizeof(unsigned char));
-               if (!ydwl_map_queue)
+               ydwl_get_account_sem = Helios_Semaphore_Create(1, 0);
+               if (!ydwl_get_account_sem)
         {
-            ydwl_poc_debug("create map queue error.");
+            ydwl_poc_debug("create get account sem error.");
                }
        }
 
@@ -1648,7 +2199,7 @@ void py_ydwl_poc_init(init_cb cb)
         Helios_msleep(200);
         retry_cnt--;
        }while(!ucMcuReady && retry_cnt>0);
-       
+       ret |= ydwl_audio_init();
     if(ret != 0 || (ucMcuReady == 0))
     {
         ydwl_poc_debug("ydwl init error");
@@ -1684,3 +2235,8 @@ int py_ydwl_set_volume(int type, int vol) {
     ret = Helios_Audio_SetVolume(2, vol);
     return ret;
 }
+
+int py_ydwl_set_icmic_gain(int ana_gain, int adc_gain) {
+    ydwl_poc_debug("py_ydwl_set_icmic_gain ana_gain:%d, adc_gain:%d", ana_gain, adc_gain);
+    return Helios_aud_set_icmic_gain(HELIOS_AUD_VOICECALL_NB, HELIOS_OUTPUT_HEADPHONE, ana_gain, adc_gain);
+}
\ No newline at end of file
index 62c3807..22f8d4e 100644 (file)
@@ -1058,7 +1058,8 @@ int py_zzd_poc_set_account(char *account,char *pwd)
 
     char *account_hex = NULL;
     int account_len = strlen(account_str);
-    account_hex = malloc(account_len*2);
+    account_hex = malloc(account_len * 2 + 1);
+    memset(account_hex, 0x0, account_len * 2 + 1);
        if(!account_hex)
        {
                printf("malloc failed 2.");
index af8a0aa..4409d98 100644 (file)
@@ -66,7 +66,7 @@ void FUNCTION_ATTR_ROM Qhal_devFeeddog(void)
 qbool FUNCTION_ATTR_ROM Qhal_rtcInit(void)
 {
     Quos_logPrintf(HAL_DEV, LL_DBG, "%llu", Helios_RTC_GetTicks());
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     RtcTime.sec = OSI_HWTICK_TO_MS(Helios_RTC_GetTicks())/1000;
        RtcTime.ms  = OSI_HWTICK_TO_MS(Helios_RTC_GetTicks())%1000;
 #elif defined (PLAT_ASR)
@@ -103,10 +103,10 @@ void FUNCTION_ATTR_ROM Qhal_rtcSet(quint32_t timestamp, quint16_t ms)
 ***************************************************************************/
 void FUNCTION_ATTR_ROM Qhal_rtcGet(quint32_t *sec, quint32_t *ms)
 {
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     RtcTime.sec = OSI_HWTICK_TO_MS(Helios_RTC_GetTicks())/1000;
        RtcTime.ms  = OSI_HWTICK_TO_MS(Helios_RTC_GetTicks())%1000;
-#elif defined (PLAT_ASR) || defined (PLAT_RDA) || defined (PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined (PLAT_RDA) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     static quint64_t oldtick = 0;
        quint64_t nowtick = Helios_RTC_GetTicks();
        RtcTime.ms += (nowtick - oldtick)/32;
@@ -176,7 +176,13 @@ void FUNCTION_ATTR_ROM Qhal_devRestart(void)
 char FUNCTION_ATTR_ROM *Qhal_devUuidGet(void)
 {
     static quint8_t imei[64] = {0};
-    Helios_Dev_GetIMEI(imei,sizeof(imei));
+    #if MICROPY_QPY_MODULE_DSDS
+    extern int _get_current_simid(void);
+       int cur_simid = _get_current_simid();
+    Helios_Dev_GetIMEI(imei,sizeof(imei),cur_simid);
+    #else
+    Helios_Dev_GetIMEI(imei,sizeof(imei),0);
+    #endif
     return (char *)imei;
 }
 /**************************************************************************
@@ -204,7 +210,7 @@ quint32_t FUNCTION_ATTR_RAM Qhal_randomGet(void)
 ***************************************************************************/
 #if QUEC_ENABLE_QTH_OTA
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 typedef struct
 {
     int file;
@@ -218,9 +224,9 @@ quint32_t  FUNCTION_ATTR_ROM Qhal_devOtaNotify(const char *filename, quint32_t f
 #if !defined(PLAT_RDA)
     int ret = 0;
 #endif
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     helios_fota_ctx_s ctx = {0};
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     int ctx = 0;
     quint8_t * file_read_buf = NULL;
     quint32_t file_size = 0;
@@ -242,14 +248,14 @@ return (quint32_t)0;
 #endif
 #endif
     
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     ret = Helios_Fota_PackageVerify((int)&ctx);
     if(ret)
     {
         Quos_logPrintf(HAL_DEV, LL_ERR,"verify fail");
         goto exit;
     }
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     fp = Helios_fopen(filename, "r");
     if(!fp)
     {
@@ -313,8 +319,8 @@ return (quint32_t)0;
 #else
 
 #endif  
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     if(fp) Helios_fclose(fp);
     if(file_read_buf) HAL_FREE(file_read_buf); 
     if(ctx) Helios_Fota_Deinit(ctx);
@@ -324,8 +330,8 @@ return (quint32_t)0;
     return (quint32_t)0;
 #if !defined(PLAT_RDA)
 exit:
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     if(fp) Helios_fclose(fp);
     if(file_read_buf) HAL_FREE(file_read_buf); 
     if(ctx) Helios_Fota_Deinit(ctx);
@@ -454,9 +460,9 @@ qbool FUNCTION_ATTR_ROM Qhal_beforeMain(void)
 {
     HAL_LOCK_INIT(lockMallocId);
     //HAL_LOCK_INIT(lockKernelId);
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        Quos_logPrintf(HAL_DEV, LL_DBG,"********** This is PLAT_Unisoc **********");
-#elif defined (PLAT_Unisoc_8850)
+#elif defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
     Quos_logPrintf(HAL_DEV, LL_DBG,"********** This is PLAT_Unisoc_8850 **********");
 #elif defined (PLAT_ASR)
     Quos_logPrintf(HAL_DEV, LL_DBG,"********** This is PLAT_ASR **********");
index 28e55d7..22a248c 100644 (file)
@@ -28,7 +28,7 @@ pointer_t FUNCTION_ATTR_ROM Qhal_fileOpen(const char *filename, qbool onlyRead)
     if(onlyRead)
     {
         fp = Helios_fopen((const char*)filename,"rb");
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
         if((int)fp < 0)
 #elif defined (PLAT_ASR)
         if(fp == NULL)
@@ -43,7 +43,7 @@ pointer_t FUNCTION_ATTR_ROM Qhal_fileOpen(const char *filename, qbool onlyRead)
     else
     {
         fp = Helios_fopen((const char*)filename,"rb+");
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
         if((int)fp < 0)
 #elif defined (PLAT_ASR)
         if(fp == NULL)
@@ -52,7 +52,7 @@ pointer_t FUNCTION_ATTR_ROM Qhal_fileOpen(const char *filename, qbool onlyRead)
 #endif
         {
             fp = Helios_fopen((const char*)filename,"wb+");
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
         if((int)fp < 0)
 #elif defined (PLAT_ASR)
         if(fp == NULL)
@@ -119,7 +119,7 @@ quint32_t FUNCTION_ATTR_ROM Qhal_fileRead(pointer_t sockFd, quint32_t offset, vo
 ***************************************************************************/
 void FUNCTION_ATTR_ROM Qhal_fileClose(pointer_t sockFd)
 {
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     if((int)sockFd < 0)
 #elif defined (PLAT_ASR)
     if(sockFd == 0)
index 325dbb8..62f74a4 100644 (file)
@@ -2,7 +2,7 @@
 #define __QHAL_FLASHOPT_H__
 #include "Qhal_types.h"
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #define QIOT_FILE_CONFIG "UFS:qiot_config.ini"
 #define QIOT_FILE_OTA "UFS:fota.pack"
 #ifdef QUEC_ENABLE_MODBUS
index bb46b5c..3ffd64d 100644 (file)
@@ -21,7 +21,7 @@
 #include "net_sockets.h"
 #include "entropy.h"
 #include "ctr_drbg.h"
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #include "errno.h"
 #include "sockets.h"
 #elif defined (PLAT_ASR)
index f1be0a9..7b5bebc 100644 (file)
@@ -44,7 +44,7 @@ qbool FUNCTION_ATTR_ROM Qhal_propertyDevGet(Qhal_propertyDev_t *dInfo)
     Helios_Dev_GetModel(model_type, 24);
     dInfo->cellLevel = (quint8_t)(Helios_Power_GetBatteryVol()/3300*100);
     dInfo->cellVoltage = (double)Helios_Power_GetBatteryVol()/1000.0; 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     dInfo->flashFree = Helios_fs_free_size('U') - 10 * 1024; //ÔÝʱչÈñ²»¼ì²é·¾¶
 #elif defined (PLAT_ASR)
     dInfo->flashFree = Helios_fs_free_size('U') - 10 * 1024;
index 4061ecd..35a0a58 100644 (file)
@@ -75,7 +75,7 @@ extern int _errno;
 
 //#define GetSockError()       (errno)
 //#define SetSockError(e)      (errno = e)
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #define GetSockError()  ql_get_soc_errno()
 #else
 #define GetSockError() (_errno)
index 3d512f2..3341c7d 100644 (file)
@@ -1023,12 +1023,16 @@ add_addr_info(struct sockaddr_in *service, AVal *host, int port)
   service->sin_addr.s_addr = inet_addr(hostname);
   if (service->sin_addr.s_addr == INADDR_NONE)
     {
-    #if defined(PLAT_RDA) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s)
+    #if defined(PLAT_RDA) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
         int pdp = 1;
+        struct hostent *host = lwip_gethostbyname_with_pcid(hostname, pdp);
+    #elif defined(PLAT_Unisoc)
+        struct hostent *host = gethostbyname(hostname);
     #else
         int pdp = Helios_DataCall_GetCurrentPDP();
+        struct hostent *host = lwip_gethostbyname_with_pcid(hostname, pdp);
     #endif
-      struct hostent *host = lwip_gethostbyname_with_pcid(hostname, pdp);
+      
       if (host == NULL || host->h_addr == NULL)
        {
          RTMP_Log(RTMP_LOGERROR, "Problem accessing the DNS. (addr: %s)", hostname);
@@ -1091,16 +1095,23 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service)
        }
        else
        {
+    #if defined(MICROPY_QPY_ETHERNET_W5500)
                wz_ethnetif_ipconfig_t ipconfig = {0};
                Helios_W5500_IPConfig(&ipconfig);
 
                struct sockaddr_in server_addr;
-           memset(&server_addr, 0, sizeof(server_addr));
+         memset(&server_addr, 0, sizeof(server_addr));
                server_addr.sin_family = AF_INET;
-           server_addr.sin_port = 0;
-               server_addr.sin_addr.s_addr = ipconfig.ipv4_info.ipaddr.addr;
+         server_addr.sin_port = 0;
+    #if defined (PLAT_Unisoc) || defined(PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+    server_addr.sin_addr.s_addr = ipconfig.ipv4_info.ipaddr.u_addr.ip4.addr;
+    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+    server_addr.sin_addr.s_addr = ipconfig.ipv4_info.ipaddr.addr;
+    #endif
+               
                ret = bind(r->m_sb.sb_socket, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
                RTMP_Log(RTMP_LOGERROR, "[socket] bind ret %d.\r\n", ret);
+    #endif
        }
                
       if (connect(r->m_sb.sb_socket, service, sizeof(struct sockaddr)) < 0)
index 2fe8e6b..7cb99e9 100644 (file)
@@ -4,40 +4,46 @@
  * Helios SDK Configuration
  *
  */
-#define PROJECT_NAME_G3_C06S  1  //项目宏定义
-#define CONFIG_LVGL_SPAN 1
-#define CONFIG_LVGL_FS_HELIOS 1
-#define CONFIG_LVGL_GIF_DECODE 1
-#define CONFIG_LVGL_SPINNER 1
-#define CONFIG_LCD 1
-#define CONFIG_LVGL_ANIMIMG 1
-#define CONFIG_LVGL_KEYBOARD 1
-#define CONFIG_LVGL_CALENDAR 1
-#define CONFIG_LVGL_LED 1
+
+
+#define PROJECT_NAME_G3_7PIN  1  //项目宏定义
+
+
+// #define CONFIG_LVGL_SPAN 1
+// #define CONFIG_LVGL_FS_HELIOS 1
+// #define CONFIG_LVGL_GIF_DECODE 1
+// #define CONFIG_LVGL_SPINNER 1
+//#define CONFIG_LCD 1
+// #define CONFIG_LVGL_ANIMIMG 1
+// #define CONFIG_LVGL_KEYBOARD 1
+// #define CONFIG_LVGL_CALENDAR 1
+// #define CONFIG_LVGL_LED 1
 #define CONFIG_VIOCE_CALL 1
-#define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1
-#define CONFIG_LVGL_TABVIEW 1
-#define CONFIG_LVGL_LINE 1
-#define CONFIG_LVGL 1
-#define CONFIG_LVGL_CHART 1
-#define CONFIG_LVGL_LIST 1
-#define CONFIG_LVGL_MSGBOX 1
-#define CONFIG_LVGL_ARC 1
-#define CONFIG_LVGL_METER 1
-#define CONFIG_LVGL_JPG_DECODE 1
-#define CONFIG_LVGL_PNG_DECODE 1
-#define CONFIG_LVGL_IMGBTN 1
+// #define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1
+// #define CONFIG_LVGL_TABVIEW 1
+//#define CONFIG_LVGL_LINE 1
+//#define CONFIG_LVGL 1
+// #define CONFIG_LVGL_CHART 1
+// #define CONFIG_LVGL_LIST 1
+// #define CONFIG_LVGL_MSGBOX 1
+// #define CONFIG_LVGL_ARC 1
+// #define CONFIG_LVGL_METER 1
+//#define CONFIG_LVGL_JPG_DECODE 1
+// #define CONFIG_LVGL_PNG_DECODE 1
+// #define CONFIG_LVGL_IMGBTN 1
 //#define CONFIG_GH301x 1
-#define CONFIG_HX3918 1
+//#define CONFIG_HX3918 1
 #define CONFIG_MBEDTLS 1
-#define CONFIG_SC7A20 1
-#define CONFIG_LVGL_WIN 1
-#define CONFIG_LVGL_COLORWHEEL 1
-#define CONFIG_LVGL_CANVAS 1
-#define CONFIG_LVGL_SPINBOX 1
-#define CONFIG_LVGL_QRCODE 1
-#define CONFIG_LVGL_TILEVIEW 1
-#define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80
-#define CONFIG_CAMERA 1
-#define CONFIG_JPEG 1
+//#define CONFIG_SC7A20 1
+// #define CONFIG_LVGL_WIN 1
+// #define CONFIG_LVGL_COLORWHEEL 1
+// #define CONFIG_LVGL_CANVAS 1
+// #define CONFIG_LVGL_SPINBOX 1
+// #define CONFIG_LVGL_QRCODE 1
+// #define CONFIG_LVGL_TILEVIEW 1
+// #define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80
+//#define CONFIG_CAMERA 1
+//#define CONFIG_JPEG 1
 #define CONFIG_CAMERA_SAVEPHOTOS 1
+//菊风视频通话
+//#define CONFIG_juphoon 1
index 6e03ed9..343bad7 100644 (file)
@@ -10,6 +10,6 @@ source "../services/microPython/config/config.in"
 source "../components/poc/poc_option.in"
 source "../components/GH301x/GH301x_option.in"
 source "../components/SC7A20/SC7A20_option.in"
-
+source "../components/juphoon/juphoon_option.in"
 endmenu
 
index 168ac94..51c8722 100644 (file)
@@ -2,7 +2,7 @@
 # Automatically generated file; DO NOT EDIT.
 # Helios SDK Configuration
 #
-PROJECT_NAME_G3_C06S=y
+PROJECT_NAME_G3_7PIN=y
 #
 # System Configuration
 #
@@ -11,55 +11,56 @@ CONFIG_MBEDTLS=y
 #
 # EG810MCN_GA_VOLTE
 #
-CONFIG_LVGL=y
+# CONFIG_LVGL=y
 
 #
 # lvgl option
 #
-CONFIG_LVGL_PNG_DECODE=y
+# CONFIG_LVGL_PNG_DECODE=y
 # CONFIG_LVGL_GIF_DECODE is not set
-CONFIG_LVGL_JPG_DECODE=y
-CONFIG_LVGL_FS_HELIOS=y
+# CONFIG_LVGL_JPG_DECODE=y
+#CONFIG_LVGL_FS_HELIOS=y
 # CONFIG_LVGL_FS_SD_HELIOS is not set
-CONFIG_LVGL_FS_EXTFLASH_HELIOS=y
+# CONFIG_LVGL_FS_EXTFLASH_HELIOS=y
 # CONFIG_LVGL_CUSTOMER_FONT_SUPPORT is not set
-CONFIG_LVGL_QRCODE=y
+# CONFIG_LVGL_QRCODE=y
 # CONFIG_LVGL_FONT is not set
 # CONFIG_LVGL_ARC is not set
-CONFIG_LVGL_IMGBTN=y
-CONFIG_LVGL_LINE=y
-CONFIG_LVGL_LIST=y
+#CONFIG_LVGL_IMGBTN=y
+#CONFIG_LVGL_LINE=y
+#CONFIG_LVGL_LIST=y
 # CONFIG_LVGL_CHART is not set
 # CONFIG_LVGL_LED is not set
-CONFIG_LVGL_CANVAS=y
-CONFIG_LVGL_WIN=y
+# CONFIG_LVGL_CANVAS=y
+# CONFIG_LVGL_WIN=y
 # CONFIG_LVGL_TABVIEW is not set
-CONFIG_LVGL_TILEVIEW=y
-CONFIG_LVGL_MSGBOX=y
+# CONFIG_LVGL_TILEVIEW=y
+# CONFIG_LVGL_MSGBOX=y
 # CONFIG_LVGL_METER is not set
 # CONFIG_LVGL_CALENDAR is not set
 # CONFIG_LVGL_SPINNER is not set
 # CONFIG_LVGL_SPINBOX is not set
 # CONFIG_LVGL_ANIMIMG is not set
 # CONFIG_LVGL_COLORWHEEL is not set
-CONFIG_LVGL_KEYBOARD=y
-CONFIG_LVGL_SPAN=y
-CONFIG_LVGL_HANDLER_TASK_PRIORITY=80
+# CONFIG_LVGL_KEYBOARD=y
+# CONFIG_LVGL_SPAN=y
+# CONFIG_LVGL_HANDLER_TASK_PRIORITY=80
 # CONFIG_QRCODE is not set
-CONFIG_CAMERA=y
+#CONFIG_CAMERA=y
 # CONFIG_CAMERA_DECODE is not set
 CONFIG_CAMERA_SAVEPHOTOS=y
 # CONFIG_QUECTHING is not set
 # CONFIG_SPINAND is not set
 # CONFIG_RTMP is not set
-CONFIG_JPEG=y
+#CONFIG_JPEG=y
 # CONFIG_SPI_SDCARD is not set
 CONFIG_VIOCE_CALL=y
 # CONFIG_TTS is not set
-CONFIG_LCD=y
+#CONFIG_LCD=y
 # CONFIG_UART_SLIP is not set
 # CONFIG_POC is not set
 #CONFIG_GH301x=y
-CONFIG_HX3918=y
-CONFIG_SC7A20=y
+#CONFIG_HX3918=y
+#CONFIG_SC7A20=y
 
+#CONFIG_juphoon=y
index 68ceb5b..4d763b0 100644 (file)
@@ -54,8 +54,11 @@ int quec_iic_demo_test(      void)
        int iRet;
        unsigned char wrtBuff[2] = {WHO_AM_I_VALUE, 0};
        unsigned char rdBuff[2] = {0, 0};       
-       
+#if defined(PLAT_aic8800m40)
+       iRet = Helios_I2C_Init(IIC_NO, IIC_MODE, 0);
+#else
        iRet = Helios_I2C_Init(IIC_NO, IIC_MODE);
+#endif
        if(iRet != 0) {
                iic_debug("i2c init fail\n");
                return -1;
index 717d305..8a643fd 100644 (file)
@@ -53,8 +53,11 @@ int quec_spi_demo_test(      void)
        
        char buf_in[256] = {0};
        char buf_out[128] ="=========This is the spi test !!===========\r\n";
-
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       Helios_SPI_Init(SPI_NO, SPI_MODE,SPI_CLK,0);
+#else
        Helios_SPI_Init(SPI_NO, SPI_MODE,SPI_CLK);
+#endif
 
        while(1)
        {       
index 60395dd..1ce9e07 100644 (file)
@@ -27,7 +27,7 @@
 #include "helios_os.h"
 #include "helios_timer.h"
 
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 #include "helios_gpio.h"
 #include "helios_apbtimer.h"
 #endif
@@ -109,7 +109,7 @@ void quec_timer_test(void *argv)
 }
 
 
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 
 #define PIN_TEST 35
 
index bd03792..ad5bab7 100644 (file)
@@ -12,6 +12,7 @@
 #include "helios_gpio.h"
 #include "qpy_lcd.h"
 #include "helios_os.h"
+#include "helios_fs.h"
 
 Helios_Mutex_t spi_lcd_write_mutex = 0;
 static uint16_t *lcd_write_buff = NULL;
@@ -607,7 +608,7 @@ static int QPY_SPILCD_Write_Data(void *buf, size_t len)
         return -1;
 
     Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.DCPin, HELIOS_LVL_HIGH);
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     if (0 != Helios_SPI_Write(QPY_LCDStruct.spiInfo.spi_port, buf, len))
     {
         QPY_LCD_LOG("write data fail\n");
@@ -733,8 +734,11 @@ int QPY_SPILCD_Init(Helios_LCDInitStruct *init_data, QPY_LCDSPI_INFO spi_info)
                    QPY_LCDStruct.spiInfo.spiclk, QPY_LCDStruct.spiInfo.spimode, QPY_LCDStruct.spiInfo.CSPin, QPY_LCDStruct.spiInfo.DCPin, QPY_LCDStruct.spiInfo.RSTPin);
 
     QPY_LCDStruct.state = QPY_LCD_IS_INIT;
-
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       if (0 != Helios_SPI_Init(QPY_LCDStruct.spiInfo.spi_port, QPY_LCDStruct.spiInfo.spimode, QPY_LCDStruct.spiInfo.spiclk, 0))
+#else
     if (0 != Helios_SPI_Init(QPY_LCDStruct.spiInfo.spi_port, QPY_LCDStruct.spiInfo.spimode, QPY_LCDStruct.spiInfo.spiclk))
+#endif
     {
         QPY_LCD_LOG("spi init fail\n");
         goto err;
@@ -745,11 +749,13 @@ int QPY_SPILCD_Init(Helios_LCDInitStruct *init_data, QPY_LCDSPI_INFO spi_info)
     gpio_s.pull = HELIOS_PULL_UP;
     gpio_s.value = HELIOS_LVL_HIGH;
 
+#if !defined(BOARD_EC600GCN_LA_CDD)
     if (0 != Helios_GPIO_Init(QPY_LCDStruct.spiInfo.CSPin, &gpio_s))
     {
         QPY_LCD_LOG("cs gpio init fail\n");
         goto err;
     }
+#endif
 
     if (0 != Helios_GPIO_Init(QPY_LCDStruct.spiInfo.DCPin, &gpio_s))
     {
@@ -803,31 +809,48 @@ int QPY_SPILCD_Init(Helios_LCDInitStruct *init_data, QPY_LCDSPI_INFO spi_info)
         QPY_LCD_LOG("light data is None\n");
     }
 
-    Helios_msleep(5);
-    Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.RSTPin, HELIOS_LVL_LOW);
-    Helios_msleep(5);
-    Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.RSTPin, HELIOS_LVL_HIGH);
-    Helios_msleep(5);
 
-    Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_LOW);
+    HeliosFILE *fp_e = Helios_fopen("E:/logo.bin","r");
+       HeliosFILE *fp = Helios_fopen("U:/logo.bin","r");
 
-    if (0 != QPY_LCDWriteFunction(QPY_LCDStruct.recv_data.lcd_init_recv, QPY_LCDStruct.recv_data.lcd_init_recv_cnt))
-    {
-        QPY_LCD_LOG("init data write error\n");
-        Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_HIGH);
-        goto err;
-    }
+       if((fp_e == NULL && fp == NULL) || init_data->init_flag) //增加是否强制初始化的判断
 
-#if !CONFIG_POC
-    if( QPY_SPILCD_Clear(0xffff) == -1 )
-    {
-        QPY_LCD_LOG("init clear error\n");
+       {  
+        Helios_msleep(5);
+        Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.RSTPin, HELIOS_LVL_LOW);
+        Helios_msleep(5);
+        Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.RSTPin, HELIOS_LVL_HIGH);
+        Helios_msleep(5);
+
+        Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_LOW);
+        QPY_LCD_LOG("init data write begin\n");
+
+        if (0 != QPY_LCDWriteFunction(QPY_LCDStruct.recv_data.lcd_init_recv, QPY_LCDStruct.recv_data.lcd_init_recv_cnt))
+        {
+            QPY_LCD_LOG("init data write error\n");
+            Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_HIGH);
+            goto err;
+        }
+
+    #if !CONFIG_POC
+        if( QPY_SPILCD_Clear(0xffff) == -1 )
+        {
+            QPY_LCD_LOG("init clear error\n");
+            Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_HIGH);
+            goto err;
+        }
+    #endif
         Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_HIGH);
-        goto err;
+               
+       } else {
+        QPY_LCD_LOG("have logo.bin or don't enforce init LCD\n");
+               if(fp_e) {
+                       Helios_fclose(fp_e);
+               }
+               if(fp) {
+                       Helios_fclose(fp);
+               }
     }
-#endif
-    Helios_GPIO_SetLevel(QPY_LCDStruct.spiInfo.CSPin, HELIOS_LVL_HIGH);
-
 
     return 0;
 
@@ -840,7 +863,7 @@ err:
     return -1;
 }
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 int QPY_SPILCD_Brightness(uint32_t light_level)
 {
     return Helios_SPI_LCD_Brightness(light_level);
@@ -909,7 +932,9 @@ int QPY_SPILCD_Write(void *buffer, uint32_t start_x, uint32_t start_y, uint32_t
 
     int count = QPY_LCDStruct.recv_data.lcd_invaild_recv_cnt;
 
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(HELIOS_LVL_LOW);
+#endif
 
     WRITE_FUNCTION(lcd_invaild_data, count);
     // QPY_LCD_LOG("%s: %d: lcd type is %d-------------- \n",__FUNCTION__, __LINE__, QPY_LCDStruct.type);
@@ -932,13 +957,16 @@ int QPY_SPILCD_Write(void *buffer, uint32_t start_x, uint32_t start_y, uint32_t
 
     if (0 != ret)
     {
+#if !defined(BOARD_EC600GCN_LA_CDD)
         CS_SET(HELIOS_LVL_HIGH);
+#endif
         QPY_LCD_LOG("lcd write data fail\n");
         Helios_Mutex_Unlock(spi_lcd_write_mutex);
         return -1;
     }
-
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(HELIOS_LVL_HIGH);
+#endif
     Helios_Mutex_Unlock(spi_lcd_write_mutex);
     return 0;
 }
@@ -946,18 +974,26 @@ int QPY_SPILCD_Write(void *buffer, uint32_t start_x, uint32_t start_y, uint32_t
 int QPY_SPILCD_Display_on()
 {
     CHECK_INIT();
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(0);
+#endif
     WRITE_FUNCTION(QPY_LCDStruct.recv_data.lcd_display_on_recv, QPY_LCDStruct.recv_data.lcd_display_on_recv_cnt);
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(1);
+#endif
     return 0;
 }
 
 int QPY_SPILCD_Display_off()
 {
     CHECK_INIT();
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(0);
+#endif
     WRITE_FUNCTION(QPY_LCDStruct.recv_data.lcd_display_off_recv, QPY_LCDStruct.recv_data.lcd_display_off_recv_cnt);
+#if !defined(BOARD_EC600GCN_LA_CDD)
     CS_SET(1);
+#endif
     return 0;
 }
 
index 5324e5e..77dad41 100644 (file)
@@ -67,7 +67,7 @@ typedef struct {
  int Helios_camera_capture();
 
 #ifdef CONFIG_DECODE_QINGYA
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 
 #define CAM_SUPPORT_MAX_DECODE_LEN 2500
 
index 2f5546f..31ba730 100644 (file)
@@ -41,6 +41,10 @@ typedef enum  {
 
 void Helios_DM9051_NICSetSPI(int port, int cs);
 
+void Helios_DM9051_NICSetEINTPin(int eint_pin);
+
+void Helios_DM9051_NICSetResetPin(int reset_pin);
+
 int Helios_DM9051_NICRegister(uint8_t mac[6], char *ip_str, char *mask_str, char *gw_str, dm_ethnetif_work_mode mode);
 
 int Helios_DM9051_NICSetAddr(char *ip_str, char *mask_str, char *gw_str);
index cbac65a..f852d10 100644 (file)
@@ -25,7 +25,7 @@ typedef struct
     char *name;
     uint32_t addr;
     size_t size;
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)//forrest.liu@20220309 add for ASR1601 platform pythonSDK use same lfs handle as kernel
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)//forrest.liu@20220309 add for ASR1601 platform pythonSDK use same lfs handle as kernel
        void *lfs_kernel;
 #endif 
 } HeliosFlashPartiCtx;
@@ -38,12 +38,14 @@ HeliosFlashPartiCtx *Helios_Flash_GetPartiCtx(const char *parti_name);
 int Helios_Flash_Write(uint32_t addr, const void *buffer, size_t size);
 int Helios_Flash_Read(uint32_t addr, void *buffer, size_t size);
 int Helios_Flash_Erase(uint32_t addr, size_t size);
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 int Helios_External_Flash_Read(int port, uint32_t addr, void *buffer, size_t size);
 void *Helios_lfs_mutexlock_get(char *patition_name);
 #endif
 
-#if defined(BOARD_EC600MCN_CC_EXT)
+#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
+
 int Helios_Flash_Fs_Format(char *parti_name);
 #endif
 
index 7ac09fd..078ddf4 100644 (file)
@@ -28,6 +28,9 @@
 
  
  typedef enum {
+       HELIOS_SPI_LCD_CLK_812_5K = 812,
+       HELIOS_SPI_LCD_CLK_1_625M = 1625,
+       HELIOS_SPI_LCD_CLK_3_25M = 3250,
         HELIOS_SPI_LCD_CLK_6_5M = 6500,
         HELIOS_SPI_LCD_CLK_13M = 13000,
         HELIOS_SPI_LCD_CLK_26M = 26000,
@@ -82,9 +85,8 @@ typedef enum {
         uint32_t light_level_data_len;
         uint8_t te_sel;
         uint32_t te_pin;
-#if defined(BOARD_EC600MCN_LF_SLPOC)
         uint8_t is_logo_exist;
-#endif
+        uint8_t init_flag;
  }Helios_LCDInitStruct;
 
 
@@ -111,6 +113,7 @@ typedef enum {
         uint8_t frame_rate;
         uint8_t te_sel;
         uint8_t rst_Polarity;
+        uint32_t dsi_pclk_rate;
 
 }Helios_MIPIInitStruct;
 
@@ -131,14 +134,16 @@ typedef struct
  
  
  int Helios_LCD_Brightness(uint32_t light_level);
- #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+ #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
  int Helios_LCD_Level_Brightness(uint32_t light_level, uint32_t brightness_level);
  #endif
  int Helios_LCD_Write(void *buffer,uint32_t start_x, uint32_t start_y, uint32_t end_x, uint32_t end_y);
  
  int Helios_LCD_Display_on();
- 
+ #if defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609)
  int Helios_LCD_Set_Offset(int offset_x, int offset_y);
+ #endif
+
  int Helios_LCD_Display_off();
  
  int Helios_LCD_WriteCmd(uint64_t cmd, uint32_t data_len);
@@ -160,7 +165,7 @@ void Helios_LCD_VDD_switch_on(void);
 
 void Helios_LCD_VDD_switch_off(void);
 #endif
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)|| defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 int Helios_SPI_LCD_Brightness(uint32_t light_level);
 #endif
 
@@ -173,14 +178,15 @@ int Helios_SPI_LCD_Brightness(uint32_t light_level);
 // int QPY_LCD_WriteData(uint64_t data, uint32_t data_len);
 // int QPY_LCD_Clear(uint16_t color);
 
+int Helios_LCD_MIPI_DSI_read(char* reg, int reg_len, char *r_data, int r_data_len);
+
+unsigned int Helios_LCD_ReadID(uint8_t cmd);
+
+
 #ifdef __cplusplus
  } /*"C" */
 #endif
-#if 0
-extern int is_first_make_new ;
-#else
-//int is_first_make_new ;
-#endif
+ 
 #endif
  
  
index 875b153..e334c43 100644 (file)
@@ -40,8 +40,11 @@ typedef enum  {
 } wz_ethnetif_work_mode;
 
 
-void Helios_W5500_NICSetSPI(int port, int cs);
-
+#if defined(PLAT_ASR_1606)
+    void Helios_W5500_NICSetSPI(int port, int cs,int group);
+#else 
+    void Helios_W5500_NICSetSPI(int port, int cs);
+#endif
 void Helios_W5500_NICSetEINTPin(int eint_pin);
 
 void Helios_W5500_NICSetResetPin(int reset_pin);
@@ -64,6 +67,8 @@ int Helios_W5500_SetDefaultNetworkCard(char *ip);
 
 void Helios_W5500_Destroy(void);
 
+void Helios_W5500_Status(int *status);
+
 #endif
 
 
index 09f7172..d4ca2aa 100644 (file)
@@ -1,12 +1,12 @@
 /*
  * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
- *  
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *  
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- *  
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #ifndef _HELIOS_WLAN_H
 #define _HELIOS_WLAN_H
 
-/*-----------------------------------------------------------------------*/
+ /*-----------------------------------------------------------------------*/
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
 
-#define HELIOS_WIFI_SSID_MAX_LEN   (32 + 1)
-#define HELIOS_WIFI_PWD_MAX_LEN    (64)
+#define HELIOS_WIFI_SSID_MAX_LEN    (32)
+#define HELIOS_WIFI_PWD_MAX_LEN     (63)
+#define HELIOS_WIFI_MAX_CHANNEL     (13)
+#if defined(PLAT_ECR6600)
+#define HELIOS_WIFI_MAX_CLIENTS     (4)
+void Helios_Active_Status(void);
+#elif defined(PLAT_aic8800m40)
+#define HELIOS_WIFI_MAX_CLIENTS     (10)
+#else
+#define HELIOS_WIFI_MAX_CLIENTS     (0)
+#endif
 
 typedef enum {
-    // ap status.
-    HELIOS_WLAN_AP_STATUS_STOP = 0,
-    HELIOS_WLAN_AP_STATUS_STARTED,
-    
-    // sta status.
-    HELIOS_WLAN_STA_STATUS_STOP,
-    HELIOS_WLAN_STA_STATUS_START,
-    HELIOS_WLAN_STA_STATUS_DISCON,
-    HELIOS_WLAN_STA_STATUS_CONNECTED,
-
-    //error status
-    HELIOS_WLAN_STATUS_ERROR
-} Helios_Wlan_Status_e;
+    HELIOS_WLAN_EVENT_RF_WAKEUP = 3001,
+    HELIOS_WLAN_EVENT_RF_SLEEP,
 
-/**
- *  @brief  wlan network interface enumeration definition.
- */
-typedef enum
-{
-    HELIOS_WLAN_STATION = 0, /**< Act as a station which can connect to an access point*/
-    HELIOS_WLAN_SOFTAP = 1,  /**< Act as an access point, and other station can connect, 8 stations Max*/
-    HELIOS_WLAN_STATION_SOFTAP = 2,
-    HELIOS_WLAN_UNKOWN,
-} Helios_Wlan_Work_Mode_e;
-
-typedef struct
-{
-    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN];
-       uint8_t ssid_len;
-       uint8_t bssid[6];
+    HELIOS_WLAN_EVENT_SCAN_DONE = 3101,
+    HELIOS_WLAN_EVENT_SCAN_FAILED,
+
+    HELIOS_WLAN_EVENT_AP_START_SUCCEED = 3201,
+    HELIOS_WLAN_EVENT_AP_START_FAILED,
+    HELIOS_WLAN_EVENT_STA_CONNECTED,
+    HELIOS_WLAN_EVENT_STA_DISCONNECTED,
+    HELIOS_WLAN_EVENT_STA_IP_ASSIGNED,
+    HELIOS_WLAN_EVENT_AP_STOP,
+
+    HELIOS_WLAN_EVENT_STA_START_CONN = 3301,
+    HELIOS_WLAN_EVENT_CONN_SUCCEED,
+    HELIOS_WLAN_EVENT_CONN_FAILED,
+    HELIOS_WLAN_EVENT_CONN_LOST,
+    HELIOS_WLAN_EVENT_GOT_IP,
+    HELIOS_WLAN_EVENT_LOST_IP,
+
+    HELIOS_WLAN_EVENT_NETCFG_START_SUCCEED = 3401,
+    HELIOS_WLAN_EVENT_NETCFG_START_FAILED,
+    HELIOS_WLAN_EVENT_NETCFG_STOP_SUCCEED,
+    HELIOS_WLAN_EVENT_NETCFG_STOP_FAILED,
+    HELIOS_WLAN_EVENT_NETCFG_STAT_CLIENT_CONNECT,
+    HELIOS_WLAN_EVENT_NETCFG_GOT_KEY,
+    HELIOS_WLAN_EVENT_NETCFG_TIMEOUT,
+    HELIOS_WLAN_EVENT_MAX
+} Helios_Wlan_Event_e;
+
+typedef enum {
+    HELIOS_WLAN_ERROR_OK = 2000,
+    HELIOS_WLAN_ERROR_NO_MEM,
+    HELIOS_WLAN_ERROR_PARAM_INVALID,
+    HELIOS_WLAN_ERROR_WIFI_BUSY,
+    HELIOS_WLAN_ERROR_NOT_SUPPORT,
+    HELIOS_WLAN_ERROR_WIFI_ALREADY_CUR_IF,
+    HELIOS_WLAN_ERROR_INTERNAL,
+    HELIOS_WLAN_ERROR_WOULDCONNECT,
+    HELIOS_WLAN_ERROR_NO_AP_FOUND,
+    HELIOS_WLAN_ERROR_PWD_WRONG,
+    HELIOS_WLAN_ERROR_AUTHMODE_WRONG,
+    HELIOS_WLAN_ERROR_CHANNEL_INVALID,
+    HELIOS_WLAN_ERROR_NONAUTH,
+    HELIOS_WLAN_ERROR_NONASSOC,
+    HELIOS_WLAN_ERROR_HANDSHAKE_TIMEOUT,
+    HELIOS_WLAN_ERROR_WOULDBLOCK,
+    HELIOS_WLAN_ERROR_NOT_ACTIVE,
+    HELIOS_WLAN_ERROR_NO_STA_IF,
+    HELIOS_WLAN_ERROR_UNCONNECTED_AP,
+    HELIOS_WLAN_ERROR_AP_UNSTART,
+    HELIOS_WLAN_ERROR_NO_AP_IF,
+    HELIOS_WLAN_ERROR_NO_SCAN_MODE,
+    HELIOS_WLAN_ERROR_NO_AP_STA_IF,
+    HELIOS_WLAN_ERROR_TIMEOUT,
+    HELIOS_WLAN_ERROR_NETCFG_BUSY,
+    HELIOS_WLAN_ERROR_NETCFG_SOFTAP_START,
+    HELIOS_WLAN_ERROR_NETCFG_SOCKET_CREATE,
+    HELIOS_WLAN_ERROR_NETCFG_HTTP_SERVER_CREATE,
+    HELIOS_WLAN_ERROR_NETCFG_BLE_SERVER_CREATE,
+    HELIOS_WLAN_ERROR_NETCFG_GATT_SERVER_CREATE,
+    HELIOS_WLAN_ERROR_NETCFG_NOT_IN_NETCFG,
+    HELIOS_WLAN_ERROR_NETCFG_HTTP_SERVER_CLOSE,
+    HELIOS_WLAN_ERROR_NETCFG_SOCKET_CLOSE,
+    HELIOS_WLAN_ERROR_NETCFG_SOFTAP_CLOSE,
+    HELIOS_WLAN_ERROR_NETCFG_BLE_SERVER_CLOSE,
+    HELIOS_WLAN_ERROR_STA_KICKED_OFFLINE_BY_AP,
+    HELIOS_WLAN_ERROR_SER_DISCONNECT,
+    HELIOS_WLAN_ERROR_AUTHMODE_CHANGED,
+    HELIOS_WLAN_ERROR_IFMODE_CHANGED,
+    HELIOS_WLAN_ERROR_DHCP_LEASE_EXPIRED,
+    HELIOS_WLAN_ERROR_INACTIVE_TIMEOUT,
+    HELIOS_WLAN_ERROR_IP_DEL_ARTIFICIALLY,
+    HELIOS_WLAN_ERROR_MAX
+}Helios_Wlan_Error_e;
+
+typedef enum {
+    HELIOS_WLAN_STATUS_RF_NOT_ACTIVATED = 1000,
+    HELIOS_WLAN_STATUS_RF_ACTIVATED,
+    HELIOS_WLAN_STATUS_RF_SLEEP,
+    HELIOS_WLAN_STATUS_RF_WAKEUP,
+    HELIOS_WLAN_STATUS_AP_IDLE,
+    HELIOS_WLAN_STATUS_AP_START,
+    HELIOS_WLAN_STATUS_AP_STACONNECTED,
+    HELIOS_WLAN_STATUS_STA_IDLE,
+    HELIOS_WLAN_STATUS_STA_SCANNING,
+    HELIOS_WLAN_STATUS_STA_CONNECTING,
+    HELIOS_WLAN_STATUS_STA_CONNECTED,
+    HELIOS_WLAN_STATUS_STA_GOT_IP,
+    HELIOS_WLAN_STATUS_STA_LOST_IP,
+    HELIOS_WLAN_STATUS_NETCFG_NOT_INTO,
+    HELIOS_WLAN_STATUS_NETCFG_INTO,
+    HELIOS_WLAN_STATUS_NETCFG_GOT_KEY,
+    HELIOS_WLAN_STATUS_MAX,
+}Helios_Wlan_Status_e;
+
+typedef enum {
+    HELIOS_WLAN_MODE_NONE = 0,
+    HELIOS_WLAN_MODE_AP,
+    HELIOS_WLAN_MODE_STA,
+    HELIOS_WLAN_MODE_AP_STA,
+    HELIOS_WLAN_MODE_MAX,
+}Helios_Wlan_Mode_e;
+
+typedef enum {
+    HELIOS_WLAN_SOFTAP_IF,
+    HELIOS_WLAN_STATION_IF,
+    HELIOS_WLAN_MAX_IF,
+}Helios_Wlan_Interface_e;
+
+typedef struct {
+    char    ip[16];
+    char    netmask[16];
+    char    gateway[16];
+    char    dns_server[2][16];
+} Helios_Wlan_Ipconfig_t;
+
+typedef struct {
+    uint32_t status;          /**< status of scanning APs */
+    uint8_t  number;
+    uint8_t  scan_id;
+} Helios_Wlan_Event_STA_Scan_Done_t;
+
+typedef struct {
+    int8_t rssi;                /**< Signal strength of the current connected AP */
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of the current connected wlan */
+    uint8_t pwd[HELIOS_WIFI_PWD_MAX_LEN + 1];
+    uint8_t bssid[6];                /**< BSSID of the current connected wlan */
+    uint8_t channel;                 /**< Channel of the current connected wlan */
+    uint8_t auth;
+    uint8_t cipher;
+} Helios_Wlan_Event_STA_Connected_t;
+
+typedef struct {
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1];         /**< SSID of disconnected AP */
+    uint8_t ssid_len;                        /**< SSID length of disconnected AP */
+    uint8_t bssid[6];                        /**< BSSID of disconnected AP */
+    uint8_t reason;                          /**< reason of disconnection */
+} Helios_Wlan_Event_STA_Disconnected_t;
+
+typedef struct {
+    Helios_Wlan_Mode_e old_mode;         /**< the old auth mode of AP */
+    Helios_Wlan_Mode_e new_mode;         /**< the new auth mode of AP */
+} Helios_Wlan_Event_STA_Authmode_Change_t;
+
+typedef struct {
+    Helios_Wlan_Ipconfig_t ip_info;
+    uint8_t ip_changed;
+} Helios_Wlan_Event_STA_Got_IP_t;
+
+typedef struct {
+    uint8_t mac[6];           /**< MAC address of the station connected to soft-AP */
+    uint8_t aid;              /**< the aid that soft-AP gives to the station connected to  */
+} Helios_Wlan_Event_AP_StationConnected_t;
+
+typedef struct {
+    char ip[16];
+    uint8_t mac[6];
+    uint8_t aid;
+}Helios_Wlan_Event_AP_StationIPAssigned_t;
+
+typedef struct {
+    char ip[16];
+    uint8_t mac[6];
+    uint8_t aid;
+} Helios_Wlan_Event_AP_StationDisconnected_t;
+
+typedef struct {
+    uint8_t in_out;           /**< sta enter(1)/exit(0) gtk rekey */
+}Helios_Wlan_Event_STA_Gtk_Rekey_t;
+
+typedef struct {
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of the current connected wlan */
+    uint8_t password[HELIOS_WIFI_PWD_MAX_LEN + 1];
+}Helios_Wlan_Event_Netcfg_Got_Key_t;
+
+typedef union {
+    Helios_Wlan_Event_STA_Connected_t               connected;          /**< station connected to AP */
+    Helios_Wlan_Event_STA_Disconnected_t            disconnected;       /**< station disconnected to AP */
+    Helios_Wlan_Event_STA_Scan_Done_t               scan_done;          /**< station scan (APs) done */
+    Helios_Wlan_Event_STA_Authmode_Change_t         auth_change;        /**< the auth mode of AP station connected to changed */
+    Helios_Wlan_Event_STA_Got_IP_t                  got_ip;             /**< station got IP, first time got IP or when IP is changed */
+    Helios_Wlan_Event_AP_StationConnected_t         sta_connected;      /**< a station connected to soft-AP */
+    Helios_Wlan_Event_AP_StationIPAssigned_t        sta_ipassigned;
+    Helios_Wlan_Event_AP_StationDisconnected_t      sta_disconnected;   /**< a station disconnected to soft-AP */
+    Helios_Wlan_Event_STA_Gtk_Rekey_t               in_out_rekey;       /**< station enter/exit gtk rekey */
+    Helios_Wlan_Event_Netcfg_Got_Key_t              netcfg_got_key;
+} Helios_Wlan_Event_Info_t;
+
+typedef struct {
+    uint32_t                    type;
+    Helios_Wlan_Event_e         id;      /**< event ID */
+    Helios_Wlan_Event_Info_t    info;    /**< event information */
+} Helios_Wlan_Event_t;
+
+typedef int (*Helios_WlanEventCallback)(Helios_Wlan_Event_t* event);
+
+typedef struct {
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1];
+    uint8_t ssid_len;
+    uint8_t bssid[6];
     uint8_t channel;
     int8_t rssi;
     uint8_t auth;
-       uint8_t hidden;
+    uint8_t hidden;
 } Helios_Wlan_Scan_Result_t;
 
 typedef enum {
@@ -72,72 +252,147 @@ typedef enum {
     HELIOS_WLAN_AUTH_MAX
 } Helios_Wlan_Auth_Mode_e;
 
+typedef enum {
+    HELIOS_WLAN_CIPHER_NONE = 0,
+    HELIOS_WLAN_CIPHER_WEP40,
+    HELIOS_WLAN_CIPHER_WEP104,
+    HELIOS_WLAN_CIPHER_TKIP,
+    HELIOS_WLAN_CIPHER_CCMP,
+} Helios_Wlan_Cipher_Mode_e;
+
 typedef struct {
-    unsigned char    ssid[HELIOS_WIFI_SSID_MAX_LEN];
-    char             password[HELIOS_WIFI_PWD_MAX_LEN];
+    unsigned char    ssid[HELIOS_WIFI_SSID_MAX_LEN + 1];
+    char             password[HELIOS_WIFI_PWD_MAX_LEN + 1];
     uint8_t          channel;  //in concurrent mode(softap+sta), if sta is connected, will ignore this configure here, to take sta's channel.
     Helios_Wlan_Auth_Mode_e authmode;
     uint8_t             max_connect;
-       uint8_t                  hidden_ssid;
+    uint8_t                     hidden_ssid;
 } Helios_Wlan_Softap_Config_t;
 
 typedef struct {
-    unsigned char   ssid[HELIOS_WIFI_SSID_MAX_LEN]; /**< SSID of target AP*/
-    char     password[HELIOS_WIFI_PWD_MAX_LEN];    /**< password of target AP*/
+    unsigned char   ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of target AP*/
+    char     password[HELIOS_WIFI_PWD_MAX_LEN + 1];    /**< password of target AP*/
     uint8_t  channel;
     uint8_t  bssid[6];
 } Helios_Wlan_Station_Config_t;
 
-typedef struct
-{
-    Helios_Wlan_Work_Mode_e wifi_mode; /**< DHCP mode: @ref wlanInterfaceTypedef.*/
+typedef struct {
+    Helios_Wlan_Mode_e wifi_mode; /**< DHCP mode: @ref wlanInterfaceTypedef.*/
+    uint8_t block;
+    uint32_t timeout;                   /* timeout time */
     Helios_Wlan_Softap_Config_t ap;              /* configuration of AP */
     Helios_Wlan_Station_Config_t sta;            /* configuration of STA */
 } Helios_Wlan_Init_config_t;
 
-typedef struct
-{
+typedef struct {
     uint8_t state;              /**< The link to wlan is established or not, 0: disconnected, 1: connected. */
-    uint8_t rssi;           /**< Signal strength of the current connected AP */
-    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN]; /**< SSID of the current connected wlan */
+    int8_t rssi;                /**< Signal strength of the current connected AP */
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of the current connected wlan */
+    uint8_t pwd[HELIOS_WIFI_PWD_MAX_LEN + 1];
     uint8_t bssid[6];                /**< BSSID of the current connected wlan */
     uint8_t channel;                 /**< Channel of the current connected wlan */
+    uint8_t auth;
+    uint8_t cipher;
 } Helios_Wlan_Station_Status_t;
 
-typedef struct
-{
-       char    ip[16];
-    char    netmask[16];
-    char    gateway[16];
-       char    dns_server[2][16];
-} Helios_Wlan_Ipconfig_t;
+typedef struct {
+    uint8_t* ssid;               /* SSID of AP */
+    uint8_t* bssid;              /* MAC address of AP */
+    uint8_t  channel;            /* channel, scan the specific channel */
+    uint8_t  passive;            /* passive slave or not */
+    uint8_t  max_item;           /* max scan item */
+    int32_t scan_time;          /* scan time per channel, units: millisecond */
+} Helios_Wlan_Scan_Config_t;
 
-typedef struct 
-{
+typedef struct {
     uint8_t mac[6];
 } Helios_Wlan_Softap_Station_List_t;
 
+typedef enum {
+    HELIOS_WLAN_NETCFG_TYPE_SMARTCONFIG = 0,
+    HELIOS_WLAN_NETCFG_TYPE_WEBCONFIG,
+    HELIOS_WLAN_NETCFG_TYPE_BLECONFIG,
+    HELIOS_WLAN_NETCFG_TYPE_MAX
+}Helios_Wlan_Netcfg_Type_e;
 
-int Helios_Wlan_Start(Helios_Wlan_Init_config_t *wlan_config);
+typedef struct {
+    uint8_t enable;
+    uint8_t block;
+    Helios_Wlan_Netcfg_Type_e type;
+    uint32_t timeout;
+}Helios_Wlan_Netcfg_Config_t;
 
-int Helios_Wlan_Stop(Helios_Wlan_Work_Mode_e mode);
+typedef struct {
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of the current connected wlan */
+    uint8_t pwd[HELIOS_WIFI_PWD_MAX_LEN + 1];
+}Helios_Wlan_Netcfg_Result_t;
 
-int Helios_Wlan_Station_Status(Helios_Wlan_Station_Status_t *station_status);
+typedef struct {
+    uint8_t ssid[HELIOS_WIFI_SSID_MAX_LEN + 1]; /**< SSID of the current connected wlan */
+    uint8_t pwd[HELIOS_WIFI_PWD_MAX_LEN + 1];
+    Helios_Wlan_Error_e error_code;
+}Helios_Wlan_Netcfg_Event_Msg_t;
 
-Helios_Wlan_Status_e Helios_Wlan_isActive(Helios_Wlan_Work_Mode_e mode);
+typedef struct {
+    Helios_Wlan_Netcfg_Type_e type;
+    Helios_Wlan_Event_e id;
+    Helios_Wlan_Netcfg_Event_Msg_t msg;
+}Helios_Wlan_Netcfg_Event_Info_t;
 
-int Helios_Wlan_Softap_Get_Station_List(Helios_Wlan_Softap_Station_List_t *sta_list, uint32_t *num);
+int Helios_Wlan_isActive(Helios_Wlan_Interface_e vif);
 
-int Helios_Wlan_Scan_Start();
+int Helios_Wlan_Start(Helios_Wlan_Init_config_t* wlan_config);
 
-int Helios_Wlan_Scan_Num();
+int Helios_Wlan_Stop(Helios_Wlan_Mode_e mode);
 
-int Helios_Wlan_Scan_AP_Result(uint8_t index,Helios_Wlan_Scan_Result_t *ap_info);
+int Helios_Wlan_Station_Get_AP_Info(Helios_Wlan_Station_Status_t* station_status);
 
-int Helios_Wlan_Set_IPConfig(Helios_Wlan_Work_Mode_e mode, Helios_Wlan_Ipconfig_t *ipconfig);
+Helios_Wlan_Status_e Helios_Wlan_Get_Status(Helios_Wlan_Interface_e vif);
 
-int Helios_Wlan_IPConfig(Helios_Wlan_Work_Mode_e mode, Helios_Wlan_Ipconfig_t *ipconfig);
+Helios_Wlan_Status_e Helios_Wlan_Get_Netcfg_Status(void);
 
+int Helios_Wlan_Softap_Get_Station_List(Helios_Wlan_Softap_Station_List_t* sta_list, uint32_t* num);
 
-#endif
+/**
+ * [0] Non blocking
+ * [1] block
+*/
+int Helios_Wlan_Scan_Start(uint8_t block, Helios_Wlan_Scan_Config_t* config);
+
+int Helios_Wlan_Scan_Num(void);
+
+int Helios_Wlan_Scan_AP_Result(uint8_t index, Helios_Wlan_Scan_Result_t* ap_info);
+
+int Helios_Wlan_Set_IPConfig(Helios_Wlan_Interface_e vif, Helios_Wlan_Ipconfig_t* ipconfig);
+
+int Helios_Wlan_Get_IPConfig(Helios_Wlan_Interface_e vif, Helios_Wlan_Ipconfig_t* ipconfig);
+
+int Helios_Wlan_Get_Channel(Helios_Wlan_Interface_e vif);
+
+int Helios_Wlan_AP_Add_Station_to_Blacklist(uint8_t* sta_mac);
+
+int Helios_Wlan_AP_Remove_Station_from_Blacklist(uint8_t* sta_mac);
+
+int Helios_Wlan_AP_Get_Station_MAC(uint32_t ip, uint8_t* sta_mac);
+
+int Helios_Wlan_AP_Get_Station_IP(uint32_t* ip, uint8_t* sta_mac);
 
+int Helios_Wlan_AP_Get_Station_AID(uint8_t* aid, uint8_t* sta_mac);
+
+int Helios_Wlan_Set_MAC_Addr(Helios_Wlan_Interface_e vif, uint8_t* mac);
+
+int Helios_Wlan_Get_MAC_Addr(Helios_Wlan_Interface_e vif, uint8_t* mac);
+
+int Helios_Wlan_Set_Country_Code(const char* country_code);
+
+int Helios_Wlan_Get_Country_Code(char* country_code);
+
+int Helios_Wlan_Set_Event_Callback(Helios_WlanEventCallback cb);
+
+int Helios_Wlan_Del_Event_Callback(Helios_WlanEventCallback cb);
+
+int Helios_Wlan_Netcfg_Start(Helios_Wlan_Netcfg_Config_t config, Helios_Wlan_Netcfg_Result_t* result);
+
+int Helios_Wlan_Netcfg_Stop(Helios_Wlan_Netcfg_Config_t config);
+
+#endif
index 9527b1e..aa9d1e3 100644 (file)
@@ -194,6 +194,10 @@ void Helios_WLAN_5803W_Get_ConnectionList(int *output_num, Helios_WLAN_5803W_Dev
 
 int Helios_WLAN_5803W_SetMAC(char *mac);
 
+int Helios_WLAN_5803W_AP_SetAllCfg(Helios_WLAN_5803W_CFG *wifi_cfg);
+
+int Helios_WLAN_5803W_SetDefaultNetworkCard(char *ip);
+
 #if 0
 
 int Helios_WLAN_5803W_AP_SetAuth(uint8_t auth);
index 936b250..3861ea4 100644 (file)
@@ -62,6 +62,9 @@ int Helios_YT8512H_Node_List(int *num, u32_t *ip, u8_t mac[][6], u32_t *ticks);
 
 int Helios_YT8512H_Pool_Config(int pool_start, int pool_end, int lease_time);
 
+void Helios_YT8512H_AutoSleep(int enable);
+
+uint16_t Helios_YT8512H_RGMII_DeInit(void);
 
 #endif
 
index e10e0fd..298a314 100644 (file)
 ##########################################
 # flags and libs on Unisoc & Unisoc_8850 #
 ##########################################
-ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8850 Unisoc_8910_R05))
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8850 Unisoc_8910_R05 Unisoc_8850_R02 Unisoc_8910_R06))
 CFLAGS_PLAT =  -mcpu=cortex-a5 -mtune=generic-armv7-a -mthumb \
                                -mfpu=neon-vfpv4 -mfloat-abi=hard -mno-unaligned-access
 CPPFLAGS_PLAT = -mcpu=cortex-a5 -mtune=generic-armv7-a -mthumb \
                                -mfpu=neon-vfpv4 -mfloat-abi=hard -mno-unaligned-access
 include config/config.mk
 
-ifeq ($(CONFIG_CAMERA_DECODE), y)
+# ifeq ($(CONFIG_CAMERA_DECODE), y)
+ifeq ($(CONFIG_CAMERA), y)
+# $(info USE nano lib)
 USE_NANO_LIB = y
 endif
 
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC800GCN_LD EC600UCN_LB EC800GCN_TT EG800GLA_LD))
+# $(info USE nano lib)
+USE_NANO_LIB = y
+endif
 
 ifeq ($(USE_NANO_LIB), y) # use nano lib
 STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7-a+fp/hard/libc_nano.a
@@ -40,7 +46,7 @@ endif
 STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7-a+fp/hard/libm.a \
                        $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7-a+fp/hard/libgcc.a
             
-ifeq ($(strip $(PLAT)), Unisoc_8850)
+ifeq ($(strip $(PLAT)),$(filter $(PLAT),Unisoc_8850 Unisoc_8850_R02 Unisoc_8910_R06))
 DFLAGS_PLAT = _SYS__TIMEVAL_H_
 endif
 endif
@@ -68,6 +74,41 @@ STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
                        $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a
 endif
 
+ifeq ($(strip $(PLAT)), aic8800m40)
+CFLAGS_PLAT =  -mthumb -mabi=aapcs -mfloat-abi=softfp -mfpu=fpv4-sp-d16 -fms-extensions \
+                               -Wall -Wchar-subscripts -Wformat -Wuninitialized \
+                               -Winit-self -Wignored-qualifiers -std=c99 -fno-builtin \
+                               -fdata-sections -ffunction-sections
+                               
+DFLAGS_PLAT = _SYS_SELECT_H
+ifeq ($(USE_NANO_LIB), y) # use nano lib
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc_nano.a
+else
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc.a
+endif
+
+ifneq ($(USE_NOSYS_LIB), n) # use nosys lib
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libnosys.a
+endif
+
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
+                       $(COMPILER_PATH)/lib/gcc/$(CROSS)/9.2.1/thumb/v7/nofp/libgcc.a
+
+
+# ifeq ($(USE_NANO_LIB), y) # use nano lib
+# STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/libc_nano.a
+# else
+# STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/libc.a
+# endif
+
+# ifneq ($(USE_NOSYS_LIB), n) # use nosys lib
+# STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/libnosys.a
+# endif
+
+# STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/libm.a \
+#                      $(COMPILER_PATH)/lib/gcc/$(CROSS)/9.2.1/libgcc.a
+endif
+
 ##########################
 # flags and libs on ASR_1803s  #
 ##########################
@@ -96,11 +137,96 @@ STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
                        $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a
 endif
 
+
+##########################
+# flags and libs on ASR_1803sc  #
+##########################
+ifeq ($(strip $(PLAT)), ASR_1803sc)
+#CFLAGS_PLAT =         -mcpu=cortex-r4 -mtune=cortex-r4 -mthumb \
+#                              -mthumb-interwork -mfloat-abi=soft -mlong-calls
+FNO_BUILTIN_FLAGS := -fno-builtin-printf \
+                                  -fno-builtin-time \
+                                  -fno-builtin-gmtime \
+                                  -fno-builtin-gettimeofday \
+                                  -fno-builtin-mktime \
+                                  -fno-builtin-puts
+CFLAGS_PLAT = -c -MMD -mcpu=cortex-r5 -mfloat-abi=soft   -mlittle-endian -mthumb -mthumb-interwork  -Wall -ffunction-sections -fdata-sections $(FNO_BUILTIN_FLAGS) -D__OCPU_COMPILER_GCC__ -D_WANT_USE_LONG_TIME_T  -std=c99 -g -Os
+DFLAGS_PLAT = _SYS_SELECT_H
+ifeq ($(USE_NANO_LIB), y) # use nano lib
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc_nano.a
+else
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc.a
+endif
+
+ifneq ($(USE_NOSYS_LIB), n) # use nosys lib
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libnosys.a
+endif
+
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
+                       $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a
+endif
+
 ##########################
 # flags and libs on ASR_1606  #
 ##########################
 ifeq ($(strip $(PLAT)), ASR_1606)
 
+FNO_BUILTIN_FLAGS := -fno-builtin-printf \
+                                       -fno-builtin-time \
+                                       -fno-builtin-gmtime \
+                                       -fno-builtin-gettimeofday \
+                                       -fno-builtin-mktime \
+                                       -fno-builtin-puts
+
+CFLAGS_PLAT =  -c -MMD -mcpu=cortex-r5 -mfloat-abi=soft \
+                               -mlittle-endian -mthumb -mthumb-interwork -Wall -ffunction-sections -fdata-sections \
+                               $(FNO_BUILTIN_FLAGS) -D__OCPU_COMPILER_GCC__ -D_WANT_USE_LONG_TIME_T -std=c99
+                               
+DFLAGS_PLAT = _SYS_SELECT_H \
+            __HELIOS_OS__ \
+            ENABLE_TRACE
+
+STD_LIBS = $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc_nano.a \
+                 $(COMPILER_PATH)/$(CROSS)/lib/libstdc++.a \
+                 $(COMPILER_PATH)/$(CROSS)/lib/libg.a
+
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
+                       $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a \
+                       $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libnosys.a
+endif
+
+##########################
+# flags and libs on ASR_1602  #
+##########################
+ifeq ($(strip $(PLAT)), ASR_1602)
+
+FNO_BUILTIN_FLAGS := -fno-builtin-printf \
+                                       -fno-builtin-time \
+                                       -fno-builtin-gmtime \
+                                       -fno-builtin-gettimeofday \
+                                       -fno-builtin-mktime \
+                                       -fno-builtin-puts
+
+CFLAGS_PLAT =  -c -MMD -mcpu=cortex-r5 -mfloat-abi=soft \
+                               -mlittle-endian -mthumb -mthumb-interwork -Wall -ffunction-sections -fdata-sections \
+                               $(FNO_BUILTIN_FLAGS) -D__OCPU_COMPILER_GCC__ -D_WANT_USE_LONG_TIME_T -std=c99
+                               
+DFLAGS_PLAT = _SYS_SELECT_H
+
+STD_LIBS = $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc_nano.a \
+                 $(COMPILER_PATH)/$(CROSS)/lib/libstdc++.a \
+                 $(COMPILER_PATH)/$(CROSS)/lib/libg.a
+
+STD_LIBS += $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
+                       $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a \
+                       $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libnosys.a
+endif
+
+##########################
+# flags and libs on ASR_1609  #
+##########################
+ifeq ($(strip $(PLAT)), ASR_1609)
+
 FNO_BUILTIN_FLAGS := -fno-builtin-printf \
                                        -fno-builtin-time \
                                        -fno-builtin-gmtime \
@@ -234,6 +360,29 @@ LDFLAGS_PLAT = $(ECR6600_CFLAGS)
 STD_LIBS = system/platform/$(PLAT)/boards/$(BOARD)/libraries/libs/libandes.a
 endif
 
+##########################
+# flags and libs on EIGEN 718 #
+##########################
+
+ifeq ($(strip $(PLAT)), EIGEN_718)
+
+EIGEN_CFLAGS = -mcpu=cortex-m3 -mthumb -mslow-flash-data -specs=nano.specs -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--wrap=printf
+EIGEN_PLAT_CFLAGS = -Wl,--print-memory-usage -DQUECTEL_OPEN_MODE_SUPPORT -DFEATURE_OS_ENABLE -DFEATURE_FREERTOS_ENABLE -DTYPE_EC718P -DOPEN_CPU_MODE -DLITE_FEATURE_MODE -DLSPD_FEATURE_MODE -DLOW_SPEED_SERVICE_ONLY -DTRACE_LEVEL=5 -DSOFTPACK_VERSION="\"\"" -DHAVE_STRUCT_TIMESPEC
+
+EIGEN_PLAT_CPPFLAGS = -Wall -Wno-format -Werror -nostartfiles -mapcs-frame -Wl,--print-memory-usage
+
+CFLAGS_PLAT = $(EIGEN_CFLAGS) $(EIGEN_PLAT_CFLAGS)
+CPPFLAGS_PLAT = $(EIGEN_CFLAGS) $(EIGEN_PLAT_CPPFLAGS)
+
+LDFLAGS_PLAT = --wrap=_malloc_r --wrap=_free_r --wrap=_realloc_r --wrap=malloc --wrap=free -u _printf_float --wrap=printf --wrap=puts
+
+STD_LIBS += \
+       $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libm.a \
+       $(COMPILER_PATH)/$(CROSS)/lib/thumb/v7/nofp/libc_nano.a \
+       $(COMPILER_PATH)/lib/gcc/$(CROSS)/10.2.1/thumb/v7/nofp/libgcc.a
+
+endif
+
 ##########################
 #  export for STD_LIBS   #
 ##########################
index d2a314f..0518829 100644 (file)
@@ -90,17 +90,28 @@ config TTS
 help 
     This is TTS support.
 
+config BT_BLE
+    bool "Enable BT_BLE" 
+    default n
+help 
+    This is BT and BLE support.
+menu "btble option"
+       depends on BT_BLE
+
+       source "../services/microPython/config/btble_option.in"
+       endmenu 
+
 config LCD
     bool "Enable LCD" 
     default y
 help 
     This is LCD support.
 
-config UART_SLIP
-    bool "Enable UART_SLIP" 
+config SLIP
+    bool "Enable SLIP" 
     default n
 help 
-    This is UART_SLIP SERVICE support.
+    This is uart slip nic support.
        
 config USQLITE
     bool "Enable usqlite" 
@@ -108,3 +119,38 @@ config USQLITE
 help 
     This is usqlite support.
 
+config JRTC
+    bool "Enable jrtc" 
+    default n
+help 
+    This is jrtc support.
+
+menu "JRTC option"
+       depends on JRTC
+
+       source "../services/microPython/config/jrtc_option.in"
+       endmenu
+
+config ETHERNET
+    bool "Enable ethernet" 
+    default n
+help 
+    This is ethernet support.'
+
+menu "ETHERNET option"
+       depends on ETHERNET
+
+       source "../services/microPython/config/ethernet_option.in"
+       endmenu
+
+config SENSOR 
+    bool "Enable SENSOR" 
+    default n 
+help 
+    This is sensor support.
+
+menu "SENSOR option"
+    depends on SENSOR
+
+    source "../services/microPython/config/sensor_option.in"
+    endmenu
index 34e7f85..7af01e3 100644 (file)
@@ -407,3 +407,15 @@ config LVGL_HANDLER_TASK_PRIORITY
        range 90 120
     default 93
 
+config LVGL_IME_PINYIN
+    bool "Enable lvgl pinyin" 
+    default n 
+help 
+    This is lvgl_span support.
+
+config LVGL_USE_FREETYPE
+    bool "Enable lvgl freetype" 
+    default n 
+help 
+    This is lvgl_freetype support.
+
index 2d517da..8570157 100644 (file)
@@ -62,7 +62,7 @@ A million repetitions of "a"
 
 
 /* Hash a single 512-bit block. This is the core of the algorithm. */
-
+#if !(defined (PLAT_ECR6600) || defined (PLAT_aic8800m40))
 void SHA1Transform(
         uint32_t state[5],
         const unsigned char buffer[64]
@@ -308,4 +308,253 @@ void SHA1(
     hash_out[20] = '\0';
        //uart_printf("[SHA1]   %%%%%%  input=%s, output=%s\n", str, hash_out);
 }
+
+#else
+
+void q_SHA1Transform(
+        uint32_t state[5],
+        const unsigned char buffer[64]
+)
+{
+    uint32_t a, b, c, d, e;
+
+    typedef union
+    {
+        unsigned char c[64];
+        uint32_t l[16];
+    } CHAR64LONG16;
+
+#ifdef SHA1HANDSOFF
+    CHAR64LONG16 block[1];      /* use array to appear as a pointer */
+
+    memcpy(block, buffer, 64);
+#else
+    /* The following had better never be used because it causes the
+     * pointer-to-const buffer to be cast into a pointer to non-const.
+     * And the result is written through.  I threw a "const" in, hoping
+     * this will cause a diagnostic.
+     */
+    CHAR64LONG16 *block = (const CHAR64LONG16 *) buffer;
+#endif
+    /* Copy context->state[] to working vars */
+    a = state[0];
+    b = state[1];
+    c = state[2];
+    d = state[3];
+    e = state[4];
+    /* 4 rounds of 20 operations each. Loop unrolled. */
+    R0(a, b, c, d, e, 0);
+    R0(e, a, b, c, d, 1);
+    R0(d, e, a, b, c, 2);
+    R0(c, d, e, a, b, 3);
+    R0(b, c, d, e, a, 4);
+    R0(a, b, c, d, e, 5);
+    R0(e, a, b, c, d, 6);
+    R0(d, e, a, b, c, 7);
+    R0(c, d, e, a, b, 8);
+    R0(b, c, d, e, a, 9);
+    R0(a, b, c, d, e, 10);
+    R0(e, a, b, c, d, 11);
+    R0(d, e, a, b, c, 12);
+    R0(c, d, e, a, b, 13);
+    R0(b, c, d, e, a, 14);
+    R0(a, b, c, d, e, 15);
+    R1(e, a, b, c, d, 16);
+    R1(d, e, a, b, c, 17);
+    R1(c, d, e, a, b, 18);
+    R1(b, c, d, e, a, 19);
+    R2(a, b, c, d, e, 20);
+    R2(e, a, b, c, d, 21);
+    R2(d, e, a, b, c, 22);
+    R2(c, d, e, a, b, 23);
+    R2(b, c, d, e, a, 24);
+    R2(a, b, c, d, e, 25);
+    R2(e, a, b, c, d, 26);
+    R2(d, e, a, b, c, 27);
+    R2(c, d, e, a, b, 28);
+    R2(b, c, d, e, a, 29);
+    R2(a, b, c, d, e, 30);
+    R2(e, a, b, c, d, 31);
+    R2(d, e, a, b, c, 32);
+    R2(c, d, e, a, b, 33);
+    R2(b, c, d, e, a, 34);
+    R2(a, b, c, d, e, 35);
+    R2(e, a, b, c, d, 36);
+    R2(d, e, a, b, c, 37);
+    R2(c, d, e, a, b, 38);
+    R2(b, c, d, e, a, 39);
+    R3(a, b, c, d, e, 40);
+    R3(e, a, b, c, d, 41);
+    R3(d, e, a, b, c, 42);
+    R3(c, d, e, a, b, 43);
+    R3(b, c, d, e, a, 44);
+    R3(a, b, c, d, e, 45);
+    R3(e, a, b, c, d, 46);
+    R3(d, e, a, b, c, 47);
+    R3(c, d, e, a, b, 48);
+    R3(b, c, d, e, a, 49);
+    R3(a, b, c, d, e, 50);
+    R3(e, a, b, c, d, 51);
+    R3(d, e, a, b, c, 52);
+    R3(c, d, e, a, b, 53);
+    R3(b, c, d, e, a, 54);
+    R3(a, b, c, d, e, 55);
+    R3(e, a, b, c, d, 56);
+    R3(d, e, a, b, c, 57);
+    R3(c, d, e, a, b, 58);
+    R3(b, c, d, e, a, 59);
+    R4(a, b, c, d, e, 60);
+    R4(e, a, b, c, d, 61);
+    R4(d, e, a, b, c, 62);
+    R4(c, d, e, a, b, 63);
+    R4(b, c, d, e, a, 64);
+    R4(a, b, c, d, e, 65);
+    R4(e, a, b, c, d, 66);
+    R4(d, e, a, b, c, 67);
+    R4(c, d, e, a, b, 68);
+    R4(b, c, d, e, a, 69);
+    R4(a, b, c, d, e, 70);
+    R4(e, a, b, c, d, 71);
+    R4(d, e, a, b, c, 72);
+    R4(c, d, e, a, b, 73);
+    R4(b, c, d, e, a, 74);
+    R4(a, b, c, d, e, 75);
+    R4(e, a, b, c, d, 76);
+    R4(d, e, a, b, c, 77);
+    R4(c, d, e, a, b, 78);
+    R4(b, c, d, e, a, 79);
+    /* Add the working vars back into context.state[] */
+    state[0] += a;
+    state[1] += b;
+    state[2] += c;
+    state[3] += d;
+    state[4] += e;
+    /* Wipe variables */
+    a = b = c = d = e = 0;
+#ifdef SHA1HANDSOFF
+    memset(block, '\0', sizeof(block));
+#endif
+}
+
+
+/* q_SHA1Init - Initialize new context */
+
+void q_SHA1Init(
+        SHA1_CTX * context
+)
+{
+    /* SHA1 initialization constants */
+    context->state[0] = 0x67452301;
+    context->state[1] = 0xEFCDAB89;
+    context->state[2] = 0x98BADCFE;
+    context->state[3] = 0x10325476;
+    context->state[4] = 0xC3D2E1F0;
+    context->count[0] = context->count[1] = 0;
+}
+
+
+/* Run your data through this. */
+
+void q_SHA1Update(
+        SHA1_CTX * context,
+        const unsigned char *data,
+        uint32_t len
+)
+{
+    uint32_t i;
+
+    uint32_t j;
+
+    j = context->count[0];
+    if ((context->count[0] += len << 3) < j)
+        context->count[1]++;
+    context->count[1] += (len >> 29);
+    j = (j >> 3) & 63;
+    if ((j + len) > 63)
+    {
+        memcpy(&context->buffer[j], data, (i = 64 - j));
+        q_SHA1Transform(context->state, context->buffer);
+        for (; i + 63 < len; i += 64)
+        {
+            q_SHA1Transform(context->state, &data[i]);
+        }
+        j = 0;
+    }
+    else
+        i = 0;
+    memcpy(&context->buffer[j], &data[i], len - i);
+}
+
+
+/* Add padding and return the message digest. */
+
+void q_SHA1Final(
+        unsigned char digest[20],
+        SHA1_CTX * context
+)
+{
+    unsigned i;
+
+    unsigned char finalcount[8];
+
+    unsigned char c;
+
+#if 0    /* untested "improvement" by DHR */
+    /* Convert context->count to a sequence of bytes
+     * in finalcount.  Second element first, but
+     * big-endian order within element.
+     * But we do it all backwards.
+     */
+    unsigned char *fcp = &finalcount[8];
+
+    for (i = 0; i < 2; i++)
+    {
+        uint32_t t = context->count[i];
+
+        int j;
+
+        for (j = 0; j < 4; t >>= 8, j++)
+            *--fcp = (unsigned char) t}
+#else
+    for (i = 0; i < 8; i++)
+    {
+        finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255);      /* Endian independent */
+    }
+#endif
+    c = 0200;
+    q_SHA1Update(context, &c, 1);
+    while ((context->count[0] & 504) != 448)
+    {
+        c = 0000;
+        q_SHA1Update(context, &c, 1);
+    }
+    q_SHA1Update(context, finalcount, 8); /* Should cause a q_SHA1Transform() */
+    for (i = 0; i < 20; i++)
+    {
+        digest[i] = (unsigned char)
+                ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
+    }
+    /* Wipe variables */
+    memset(context, '\0', sizeof(*context));
+    memset(&finalcount, '\0', sizeof(finalcount));
+}
+
+void SHA1(
+        char *hash_out,
+        const char *str,
+        int len)
+{
+    SHA1_CTX ctx;
+    unsigned int ii;
+       
+    q_SHA1Init(&ctx);
+    for (ii = 0; ii < (unsigned int)len; ii += 1)
+    {
+        q_SHA1Update(&ctx, (const unsigned char*)str + ii, 1);
+    }
+    q_SHA1Final((unsigned char *)hash_out, &ctx);
+    hash_out[20] = '\0';
+       //uart_printf("[SHA1]   %%%%%%  input=%s, output=%s\n", str, hash_out);
+}
+#endif
 #endif
index 7fc517a..f543711 100644 (file)
@@ -21,6 +21,7 @@ typedef struct
     unsigned char buffer[64];
 }SHA1_CTX;
 
+#if !defined (PLAT_ECR6600)
 void SHA1Transform(
         uint32_t state[5],
         const unsigned char buffer[64]
@@ -45,4 +46,30 @@ void SHA1(
         char *hash_out,
         const char *str,
         int len);
+#else
+void q_SHA1Transform(
+        uint32_t state[5],
+        const unsigned char buffer[64]
+);
+
+void q_SHA1Init(
+        SHA1_CTX * context
+);
+
+void q_SHA1Update(
+        SHA1_CTX * context,
+        const unsigned char *data,
+        uint32_t len
+);
+
+void q_SHA1Final(
+        unsigned char digest[20],
+        SHA1_CTX * context
+);
+
+void SHA1(
+        char *hash_out,
+        const char *str,
+        int len);
+#endif
 #endif
index 8c7e890..4701a47 100644 (file)
@@ -94,6 +94,14 @@ struct ctr_params {
 #include "gmssl/sm4.h"
 #endif
 
+#if MICROPY_PY_UCRYPTOLIB_ECDSA
+extern const mp_obj_module_t ucryptolib_ecdsa_type;
+#endif
+
+#if MICROPY_PY_UCRYPTOLIB_ECDH
+extern const mp_obj_module_t ucryptolib_ecdh_type;
+#endif
+
 // we can't run mbedtls AES key schedule until we know whether we're used for encrypt or decrypt.
 // therefore, we store the key & keysize and on the first call to encrypt/decrypt we override them
 // with the mbedtls_aes_context, as they are not longer required. (this is done to save space)
@@ -339,6 +347,7 @@ STATIC void aes_process_wrap_impl(AES_CTX_IMPL *ctx, uint8_t key_type, const uin
 #endif
 #endif
 
+#if !(defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS))
 STATIC mp_obj_t ucryptolib_aes_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
     mp_arg_check_num(n_args, n_kw, 2, 3, false);
 
@@ -594,7 +603,7 @@ STATIC const mp_obj_type_t ucryptolib_aes_type = {
     .make_new = ucryptolib_aes_make_new,
     .locals_dict = (void *)&ucryptolib_aes_locals_dict,
 };
-
+#endif
 
 #if MICROPY_PY_UCRYPTOLIB_DES
 
@@ -640,9 +649,21 @@ STATIC mp_obj_t ucryptolib_des_make_new(const mp_obj_type_t *type, size_t n_args
     
     const mp_int_t arg_type = mp_obj_get_int(args[1]);
     self->des_type = arg_type;
+    if (self->des_type == UCRYPTOLIB_MODE_CBC)
+    {
+        self->des_type = CBC;
+    }
+    if(self->des_type != CBC && self->des_type != ECB)
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid mode"));
+    }
 
-    if(self->des_type == 0)
+    if(self->des_type != ECB)
     {
+        if(n_args == 2)
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid iv"));
+        }
         mp_get_buffer_raise(args[2], &ivinfo, MP_BUFFER_READ);
         if(ivinfo.len != 8)
         {
@@ -654,7 +675,7 @@ STATIC mp_obj_t ucryptolib_des_make_new(const mp_obj_type_t *type, size_t n_args
     {
         if(n_args == 3)
         {
-            mp_printf(&mp_plat_print, "iv is not used in ECB mode.\r\n");
+            mp_printf(&mp_plat_print, "ECB not iv.\r\n");
         }
     }
     
@@ -979,21 +1000,21 @@ STATIC mp_obj_t ucryptolib_sm2_make_new(const mp_obj_type_t *type, size_t n_args
 
 STATIC mp_obj_t ucryptolib_sm2_genkey(size_t n_args, const mp_obj_t *args)
 {
-    mp_obj_sm2_t *sm2_self = MP_OBJ_TO_PTR(args[0]);
+    SM2_KEY sm2_key;
     vstr_t pri_vstr, pub_vstr;
     unsigned char *pub_buf, *pri_buf = NULL;
 
     vstr_init_len(&pri_vstr, 32);
     vstr_init_len(&pub_vstr, 64);
 
-    if (sm2_key_generate(&sm2_self->sm2_key) != 1)
+    if (sm2_key_generate(&sm2_key) != 1)
     {
                mp_raise_ValueError(MP_ERROR_TEXT("key generate error"));
     }
 
-    memcpy(pri_vstr.buf, sm2_self->sm2_key.private_key, 32);
-    memcpy(pub_vstr.buf, sm2_self->sm2_key.public_key.x, 32);
-    memcpy(pub_vstr.buf + 32, sm2_self->sm2_key.public_key.y, 32);
+    memcpy(pri_vstr.buf, sm2_key.private_key, 32);
+    memcpy(pub_vstr.buf, sm2_key.public_key.x, 32);
+    memcpy(pub_vstr.buf + 32, sm2_key.public_key.y, 32);
     
     mp_obj_t key_tuple[2] = {
        mp_obj_new_str_from_vstr(&mp_type_bytes, &pri_vstr),
@@ -1002,7 +1023,7 @@ STATIC mp_obj_t ucryptolib_sm2_genkey(size_t n_args, const mp_obj_t *args)
 
     return mp_obj_new_tuple(2, key_tuple);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_genkey_obj, 1, 1, ucryptolib_sm2_genkey);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_genkey_obj, 0, 1, ucryptolib_sm2_genkey);
 
 
 #define SIGN    1
@@ -1027,11 +1048,28 @@ STATIC mp_obj_t sm2_sign_pross(mp_obj_sm2_t *self, size_t n_args, const mp_obj_t
 
     if (mode)
     {
-        vstr_t vstr;
-        if ((sm2_sign(&sm2_self->sm2_key, dgst, sig, &siglen)) != 1)
+        if (n_args == 2)
         {
-            mp_raise_ValueError(MP_ERROR_TEXT("sign failed"));
+            if ((sm2_sign(&sm2_self->sm2_key, dgst, sig, &siglen)) != 1)
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("sign failed"));
+            }
         }
+        else
+        {
+            SM2_SIGN_CTX sign_ctx;
+            mp_obj_t id_input = MP_OBJ_NULL;
+            id_input = args[2];
+            mp_buffer_info_t id_info;
+            mp_get_buffer_raise(id_input, &id_info, MP_BUFFER_READ);
+            
+            if (sm2_sign_init(&sign_ctx, &sm2_self->sm2_key, id_info.buf, id_info.len) != 1
+                       || sm2_sign_update(&sign_ctx, dgst_info.buf, dgst_info.len) != 1
+                       || sm2_sign_finish(&sign_ctx, sig, &siglen) != 1) {
+                       mp_raise_ValueError(MP_ERROR_TEXT("sign failed"));
+               }
+        }
+        vstr_t vstr;
         vstr_init_len(&vstr, siglen);
         memcpy(vstr.buf, &sig, siglen);
         return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
@@ -1042,12 +1080,30 @@ STATIC mp_obj_t sm2_sign_pross(mp_obj_sm2_t *self, size_t n_args, const mp_obj_t
         sig_input = args[2];
         mp_buffer_info_t sig_info;
         mp_get_buffer_raise(sig_input, &sig_info, MP_BUFFER_READ);
-        
         memcpy(&pub_key, &sm2_self->sm2_key, sizeof(SM2_POINT));
-       if ((ret = sm2_verify(&pub_key, dgst, sig_info.buf, sig_info.len)) != 1)
-        {   
-            mp_raise_ValueError(MP_ERROR_TEXT("verify failed"));
+        
+        if (n_args == 3)
+        {
+            if ((ret = sm2_verify(&pub_key, dgst, sig_info.buf, sig_info.len)) != 1)
+            {   
+                mp_raise_ValueError(MP_ERROR_TEXT("verify failed"));
+            }
         }
+        else
+        {
+            SM2_SIGN_CTX verify_ctx;
+            mp_obj_t id_input = MP_OBJ_NULL;
+            id_input = args[3];
+            mp_buffer_info_t id_info;
+            mp_get_buffer_raise(id_input, &id_info, MP_BUFFER_READ);
+
+            if (sm2_verify_init(&verify_ctx, &pub_key, id_info.buf, id_info.len) != 1
+                       || sm2_verify_update(&verify_ctx, dgst_info.buf, dgst_info.len) != 1
+                       || (ret = sm2_verify_finish(&verify_ctx, sig_info.buf, sig_info.len)) != 1) {
+                       mp_raise_ValueError(MP_ERROR_TEXT("verify failed"));
+               }
+        }
+       
         return mp_obj_new_int(0);
     }
 }
@@ -1066,47 +1122,159 @@ STATIC mp_obj_t ucryptolib_sm2_verify(size_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_verify_obj, 1, 4, ucryptolib_sm2_verify);
 
-#define ENCRYPT  1
-#define DECRYPT  0
+#define ENCRYPT     1
+#define DECRYPT     0
+
+enum {
+    SM2_MODE_COMPATIBLE     = 1,
+    SM2_MODE_DEFAULT        = 0,
+    SM2_FORMAT_C1C3C2       = 1,
+    SM2_FORMAT_C1C2C3       = 0,
+};
+
+#define CHECK_BOOLEAN_PARAM(param) \
+    do { \
+        if ((param) != 0 && (param) != 1) { \
+            mp_raise_ValueError(MP_ERROR_TEXT("Invalid Param")); \
+        } \
+    } while (0)
+
 
 STATIC mp_obj_t sm2_crpty_pross(mp_obj_sm2_t *self, size_t n_args, const mp_obj_t *args, bool crpty_mode)
 {
     mp_obj_sm2_t *sm2_self = MP_OBJ_TO_PTR(args[0]);
-    
+
+    int ret = 0;
        size_t len;
     vstr_t vstr;
-    int mode = 0;
     SM2_KEY pub_key;
+    int data_fmt = 0;
+    int enc_dec_mode = 0;
+    int def_comp_mode = 0;
     mp_obj_t input_buf = MP_OBJ_NULL;
        unsigned char plaintext[SM2_MAX_PLAINTEXT_SIZE];
        unsigned char ciphertext[SM2_MAX_CIPHERTEXT_SIZE];
 
-    mode = crpty_mode;
+    if (n_args == 2)
+    {
+        def_comp_mode = 0;
+        data_fmt = 0;
+        CHECK_BOOLEAN_PARAM(data_fmt);
+    }
+    else if (n_args == 3)
+    {
+        def_comp_mode = mp_obj_get_int(args[2]);
+        data_fmt = 0;
+        if (def_comp_mode != SM2_MODE_DEFAULT) mp_raise_ValueError(MP_ERROR_TEXT("Invalid Param"));
+        CHECK_BOOLEAN_PARAM(data_fmt);
+    }
+    else if (n_args == 4)
+    {
+        def_comp_mode = mp_obj_get_int(args[2]);
+        data_fmt = mp_obj_get_int(args[3]);
+        CHECK_BOOLEAN_PARAM(def_comp_mode);
+        CHECK_BOOLEAN_PARAM(data_fmt);
+    }
+    else
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("Invalid Param"));
+    }
+    
+    enc_dec_mode = crpty_mode;
     input_buf = args[1];
     mp_buffer_info_t input_info;
     memcpy(sm2_self->sm2_key.private_key, sm2_self->pri_key, 32);
     mp_get_buffer_raise(input_buf, &input_info, MP_BUFFER_READ);
     
-    if (mode)
+    if (enc_dec_mode)
     {
         memcpy(&pub_key, &sm2_self->sm2_key, sizeof(SM2_POINT));
-           if (sm2_encrypt(&pub_key, input_info.buf, input_info.len, ciphertext, &len) != 1)
+
+        if (def_comp_mode)
+        {
+            // Compatibility mode
+            SM2_CIPHERTEXT C = {0};
+            ret = sm2_do_encrypt(&pub_key, (const uint8_t *)input_info.buf, input_info.len, &C);
+            if (ret == 1)
+            {
+                if (data_fmt)
+                {
+                    //Format: C1+C3+C2
+                    memcpy(ciphertext, &C.point.x, 32);
+                    memcpy(ciphertext + 32, &C.point.y, 32);
+                    memcpy(ciphertext + 64, C.hash, 32);
+                    memcpy(ciphertext + 96, C.ciphertext, C.ciphertext_size);
+                    len = 96 + C.ciphertext_size;
+                }
+                else
+                {
+                    //Format: C1+C2+C3
+                    ciphertext[0] = 0x04;
+                    memcpy(ciphertext + 1, &C.point.x, 32);
+                    memcpy(ciphertext + 32 + 1, &C.point.y, 32);
+                    memcpy(ciphertext + 64 + 1, C.ciphertext, C.ciphertext_size);
+                    memcpy(ciphertext + 64 + C.ciphertext_size + 1, C.hash, 32);
+                    len = 96 + C.ciphertext_size + 1;
+                }
+            }
+        }
+        else
+        {
+            // GMSSL Default mode(Format: ASN.1 DER)
+            ret = sm2_encrypt(&pub_key, input_info.buf, input_info.len, ciphertext, &len);
+        }
+    
+           if (ret != 1)
         {   
             mp_raise_ValueError(MP_ERROR_TEXT("encrypt failed"));
         }
         vstr_init_len(&vstr, len);
         memcpy(vstr.buf, ciphertext, len);
+        
         return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
     }
     else
     {
-        if (sm2_decrypt(&sm2_self->sm2_key, input_info.buf, input_info.len, plaintext, &len) != 1)
+        if (def_comp_mode)
         {
-                    mp_raise_ValueError(MP_ERROR_TEXT("decrypt failed"));
+            // Compatibility mode
+            SM2_CIPHERTEXT C = {0};
+            if (data_fmt)
+            {
+                //Format: C1+C3+C2
+                C.ciphertext_size = (uint8_t)(input_info.len - 96);
+                memcpy(&C.point.x, input_info.buf, 32);
+                memcpy(&C.point.y, input_info.buf + 32, 32);
+                memcpy(C.hash, input_info.buf + 64, 32);
+                memcpy(C.ciphertext, input_info.buf + 96, C.ciphertext_size);
+            }
+            else
+            {
+                //Format: C1+C2+C3
+                input_info.buf ++;
+                input_info.len --;
+                C.ciphertext_size = (uint8_t)(input_info.len - 96);
+                memcpy(&C.point.x, input_info.buf, 32);
+                memcpy(&C.point.y, input_info.buf + 32, 32);
+                memcpy(C.ciphertext, input_info.buf + 64, C.ciphertext_size);
+                memcpy(C.hash, input_info.buf + 64 + C.ciphertext_size, 32);
+            }
+            ret = sm2_do_decrypt(&sm2_self->sm2_key, &C, (uint8_t *)plaintext, &len);
         }
-           plaintext[len] = 0;
+        else
+        {
+            // GMSSL Default mode(Format: ASN.1 DER)
+            ret = sm2_decrypt(&sm2_self->sm2_key, input_info.buf, input_info.len, plaintext, &len);
+        }
+        
+        if (ret != 1)
+        {
+             mp_raise_ValueError(MP_ERROR_TEXT("decrypt failed"));
+        }
+        plaintext[len] = 0;
         vstr_init_len(&vstr, len);
         memcpy(vstr.buf, plaintext, len);
+        
         return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
     }
 }
@@ -1115,14 +1283,14 @@ STATIC mp_obj_t ucryptolib_sm2_encrypt(size_t n_args, const mp_obj_t *args) {
     mp_obj_sm2_t *sm2_self = MP_OBJ_TO_PTR(args[0]);
     return sm2_crpty_pross(sm2_self, n_args, args, ENCRYPT);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_encrypt_obj, 1, 2,  ucryptolib_sm2_encrypt);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_encrypt_obj, 1, 4,  ucryptolib_sm2_encrypt);
 
 
 STATIC mp_obj_t ucryptolib_sm2_decrypt(size_t n_args, const mp_obj_t *args) {
     mp_obj_sm2_t *sm2_self = MP_OBJ_TO_PTR(args[0]);
     return sm2_crpty_pross(sm2_self, n_args, args, DECRYPT);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_decrypt_obj, 1, 2, ucryptolib_sm2_decrypt);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ucryptolib_sm2_decrypt_obj, 1, 4, ucryptolib_sm2_decrypt);
 
 STATIC const mp_rom_map_elem_t ucryptolib_sm2_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_genkey), MP_ROM_PTR(&ucryptolib_sm2_genkey_obj) },
@@ -1130,6 +1298,10 @@ STATIC const mp_rom_map_elem_t ucryptolib_sm2_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_decrypt), MP_ROM_PTR(&ucryptolib_sm2_decrypt_obj) },
     { MP_ROM_QSTR(MP_QSTR_sign), MP_ROM_PTR(&ucryptolib_sm2_sign_obj) },
     { MP_ROM_QSTR(MP_QSTR_verify), MP_ROM_PTR(&ucryptolib_sm2_verify_obj) },
+    { MP_ROM_QSTR(MP_QSTR_MODE_OMP), MP_ROM_INT(SM2_MODE_COMPATIBLE) },
+    { MP_ROM_QSTR(MP_QSTR_MODE_DEF), MP_ROM_INT(SM2_MODE_DEFAULT) },
+    { MP_ROM_QSTR(MP_QSTR_FMT_C1C3C2), MP_ROM_INT(SM2_FORMAT_C1C3C2) },
+    { MP_ROM_QSTR(MP_QSTR_FMT_C1C2C3), MP_ROM_INT(SM2_FORMAT_C1C2C3) },
 };  
 STATIC MP_DEFINE_CONST_DICT(ucryptolib_sm2_locals_dict, ucryptolib_sm2_locals_dict_table);
 
@@ -1151,9 +1323,8 @@ STATIC const mp_obj_type_t ucryptolib_sm2_type = {
 
 #define SM4_CBC 0
 #define SM4_ECB 1
-#define SM4_CTR 2
-#define SM4_GCM 3
-
+#define SM4_CTR UCRYPTOLIB_MODE_CTR
+#define SM4_GCM UCRYPTOLIB_MODE_GCM
 
 //#define QPY_SM4_LOG(msg, ...)      custom_log("SM4", msg, ##__VA_ARGS__)
 
@@ -1183,27 +1354,58 @@ STATIC mp_obj_t ucryptolib_sm4_make_new(const mp_obj_type_t *type, size_t n_args
     
     const mp_int_t arg_type = mp_obj_get_int(args[1]);
     sm4_self->sm4_type = arg_type;
+    if(sm4_self->sm4_type == UCRYPTOLIB_MODE_CBC)
+    {
+        sm4_self->sm4_type = SM4_CBC;
+    }
+    if(sm4_self->sm4_type != SM4_ECB && n_args != 3)
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid iv"));
+    }
 
-    if(sm4_self->sm4_type != SM4_ECB)
+    switch(sm4_self->sm4_type)
+    {
+        case SM4_ECB:
+        {
+            if(n_args == 3)
+            {
+                mp_printf(&mp_plat_print, "ECB not iv.\r\n");
+            }
+            break;
+        }
+        case SM4_CBC:
     {
         mp_get_buffer_raise(args[2], &ivinfo, MP_BUFFER_READ);
-        if(ivinfo.len != 16 && ivinfo.len != 12)
+            if(ivinfo.len != 16)
         {
             mp_raise_ValueError(MP_ERROR_TEXT("invalid iv"));
         }
-        if(ivinfo.len == 12 && sm4_self->sm4_type != SM4_GCM)
+            break;
+        }
+#if MICROPY_PY_UCRYPTOLIB_CTR
+        case SM4_CTR:
         {
-            mp_raise_ValueError(MP_ERROR_TEXT("invalid iv 2"));
+            mp_get_buffer_raise(args[2], &ivinfo, MP_BUFFER_READ);
+            if(ivinfo.len != 16)
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("invalid ctr"));
         }
-        memcpy(sm4_self->iv, ivinfo.buf, ivinfo.len);
-        sm4_self->ivlen = ivinfo.len;
+            break;
     }
-    else
+#endif
+#if MICROPY_PY_UCRYPTOLIB_GCM
+        case SM4_GCM:
     {
-        if(n_args == 3)
+            mp_get_buffer_raise(args[2], &ivinfo, MP_BUFFER_READ);
+            if(ivinfo.len != 16 && ivinfo.len != 12)
         {
-            mp_printf(&mp_plat_print, "iv is not used in ECB mode.\r\n");
+                mp_raise_ValueError(MP_ERROR_TEXT("invalid iv"));
+            }
+            break;
         }
+#endif
+        default:
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid mode"));
     }
     
     return MP_OBJ_FROM_PTR(sm4_self);
@@ -1302,6 +1504,7 @@ STATIC mp_obj_t sm4_process(mp_obj_sm4_t *sm4_self, size_t n_args, const mp_obj_
         break;
     }
     // CTR
+#if MICROPY_PY_UCRYPTOLIB_CTR
     case SM4_CTR:
     {
         vstr_init_len(&vstr, input_info.len);
@@ -1320,7 +1523,9 @@ STATIC mp_obj_t sm4_process(mp_obj_sm4_t *sm4_self, size_t n_args, const mp_obj_
         }
         break;
     }
+#endif
     // GCM
+#if MICROPY_PY_UCRYPTOLIB_GCM
     case SM4_GCM:
     { 
         unsigned char tag[16+1];
@@ -1385,6 +1590,7 @@ STATIC mp_obj_t sm4_process(mp_obj_sm4_t *sm4_self, size_t n_args, const mp_obj_
         }
         break;
     }
+#endif
     default:
         mp_raise_ValueError(MP_ERROR_TEXT("invalid mode"));
     }
@@ -1423,7 +1629,9 @@ STATIC const mp_obj_type_t ucryptolib_sm4_type = {
 
 STATIC const mp_rom_map_elem_t mp_module_ucryptolib_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ucryptolib) },
+#if !(defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS))
     { MP_ROM_QSTR(MP_QSTR_aes), MP_ROM_PTR(&ucryptolib_aes_type) },
+#endif
     #if MICROPY_PY_UCRYPTOLIB_DES
     { MP_ROM_QSTR(MP_QSTR_des), MP_ROM_PTR(&ucryptolib_des_type) },
     #endif
@@ -1446,6 +1654,12 @@ STATIC const mp_rom_map_elem_t mp_module_ucryptolib_globals_table[] = {
     #if MICROPY_PY_UCRYPTOLIB_SM4
     { MP_ROM_QSTR(MP_QSTR_sm4), MP_ROM_PTR(&ucryptolib_sm4_type) },
     #endif
+       #if MICROPY_PY_UCRYPTOLIB_ECDSA
+    { MP_ROM_QSTR(MP_QSTR_ecdsa), MP_ROM_PTR(&ucryptolib_ecdsa_type) },
+       #endif
+       #if MICROPY_PY_UCRYPTOLIB_ECDH
+       { MP_ROM_QSTR(MP_QSTR_ecdh), MP_ROM_PTR(&ucryptolib_ecdh_type) },
+       #endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(mp_module_ucryptolib_globals, mp_module_ucryptolib_globals_table);
@@ -1456,3 +1670,4 @@ const mp_obj_module_t mp_module_ucryptolib = {
 };
 
 #endif // MICROPY_PY_UCRYPTOLIB
+
index 104c324..76685d1 100644 (file)
@@ -242,6 +242,7 @@ STATIC const mp_obj_type_t uhashlib_sha1_type = {
     .locals_dict = (void *)&uhashlib_sha1_locals_dict,
 };
 
+#ifndef MICROPY_PY_UHASHLIB_ONLYSHA1
 int str2dec(const uint8_t *src, int srclen, uint8_t *dst)
 {
        int i = 0, j = 0;
@@ -377,6 +378,7 @@ STATIC mp_obj_t mp_hash_b64(mp_obj_t b64_data)
        return mp_obj_new_str(return_buff, strlen(return_buff));
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_hash_b64_obj, mp_hash_b64); 
+#endif
 
 
 #endif
@@ -475,10 +477,12 @@ STATIC const mp_rom_map_elem_t mp_module_uhashlib_globals_table[] = {
     #endif
     #if MICROPY_PY_UHASHLIB_SHA1
     { MP_ROM_QSTR(MP_QSTR_sha1), MP_ROM_PTR(&uhashlib_sha1_type) },
+    #ifndef MICROPY_PY_UHASHLIB_ONLYSHA1
     { MP_ROM_QSTR(MP_QSTR_hash_sha1), MP_ROM_PTR(&mp_hash_sha1_obj) },
        { MP_ROM_QSTR(MP_QSTR_aes_ecb), MP_ROM_PTR(&mp_hash_aes_ecb_obj) },
        { MP_ROM_QSTR(MP_QSTR_hash_base64), MP_ROM_PTR(&mp_hash_b64_obj) },
     #endif
+    #endif
     #if MICROPY_PY_UHASHLIB_MD5
     { MP_ROM_QSTR(MP_QSTR_md5), MP_ROM_PTR(&uhashlib_md5_type) },
     #endif
index c1c0cf8..7d1d2ac 100644 (file)
@@ -46,6 +46,7 @@
 #include "mbedtls/ctr_drbg.h"
 #include "mbedtls/debug.h"
 #include "mbedtls/error.h"
+#include "mbedtls/x509.h"
 #include "helios_debug.h"
 
 #define QPY_MPUSSL_LOG(msg, ...)      custom_log(Ussl, msg, ##__VA_ARGS__)
@@ -66,6 +67,7 @@ typedef struct _mp_obj_ssl_socket_t {
 } mp_obj_ssl_socket_t;
 
 struct ssl_args {
+    mp_arg_val_t ca;
     mp_arg_val_t key;
     mp_arg_val_t cert;
     mp_arg_val_t server_side;
@@ -157,6 +159,32 @@ STATIC int _mbedtls_ssl_recv(void *ctx, byte *buf, size_t len) {
     }
 }
 
+#define SSL_IGNORE_BADCERT_EXPIRED             0x01  /**< The certificate validity has expired. */
+#define SSL_IGNORE_BADCERT_REVOKED             0x02  /**< The certificate has been revoked (is on a CRL). */
+#define SSL_IGNORE_BADCERT_CN_MISMATCH         0x04  /**< The certificate Common Name (CN) does not match with the expected CN. */
+#define SSL_IGNORE_BADCERT_NOT_TRUSTED         0x08  /**< The certificate is not correctly signed by the trusted CA. */
+#define SSL_IGNORE_BADCRL_NOT_TRUSTED          0x10  /**< The CRL is not correctly signed by the trusted CA. */
+#define SSL_IGNORE_BADCRL_EXPIRED              0x20  /**< The CRL is expired. */
+#define SSL_IGNORE_BADCERT_MISSING             0x40  /**< Certificate was missing. */
+#define SSL_IGNORE_BADCERT_SKIP_VERIFY         0x80  /**< Certificate verification was skipped. */
+#define SSL_IGNORE_BADCERT_FUTURE            0x0200  /**< The certificate validity starts in the future. */
+
+static int my_verify( void *data, mbedtls_x509_crt *crt, int depth, uint32_t *flags )
+{
+    char buf[1024];
+    ((void) data);
+
+    mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, "", crt );
+
+    mp_printf(&mp_plat_print, "[mbedtls](*flags %d error) :\n", *flags);
+    if(*flags & (SSL_IGNORE_BADCERT_FUTURE))
+    {
+        *flags &= ~(SSL_IGNORE_BADCERT_FUTURE);
+        return( 0 );
+    }
+
+    return *flags;
+}
 
 STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
     // Verify the socket object has the full stream protocol
@@ -246,6 +274,48 @@ STATIC mp_obj_ssl_socket_t *socket_new(mp_obj_t sock, struct ssl_args *args) {
     }
 
     mbedtls_ssl_set_bio(o->ssl, &o->sock, _mbedtls_ssl_send, _mbedtls_ssl_recv, NULL);
+    
+    if (args->ca.u_obj != mp_const_none) {
+        size_t cert_len;
+        const byte *cert = (const byte *)mp_obj_str_get_data(args->ca.u_obj, &cert_len);
+        
+        ret = mbedtls_x509_crt_parse(o->cacert, cert, cert_len + 1);
+        if (ret != 0) {
+            ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA; // use general error for all cert errors
+            goto cleanup;
+        }
+
+        uint32_t flags;
+        char xcbuf[256];
+        memset( xcbuf, 0, 256);
+
+        ret = mbedtls_x509_crt_verify( o->cacert, o->cacert, NULL, NULL, &flags, NULL, NULL );
+        if( ret != 0 )
+        {
+            QPY_MPUSSL_LOG("flags: %0x\n", flags);
+            ret = mbedtls_x509_crt_verify_info(xcbuf, sizeof(xcbuf), "\n", flags);
+            //QPY_MPUSSL_LOG("xcbuf: %s\n", xcbuf);
+
+            if (flags == 0x200) 
+            {
+                QPY_MPUSSL_LOG("mbedtls_x509_crt_verify IGNORE\n");
+            }
+            else
+            {
+                mp_printf(&mp_plat_print, "[mbedtls](mbedtls_x509_crt_verify FAIL: %s) :\n", xcbuf);
+                ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; // use general error for all cert errors
+                goto cleanup;
+            }
+        }
+        else
+        {
+            QPY_MPUSSL_LOG("mbedtls_x509_crt_verify succeeded\n");
+        }
+
+        mbedtls_ssl_conf_ca_chain(o->conf, o->cacert, NULL);
+        mbedtls_ssl_conf_authmode(o->conf, MBEDTLS_SSL_VERIFY_REQUIRED);
+        mbedtls_ssl_conf_verify( o->conf, my_verify, NULL );
+    }
 
     if (args->key.u_obj != mp_const_none) {
         size_t key_len;
@@ -318,6 +388,8 @@ cleanup:
         mp_raise_ValueError(MP_ERROR_TEXT("invalid key"));
     } else if (ret == MBEDTLS_ERR_X509_BAD_INPUT_DATA) {
         mp_raise_ValueError(MP_ERROR_TEXT("invalid cert"));
+    } else if (ret == MBEDTLS_ERR_X509_FILE_IO_ERROR) {
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid ca"));
     } else {
         mbedtls_raise_error(ret);
     }
@@ -394,7 +466,7 @@ STATIC mp_obj_t socket_setblocking(mp_obj_t self_in, mp_obj_t flag_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_setblocking_obj, socket_setblocking);
 
-
+#if MICROPY_QPY_MODULE_USOCKET
 extern int lwip_getTcpState(int nSocket);
 extern int socket_obj_t_get_fd(mp_obj_t sock);
 STATIC mp_obj_t socket_getstate(const mp_obj_t self_in) 
@@ -404,7 +476,7 @@ STATIC mp_obj_t socket_getstate(const mp_obj_t self_in)
        return mp_obj_new_int(tcpstate);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_getstate_obj, socket_getstate);
-
+#endif
 
 STATIC mp_uint_t socket_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, int *errcode) {
     mp_obj_ssl_socket_t *self = MP_OBJ_TO_PTR(o_in);
@@ -463,7 +535,9 @@ STATIC const mp_rom_map_elem_t ussl_socket_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
     { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
     { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&mp_stream_close_obj) },
+       #if MICROPY_QPY_MODULE_USOCKET  
     { MP_ROM_QSTR(MP_QSTR_getsocketsta), MP_ROM_PTR(&socket_getstate_obj) },
+       #endif  
     #if MICROPY_PY_USSL_FINALISER
     { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
     #endif
@@ -496,6 +570,7 @@ bool mp_obj_is_ussl_socket(mp_obj_t o) {
 STATIC mp_obj_t mod_ssl_wrap_socket(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
     // TODO: Implement more args
     static const mp_arg_t allowed_args[] = {
+        { MP_QSTR_ca, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
         { MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
         { MP_QSTR_cert, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} },
         { MP_QSTR_server_side, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
index 6f0c7ac..a2ea4f2 100644 (file)
 
 #if MICROPY_PY_UWEBSOCKET
 
+#include "helios_debug.h"
+
+#define QPY_WS_LOG(msg, ...)      custom_log("websocket", msg, ##__VA_ARGS__)
+
 enum { FRAME_HEADER, FRAME_OPT, PAYLOAD, CONTROL };
 
 enum { BLOCKING_WRITE = 0x80 };
@@ -54,9 +58,11 @@ typedef struct _mp_obj_websocket_t {
     byte ws_flags;
     // Copy of current frame flags
     byte last_flags;
+       bool close_flag;
 } mp_obj_websocket_t;
 
 STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode);
+STATIC mp_uint_t websocket_write_raw(mp_obj_t self_in, const byte *header, int hdr_sz, const void *buf, mp_uint_t size, int *errcode);
 
 STATIC mp_obj_t websocket_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
     mp_arg_check_num(n_args, n_kw, 1, 2, false);
@@ -72,6 +78,7 @@ STATIC mp_obj_t websocket_make_new(const mp_obj_type_t *type, size_t n_args, siz
     if (n_args > 1 && args[1] == mp_const_true) {
         o->opts |= BLOCKING_WRITE;
     }
+       o->close_flag = true;
     return MP_OBJ_FROM_PTR(o);
 }
 
@@ -195,10 +202,28 @@ STATIC mp_uint_t websocket_read(mp_obj_t self_in, void *buf, mp_uint_t size, int
                     if (last_state == CONTROL) {
                         byte frame_type = self->last_flags & FRAME_OPCODE_MASK;
                         if (frame_type == FRAME_CLOSE) {
-                            static const char close_resp[2] = {0x88, 0};
-                            int err;
-                            websocket_write(self_in, close_resp, sizeof(close_resp), &err);
+                                                       if (self->close_flag == true) {
+                                                               self->close_flag = false;
+                                   static const byte close_resp[2] = {0x88, 0x80};
+                                                       
+                                   int err = 0;
+                                                               websocket_write_raw(self_in, (const byte *)close_resp, sizeof(close_resp), close_resp, 0, &err);
+                                                               if (err != 0) {
+                                                                       QPY_WS_LOG("send close frame fail, code:%d.\r\n", err);
+                                                                       self->close_flag = true;
+                                                               return MP_STREAM_ERROR;
+                                                           }
+                                                       }
                             return 0;
+                        } else if (frame_type == FRAME_PING) {
+                            // Handle ping frame by sending a pong response
+                            static const byte pong_resp[2] = {0x8A, 0x80};  // Pong frame: FIN=1, Opcode=0xA, no payload
+                            int err = 0;
+                            websocket_write_raw(self_in, (const byte *)pong_resp, sizeof(pong_resp), pong_resp, 0, &err);
+                                                       if (err != 0) {
+                                                       QPY_WS_LOG("send Pong frame fail, code:%d.\r\n", err);
+                                                   }
+                            continue;
                         }
 
                         // DEBUG_printf("Finished receiving ctrl message %x, ignoring\n", self->last_flags);
@@ -217,52 +242,110 @@ STATIC mp_uint_t websocket_read(mp_obj_t self_in, void *buf, mp_uint_t size, int
     }
 }
 
+extern uint32_t qpy_rng_get(void);
 STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) {
     mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
     assert(size < 0x10000);
     byte header[4] = {0x80 | (self->opts & FRAME_OPCODE_MASK)};
+
     int hdr_sz;
     if (size < 126) {
-        header[1] = size;
+        //header[1] = size;
+               header[1] = size | 0x80;  //use mask
         hdr_sz = 2;
     } else {
-        header[1] = 126;
+        //header[1] = 126;
+        header[1] = 0xfe;  // use mask
         header[2] = size >> 8;
         header[3] = size & 0xff;
         hdr_sz = 4;
     }
+       return websocket_write_raw(self_in, header, hdr_sz, buf, size, errcode);
+}
 
+STATIC mp_uint_t websocket_write_raw(mp_obj_t self_in, const byte *header, int hdr_sz, const void *buf, mp_uint_t size, int *errcode) {
+    mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
     mp_obj_t dest[3];
+       byte mask[4];
+       int mask_sz = 4;
+       byte header_mask[hdr_sz + 4];
+       mp_uint_t out_sz = 0;
+       
     if (self->opts & BLOCKING_WRITE) {
         mp_load_method(self->sock, MP_QSTR_setblocking, dest);
         dest[2] = mp_const_true;
         mp_call_method_n_kw(1, 0, dest);
     }
+    
+       // Mask is 4 bytes
+       uint32_t random_value = qpy_rng_get();
+       for (int i = 0; i < mask_sz; i++) {
+               mask[i] = (random_value >> (i*8)) & 0xff;
+       }
+       
+       memcpy(header_mask, header, hdr_sz);
+    memcpy(header_mask + hdr_sz, mask, mask_sz);
+       
+       out_sz = mp_stream_write_exactly(self->sock, header_mask, hdr_sz + mask_sz, errcode);
+       if (*errcode != 0) {
+               out_sz = MP_STREAM_ERROR;
+               goto cleanup;
+       }
+
+       if (size > 0) {
+               byte masked_data[size];
+               for (mp_uint_t i = 0; i < size; i++) {
+                       masked_data[i] = ((byte*)buf)[i] ^ mask[i % 4];
+               }
+           out_sz = mp_stream_write_exactly(self->sock, masked_data, size, errcode);
+               if (*errcode != 0) {
+            out_sz = MP_STREAM_ERROR;
+        }
+       }
 
-    mp_uint_t out_sz = mp_stream_write_exactly(self->sock, header, hdr_sz, errcode);
-    if (*errcode == 0) {
-        out_sz = mp_stream_write_exactly(self->sock, buf, size, errcode);
-    }
+cleanup:
 
-    if (self->opts & BLOCKING_WRITE) {
+       if (self->opts & BLOCKING_WRITE) {
         dest[2] = mp_const_false;
         mp_call_method_n_kw(1, 0, dest);
     }
 
-    if (*errcode != 0) {
-        return MP_STREAM_ERROR;
-    }
     return out_sz;
 }
 
 STATIC mp_uint_t websocket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) {
     mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
     switch (request) {
-        case MP_STREAM_CLOSE:
+        case MP_STREAM_CLOSE: {
             // TODO: Send close signaling to the other side, otherwise it's
             // abrupt close (connection abort).
+            if (self->close_flag == true) {
+                               self->close_flag = false;
+                               
+                       static const byte close_resp[2] = {0x88, 0x82};  // close frame header
+                               static const byte close_data[2] = {0x03, 0xe8};  // normal shutdown
+
+                               int err = 0;
+                               websocket_write_raw(self_in, (const byte *)close_resp, sizeof(close_resp), close_data, sizeof(close_data), &err);
+                               if (err != 0) {
+                                       self->close_flag = true;
+                                       *errcode = err;
+                                       QPY_WS_LOG("send close frame fail, code:%d.\r\n", err);
+                               return MP_STREAM_ERROR;
+                           }
+
+                               byte buf[2] = {0};
+                               websocket_read(self_in, buf, sizeof(buf), &err);
+                               if(err != 0 || buf[0] != 0x03 || buf[1] != 0xe8) {
+                                       self->close_flag = true;
+                    *errcode = MP_STREAM_ERROR;
+                                       QPY_WS_LOG("recv close frame fail, code:%d.\r\n", err);
+                    return MP_STREAM_ERROR;
+                               }
+            }
             mp_stream_close(self->sock);
             return 0;
+        }
         case MP_STREAM_GET_DATA_OPTS:
             return self->ws_flags & FRAME_OPCODE_MASK;
         case MP_STREAM_SET_DATA_OPTS: {
@@ -276,8 +359,40 @@ STATIC mp_uint_t websocket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t
     }
 }
 
+STATIC mp_obj_t websocket_read_v2(mp_obj_t self_in, mp_obj_t size_obj) {
+    mp_obj_websocket_t *self = MP_OBJ_TO_PTR(self_in);
+
+       int errcode = 0;
+       size_t size = mp_obj_get_int(size_obj);
+       
+       vstr_t vstr;
+    vstr_init_len(&vstr, size);
+       
+       mp_uint_t out_sz = websocket_read(self, vstr.buf, size, &errcode);
+
+       if (out_sz == 0) {
+        return mp_const_none; // 没有数据可读
+    }
+
+    if (out_sz == MP_STREAM_ERROR ) {
+               QPY_WS_LOG("read out_sz fail, code:%d, out_sz: %d.\r\n", errcode, out_sz);
+        mp_raise_OSError(errcode); // 读取错误(包括Timeout)
+    }
+
+       byte frame_type = self->last_flags & FRAME_OPCODE_MASK;
+    if (!(frame_type == FRAME_TXT || frame_type == FRAME_BIN)){
+               QPY_WS_LOG("read frame_type fail, code:%d, frame_type: %02x, out_sz: %d.\r\n", errcode, frame_type, out_sz);
+        mp_raise_OSError(MP_EIO); // 无效帧类型
+    }
+
+       vstr.len = out_sz;
+       return mp_obj_new_str_from_vstr(WS_CONTENT_TYPE(frame_type), &vstr);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(websocket_read_v2_obj, websocket_read_v2);
+
 STATIC const mp_rom_map_elem_t websocket_locals_dict_table[] = {
-    { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
+    //{ MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
+    { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&websocket_read_v2_obj) },
     { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
     { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
@@ -287,7 +402,7 @@ STATIC const mp_rom_map_elem_t websocket_locals_dict_table[] = {
 STATIC MP_DEFINE_CONST_DICT(websocket_locals_dict, websocket_locals_dict_table);
 
 STATIC const mp_stream_p_t websocket_stream_p = {
-    .read = websocket_read,
+    //.read = websocket_read,
     .write = websocket_write,
     .ioctl = websocket_ioctl,
 };
@@ -305,11 +420,11 @@ STATIC const mp_rom_map_elem_t uwebsocket_module_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_websocket), MP_ROM_PTR(&websocket_type) },
 };
 
-STATIC MP_DEFINE_CONST_DICT(uwebsocket_module_globals, uwebsocket_module_globals_table);
+STATIC MP_DEFINE_CONST_DICT(websocket_module_globals, uwebsocket_module_globals_table);
 
-const mp_obj_module_t mp_module_uwebsocket = {
+const mp_obj_module_t mp_module_websocket = {
     .base = { &mp_type_module },
-    .globals = (mp_obj_dict_t *)&uwebsocket_module_globals,
+    .globals = (mp_obj_dict_t *)&websocket_module_globals,
 };
 
 #endif // MICROPY_PY_UWEBSOCKET
index c1ea291..bc1649e 100644 (file)
@@ -7,4 +7,6 @@ enum {
     FRAME_CLOSE = 0x8, FRAME_PING, FRAME_PONG
 };
 
+#define WS_CONTENT_TYPE(frame_type) ((frame_type == FRAME_TXT) ? &mp_type_str : &mp_type_bytes)
+
 #endif // MICROPY_INCLUDED_EXTMOD_MODUWEBSOCKET_H
index 0d8809b..0f0e6b0 100644 (file)
@@ -55,6 +55,10 @@ typedef struct _mp_obj_decompio_t {
     bool eof;
 } mp_obj_decompio_t;
 
+#if defined(PLAT_RDA)
+#pragma GCC push_options
+#pragma GCC optimize ("O0")
+#endif
 STATIC int read_src_stream(TINF_DATA *data) {
     byte *p = (void *)data;
     p -= offsetof(mp_obj_decompio_t, decomp);
@@ -72,6 +76,9 @@ STATIC int read_src_stream(TINF_DATA *data) {
     }
     return c;
 }
+#if defined(PLAT_RDA)
+#pragma GCC pop_options
+#endif
 
 STATIC mp_obj_t decompio_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
 #if UZLIB_USE_INTERNAL_RAM
index 9e1f6de..872642a 100644 (file)
@@ -82,8 +82,9 @@ MP_DEFINE_CONST_FUN_OBJ_0(mp_utime_ticks_cpu_obj, time_ticks_cpu);
 
 STATIC mp_obj_t time_ticks_diff(mp_obj_t end_in, mp_obj_t start_in) {
     // we assume that the arguments come from ticks_xx so are small ints
-    mp_uint_t start = MP_OBJ_SMALL_INT_VALUE(start_in);
-    mp_uint_t end = MP_OBJ_SMALL_INT_VALUE(end_in);
+    mp_uint_t start = mp_obj_get_int_truncated(start_in);
+    mp_uint_t end = mp_obj_get_int_truncated(end_in);
+    //mp_obj_get_int_truncated
     // Optimized formula avoiding if conditions. We adjust difference "forward",
     // wrap it around and adjust back.
     mp_int_t diff = ((end - start + MICROPY_PY_UTIME_TICKS_PERIOD / 2) & (MICROPY_PY_UTIME_TICKS_PERIOD - 1))
index e5d319f..2eb6554 100644 (file)
@@ -112,8 +112,8 @@ mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) {
     *path_out = path;
     return MP_STATE_VM(vfs_cur);
 }
-//#include "debug.h"
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 void get_vfs_path(const char* base_path, char* dsc_path) {
     char *p_out = NULL;
     if(0 == strncmp(base_path, "mp3files=", 9) || 0 == strncmp(base_path, "amrfiles=", 9)) {
@@ -132,6 +132,9 @@ void get_vfs_path(const char* base_path, char* dsc_path) {
             sprintf(dsc_path, "%s", base_path);
         }
     }
+    else if (strncmp(base_path, "sd/", 3) == 0 || strncmp(base_path, "/sd/", 4) == 0){
+         sprintf(dsc_path, "SD:%s", base_path + 3);
+    }
     else if(NULL == strstr(base_path,":") ) {
         mp_vfs_mount_t *vfs = mp_vfs_lookup_path(base_path, (const char **)&p_out);
                if (vfs != MP_VFS_NONE && vfs != MP_VFS_ROOT)
@@ -142,7 +145,6 @@ void get_vfs_path(const char* base_path, char* dsc_path) {
             {
                 sprintf(dsc_path, "%s%s", letter, p_out);
             }else {
-                assert(0);
                 mp_vfs_log("letter is NULL\n");
                 return;
             }
@@ -166,6 +168,7 @@ void get_vfs_path(const char* base_path, char* dsc_path) {
 }
 #endif
 
+
 // Version of mp_vfs_lookup_path that takes and returns uPy string objects.
 STATIC mp_vfs_mount_t *lookup_path(mp_obj_t path_in, mp_obj_t *path_out) {
     const char *path = mp_obj_str_get_str(path_in);
@@ -178,6 +181,7 @@ STATIC mp_vfs_mount_t *lookup_path(mp_obj_t path_in, mp_obj_t *path_out) {
     return vfs;
 }
 
+
 STATIC mp_obj_t mp_vfs_proxy_call(mp_vfs_mount_t *vfs, qstr meth_name, size_t n_args, const mp_obj_t *args) {
     assert(n_args <= PROXY_MAX_ARGS);
     if (vfs == MP_VFS_NONE) {
@@ -268,7 +272,8 @@ STATIC mp_obj_t mp_vfs_autodetect(mp_obj_t bdev_obj) {
     return bdev_obj;
 }
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718) \
+    || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #if MICROPY_VFS_LFS1
 #include "lib/littlefs/lfs1.h"
 typedef struct lfs1_flash_info
@@ -352,7 +357,8 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
     vfs->str = mnt_str;
     vfs->len = mnt_len;
     vfs->obj = vfs_obj;
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718) \
+    || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        MP_OBJ_VFS_LFSx *self = (MP_OBJ_VFS_LFSx *)vfs_obj;
     mp_vfs_log("------partition_name [%s]\n",self->partition_name);
 #endif 
@@ -398,10 +404,11 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
     }
     *vfsp = vfs;
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718) \
+    || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                if(self->partition_name != NULL) 
                {
-               #if defined(PLAT_EIGEN) || defined(PLAT_ASR_1803s)
+               #if defined(PLAT_EIGEN) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN_718)
                        char *letter = NULL;
                        if(strcmp(self->partition_name, "customer_fs") == 0){
                                letter = "U:";
@@ -437,7 +444,8 @@ mp_obj_t mp_vfs_umount(mp_obj_t mnt_in) {
     }
 
        mp_vfs_log("umont:%s\n", mnt_str);
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        int ret = Helios_lfs_unregister_map(mnt_str);
        mp_vfs_log("unregister[%s]map, result[%d]\n", mnt_str, ret);    
 
@@ -648,7 +656,7 @@ mp_obj_t mp_vfs_mkdir(mp_obj_t path_in) {
     if (vfs == MP_VFS_ROOT || (vfs != MP_VFS_NONE && !strcmp(mp_obj_str_get_str(path_out), "/"))) {
         mp_raise_OSError(MP_EEXIST);
     }
-       
+    
        //Kenney.wang 20201228 vfs readonly 
        if((vfs != MP_VFS_NONE && vfs != MP_VFS_ROOT) && vfs->readonly == MP_VFS_READONIY_ENABLE && vfs_readonly_mode)
        {
index f1db113..fc4bb90 100644 (file)
@@ -213,6 +213,43 @@ STATIC mp_obj_t vfs_efs_make_new(const mp_obj_type_t *type, size_t n_args, size_
     vfs->base.type = type;
        vstr_init(&vfs->cur_dir, 16);
     vstr_add_byte(&vfs->cur_dir, '/');
+
+    /************************************************
+     * Qualcomm QPY usb config & https file restore *
+     ************************************************/
+    #define USB_CUSTOMER_CONFIG_FILE "/QPYusbconfig"
+
+    HeliosFILE* usbcfg_file = Helios_fopen(USB_CUSTOMER_CONFIG_FILE, "r");
+    if(usbcfg_file == NULL)
+    {
+        usbcfg_file = Helios_fopen(USB_CUSTOMER_CONFIG_FILE, "w");
+        char qpy_usbcfg = 0x59;
+        Helios_fwrite(&qpy_usbcfg, sizeof(char), 1, usbcfg_file);
+        Helios_fclose(usbcfg_file);
+    }
+    else
+    {
+        Helios_fclose(usbcfg_file);
+    }
+
+#if defined(BOARD_BG95M8) || defined(BOARD_BG95M9)
+    #define HTTPS_CUSTOMER_CONFIG_FILE "/config_disable_cert_check"
+    HeliosFILE* https_cfg_file = Helios_fopen(HTTPS_CUSTOMER_CONFIG_FILE, "r");
+    if(https_cfg_file == NULL)
+    {
+        https_cfg_file = Helios_fopen(HTTPS_CUSTOMER_CONFIG_FILE, "w");
+        char qpy_https_cfg = 0x31;
+        Helios_fwrite(&qpy_https_cfg, sizeof(char), 1, https_cfg_file);
+        Helios_fclose(https_cfg_file);
+    }
+    else
+    {
+        Helios_fclose(https_cfg_file);
+    }    
+#endif    
+    /****************************************************
+     * Qualcomm QPY usb config & https file restore end *
+     ****************************************************/
        
        if(strcmp(partition_name, "customer_fs") == 0)
        {
index 8fe341a..332d3be 100644 (file)
 /************Quecpython MICRO to control VFS_LFS threadsafe*************/
 //Mark.Zhu@20230405 add for vfs_lfs threadsafe, use mutexlock to keep the uniqueness of fs operation in asynchronous scene
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE
+
+//Mark.Zhu@20240227 add for distinguish the way to get mutex.
+//ASR(R06):get mutex from kernal
+//ASR(R07):creat mutex in app
+//UNISOC:creat mutex in app
+#if defined(QUECTEL_PY_LFS1)
+    #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+        #define QPY_VFS_THREADSAFE_MUTEX_APP
+    #else
+        #define QPY_VFS_THREADSAFE_MUTEX_KERNAL
+    #endif
+#elif defined(QUECTEL_PY_LFS2)
+    #define QPY_VFS_THREADSAFE_MUTEX_APP
+#endif
+
 #define HELIOS_VFS_LFS_MUTEX_LOCK(vfs_obj)                          \
 do{                                                                 \
     if(mp_is_python_thread()) MP_THREAD_GIL_EXIT();                 \
index 2750bf8..b0fe6a0 100644 (file)
@@ -37,7 +37,7 @@
 #include "extmod/vfs.h"
 #include "lib/timeutils/timeutils.h"
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #include "hal_config.h"
 #endif
 #include "helios_debug.h"
@@ -132,7 +132,7 @@ STATIC void MP_VFS_LFSx(init_config)(MP_OBJ_VFS_LFSx * self, mp_obj_t bdev, size
     config->erase = MP_VFS_LFSx(dev_erase);
     config->sync = MP_VFS_LFSx(dev_sync);
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE
-#if defined (QUECTEL_PY_LFS1)
+#ifdef QPY_VFS_THREADSAFE_MUTEX_KERNAL
     QUEC_QPY_LFS_LOG("lfs get mutex with %s\r\n", self->partition_name);
     self->vfs_lfs_mutex = (Helios_Mutex_t)Helios_lfs_mutexlock_get(self->partition_name);
 #else
@@ -147,7 +147,7 @@ STATIC void MP_VFS_LFSx(init_config)(MP_OBJ_VFS_LFSx * self, mp_obj_t bdev, size
 
     HeliosFlashPartiCtx *FlashPartiCtx = Helios_Flash_GetPartiCtx((const char*)self->partition_name);
     if(!FlashPartiCtx) mp_raise_OSError(19);
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     self->lfs = (LFSx_API(t) *)(FlashPartiCtx->lfs_kernel);//forrest.liu@20220309 add for ASR1601 platform pythonSDK use same lfs handle as kernel
     if (self->lfs == NULL)
     {
@@ -182,7 +182,7 @@ STATIC void MP_VFS_LFSx(init_config)(MP_OBJ_VFS_LFSx * self, mp_obj_t bdev, size
        config->block_count = bc;
 #endif
 
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)
+#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     #if LFS_BUILD_VERSION == 1
 #ifdef QUECTEL_PY_LFS1
        config->lookahead = 32 * ((config->block_count + 31) / 32);
@@ -231,7 +231,7 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
 
     MP_OBJ_VFS_LFSx *self = m_new0(MP_OBJ_VFS_LFSx, 1);
     self->base.type = type;
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)
+#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 #ifdef QUECTEL_PY_LFS1
        self->lfs = m_new0(lfs1_t, 1);
 #elif defined QUECTEL_PY_LFS2
@@ -246,7 +246,7 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
 #endif
 
 #if defined (QUECTEL_PY_LFS1) || defined (QUECTEL_PY_LFS2)
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_aic8800m40)
        if(strcmp(src_data, "ext_fs") == 0) {
                //QUEC_QPY_LFS_LOG("ext fs spi port[%d], clk[%d]\n", args[LFS_MAKE_ARG_spi_port].u_int, args[LFS_MAKE_ARG_spi_clk].u_int);
                if(0 != Helios_EXTFS_Init(args[LFS_MAKE_ARG_spi_port].u_int, args[LFS_MAKE_ARG_spi_clk].u_int)) {
@@ -268,7 +268,7 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
     #endif
 
 #if defined (QUECTEL_PY_LFS1) || defined (QUECTEL_PY_LFS2)
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(BOARD_BG95M6) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     if((strcmp(src_data, "ext_fs") == 0) && (n_args == 6))
     {
         Helios_set_nor_flash_spi(args[LFS_MAKE_ARG_spi_port].u_int,args[LFS_MAKE_ARG_spi_clk].u_int);
@@ -281,25 +281,22 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
     MP_VFS_LFSx(init_config)(self, args[LFS_MAKE_ARG_bdev].u_obj,
         args[LFS_MAKE_ARG_readsize].u_int, args[LFS_MAKE_ARG_progsize].u_int, args[LFS_MAKE_ARG_lookahead].u_int);
 #endif
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)//forrest.liu@20220309 modify for ASR1601 platform pythonSDK use same lfs handle as kernel
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))//forrest.liu@20220309 modify for ASR1601 platform pythonSDK use same lfs handle as kernel
     int ret = LFSx_API(mount)(self->lfs, &self->config);
     QUEC_QPY_LFS_LOG("mount:%d \r\n", ret);
-       #if !defined(PLAT_Qualcomm)     
+       #if !defined(PLAT_Qualcomm) || defined(BOARD_BG95M6)
     if(ret < 0) {
        QUEC_QPY_LFS_LOG("mount fail! start format...ret = %d", ret);
                ret = LFSx_API(format)(self->lfs, &self->config);
                if(ret < 0)
                {
                        QUEC_QPY_LFS_LOG("format fail! ret = %d", ret);
-
-#if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
-#if !defined (QUECTEL_PY_LFS1)
+#if defined(QPY_VFS_THREADSAFE_MUTEX_APP)//Mark.Zhu@20230405 add for vfs_lfs threadsafe
             if(self->vfs_lfs_mutex)
             {
                 Helios_Mutex_Delete(self->vfs_lfs_mutex);
             }
-#endif            
-#endif           
+#endif       
                        mp_raise_OSError(-ret);
                }
                ret = LFSx_API(mount)(self->lfs, &self->config);
@@ -307,21 +304,18 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
        #endif
     if (ret < 0) {
                QUEC_QPY_LFS_LOG("mount again fail! ret = %d", ret);
-
-#if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
-#if !defined (QUECTEL_PY_LFS1)
+#if defined(QPY_VFS_THREADSAFE_MUTEX_APP)//Mark.Zhu@20230405 add for vfs_lfs threadsafe
         if(self->vfs_lfs_mutex)
         {
             Helios_Mutex_Delete(self->vfs_lfs_mutex);
         }
-#endif        
-#endif              
+#endif                  
         mp_raise_OSError(-ret);
     }
 #endif
 
        //forrest.liu@20210609 add for lfs use in kernel
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #if defined(QUECTEL_PY_LFS1)
        if(strcmp(src_data, "customer_fs") == 0)
        {
@@ -329,8 +323,12 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
                lfs1_ops.block_info.block_size = self->config.block_size;
                lfs1_ops.block_info.block_count = self->config.block_count;
                Helios_lfs_register(&lfs1_ops);
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+    #if MICROPY_QPY_MODULE_VFS_THREADSAFE
+        Helios_lfs_mount_threadsafe("/usr", &lfs1_ops, src_data, (void*)self->vfs_lfs_mutex);
+    #else
                Helios_lfs_mount("/usr",  &lfs1_ops, src_data);
+    #endif    
 #else
                Helios_lfs_mount("/usr",  &lfs1_ops);
 #endif
@@ -341,8 +339,12 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
                lfs1_ops.block_info.block_size = self->config.block_size;
                lfs1_ops.block_info.block_count = self->config.block_count;
                Helios_lfs_register(&lfs1_ops);
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+    #if MICROPY_QPY_MODULE_VFS_THREADSAFE
+        Helios_lfs_mount_threadsafe("/bak", &lfs1_ops, src_data, (void*)self->vfs_lfs_mutex);
+    #else    
         Helios_lfs_mount("/bak", &lfs1_ops, src_data);
+    #endif    
 #else
                Helios_lfs_mount("/bak", &lfs1_ops);
 #endif
@@ -353,8 +355,12 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
                lfs1_ops.block_info.block_size = self->config.block_size;
                lfs1_ops.block_info.block_count = self->config.block_count;
                Helios_lfs_register(&lfs1_ops);
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+    #if MICROPY_QPY_MODULE_VFS_THREADSAFE
+        Helios_lfs_mount_threadsafe("/pyext", &lfs1_ops, src_data, (void*)self->vfs_lfs_mutex);
+    #else
         Helios_lfs_mount("/pyext", &lfs1_ops, src_data);
+    #endif    
 #else
                Helios_lfs_mount("/pyext", &lfs1_ops);
 #endif
@@ -362,7 +368,7 @@ STATIC mp_obj_t MP_VFS_LFSx(make_new)(const mp_obj_type_t * type, size_t n_args,
 #endif
 #endif
 
-#if CONFIG_AUDIO
+#if CONFIG_AUDIO || CONFIG_AUD_RECORD
        extern void Helios_Aud_MP_FS_Reg();
        Helios_Aud_MP_FS_Reg();
 #endif
@@ -374,7 +380,7 @@ STATIC mp_obj_t MP_VFS_LFSx(mkfs)(size_t n_args, const mp_obj_t *pos_args, mp_ma
     mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(lfs_make_allowed_args), lfs_make_allowed_args, args);
 
     MP_OBJ_VFS_LFSx self;
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))
 #if defined QUECTEL_PY_LFS1
        self.lfs = m_new0(lfs1_t, 1);
 #elif defined QUECTEL_PY_LFS2
@@ -388,17 +394,15 @@ STATIC mp_obj_t MP_VFS_LFSx(mkfs)(size_t n_args, const mp_obj_t *pos_args, mp_ma
     MP_VFS_LFSx(init_config)(&self, args[LFS_MAKE_ARG_bdev].u_obj,
         args[LFS_MAKE_ARG_readsize].u_int, args[LFS_MAKE_ARG_progsize].u_int, args[LFS_MAKE_ARG_lookahead].u_int);
 #endif
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)//forrest.liu@20220309 modify for ASR1601 platform pythonSDK use same lfs handle as kernel
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))//forrest.liu@20220309 modify for ASR1601 platform pythonSDK use same lfs handle as kernel
     int ret = LFSx_API(format)(self.lfs, &self.config);
     if (ret < 0) {
-#if MICROPY_QPY_MODULE_VFS_THREADSAFE//Mark.Zhu@20230405 add for vfs_lfs threadsafe
-#if !defined (QUECTEL_PY_LFS1)
-        if(self->vfs_lfs_mutex)
+#if defined(QPY_VFS_THREADSAFE_MUTEX_APP)//Mark.Zhu@20230405 add for vfs_lfs threadsafe
+        if(self.vfs_lfs_mutex)
         {
-            Helios_Mutex_Delete(self->vfs_lfs_mutex);
+            Helios_Mutex_Delete(self.vfs_lfs_mutex);
         }
-#endif        
-#endif          
+#endif
         mp_raise_OSError(-ret);
     }
 #endif 
@@ -728,7 +732,7 @@ STATIC mp_obj_t MP_VFS_LFSx(mount)(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t
 #if defined (QUECTEL_PY_LFS1) || defined (QUECTEL_PY_LFS2)
     (void)readonly;
 
-       #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)//forrest.liu@20230417 add for Unisoc platform ext_fs format function
+       #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)//forrest.liu@20230417 add for Unisoc platform ext_fs format function
        MP_OBJ_VFS_LFSx *self = MP_OBJ_TO_PTR(self_in);
        
        if ((strcmp(self->partition_name, "ext_fs") == 0) && mp_obj_is_true(mkfs)) 
@@ -743,7 +747,8 @@ STATIC mp_obj_t MP_VFS_LFSx(mount)(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t
             mp_raise_ValueError("format fail");
         }
     }
-    #elif defined(BOARD_EC600MCN_CC_EXT)
+    #elif (defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+        || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
     MP_OBJ_VFS_LFSx *self = MP_OBJ_TO_PTR(self_in);
 
     if (mp_obj_is_true(mkfs)) 
@@ -769,7 +774,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(MP_VFS_LFSx(mount_obj), MP_VFS_LFSx(mount));
 STATIC mp_obj_t MP_VFS_LFSx(umount)(mp_obj_t self_in) {
     MP_OBJ_VFS_LFSx *self = MP_OBJ_TO_PTR(self_in);
     // LFS unmount never fails
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606)
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))
     HELIOS_VFS_LFS_MUTEX_LOCK(self);
     LFSx_API(unmount)(self->lfs);
     HELIOS_VFS_LFS_MUTEX_UNLOCK(self);
@@ -781,7 +786,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(MP_VFS_LFSx(umount_obj), MP_VFS_LFSx(umount));
 #if MICROPY_QPY_MODULE_VFS_THREADSAFE
 STATIC mp_obj_t MP_VFS_LFSx(delete)(mp_obj_t self_in) {
     MP_OBJ_VFS_LFSx *self = MP_OBJ_TO_PTR(self_in);
-#if !defined (QUECTEL_PY_LFS1)
+#if defined(QPY_VFS_THREADSAFE_MUTEX_APP)
     if(self->vfs_lfs_mutex)
     {
         Helios_Mutex_Delete(self->vfs_lfs_mutex);
index c158119..58cdc3c 100644 (file)
@@ -35,7 +35,7 @@
 #include "extmod/vfs.h"
 #include "helios_os.h"
 
-#if CONFIG_AUDIO || (CONFIG_LCD && defined(PLAT_ASR_1803s))
+#if CONFIG_AUDIO || (CONFIG_LCD && (defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc))) || CONFIG_AUD_RECORD
 //#if 1//defined(PLAT_EIGEN)
 //#include "helios_audio_fs.h"
 //#endif
@@ -348,7 +348,7 @@ const mp_obj_type_t MP_TYPE_VFS_LFSx_(_textio) = {
     .locals_dict = (mp_obj_dict_t *)&MP_VFS_LFSx(file_locals_dict),
 };
 
-#if CONFIG_AUDIO || (CONFIG_LCD && defined(PLAT_ASR_1803s))
+#if CONFIG_AUDIO || (CONFIG_LCD && (defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc))) || CONFIG_AUD_RECORD
 
 typedef void HeliosMPFILE;
 
@@ -487,7 +487,7 @@ HeliosMPFILE* Helios_MP_fopen(const char* path_in, const char* mode_in)
     }
 
 //TODO 
-#if !defined(PLAT_Unisoc_8850) && !defined(PLAT_ASR_1803s)
+#if !defined(PLAT_Unisoc_8850) && !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc) && !defined(PLAT_Unisoc_8850_R02)
        //mp_vfs_log("flags[%x] malloc[%d]\n",flags, sizeof(MP_OBJ_VFS_LFSx_FILE) + sizeof(uint8_t) * (self->lfs->cfg->cache_size));
        MP_OBJ_VFS_LFSx_FILE *o = calloc(1, sizeof(MP_OBJ_VFS_LFSx_FILE) + sizeof(uint8_t) * (self->lfs->cfg->cache_size));
 #else
@@ -632,11 +632,6 @@ int Helios_MP_ftell(HeliosMPFILE *file)
 {
        MP_OBJ_VFS_LFSx_FILE *self = (MP_OBJ_VFS_LFSx_FILE*)file;
     MP_VFS_LFSx(check_open)(self);
-//#if LFS_BUILD_VERSION == 2
-//    if (self->vfs->enable_mtime) {
-//        lfs_get_mtime(&self->mtime[0]);
-//    }
-//#endif
     HELIOS_VFS_LFS_MUTEX_LOCK(self->vfs);
     int res = LFSx_API(file_tell)(self->vfs->lfs, &self->file);
     HELIOS_VFS_LFS_MUTEX_UNLOCK(self->vfs);
@@ -657,18 +652,22 @@ void Helios_Aud_MP_FS_Reg()
 
        if(1 == audio_fs_is_no_reg) {
                drv_p.letter = 'U';
+
+#if defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8850)
+               drv_p.open_cb = Helios_fopen;
+               drv_p.close_cb = Helios_fclose;
+               drv_p.read_cb = Helios_fread;
+               drv_p.write_cb = Helios_fwrite;
+               drv_p.seek_cb = Helios_fseek;
+        drv_p.tell_cb = Helios_ftell;
+#else
                drv_p.open_cb = Helios_MP_fopen;
                drv_p.close_cb = Helios_MP_fclose;
                drv_p.read_cb = Helios_MP_fread;
                drv_p.write_cb = Helios_MP_fwrite;
                drv_p.seek_cb = Helios_MP_fseek;
-//             drv_p.open_cb = Helios_fopen;
-//             drv_p.close_cb = Helios_fclose;
-//             drv_p.read_cb = Helios_fread;
-//             drv_p.write_cb = Helios_fwrite;
-//             drv_p.seek_cb = Helios_fseek;
-//
-               drv_p.tell_cb = Helios_MP_ftell;
+        drv_p.tell_cb = Helios_MP_ftell;
+#endif 
                
                Helios_Aud_fs_drv_register(&drv_p);
                audio_fs_is_no_reg = 0;
index b3aee2e..23802c9 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
  
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || (defined(PLAT_Unisoc_8850_R02) && !defined(BOARD_EC800GCN_LD_XBND))
 
 #include "py/runtime.h"
 #include "py/mperrno.h"
@@ -119,17 +119,23 @@ STATIC mp_obj_t vfs_temp_make_new(const mp_obj_type_t *type, size_t n_args, size
                Helios_fmkdir("UFS:/qpytemp", 0777);
        }
     else if(strcmp(partition_name, "sd_fs") == 0)
-    {        
+    {
+#if    defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_TT) || defined(BOARD_EG800GLA_LD)
+               mp_raise_ValueError("Not support.");
+#else
         uint8_t ret =0;
         ret=Helios_sd_mount();
         if(ret!=0)
         {
             mp_raise_ValueError("mount fail");
         }
+#endif
     }
        
     return MP_OBJ_FROM_PTR(vfs);
 }
+
+#if    !(defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_TT) || defined(BOARD_EG800GLA_LD))
 STATIC mp_obj_t vfs_temp_sd_set_det(mp_obj_t self_in,mp_obj_t gpio_n,mp_obj_t mode) 
 {
     mp_obj_vfs_temp_t *self = MP_OBJ_TO_PTR(self_in);
@@ -152,6 +158,7 @@ STATIC mp_obj_t vfs_temp_sd_set_det(mp_obj_t self_in,mp_obj_t gpio_n,mp_obj_t mo
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_3(vfs_temp_sd_set_det_obj, vfs_temp_sd_set_det);
+
 void vfs_temp_sd_callback_to_python(uint8_t ind_type)
 {      
        if(callback_sd_det == NULL) {
@@ -161,6 +168,7 @@ void vfs_temp_sd_callback_to_python(uint8_t ind_type)
     mp_sched_schedule_ex(callback_sd_det, MP_OBJ_FROM_PTR(mp_obj_new_int(ind_type)));
     GC_STACKTOP_CLEAR();
 }
+
 STATIC mp_obj_t vfs_temp_sd_set_callback(mp_obj_t self_in, mp_obj_t callback)
 {
     mp_obj_vfs_temp_t *self = MP_OBJ_TO_PTR(self_in);
@@ -177,6 +185,7 @@ STATIC mp_obj_t vfs_temp_sd_set_callback(mp_obj_t self_in, mp_obj_t callback)
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(vfs_temp_sd_set_callback_obj, vfs_temp_sd_set_callback);
+
 STATIC mp_obj_t vfs_temp_mount(mp_obj_t self_in, mp_obj_t readonly, mp_obj_t mkfs) {
     /*mp_obj_vfs_posix_t *self = MP_OBJ_TO_PTR(self_in);
     if (mp_obj_is_true(readonly)) {
@@ -200,6 +209,7 @@ STATIC mp_obj_t vfs_temp_umount(mp_obj_t self_in) {
     return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(vfs_temp_umount_obj, vfs_temp_umount);
+#endif
 
 STATIC mp_obj_t vfs_temp_open(mp_obj_t self_in, mp_obj_t path_in, mp_obj_t mode_in) {
     mp_obj_vfs_temp_t *self = MP_OBJ_TO_PTR(self_in);
@@ -581,8 +591,10 @@ STATIC mp_obj_t vfs_temp_statvfs(mp_obj_t self_in, mp_obj_t path_in) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(vfs_temp_statvfs_obj, vfs_temp_statvfs);
 
 STATIC const mp_rom_map_elem_t vfs_temp_locals_dict_table[] = {
+#if    !(defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_TT) || defined(BOARD_EG800GLA_LD))
     { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_temp_mount_obj) },
     { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&vfs_temp_umount_obj) },
+#endif
     { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&vfs_temp_open_obj) },
 
     { MP_ROM_QSTR(MP_QSTR_chdir), MP_ROM_PTR(&vfs_temp_chdir_obj) },
@@ -594,8 +606,10 @@ STATIC const mp_rom_map_elem_t vfs_temp_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&vfs_temp_rmdir_obj) },
     { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&vfs_temp_stat_obj) },
     { MP_ROM_QSTR(MP_QSTR_statvfs), MP_ROM_PTR(&vfs_temp_statvfs_obj) },
+#if    !(defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_TT) || defined(BOARD_EG800GLA_LD))
     { MP_ROM_QSTR(MP_QSTR_set_callback), MP_ROM_PTR(&vfs_temp_sd_set_callback_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_det), MP_ROM_PTR(&vfs_temp_sd_set_det_obj) },
+#endif
     PLAT_GPIO_DEF(PLAT_GPIO_NUM),
 };
 STATIC MP_DEFINE_CONST_DICT(vfs_temp_locals_dict, vfs_temp_locals_dict_table);
index 27d2852..7546d46 100644 (file)
@@ -17,7 +17,7 @@
 #ifndef _VFS_TEMP_H_
 #define _VFS_TEMP_H_
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include "py/lexer.h"
 #include "py/obj.h"
 
index c2d24f7..24ed88e 100644 (file)
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include <stdio.h>
 #include <string.h>
 
index 4c49a1d..63e30ba 100644 (file)
@@ -89,7 +89,7 @@ LV_FONT_DECLARE(lv_font_benchmark_montserrat_16_compr_az);
 LV_FONT_DECLARE(lv_font_benchmark_montserrat_28_compr_az);
 
 static void monitor_cb(lv_disp_drv_t * drv, uint32_t time, uint32_t px);
-static void scene_next_task_cb(lv_timer_t * timer);
+static void next_scene_timer_cb(lv_timer_t * timer);
 static void rect_create(lv_style_t * style);
 static void img_create(lv_style_t * style, const void * src, bool rotate, bool zoom, bool aa);
 static void txt_create(lv_style_t * style);
@@ -636,7 +636,7 @@ static lv_obj_t * scene_bg;
 static lv_obj_t * title;
 static lv_obj_t * subtitle;
 static uint32_t rnd_act;
-
+static lv_timer_t * next_scene_timer;
 
 static const uint32_t rnd_map[] = {
     0xbd13204f, 0x67d8167f, 0x20211c99, 0xb0a7cc05,
@@ -708,9 +708,21 @@ void lv_demo_benchmark(void)
     benchmark_init();
 
     /*Manually start scenes*/
-    scene_next_task_cb(NULL);
+    next_scene_timer_cb(NULL);
 }
 
+void lv_demo_benchmark_close(void)
+{
+    if(next_scene_timer) lv_timer_del(next_scene_timer);
+    next_scene_timer = NULL;
+
+    lv_anim_del(NULL, NULL);
+
+    lv_style_reset(&style_common);
+
+    lv_obj_clean(lv_scr_act());
+
+}
 
 void lv_demo_benchmark_run_scene(int_fast16_t scene_no)
 {
@@ -973,11 +985,13 @@ static void report_cb(lv_timer_t * timer)
     }
 }
 
-static void scene_next_task_cb(lv_timer_t * timer)
+static void next_scene_timer_cb(lv_timer_t * timer)
 {
     LV_UNUSED(timer);
     lv_obj_clean(scene_bg);
 
+    next_scene_timer = NULL;
+
     if(opa_mode) {
         if(scene_act >= 0) {
             if(scenes[scene_act].time_sum_opa == 0) scenes[scene_act].time_sum_opa = 1;
@@ -1014,8 +1028,8 @@ static void scene_next_task_cb(lv_timer_t * timer)
 
         rnd_reset();
         scenes[scene_act].create_cb();
-        lv_timer_t * t = lv_timer_create(scene_next_task_cb, SCENE_TIME, NULL);
-        lv_timer_set_repeat_count(t, 1);
+        next_scene_timer = lv_timer_create(next_scene_timer_cb, SCENE_TIME, NULL);
+        lv_timer_set_repeat_count(next_scene_timer, 1);
 
     }
     /*Ready*/
index 6a0a4f6..71a7589 100644 (file)
@@ -30,6 +30,8 @@ typedef void finished_cb_t(void);
  **********************/
 void lv_demo_benchmark(void);
 
+void lv_demo_benchmark_close(void);
+
 void lv_demo_benchmark_run_scene(int_fast16_t scene_no);
 
 void lv_demo_benchmark_set_finished_cb(finished_cb_t * finished_cb);
index fdb9b94..0f4006e 100644 (file)
@@ -46,8 +46,11 @@ static lv_obj_t * t2;
 
 void lv_demo_keypad_encoder(void)
 {
-    g = lv_group_create();
-    lv_group_set_default(g);
+    g = lv_group_get_default();
+    if(g == NULL) {
+        g = lv_group_create();
+        lv_group_set_default(g);
+    }
 
     lv_indev_t * cur_drv = NULL;
     for(;;) {
@@ -76,6 +79,12 @@ void lv_demo_keypad_encoder(void)
     msgbox_create();
 }
 
+void lv_demo_keypad_encoder_close(void)
+{
+    lv_obj_clean(lv_scr_act());
+    lv_obj_clean(lv_layer_top());
+}
+
 /**********************
  *   STATIC FUNCTIONS
  **********************/
index cb72ed1..7393dfd 100644 (file)
@@ -103,6 +103,12 @@ static const uint32_t time_list[] = {
     2 * 60 + 19,
 };
 
+#if LV_DEMO_MUSIC_AUTO_PLAY
+    static lv_timer_t * auto_step_timer;
+#endif
+
+static lv_color_t original_screen_bg_color;
+
 /**********************
  *      MACROS
  **********************/
@@ -113,14 +119,31 @@ static const uint32_t time_list[] = {
 
 void lv_demo_music(void)
 {
+    original_screen_bg_color = lv_obj_get_style_bg_color(lv_scr_act(), 0);
     lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x343247), 0);
 
     list = _lv_demo_music_list_create(lv_scr_act());
     ctrl = _lv_demo_music_main_create(lv_scr_act());
 
 #if LV_DEMO_MUSIC_AUTO_PLAY
-    lv_timer_create(auto_step_cb, 1000, NULL);
+    auto_step_timer = lv_timer_create(auto_step_cb, 1000, NULL);
+#endif
+}
+
+void lv_demo_music_close(void)
+{
+    /*Delete all aniamtions*/
+    lv_anim_del(NULL, NULL);
+
+#if LV_DEMO_MUSIC_AUTO_PLAY
+    lv_timer_del(auto_step_timer);
 #endif
+    _lv_demo_music_list_close();
+    _lv_demo_music_main_close();
+
+    lv_obj_clean(lv_scr_act());
+
+    lv_obj_set_style_bg_color(lv_scr_act(), original_screen_bg_color, 0);
 }
 
 const char * _lv_demo_music_get_title(uint32_t track_id)
index 82917fb..3c393d6 100644 (file)
@@ -36,6 +36,8 @@ extern "C" {
  **********************/
 
 void lv_demo_music(void);
+void lv_demo_music_close(void);
+
 const char * _lv_demo_music_get_title(uint32_t track_id);
 const char * _lv_demo_music_get_artist(uint32_t track_id);
 const char * _lv_demo_music_get_genre(uint32_t track_id);
index 88e79ec..942baeb 100644 (file)
@@ -130,6 +130,19 @@ lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent)
     return list;
 }
 
+
+void _lv_demo_music_list_close(void)
+{
+    lv_style_reset(&style_scrollbar);
+    lv_style_reset(&style_btn);
+    lv_style_reset(&style_btn_pr);
+    lv_style_reset(&style_btn_chk);
+    lv_style_reset(&style_btn_dis);
+    lv_style_reset(&style_title);
+    lv_style_reset(&style_artist);
+    lv_style_reset(&style_time);
+}
+
 void _lv_demo_music_list_btn_check(uint32_t track_id, bool state)
 {
     lv_obj_t * btn = lv_obj_get_child(list, track_id);
index 48e6e17..d03c6d1 100644 (file)
@@ -28,6 +28,8 @@ extern "C" {
  * GLOBAL PROTOTYPES
  **********************/
 lv_obj_t * _lv_demo_music_list_create(lv_obj_t * parent);
+void _lv_demo_music_list_close(void);
+
 void _lv_demo_music_list_btn_check(uint32_t track_id, bool state);
 
 /**********************
index f7bc4b8..415af81 100644 (file)
@@ -60,7 +60,7 @@ static void prev_click_event_cb(lv_event_t * e);
 static void next_click_event_cb(lv_event_t * e);
 static void timer_cb(lv_timer_t * t);
 static void track_load(uint32_t id);
-static void stop_start_anim(lv_timer_t * t);
+static void stop_start_anim_timer_cb(lv_timer_t * t);
 static void spectrum_end_cb(lv_anim_t * a);
 static void album_fade_anim_cb(void * var, int32_t v);
 static int32_t get_cos(int32_t deg, int32_t a);
@@ -84,6 +84,7 @@ static uint32_t spectrum_lane_ofs_start = 0;
 static uint32_t bar_rot = 0;
 static uint32_t time_act;
 static lv_timer_t  * sec_counter_timer;
+static lv_timer_t * stop_start_anim_timer;
 static const lv_font_t * font_small;
 static const lv_font_t * font_large;
 static uint32_t track_id;
@@ -232,8 +233,8 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
 
     start_anim = true;
 
-    lv_timer_t * timer = lv_timer_create(stop_start_anim, INTRO_TIME + 6000, NULL);
-    lv_timer_set_repeat_count(timer, 1);
+    stop_start_anim_timer = lv_timer_create(stop_start_anim_timer_cb, INTRO_TIME + 6000, NULL);
+    lv_timer_set_repeat_count(stop_start_anim_timer, 1);
 
     lv_anim_init(&a);
     lv_anim_set_path_cb(&a, lv_anim_path_bounce);
@@ -292,6 +293,12 @@ lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent)
     return main_cont;
 }
 
+void _lv_demo_music_main_close(void)
+{
+    if(stop_start_anim_timer) lv_timer_del(stop_start_anim_timer);
+    lv_timer_del(sec_counter_timer);
+}
+
 void _lv_demo_music_album_next(bool next)
 {
     uint32_t id = track_id;
@@ -990,10 +997,11 @@ static void spectrum_end_cb(lv_anim_t * a)
 }
 
 
-static void stop_start_anim(lv_timer_t * t)
+static void stop_start_anim_timer_cb(lv_timer_t * t)
 {
     LV_UNUSED(t);
     start_anim = false;
+    stop_start_anim_timer = NULL;
     lv_obj_refresh_ext_draw_size(spectrum_obj);
 }
 
index a2cf939..04e8a7f 100644 (file)
@@ -28,6 +28,8 @@ extern "C" {
  * GLOBAL PROTOTYPES
  **********************/
 lv_obj_t * _lv_demo_music_main_create(lv_obj_t * parent);
+void _lv_demo_music_main_close(void);
+
 void _lv_demo_music_play(uint32_t id);
 void _lv_demo_music_resume(void);
 void _lv_demo_music_pause(void);
index b247443..f6e7089 100644 (file)
@@ -25,7 +25,7 @@ static void msgbox_del(lv_timer_t * tmr);
 static void set_y_anim(void * obj, int32_t v);
 static void set_width_anim(void * obj, int32_t v);
 static void arc_set_end_angle_anim(void * obj, int32_t v);
-static void obj_test_task_cb(lv_timer_t * tmr);
+static void obj_test_timer_cb(lv_timer_t * tmr);
 
 /**********************
  *  STATIC VARIABLES
@@ -34,6 +34,8 @@ static lv_obj_t * main_page;
 static lv_obj_t * ta;
 static const char * mbox_btns[] = {"Ok", "Cancel", ""};
 static uint32_t mem_free_start = 0;
+static lv_timer_t * obj_test_timer;
+
 /**********************
  *      MACROS
  **********************/
@@ -45,14 +47,21 @@ static uint32_t mem_free_start = 0;
 void lv_demo_stress(void)
 {
     LV_LOG_USER("Starting stress test. (< 100 bytes permanent memory leak is normal due to fragmentation)");
-    lv_timer_create(obj_test_task_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
+    obj_test_timer = lv_timer_create(obj_test_timer_cb, LV_DEMO_STRESS_TIME_STEP, NULL);
+}
+
+void lv_demo_stress_close(void)
+{
+    lv_timer_del(obj_test_timer);
+    lv_obj_clean(lv_scr_act());
+    lv_obj_clean(lv_layer_top());
 }
 
 /**********************
  *   STATIC FUNCTIONS
  **********************/
 
-static void obj_test_task_cb(lv_timer_t * tmr)
+static void obj_test_timer_cb(lv_timer_t * tmr)
 {
     (void) tmr;    /*Unused*/
     static int16_t state = -1;
index f718366..aacc9e1 100644 (file)
@@ -30,6 +30,8 @@ extern "C" {
  **********************/
 void lv_demo_stress(void);
 
+void lv_demo_stress_close(void);
+
 /**********************
  *      MACROS
  **********************/
index 839b999..44567e4 100644 (file)
@@ -86,6 +86,8 @@ static uint32_t session_desktop = 1000;
 static uint32_t session_tablet = 1000;
 static uint32_t session_mobile = 1000;
 
+static lv_timer_t * meter2_timer;
+
 /**********************
  *      MACROS
  **********************/
@@ -196,6 +198,22 @@ void lv_demo_widgets(void)
     color_changer_create(tv);
 }
 
+void lv_demo_widgets_close(void)
+{
+    /*Delete all animation*/
+    lv_anim_del(NULL, NULL);
+
+    lv_timer_del(meter2_timer);
+    meter2_timer = NULL;
+
+    lv_obj_clean(lv_scr_act());
+
+    lv_style_reset(&style_text_muted);
+    lv_style_reset(&style_title);
+    lv_style_reset(&style_icon);
+    lv_style_reset(&style_bullet);
+}
+
 /**********************
  *   STATIC FUNCTIONS
  **********************/
@@ -205,6 +223,7 @@ static void profile_create(lv_obj_t * parent)
     lv_obj_t * panel1 = lv_obj_create(parent);
     lv_obj_set_height(panel1, LV_SIZE_CONTENT);
 
+
     LV_IMG_DECLARE(img_demo_widgets_avatar);
     lv_obj_t * avatar = lv_img_create(panel1);
     lv_img_set_src(avatar, &img_demo_widgets_avatar);
@@ -698,7 +717,7 @@ static void analytics_create(lv_obj_t * parent)
     lv_meter_set_indicator_start_value(meter2, meter2_indic[2], 70);
     lv_meter_set_indicator_end_value(meter2, meter2_indic[2], 99);
 
-    lv_timer_create(meter2_timer_cb, 100, meter2_indic);
+    meter2_timer = lv_timer_create(meter2_timer_cb, 100, meter2_indic);
 
     meter3 = create_meter_box(parent, "Network Speed", "Low speed", "Normal Speed", "High Speed");
     if(disp_size < DISP_LARGE) lv_obj_add_flag(lv_obj_get_parent(meter3), LV_OBJ_FLAG_FLEX_IN_NEW_TRACK);
index 66dddaf..8d70df1 100644 (file)
@@ -27,6 +27,7 @@ extern "C" {
  * GLOBAL PROTOTYPES
  **********************/
 void lv_demo_widgets(void);
+void lv_demo_widgets_close(void);
 
 /**********************
  *      MACROS
index afc2b40..c271563 100644 (file)
@@ -1,5 +1,59 @@
 # Changelog
 
+## [v8.3.8](https://github.com/lvgl/lvgl/compare/v8.3.8...v8.3.7) 5 July 2023
+
+### New Features
+
+- feat(rt-thread): make the rt-thread env recursively glob the UI files [`8b83fe7`](https://github.com/lvgl/lvgl/commit/8b83fe7ea53a597cdbae8204d0aa9be8ad3d2b89)
+
+### Performance
+
+- perf(pxp, vglite): improve performance and add more features [`4222`](https://github.com/lvgl/lvgl/pull/4222)
+
+### Fixes
+
+- fix(stm32): static function prototypes moved from .h to .c [`4276`](https://github.com/lvgl/lvgl/pull/4276)
+- fix(png): fix decode image size and some warnings [`4248`](https://github.com/lvgl/lvgl/pull/4248)
+- fix(bidi): add more Hebrew checks to RTL characters set (#4171) [`4239`](https://github.com/lvgl/lvgl/pull/4239)
+- fix(img): fix getting the image type on big endian systems [`4215`](https://github.com/lvgl/lvgl/pull/4215)
+- fix(sdl): destroy texture after use if not stored in cache [`4173`](https://github.com/lvgl/lvgl/pull/4173)
+
+- fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185 [`cb602ea`](https://github.com/lvgl/lvgl/commit/cb602ea7785de21a187ef5ee5f7de4e3aa3f7e0e)
+- fix(arduino): fix messed up variable types [`e3659c4`](https://github.com/lvgl/lvgl/commit/e3659c46b128b2b715b196c3ccfb94b3de4c89f8)
+- fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185 [`07bce74`](https://github.com/lvgl/lvgl/commit/07bce7466d471a15ba241a9db3239f7a116b0b46)
+- fix(chart): fix division by zero if there are no ticks [`67b3011`](https://github.com/lvgl/lvgl/commit/67b3011f835b08c77ff60ae2d1e6592a710ca2b1)
+- fix(msgbox): fix typo [`6a89bd2`](https://github.com/lvgl/lvgl/commit/6a89bd2d7409ac4d49ad32da73ba50a84f7c8990)
+- fix(tabview): remove the animation if the tab is selected by clicking the button on the header [`3de61c7`](https://github.com/lvgl/lvgl/commit/3de61c76af0aed1665e9d61e47b4dd50b9e8bdf1)
+- fix(btnmatrix): fix array out of bounds addressing with groups and no buttons [`edd5ad2`](https://github.com/lvgl/lvgl/commit/edd5ad28ad74d1025db0b442cfa390d8c01ae006)
+- fix(btnmatrix): fix using &gt; 7 as button width [`75e6ef4`](https://github.com/lvgl/lvgl/commit/75e6ef4e1d66a85d68160b97ef931b0717e77212)
+- fix(draw): typo with LV_COLOR_DEPTH 8 [`45b13c3`](https://github.com/lvgl/lvgl/commit/45b13c378f6fc1728ddf1547c25daa61d62c9f76)
+- fix(disp): fix memory leak lv_scr_load_anim with auto_del and time=0 [`1caafc5`](https://github.com/lvgl/lvgl/commit/1caafc55dde46e1b7e3d17d8c5349fbf7cccba9f)
+
+- fix(msgbox): add missing lv_obj_class_init_obj [`6843c19`](https://github.com/lvgl/lvgl/commit/6843c191b792f66829477827279adbbc763541c1)
+- fix(flex): register LV_STYLE_FLEX_GROW [`5ba90a5`](https://github.com/lvgl/lvgl/commit/5ba90a5c41f584a8eb3a4fc8e2f466729652ddb3)
+
+### Examples
+
+- example(tabview): fix tabview disable scrollig example [`9491c3f`](https://github.com/lvgl/lvgl/commit/9491c3ff6d2f8e56b13d8fb493d4b3ee98ef1a4b)
+
+### Docs
+
+- docs: mention incompatibility between software rotation and `direct_mode` or `full_refresh` [`4308`](https://github.com/lvgl/lvgl/pull/4308)
+- docs(faq): don't say 24 bit is support as LVGL can't render in RGB888 directly [`227ac02`](https://github.com/lvgl/lvgl/commit/227ac023419eeb253892b1c36113059f12b1f9f2)
+
+### CI and tests
+
+### Others
+
+- chore(cmsis-pack): update cmsis-pack for v8.3.8 [`4340`](https://github.com/lvgl/lvgl/pull/4340)
+- add(docs): add renesas-ra6m3 get-started document [`4278`](https://github.com/lvgl/lvgl/pull/4278)
+- add(gpu): add renesas-ra6m3 gpu adaptation [`4270`](https://github.com/lvgl/lvgl/pull/4270)
+
+- Revert "fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185" [`1713cd3`](https://github.com/lvgl/lvgl/commit/1713cd3fd8f93aa575fbcf0e34b8626b6ee69ded)
+
+
+
+
 ## [v8.3.7](https://github.com/lvgl/lvgl/compare/v8.3.7...v8.3.6) 3 May 2023
 
 ### New Features
index 0d20b28..62508d1 100644 (file)
@@ -132,7 +132,7 @@ LVGL needs just one simple driver function to copy an array of pixels into a giv
 If you can do this with your display then you can use it with LVGL.
 
 Some examples of the supported display types:
-- TFTs with 16 or 24 bit color depth
+- TFTs with 16 or 32 bit color depth
 - Monitors with an HDMI port
 - Small monochrome displays
 - Gray-scale displays
index f06d48d..015b902 100644 (file)
@@ -204,6 +204,10 @@ The default rotation of your display when it is initialized can be set using the
 
 Display rotation can also be changed at runtime using the `lv_disp_set_rotation(disp, rot)` API.
 
+If you enable rotation the coordinates of the pointer input devices (e.g. touchpad) will be rotated too.
+
+Note that when using software rotation, you cannot use neither `direct_mode` nor `full_refresh` in the driver. When using either of these, you will have to rotate the pixels yourself e.g. in the `flush_cb`.
+
 Support for software rotation is a new feature, so there may be some glitches/bugs depending on your configuration. If you encounter a problem please open an issue on [GitHub](https://github.com/lvgl/lvgl/issues).
 
 ### Decoupling the display refresh timer
index 53eb987..3f0f32f 100644 (file)
@@ -20,7 +20,7 @@
 -->
 
 
-<package schemaVersion="1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="PACK.xsd">
+<package schemaVersion="1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="https://raw.githubusercontent.com/Open-CMSIS-Pack/Open-CMSIS-Pack-Spec/v1.7.7/schema/PACK.xsd">
   <vendor>LVGL</vendor>
   <name>lvgl</name>
   <description>LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint.</description>
   <repository type="git">https://github.com/lvgl/lvgl.git</repository>
 
   <releases>
-    <release date="2023-04-28" version="8.3.7" url="https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack">
+    <release date="2023-07-04" version="8.3.8" url="https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/LVGL.lvgl.8.3.8.pack">
+      - LVGL 8.3.8
+      - Add renesas-ra6m3 gpu adaptation
+      - Improve performance and add more features for PXP and VGLite
+      - Minor updates
+    </release>
+    <release date="2023-04-28" version="8.3.7" url="https://github.com/lvgl/lvgl/raw/2b56e04205481daa6575bd5f7ab5df59d11676eb/env_support/cmsis-pack/LVGL.lvgl.8.3.7.pack">
       - LVGL 8.3.7
       - Minor updates
     </release>
-    <release date="2023-04-02" version="8.3.6" url="https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/LVGL.lvgl.8.3.6.pack">
+    <release date="2023-04-02" version="8.3.6" url="https://github.com/lvgl/lvgl/raw/6b0092c0d91b2c7bfded48e04cc7b486ed3a72bd/env_support/cmsis-pack/LVGL.lvgl.8.3.6.pack">
       - LVGL 8.3.6 release
       - Various fixes, See CHANGELOG.md
     </release>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
         </condition>
         
         <condition id="LVGL-GPU-STM32-DMA2D">
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
         </condition>
         
         <condition id="LVGL-GPU-SWM341-DMA2D">
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
         </condition>
         
         <condition id="LVGL-GPU-NXP-PXP">
             <!--<deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>-->
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
         </condition>
         
         <condition id="LVGL-GPU-NXP-VGLite">
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
             <!--<deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>-->
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
         </condition>
         
         <condition id="LVGL-GPU-GD32-IPA">
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
             <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
             <!--<deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>-->
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>
+        </condition>
+
+        <condition id="LVGL-GPU-RA6M3-G2D">
+            <description>Enable LVGL Arm-2D GPU Support</description>
+            <require Cclass="LVGL" Cgroup="lvgl" Csub="Essential"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU Arm-2D"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU STM32-DMA2D"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU SWM341-DMA2D"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-PXP"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU NXP-VGLite"/>
+            <deny Cclass="LVGL" Cgroup="lvgl" Csub="GPU GD32-IPA"/>
+            <!--<deny Cclass="LVGL" Cgroup="lvgl" Csub="LVGL-GPU-RA6M3-G2D"/>-->
         </condition>
 
     </conditions>
   -->
 
     <components>
-        <bundle Cbundle="LVGL" Cclass="LVGL" Cversion="8.3.7">
+        <bundle Cbundle="LVGL" Cclass="LVGL" Cversion="8.3.8">
             <description>LVGL (Light and Versatile Graphics Library) is a free and open-source graphics library providing everything you need to create an embedded GUI with easy-to-use graphical elements, beautiful visual effects and a low memory footprint.</description>
             <doc></doc>
             <component Cgroup="lvgl" Csub="Essential" >
 
             </component>
 
+
+            <component Cgroup="lvgl" Csub="GPU RA6M3-G2D"  condition="LVGL-GPU-RA6M3-G2D">
+              <description>An hardware acceleration from Renesas RA6M3-G2D</description>
+              <files>
+                <file category="sourceC"            name="src/draw/renesas/lv_gpu_d2_draw_label.c" />
+                <file category="sourceC"            name="src/draw/renesas/lv_gpu_d2_ra6m3.c" />
+              </files>
+              
+              <RTE_Components_h>
+              
+/*! \brief enable RA6M3-G2D */
+#define LV_USE_GPU_RA6M3_G2D      1
+              </RTE_Components_h>
+              
+            </component>
+
             <component Cgroup="lvgl" Csub="Extra Themes"  condition="LVGL-Essential">
               <description>Extra Themes, Widgets and Layouts</description>
               <files>
index 8603c60..076f837 100644 (file)
@@ -2,8 +2,8 @@
 <index schemaVersion="1.0.0" xs:noNamespaceSchemaLocation="PackIndex.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance">
   <vendor>LVGL</vendor>
   <url>https://raw.githubusercontent.com/lvgl/lvgl/master/env_support/cmsis-pack/</url>
-  <timestamp>2023-05-03</timestamp>
+  <timestamp>2023-07-04</timestamp>
   <pindex>
-    <pdsc url="https://raw.githubusercontent.com/lvgl/lvgl/release/v8.3/env_support/cmsis-pack/" vendor="LVGL" name="lvgl" version="8.3.7"/>
+    <pdsc url="https://raw.githubusercontent.com/lvgl/lvgl/release/v8.3/env_support/cmsis-pack/" vendor="LVGL" name="lvgl" version="8.3.8"/>
   </pindex>
 </index>
\ No newline at end of file
index fdbbef3..c7cd87d 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * @file lv_conf.h
- * Configuration file for v8.3.7
+ * Configuration file for v8.3.8
  */
 
 /* clang-format off */
     #define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
 #endif
 
+#if LV_USE_GPU_RA6M3_G2D
+    /*include path of target processor
+    e.g. "hal_data.h"*/
+    #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h"
+#endif
+
 /*Use SDL renderer API*/
 #define LV_USE_GPU_SDL 0
 #if LV_USE_GPU_SDL
index 51edf22..2818830 100644 (file)
@@ -1,10 +1,25 @@
 from building import *
 
 cwd = GetCurrentDir()
-src = ['lv_ui_entry.c']
-
-src += Glob(cwd + '/ui/*.c')
-
-group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'])
-
+src = Glob('*.c')
+inc = [cwd]
+ 
+# check if .h or .hpp files exsit
+def check_h_hpp_exsit(path):
+    file_dirs = os.listdir(path)
+    for file_dir in file_dirs:
+        if os.path.splitext(file_dir)[1] in ['.h', '.hpp']:
+            return True
+    return False
+ 
+sls_src_cwd = cwd
+for root, dirs, files in os.walk(sls_src_cwd):
+    for dir in dirs:
+        current_path = os.path.join(root, dir)
+        src = src + Glob(os.path.join(current_path,'*.c')) # add all .c files
+        if check_h_hpp_exsit(current_path): # add .h and .hpp path
+            inc = inc + [current_path]
+ 
+group = DefineGroup('LVGL-SquareLine', src, depend = ['PKG_USING_LVGL_SQUARELINE'], CPPPATH = inc)
+ 
 Return('group')
index 0266042..79f306b 100644 (file)
@@ -1,21 +1,11 @@
 #include "../../lv_examples.h"
 #if LV_USE_TABVIEW && LV_BUILD_EXAMPLES
 
-static void scroll_begin_event(lv_event_t * e)
-{
-    /*Disable the scroll animations. Triggered when a tab button is clicked */
-    if(lv_event_get_code(e) == LV_EVENT_SCROLL_BEGIN) {
-        lv_anim_t * a = lv_event_get_param(e);
-        if(a)  a->time = 0;
-    }
-}
-
 void lv_example_tabview_2(void)
 {
     /*Create a Tab view object*/
     lv_obj_t * tabview;
     tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 80);
-    lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_BEGIN, NULL);
 
     lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_RED, 2), 0);
 
index f1604be..ee0360e 100644 (file)
@@ -1,15 +1,6 @@
-def scroll_begin_event(e):
-
-    #Disable the scroll animations. Triggered when a tab button is clicked */
-    if e.get_code() == lv.EVENT.SCROLL_BEGIN:
-        a = lv.anim_t.__cast__(e.get_param())
-        if a:
-            a.time = 0
 
 # Create a Tab view object
 tabview = lv.tabview(lv.scr_act(), lv.DIR.LEFT, 80)
-tabview.get_content().add_event_cb(scroll_begin_event, lv.EVENT.SCROLL_BEGIN, None)
-
 tabview.set_style_bg_color(lv.palette_lighten(lv.PALETTE.RED, 2), 0)
 
 tab_btns = tabview.get_tab_btns()
index 6ee412a..a1aeaf1 100644 (file)
 
 
 #include <stdio.h>
+FILE *ft2_fopen( const char *fileName, const char *mode );
+int     ft2_fclose( FILE *stream );
+size_t  ft2_fread( void *buffer, size_t elementSize, size_t elementCount, FILE *stream );
+int     ft2_fseek( FILE *stream, long offset, int origin );
+long    ft2_ftell( FILE *stream );
 
-#define FT_FILE     FILE
+#if 0
 #define ft_fclose   fclose
 #define ft_fopen    fopen
 #define ft_fread    fread
 #define ft_fseek    fseek
 #define ft_ftell    ftell
+#else
+#define ft_fclose   ft2_fclose
+#define ft_fopen    ft2_fopen
+#define ft_fread    ft2_fread
+#define ft_fseek    ft2_fseek
+#define ft_ftell    ft2_ftell
+#endif
+#define FT_FILE     FILE
 #define ft_sprintf  sprintf
-
-
   /**************************************************************************
    *
    *                            sorting
index 389d8e8..a55772d 100644 (file)
@@ -1,6 +1,6 @@
 {
        "name": "lvgl",
-       "version": "8.3.7",
+       "version": "8.3.8",
        "keywords": "graphics, gui, embedded, tft, lvgl",
        "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.",
        "repository": {
index c8f7ae9..ddea9b4 100644 (file)
@@ -1,5 +1,5 @@
 name=lvgl
-version=8.3.7
+version=8.3.8
 author=kisvegabor
 maintainer=kisvegabor,embeddedt,pete-pjb
 sentence=Full-featured Graphics Library for Embedded Systems
index 45e75f5..2c65d16 100644 (file)
 
 #define LV_FONT_UI_DEMO 0
 
+#ifdef CONFIG_LVGL_IME_PINYIN
+#define LV_USE_IME_PINYIN 1
+#endif
+
 #ifdef CONFIG_LVGL_AGRI_SOLUTION_FONT
 #define LV_FONT_AGRI_DEMO 1
 #endif
 
 #define LODEPNG_NO_COMPILE_ALLOCATORS
 
+#ifdef CONFIG_LVGL_USE_FREETYPE
+#define LV_USE_FREETYPE 1
+#define LV_FREETYPE_SBIT_CACHE 0
+#endif
 
 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/
 #ifndef LV_COLOR_16_SWAP
-#if defined(BOARD_EC600UCN_LC_ZS)
+#if defined(BOARD_EC600UCN_LC_ZS) || defined(BOARD_EC600GCN_LA_CDD)
 #define LV_COLOR_16_SWAP   1
 #else
 #define LV_COLOR_16_SWAP   0
 #define LV_DISP_DEF_REFR_PERIOD     30      /*[ms]*/
 
 /*Input device read period in milliseconds*/
-#define LV_INDEV_DEF_READ_PERIOD    30      /*[ms]*/
+#define LV_INDEV_DEF_READ_PERIOD    20      /*[ms]*/
 
 /*Use a custom tick source that tells the elapsed time in milliseconds.
  *It removes the need to manually update the tick with `lv_tick_inc()`)*/
 
 /*Enable complex draw engine.
  *Required to draw shadow, gradient, rounded corners, circles, arc, skew lines, image transformations or any masks*/
+
 #define LV_DRAW_COMPLEX 1
 #if LV_DRAW_COMPLEX != 0
 
 #define LV_IMG_CACHE_DEF_SIZE       8
 #elif defined(BOARD_EC800MCN_GA_ALIPAY)
 #define LV_IMG_CACHE_DEF_SIZE       16
+#elif defined(BOARD_EC600UCN_LB_YDWL)
+#define LV_IMG_CACHE_DEF_SIZE       0
 #else
 #define LV_IMG_CACHE_DEF_SIZE       1
 #endif
@@ -267,7 +278,12 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
  *-----------*/
 
 /*Enable the log module*/
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+#define LV_USE_LOG      0
+#else
 #define LV_USE_LOG      1
+#endif
+
 #if LV_USE_LOG
 
 /*How important log should be added:
@@ -673,7 +689,11 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
 #  define LV_TEXTAREA_DEF_PWD_SHOW_TIME     1500    /*ms*/
 #endif
 
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+#define LV_USE_TABLE  0
+#else
 #define LV_USE_TABLE  1
+#endif
 
 /*==================
  * EXTRA COMPONENTS
@@ -817,14 +837,22 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h"*/
 #define LV_USE_FLEX     1
 
 /*A layout similar to Grid in CSS.*/
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+#define LV_USE_GRID     0
+#else
 #define LV_USE_GRID     1
+#endif
 
 /*==================
 * EXAMPLES
 *==================*/
 
 /*Enable the examples to be built with the library*/
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+#define LV_BUILD_EXAMPLES   0
+#else
 #define LV_BUILD_EXAMPLES   1
+#endif
 
 /*--END OF LV_CONF_H--*/
 
index 985c796..7af3027 100644 (file)
@@ -15,7 +15,7 @@ extern "C" {
  ***************************/
 #define LVGL_VERSION_MAJOR 8
 #define LVGL_VERSION_MINOR 3
-#define LVGL_VERSION_PATCH 7
+#define LVGL_VERSION_PATCH 8
 #define LVGL_VERSION_INFO ""
 
 /*********************
@@ -63,6 +63,8 @@ extern "C" {
 
 #include "src/lv_api_map.h"
 
+#include "src/extra/others/ime/lv_ime_pinyin.h"
+
 /*-----------------
  * EXTRAS
  *----------------*/
index caf9c31..80f8cd6 100644 (file)
@@ -188,9 +188,11 @@ void lv_indev_reset(lv_indev_t * indev, lv_obj_t * obj)
 
 void lv_indev_reset_long_press(lv_indev_t * indev)
 {
-    indev->proc.long_pr_sent         = 0;
-    indev->proc.longpr_rep_timestamp = lv_tick_get();
-    indev->proc.pr_timestamp         = lv_tick_get();
+       if(indev) {
+               indev->proc.long_pr_sent                 = 0;
+               indev->proc.longpr_rep_timestamp = lv_tick_get();
+               indev->proc.pr_timestamp                 = lv_tick_get();
+       }
 }
 
 void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj)
@@ -356,16 +358,16 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data)
 
     /*Simple sanity check*/
     if(data->point.x < 0) {
-        LV_LOG_WARN("X is %d which is smaller than zero", data->point.x);
+        LV_LOG_WARN("X is %d which is smaller than zero", (int)data->point.x);
     }
     if(data->point.x >= lv_disp_get_hor_res(i->driver->disp)) {
-        LV_LOG_WARN("X is %d which is greater than hor. res", data->point.x);
+        LV_LOG_WARN("X is %d which is greater than hor. res", (int)data->point.x);
     }
     if(data->point.y < 0) {
-        LV_LOG_WARN("Y is %d which is smaller than zero", data->point.y);
+        LV_LOG_WARN("Y is %d which is smaller than zero", (int)data->point.y);
     }
     if(data->point.y >= lv_disp_get_ver_res(i->driver->disp)) {
-        LV_LOG_WARN("Y is %d which is greater than ver. res", data->point.y);
+        LV_LOG_WARN("Y is %d which is greater than ver. res", (int)data->point.y);
     }
 
     /*Move the cursor if set and moved*/
index 0e53557..c8bb301 100644 (file)
@@ -132,6 +132,7 @@ void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc)
         if(align_y == LV_SCROLL_SNAP_NONE) {
             proc->types.pointer.scroll_throw_vect.y =
                 proc->types.pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100;
+
             lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj);
             lv_coord_t st = lv_obj_get_scroll_top(scroll_obj);
 
@@ -178,7 +179,6 @@ void _lv_indev_scroll_throw_handler(_lv_indev_proc_t * proc)
                     diff_x -= LV_INDEV_DEF_X_SLIDING_SPEED;
                 }
             #endif
-            printf("_lv_indev_scroll_throw_handler:%d",diff_x);
             lv_coord_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x);
             lv_obj_scroll_by(scroll_obj, x + diff_x, 0, LV_ANIM_ON);
         }
@@ -246,7 +246,6 @@ lv_coord_t lv_indev_scroll_throw_predict(lv_indev_t * indev, lv_dir_t dir)
 
     lv_coord_t scroll_throw = indev->driver->scroll_throw;
     lv_coord_t sum = 0;
-    
     while(v) {
         sum += v;
         v = v * (100 - scroll_throw) / 100;
index 99bd1a2..209ef81 100644 (file)
@@ -209,12 +209,10 @@ void lv_deinit(void)
 #endif
 }
 #endif
-#include "helios_debug.h"
-#define lv_obj_create_log(msg, ...)      custom_log("lv_obj_create", msg, ##__VA_ARGS__)
+
 lv_obj_t * lv_obj_create(lv_obj_t * parent)
 {
     LV_LOG_INFO("begin");
-    lv_obj_create_log("parent:0x%p!!!!!!\n\n\n",parent);
     lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
     lv_obj_class_init_obj(obj);
     return obj;
@@ -234,12 +232,22 @@ void lv_obj_add_flag(lv_obj_t * obj, lv_obj_flag_t f)
 
     bool was_on_layout = lv_obj_is_layout_positioned(obj);
 
+    /* We must invalidate the area occupied by the object before we hide it as calls to invalidate hidden objects are ignored */
     if(f & LV_OBJ_FLAG_HIDDEN) lv_obj_invalidate(obj);
 
     obj->flags |= f;
 
     if(f & LV_OBJ_FLAG_HIDDEN) {
-        lv_obj_invalidate(obj);
+        if(lv_obj_has_state(obj, LV_STATE_FOCUSED)) {
+            lv_group_t * group = lv_obj_get_group(obj);
+            if(group != NULL) {
+                lv_group_focus_next(group);
+                lv_obj_t * next_obj = lv_group_get_focused(group);
+                if(next_obj != NULL) {
+                    lv_obj_invalidate(next_obj);
+                }
+            }
+        }
     }
 
     if((was_on_layout != lv_obj_is_layout_positioned(obj)) || (f & (LV_OBJ_FLAG_LAYOUT_1 |  LV_OBJ_FLAG_LAYOUT_2))) {
@@ -720,9 +728,9 @@ static void lv_obj_event(const lv_obj_class_t * class_p, lv_event_t * e)
     }
     else if(code == LV_EVENT_RELEASED) {
         lv_obj_clear_state(obj, LV_STATE_PRESSED);
-        void * param = lv_event_get_param(e);
+        lv_indev_t * indev = lv_event_get_indev(e);
         /*Go the checked state if enabled*/
-        if(lv_indev_get_scroll_obj(param) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) {
+        if(lv_indev_get_scroll_obj(indev) == NULL && lv_obj_has_flag(obj, LV_OBJ_FLAG_CHECKABLE)) {
             if(!(lv_obj_get_state(obj) & LV_STATE_CHECKED)) lv_obj_add_state(obj, LV_STATE_CHECKED);
             else lv_obj_clear_state(obj, LV_STATE_CHECKED);
 
index 8547bc0..bfe3ec7 100644 (file)
@@ -189,6 +189,7 @@ typedef struct _lv_obj_t {
     uint16_t style_cnt  : 6;
     uint16_t h_layout   : 1;
     uint16_t w_layout   : 1;
+    uint16_t being_deleted   : 1;
 } lv_obj_t;
 
 
index bdce9cf..25ddab8 100644 (file)
@@ -76,7 +76,9 @@ void _lv_obj_style_init(void)
 void lv_obj_add_style(lv_obj_t * obj, lv_style_t * style, lv_style_selector_t selector)
 {
     trans_del(obj, selector, LV_STYLE_PROP_ANY, NULL);
-    assert(obj->style_cnt < 63);
+
+       assert(obj->style_cnt < 63);
+
     uint32_t i;
     /*Go after the transition and local styles*/
     for(i = 0; i < obj->style_cnt; i++) {
index d3ad16a..dbd350a 100644 (file)
@@ -360,6 +360,8 @@ static void obj_del_core(lv_obj_t * obj)
     lv_res_t res = lv_event_send(obj, LV_EVENT_DELETE, NULL);
     if(res == LV_RES_INV) return;
 
+    obj->being_deleted = 1;
+
     /*Recursively delete the children*/
     lv_obj_t * child = lv_obj_get_child(obj, 0);
     while(child) {
index 45ff2e0..ec83e0f 100644 (file)
@@ -1027,7 +1027,7 @@ static void draw_buf_rotate_180(lv_disp_drv_t * drv, lv_area_t * area, lv_color_
     area->x1 = drv->hor_res - tmp_coord - 1;
 }
 
-static LV_ATTRIBUTE_FAST_MEM void draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h,
+static void LV_ATTRIBUTE_FAST_MEM draw_buf_rotate_90(bool invert_i, lv_coord_t area_w, lv_coord_t area_h,
                                                      lv_color_t * orig_color_p, lv_color_t * rot_buf)
 {
 
index c42f238..cc1ef60 100644 (file)
  **********************/
 
 #if __ARM_2D_HAS_HW_ACC__
-LV_ATTRIBUTE_FAST_MEM
-static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
-                                      const arm_2d_region_t * region,
-                                      lv_color_t color,
-                                      lv_opa_t opa,
-                                      const arm_2d_tile_t * mask_tile);
-
-LV_ATTRIBUTE_FAST_MEM
-static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
-                                    const arm_2d_region_t * region,
-                                    arm_2d_tile_t * source_tile,
-                                    lv_opa_t opa,
-                                    arm_2d_tile_t * mask_tile);
+static bool /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+                                                                  const arm_2d_region_t * region,
+                                                                  lv_color_t color,
+                                                                  lv_opa_t opa,
+                                                                  const arm_2d_tile_t * mask_tile);
+
+static bool /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+                                                                const arm_2d_region_t * region,
+                                                                arm_2d_tile_t * source_tile,
+                                                                lv_opa_t opa,
+                                                                arm_2d_tile_t * mask_tile);
 #else
 
 static void convert_cb(const lv_area_t * dest_area,
@@ -443,36 +441,32 @@ static void convert_cb(const lv_area_t * dest_area,
                        lv_color_t * cbuf,
                        lv_opa_t * abuf);
 
-LV_ATTRIBUTE_FAST_MEM
-static bool arm_2d_fill_normal(lv_color_t * dest_buf,
-                               const lv_area_t * dest_area,
-                               lv_coord_t dest_stride,
-                               lv_color_t color,
-                               lv_opa_t opa,
-                               const lv_opa_t * mask,
-                               lv_coord_t mask_stride);
-
-LV_ATTRIBUTE_FAST_MEM
-static bool arm_2d_copy_normal(lv_color_t * dest_buf,
-                               const lv_area_t * dest_area,
-                               lv_coord_t dest_stride,
-                               const lv_color_t * src_buf,
-                               lv_coord_t src_stride,
-                               lv_opa_t opa,
-                               const lv_opa_t * mask,
-                               lv_coord_t mask_stride);
+static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_fill_normal(lv_color_t * dest_buf,
+                                                           const lv_area_t * dest_area,
+                                                           lv_coord_t dest_stride,
+                                                           lv_color_t color,
+                                                           lv_opa_t opa,
+                                                           const lv_opa_t * mask,
+                                                           lv_coord_t mask_stride);
+
+static bool /* LV_ATTRIBUTE_FAST_MEM */ arm_2d_copy_normal(lv_color_t * dest_buf,
+                                                           const lv_area_t * dest_area,
+                                                           lv_coord_t dest_stride,
+                                                           const lv_color_t * src_buf,
+                                                           lv_coord_t src_stride,
+                                                           lv_opa_t opa,
+                                                           const lv_opa_t * mask,
+                                                           lv_coord_t mask_stride);
 #endif
 
-LV_ATTRIBUTE_FAST_MEM
-static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM
-static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx);
-LV_ATTRIBUTE_FAST_MEM
-static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
-                                      const lv_draw_img_dsc_t * draw_dsc,
-                                      const lv_area_t * coords,
-                                      const uint8_t * src_buf,
-                                      lv_img_cf_t cf);
+static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx,
+                                                            const lv_draw_sw_blend_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+static void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                                                  const lv_draw_img_dsc_t * draw_dsc,
+                                                                  const lv_area_t * coords,
+                                                                  const uint8_t * src_buf,
+                                                                  lv_img_cf_t cf);
 
 /**********************
  *  STATIC VARIABLES
@@ -512,8 +506,8 @@ void lv_draw_arm2d_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx)
 extern void test_flush(lv_color_t * color_p);
 
 #if __ARM_2D_HAS_HW_ACC__
-LV_ATTRIBUTE_FAST_MEM
-static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx,
+                                                      const lv_draw_sw_blend_dsc_t * dsc)
 {
     const lv_opa_t * mask;
     if(dsc->mask_buf == NULL) mask = NULL;
@@ -560,12 +554,11 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend
 }
 
 
-LV_ATTRIBUTE_FAST_MEM
-static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
-                                      const arm_2d_region_t * region,
-                                      lv_color_t color,
-                                      lv_opa_t opa,
-                                      const arm_2d_tile_t * mask_tile)
+static bool LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
+                                                            const arm_2d_region_t * region,
+                                                            lv_color_t color,
+                                                            lv_opa_t opa,
+                                                            const arm_2d_tile_t * mask_tile)
 {
     arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
 
@@ -623,12 +616,11 @@ static bool lv_draw_arm2d_fill_colour(const arm_2d_tile_t * target_tile,
 
 }
 
-LV_ATTRIBUTE_FAST_MEM
-static bool lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
-                                    const arm_2d_region_t * region,
-                                    arm_2d_tile_t * source_tile,
-                                    lv_opa_t opa,
-                                    arm_2d_tile_t * mask_tile)
+static bool LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_tile_copy(const arm_2d_tile_t * target_tile,
+                                                          const arm_2d_region_t * region,
+                                                          arm_2d_tile_t * source_tile,
+                                                          lv_opa_t opa,
+                                                          arm_2d_tile_t * mask_tile)
 {
     arm_fsm_rt_t result = (arm_fsm_rt_t)ARM_2D_ERR_NONE;
 
@@ -691,8 +683,8 @@ static void lv_gpu_arm2d_wait_cb(lv_draw_ctx_t * draw_ctx)
 #else
 
 
-LV_ATTRIBUTE_FAST_MEM
-static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx,
+                                                      const lv_draw_sw_blend_dsc_t * dsc)
 {
     const lv_opa_t * mask;
     if(dsc->mask_buf == NULL) mask = NULL;
@@ -777,14 +769,13 @@ static void lv_draw_arm2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend
     if(!is_accelerated) lv_draw_sw_blend_basic(draw_ctx, dsc);
 }
 
-LV_ATTRIBUTE_FAST_MEM
-static bool arm_2d_fill_normal(lv_color_t * dest_buf,
-                               const lv_area_t * dest_area,
-                               lv_coord_t dest_stride,
-                               lv_color_t color,
-                               lv_opa_t opa,
-                               const lv_opa_t * mask,
-                               lv_coord_t mask_stride)
+static bool LV_ATTRIBUTE_FAST_MEM arm_2d_fill_normal(lv_color_t * dest_buf,
+                                                     const lv_area_t * dest_area,
+                                                     lv_coord_t dest_stride,
+                                                     lv_color_t color,
+                                                     lv_opa_t opa,
+                                                     const lv_opa_t * mask,
+                                                     lv_coord_t mask_stride)
 {
     arm_2d_size_t target_size = {
         .iWidth = lv_area_get_width(dest_area),
@@ -835,15 +826,14 @@ static bool arm_2d_fill_normal(lv_color_t * dest_buf,
 }
 
 
-LV_ATTRIBUTE_FAST_MEM
-static bool arm_2d_copy_normal(lv_color_t * dest_buf,
-                               const lv_area_t * dest_area,
-                               lv_coord_t dest_stride,
-                               const lv_color_t * src_buf,
-                               lv_coord_t src_stride,
-                               lv_opa_t opa,
-                               const lv_opa_t * mask,
-                               lv_coord_t mask_stride)
+static bool LV_ATTRIBUTE_FAST_MEM arm_2d_copy_normal(lv_color_t * dest_buf,
+                                                     const lv_area_t * dest_area,
+                                                     lv_coord_t dest_stride,
+                                                     const lv_color_t * src_buf,
+                                                     lv_coord_t src_stride,
+                                                     lv_opa_t opa,
+                                                     const lv_opa_t * mask,
+                                                     lv_coord_t mask_stride)
 
 {
     int32_t w = lv_area_get_width(dest_area);
@@ -908,12 +898,11 @@ static bool arm_2d_copy_normal(lv_color_t * dest_buf,
     return true;
 }
 
-LV_ATTRIBUTE_FAST_MEM
-static void lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
-                                      const lv_draw_img_dsc_t * draw_dsc,
-                                      const lv_area_t * coords,
-                                      const uint8_t * src_buf,
-                                      lv_img_cf_t cf)
+static void LV_ATTRIBUTE_FAST_MEM lv_draw_arm2d_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                                            const lv_draw_img_dsc_t * draw_dsc,
+                                                            const lv_area_t * coords,
+                                                            const uint8_t * src_buf,
+                                                            lv_img_cf_t cf)
 {
     /*Use the clip area as draw area*/
     lv_area_t draw_area;
index 1e83eaf..5e67f88 100644 (file)
@@ -25,8 +25,9 @@
 /**********************
  *  STATIC PROTOTYPES
  **********************/
-LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
-                                                      const lv_area_t * coords, const void * src);
+static lv_res_t /* LV_ATTRIBUTE_FAST_MEM */ decode_and_draw(lv_draw_ctx_t * draw_ctx,
+                                                            const lv_draw_img_dsc_t * draw_dsc,
+                                                            const lv_area_t * coords, const void * src);
 
 static void show_error(lv_draw_ctx_t * draw_ctx, const lv_area_t * coords, const char * msg);
 static void draw_cleanup(_lv_img_cache_entry_t * cache);
@@ -236,7 +237,8 @@ void lv_draw_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc
  *   STATIC FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static lv_res_t decode_and_draw(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
+static lv_res_t LV_ATTRIBUTE_FAST_MEM decode_and_draw(lv_draw_ctx_t * draw_ctx,
+                                                      const lv_draw_img_dsc_t * draw_dsc,
                                                       const lv_area_t * coords, const void * src)
 {
     if(draw_dsc->opa <= LV_OPA_MIN) return LV_RES_OK;
index 7f80df4..daf4474 100644 (file)
@@ -52,7 +52,7 @@ static uint8_t hex_char_to_num(char hex);
  *   GLOBAL FUNCTIONS
  **********************/
 
-void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc)
 {
     lv_memset_00(dsc, sizeof(lv_draw_label_dsc_t));
     dsc->opa = LV_OPA_COVER;
@@ -74,7 +74,7 @@ void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc)
  * @param hint pointer to a `lv_draw_label_hint_t` variable.
  * It is managed by the draw to speed up the drawing of very long texts (thousands of lines).
  */
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
                                          const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint)
 {
     if(dsc->opa <= LV_OPA_MIN) return;
index de72edd..b28436a 100644 (file)
@@ -68,7 +68,7 @@ struct _lv_draw_ctx_t;
  * GLOBAL PROTOTYPES
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc);
 
 /**
  * Write a text
@@ -79,8 +79,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc);
  * @param hint pointer to a `lv_draw_label_hint_t` variable.
  * It is managed by the draw to speed up the drawing of very long texts (thousands of lines).
  */
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
-                                         const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+                                               const lv_area_t * coords, const char * txt, lv_draw_label_hint_t * hint);
 
 void lv_draw_letter(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,  const lv_point_t * pos_p,
                     uint32_t letter);
index b4844db..d0c4327 100644 (file)
@@ -34,7 +34,7 @@
  *   GLOBAL FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
 {
     lv_memset_00(dsc, sizeof(lv_draw_line_dsc_t));
     dsc->width = 1;
@@ -42,7 +42,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
     dsc->color = lv_color_black();
 }
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+void LV_ATTRIBUTE_FAST_MEM lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
                                         const lv_point_t * point1, const lv_point_t * point2)
 {
     if(dsc->width == 0) return;
index d82ea51..b476ce4 100644 (file)
@@ -43,7 +43,7 @@ struct _lv_draw_ctx_t;
  * GLOBAL PROTOTYPES
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc);
 
 /**
  * Draw a line
@@ -52,8 +52,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc);
  * @param clip the line will be drawn only in this area
  * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable
  */
-void lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1,
-                  const lv_point_t * point2);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+                                              const lv_point_t * point1, const lv_point_t * point2);
 
 
 /**********************
index 2170da9..872ca9a 100644 (file)
 /**********************
  *  STATIC PROTOTYPES
  **********************/
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x,
-                                                                  lv_coord_t abs_y, lv_coord_t len,
-                                                                  lv_draw_mask_line_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x,
-                                                                    lv_coord_t abs_y, lv_coord_t len,
-                                                                    lv_draw_mask_radius_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x,
-                                                                   lv_coord_t abs_y, lv_coord_t len,
-                                                                   lv_draw_mask_angle_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x,
-                                                                  lv_coord_t abs_y, lv_coord_t len,
-                                                                  lv_draw_mask_fade_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x,
-                                                                 lv_coord_t abs_y, lv_coord_t len,
-                                                                 lv_draw_mask_map_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                        lv_coord_t abs_y, lv_coord_t len,
+                                                                        lv_draw_mask_line_param_t * param);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                          lv_coord_t abs_y, lv_coord_t len,
+                                                                          lv_draw_mask_radius_param_t * param);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                         lv_coord_t abs_y, lv_coord_t len,
+                                                                         lv_draw_mask_angle_param_t * param);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                        lv_coord_t abs_y, lv_coord_t len,
+                                                                        lv_draw_mask_fade_param_t * param);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                       lv_coord_t abs_y, lv_coord_t len,
+                                                                       lv_draw_mask_map_param_t * param);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                           lv_coord_t abs_y, lv_coord_t len,
+                                                                           lv_draw_mask_polygon_param_t * param);
+
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                      lv_coord_t abs_y, lv_coord_t len,
-                                                                     lv_draw_mask_polygon_param_t * param);
-
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                               lv_coord_t len,
-                                                               lv_draw_mask_line_param_t * p);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                                lv_coord_t len,
-                                                                lv_draw_mask_line_param_t * p);
+                                                                     lv_draw_mask_line_param_t * p);
+static lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                      lv_coord_t abs_y, lv_coord_t len,
+                                                                      lv_draw_mask_line_param_t * p);
 
 static void circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius);
 static bool circ_cont(lv_point_t * c);
@@ -58,7 +58,7 @@ static void circ_next(lv_point_t * c, lv_coord_t * tmp);
 static void circ_calc_aa4(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t radius);
 static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_t y, lv_coord_t * len,
                                 lv_coord_t * x_start);
-LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new);
+static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new);
 
 /**********************
  *  STATIC VARIABLES
@@ -108,8 +108,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id)
  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
  */
-LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                            lv_coord_t len)
+lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                            lv_coord_t abs_y, lv_coord_t len)
 {
     bool changed = false;
     _lv_draw_mask_common_dsc_t * dsc;
@@ -142,8 +142,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf,
  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
  */
-LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                                lv_coord_t len, const int16_t * ids, int16_t ids_count)
+lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                lv_coord_t abs_y, lv_coord_t len,
+                                                                const int16_t * ids, int16_t ids_count)
 {
     bool changed = false;
     _lv_draw_mask_common_dsc_t * dsc;
@@ -243,7 +244,7 @@ void _lv_draw_mask_cleanup(void)
  * Count the currently added masks
  * @return number of active masks
  */
-LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void)
+uint8_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_get_cnt(void)
 {
     uint8_t cnt = 0;
     uint8_t i;
@@ -593,7 +594,7 @@ void lv_draw_mask_polygon_init(lv_draw_mask_polygon_param_t * param, const lv_po
  *   STATIC FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                   lv_coord_t abs_y, lv_coord_t len,
                                                                   lv_draw_mask_line_param_t * p)
 {
@@ -653,7 +654,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mas
     return res;
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
                                                                lv_coord_t len,
                                                                lv_draw_mask_line_param_t * p)
 {
@@ -769,7 +770,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_b
     return LV_DRAW_MASK_RES_CHANGED;
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
                                                                 lv_coord_t len,
                                                                 lv_draw_mask_line_param_t * p)
 {
@@ -911,7 +912,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_
     return LV_DRAW_MASK_RES_CHANGED;
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                    lv_coord_t abs_y, lv_coord_t len,
                                                                    lv_draw_mask_angle_param_t * p)
 {
@@ -1050,7 +1051,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * ma
 
 
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                     lv_coord_t abs_y, lv_coord_t len,
                                                                     lv_draw_mask_radius_param_t * p)
 {
@@ -1167,7 +1168,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * m
     return LV_DRAW_MASK_RES_CHANGED;
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                   lv_coord_t abs_y, lv_coord_t len,
                                                                   lv_draw_mask_fade_param_t * p)
 {
@@ -1213,7 +1214,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mas
     }
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                  lv_coord_t abs_y, lv_coord_t len,
                                                                  lv_draw_mask_map_param_t * p)
 {
@@ -1247,7 +1248,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask
     return LV_DRAW_MASK_RES_CHANGED;
 }
 
-LV_ATTRIBUTE_FAST_MEM static lv_draw_mask_res_t lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x,
+static lv_draw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_polygon(lv_opa_t * mask_buf, lv_coord_t abs_x,
                                                                      lv_coord_t abs_y, lv_coord_t len,
                                                                      lv_draw_mask_polygon_param_t * param)
 {
@@ -1518,7 +1519,7 @@ static lv_opa_t * get_next_line(_lv_draw_mask_radius_circle_dsc_t * c, lv_coord_
 }
 
 
-LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new)
+static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new)
 {
     if(mask_new >= LV_OPA_MAX) return mask_act;
     if(mask_new <= LV_OPA_MIN) return 0;
index b7e4e1c..908be6b 100644 (file)
@@ -241,8 +241,8 @@ int16_t lv_draw_mask_add(void * param, void * custom_id);
  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
  */
-LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                            lv_coord_t len);
+lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                  lv_coord_t abs_y, lv_coord_t len);
 
 /**
  * Apply the specified buffers on a line. Used internally by the library's drawing routines.
@@ -257,8 +257,9 @@ LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf,
  * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
  * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
  */
-LV_ATTRIBUTE_FAST_MEM lv_draw_mask_res_t lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y,
-                                                                lv_coord_t len, const int16_t * ids, int16_t ids_count);
+lv_draw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_apply_ids(lv_opa_t * mask_buf, lv_coord_t abs_x,
+                                                                      lv_coord_t abs_y, lv_coord_t len,
+                                                                      const int16_t * ids, int16_t ids_count);
 
 //! @endcond
 
@@ -299,7 +300,7 @@ void _lv_draw_mask_cleanup(void);
  * Count the currently added masks
  * @return number of active masks
  */
-LV_ATTRIBUTE_FAST_MEM uint8_t lv_draw_mask_get_cnt(void);
+uint8_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_get_cnt(void);
 
 
 /**
index f34854d..ae81f38 100644 (file)
@@ -34,7 +34,7 @@
  *   GLOBAL FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
 {
     lv_memset_00(dsc, sizeof(lv_draw_rect_dsc_t));
     dsc->bg_color = lv_color_white();
index 1583e3e..46a58a4 100644 (file)
@@ -74,7 +74,7 @@ struct _lv_draw_ctx_t;
  * GLOBAL PROTOTYPES
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc);
 
 
 /**
index 2caf512..40ecf9f 100644 (file)
  * @param color color The color of the image with `LV_IMG_CF_ALPHA_...`
  * @return pointer to the cache entry or NULL if can open the image
  */
+#include "helios_debug.h"
+#define LVGL_LOG(msg, ...) //custom_log("lv_cache", msg, ##__VA_ARGS__)
+
+
 _lv_img_cache_entry_t * _lv_img_cache_open(const void * src, lv_color_t color, int32_t frame_id)
 {
     /*Is the image cached?*/
@@ -101,12 +105,42 @@ _lv_img_cache_entry_t * _lv_img_cache_open(const void * src, lv_color_t color, i
 
     /*Find an entry to reuse. Select the entry with the least life*/
     cached_src = &cache[0];
-    for(i = 1; i < entry_cnt; i++) {
+
+
+       LVGL_LOG("-----------cache start cnt[%d]---------------",entry_cnt);
+       LVGL_LOG("cache0[%s]",cache[0].dec_dsc.src);
+       
+       i = 1;
+       if(entry_cnt >= 1) {
+               if(lv_img_src_get_type(cache[0].dec_dsc.src) == LV_IMG_SRC_FILE) {
+                       LVGL_LOG("cache1[%s]",cache[0].dec_dsc.src);
+                       if(strncmp(cache[0].dec_dsc.src, "U:/cache_", 9) == 0){
+                               cached_src = &cache[1];
+                               i++;
+                               
+                               LVGL_LOG("is bg i = [%d]",i);
+                       }
+               }
+       }
+
+       
+    for(; i < entry_cnt; i++) {
+               if(lv_img_src_get_type(cache[i].dec_dsc.src) == LV_IMG_SRC_FILE) {
+                       LVGL_LOG("cache[%s]",cache[i].dec_dsc.src);
+                       if(strncmp(cache[i].dec_dsc.src, "U:/cache_", 9) == 0){
+                               LVGL_LOG("cache[%d][%d]",i, cache[i].dec_dsc.src);
+                               continue;
+                       }
+               }
         if(cache[i].life < cached_src->life) {
             cached_src = &cache[i];
+                       
+                       LVGL_LOG("i is %d",i);
         }
     }
 
+       LVGL_LOG("-----------cache end---------------");
+
     /*Close the decoder to reuse if it was opened (has a valid source)*/
     if(cached_src->dec_dsc.src) {
         lv_img_decoder_close(&cached_src->dec_dsc);
index 13050b8..76aff5e 100644 (file)
@@ -360,10 +360,35 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder
     }
 
     lv_img_cf_t cf = dsc->header.cf;
+    /*Process A8,  RGB565A8, need load file to ram after https://github.com/lvgl/lvgl/pull/3337*/
+    if(cf == LV_IMG_CF_ALPHA_8BIT || cf == LV_IMG_CF_RGB565A8) {
+        if(dsc->src_type == LV_IMG_SRC_VARIABLE) {
+            /*In case of uncompressed formats the image stored in the ROM/RAM.
+             *So simply give its pointer*/
+            dsc->img_data = ((lv_img_dsc_t *)dsc->src)->data;
+            return LV_RES_OK;
+        }
+        else {
+            /*If it's a file, read all to memory*/
+            uint32_t len = dsc->header.w * dsc->header.h;
+            len *= cf == LV_IMG_CF_RGB565A8 ? 3 : 1;
+            uint8_t * fs_buf = lv_mem_alloc(len);
+            if(fs_buf == NULL) return LV_RES_INV;
+
+            lv_img_decoder_built_in_data_t * user_data = dsc->user_data;
+            lv_fs_seek(&user_data->f, 4, LV_FS_SEEK_SET); /*+4 to skip the header*/
+            lv_fs_res_t res = lv_fs_read(&user_data->f, fs_buf, len, NULL);
+            if(res != LV_FS_RES_OK) {
+                lv_mem_free(fs_buf);
+                return LV_RES_INV;
+            }
+            dsc->img_data = fs_buf;
+            return LV_RES_OK;
+        }
+    }
     /*Process true color formats*/
-    if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA ||
-       cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || cf == LV_IMG_CF_RGB565A8 ||
-       cf == LV_IMG_CF_ALPHA_8BIT) {
+    else if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA ||
+            cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) {
         if(dsc->src_type == LV_IMG_SRC_VARIABLE) {
             /*In case of uncompressed formats the image stored in the ROM/RAM.
              *So simply give its pointer*/
index b12866d..e92ebf1 100644 (file)
@@ -40,7 +40,7 @@ extern const uint8_t _lv_bpp8_opa_table[256];
  *   STATIC FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
                                                      const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p)
 {
 
index 908909d..715cdd2 100644 (file)
     #error "Cannot use DMA2D with LV_COLOR_DEPTH other than 16 or 32"
 #endif
 
+/**********************
+ *  STATIC PROTOTYPES
+ **********************/
+static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx,
+                                            void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
+                                            void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
+static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
+                                            const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format);
+static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format);
+static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2);
+
+LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx);
+LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
+                                                       const lv_area_t * src_area, const void * src);
+LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride,
+                                                           const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa);
+LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride,
+                                                          const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa,
+                                                          dma2d_color_format_t src_color_format, bool ignore_src_alpha);
+LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride,
+                                                            const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset,
+                                                            lv_color_t color, lv_opa_t opa);
+LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride,
+                                                            const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset);
+LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv);
+LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void);
+LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset,
+                                                                lv_coord_t width, lv_coord_t height, uint8_t pixel_size);
+LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width,
+                                                           lv_coord_t height, uint8_t pixel_size);
+LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void);
+LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void);
+LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void);
+
 static bool isDma2dInProgess = false; // indicates whether DMA2D transfer *initiated here* is in progress
 
 /**
@@ -276,9 +311,8 @@ static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t co
     }
 }
 
-static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
-                                        const lv_area_t * src_area,
-                                        const void * src)
+LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
+                                                       const lv_area_t * src_area, const void * src)
 {
     //if(lv_img_src_get_type(src) != LV_IMG_SRC_VARIABLE) return LV_RES_INV;
     return LV_RES_INV;
@@ -315,7 +349,7 @@ static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_
     return LV_RES_OK;
 }
 
-static void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx)
+LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx)
 {
     lv_disp_t * disp = _lv_refr_get_disp_refreshing();
     _lv_gpu_stm32_dma2d_await_dma_transfer_finish(disp->driver);
index 5ecce6d..0a97042 100644 (file)
@@ -53,40 +53,6 @@ struct _lv_disp_drv_t;
 void lv_draw_stm32_dma2d_init(void);
 void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
 void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx);
-static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
-static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx,
-                                            void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area,
-                                            void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area);
-static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
-                                        const lv_area_t * src_area, const void * src);
-static void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx);
-static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc,
-                                            const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format);
-static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format);
-static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2);
-
-/**********************
- *  STATIC PROTOTYPES
- **********************/
-LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride,
-                                                           const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa);
-LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride,
-                                                          const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa,
-                                                          dma2d_color_format_t src_color_format, bool ignore_src_alpha);
-LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride,
-                                                            const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset,
-                                                            lv_color_t color, lv_opa_t opa);
-LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride,
-                                                            const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset);
-LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv);
-LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void);
-LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset,
-                                                                lv_coord_t width, lv_coord_t height, uint8_t pixel_size);
-LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width,
-                                                           lv_coord_t height, uint8_t pixel_size);
-LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void);
-LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void);
-LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void);
 
 /**********************
  *      MACROS
index 1618649..0f6d46b 100644 (file)
@@ -61,11 +61,13 @@ void lv_draw_sw_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, con
 void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p,
                        uint32_t letter);
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
-                                                  const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                                        const lv_draw_img_dsc_t * draw_dsc,
+                                                        const lv_area_t * coords, const uint8_t * src_buf,
+                                                        lv_img_cf_t cf);
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
-                                           const lv_point_t * point1, const lv_point_t * point2);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+                                                 const lv_point_t * point1, const lv_point_t * point2);
 
 void lv_draw_sw_polygon(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * draw_dsc,
                         const lv_point_t * points, uint16_t point_cnt);
index a31d64a..a7c4313 100644 (file)
 static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_coord_t dest_stride,
                         lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stide);
 
-LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
-                                              lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+static void /* LV_ATTRIBUTE_FAST_MEM */ fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                                    lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa,
+                                                    const lv_opa_t * mask, lv_coord_t mask_stride);
 
 
 #if LV_COLOR_SCREEN_TRANSP
-LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
-                                            lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+static void /* LV_ATTRIBUTE_FAST_MEM */ fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                                  lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa,
+                                                  const lv_opa_t * mask, lv_coord_t mask_stride);
 #endif /*LV_COLOR_SCREEN_TRANSP*/
 
 #if LV_DRAW_COMPLEX
@@ -41,15 +43,19 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_
 #endif  /*LV_DRAW_COMPLEX*/
 
 static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                       const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+                       const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
+                       const lv_opa_t * mask, lv_coord_t mask_stride);
 
-LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                                             const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride);
+static void /* LV_ATTRIBUTE_FAST_MEM */ map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                                   lv_coord_t dest_stride, const lv_color_t * src_buf,
+                                                   lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask,
+                                                   lv_coord_t mask_stride);
 
 #if LV_COLOR_SCREEN_TRANSP
-LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                                           const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
-                                           const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode);
+static void /* LV_ATTRIBUTE_FAST_MEM */ map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                                 lv_coord_t dest_stride, const lv_color_t * src_buf,
+                                                 lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask,
+                                                 lv_coord_t mask_stride, lv_blend_mode_t blend_mode);
 
 #endif /*LV_COLOR_SCREEN_TRANSP*/
 
@@ -101,7 +107,8 @@ void lv_draw_sw_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * d
     ((lv_draw_sw_ctx_t *)draw_ctx)->blend(draw_ctx, dsc);
 }
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_basic(lv_draw_ctx_t * draw_ctx,
+                                                  const lv_draw_sw_blend_dsc_t * dsc)
 {
     lv_opa_t * mask;
     if(dsc->mask_buf == NULL) mask = NULL;
@@ -237,8 +244,9 @@ static void fill_set_px(lv_color_t * dest_buf, const lv_area_t * blend_area, lv_
     }
 }
 
-LV_ATTRIBUTE_FAST_MEM static void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
-                                              lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
+static LV_ATTRIBUTE_FAST_MEM void fill_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                              lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa,
+                                              const lv_opa_t * mask, lv_coord_t mask_stride)
 {
     int32_t w = lv_area_get_width(dest_area);
     int32_t h = lv_area_get_height(dest_area);
@@ -442,8 +450,9 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o
 
 }
 
-LV_ATTRIBUTE_FAST_MEM static void fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
-                                            lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
+static void LV_ATTRIBUTE_FAST_MEM fill_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                            lv_coord_t dest_stride, lv_color_t color, lv_opa_t opa,
+                                            const lv_opa_t * mask, lv_coord_t mask_stride)
 {
     uint8_t * dest_buf8 = (uint8_t *) dest_buf;
     int32_t w = lv_area_get_width(dest_area);
@@ -599,7 +608,8 @@ static void fill_blended(lv_color_t * dest_buf, const lv_area_t * dest_area,
 #endif
 
 static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                       const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
+                       const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
+                       const lv_opa_t * mask, lv_coord_t mask_stride)
 
 {
     lv_disp_t * disp = _lv_refr_get_disp_refreshing();
@@ -633,8 +643,10 @@ static void map_set_px(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_co
     }
 }
 
-LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                                             const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask, lv_coord_t mask_stride)
+static void LV_ATTRIBUTE_FAST_MEM map_normal(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                             lv_coord_t dest_stride, const lv_color_t * src_buf,
+                                             lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask,
+                                             lv_coord_t mask_stride)
 
 {
     int32_t w = lv_area_get_width(dest_area);
@@ -729,9 +741,10 @@ LV_ATTRIBUTE_FAST_MEM static void map_normal(lv_color_t * dest_buf, const lv_are
 
 
 #if LV_COLOR_SCREEN_TRANSP
-LV_ATTRIBUTE_FAST_MEM static void map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride,
-                                           const lv_color_t * src_buf, lv_coord_t src_stride, lv_opa_t opa,
-                                           const lv_opa_t * mask, lv_coord_t mask_stride, lv_blend_mode_t blend_mode)
+static void LV_ATTRIBUTE_FAST_MEM map_argb(lv_color_t * dest_buf, const lv_area_t * dest_area,
+                                           lv_coord_t dest_stride, const lv_color_t * src_buf,
+                                           lv_coord_t src_stride, lv_opa_t opa, const lv_opa_t * mask,
+                                           lv_coord_t mask_stride, lv_blend_mode_t blend_mode)
 
 {
     uint8_t * dest_buf8 = (uint8_t *) dest_buf;
index 9a00e53..3158d98 100644 (file)
@@ -56,7 +56,8 @@ void lv_draw_sw_blend(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_d
  * @param draw_ctx      pointer to a draw context
  * @param dsc           pointer to an initialized blend descriptor
  */
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_basic(struct _lv_draw_ctx_t * draw_ctx,
+                                                        const lv_draw_sw_blend_dsc_t * dsc);
 
 /**********************
  *      MACROS
index ff9ebf3..68fd2db 100644 (file)
@@ -17,7 +17,7 @@
 
 #if _DITHER_GRADIENT
 
-LV_ATTRIBUTE_FAST_MEM void lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
+void LV_ATTRIBUTE_FAST_MEM lv_dither_none(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
 {
     LV_UNUSED(x);
     LV_UNUSED(y);
@@ -40,7 +40,7 @@ static const uint8_t dither_ordered_threshold_matrix[8 * 8] = {
 }; /* Shift by 6 to normalize */
 
 
-LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
+void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
 {
     LV_UNUSED(x);
     /* For vertical dithering, the error is spread on the next column (and not next line).
@@ -63,7 +63,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(lv_grad_t * grad, lv_coord_t x,
         grad->map[j] = lv_color_hex(t.full);
     }
 }
-LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
+
+void LV_ATTRIBUTE_FAST_MEM lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w)
 {
     /* For vertical dithering, the error is spread on the next column (and not next line).
        Since the renderer is scanline based, it's not obvious what could be used to perform the rendering efficiently.
@@ -97,9 +98,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(lv_grad_t * grad, lv_coord_t x,
     }
 }
 
-
 #if LV_DITHER_ERROR_DIFFUSION == 1
-LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w)
+void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w)
 {
     LV_UNUSED(xs);
     LV_UNUSED(y);
@@ -153,7 +153,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(lv_grad_t * grad, lv_coord_t x
     grad->map[grad->size - 1] = lv_color_hex(grad->hmap[grad->size - 1].full);
 }
 
-LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w)
+void LV_ATTRIBUTE_FAST_MEM lv_dither_err_diff_ver(lv_grad_t * grad, lv_coord_t xs, lv_coord_t y, lv_coord_t w)
 {
     /* Try to implement error diffusion on a vertical gradient and an horizontal map using those tricks:
         Since the given hi-resolution gradient (in src) is vertical, the Floyd Steinberg algorithm pass need to be rotated,
index 6362c5a..17f98f9 100644 (file)
@@ -45,18 +45,19 @@ typedef void (*lv_dither_func_t)(struct _lv_gradient_cache_t * grad, lv_coord_t
  **********************/
 #if LV_DRAW_COMPLEX
 #if _DITHER_GRADIENT
-LV_ATTRIBUTE_FAST_MEM void lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y, lv_coord_t w);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_none(struct _lv_gradient_cache_t * grad, lv_coord_t x, lv_coord_t y,
+                                                lv_coord_t w);
 
-LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
-                                                 const lv_coord_t y, const lv_coord_t w);
-LV_ATTRIBUTE_FAST_MEM void lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
-                                                 const lv_coord_t y, const lv_coord_t w);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
+                                                       const lv_coord_t y, const lv_coord_t w);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_ordered_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
+                                                       const lv_coord_t y, const lv_coord_t w);
 
 #if LV_DITHER_ERROR_DIFFUSION == 1
-LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
-                                                  const lv_coord_t y, const lv_coord_t w);
-LV_ATTRIBUTE_FAST_MEM void lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
-                                                  const lv_coord_t y, const lv_coord_t w);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_hor(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
+                                                        const lv_coord_t y, const lv_coord_t w);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_dither_err_diff_ver(struct _lv_gradient_cache_t * grad, const lv_coord_t xs,
+                                                        const lv_coord_t y, const lv_coord_t w);
 #endif /* LV_DITHER_ERROR_DIFFUSION */
 
 #endif /* _DITHER_GRADIENT */
index 4e46632..efa158c 100644 (file)
@@ -293,7 +293,7 @@ lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, lv_coord_t w, lv_coord_t h)
     return item;
 }
 
-LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range,
+lv_grad_color_t LV_ATTRIBUTE_FAST_MEM lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range,
                                                             lv_coord_t frac)
 {
     lv_grad_color_t tmp;
index f5f3215..95a3c4e 100644 (file)
@@ -69,8 +69,8 @@ typedef struct _lv_gradient_cache_t {
  * @param range     The range to use in computation.
  * @param frac      The current part used in the range. frac is in [0; range]
  */
-LV_ATTRIBUTE_FAST_MEM lv_grad_color_t lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range,
-                                                            lv_coord_t frac);
+lv_grad_color_t /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_calculate(const lv_grad_dsc_t * dsc, lv_coord_t range,
+                                                                  lv_coord_t frac);
 
 /**
  * Set the gradient cache size
index 9578bc7..7181c15 100644 (file)
@@ -42,8 +42,10 @@ static void convert_cb(const lv_area_t * dest_area, const void * src_buf, lv_coo
  **********************/
 
 
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * draw_dsc,
-                                                  const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t cf)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_img_decoded(struct _lv_draw_ctx_t * draw_ctx,
+                                                  const lv_draw_img_dsc_t * draw_dsc,
+                                                  const lv_area_t * coords, const uint8_t * src_buf,
+                                                  lv_img_cf_t cf)
 {
     /*Use the clip area as draw area*/
     lv_area_t draw_area;
index 7caa749..d0da8bc 100644 (file)
@@ -27,8 +27,8 @@
  *  STATIC PROTOTYPES
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
-                                                     const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+                                                           const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p);
 
 
 #if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX
@@ -162,7 +162,7 @@ void lv_draw_sw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc
  *   STATIC FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc,
                                                      const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p)
 {
 
index 73833c1..c666891 100644 (file)
  *  STATIC PROTOTYPES
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
-                                                 const lv_point_t * point1, const lv_point_t * point2);
-LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
-                                                const lv_point_t * point1, const lv_point_t * point2);
-LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
-                                                const lv_point_t * point1, const lv_point_t * point2);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+                                                       const lv_point_t * point1, const lv_point_t * point2);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+                                                      const lv_point_t * point1, const lv_point_t * point2);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+                                                      const lv_point_t * point1, const lv_point_t * point2);
 
 /**********************
  *  STATIC VARIABLES
@@ -49,7 +49,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx
  * @param clip the line will be drawn only in this area
  * @param dsc pointer to an initialized `lv_draw_line_dsc_t` variable
  */
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
                                            const lv_point_t * point1, const lv_point_t * point2)
 {
     if(dsc->width == 0) return;
@@ -109,7 +109,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_line(struct _lv_draw_ctx_t * draw_ctx, con
  **********************/
 
 
-LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
                                                 const lv_point_t * point1, const lv_point_t * point2)
 {
     int32_t w = dsc->width - 1;
@@ -195,7 +195,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(struct _lv_draw_ctx_t * draw_ctx
 #endif /*LV_DRAW_COMPLEX*/
 }
 
-LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
                                                 const lv_point_t * point1, const lv_point_t * point2)
 {
     int32_t w = dsc->width - 1;
@@ -275,7 +275,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(struct _lv_draw_ctx_t * draw_ctx
 #endif /*LV_DRAW_COMPLEX*/
 }
 
-LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(struct _lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc,
                                                  const lv_point_t * point1, const lv_point_t * point2)
 {
 #if LV_DRAW_COMPLEX
index 706ec6b..a1e620b 100644 (file)
@@ -35,11 +35,11 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc
 static void draw_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords);
 
 #if LV_DRAW_COMPLEX
-LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
-                                              const lv_area_t * coords);
-LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t s,
-                                                         lv_coord_t r);
-LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+                                                    const lv_area_t * coords);
+static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf,
+                                                               lv_coord_t s, lv_coord_t r);
+static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf);
 #endif
 
 void draw_border_generic(lv_draw_ctx_t * draw_ctx, const lv_area_t * outer_area, const lv_area_t * inner_area,
@@ -430,7 +430,7 @@ static void draw_border(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc
 }
 
 #if LV_DRAW_COMPLEX
-LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_shadow(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dsc,
                                               const lv_area_t * coords)
 {
     /*Check whether the shadow is visible*/
@@ -950,8 +950,8 @@ LV_ATTRIBUTE_FAST_MEM static void draw_shadow(lv_draw_ctx_t * draw_ctx, const lv
  * @param sw shadow width
  * @param r radius
  */
-LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, lv_coord_t sw,
-                                                         lv_coord_t r)
+static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf,
+                                                         lv_coord_t sw, lv_coord_t r)
 {
     int32_t sw_ori = sw;
     int32_t size = sw_ori  + r;
@@ -1037,7 +1037,7 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord
 
 }
 
-LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf)
+static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(lv_coord_t size, lv_coord_t sw, uint16_t * sh_ups_buf)
 {
     int32_t s_left = sw >> 1;
     int32_t s_right = (sw >> 1);
index 4bf6602..35a3d8b 100644 (file)
 #include FT_SIZES_H
 #include FT_IMAGE_H
 #include FT_OUTLINE_H
+#include "helios_debug.h"
+#if 0
+#define QPY_FREETYPE_LOG(msg, ...)      custom_log("FREETYPE", msg, ##__VA_ARGS__)
+#else
+#define QPY_FREETYPE_LOG(msg, ...)
+#endif
 
 /*********************
  *      DEFINES
@@ -101,7 +107,7 @@ bool lv_freetype_init(uint16_t max_faces, uint16_t max_sizes, uint32_t max_bytes
 {
     FT_Error error = FT_Init_FreeType(&library);
     if(error) {
-        LV_LOG_ERROR("init freeType error(%d)", error);
+        QPY_FREETYPE_LOG("init freeType error(%d)", error);
         return false;
     }
 
@@ -112,26 +118,26 @@ bool lv_freetype_init(uint16_t max_faces, uint16_t max_sizes, uint32_t max_bytes
                             max_bytes, font_face_requester, NULL, &cache_manager);
     if(error) {
         FT_Done_FreeType(library);
-        LV_LOG_ERROR("Failed to open cache manager");
+        QPY_FREETYPE_LOG("Failed to open cache manager");
         return false;
     }
 
     error = FTC_CMapCache_New(cache_manager, &cmap_cache);
     if(error) {
-        LV_LOG_ERROR("Failed to open Cmap Cache");
+        QPY_FREETYPE_LOG("Failed to open Cmap Cache");
         goto Fail;
     }
 
 #if LV_FREETYPE_SBIT_CACHE
     error = FTC_SBitCache_New(cache_manager, &sbit_cache);
     if(error) {
-        LV_LOG_ERROR("Failed to open sbit cache");
+        QPY_FREETYPE_LOG("Failed to open sbit cache");
         goto Fail;
     }
 #else
     error = FTC_ImageCache_New(cache_manager, &image_cache);
     if(error) {
-        LV_LOG_ERROR("Failed to open image cache");
+        QPY_FREETYPE_LOG("Failed to open image cache");
         goto Fail;
     }
 #endif
@@ -196,7 +202,7 @@ static FT_Error font_face_requester(FTC_FaceID face_id,
         error = FT_New_Face(library, dsc->name, 0, aface);
     }
     if(error) {
-        LV_LOG_ERROR("FT_New_Face error:%d\n", error);
+        QPY_FREETYPE_LOG("FT_New_Face error:%d\n", error);
         return error;
     }
     return FT_Err_Ok;
@@ -291,7 +297,7 @@ static bool get_glyph_dsc_cb_cache(const lv_font_t * font,
 #if LV_FREETYPE_SBIT_CACHE
     FT_Error error = FTC_SBitCache_Lookup(sbit_cache, &desc_type, glyph_index, &sbit, NULL);
     if(error) {
-        LV_LOG_ERROR("SBitCache_Lookup error");
+        QPY_FREETYPE_LOG("SBitCache_Lookup error");
         return false;
     }
 
@@ -304,11 +310,11 @@ static bool get_glyph_dsc_cb_cache(const lv_font_t * font,
 #else
     FT_Error error = FTC_ImageCache_Lookup(image_cache, &desc_type, glyph_index, &image_glyph, NULL);
     if(error) {
-        LV_LOG_ERROR("ImageCache_Lookup error");
+        QPY_FREETYPE_LOG("ImageCache_Lookup error");
         return false;
     }
     if(image_glyph->format != FT_GLYPH_FORMAT_BITMAP) {
-        LV_LOG_ERROR("Glyph_To_Bitmap error");
+        QPY_FREETYPE_LOG("Glyph_To_Bitmap error");
         return false;
     }
 
@@ -373,7 +379,7 @@ static bool lv_ft_font_init_cache(lv_ft_info_t * info)
     scaler.pixel = 1;
     FT_Error error = FTC_Manager_LookupSize(cache_manager, &scaler, &face_size);
     if(error) {
-        LV_LOG_ERROR("Failed to LookupSize");
+        QPY_FREETYPE_LOG("Failed to LookupSize");
         goto Fail;
     }
 
@@ -454,7 +460,7 @@ static void face_generic_finalizer(void * object)
 {
     FT_Face face = (FT_Face)object;
     face_remove_from_list(face);
-    LV_LOG_INFO("face finalizer(%p)\n", face);
+    QPY_FREETYPE_LOG("face finalizer(%p)\n", face);
 }
 
 static bool get_glyph_dsc_cb_nocache(const lv_font_t * font,
@@ -555,7 +561,7 @@ static bool lv_ft_font_init_nocache(lv_ft_info_t * info)
             error = FT_New_Face(library, dsc->name, 0, &face);
         }
         if(error) {
-            LV_LOG_WARN("create face error(%d)", error);
+            QPY_FREETYPE_LOG("create face error(%d)", error);
             goto Fail;
         }
 
@@ -653,7 +659,7 @@ static void name_refer_del(const char * name)
         refer = _lv_ll_get_next(&names_ll, refer);
     }
 
-    LV_LOG_WARN("name_in_names_del error(not find:%p).", name);
+    QPY_FREETYPE_LOG("name_in_names_del error(not find:%p).", name);
 }
 
 /**
@@ -680,8 +686,129 @@ static const char * name_refer_save(const char * name)
         _lv_ll_remove(&names_ll, refer);
         lv_mem_free(refer);
     }
-    LV_LOG_WARN("save_name_to_names error(not memory).");
+    QPY_FREETYPE_LOG("save_name_to_names error(not memory).");
     return "";
 }
 
+
+
+//add for third party software
+/* return file instead of fd, following lv_fs */
+FILE *ft2_fopen(const char *path, const char *mode)
+{
+  lv_fs_file_t *fp = lv_mem_alloc(sizeof(lv_fs_file_t));
+
+  (void)mode;
+  QPY_FREETYPE_LOG("%s: file %s\n", __func__, path);
+
+  lv_fs_res_t res = lv_fs_open(fp, path, LV_FS_MODE_RD);
+  if(res != LV_FS_RES_OK) {
+      QPY_FREETYPE_LOG("[%s] error,path = %s,errno = %d !!!\n", __func__, path, res);
+      return NULL;
+  }
+  QPY_FREETYPE_LOG ("[%s]: file =%p, path=%s\n",__FUNCTION__, fp, path);
+
+  return (FILE*)fp;
+}
+
+int ft2_fclose(FILE *fp)
+{
+  lv_fs_file_t *file = (lv_fs_file_t *)fp;
+
+  if(!file){
+      QPY_FREETYPE_LOG("[%s]: file is null\n", __func__);
+      return -1;
+  }
+
+  lv_res_t res = lv_fs_close(file);
+  lv_mem_free(file);
+
+  if(LV_FS_RES_OK != res) {
+      QPY_FREETYPE_LOG("[%s]: failed\n", __func__);
+      return -1;
+  }
+
+  QPY_FREETYPE_LOG ("[%s]: file %p\n",__FUNCTION__, file);
+  return 0;
+}
+
+size_t ft2_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  uint32_t rn = 0;
+  lv_fs_file_t *file = (lv_fs_file_t *)stream;
+
+  QPY_FREETYPE_LOG("ft2_fread: file=%p, len=0x%x\n", file, (size * nmemb));
+  /*lv_freetype.c FT2_read has normal case: len = 0 and buf=NULL */
+  if(size * nmemb == 0 || ptr == NULL) {
+      return size * nmemb;
+  }
+
+  lv_fs_read(file, ptr, (size * nmemb), &rn);
+
+  return rn;
+}
+
+size_t ft2_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
+{
+  uint32_t rn = 0;
+  lv_fs_file_t *file = (lv_fs_file_t *)stream;
+
+  lv_fs_write(file, ptr, (size * nmemb), &rn);
+
+  return rn;
+}
+
+long ft2_ftell(FILE *stream)
+{
+  lv_fs_file_t *file = (lv_fs_file_t *)stream;
+  uint32_t pos = 0;
+
+  lv_fs_tell(file, &pos);
+  QPY_FREETYPE_LOG("[%s]: file %p, pos=0x%x\n",__FUNCTION__, file, (unsigned)pos);
+
+  return pos;
+}
+
+int ft2_fseek(FILE *stream, long offset, int whence)
+{
+  lv_fs_file_t *file = (lv_fs_file_t *)stream;
+
+  if(LV_FS_RES_OK != lv_fs_seek(file, offset, whence)) {
+    QPY_FREETYPE_LOG("%s, failed", __func__);
+    return -1;
+  }
+  QPY_FREETYPE_LOG("[%s]: file =%p, offset=0x%x\n",__FUNCTION__, file, (unsigned)offset);
+
+  return 0;
+}
+
+
+void ASR_FREE(void *p) {
+    lv_mem_free(p);
+}
+
+void * ASR_MALLOC(unsigned long size)
+{
+    void * p = lv_mem_alloc(size);
+    return p;
+}
+
+void * ASR_REALLOC(void *p, unsigned long size)
+{
+    uint32_t old_size = _lv_mem_get_size(p);
+    if(old_size == size) return p; /*Also avoid reallocating the same memory*/
+
+    void * data_p = lv_mem_alloc(size);
+    if(data_p != NULL) {
+        /*Copy the old data to the new. Use the smaller size*/
+        if(old_size != 0) {
+            _lv_memcpy(data_p, p, LV_MATH_MIN(size, old_size));
+            lv_mem_free(p);
+        }
+    }
+
+    return data_p;
+}
+
+
 #endif /*LV_USE_FREETYPE*/
index 0a98355..3609a70 100644 (file)
@@ -51,7 +51,7 @@ typedef  QDIR * dir_t;
 
 
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 extern int Helios_frename(const char *old_path, const char *new_path);
 extern int Helios_frmdir(const char *path);
 extern int Helios_fmkdir(const char *path, uint16_t mode);
@@ -117,7 +117,7 @@ void lv_fs_if_helios_init(void)
        fs_drv.seek_cb = fs_seek;
        fs_drv.tell_cb = fs_tell;
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        fs_drv.dir_close_cb = fs_dir_close;
        fs_drv.dir_open_cb = fs_dir_open;
        fs_drv.dir_read_cb = fs_dir_read;
@@ -150,7 +150,7 @@ void lv_fs_if_helios_bak_init(void)
        fs_drv.seek_cb = fs_seek;
        fs_drv.tell_cb = fs_tell;
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        fs_drv.dir_close_cb = fs_dir_close;
        fs_drv.dir_open_cb = fs_dir_open;
        fs_drv.dir_read_cb = fs_dir_read;
@@ -185,7 +185,7 @@ void lv_fs_if_helios_SD_init(void)
        fs_drv.seek_cb = fs_seek;
        fs_drv.tell_cb = fs_tell;
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        fs_drv.dir_close_cb = fs_dir_close;
        fs_drv.dir_open_cb = fs_dir_open;
        fs_drv.dir_read_cb = fs_dir_read;
@@ -222,7 +222,7 @@ void lv_fs_if_helios_extflash_init(void)
        fs_drv.seek_cb = fs_seek;
        fs_drv.tell_cb = fs_tell;
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        fs_drv.dir_close_cb = fs_dir_close;
        fs_drv.dir_open_cb = fs_dir_open;
        fs_drv.dir_read_cb = fs_dir_read;
@@ -271,7 +271,7 @@ static void * fs_open (lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
        
        LV_LOG_INFO("open path is %s, str is %s flags is %s\n", path, buf, flags);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        HeliosFILE* f = Helios_MP_fopen(buf,flags);
 #else
        HeliosFILE* f = Helios_fopen(buf,flags);
@@ -325,7 +325,7 @@ static void * fs_sd_open (lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mod
 static lv_fs_res_t fs_close (lv_fs_drv_t * drv, void * file_p)
 {
        LV_UNUSED(drv);
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        Helios_MP_fclose((HeliosFILE*)file_p);
 #else
        Helios_fclose((HeliosFILE*)file_p);
@@ -347,7 +347,7 @@ static lv_fs_res_t fs_read (lv_fs_drv_t * drv, void * file_p, void * buf, uint32
 {
        LV_UNUSED(drv);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        *br = Helios_MP_fread(buf, 1, btr, (HeliosFILE*)file_p);
 #else
        *br = Helios_fread(buf, 1, btr, (HeliosFILE*)file_p);
@@ -370,7 +370,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
        LV_UNUSED(drv);
        file_t * fp = file_p;        /*Just avoid the confusing casings*/
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        *bw = Helios_MP_fwrite(buf, 1, btw, (HeliosFILE*)file_p);
 #else
        *bw = Helios_fwrite(buf, 1, btw, (HeliosFILE*)file_p);
@@ -390,7 +390,7 @@ static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf,
 static lv_fs_res_t fs_seek (lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence)
 {
        LV_UNUSED(drv);
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        Helios_MP_fseek((HeliosFILE*)file_p, pos, whence);
 #else
        Helios_fseek((HeliosFILE*)file_p, pos, whence);
@@ -412,7 +412,7 @@ static lv_fs_res_t fs_tell (lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
 {
        LV_UNUSED(drv);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        *pos_p = Helios_MP_ftell((HeliosFILE*)file_p);
 #else
        *pos_p = Helios_ftell((HeliosFILE*)file_p);
@@ -428,7 +428,7 @@ static lv_fs_res_t fs_tell (lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
  * @param path path to a directory
  * @return LV_FS_RES_OK or any error from lv_fs_res_t enum
  */
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 static void * fs_dir_open(lv_fs_drv_t * drv, const char * path)
 {
        LV_UNUSED(drv);
index b1661e4..325ae0b 100644 (file)
@@ -29,7 +29,7 @@ static void lv_ime_pinyin_style_change_event(lv_event_t * e);
 static void lv_ime_pinyin_kb_event(lv_event_t * e);
 static void lv_ime_pinyin_cand_panel_event(lv_event_t * e);
 
-static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict);
+static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict);
 static void pinyin_input_proc(lv_obj_t * obj);
 static void pinyin_page_proc(lv_obj_t * obj, uint16_t btn);
 static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * cand_num);
@@ -57,14 +57,15 @@ const lv_obj_class_t lv_ime_pinyin_class = {
 };
 
 #if LV_IME_PINYIN_USE_K9_MODE
-static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 20] = {\
+
+static char * lv_btnm_def_pinyin_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 21] = {\
                                                                                 ",\0", "1#\0",  "abc \0", "def\0",  LV_SYMBOL_BACKSPACE"\0", "\n\0",
                                                                                 ".\0", "ghi\0", "jkl\0", "mno\0",  LV_SYMBOL_KEYBOARD"\0", "\n\0",
                                                                                 "?\0", "pqrs\0", "tuv\0", "wxyz\0",  LV_SYMBOL_NEW_LINE"\0", "\n\0",
                                                                                 LV_SYMBOL_LEFT"\0", "\0"
                                                                                };
 
-static lv_btnmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 16] = { 1 };
+static lv_btnmatrix_ctrl_t default_kb_ctrl_k9_map[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 17] = { 1 };
 static char   lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 2][LV_IME_PINYIN_K9_MAX_INPUT] = {0};
 #endif
 
@@ -73,327 +74,405 @@ static char * lv_btnm_def_pinyin_sel_map[LV_IME_PINYIN_CAND_TEXT_NUM + 3];
 
 #if LV_IME_PINYIN_USE_DEFAULT_DICT
 lv_pinyin_dict_t lv_ime_pinyin_def_dict[] = {
-    { "a", "啊" },
-    { "ai", "愛" },
-    { "an", "安暗案" },
-    { "ba", "吧把爸八" },
-    { "bai", "百白敗" },
-    { "ban", "半般辦" },
-    { "bang", "旁" },
-    { "bao", "保薄包報" },
-    { "bei", "被背悲北杯備" },
-    { "ben", "本" },
-    { "bi", "必比避鼻彼筆秘閉" },
-    { "bian", "便邊變変辺" },
-    { "biao", "表標" },
-    { "bie", "別" },
-    { "bing", "病並氷" },
-    { "bo", "波薄泊" },
-    { "bu", "不布步部捕補歩" },
-    { "ca", "察" },
-    { "cai", "才材菜財採" },
-    { "can", "参残參" },
-    { "ce", "策側" },
-    { "ceng", "曾" },
-    { "cha", "差查茶" },
-    { "chai", "差" },
-    { "chan", "產産單" },
-    { "chang", "場廠" },
-    { "chao", "超朝" },
-    { "che", "車" },
-    { "cheng", "成程乗" },
-    { "chi", "尺吃持赤池遅歯" },
-    { "chong", "充种重種" },
-    { "chu", "出初楚触處処" },
-    { "chuan", "川船傳" },
-    { "chuang", "創窓" },
-    { "chun", "春" },
-    { "ci", "此次辞差" },
-    { "cong", "從従" },
-    { "cu", "卒" },
-    { "cun", "存村" },
-    { "cuo", "錯" },
-    { "da", "大打答達" },
-    { "dai", "代待帯帶貸" },
-    { "dan", "但担擔誕單単" },
-    { "dang", "当党當黨" },
-    { "dao", "到道盗導島辺" },
-    { "de", "的得" },
-    { "dei", "" },
-    { "deng", "等" },
-    { "di", "地得低底弟第締" },
-    { "dian", "点电店點電" },
-    { "diao", "調" },
-    { "ding", "定町" },
-    { "dong", "冬東動働凍" },
-    { "du", "独度都渡読" },
-    { "duan", "段断短斷" },
-    { "dui", "對対" },
-    { "duo", "多駄" },
-    { "e", "嗯悪" },
-    { "en", "嗯" },
-    { "er", "而耳二兒" },
-    { "fa", "乏法發発髪" },
-    { "fan", "反返犯番仮販飯範払" },
-    { "fang", "方放房坊訪" },
-    { "fei", "非飛費" },
-    { "fen", "分份" },
-    { "feng", "風豐" },
-    { "fou", "否不" },
-    { "fu", "父夫富服符付附府幅婦復複負払" },
-    { "gai", "改概該" },
-    { "gan", "甘感敢" },
-    { "gang", "港剛" },
-    { "gao", "告高" },
-    { "ge", "各格歌革割個" },
-    { "gei", "給" },
-    { "gen", "跟根" },
-    { "geng", "更" },
-    { "gong", "工共供功公" },
-    { "gou", "夠構溝" },
-    { "gu", "古故鼓" },
-    { "guai", "掛" },
-    { "guan", "官管慣館觀関關" },
-    { "guang", "光広" },
-    { "gui", "規帰" },
-    { "guo", "果国裏菓國過" },
-    { "hai", "孩海害還" },
-    { "han", "寒漢" },
-    { "hang", "航行" },
-    { "hao", "好号" },
-    { "he", "合和喝何荷" },
-    { "hei", "黒" },
-    { "hen", "很" },
-    { "heng", "行横" },
-    { "hou", "厚喉候後" },
-    { "hu", "乎呼湖護" },
-    { "hua", "化画花話畫劃" },
-    { "huai", "壊劃" },
-    { "huan", "緩環歡還換" },
-    { "huang", "黄" },
-    { "hui", "回会慧絵揮會" },
-    { "hun", "混婚" },
-    { "huo", "活或火獲" },
-    { "i", "" },
-    { "ji", "己计及机既急季寄技即集基祭系奇紀積計記済幾際極繼績機濟" },
-    { "jia", "家加價" },
-    { "jian", "件建健肩見減間検簡漸" },
-    { "jiang", "降強講將港" },
-    { "jiao", "叫教交角覚覺較學" },
-    { "jie", "介借接姐皆届界解結階節價" },
-    { "jin", "今近禁金僅進" },
-    { "jing", "京境景静精經経" },
-    { "jiu", "就久九酒究" },
-    { "ju", "句具局居決挙據舉" },
-    { "jue", "角覚覺" },
-    { "jun", "均" },
-    { "kai", "開" },
-    { "kan", "看刊" },
-    { "kang", "康" },
-    { "kao", "考" },
-    { "ke", "可刻科克客渇課" },
-    { "ken", "肯" },
-    { "kong", "空控" },
-    { "kou", "口" },
-    { "ku", "苦庫" },
-    { "kuai", "快塊会會" },
-    { "kuang", "況" },
-    { "kun", "困" },
-    { "kuo", "括拡適" },
-    { "la", "拉啦落" },
-    { "lai", "来來頼" },
-    { "lao", "老絡落" },
-    { "le", "了楽樂" },
-    { "lei", "類" },
-    { "leng", "冷" },
-    { "li", "力立利理例礼離麗裡勵歷" },
-    { "lian", "連練臉聯" },
-    { "liang", "良量涼兩両" },
-    { "liao", "料" },
-    { "lie", "列" },
-    { "lin", "林隣賃" },
-    { "ling", "另令領" },
-    { "liu", "六留流" },
-    { "lu", "律路録緑陸履慮" },
-    { "lv", "旅" },
-    { "lun", "輪論" },
-    { "luo", "落絡" },
-    { "ma", "媽嗎嘛" },
-    { "mai", "買売" },
-    { "man", "滿" },
-    { "mang", "忙" },
-    { "mao", "毛猫貿" },
-    { "me", "麼" },
-    { "mei", "美妹每沒毎媒" },
-    { "men", "們" },
-    { "mi", "米密秘" },
-    { "mian", "免面勉眠" },
-    { "miao", "描" },
-    { "min", "民皿" },
-    { "ming", "命明名" },
-    { "mo", "末模麼" },
-    { "mou", "某" },
-    { "mu", "母木目模" },
-    { "na", "那哪拿內南" },
-    { "nan", "男南難" },
-    { "nao", "腦" },
-    { "ne", "那哪呢" },
-    { "nei", "内那哪內" },
-    { "neng", "能" },
-    { "ni", "你妳呢" },
-    { "nian", "年念" },
-    { "niang", "娘" },
-    { "nin", "您" },
-    { "ning", "凝" },
-    { "niu", "牛" },
-    { "nong", "農濃" },
-    { "nu", "女努" },
-    { "nuan", "暖" },
-    { "o", "" },
-    { "ou", "歐" },
-    { "pa", "怕" },
-    { "pian", "片便" },
-    { "pai", "迫派排" },
-    { "pan", "判番" },
-    { "pang", "旁" },
-    { "pei", "配" },
-    { "peng", "朋" },
-    { "pi", "疲否" },
-    { "pin", "品貧" },
-    { "ping", "平評" },
-    { "po", "迫破泊頗" },
-    { "pu", "普僕" },
-    { "qi", "起其奇七气期泣企妻契気" },
-    { "qian", "嵌浅千前鉛錢針" },
-    { "qiang", "強將" },
-    { "qiao", "橋繰" },
-    { "qie", "且切契" },
-    { "qin", "寝勤親" },
-    { "qing", "青清情晴輕頃請軽" },
-    { "qiu", "求秋球" },
-    { "qu", "去取趣曲區" },
-    { "quan", "全犬券" },
-    { "que", "缺確卻" },
-    { "ran", "然" },
-    { "rang", "讓" },
-    { "re", "熱" },
-    { "ren", "人任認" },
-    { "reng", "仍" },
-    { "ri", "日" },
-    { "rong", "容" },
-    { "rou", "弱若肉" },
-    { "ru", "如入" },
-    { "ruan", "軟" },
-    { "sai", "賽" },
-    { "san", "三" },
-    { "sao", "騒繰" },
-    { "se", "色" },
-    { "sen", "森" },
-    { "sha", "砂" },
-    { "shan", "善山單" },
-    { "shang", "上尚商" },
-    { "shao", "少紹" },
-    { "shaung", "雙" },
-    { "she", "社射設捨渉" },
-    { "shei", "誰" },
-    { "shen", "什申深甚身伸沈神" },
-    { "sheng", "生声昇勝乗聲" },
-    { "shi", "是失示食时事式十石施使世实史室市始柿氏士仕拭時視師試適実實識" },
-    { "shou", "手首守受授" },
-    { "shu", "束数暑殊樹書屬輸術" },
-    { "shui", "水説說誰" },
-    { "shuo", "数説說" },
-    { "si", "思寺司四私似死価" },
-    { "song", "送" },
-    { "su", "速宿素蘇訴" },
-    { "suan", "算酸" },
-    { "sui", "隨雖歲歳" },
-    { "sun", "孫" },
-    { "suo", "所" },
-    { "ta", "她他它牠" },
-    { "tai", "太台態臺" },
-    { "tan", "探談曇" },
-    { "tang", "糖" },
-    { "tao", "桃逃套討" },
-    { "te", "特" },
-    { "ti", "体提替題體戻" },
-    { "tian", "天田" },
-    { "tiao", "条條調" },
-    { "tie", "鉄" },
-    { "ting", "停庭聽町" },
-    { "tong", "同童通痛统統" },
-    { "tou", "投透頭" },
-    { "tu", "土徒茶図" },
-    { "tuan", "團" },
-    { "tui", "推退" },
-    { "tuo", "脱駄" },
-    { "u", "" },
+       { "a", "啊阿" },
+       { "ai", "埃挨哎唉哀皑癌蔼矮艾碍爱隘" },
+       { "an", "鞍氨安俺按暗岸胺案" },
+       { "ang", "肮昂盎" },
+       { "ao", "凹敖熬翱袄傲奥懊澳" },
+       { "ba", "芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸" },
+       { "bai", "白柏百摆佰败拜稗" },
+       { "ban", "斑班搬扳般颁板版扮拌伴瓣半办绊" },
+       { "bang", "邦帮梆榜膀绑棒磅蚌镑傍谤" },
+       { "bao", "苞胞包褒薄雹保堡饱宝抱报暴豹鲍爆" },
+       { "bei", "杯碑悲卑北辈背贝钡倍狈备惫焙被" },
+       { "ben", "奔苯本笨" },
+       { "beng", "崩绷甭泵蹦迸" },
+       { "bi", "逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必壁臂避陛" },
+       { "bian", "鞭边编贬扁便变卞辨辩辫遍" },
+       { "biao", "标彪膘表" },
+       { "bie", "鳖憋别瘪" },
+       { "bin", "彬斌濒滨宾摈" },
+       { "bing", "兵冰柄丙秉饼炳病并" },
+       { "bo", "剥玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤驳卜" },
+       { "bu", "捕哺补埠不布步簿部怖" },
+       { "ca", "擦" },
+       { "cai", "猜裁材才财睬踩采彩菜蔡" },
+       { "can", "餐参蚕残惭惨灿掺" },
+       { "cang", "苍舱仓沧藏" },
+       { "cao", "操糙槽曹草" },
+       { "ce", "厕策侧册测" },
+       { "ceng", "层蹭曾" },
+       { "cha", "插叉茬茶查碴搽察岔差诧" },
+       { "chai", "拆柴豺" },
+       { "chan", "搀蝉馋谗缠铲产阐颤" },
+       { "chang", "昌猖场尝常偿肠厂敞畅唱倡" },
+       { "chao", "超抄钞朝嘲潮巢吵炒" },
+       { "che", "车扯撤掣彻澈" },
+       { "chen", "郴臣辰尘晨忱沉陈趁衬" },
+       { "cheng", "撑称城橙成呈乘程惩澄诚承逞骋秤" },
+       { "chi", "吃痴持池迟弛驰耻齿侈尺赤翅斥炽" },
+       { "chong", "充冲虫崇宠" },
+       { "chou", "抽酬畴踌稠愁筹仇绸瞅丑臭" },
+       { "chu", "初出橱厨躇锄雏滁除楚础储矗搐触处畜" },
+       { "chuai", "揣" },
+       { "chuan", "川穿椽传船喘串" },
+       { "chuang", "疮窗幢床闯创" },
+       { "chui", "吹炊捶锤垂椎" },
+       { "chun", "春椿醇唇淳纯蠢" },
+       { "chuo", "戳绰" },
+       { "ci", "疵茨磁雌辞慈瓷词此刺赐次伺" },
+       { "cong", "聪葱囱匆从丛" },
+       { "cou", "凑" },
+       { "cu", "粗醋簇促" },
+       { "cuan", "蹿篡窜" },
+       { "cui", "摧崔催脆瘁粹淬翠" },
+       { "cun", "村存寸" },
+       { "cuo", "磋撮搓措挫错" },
+       { "da", "搭达答瘩打大" },
+       { "dai", "呆歹傣戴带殆代贷袋待逮怠" },
+       { "dan", "耽担丹单郸掸胆旦氮但惮淡诞弹蛋" },
+       { "dang", "当挡党荡档" },
+       { "dao", "刀捣蹈倒岛祷导到稻悼道盗" },
+       { "de", "德得的" },
+       { "deng", "蹬灯登等瞪凳邓" },
+       { "di", "堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔" },
+       { "dian", "颠掂滇碘点典靛垫电佃甸店惦奠淀殿" },
+       { "diao", "碉叼雕凋刁掉吊钓调" },
+       { "die", "跌爹碟蝶迭谍叠" },
+       { "ding", "丁盯叮钉顶鼎锭定订" },
+       { "diu", "丢" },
+       { "dong", "东冬董懂动栋侗恫冻洞" },
+       { "dou", "兜抖斗陡豆逗痘都" },
+       { "du", "督毒犊独读堵睹赌杜镀肚度渡妒" },
+       { "duan", "端短锻段断缎" },
+       { "dui", "堆兑队对" },
+       { "dun", "墩吨蹲敦顿囤钝盾遁" },
+       { "duo", "掇哆多夺垛躲朵跺舵剁惰堕" },
+       { "e", "蛾峨鹅俄额讹娥恶厄扼遏鄂饿" },
+       { "en", "恩" },
+       { "er", "而儿耳尔饵洱二贰" },
+       { "fa", "发罚筏伐乏阀法珐" },
+       { "fan", "藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛" },
+       { "fang", "坊芳方肪房防妨仿访纺放" },
+       { "fei", "菲非啡飞肥匪诽吠肺废沸费" },
+       { "fen", "芬酚吩氛分纷坟焚汾粉奋份忿愤粪" },
+       { "feng", "丰封枫蜂峰锋风疯烽逢冯缝讽奉凤" },
+       { "fou", "否" },
+       { "fu", "佛夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐" },
+       { "ga", "噶嘎" },
+       { "gai", "该改概钙盖溉" },
+       { "gan", "干甘杆柑竿肝赶感秆敢赣" },
+       { "gang", "冈刚钢缸肛纲岗港杠" },
+       { "gao", "篙皋高膏羔糕搞镐稿告" },
+       { "ge", "哥歌搁戈鸽胳疙割革葛格阁隔铬个各咯" },
+       { "gei", "给" },
+       { "gen", "根跟" },
+       { "geng", "耕更庚羹埂耿梗" },
+       { "gong", "工攻功恭龚供躬公宫弓巩汞拱贡共" },
+       { "gou", "钩勾沟苟狗垢构购够" },
+       { "gu", "辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇" },
+       { "gua", "刮瓜剐寡挂褂" },
+       { "guai", "乖拐怪" },
+       { "guan", "棺关官冠观管馆罐惯灌贯" },
+       { "guang", "光广逛" },
+       { "gui", "瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽傀炔" },
+       { "gun", "辊滚棍" },
+       { "guo", "锅郭国果裹过" },
+       { "ha", "蛤哈" },
+       { "hai", "骸孩海氦亥害骇还" },
+       { "han", "酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉" },
+       { "hang", "夯杭航" },
+       { "hao", "壕嚎豪毫郝好耗号浩貉" },
+       { "he", "呵喝荷菏核禾和何合盒阂河涸赫褐鹤贺" },
+       { "hei", "嘿黑" },
+       { "hen", "痕很狠恨" },
+       { "heng", "哼亨横衡恒" },
+       { "hong", "轰哄烘虹鸿洪宏弘红" },
+       { "hou", "喉侯猴吼厚候后" },
+       { "hu", "呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户" },
+       { "hua", "花哗华猾滑画划化话" },
+       { "huai", "槐徊怀淮坏" },
+       { "huan", "欢环桓缓换患唤痪豢焕涣宦幻" },
+       { "huang", "荒慌黄磺蝗簧皇凰惶煌晃幌恍谎" },
+       { "hui", "灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘" },
+       { "hun", "荤昏婚魂浑混" },
+       { "huo", "豁活伙火获或惑霍货祸" },
+       { "i", "" },
+       { "ji", "击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪藉" },
+       { "jia", "嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁茄" },
+       { "jian", "歼监坚尖笺间煎兼肩艰奸缄茧检柬碱碱拣捡简俭剪减荐鉴践贱见键箭件健舰剑饯渐溅涧建" },
+       { "jiang", "僵姜将浆江疆蒋桨奖讲匠酱降" },
+       { "jiao", "蕉椒礁焦胶交郊浇骄娇搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖" },
+       { "jie", "揭接皆秸街阶截劫节杰捷睫竭洁结解姐戒芥界借介疥诫届" },
+       { "jin", "巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲" },
+       { "jing", "荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净" },
+       { "jiong", "炯窘" },
+       { "jiu", "揪究纠玖韭久灸九酒厩救旧臼舅咎就疚" },
+       { "ju", "桔鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧" },
+       { "juan", "捐鹃娟倦眷卷绢" },
+       { "jue", "嚼撅攫抉掘倔爵觉决诀绝" },
+       { "jun", "均菌钧军君峻俊竣浚郡骏" },
+       { "ka", "喀咖卡" },
+       { "kai", "开揩楷凯慨" },
+       { "kan", "槛刊堪勘坎砍看" },
+       { "kang", "康慷糠扛抗亢炕" },
+       { "kao", "考拷烤靠" },
+       { "ke", "坷苛柯棵磕颗科壳咳可渴克刻客课" },
+       { "ken", "肯啃垦恳" },
+       { "keng", "坑吭" },
+       { "kong", "空恐孔控" },
+       { "kou", "抠口扣寇" },
+       { "ku", "枯哭窟苦酷库裤" },
+       { "kua", "夸垮挎跨胯" },
+       { "kuai", "块筷侩快" },
+       { "kuan", "宽款" },
+       { "kuang", "匡筐狂框矿眶旷况" },
+       { "kui", "亏盔岿窥葵奎魁馈愧溃" },
+       { "kun", "坤昆捆困" },
+       { "kuo", "括扩廓阔" },
+       { "la", "垃拉喇蜡腊辣啦" },
+       { "lai", "莱来赖" },
+       { "lan", "蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥" },
+       { "lang", "琅榔狼廊郎朗浪" },
+       { "lao", "捞劳牢老佬姥酪烙涝潦" },
+       { "le", "乐肋了" },
+       { "lei", "勒雷镭蕾磊累儡垒擂类泪" },
+       { "leng", "棱楞冷" },
+       { "li", "厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利例俐痢立粒沥隶力璃哩" },
+       { "lia", "俩" },
+       { "lian", "联莲连镰廉怜涟帘敛脸链恋炼练" },
+       { "liang", "粮凉梁粱良两辆量晾亮谅" },
+       { "liao", "撩聊僚疗燎寥辽撂镣廖料" },
+       { "lie", "列裂烈劣猎" },
+       { "lin", "琳林磷霖临邻鳞淋凛赁吝拎" },
+       { "ling", "玲菱零龄铃伶羚凌灵陵岭领另令" },
+       { "liu", "溜琉榴硫馏留刘瘤流柳六" },
+       { "long", "龙聋咙笼窿隆垄拢陇" },
+       { "lou", "楼娄搂篓漏陋" },
+       { "lu", "芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮" },
+       { "luan", "峦挛孪滦卵乱" },
+       { "lun", "抡轮伦仑沦纶论" },
+       { "luo", "萝螺罗逻锣箩骡裸落洛骆络" },
+       { "lv", "驴吕铝侣旅履屡缕虑氯律率滤绿" },
+       { "lve", "掠略" },
+       { "ma", "妈麻玛码蚂马骂嘛吗" },
+       { "mai", "埋买麦卖迈脉" },
+       { "man", "瞒馒蛮满蔓曼慢漫谩" },
+       { "mang", "芒茫盲氓忙莽" },
+       { "mao", "猫茅锚毛矛铆卯茂冒帽貌贸" },
+       { "me", "么" },
+       { "mei", "玫枚梅酶霉煤没眉媒镁每美昧寐妹媚" },
+       { "men", "门闷们" },
+       { "meng", "萌蒙檬盟锰猛梦孟" },
+       { "mi", "眯醚靡糜迷谜弥米秘觅泌蜜密幂" },
+       { "mian", "棉眠绵冕免勉娩缅面" },
+       { "miao", "苗描瞄藐秒渺庙妙" },
+       { "mie", "蔑灭" },
+       { "min", "民抿皿敏悯闽" },
+       { "ming", "明螟鸣铭名命" },
+       { "miu", "谬" },
+       { "mo", "摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌" },
+       { "mou", "谋牟某" },
+       { "mu", "拇牡亩姆母墓暮幕募慕木目睦牧穆" },
+       { "na", "拿哪呐钠那娜纳" },
+       { "nai", "氖乃奶耐奈" },
+       { "nan", "南男难" },
+       { "nang", "囊" },
+       { "nao", "挠脑恼闹淖" },
+       { "ne", "呢" },
+       { "nei", "馁内" },
+       { "nen", "嫩" },
+       { "neng", "能" },
+       { "ni", "妮霓倪泥尼拟你匿腻逆溺" },
+       { "nian", "蔫拈年碾撵捻念辗" },
+       { "niang", "娘酿" },
+       { "niao", "鸟尿" },
+       { "nie", "捏聂孽啮镊镍涅" },
+       { "nin", "您" },
+       { "ning", "柠狞凝宁拧泞" },
+       { "niu", "牛扭钮纽" },
+       { "nong", "脓浓农弄" },
+       { "nu", "奴努怒" },
+       { "nuan", "暖" },
+       { "nuo", "挪懦糯诺" },
+       { "nv", "女" },
+       { "nve", "虐疟" },
+       { "o", "哦" },
+       { "ou", "欧鸥殴藕呕偶沤" },
+       { "pa", "啪趴爬帕怕琶" },
+       { "pai", "拍排牌徘湃派" },
+       { "pan", "攀潘盘磐盼畔判叛" },
+       { "pang", "乓庞旁耪胖" },
+       { "pao", "抛咆刨炮袍跑泡" },
+       { "pei", "呸胚培裴赔陪配佩沛" },
+       { "pen", "喷盆" },
+       { "peng", "砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰" },
+       { "pi", "辟坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬" },
+       { "pian", "篇偏片骗" },
+       { "piao", "飘漂瓢票" },
+       { "pie", "撇瞥" },
+       { "pin", "拼频贫品聘" },
+       { "ping", "乒坪苹萍平凭瓶评屏" },
+       { "po", "泊坡泼颇婆破魄迫粕" },
+       { "pou", "剖" },
+       { "pu", "脯扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑" },
+       { "qi", "期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫" },
+       { "qia", "掐洽" },
+       { "qian", "牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉" },
+       { "qiang", "枪呛腔羌墙蔷强抢" },
+       { "qiao", "橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍" },
+       { "qie", "切且怯窃" },
+       { "qin", "钦侵亲秦琴勤芹擒禽寝沁" },
+       { "qing", "青轻氢倾卿清擎晴氰情顷请庆" },
+       { "qiong", "琼穷" },
+       { "qiu", "秋丘邱球求囚酋泅" },
+       { "qu", "趋区蛆曲躯屈驱渠取娶龋趣去" },
+       { "quan", "圈颧权醛泉全痊拳犬券劝" },
+       { "que", "缺瘸却鹊榷确雀" },
+       { "qun", "裙群" },
+       { "ran", "然燃冉染" },
+       { "rang", "瓤壤攘嚷让" },
+       { "rao", "饶扰绕" },
+       { "re", "惹热" },
+       { "ren", "壬仁人忍韧任认刃妊纫" },
+       { "reng", "扔仍" },
+       { "ri", "日" },
+       { "rong", "戎茸蓉荣融熔溶容绒冗" },
+       { "rou", "揉柔肉" },
+       { "ru", "茹蠕儒孺如辱乳汝入褥" },
+       { "ruan", "软阮" },
+       { "rui", "蕊瑞锐" },
+       { "run", "闰润" },
+       { "ruo", "若弱" },
+       { "sa", "撒洒萨" },
+       { "sai", "腮鳃塞赛" },
+       { "san", "三叁伞散" },
+       { "sang", "桑嗓丧" },
+       { "sao", "搔骚扫嫂" },
+       { "se", "瑟色涩" },
+       { "sen", "森" },
+       { "seng", "僧" },
+       { "sha", "莎砂杀刹沙纱傻啥煞厦" },
+       { "shai", "筛晒" },
+       { "shan", "珊苫杉山删煽衫闪陕擅赡膳善汕扇缮" },
+       { "shang", "墒伤商赏晌上尚裳" },
+       { "shao", "梢捎稍烧芍勺韶少哨邵绍" },
+       { "she", "奢赊蛇舌舍赦摄射慑涉社设" },
+       { "shen", "砷申呻伸身深娠绅神沈审婶甚肾慎渗什" },
+       { "sheng", "声生甥牲升绳省盛剩胜圣" },
+       { "shi", "匙师失狮施湿诗尸虱十石拾时食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试似" },
+       { "shou", "收手首守寿授售受瘦兽" },
+       { "shu", "蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕" },
+       { "shua", "刷耍" },
+       { "shuai", "摔衰甩帅" },
+       { "shuan", "栓拴" },
+       { "shuang", "霜双爽" },
+       { "shui", "谁水睡税" },
+       { "shun", "吮瞬顺舜" },
+       { "shuo", "说硕朔烁" },
+       { "si", "斯撕嘶思私司丝死肆寺嗣四饲巳" },
+       { "song", "松耸怂颂送宋讼诵" },
+       { "sou", "搜艘擞嗽" },
+       { "su", "僳苏酥俗素速粟僳塑溯宿诉肃" },
+       { "suan", "酸蒜算" },
+       { "sui", "虽隋随绥髓碎岁穗遂隧祟" },
+       { "sun", "孙损笋" },
+       { "suo", "蓑梭唆缩琐索锁所" },
+       { "ta", "塌他它她塔獭挞蹋踏" },
+       { "tai", "胎苔抬台泰酞太态汰" },
+       { "tan", "坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭" },
+       { "tang", "汤塘搪堂棠膛唐糖倘躺淌趟烫" },
+       { "tao", "掏涛滔绦萄桃逃淘陶讨套" },
+       { "te", "特" },
+       { "teng", "藤腾疼誊" },
+       { "ti", "梯剔踢锑提题蹄啼体替嚏惕涕剃屉" },
+       { "tian", "天添填田甜恬舔腆" },
+       { "tiao", "挑条迢眺跳" },
+       { "tie", "贴铁帖" },
+       { "ting", "厅听烃汀廷停亭庭挺艇" },
+       { "tong", "通桐酮瞳同铜彤童桶捅筒统痛" },
+       { "tou", "偷投头透" },
+       { "tu", "凸秃突图徒途涂屠土吐兔" },
+       { "tuan", "湍团" },
+       { "tui", "推颓腿蜕褪退" },
+       { "tun", "吞屯臀" },
+       { "tuo", "拖托脱鸵陀驮驼椭妥拓唾" },
+       { "u", "" },
     { "v", "" },
-    { "wai", "外" },
-    { "wan", "完万玩晩腕灣" },
-    { "wang", "忘望亡往網" },
-    { "wei", "危位未味委為謂維違圍" },
-    { "wen", "文温問聞" },
-    { "wo", "我" },
-    { "wu", "午物五無屋亡鳥務汚" },
-    { "xi", "夕息西洗喜系昔席希析嬉膝細習係" },
-    { "xia", "下夏狭暇" },
-    { "xian", "先限嫌洗現見線顯" },
-    { "xiang", "向相香像想象降項詳響" },
-    { "xiao", "小笑消效校削咲" },
-    { "xie", "写携些解邪械協謝寫契" },
-    { "xin", "心信新辛" },
-    { "xing", "行形性幸型星興" },
-    { "xiong", "兄胸" },
-    { "xiu", "休秀修" },
-    { "xu", "須需許續緒続" },
-    { "xuan", "選懸" },
-    { "xue", "学雪削靴學" },
-    { "xun", "訓訊" },
-    { "ya", "呀押壓" },
-    { "yan", "言顔研煙嚴厳験驗塩" },
-    { "yang", "央洋陽樣様" },
-    { "yao", "要揺腰薬曜" },
-    { "ye", "也野夜邪業葉" },
-    { "yi", "一已亦依以移意医易伊役異億義議藝醫訳" },
-    { "yin", "因引音飲銀" },
-    { "ying", "英迎影映應營営" },
-    { "yong", "永用泳擁" },
-    { "you", "又有右友由尤油遊郵誘優" },
-    { "yu", "予育余雨浴欲愈御宇域語於魚與込" },
-    { "yuan", "元原源院員円園遠猿願" },
-    { "yue", "月越約楽" },
-    { "yun", "雲伝運" },
-    { "za", "雑" },
-    { "zai", "在再載災" },
-    { "zang", "蔵" },
-    { "zao", "早造" },
-    { "ze", "則擇責" },
-    { "zen", "怎" },
-    { "zeng", "曾增増" },
-    { "zha", "札" },
-    { "zhai", "宅擇" },
-    { "zhan", "站展戰戦" },
-    { "zhang", "丈長障帳張" },
-    { "zhao", "找着朝招" },
-    { "zhe", "者這" },
-    { "zhen", "真震針" },
-    { "zheng", "正整争政爭" },
-    { "zhi", "之只知支止制至治直指值置智値紙製質誌織隻識職執" },
-    { "zhong", "中种終重種眾" },
-    { "zhou", "周州昼宙洲週" },
-    { "zhu", "助主住柱株祝逐注著諸屬術" },
-    { "zhuan", "专專転" },
-    { "zhuang", "状狀" },
-    { "zhui", "追" },
-    { "zhun", "準" },
-    { "zhuo", "着" },
-    { "zi", "子自字姉資" },
-    { "zong", "總" },
-    { "zuo", "左做昨坐座作" },
-    { "zu", "足祖族卒組" },
-    { "zui", "最酔" },
-    { "zou", "走" },
+       { "wa", "挖哇蛙洼娃瓦袜" },
+       { "wai", "歪外" },
+       { "wan", "豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕" },
+       { "wang", "汪王亡枉网往旺望忘妄" },
+       { "wei", "威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫" },
+       { "wen", "瘟温蚊文闻纹吻稳紊问" },
+       { "weng", "嗡翁瓮" },
+       { "wo", "挝蜗涡窝我斡卧握沃" },
+       { "wu", "巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误" },
+       { "xi", "昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细" },
+       { "xia", "瞎虾匣霞辖暇峡侠狭下夏吓" },
+       { "xian", "掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线" },
+       { "xiang", "相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象" },
+       { "xiao", "萧硝霄哮嚣销消宵淆晓小孝校肖啸笑效" },
+       { "xie", "楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑" },
+       { "xin", "薪芯锌欣辛新忻心信衅" },
+       { "xing", "星腥猩惺兴刑型形邢行醒幸杏性姓" },
+       { "xiong", "兄凶胸匈汹雄熊" },
+       { "xiu", "休修羞朽嗅锈秀袖绣" },
+       { "xu", "墟戌需虚嘘须徐许蓄酗叙旭序恤絮婿绪续吁" },
+       { "xuan", "轩喧宣悬旋玄选癣眩绚" },
+       { "xue", "削靴薛学穴雪血" },
+       { "xun", "勋熏循旬询寻驯巡殉汛训讯逊迅" },
+       { "ya", "压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶轧" },
+       { "yan", "焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验" },
+       { "yang", "殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾" },
+       { "yao", "邀腰妖瑶摇尧遥窑谣姚咬舀药要耀钥" },
+       { "ye", "椰噎耶爷野冶也页掖业叶曳腋夜液" },
+       { "yi", "一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎" },
+       { "yin", "茵荫因殷音阴姻吟银淫寅饮尹引隐印" },
+       { "ying", "英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映" },
+       { "yo", "哟" },
+       { "yong", "拥佣臃痈庸雍踊蛹咏泳涌永恿勇用" },
+       { "you", "幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼" },
+       { "yu", "迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁遇喻峪御愈欲狱育誉浴寓裕预豫驭" },
+       { "yuan", "鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院" },
+       { "yue", "曰约越跃岳粤月悦阅" },
+       { "yun", "耘云郧匀陨允运蕴酝晕韵孕" },
+       { "za", "匝砸杂咋" },
+       { "zai", "栽哉灾宰载再在仔" },
+       { "zan", "咱攒暂赞" },
+       { "zang", "赃脏葬" },
+       { "zao", "遭糟凿藻枣早澡蚤躁噪造皂灶燥" },
+       { "ze", "责择则泽" },
+       { "zei", "贼" },
+       { "zen", "怎" },
+       { "zeng", "增憎赠" },
+       { "zha", "扎喳渣札铡闸眨栅榨乍炸诈柞" },
+       { "zhai", "摘斋宅窄债寨" },
+       { "zhan", "瞻毡詹粘沾盏斩崭展蘸栈占战站湛绽" },
+       { "zhang", "长樟章彰漳张掌涨杖丈帐账仗胀瘴障" },
+       { "zhao", "招昭找沼赵照罩兆肇召爪" },
+       { "zhe", "遮折哲蛰辙者锗蔗这浙着" },
+       { "zhen", "珍斟真甄砧臻贞针侦枕疹诊震振镇阵帧" },
+       { "zheng", "蒸挣睁征狰争怔整拯正政症郑证" },
+       { "zhi", "芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒" },
+       { "zhong", "中盅忠钟衷终种肿重仲众" },
+       { "zhou", "舟周州洲诌粥轴肘帚咒皱宙昼骤" },
+       { "zhu", "珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻" },
+       { "zhua", "抓" },
+       { "zhuai", "拽" },
+       { "zhuan", "专砖转撰赚篆" },
+       { "zhuang", "桩庄装妆撞壮状" },
+       { "zhui", "锥追赘坠缀" },
+       { "zhun", "谆准" },
+       { "zhuo", "捉拙卓桌茁酌啄灼浊" },
+       { "zi", "兹咨资姿滋淄孜紫籽滓子自渍字" },
+       { "zong", "鬃棕踪宗综总纵" },
+       { "zou", "邹走奏揍" },
+       { "zu", "租足卒族祖诅阻组" },
+       { "zuan", "钻纂" },
+       { "zui", "嘴醉最罪" },
+       { "zun", "尊遵" },
+       { "zuo", "琢昨左佐做作坐座" },
     {NULL, NULL}
 };
 #endif
@@ -434,8 +513,12 @@ void lv_ime_pinyin_set_keyboard(lv_obj_t * obj, lv_obj_t * kb)
     lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
 
     pinyin_ime->kb = kb;
+    lv_obj_set_parent(obj, lv_obj_get_parent(kb));
+    lv_obj_set_parent(pinyin_ime->cand_panel, lv_obj_get_parent(kb));
+       lv_obj_set_parent(pinyin_ime->comb_panel, lv_obj_get_parent(kb));
     lv_obj_add_event_cb(pinyin_ime->kb, lv_ime_pinyin_kb_event, LV_EVENT_VALUE_CHANGED, obj);
     lv_obj_align_to(pinyin_ime->cand_panel, pinyin_ime->kb, LV_ALIGN_OUT_TOP_MID, 0, 0);
+       lv_obj_align_to(pinyin_ime->comb_panel, pinyin_ime->cand_panel, LV_ALIGN_OUT_TOP_MID, 0, 0);
 }
 
 /**
@@ -455,6 +538,26 @@ void lv_ime_pinyin_set_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
  * @param obj  pointer to a Pinyin input method object
  * @param mode   the mode from 'lv_keyboard_mode_t'
  */
+
+static void comb_panel_event_cb(lv_event_t * e)
+{
+    lv_event_code_t code = lv_event_get_code(e);
+    lv_obj_t * kb = lv_event_get_target(e);
+       lv_obj_t * obj = (lv_obj_t *)lv_event_get_user_data(e);
+
+       lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+       
+    if(code == LV_EVENT_VALUE_CHANGED) {
+        uint32_t btn_id = lv_keyboard_get_selected_btn(kb);
+        if(btn_id != LV_BTNMATRIX_BTN_NONE) {
+            // 设置kb2的最后一行对应位置
+            lv_ime_pinyin_set_btnID(pinyin_ime, btn_id+15);
+            lv_event_send(pinyin_ime->kb, LV_EVENT_VALUE_CHANGED, NULL);
+        }
+    }
+}
+
+
 void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode)
 {
     LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -467,13 +570,72 @@ void lv_ime_pinyin_set_mode(lv_obj_t * obj, lv_ime_pinyin_mode_t mode)
 #if LV_IME_PINYIN_USE_K9_MODE
     if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K9) {
         pinyin_k9_init_data(obj);
+//             if(pinyin_ime->comb_panel == NULL) {                    
+//                     /* Init pinyin_ime->cand_panel */
+//                     pinyin_ime->comb_panel = lv_btnmatrix_create(lv_scr_act());
+//                     lv_obj_set_size(pinyin_ime->comb_panel, LV_PCT(100), LV_PCT(5));
+//                     lv_obj_add_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
+//                     
+//                     lv_btnmatrix_set_one_checked(pinyin_ime->comb_panel, true);
+//                     
+//                     /* Set cand_panel style*/
+//                     // Default style
+//                     lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_0, 0);
+//                     lv_obj_set_style_border_width(pinyin_ime->comb_panel, 0, 0);
+//                     lv_obj_set_style_pad_all(pinyin_ime->comb_panel, 8, 0);
+//                     lv_obj_set_style_pad_gap(pinyin_ime->comb_panel, 0, 0);
+//                     lv_obj_set_style_radius(pinyin_ime->comb_panel, 0, 0);
+//                     lv_obj_set_style_pad_gap(pinyin_ime->comb_panel, 0, 0);
+//                     lv_obj_set_style_base_dir(pinyin_ime->comb_panel, LV_BASE_DIR_LTR, 0);
+//                     
+//                     // LV_PART_ITEMS style
+//                     lv_obj_set_style_radius(pinyin_ime->comb_panel, 12, LV_PART_ITEMS);
+//                     lv_obj_set_style_bg_color(pinyin_ime->comb_panel, lv_color_white(), LV_PART_ITEMS);
+//                     lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_0, LV_PART_ITEMS);
+//                     lv_obj_set_style_shadow_opa(pinyin_ime->comb_panel, LV_OPA_0, LV_PART_ITEMS);
+//                     
+//                     // LV_PART_ITEMS | LV_STATE_PRESSED style
+//                     lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED);
+//                     lv_obj_set_style_bg_color(pinyin_ime->comb_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED);
+//                     
+//                     /* event handler */
+//                     lv_obj_add_event_cb(pinyin_ime->comb_panel, comb_panel_event_cb, LV_EVENT_VALUE_CHANGED, obj);
+//                     lv_obj_align_to(pinyin_ime->comb_panel, pinyin_ime->cand_panel, LV_ALIGN_OUT_TOP_MID, 0, 0);
+//             }
+
+               lv_btnmatrix_set_map(pinyin_ime->comb_panel, (const char **)lv_btnm_def_pinyin_k9_map+18);
+               
         lv_keyboard_set_map(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1, (const char *)lv_btnm_def_pinyin_k9_map,
-                            (const)default_kb_ctrl_k9_map);
+                            default_kb_ctrl_k9_map);
         lv_keyboard_set_mode(pinyin_ime->kb, LV_KEYBOARD_MODE_USER_1);
     }
 #endif
 }
 
+
+
+void lv_ime_pinyin_set_btnID(lv_obj_t * obj, uint16_t btn_id)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class);
+       return lv_btnmatrix_set_selected_btn(pinyin_ime->kb, btn_id);
+       
+}
+
+uint16_t lv_ime_pinyin_get_btnID(lv_obj_t * obj)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    LV_ASSERT_OBJ(pinyin_ime->kb, &lv_keyboard_class);
+       return lv_btnmatrix_get_selected_btn(pinyin_ime->kb);
+       
+}
+
+
+
 /*=====================
  * Getter functions
  *====================*/
@@ -506,12 +668,22 @@ lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj)
     return pinyin_ime->cand_panel;
 }
 
+lv_obj_t * lv_ime_pinyin_get_comb_panel(lv_obj_t * obj)
+{
+    LV_ASSERT_OBJ(obj, MY_CLASS);
+
+    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+
+    return pinyin_ime->comb_panel;
+}
+
+
 /**
  * Set the dictionary of Pinyin input method.
  * @param obj  pointer to a Pinyin input method object
  * @return     pointer to the Pinyin input method dictionary
  */
-lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj)
+const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj)
 {
     LV_ASSERT_OBJ(obj, MY_CLASS);
 
@@ -562,20 +734,20 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t *
     lv_memset_00(pinyin_ime->py_num, sizeof(pinyin_ime->py_num));
     lv_memset_00(pinyin_ime->py_pos, sizeof(pinyin_ime->py_pos));
 
-    lv_obj_set_size(obj, LV_PCT(100), LV_PCT(55));
-    lv_obj_align(obj, LV_ALIGN_BOTTOM_MID, 0, 0);
+    lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
 
 #if LV_IME_PINYIN_USE_DEFAULT_DICT
     init_pinyin_dict(obj, lv_ime_pinyin_def_dict);
 #endif
 
     /* Init pinyin_ime->cand_panel */
-    pinyin_ime->cand_panel = lv_btnmatrix_create(lv_scr_act());
+    pinyin_ime->cand_panel = lv_btnmatrix_create(lv_obj_get_parent(obj));
     lv_btnmatrix_set_map(pinyin_ime->cand_panel, (const char **)lv_btnm_def_pinyin_sel_map);
     lv_obj_set_size(pinyin_ime->cand_panel, LV_PCT(100), LV_PCT(5));
     lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
 
     lv_btnmatrix_set_one_checked(pinyin_ime->cand_panel, true);
+    lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_CLICK_FOCUSABLE);
 
     /* Set cand_panel style*/
     // Default style
@@ -601,6 +773,41 @@ static void lv_ime_pinyin_constructor(const lv_obj_class_t * class_p, lv_obj_t *
     lv_obj_add_event_cb(pinyin_ime->cand_panel, lv_ime_pinyin_cand_panel_event, LV_EVENT_VALUE_CHANGED, obj);
     lv_obj_add_event_cb(obj, lv_ime_pinyin_style_change_event, LV_EVENT_STYLE_CHANGED, NULL);
 
+       
+       if(pinyin_ime->comb_panel == NULL) {                    
+               /* Init pinyin_ime->cand_panel */
+               pinyin_ime->comb_panel = lv_btnmatrix_create(lv_obj_get_parent(obj));
+               lv_obj_set_size(pinyin_ime->comb_panel, LV_PCT(100), LV_PCT(5));
+               lv_obj_add_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
+               
+               lv_btnmatrix_set_one_checked(pinyin_ime->comb_panel, true);
+               
+               /* Set cand_panel style*/
+               // Default style
+               lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_0, 0);
+               lv_obj_set_style_border_width(pinyin_ime->comb_panel, 0, 0);
+               lv_obj_set_style_pad_all(pinyin_ime->comb_panel, 8, 0);
+               lv_obj_set_style_pad_gap(pinyin_ime->comb_panel, 0, 0);
+               lv_obj_set_style_radius(pinyin_ime->comb_panel, 0, 0);
+               lv_obj_set_style_pad_gap(pinyin_ime->comb_panel, 0, 0);
+               lv_obj_set_style_base_dir(pinyin_ime->comb_panel, LV_BASE_DIR_LTR, 0);
+               
+               // LV_PART_ITEMS style
+               lv_obj_set_style_radius(pinyin_ime->comb_panel, 12, LV_PART_ITEMS);
+               lv_obj_set_style_bg_color(pinyin_ime->comb_panel, lv_color_white(), LV_PART_ITEMS);
+               lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_0, LV_PART_ITEMS);
+               lv_obj_set_style_shadow_opa(pinyin_ime->comb_panel, LV_OPA_0, LV_PART_ITEMS);
+               
+               // LV_PART_ITEMS | LV_STATE_PRESSED style
+               lv_obj_set_style_bg_opa(pinyin_ime->comb_panel, LV_OPA_COVER, LV_PART_ITEMS | LV_STATE_PRESSED);
+               lv_obj_set_style_bg_color(pinyin_ime->comb_panel, lv_color_white(), LV_PART_ITEMS | LV_STATE_PRESSED);
+               
+               /* event handler */
+               lv_obj_add_event_cb(pinyin_ime->comb_panel, comb_panel_event_cb, LV_EVENT_VALUE_CHANGED, obj);
+               lv_obj_align_to(pinyin_ime->comb_panel, pinyin_ime->cand_panel, LV_ALIGN_OUT_TOP_MID, 0, 0);
+       }
+       //lv_btnmatrix_set_map(pinyin_ime->comb_panel, (const char **)lv_btnm_def_pinyin_k9_map+18);
+
 #if LV_IME_PINYIN_USE_K9_MODE
     pinyin_ime->k9_input_str_len = 0;
     pinyin_ime->k9_py_ll_pos = 0;
@@ -625,6 +832,10 @@ static void lv_ime_pinyin_destructor(const lv_obj_class_t * class_p, lv_obj_t *
 
     if(lv_obj_is_valid(pinyin_ime->cand_panel))
         lv_obj_del(pinyin_ime->cand_panel);
+
+       
+    if(lv_obj_is_valid(pinyin_ime->comb_panel))
+        lv_obj_del(pinyin_ime->comb_panel);
 }
 
 
@@ -673,6 +884,7 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
         if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) {
             pinyin_ime_clear_data(obj);
             lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+                       lv_obj_add_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
         }
         else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) {
             // del input char
@@ -684,14 +896,16 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
                     pinyin_ime->k9_input_str[pinyin_ime->ta_count - 1] = '\0';
 #endif
 
-                pinyin_ime->ta_count = pinyin_ime->ta_count - 1;
+                pinyin_ime->ta_count--;
                 if(pinyin_ime->ta_count <= 0) {
+                    pinyin_ime_clear_data(obj);
                     lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
-#if LV_IME_PINYIN_USE_K9_MODE
+                                       lv_obj_add_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
+/*#if LV_IME_PINYIN_USE_K9_MODE
                     lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
                     strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
                     strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
-#endif
+#endif*/
                 }
                 else if(pinyin_ime->mode == LV_IME_PINYIN_MODE_K26) {
                     pinyin_input_proc(obj);
@@ -702,6 +916,7 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
                     pinyin_k9_get_legal_py(obj, pinyin_ime->k9_input_str, k9_py_map);
                     pinyin_k9_fill_cand(obj);
                     pinyin_input_proc(obj);
+                    pinyin_ime->ta_count--;
                 }
 #endif
             }
@@ -737,6 +952,7 @@ static void lv_ime_pinyin_kb_event(lv_event_t * e)
                     if(strcmp(txt, "abc ") == 0)    pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]) + 1;
                     else                            pinyin_ime->k9_input_str_len += strlen(k9_py_map[i]);
                     pinyin_ime->k9_input_str[pinyin_ime->ta_count] = 50 + i;
+                    pinyin_ime->k9_input_str[pinyin_ime->ta_count + 1] = '\0';
 
                     break;
                 }
@@ -765,18 +981,23 @@ static void lv_ime_pinyin_cand_panel_event(lv_event_t * e)
     lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
 
     if(code == LV_EVENT_VALUE_CHANGED) {
+        lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
+        if(ta == NULL) return;
+
         uint32_t id = lv_btnmatrix_get_selected_btn(cand_panel);
-        if(id == 0) {
+        if(id == LV_BTNMATRIX_BTN_NONE) {
+            return;
+        }
+        else if(id == 0) {
             pinyin_page_proc(obj, 0);
             return;
         }
-        if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
+        else if(id == (LV_IME_PINYIN_CAND_TEXT_NUM + 1)) {
             pinyin_page_proc(obj, 1);
             return;
         }
 
         const char * txt = lv_btnmatrix_get_btn_text(cand_panel, id);
-        lv_obj_t * ta = lv_keyboard_get_textarea(pinyin_ime->kb);
         uint16_t index = 0;
         for(index = 0; index < pinyin_ime->ta_count; index++)
             lv_textarea_del_char(ta);
@@ -812,6 +1033,7 @@ static void pinyin_input_proc(lv_obj_t * obj)
     }
 
     lv_obj_clear_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+       lv_obj_clear_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
 }
 
 static void pinyin_page_proc(lv_obj_t * obj, uint16_t dir)
@@ -868,7 +1090,7 @@ static void lv_ime_pinyin_style_change_event(lv_event_t * e)
 }
 
 
-static void init_pinyin_dict(lv_obj_t * obj, lv_pinyin_dict_t * dict)
+static void init_pinyin_dict(lv_obj_t * obj, const lv_pinyin_dict_t * dict)
 {
     lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
 
@@ -907,7 +1129,7 @@ static char * pinyin_search_matching(lv_obj_t * obj, char * py_str, uint16_t * c
 {
     lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
 
-    lv_pinyin_dict_t * cpHZ;
+    const lv_pinyin_dict_t * cpHZ;
     uint8_t index, len = 0, offset;
     volatile uint8_t count = 0;
 
@@ -954,6 +1176,7 @@ static void pinyin_ime_clear_data(lv_obj_t * obj)
         lv_memset_00(lv_pinyin_k9_cand_str, sizeof(lv_pinyin_k9_cand_str));
         strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM], LV_SYMBOL_RIGHT"\0");
         strcpy(lv_pinyin_k9_cand_str[LV_IME_PINYIN_K9_CAND_TEXT_NUM + 1], "\0");
+        _lv_ll_clear(&pinyin_ime->k9_legal_py_ll);
     }
 #endif
 
@@ -962,13 +1185,14 @@ static void pinyin_ime_clear_data(lv_obj_t * obj)
     lv_memset_00(pinyin_ime->input_char, sizeof(pinyin_ime->input_char));
 
     lv_obj_add_flag(pinyin_ime->cand_panel, LV_OBJ_FLAG_HIDDEN);
+       lv_obj_add_flag(pinyin_ime->comb_panel, LV_OBJ_FLAG_HIDDEN);
 }
 
 
 #if LV_IME_PINYIN_USE_K9_MODE
 static void pinyin_k9_init_data(lv_obj_t * obj)
 {
-    lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
+    LV_UNUSED(obj);
 
     uint16_t py_str_i = 0;
     uint16_t btnm_i = 0;
@@ -1011,7 +1235,7 @@ static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char *
     int mark[LV_IME_PINYIN_K9_MAX_INPUT] = {0};
     int index = 0;
     int flag = 0;
-    int count = 0;
+    uint16_t count = 0;
 
     uint32_t ll_len = 0;
     ime_pinyin_k9_py_str_t * ll_index = NULL;
@@ -1036,7 +1260,7 @@ static void pinyin_k9_get_legal_py(lv_obj_t * obj, char * k9_input, const char *
         }
         else {
             flag = mark[index];
-            if(flag < strlen(py9_map[k9_input[index] - '2'])) {
+            if((size_t)flag < strlen(py9_map[k9_input[index] - '2'])) {
                 py_comp[index] = py9_map[k9_input[index] - '2'][flag];
                 mark[index] = mark[index] + 1;
                 index++;
@@ -1060,9 +1284,8 @@ static bool pinyin_k9_is_valid_py(lv_obj_t * obj, char * py_str)
 {
     lv_ime_pinyin_t * pinyin_ime = (lv_ime_pinyin_t *)obj;
 
-    lv_pinyin_dict_t * cpHZ = NULL;
+    const lv_pinyin_dict_t * cpHZ = NULL;
     uint8_t index = 0, len = 0, offset = 0;
-    uint16_t ret = 1;
     volatile uint8_t count = 0;
 
     if(*py_str == '\0')    return false;
@@ -1141,7 +1364,6 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir)
 
     if((ll_len > LV_IME_PINYIN_K9_CAND_TEXT_NUM) && (pinyin_ime->k9_legal_py_count > LV_IME_PINYIN_K9_CAND_TEXT_NUM)) {
         ime_pinyin_k9_py_str_t * ll_index = NULL;
-        uint16_t tmp_btn_str_len = 0;
         int count = 0;
 
         ll_index = _lv_ll_get_head(&pinyin_ime->k9_legal_py_ll);
@@ -1162,15 +1384,16 @@ static void pinyin_k9_cand_page_proc(lv_obj_t * obj, uint16_t dir)
         if(dir == 1) {
             count = 0;
             while(ll_index) {
-                if(count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM - 1))
+                if (count >= (LV_IME_PINYIN_K9_CAND_TEXT_NUM))
                     break;
 
                 strcpy(lv_pinyin_k9_cand_str[count], ll_index->py_str);
                 ll_index = _lv_ll_get_next(&pinyin_ime->k9_legal_py_ll, ll_index); /*Find the next list*/
                 count++;
             }
-            pinyin_ime->k9_py_ll_pos += count - 1;
-
+            if(ll_index) {
+                pinyin_ime->k9_py_ll_pos += count;
+                       }
         }
         // previous page
         else {
index 3ff7bb9..f2d4a0c 100644 (file)
@@ -28,6 +28,7 @@ extern "C" {
 typedef enum {
     LV_IME_PINYIN_MODE_K26,
     LV_IME_PINYIN_MODE_K9,
+    LV_IME_PINYIN_MODE_K9_NUMBER,
 } lv_ime_pinyin_mode_t;
 
 /*Data of pinyin_dict*/
@@ -46,12 +47,13 @@ typedef struct {
     lv_obj_t obj;
     lv_obj_t * kb;
     lv_obj_t * cand_panel;
+       lv_obj_t * comb_panel;
     lv_pinyin_dict_t * dict;
     lv_ll_t k9_legal_py_ll;
     char * cand_str;            /* Candidate string */
     char   input_char[16];      /* Input box character */
 #if LV_IME_PINYIN_USE_K9_MODE
-    char   k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT]; /* 9-key input(k9) mode input string */
+    char   k9_input_str[LV_IME_PINYIN_K9_MAX_INPUT + 1]; /* 9-key input(k9) mode input string */
     uint16_t k9_py_ll_pos;      /* Current pinyin map pages(k9) */
     uint16_t k9_legal_py_count; /* Count of legal Pinyin numbers(k9) */
     uint16_t k9_input_str_len;  /* 9-key input(k9) mode input string max len */
@@ -61,13 +63,15 @@ typedef struct {
     uint16_t py_page;           /* Current pinyin map pages(k26) */
     uint16_t py_num[26];        /* Number and length of Pinyin */
     uint16_t py_pos[26];        /* Pinyin position */
-    uint8_t  mode : 1;          /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */
+    lv_ime_pinyin_mode_t  mode; /* Set mode, 1: 26-key input(k26), 0: 9-key input(k9). Default: 1. */
 } lv_ime_pinyin_t;
 
 /***********************
  * GLOBAL VARIABLES
  ***********************/
 
+extern const lv_obj_class_t lv_ime_pinyin_class;
+
 /**********************
  * GLOBAL PROTOTYPES
  **********************/
@@ -124,7 +128,13 @@ lv_obj_t * lv_ime_pinyin_get_cand_panel(lv_obj_t * obj);
  * @param obj  pointer to a Pinyin input method object
  * @return     pointer to the Pinyin input method dictionary
  */
-lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj);
+const lv_pinyin_dict_t * lv_ime_pinyin_get_dict(lv_obj_t * obj);
+
+void lv_ime_pinyin_set_btnID(lv_obj_t * obj, uint16_t btn_id);
+uint16_t lv_ime_pinyin_get_btnID(lv_obj_t * obj);
+
+lv_obj_t * lv_ime_pinyin_get_comb_panel(lv_obj_t * obj);
+
 
 /*=====================
  * Other functions
index 2d53adb..eae31bd 100644 (file)
@@ -261,10 +261,10 @@ uint16_t lv_chart_get_point_count(const lv_obj_t * obj)
 
 uint16_t lv_chart_get_x_start_point(const lv_obj_t * obj, lv_chart_series_t * ser)
 {
-    LV_UNUSED(obj);
     LV_ASSERT_NULL(ser);
+    lv_chart_t * chart  = (lv_chart_t *)obj;
 
-    return ser->start_point;
+    return chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0;
 }
 
 void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint16_t id, lv_point_t * p_out)
@@ -292,28 +292,34 @@ void lv_chart_get_point_pos_by_id(lv_obj_t * obj, lv_chart_series_t * ser, uint1
     }
     else if(chart->type == LV_CHART_TYPE_BAR) {
         uint32_t ser_cnt = _lv_ll_get_len(&chart->series_ll);
-        int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
-                                                                LV_PART_ITEMS) * chart->zoom_x) >> 8; /*Gap between the column on the ~same X*/
-        int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj,
-                                                                  LV_PART_MAIN) * chart->zoom_x) >> 8;  /*Gap between the column on ~adjacent X*/
-        lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt;
-        lv_coord_t col_w = block_w / ser_cnt;
+        /*Gap between the column on the X tick*/
+        int32_t ser_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_ITEMS) * chart->zoom_x) >> 8;
 
-        p_out->x = (int32_t)((int32_t)w * id) / chart->point_cnt;
+        /*Gap between the columns on adjacent X ticks*/
+        int32_t block_gap = ((int32_t)lv_obj_get_style_pad_column(obj, LV_PART_MAIN) * chart->zoom_x) >> 8;
+
+        lv_coord_t block_w = (w - ((chart->point_cnt - 1) * block_gap)) / chart->point_cnt;
 
         lv_chart_series_t * ser_i = NULL;
+        uint32_t ser_idx = 0;
         _LV_LL_READ_BACK(&chart->series_ll, ser_i) {
             if(ser_i == ser) break;
-            p_out->x += col_w;
+            ser_idx++;
         }
 
-        p_out->x += (col_w - ser_gap) / 2;
+        p_out->x = (int32_t)((int32_t)(w + block_gap) * id) / chart->point_cnt;
+        p_out->x += block_w * ser_idx / ser_cnt;
+
+        lv_coord_t col_w = (block_w - (ser_gap * (ser_cnt - 1))) / ser_cnt;
+        p_out->x += col_w / 2;
     }
 
     lv_coord_t border_width = lv_obj_get_style_border_width(obj, LV_PART_MAIN);
     p_out->x += lv_obj_get_style_pad_left(obj, LV_PART_MAIN) + border_width;
     p_out->x -= lv_obj_get_scroll_left(obj);
 
+    uint32_t start_point = lv_chart_get_x_start_point(obj, ser);
+    id = ((int32_t)start_point + id) % chart->point_cnt;
     int32_t temp_y = 0;
     temp_y = (int32_t)((int32_t)ser->y_points[id] - chart->ymin[ser->y_axis_sec]) * h;
     temp_y = temp_y / (chart->ymax[ser->y_axis_sec] - chart->ymin[ser->y_axis_sec]);
@@ -913,7 +919,7 @@ static void draw_series_line(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
         line_dsc_default.color = ser->color;
         point_dsc_default.bg_color = ser->color;
 
-        lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0;
+        lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser);
 
         p1.x = x_ofs;
         p2.x = x_ofs;
@@ -1075,7 +1081,7 @@ static void draw_series_scatter(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
         line_dsc_default.color = ser->color;
         point_dsc_default.bg_color = ser->color;
 
-        lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0;
+        lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser);
 
         p1.x = x_ofs;
         p2.x = x_ofs;
@@ -1229,7 +1235,8 @@ static void draw_series_bar(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx)
         /*Draw the current point of all data line*/
         _LV_LL_READ_BACK(&chart->series_ll, ser) {
             if(ser->hidden) continue;
-            lv_coord_t start_point = chart->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0;
+
+            lv_coord_t start_point = lv_chart_get_x_start_point(obj, ser);
 
             col_a.x1 = x_act;
             col_a.x2 = col_a.x1 + col_w - 1;
index 00c3011..06c68fb 100644 (file)
@@ -205,6 +205,15 @@ static void lv_imgbtn_event(const lv_obj_class_t * class_p, lv_event_t * e)
             p->x = LV_MAX(p->x, header.w);
         }
     }
+    /*Sent when the widget is checked due to LV_OBJ_FLAG_CHECKABLE */
+    else if(code == LV_EVENT_VALUE_CHANGED) {
+        if(lv_obj_has_state(obj, LV_STATE_CHECKED)) {
+            lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_CHECKED_RELEASED);
+        }
+        else {
+            lv_imgbtn_set_state(obj, LV_IMGBTN_STATE_RELEASED);
+        }
+    }
 }
 
 static void draw_main(lv_event_t * e)
index 81addc6..f013823 100644 (file)
@@ -77,8 +77,8 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * obj, const char * name)
 
     lv_obj_t * btns = lv_tabview_get_tab_btns(obj);
 
-    char ** old_map = tabview->map;
-    char ** new_map;
+    const char ** old_map = (const char **)tabview->map;
+    const char ** new_map;
 
     /*top or bottom dir*/
     if(tabview->tab_pos & LV_DIR_VER) {
@@ -129,15 +129,17 @@ void lv_tabview_rename_tab(lv_obj_t * obj, uint32_t id, const char * new_name)
     if(id >= tabview->tab_cnt) return;
     if(tabview->tab_pos & LV_DIR_HOR) id *= 2;
 
-    lv_mem_free(tabview->map[id]);
+    lv_mem_free((void *)tabview->map[id]);
     tabview->map[id] = lv_mem_alloc(strlen(new_name) + 1);
-    strcpy(tabview->map[id], new_name);
+    strcpy((void *)tabview->map[id], new_name);
     lv_obj_invalidate(obj);
 }
 
 void lv_tabview_set_act(lv_obj_t * obj, uint32_t id, lv_anim_enable_t anim_en)
 {
     LV_ASSERT_OBJ(obj, MY_CLASS);
+    if(obj->being_deleted) return;
+
     lv_tabview_t * tabview = (lv_tabview_t *)obj;
 
     if(id >= tabview->tab_cnt) {
@@ -271,13 +273,13 @@ static void lv_tabview_destructor(const lv_obj_class_t * class_p, lv_obj_t * obj
     uint32_t i;
     if(tabview->tab_pos & LV_DIR_VER) {
         for(i = 0; i < tabview->tab_cnt; i++) {
-            lv_mem_free(tabview->map[i]);
+            lv_mem_free((void *)tabview->map[i]);
             tabview->map[i] = NULL;
         }
     }
     if(tabview->tab_pos & LV_DIR_HOR) {
         for(i = 0; i < tabview->tab_cnt; i++) {
-            lv_mem_free(tabview->map[i * 2]);
+            lv_mem_free((void *)tabview->map[i * 2]);
             tabview->map[i * 2] = NULL;
         }
     }
@@ -308,7 +310,7 @@ static void btns_value_changed_event_cb(lv_event_t * e)
 
     lv_obj_t * tv = lv_obj_get_parent(btns);
     uint32_t id = lv_btnmatrix_get_selected_btn(btns);
-    lv_tabview_set_act(tv, id, LV_ANIM_ON);
+    lv_tabview_set_act(tv, id, LV_ANIM_OFF);
 }
 
 static void cont_scroll_end_event_cb(lv_event_t * e)
index 388c654..ee7d7ce 100644 (file)
@@ -27,7 +27,7 @@ extern "C" {
 
 typedef struct {
     lv_obj_t obj;
-    char ** map;
+    const char ** map;
     uint16_t tab_cnt;
     uint16_t tab_cur;
     lv_dir_t tab_pos;
index 9c6ed03..fae54c0 100644 (file)
@@ -9,12 +9,14 @@
 #else
     #include "../../lvgl.h"
 #endif
-
 #include "autoconf.h"
+
+#if PROJECT_NAME_G5_K5 || (PROJECT_NAME_G3_C06S || PROJECT_NAME_C3_W8)
+
 /*-----------------
  *    BITMAPS
  *----------------*/
-#if PROJECT_NAME_G5_K5 || PROJECT_NAME_G3_C06S ||PROJECT_NAME_C3_W8
+
 /*Store the image of the glyphs*/
 static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
     /* U+0020 " " */
@@ -1333,6 +1335,8 @@ lv_font_t lv_font_70_bold = {
 #endif
     .dsc = &font_dsc           /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
 };
-#endif
 
 
+
+#endif /*#if LV_font_70_BOLD*/
+
index 0cebc33..0878829 100644 (file)
@@ -513,7 +513,7 @@ lv_coord_t lv_disp_get_dpi(const lv_disp_t * disp)
  * Call in the display driver's `flush_cb` function when the flushing is finished
  * @param disp_drv pointer to display driver in `flush_cb` where this function is called
  */
-LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv)
+void LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_ready(lv_disp_drv_t * disp_drv)
 {
     disp_drv->draw_buf->flushing = 0;
     disp_drv->draw_buf->flushing_last = 0;
@@ -525,7 +525,7 @@ LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv)
  * @param disp_drv pointer to display driver
  * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon
  */
-LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv)
+bool LV_ATTRIBUTE_FLUSH_READY lv_disp_flush_is_last(lv_disp_drv_t * disp_drv)
 {
     return disp_drv->draw_buf->flushing_last;
 }
index d3425fe..93a6b46 100644 (file)
@@ -173,10 +173,8 @@ typedef struct _lv_disp_t {
     struct _lv_obj_t * top_layer;   /**< @see lv_disp_get_layer_top*/
     struct _lv_obj_t * sys_layer;   /**< @see lv_disp_get_layer_sys*/
     uint32_t screen_cnt;
-uint8_t draw_prev_over_act  :
-    1;          /**< 1: Draw previous screen over active screen*/
-uint8_t del_prev  :
-    1;          /**< 1: Automatically delete the previous screen when the screen load animation is ready*/
+    uint8_t draw_prev_over_act : 1; /**< 1: Draw previous screen over active screen*/
+    uint8_t del_prev : 1;           /**< 1: Automatically delete the previous screen when the screen load anim. is ready*/
     uint8_t rendering_in_progress : 1; /**< 1: The current screen rendering is in progress*/
 
     lv_opa_t bg_opa;                /**<Opacity of the background color or wallpaper*/
@@ -332,7 +330,7 @@ lv_disp_rot_t lv_disp_get_rotation(lv_disp_t * disp);
  * Call in the display driver's `flush_cb` function when the flushing is finished
  * @param disp_drv pointer to display driver in `flush_cb` where this function is called
  */
-LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv);
+void /* LV_ATTRIBUTE_FLUSH_READY */ lv_disp_flush_ready(lv_disp_drv_t * disp_drv);
 
 /**
  * Tell if it's the last area of the refreshing process.
@@ -340,7 +338,7 @@ LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv);
  * @param disp_drv pointer to display driver
  * @return true: it's the last area to flush; false: there are other areas too which will be refreshed soon
  */
-LV_ATTRIBUTE_FLUSH_READY bool lv_disp_flush_is_last(lv_disp_drv_t * disp_drv);
+bool /* LV_ATTRIBUTE_FLUSH_READY */ lv_disp_flush_is_last(lv_disp_drv_t * disp_drv);
 
 //! @endcond
 
index afd1dc4..21ec0ce 100644 (file)
@@ -30,7 +30,7 @@ extern "C" {
 #define LV_INDEV_DEF_SCROLL_LIMIT         10
 
 /*Drag throw slow-down in [%]. Greater value -> faster slow-down*/
-#define LV_INDEV_DEF_SCROLL_THROW         2
+#define LV_INDEV_DEF_SCROLL_THROW         10
 
 //x轴滑动补偿,值越大越快,尽量不超过分辨率的一半
 #if PROJECT_NAME_G3_K01 
@@ -55,10 +55,10 @@ extern "C" {
 
 
 /*Gesture threshold in pixels*/
-#define LV_INDEV_DEF_GESTURE_LIMIT        20
+#define LV_INDEV_DEF_GESTURE_LIMIT        50
 
 /*Gesture min velocity at release before swipe (pixels)*/
-#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 2
+#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3
 
 
 /**********************
index c12a594..6c84346 100644 (file)
@@ -46,7 +46,7 @@
  * You have to call this function periodically
  * @param tick_period the call period of this function in milliseconds
  */
-LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period)
+void LV_ATTRIBUTE_TICK_INC lv_tick_inc(uint32_t tick_period)
 {
     tick_irq_flag = 0;
     sys_time += tick_period;
index 949f56b..d493ad3 100644 (file)
@@ -40,7 +40,7 @@ extern "C" {
  * You have to call this function periodically
  * @param tick_period the call period of this function in milliseconds
  */
-LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period);
+void /* LV_ATTRIBUTE_TICK_INC */ lv_tick_inc(uint32_t tick_period);
 #endif
 
 //! @endcond
index 7742fe7..80f7061 100644 (file)
@@ -47,7 +47,7 @@ extern "C" {
 
 #ifdef CONFIG_LV_PERF_MONITOR_ALIGN_TOP_LEFT
 #  define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_LEFT
-#elif defined(CONFIG_LV_USE_PERF_MONITOR_ALIGN_TOP_MID)
+#elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_MID)
 #  define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_MID
 #elif defined(CONFIG_LV_PERF_MONITOR_ALIGN_TOP_RIGHT)
 #  define CONFIG_LV_USE_PERF_MONITOR_POS LV_ALIGN_TOP_RIGHT
@@ -67,7 +67,7 @@ extern "C" {
 
 #ifdef CONFIG_LV_MEM_MONITOR_ALIGN_TOP_LEFT
 #  define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_LEFT
-#elif defined(CONFIG_LV_USE_MEM_MONITOR_ALIGN_TOP_MID)
+#elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_MID)
 #  define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_MID
 #elif defined(CONFIG_LV_MEM_MONITOR_ALIGN_TOP_RIGHT)
 #  define CONFIG_LV_USE_MEM_MONITOR_POS LV_ALIGN_TOP_RIGHT
index 0e26624..9ad5a14 100644 (file)
@@ -33,7 +33,7 @@
  *   GLOBAL FUNCTIONS
  **********************/
 
-LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num)
+void LV_ATTRIBUTE_FAST_MEM lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num)
 {
 #if LV_COLOR_DEPTH == 16
     uintptr_t buf_int = (uintptr_t)buf;
index 5ff7b1a..61b5013 100644 (file)
@@ -436,7 +436,7 @@ static inline uint32_t lv_color_to32(lv_color_t color)
  * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2`
  * @return the mixed color
  */
-LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix)
+static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix)
 {
     lv_color_t ret;
 
@@ -472,7 +472,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_co
     return ret;
 }
 
-LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out)
+static inline void LV_ATTRIBUTE_FAST_MEM lv_color_premult(lv_color_t c, uint8_t mix, uint16_t * out)
 {
 #if LV_COLOR_DEPTH != 1
     out[0] = (uint16_t)LV_COLOR_GET_R(c) * mix;
@@ -497,7 +497,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void lv_color_premult(lv_color_t c, uint8_t
  * @return the mixed color
  * @note 255 won't give clearly `c1`.
  */
-LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix)
+static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix_premult(uint16_t * premult_c1, lv_color_t c2, uint8_t mix)
 {
     lv_color_t ret;
 #if LV_COLOR_DEPTH != 1
@@ -528,7 +528,7 @@ LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix_premult(uint16_t * p
  * @param res_color the result color
  * @param res_opa the result opacity
  */
-LV_ATTRIBUTE_FAST_MEM static inline void lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa,
+static inline void LV_ATTRIBUTE_FAST_MEM lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa,
                                                                  lv_color_t fg_color, lv_opa_t fg_opa,
                                                                  lv_color_t * res_color, lv_opa_t * res_opa)
 {
@@ -644,7 +644,7 @@ static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_colo
 
 //! @cond Doxygen_Suppress
 //!
-LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num);
 
 //! @endcond
 lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl);
index bfb3934..cf2d0fb 100644 (file)
@@ -45,7 +45,7 @@ static const int16_t sin0_90_table[] = {
  * @param angle
  * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767
  */
-LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle)
+int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle)
 {
     int16_t ret = 0;
     angle       = angle % 360;
@@ -106,7 +106,7 @@ uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t
  * If root < 256: mask = 0x800
  * Else: mask = 0x8000
  */
-LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask)
+void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask)
 {
     x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/
 
index 4b2860a..771b4aa 100644 (file)
@@ -44,9 +44,9 @@ typedef struct {
  * @param angle
  * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767
  */
-LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle);
+int16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle);
 
-static inline LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_cos(int16_t angle)
+static inline int16_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle)
 {
     return lv_trigo_sin(angle + 90);
 }
@@ -84,7 +84,7 @@ uint16_t lv_atan2(int x, int y);
  * If root < 256: mask = 0x800
  * Else: mask = 0x8000
  */
-LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask);
 
 //! @endcond
 
index b7c602f..25f24c9 100644 (file)
@@ -365,7 +365,7 @@ void lv_mem_buf_free_all(void)
  * @param src pointer to the source buffer
  * @param len number of byte to copy
  */
-LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len)
 {
     uint8_t * d8 = dst;
     const uint8_t * s8 = src;
@@ -427,7 +427,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
  * @param v value to set [0..255]
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len)
 {
 
     uint8_t * d8 = (uint8_t *)dst;
@@ -470,7 +470,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
  * @param dst pointer to the destination buffer
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset_00(void * dst, size_t len)
 {
     uint8_t * d8 = (uint8_t *)dst;
     uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK;
@@ -508,7 +508,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len)
  * @param dst pointer to the destination buffer
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset_ff(void * dst, size_t len)
 {
     uint8_t * d8 = (uint8_t *)dst;
     uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK;
index 7a83b3d..9be9425 100644 (file)
@@ -183,7 +183,7 @@ static inline void lv_memset_ff(void * dst, size_t len)
  * @param src pointer to the source buffer
  * @param len number of byte to copy
  */
-LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len);
+void * /* LV_ATTRIBUTE_FAST_MEM */ lv_memcpy(void * dst, const void * src, size_t len);
 
 /**
  * Same as `memcpy` but optimized to copy only a few bytes.
@@ -191,7 +191,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
  * @param src pointer to the source buffer
  * @param len number of byte to copy
  */
-LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const void * src, size_t len)
+static inline void * LV_ATTRIBUTE_FAST_MEM lv_memcpy_small(void * dst, const void * src, size_t len)
 {
     uint8_t * d8 = (uint8_t *)dst;
     const uint8_t * s8 = (const uint8_t *)src;
@@ -212,21 +212,21 @@ LV_ATTRIBUTE_FAST_MEM static inline void * lv_memcpy_small(void * dst, const voi
  * @param v value to set [0..255]
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset(void * dst, uint8_t v, size_t len);
 
 /**
  * Same as `memset(dst, 0x00, len)` but optimized for 4 byte operation.
  * @param dst pointer to the destination buffer
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset_00(void * dst, size_t len);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_00(void * dst, size_t len);
 
 /**
  * Same as `memset(dst, 0xFF, len)` but optimized for 4 byte operation.
  * @param dst pointer to the destination buffer
  * @param len number of byte to set
  */
-LV_ATTRIBUTE_FAST_MEM void lv_memset_ff(void * dst, size_t len);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_memset_ff(void * dst, size_t len);
 
 //! @endcond
 
index 2b27894..a21038a 100644 (file)
@@ -64,9 +64,7 @@ void _lv_timer_core_init(void)
  * Call it periodically to handle lv_timers.
  * @return the time after which it must be called again
  */
-#include "helios_debug.h"
-#define lv_timer_log(msg, ...)      custom_log("lv_timer_log", msg, ##__VA_ARGS__)
-LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
+uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler(void)
 {
     TIMER_TRACE("begin");
 
@@ -74,13 +72,11 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void)
     static bool already_running = false;
     if(already_running) {
         TIMER_TRACE("already running, concurrent calls are not allow, returning");
-        lv_timer_log("lv_timer_handler:ERROR1:already_running:%d",already_running);
-        //return 1;
+        return 1;
     }
     already_running = true;
 
     if(lv_timer_run == false) {
-        lv_timer_log("lv_timer_handler:ERROR2:already_running:%d",already_running);
         already_running = false; /*Release mutex*/
         return 1;
     }
index a9a8e50..50da8c9 100644 (file)
@@ -65,7 +65,7 @@ void _lv_timer_core_init(void);
  * Call it periodically to handle lv_timers.
  * @return time till it needs to be run next (in ms)
  */
-LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void);
+uint32_t /* LV_ATTRIBUTE_TIMER_HANDLER */ lv_timer_handler(void);
 
 //! @endcond
 
@@ -75,7 +75,7 @@ LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler(void);
  * This function is used to simplify the porting.
  * @param __ms the period for running lv_timer_handler()
  */
-static inline LV_ATTRIBUTE_TIMER_HANDLER uint32_t lv_timer_handler_run_in_period(uint32_t ms)
+static inline uint32_t LV_ATTRIBUTE_TIMER_HANDLER lv_timer_handler_run_in_period(uint32_t ms)
 {
     static uint32_t last_tick = 0;
     uint32_t curr_tick = lv_tick_get();
index 8902d8b..1d2df0d 100644 (file)
@@ -208,7 +208,7 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr
 {
     LV_ASSERT_OBJ(obj, MY_CLASS);
 
-    lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;;
+    lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;
 
     if(btn_id >= btnm->btn_cnt) return;
 
@@ -216,6 +216,19 @@ void lv_btnmatrix_set_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_ctr
         lv_btnmatrix_clear_btn_ctrl_all(obj, LV_BTNMATRIX_CTRL_CHECKED);
     }
 
+    /* If we hide a button if all buttons are now hidden hide the whole button matrix to make focus behave correctly */
+    if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) {
+        bool all_buttons_hidden = true;
+        if(btnm->btn_cnt > 1) {
+            for(uint16_t btn_idx = 0; btn_idx < btnm->btn_cnt; btn_idx++) {
+                if(btn_idx == btn_id) continue;
+                if(!(btnm->ctrl_bits[btn_idx] & LV_BTNMATRIX_CTRL_HIDDEN)) all_buttons_hidden = false;
+            }
+
+        }
+        if(all_buttons_hidden) lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
+    }
+
     btnm->ctrl_bits[btn_id] |= ctrl;
     invalidate_button_area(obj, btn_id);
 
@@ -228,10 +241,15 @@ void lv_btnmatrix_clear_btn_ctrl(lv_obj_t * obj, uint16_t btn_id, lv_btnmatrix_c
 {
     LV_ASSERT_OBJ(obj, MY_CLASS);
 
-    lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;;
+    lv_btnmatrix_t * btnm = (lv_btnmatrix_t *)obj;
 
     if(btn_id >= btnm->btn_cnt) return;
 
+    /* If all buttons were hidden the whole button matrix is hidden so we need to check and remove hidden flag if present */
+    if(ctrl & LV_BTNMATRIX_CTRL_HIDDEN) {
+        if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN);
+    }
+
     btnm->ctrl_bits[btn_id] &= (~ctrl);
     invalidate_button_area(obj, btn_id);
 
@@ -520,6 +538,8 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
         btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE;
     }
     else if(code == LV_EVENT_FOCUSED) {
+        if(btnm->btn_cnt == 0) return;
+
         lv_indev_t * indev = lv_event_get_param(e);
         lv_indev_type_t indev_type = lv_indev_get_type(indev);
 
@@ -563,9 +583,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
             else btnm->btn_id_sel++;
             if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0;
 
+            uint16_t btn_id_start = btnm->btn_id_sel;
             while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) {
                 btnm->btn_id_sel++;
                 if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0;
+
+                if(btnm->btn_id_sel == btn_id_start) {
+                    btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE;
+                    break;
+                }
             }
         }
         else if(c == LV_KEY_LEFT) {
@@ -574,9 +600,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
             if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1;
             else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--;
 
+            uint16_t btn_id_start = btnm->btn_id_sel;
             while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) {
                 if(btnm->btn_id_sel > 0) btnm->btn_id_sel--;
                 else btnm->btn_id_sel = btnm->btn_cnt - 1;
+
+                if(btnm->btn_id_sel == btn_id_start) {
+                    btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE;
+                    break;
+                }
             }
         }
         else if(c == LV_KEY_DOWN) {
@@ -586,7 +618,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
                 btnm->btn_id_sel = 0;
                 while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) {
                     btnm->btn_id_sel++;
-                    if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0;
+                    if(btnm->btn_id_sel >= btnm->btn_cnt) {
+                        btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE;
+                        break;
+                    }
                 }
             }
             else {
@@ -614,7 +649,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e)
                 btnm->btn_id_sel = 0;
                 while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) {
                     btnm->btn_id_sel++;
-                    if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0;
+                    if(btnm->btn_id_sel >= btnm->btn_cnt) {
+                        btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE;
+                        break;
+                    }
                 }
             }
             else {
index 3246e4a..4667bd1 100644 (file)
@@ -112,7 +112,18 @@ void lv_img_set_src(lv_obj_t * obj, const void * src)
         if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL) {
             lv_mem_free((void *)img->src);
         }
-        img->src = src;
+
+               const void *variable_old_src = NULL;
+               if(img->src_type == LV_IMG_SRC_VARIABLE) {
+                       variable_old_src = img->src;
+               }
+               const void *variable_new_src = lv_mem_alloc(sizeof(lv_img_dsc_t));
+               LV_ASSERT_MALLOC(variable_new_src);
+               if(variable_new_src == NULL) return;
+               memcpy(variable_new_src, src, sizeof(lv_img_dsc_t));
+               
+        img->src = variable_new_src;
+               if(variable_old_src) lv_mem_free((void *)variable_old_src);
     }
     else if(src_type == LV_IMG_SRC_FILE || src_type == LV_IMG_SRC_SYMBOL) {
         /*If the new and the old src are the same then it was only a refresh.*/
@@ -121,7 +132,7 @@ void lv_img_set_src(lv_obj_t * obj, const void * src)
             /*If memory was allocated because of the previous `src_type` then save its pointer and free after allocation.
              *It's important to allocate first to be sure the new data will be on a new address.
              *Else `img_cache` wouldn't see the change in source.*/
-            if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL) {
+            if(img->src_type == LV_IMG_SRC_FILE || img->src_type == LV_IMG_SRC_SYMBOL || img->src_type == LV_IMG_SRC_VARIABLE) {
                 old_src = img->src;
             }
             char * new_str = lv_mem_alloc(strlen(src) + 1);
index 6eb1846..b12870d 100644 (file)
@@ -150,8 +150,8 @@ EXTMOD_SRCS = \
         extmod/vfs_reader.c \
         extmod/vfs_temp.c \
         extmod/vfs_temp_file.c \
-        extmod/vfs_fat_emmc.c \
-        extmod/vfs_fat_emmc_file.c \
+        extmod/vfs_fat_sdio.c \
+        extmod/vfs_fat_sdio_file.c \
         lib/littlefs/lfs1.c \
         lib/littlefs/lfs1_util.c \
         lib/littlefs/lfs2.c \
@@ -169,6 +169,7 @@ QPY_SRCS = \
         ports/quectel/core/build/_frozen_mpy.c \
                ports/quectel/core/source/random.c \
         ports/quectel/core/source/audio_audio.c \
+        ports/quectel/core/source/audio_handle.c \
         ports/quectel/core/source/audio_queue.c \
         ports/quectel/core/source/audio_record.c \
         ports/quectel/core/source/audio_tts.c \
@@ -221,6 +222,7 @@ QPY_SRCS = \
         ports/quectel/core/source/modgnss.c \
         ports/quectel/core/source/modlpm.c \
         ports/quectel/core/source/modlvgl.c \
+        ports/quectel/core/source/modlvgl_other_hander.c \
         ports/quectel/core/source/modlwm2m.c \
         ports/quectel/core/source/modmachine.c \
         ports/quectel/core/source/modmisc.c \
@@ -236,7 +238,9 @@ QPY_SRCS = \
         ports/quectel/core/source/modsim.c \
         ports/quectel/core/source/modslipif.c \
         ports/quectel/core/source/modsms.c \
+        ports/quectel/core/source/modussd.c \
         ports/quectel/core/source/modsocket.c \
+        ports/quectel/core/source/modwifi.c \
         ports/quectel/core/source/modtp.c \
         ports/quectel/core/source/moduos.c \
         ports/quectel/core/source/modutils.c \
@@ -257,6 +261,8 @@ QPY_SRCS = \
         ports/quectel/core/source/tp_gt9xx.c \
         ports/quectel/core/source/tp_xpt2046.c \
         ports/quectel/core/source/tp_cst816.c \
+       ports/quectel/core/source/tp_ft6x36.c \
+        ports/quectel/core/source/tp_st1615.c \
         ports/quectel/core/source/modGsensor.c \
         ports/quectel/core/source/modGsensor_SC7A20.c \
         ports/quectel/core/source/modHsensor.c \
@@ -273,6 +279,7 @@ QPY_SRCS = \
         ports/quectel/core/source/sim_esim.c \
         ports/quectel/core/source/modG711.c \
         ports/quectel/core/source/modG729.c \
+        ports/quectel/core/source/modG722.c \
         ports/quectel/core/source/modcan_mcp2515.c \
         ports/quectel/core/source/modextuart_wk2114.c \
         ports/quectel/core/source/modextgpio_aw9523.c \
@@ -285,7 +292,18 @@ QPY_SRCS = \
         ports/quectel/core/source/modwlan.c\
         ports/quectel/core/source/code128_p.c \
         ports/quectel/core/source/modmask.c \
-        ports/quectel/core/source/machine_one_wire.c
+        ports/quectel/core/source/machine_one_wire.c\
+       ports/quectel/core/source/modalipay_collection.c \
+        ports/quectel/core/source/modsif.c\
+        ports/quectel/core/source/jrtc.c \
+        ports/quectel/core/source/modnfc.c \
+        ports/quectel/core/source/nfc_sl6320.c \
+       ports/quectel/core/source/modstk.c \
+        ports/quectel/core/source/modalipay_se.c \
+        ports/quectel/core/source/modvoip.c \
+        ports/quectel/core/source/modipsec.c \
+        ports/quectel/core/source/modecdsa.c \
+        ports/quectel/core/source/modecdh.c
         
 ifeq ($(CONFIG_QUECTHING), y)
 ifeq ($(strip $(PLAT)),RDA)
@@ -357,6 +375,7 @@ lib/lvgl/src/extra/widgets/spinner/lv_spinner.c \
 lib/lvgl/src/extra/widgets/tabview/lv_tabview.c \
 lib/lvgl/src/extra/widgets/tileview/lv_tileview.c \
 lib/lvgl/src/extra/widgets/win/lv_win.c \
+lib/lvgl/src/extra/others/ime/lv_ime_pinyin.c \
 lib/lvgl/src/core/lv_disp.c \
 lib/lvgl/src/core/lv_group.c \
 lib/lvgl/src/core/lv_indev.c \
@@ -376,11 +395,11 @@ lib/lvgl/src/draw/lv_draw_arc.c \
 lib/lvgl/src/draw/lv_draw.c \
 lib/lvgl/src/draw/lv_draw_img.c \
 lib/lvgl/src/draw/lv_draw_label.c \
+lib/lvgl/src/draw/lv_draw_layer.c \
 lib/lvgl/src/draw/lv_draw_line.c \
 lib/lvgl/src/draw/lv_draw_mask.c \
 lib/lvgl/src/draw/lv_draw_rect.c \
 lib/lvgl/src/draw/lv_draw_transform.c \
-lib/lvgl/src/draw/lv_draw_layer.c \
 lib/lvgl/src/draw/lv_draw_triangle.c \
 lib/lvgl/src/draw/lv_img_buf.c \
 lib/lvgl/src/draw/lv_img_cache.c \
@@ -545,8 +564,48 @@ lib/lvgl/src/widgets/lv_roller.c \
 lib/lvgl/src/widgets/lv_slider.c \
 lib/lvgl/src/widgets/lv_switch.c \
 lib/lvgl/src/widgets/lv_table.c \
-lib/lvgl/src/widgets/lv_textarea.c
-
+lib/lvgl/src/widgets/lv_textarea.c \
+lib/lvgl/freetype-2.11.1/src/autofit/autofit.c \
+lib/lvgl/freetype-2.11.1/src/base/ftbase.c \
+lib/lvgl/freetype-2.11.1/src/base/ftbbox.c \
+lib/lvgl/freetype-2.11.1/src/base/ftbdf.c \
+lib/lvgl/freetype-2.11.1/src/base/ftbitmap.c \
+lib/lvgl/freetype-2.11.1/src/base/ftcid.c \
+lib/lvgl/freetype-2.11.1/src/base/ftfstype.c \
+lib/lvgl/freetype-2.11.1/src/base/ftgasp.c \
+lib/lvgl/freetype-2.11.1/src/base/ftglyph.c \
+lib/lvgl/freetype-2.11.1/src/base/ftgxval.c \
+lib/lvgl/freetype-2.11.1/src/base/ftinit.c \
+lib/lvgl/freetype-2.11.1/src/base/ftmm.c \
+lib/lvgl/freetype-2.11.1/src/base/ftotval.c \
+lib/lvgl/freetype-2.11.1/src/base/ftpatent.c \
+lib/lvgl/freetype-2.11.1/src/base/ftpfr.c \
+lib/lvgl/freetype-2.11.1/src/base/ftstroke.c \
+lib/lvgl/freetype-2.11.1/src/base/ftsynth.c \
+lib/lvgl/freetype-2.11.1/src/base/fttype1.c \
+lib/lvgl/freetype-2.11.1/src/base/ftwinfnt.c \
+lib/lvgl/freetype-2.11.1/src/bdf/bdf.c \
+lib/lvgl/freetype-2.11.1/src/bzip2/ftbzip2.c \
+lib/lvgl/freetype-2.11.1/src/cache/ftcache.c \
+lib/lvgl/freetype-2.11.1/src/cff/cff.c \
+lib/lvgl/freetype-2.11.1/src/cid/type1cid.c \
+lib/lvgl/freetype-2.11.1/src/gzip/ftgzip.c \
+lib/lvgl/freetype-2.11.1/src/lzw/ftlzw.c \
+lib/lvgl/freetype-2.11.1/src/pcf/pcf.c \
+lib/lvgl/freetype-2.11.1/src/pfr/pfr.c \
+lib/lvgl/freetype-2.11.1/src/psaux/psaux.c \
+lib/lvgl/freetype-2.11.1/src/pshinter/pshinter.c \
+lib/lvgl/freetype-2.11.1/src/psnames/psnames.c \
+lib/lvgl/freetype-2.11.1/src/raster/raster.c \
+lib/lvgl/freetype-2.11.1/src/sdf/sdf.c \
+lib/lvgl/freetype-2.11.1/src/sfnt/sfnt.c \
+lib/lvgl/freetype-2.11.1/src/smooth/smooth.c \
+lib/lvgl/freetype-2.11.1/src/truetype/truetype.c \
+lib/lvgl/freetype-2.11.1/src/type1/type1.c \
+lib/lvgl/freetype-2.11.1/src/type42/type42.c \
+lib/lvgl/freetype-2.11.1/src/winfonts/winfnt.c \
+lib/lvgl/freetype-2.11.1/src/base/ftsystem.c \
+lib/lvgl/freetype-2.11.1/src/base/ftdebug.c
 endif
 
 
@@ -582,7 +641,35 @@ $(NAME)_INCS += \
        lib/lvgl/src/gpu        \
        lib/lvgl/src/hal        \
        lib/lvgl/src/misc       \
-       lib/lvgl/src/widgts
+       lib/lvgl/src/widgts \
+    lib/lvgl/freetype-2.11.1/include \
+    lib/lvgl/freetype-2.11.1/include/dlg \
+    lib/lvgl/freetype-2.11.1/include/freetype \
+    lib/lvgl/freetype-2.11.1/include/freetype/config \
+    lib/lvgl/freetype-2.11.1/include/freetype/internal \
+    lib/lvgl/freetype-2.11.1/include/freetype/internal/services \
+    lib/lvgl/freetype-2.11.1/src/base \
+    lib/lvgl/freetype-2.11.1/src/autofit \
+    lib/lvgl/freetype-2.11.1/src/bdf    \
+    lib/lvgl/freetype-2.11.1/src/bzip2  \
+    lib/lvgl/freetype-2.11.1/src/cache  \
+    lib/lvgl/freetype-2.11.1/src/cff    \
+    lib/lvgl/freetype-2.11.1/src/cid    \
+    lib/lvgl/freetype-2.11.1/src/gzip   \
+    lib/lvgl/freetype-2.11.1/src/lzw    \
+    lib/lvgl/freetype-2.11.1/src/pcf    \
+    lib/lvgl/freetype-2.11.1/src/pfr    \
+    lib/lvgl/freetype-2.11.1/src/psaux  \
+    lib/lvgl/freetype-2.11.1/src/pshinter   \
+    lib/lvgl/freetype-2.11.1/src/psnames    \
+    lib/lvgl/freetype-2.11.1/src/raster \
+    lib/lvgl/freetype-2.11.1/src/sdf    \
+    lib/lvgl/freetype-2.11.1/src/sfnt   \
+    lib/lvgl/freetype-2.11.1/src/smooth \
+    lib/lvgl/freetype-2.11.1/src/truetype   \
+    lib/lvgl/freetype-2.11.1/src/type1  \
+    lib/lvgl/freetype-2.11.1/src/type42 \
+    lib/lvgl/freetype-2.11.1/src/winfonts
 endif
 
 EMPTY=
@@ -669,6 +756,18 @@ endif
 ifeq ($(CONFIG_RTMP), y)
 $(NAME)_COMPONENTS += components/rtmpdump
 endif
+ifeq ($(CONFIG_JRTC), y)
+$(NAME)_COMPONENTS += components/jpeg
+$(NAME)_COMPONENTS += components/jrtc
+$(NAME)_INCS += ../../components/jrtc/inc
+
+endif
+
+ifeq ($(CONFIG_SENSOR_VC9202), y)
+$(NAME)_COMPONENTS += components/sensor/VC9202
+$(NAME)_INCS += ../../components/sensor/VS9202/inc
+$(NAME)_INCS += ../../components/sensor/VS9202/algo/inc
+endif
 
 ifeq ($(CONFIG_POC), y)
 $(NAME)_CFLAGS += \
@@ -707,6 +806,35 @@ ifeq ($(CONFIG_GMSSL), y)
 $(NAME)_COMPONENTS += components/GMSSL
 endif
 
+ifeq ($(CONFIG_GB2312), y)
+$(NAME)_COMPONENTS += components/decode/gb2312
+endif
+
+ifeq ($(CONFIG_ESIMSDK), y)
+$(NAME)_COMPONENTS += components/esim
+endif
+
+ifeq ($(CONFIG_NFC_SL6320), y)
+$(NAME)_COMPONENTS += components/NFC/SL6320
+endif
+
+ifeq ($(CONFIG_VOIP), y)
+$(NAME)_INCS += ../../components/voip/libexosip2/include  \
+                ../../components/voip/libosip2/include  \
+                ../../components/voip/rtp
+$(NAME)_COMPONENTS += components/voip
+endif
+
+ifeq ($(CONFIG_ETHERNET_W5500), y)
+$(NAME)_COMPONENTS += components/ethernet
+$(NAME)_INCS += ../../components/ethernet/wiznet
+endif
+
+ifeq ($(CONFIG_SLIP), y)
+$(NAME)_COMPONENTS += components/slip
+$(NAME)_INCS += ../../components/slip
+endif
+
 $(NAME)_CFLAGS += -Wno-error=implicit-fallthrough
 
 $(NAME)_PRIVATE_SCRIPT = private.mk
index 796f5ce..94e006c 100644 (file)
@@ -15,6 +15,7 @@
 import uos
 import ujson
 import dial
+import gc
 
 try:
     import usys as sys
@@ -53,9 +54,9 @@ def _auto_activate_pdpcontext():
                             raise ValueError("The format of the datacall_config.json is incorrect.")
                         value_of_key_autoActivate = value_of_key_profileid.get("autoActivate", 0)
                         value_of_key_autoConnect = value_of_key_profileid.get("autoConnect", 0)
-
-                        if value_of_key_autoActivate == 1:
+                        if value_of_key_autoConnect==1:
                             dial.setAutoConnect(profile_id, value_of_key_autoConnect)
+                        if value_of_key_autoActivate == 1:
                             dial.setAsynMode(1)
                             ret = -1
                             repeat_count = 2
@@ -113,6 +114,11 @@ def _repl_enable():
             fd.write(repl_data)
 
 try:
+    try:
+        gc.threshold(int(gc.mem_free() * 75 / 100))
+    except Exception: 
+        print('error ocurs in gc set threshold begin.')
+        
     udev = None
     bdev = None
     try:
@@ -144,8 +150,17 @@ try:
             fota.update()
         except Exception as e: 
             sys.print_exception(e)
+
+    try:
+        gc.threshold(-1)
+    except Exception: 
+        print('error ocurs in gc set threshold end.')
         
 except Exception: 
+        try:
+            gc.threshold(-1)
+        except Exception: 
+            print('error ocurs in gc set threshold end2.')
         print('error ocurs in boot step.')
 
 finally:
index b538698..7908334 100644 (file)
@@ -25,6 +25,61 @@ Perfect auto mount fs
 
 '''
 
+datacall_flag = 1
+
+def _auto_activate_pdpcontext():
+    if "datacall_config.json" not in uos.listdir('/usr'):
+        # raise ValueError("Not found datacall_config.json.")
+        dial.setAutoConnect(1, 1)
+        dial.setAsynMode(1)
+        dial.start(1, 0, '', '', '', 0)
+        dial.setAsynMode(0)
+    else:
+        retval = dial.getPdpRange()
+        max_profile = retval[1]
+
+        with open("/usr/datacall_config.json", "r", encoding='utf-8') as fd:
+            try:
+                datacall_config = ujson.load(fd)
+                if not isinstance(datacall_config, dict):
+                    raise ValueError("The format of the datacall_config.json is incorrect.")
+
+                for profile_id in range(1, max_profile+1):
+                    value_of_key_profileid = datacall_config.get(str(profile_id), None)
+                    if value_of_key_profileid is not None:
+                        if not isinstance(value_of_key_profileid, dict):
+                            raise ValueError("The format of the datacall_config.json is incorrect.")
+                        value_of_key_autoActivate = value_of_key_profileid.get("autoActivate", 0)
+                        value_of_key_autoConnect = value_of_key_profileid.get("autoConnect", 0)
+
+                        if value_of_key_autoActivate == 1:
+                            dial.setAutoConnect(profile_id, value_of_key_autoConnect)
+                            dial.setAsynMode(1)
+                            ret = -1
+                            repeat_count = 2
+                            while (ret == -1) and (repeat_count >= 0):
+                                repeat_count -= 1
+                                ret = dial.start(profile_id, 0, '', '', '', 0)
+                            if ret == -1:
+                                print('Activation of the {} PDP Context failed.'.format(profile_id))
+                            dial.setAsynMode(0)
+                    else:
+                        # ÕÒ²»µ½profile_idÕâһ·µÄÅäÖÃÎļþ£¬ÈÏΪûÓÐÅäÖ㬺ÍautoActivate/autoConnectÅäÖÃΪ0×öͬµÈ´¦Àí
+                        # ¼´²»²¦ºÅ¡¢²»ÉèÖØÁ¬
+                        pass
+            except Exception:
+                raise ValueError("The format of the datacall_config.json is incorrect.")
+
+def _check_data_call():
+    for pdp in range(1, 5):
+        nw_sta = dial.getInfo(pdp, 2)
+        if (nw_sta != -1) and (nw_sta[2][0] == 0) and (nw_sta[3][0] == 0):
+            continue
+        elif (nw_sta != -1) and ((nw_sta[2][0] == 1) or (nw_sta[3][0] == 1)):
+            return 1
+    return 0
+
+
 def _repl_enable():
     global datacall_flag
     if "system_config.json" in uos.listdir("/usr/"):
@@ -49,17 +104,58 @@ def _repl_enable():
             fd.write(repl_data)
 
 try:
-    bdev = uos.VfsLfs1(32, 32, 32, "customer_fs")
-    udev = uos.VfsLfs1(32, 32, 32, "customer_backup_fs")
-    uos.mount(bdev, '/usr')
-    uos.mount(udev, '/bak')
-    print('mount.')
-    backup_restore.main() # backup_restore main process
-    
-    fota = app_fota.new() # app fota update main process
-    fota.update()
+    try:
+        gc.threshold(int(gc.mem_free() * 75 / 100))
+    except Exception: 
+        print('error ocurs in gc set threshold begin.')
+        
+    udev = None
+    bdev = None
+    try:
+        from uos import VfsLfs1 as VfsLfs
+    except Exception:
+        from uos import VfsLfs2 as VfsLfs
+
+    try:
+        udev = VfsLfs(32, 32, 32, "customer_fs")
+        uos.mount(udev, '/usr')
+        bdev = VfsLfs(32, 32, 32, "customer_backup_fs")
+        uos.mount(bdev, '/bak')
+        print('LFS mount.')
+
+    except Exception: 
+        print('error ocurs in LFS mount.')
+
+    if bdev != None:
+        try:
+            import backup_restore
+            backup_restore.main() # backup_restore main process
+        except Exception as e: 
+            sys.print_exception(e)
+       
+    if udev != None:
+        try:
+            import app_fota
+            fota = app_fota.new() # app fota update main process
+            fota.update()
+        except Exception as e: 
+            sys.print_exception(e)
+
+    try:
+        gc.threshold(-1)
+    except Exception: 
+        print('error ocurs in gc set threshold end.')
+        
+except Exception: 
+        try:
+            gc.threshold(-1)
+        except Exception: 
+            print('error ocurs in gc set threshold end2.')
+        print('error ocurs in boot step.')
 
-except Exception:
-    print('error ocurs in boot step.')
 finally:
     _repl_enable()
+    if datacall_flag == 1:
+        ret = _check_data_call()
+        if ret == 0:
+            _auto_activate_pdpcontext()
\ No newline at end of file
index ed38885..46828f6 100644 (file)
@@ -227,6 +227,8 @@ class aLiYun:
         name,platform = uos.uname()[1].split("=",1)
         if platform == "EC600E" or platform == "EC800E":
             _thread.stack_size(8 * 1024)
+        elif platform == "FCM362K":
+            _thread.stack_size(3 * 1024)
         else:
             _thread.stack_size(16 * 1024)
         self.listen_task_id = _thread.start_new_thread(self.__listen, ())
index fac458a..a2d0470 100644 (file)
 #!python3
 # -*- coding:utf-8 -*-
 
+import uos
 import app_fota_download
 import app_fota_updater
 from app_fota_mount import AppFotaPkgMount
+
+name, platform = uos.uname()[1].split("=",1)
+
 class new(object):
     def __init__(self):
         self.app_fota_pkg_mount = AppFotaPkgMount()
         self.app_fota_pkg_mount.mount_disk()        
-    def download(self, url, file_name, headers=None):
-        return app_fota_download.download(url, file_name, headers)
+    def download(self, url, file_name, headers=None, ipvtype=0, ext_enable = False, spi_port=None, spi_clk=None, dl_location=None, username=None, password=None):
+        return app_fota_download.download(url, file_name, headers, ipvtype = ipvtype, ext_enable = ext_enable, spi_port= spi_port, spi_clk= spi_clk, dl_location= dl_location, username=username, password=password)
     def bulk_download(self, info=[], headers=None):
         return app_fota_download.bulk_download(info, headers)
     def set_update_flag(self):
         app_fota_download.set_update_flag()
     def update(self):
         return app_fota_updater.update()
+
+    if platform == "FCM362K":
+        def download_fw(self, url, headers=None):
+            return app_fota_download.download_forFCM362K(url, headers)
     
\ No newline at end of file
index a238cb3..1c32ca9 100644 (file)
@@ -19,7 +19,14 @@ import uos
 import request
 import ujson
 import ql_fs
+import fota
 from app_fota_mount import AppFotaPkgMount
+
+name, platform = uos.uname()[1].split("=",1)
+
+if platform == "FCM362K":
+    from misc import Power
+
 app_fota_pkg_mount = AppFotaPkgMount()
 
 def get_updater_dir():
@@ -84,16 +91,16 @@ def get_download_stat():
     return _get_download_stat()
 
 
-def _fetch(url, fetched_size, headers=None):
+def _fetch(url, fetched_size, headers=None, ipvtype=0, username=None,password=None):
     if headers is None or not isinstance(headers, dict):
         request_headers = {}
     else:
         request_headers = headers
     request_headers['Range'] = 'bytes={}-'.format(fetched_size)
-    return request.get(url, headers=request_headers)
+    return request.get(url, headers=request_headers, ipvtype = ipvtype, username = username, password = password)
 
 
-def _update_download_stat(url, file_name, total_size):
+def _update_download_stat(url, file_name, total_size, download_file_name=None):
     need_append_stat = 1
     download_stat = _get_download_stat()
     if download_stat:
@@ -101,6 +108,7 @@ def _update_download_stat(url, file_name, total_size):
             if item['name'].lower() == file_name.lower():
                 item['url'] = url
                 item['total_size'] = total_size
+                item['dl_location'] = download_file_name
                 need_append_stat = 0
                 break
     else:
@@ -111,6 +119,7 @@ def _update_download_stat(url, file_name, total_size):
         single_download_stat['url'] = url
         single_download_stat['name'] = file_name
         single_download_stat['total_size'] = total_size
+        single_download_stat['dl_location'] = download_file_name
         download_stat.append(single_download_stat)
 
     json_str = ujson.dumps(download_stat)
@@ -135,9 +144,24 @@ def delete_update_file(file_name):
     fp.close()
 
 
-def download(url, file_name, headers=None):
+def download(url, file_name, headers=None, ipvtype=0, username=None, password=None, ext_enable = False, spi_port=None, spi_clk=None, dl_location=None):
     download_file_name = get_updater_dir() + '/' + file_name
     ql_fs.mkdirs(ql_fs.path_dirname(download_file_name))
+    if dl_location is not None and dl_location.split('/')[1] is not 'usr':
+        download_file_name = '/' + dl_location.split('/')[1] + '/.updater' + file_name
+        ql_fs.mkdirs(ql_fs.path_dirname(download_file_name))
+    directory_part = file_name.split('/')[1]
+    if directory_part is 'usr' or directory_part is 'bak':
+        if dl_location is not None:
+            directory_part = dl_location.split('/')[1]
+    ext_fs_config = get_updater_dir() + '/ext_config.json'
+    if ext_enable is True and spi_port is not None and spi_clk is not None:
+            with open(ext_fs_config, "w+", encoding='utf-8') as fd:
+                try:
+                    repl_data = ujson.dumps({"spiport": spi_port, "spiclk": spi_clk, "directory": directory_part, "dl_location": download_file_name})
+                    fd.write(repl_data)
+                except Exception:
+                    raise ValueError("write ext_config.json failed")
 
     single_download_stat = _get_download_stat_by_file(file_name)
     if single_download_stat:
@@ -151,14 +175,14 @@ def download(url, file_name, headers=None):
     else:
         fetched_size = 0
 
-    r = _fetch(url, fetched_size, headers)
+    r = _fetch(url, fetched_size, headers, ipvtype=ipvtype, username=username, password=password)
     if r.status_code == 200 or r.status_code == 206:
         total_size = -1
         need_refresh_stat_again = 0
         file_open_mode = ''
         if not single_download_stat:
             total_size = 'unknown'
-            _update_download_stat(url, file_name, total_size)
+            _update_download_stat(url, file_name, total_size, download_file_name)
             file_open_mode = 'wb+'
         else:
             file_open_mode = 'ab+'
@@ -183,12 +207,49 @@ def download(url, file_name, headers=None):
             return -1
 
         total_size = ql_fs.path_getsize(download_file_name)
-        _update_download_stat(url, file_name, total_size)
+        _update_download_stat(url, file_name, total_size, download_file_name)
 
         return 0
     else:
         r.close()
         return -1
+if platform == "FCM362K":
+    def download_forFCM362K(url, headers=None):
+        fota1 = fota()
+        fetched_size = 0
+        r = _fetch(url, fetched_size, headers)
+        if r.status_code == 200 or r.status_code == 206:
+            content = r.content
+            f = fota1.fcm362k_ota_start(r.sizeof)
+            if f != 0:
+                r.close()
+                return -1
+            try:
+                while True:
+                    c = next(content)
+                    length = len(c)
+                    decoded_c = c.decode('utf-8')
+                    for i in range(0, length, 1024):
+                        if i > 0 and length < 2048:
+                            len_forota = length - 1024
+                        else :
+                            len_forota = 1024
+                        f = fota1.fcm362k_ota_write(decoded_c[i:i + 1024],len_forota)
+                        if f != 0:
+                            r.close()
+                            return -1
+            except StopIteration:
+                r.close()
+
+            f = fota1.fcm362k_ota_end()
+            if f != 0:
+                r.close()
+                return -1
+            Power.powerRestart()
+            return 0
+        else:
+            r.close()
+            return -1
 
 
 def bulk_download(info=None, headers=None):
@@ -198,7 +259,11 @@ def bulk_download(info=None, headers=None):
     for item in info:
         url = item['url']
         file_name = item['file_name']
-        if download(url, file_name, headers) == -1:
+        spi_port = item.get('spi_port')
+        spi_clk = item.get('spi_clk')
+        ext_enable = item.get('ext_enable')
+        dl_location = item.get('dl_location')
+        if download(url, file_name, headers, ipvtype=0, ext_enable = ext_enable, spi_port= spi_port, spi_clk= spi_clk, dl_location = dl_location) == -1:
             fail_result.append(item)
     if len(fail_result):
         return fail_result
index 66dd9fa..0af4083 100644 (file)
@@ -20,6 +20,7 @@ import ujson
 import ql_fs
 import checksum
 from app_fota_mount import AppFotaPkgMount
+import uos
 app_fota_pkg_mount = AppFotaPkgMount()
 
 def get_updater_dir():
@@ -31,6 +32,9 @@ def get_download_stat_file():
 def get_update_flag_file():
     return app_fota_pkg_mount.fota_dir+'/usr/.updater/update.flag'
 
+def get_ext_config_file():
+    return app_fota_pkg_mount.fota_dir+'/usr/.updater/ext_config.json'
+
 updater_dir = get_updater_dir()
 download_stat_file = get_download_stat_file()
 download_stat_file_max_size = 16384
@@ -46,7 +50,22 @@ def _check_update_flag():
         return 0
 
 def update():
+    try:
+        from uos import VfsLfs1 as VfsLfs
+    except Exception:
+        from uos import VfsLfs2 as VfsLfs
     if _check_update_flag():
+        if ql_fs.path_exists(get_ext_config_file()):
+            with open(get_ext_config_file(), "r", encoding='utf-8') as fd:
+                try:
+                    json_data = ujson.load(fd)
+                    spi_port = int(json_data.get("spiport", None))
+                    spi_clk = int(json_data.get("spiclk", None))
+                    directory = str(json_data.get("directory",None))
+                    ldev = VfsLfs(32, 32, 32, "ext_fs", spi_port, spi_clk)
+                    uos.mount(ldev, '/'+directory)
+                except Exception:
+                    raise ValueError("update with ext failed")
         try:
             if not ql_fs.path_exists(get_download_stat_file()):
                 return -1
@@ -63,9 +82,16 @@ def update():
             print(download_stat)
             download_stat_tmp = download_stat[:]
             print(download_stat_tmp)
+            ext_name = None
             for item in download_stat:
+                download_file_name = None
                 file_name = item['name']
-                download_file_name = get_updater_dir() + '/' + file_name
+                download_file_name = item['dl_location']
+                if download_file_name is not None and download_file_name.split('/')[1] is not 'usr':
+                    download_file_name = item['dl_location']
+                    ext_name = download_file_name.split('/')[1]
+                else:
+                    download_file_name = get_updater_dir() + '/' + file_name
                 if ql_fs.path_exists(download_file_name):
                     ql_fs.mkdirs(ql_fs.path_dirname(file_name))
                     ql_fs.file_copy(file_name, download_file_name)
@@ -82,6 +108,9 @@ def update():
             uos.remove(get_download_stat_file())
             ql_fs.rmdirs(get_updater_dir())
             app_fota_pkg_mount.umount_disk()
+            if ext_name:
+                ql_fs.rmdirs(ext_name + '/.updater')
+                uos.umount('/'+ ext_name)
             return 0
                 
         except Exception as e:
index eef830f..f80033d 100644 (file)
@@ -64,7 +64,11 @@ def bak_update(file, data):
     except Exception as e:
         return -2
     if backup_restore_flag:
-        _fs = uos.VfsLfs1(32, 32, 32, "customer_backup_fs")
+        try:
+            from uos import VfsLfs1 as VfsLfs
+        except Exception:
+            from uos import VfsLfs2 as VfsLfs
+        _fs = VfsLfs(32, 32, 32, "customer_backup_fs")
         uos.mount(_fs, _backup_root_dir)
         res = 0
         try:
@@ -99,7 +103,11 @@ def bak_file(file):
     except Exception as e:
         return -2
     if backup_restore_flag:
-        _fs = uos.VfsLfs1(32, 32, 32, "customer_backup_fs")
+        try:
+            from uos import VfsLfs1 as VfsLfs
+        except Exception:
+            from uos import VfsLfs2 as VfsLfs
+        _fs = VfsLfs(32, 32, 32, "customer_backup_fs")
         uos.mount(_fs, _backup_root_dir)
         res = 1
         try:
index 1b1a919..611b833 100644 (file)
@@ -31,7 +31,11 @@ class SecureStorage(object):
         if not isinstance(data, dict):
             return -1
         if not ql_fs.path_exists(cls.bak + cls._back_config_path):
-            _fs = uos.VfsLfs1(32, 32, 32, cls._customer_backup_fs)
+            try:
+                from uos import VfsLfs1 as VfsLfs
+            except Exception:
+                from uos import VfsLfs2 as VfsLfs
+            _fs = VfsLfs(32, 32, 32, cls._customer_backup_fs)
             uos.mount(_fs, cls._bak)
             try:
                 with open(cls._bak + cls._back_config_path, "w") as f:
index 7d1fb26..0ad4432 100644 (file)
@@ -31,9 +31,8 @@ def getLocation(*args):
         return -3
     if args[3] < 1 or args[3] > 300:
         return -4
-    profile_index = dial.getPdpRange()
-    if args[4] < profile_index[0] or args[4] > profile_index[1]:
-        raise ValueError("invalid value, profileIdx should be in [{},{}]".format(profile_index[0],profile_index[1]))
+    if args[4] < 1 or args[4] > 3:
+        raise ValueError("invalid value, profileIdx should be in [1,3]")
     # In order to keep consistent with other platforms --end  burols add 
     net_sta = net.getState()
     if net_sta != -1 and ((net_sta[1][0] == 1) or (net_sta[1][0] == 5)):
@@ -47,6 +46,10 @@ def getLocation(*args):
                 cellinfo = cellLocator_qpy.getCellLocreq(args[2])
                 if isinstance(cellinfo,int) == True:
                     raise ValueError("error info:getCellLocreq result error!")
+            except Exception as e:
+                print("Cell locator Get the coordinate error:%s "%str(e))
+                return -6
+            try:
                 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                 sockaddr = socket.getaddrinfo(args[0], args[1])[0][-1]
                 if args[3] > 0:
@@ -61,6 +64,7 @@ def getLocation(*args):
                     l = l.split(None, 2)
                     status = int(l[1])
                 except:
+                    sock.close()
                     raise ValueError("Connect FAIL!")
                 reason = ""
                 if status == 200:
@@ -75,18 +79,21 @@ def getLocation(*args):
                     try:
                         return cellLocator_qpy.encodeCellLocreq(data)
                     except Exception as e:
+                        print("Cell locator encode error:%s "%str(e))
                         return tuple([0.0, 0.0, 0])
                 else:
+                    sock.close()
                     if len(l) > 2:
                         reason = l[2].rstrip()
                         raise ValueError("error info:===='{}'====".format(reason))
             except Exception as e:
-                print("Cell locator Get the coordinate error:%s "%str(e))
-                return -3
+                print("Cell locator request error:%s "%str(e))
+                sock.close()
+                return -6
         else:
-            return -1
+            return -5
     else:
-        return -1
+        return -5
 
 #serverAddr, port, token, timeout, profileIdx, loc_method:wifi/cell/cell_wifi
 def startLocation(*args):
@@ -124,6 +131,7 @@ def startLocation(*args):
                     l = l.split(None, 2)
                     status = int(l[1])
                 except:
+                    sock.close()
                     raise ValueError("Connect FAIL!")
                 reason = ""
                 if status == 200:
@@ -136,14 +144,16 @@ def startLocation(*args):
                     sock.close()
                     return cellLocator_qpy.encodeCellLocreq(data)
                 else:
+                    sock.close()
                     if len(l) > 2:
                         reason = l[2].rstrip()
                         raise ValueError("error info:===='{}'====".format(reason))
             except Exception as e:
+                sock.close()
                 print("locator error:%s "%str(e))
-                return -3
+                return -6
         else:
-            return -1
+            return -5
     else:
-        return -1
+        return -5
 
index 2ac844c..c096387 100644 (file)
@@ -26,12 +26,14 @@ import uos
 import utime
 
 
-def setAutoActivate(profileID, enable):
+def setAutoActivate(profileID, enable,cur_simid=None):
     if profileID < 1 or profileID > 3:
         raise ValueError("invalid value, profileID should be in [1,3].")
     if enable != 0 and enable != 1:
         raise ValueError("invalid value, enable should be 0 or 1.")
-
+    if cur_simid != None and cur_simid != 0 and cur_simid != 1:
+        raise ValueError("invalid value, enable should be 0 or 1.")
+    
     if "datacall_config.json" in uos.listdir('/usr'):
         with open("/usr/datacall_config.json", "r", encoding='utf-8') as fd:
             try:
@@ -43,16 +45,23 @@ def setAutoActivate(profileID, enable):
                 if value_of_key_profileid is not None:
                     if not isinstance(value_of_key_profileid, dict):
                         raise ValueError("The format of the datacall_config.json is incorrect.")
-
-                    value_of_key_autoConnect = value_of_key_profileid.get("autoConnect", 0)
+                    if cur_simid ==1:
+                        datacall_config[str(profileID)]["autoActivate_1"] = enable
+                    else:
+                        datacall_config[str(profileID)]["autoActivate"] = enable
+                    # value_of_key_autoConnect = value_of_key_profileid.get("autoConnect", 0)
                     # value_of_key_autoConnect为0,有两种情况
                     # 1.autoConnect原本的值就是0
                     # 2.字典中没有autoConnect这个配置项,get获取失败,所以返回默认值0
-                    datacall_config[str(profileID)] = {"autoActivate": enable, "autoConnect": value_of_key_autoConnect}
+                    # datacall_config[str(profileID)] = {"autoActivate": enable, "autoConnect": value_of_key_autoConnect}
                 else:
                     # 这种情况说明用户删除了配置文件中的某些路配置,导致profileID虽然是合法的,但是配置文件中没有这一路配置信息
                     # 这种情况需要在配置文件中重新写入这一路的配置
-                    datacall_config[str(profileID)] = {"autoActivate": enable, "autoConnect": 0}
+                    # datacall_config[str(profileID)] = {"autoActivate": enable, "autoConnect": 0}
+                    if cur_simid ==1:
+                        datacall_config[str(profileID)] = {"autoActivate": 0, "autoConnect": 0,"autoActivate_1": enable}
+                    else:
+                        datacall_config[str(profileID)] = {"autoActivate": enable,"autoConnect": 0}
             except Exception:
                 raise ValueError("The format of the datacall_config.json is incorrect.")
         with open("/usr/datacall_config.json", "w", encoding='utf-8') as fd:
@@ -65,18 +74,23 @@ def setAutoActivate(profileID, enable):
             "2": {"autoActivate": 0, "autoConnect": 0},
             "3": {"autoActivate": 0, "autoConnect": 0}
         }
-        default_config[str(profileID)]["autoActivate"] = enable
+        if cur_simid ==1:
+            default_config[str(profileID)]["autoActivate_1"] = enable
+        else:
+            default_config[str(profileID)]["autoActivate"] = enable
         with open("/usr/datacall_config.json", "w", encoding='utf-8') as fd:
             default_config_json = ujson.dumps(default_config)
             fd.write(default_config_json)
 
 
-def setAutoConnect(profileID, enable):
+def setAutoConnect(profileID, enable, cur_simid=None):
     if profileID < 1 or profileID > 3:
         raise ValueError("invalid value, profileID should be in [1,3].")
     if enable != 0 and enable != 1:
         raise ValueError("invalid value, enable should be 0 or 1.")
-
+    if cur_simid != None and cur_simid != 0 and cur_simid != 1:
+        raise ValueError("invalid value, enable should be 0 or 1.")
+    
     if "datacall_config.json" in uos.listdir('/usr'):
         with open("/usr/datacall_config.json", "r", encoding='utf-8') as fd:
             try:
@@ -87,12 +101,17 @@ def setAutoConnect(profileID, enable):
                 if value_of_key_profileid is not None:
                     if not isinstance(value_of_key_profileid, dict):
                         raise ValueError("The format of the datacall_config.json is incorrect.")
-                    value_of_key_autoActivate = value_of_key_profileid.get("autoActivate", 0)
-                    datacall_config[str(profileID)] = {"autoActivate": value_of_key_autoActivate, "autoConnect": enable}
+                    if cur_simid ==1:
+                        datacall_config[str(profileID)]["autoConnect_1"] = enable
+                    else:
+                        datacall_config[str(profileID)]["autoConnect"] = enable
                 else:
                     # 这种情况说明用户删除了配置文件中的某些路配置,导致profileID虽然是合法的,但是配置文件中没有这一路配置信息
                     # 这种情况需要在配置文件中重新写入这一路的配置
-                    datacall_config[str(profileID)] = {"autoActivate": 0, "autoConnect": enable}
+                    if cur_simid ==1:
+                        datacall_config[str(profileID)] = {"autoActivate": 0, "autoConnect": 0,"autoConnect_1": enable}
+                    else:
+                        datacall_config[str(profileID)] = {"autoActivate": 0,"autoConnect": enable}
             except Exception:
                 raise ValueError("The format of the datacall_config.json is incorrect.")
         with open("/usr/datacall_config.json", "w", encoding='utf-8') as fd:
@@ -105,17 +124,25 @@ def setAutoConnect(profileID, enable):
             "2": {"autoActivate": 0, "autoConnect": 0},
             "3": {"autoActivate": 0, "autoConnect": 0}
         }
-        default_config[str(profileID)]["autoConnect"] = enable
+        if cur_simid ==1:
+            default_config[str(profileID)]["autoConnect_1"] = enable
+        else:
+            default_config[str(profileID)]["autoConnect"] = enable
         with open("/usr/datacall_config.json", "w", encoding='utf-8') as fd:
             default_config_json = ujson.dumps(default_config)
             fd.write(default_config_json)
+    if cur_simid != None:
+        dial.setAutoConnect(profileID, enable,cur_simid)
+    else:
+        dial.setAutoConnect(profileID, enable)
+
 
 
-def setPDPContext(profileID, ipType, apn, username, password, authType):
+def setPDPContext(profileID, ipType, apn, username, password, authType, cur_simid=None):
     if profileID < 1 or profileID > 3:
         raise ValueError("invalid value, profileID should be in [1,3].")
     if authType < 0 or authType >3:
-        raise ValueError("invalid value, authType should be in [0,3].")
+        raise ValueError("invalid value.")
     # Users can set apn, username, and password to None. 
     # When it is set to None, it means that the original values will not be changed and the original values will be used instead.
     if apn is None or username is None or password is None:
@@ -128,18 +155,24 @@ def setPDPContext(profileID, ipType, apn, username, password, authType):
             username = pdp_context[2]
         if password is None:
             password = pdp_context[3]
-
-    if len(username) == 0 and len(password) == 0 and authType != 0:
-        authType = 0
+    # if len(username) == 0 and len(password) == 0 and authType != 0:
+    #     authType = 0
     if (len(username) != 0 or len(password) != 0) and authType == 0:
         authType = 2
-    return dial.setPDPContext(profileID, ipType, apn, username, password, authType)
+    if cur_simid == None:
+        return dial.setPDPContext(profileID, ipType, apn, username, password, authType)
+    else:
+         return dial.setPDPContext(profileID, ipType, apn, username, password, authType, cur_simid)
 
 
-def getPDPContext(profileID):
+def getPDPContext(profileID, cur_simid=None):
     if profileID < 1 or profileID > 3:
         raise ValueError("invalid value, profileID should be in [1,3].")
-    return dial.getPDPContext(profileID)
+    if cur_simid == None:
+        return dial.getPDPContext(profileID)
+    else:
+        return dial.getPDPContext(profileID, cur_simid)
+    
 
 
 def setDNSServer(profileID, simID, priDNS, secDNS):
@@ -148,7 +181,7 @@ def setDNSServer(profileID, simID, priDNS, secDNS):
     return dial.setDnsserver(profileID, simID, priDNS, secDNS)
 
 
-def activate(profileID):
+def activate(profileID, cur_simid=None):
     # retval = dial.getPdpRange()
     # min_profile = retval[0]
     # max_profile = retval[1]
@@ -171,10 +204,13 @@ def activate(profileID):
                     raise ValueError("No configuration information for profileID {}.".format(profileID))
             except Exception:
                 raise ValueError("The format of the datacall_config.json is incorrect.")
-    return dial.start(profileID, 0, "", "", "", 0)
+    if cur_simid == None:
+        return dial.start(profileID, 0, "", "", "", 0)
+    else:
+        return dial.start(profileID, 0, "", "", "", 0,cur_simid)
 
 
-def deactivate(profileID):
+def deactivate(profileID, cur_simid=None):
     # retval = dial.getPdpRange()
     # min_profile = retval[0]
     # max_profile = retval[1]
@@ -184,26 +220,38 @@ def deactivate(profileID):
     pdpctx = dial.getPDPContext(profileID)
     if pdpctx != -1:
         iptype = pdpctx[0]
-        return dial.stop(profileID, iptype)
+        if cur_simid == None:
+            return dial.stop(profileID, iptype)
+        else:
+            return dial.stop(profileID, iptype,cur_simid)
     else:
         return -1
 
 ######################################################################################
 
-def start(profileidx, iptype=0, apn="", username="", password="", authtype=0):
+def start(profileidx, iptype=0, apn="", username="", password="", authtype=0, cur_simid=None):
     ret = dial.setPDPContext(profileidx, iptype, apn, username, password, authtype)
     if ret == 0:
-        return dial.start(profileidx, iptype, apn, username, password, authtype)
+        if cur_simid == None:
+            return dial.start(profileidx, iptype, apn, username, password, authtype)
+        else:
+            return dial.start(profileidx, iptype, apn, username, password, authtype, cur_simid)
     else:
         return -1
 
 
-def stop(profileidx, iptype):
-    return dial.stop(profileidx, iptype)
+def stop(profileidx, iptype,cur_simid=None):
+    if cur_simid == None:
+        return dial.stop(profileidx, iptype)
+    else:
+        return dial.stop(profileidx, iptype, cur_simid)
 
 
-def getInfo(profileidx, iptype):
-    ret = dial.getInfo(profileidx, iptype)
+def getInfo(profileidx, iptype, cur_simid=None):
+    if cur_simid == None:
+        ret = dial.getInfo(profileidx, iptype)
+    else:
+        ret = dial.getInfo(profileidx, iptype, cur_simid)
     if ret == -1:
         ipv4 = [0, 0, '0.0.0.0', '0.0.0.0', '0.0.0.0']
         ipv6 = [0, 0, '::', '::', '::']
@@ -215,6 +263,24 @@ def getInfo(profileidx, iptype):
             return (profileidx, iptype, ipv4)
     return ret 
 
+def getAddressinfo(profileidx, iptype):
+    ret = dial.getAddressinfo(profileidx, iptype)
+    if ret == -1:
+        ipv4 = ['00-00-00-00-00-00', '0.0.0.0', '0.0.0.0']
+        ipv6 = ['00-00-00-00-00-00', '::', '::']
+        if iptype ==2:
+            return (ipv4, ipv6)
+        elif iptype == 1:
+            return (ipv6)
+        elif iptype == 0:
+            return (ipv4)
+    return ret
+
+def getSiminfo(simID):
+    ret = dial.getSiminfo(simID)
+    if ret == -1:
+        return (0, 0, 0, 0)
+    return ret
 
 def setApn(profileidx, iptype, apn, username, password, authtype, flag=0):
     retval = dial.getPdpRange()
@@ -271,6 +337,8 @@ def setCallback(usrfun):
 def getApn(*args):
     return dial.getApn(*args)
 
+def useAttachApn(*args):
+    return dial.useAttachApn(*args)
 
 def setDnsserver(profileidx, simid, new_pri, new_sec):
     return dial.setDnsserver(profileidx, simid, new_pri, new_sec)
@@ -278,6 +346,9 @@ def setDnsserver(profileidx, simid, new_pri, new_sec):
 def getSpeed():
     return dial.getSpeed()
 
+def getTraffic():
+    return dial.getTraffic()
+
 def startByUserApns(apn_dict=None, filename=None):
     apn_info_dict = {}
     source_of_apn = 0
index cd5e0a3..3e114cb 100644 (file)
@@ -89,7 +89,10 @@ class socket:
         if args and isinstance(args[0], _socket.socket):
             self._sock = args[0]
         else:
-            self._sock = _socket.socket(*args, **kw)
+            if args[0] == 1:
+                self._sock = _socket.socket(_socket.AF_INET6, _socket.SOCK_STREAM)
+            else:
+                self._sock = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
 
     def accept(self):
         s, addr = self._sock.accept()
@@ -156,9 +159,10 @@ class FTP:
     passive = 1
     trust_server_pasv_ipv4_address = 0
     encoding = "latin-1"
+    ipvtype = 0
 
     def __init__(self, host=None, port=None, user=None, passwd=None, acct=None,
-                 timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None):
+                 timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None, ipvtype=0):
         """Initialization method (called by class instantiation).
 
         See class docstring for supported arguments.
@@ -168,11 +172,16 @@ class FTP:
         # host to conenct to has been given or not.
         if timeout is not None:
             self.timeout = timeout
+        else:
+            self.timeout = 20
         if source_address:
             self.source_address = source_address
 
+        if ipvtype == 1:
+            self.ipvtype = ipvtype
+
         if host:
-            self.connect(host, port)
+            self.connect(host, port, ipvtype = ipvtype)
             if user:
                 self.login(user, passwd, acct)
 
@@ -190,10 +199,12 @@ class FTP:
                 if self.sock is not None:
                     self.close()
 
-    def _create_connection(self, addr, timeout=None, source_address=None):
-        sock = socket()
+    def _create_connection(self, addr, timeout=None, source_address=None, ipvtype = 0):
+        sock = socket(ipvtype)
         addrinfos = _resolve_addr(addr)
         for af, _, _, _, addr in addrinfos:
+            if (ipvtype == 1) and (af == 2):
+                continue
             try:
                 sock.connect(addr)
             except Exception as exc:
@@ -245,7 +256,7 @@ class FTP:
             s = s[:5] + '*' * (i - 5) + s[i:]
         return repr(s)
 
-    def connect(self, host=None, port=None, timeout=None, source_address=None):
+    def connect(self, host=None, port=None, timeout=None, source_address=None, ipvtype = 0):
         """Connect to host.
 
         Arguments are:
@@ -265,8 +276,11 @@ class FTP:
         if not source_address:
             source_address = self.source_address
 
+        if ipvtype == 1:
+            self.ipvtype = ipvtype
+
         self.sock = self._create_connection((self.host, self.port), timeout,
-                                            source_address)
+                                            source_address,ipvtype = ipvtype)
         self.af = self.sock.family
         if hasattr(self.sock._sock, 'makefile'):
             self.file = self.sock.makefile('rb')
@@ -489,7 +503,7 @@ class FTP:
             if self.debugging:
                 print("makepasv host: %s, port: %s" % (host, port))
             conn = self._create_connection((host, port), self.timeout,
-                                           self.source_address)
+                                           self.source_address, ipvtype = self.ipvtype)
             try:
                 if rest is not None:
                     self.sendcmd("REST %s" % rest)
@@ -530,7 +544,13 @@ class FTP:
                 sock.close()
         if resp.startswith('150'):
             # this is conditional in case we received a 125
-            size = parse150(resp)
+            if rest is not None:
+                try:
+                    left = rest.startswith('(')
+                    if left < 0:
+                        size = parse150(resp)
+                except Exception as e:
+                    print("rest(%s) parse150 error:%s"%(str(e),rest))
         return conn, size
 
     def transfercmd(self, cmd, rest=None):
index 14c2b82..b2bf16d 100644 (file)
@@ -63,13 +63,13 @@ class FTP_TLS(ftplib.FTP):
 
     def __init__(self, host=None, port=None, user=None, passwd=None, acct=None,
                  keyfile=None, certfile=None, cert_reqs=None,
-                 timeout=ftplib._GLOBAL_DEFAULT_TIMEOUT, source_address=None):
+                 timeout=ftplib._GLOBAL_DEFAULT_TIMEOUT, source_address=None, ipvtype = 0):
         self._prot_p = False
         self.keyfile = keyfile
         self.certfile = certfile
         self._keydata = None
         self._certdata = None
-        super().__init__(host, port, user, passwd, acct, timeout, source_address)
+        super().__init__(host, port, user, passwd, acct, timeout, source_address, ipvtype = ipvtype)
 
     def login(self, user=None, passwd=None, acct=None, secure=True):
         if secure and isinstance(self.sock._sock, _socket.socket):
index 7e932af..cd31639 100644 (file)
@@ -31,8 +31,6 @@ class motorEventManager(Abstract):#马达事件
         self.motor_mode = 0#模式
         _thread.start_new_thread(self.motorInfo_queue_thread, ())
         EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo)
-        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数
-        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器
         pass
 
     def motorInfo_queue_thread(self):
@@ -52,14 +50,15 @@ class motorEventManager(Abstract):#马达事件
         EventMesh.publish("publish_message_event_motorInfo",{"func":self.motor_fun_cb,"data":0})  
         
     def post_processor_after_instantiation(self):
-        pass
+        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数
+        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器
 
     # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间  6间隔时间长振 7长振次数1一次 要为200ms的倍数
     def set_motor_time(self,event,msg):
-        # open_power = EventMesh.publish("get_power_on_state")#获取开机标识
-        # if open_power != None:
-        #     if open_power == 0:
-        #         return
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        if open_power != None:
+            if open_power == 0:
+                return
         if msg != None:
             self.motor_enable = msg[0]
             if self.motor_enable == 1: #马达使能
@@ -79,7 +78,6 @@ class motorEventManager(Abstract):#马达事件
             EventMesh.publish("close_motor_infor")#关闭马达和定时器
             return
         if self.motor_mode == 1:#
-            
             if self.motor_total_time > 0:
                 self.motor_total_time-=1
                 if self.motor_total_time > 0:
@@ -89,10 +87,8 @@ class motorEventManager(Abstract):#马达事件
                     EventMesh.publish("close_motor_infor")#关闭马达和定时器
                     return
         elif self.motor_mode == 2:#
-            # print("motor_fun_cb:{}\r\n".format(self.motor_total_time))
             # print("self.motor_count",self.motor_count,self.motor_open_time,self.motor_close_time,self.motor_total_time)
             if self.motor_count % (self.motor_open_time) < self.motor_close_time: # 4 4 2 1%4 = 1 2%4 = 2 3%4 = 3
-                # print("motor_fun_cb MORETO:{}\r\n".format(self.motor_total_time))
                 open_motor()
             else:
                 close_motor()
@@ -103,8 +99,6 @@ class motorEventManager(Abstract):#马达事件
 
     def close_motor_infor(self,event,msg):
         print("close_motor_infor!!!")
-        if self.motor_enable == 0:#未使能马达定时器
-            return
         close_motor()
         self.motor_enable = 0#马达使能
         self.motor_total_time = 0#总的时间
index 74a3ff4..05cac66 100644 (file)
@@ -47,16 +47,27 @@ def time(use_rhost = 1, timeout = 10):
     global ntp_sethost
     val = None
 
-    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     for host_m in r_host:
         try:
+            s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
             addr = socket.getaddrinfo(host, 123)[0][-1]
             s.settimeout(timeout)
             res = s.sendto(NTP_QUERY, addr)
             msg = s.recv(48)
-            val = struct.unpack("!I", msg[40:44])[0]
-            break
+            s.close()
+            flags = msg[0]
+            stratum = msg[1]
+            if (flags == 0x1c) and (stratum > 0) and (stratum < 16):
+                val = struct.unpack("!I", msg[40:44])[0]
+                if val == 0:
+                    print("NTP resp FAIL val:%s "%(val))
+                    raise OSError(-1)
+                break
+            else:
+                print("NTP resp FAIL flags:%s stratum:%s "%(flags,stratum))
+                raise OSError(-1)
         except:
+            s.close()
             if use_rhost != 1:
                 break
             host = host_m
@@ -67,7 +78,6 @@ def time(use_rhost = 1, timeout = 10):
     else:
         host = "ntp.aliyun.com"
 
-    s.close()
     if val == None:
         raise OSError("Server connection failed!")
     return val - NTP_DELTA
index 924cc24..a201f74 100644 (file)
@@ -113,9 +113,13 @@ def touch(file, data, i=1, file_type="json"):
         return touch(file, data, i=i + 1, file_type=file_type)
     else:
         try:
+            tmp_json_data = None;
+            if file_type == "json":
+                tmp_json_data = ujson.dumps(data)#将ujson.dumps的动作置于文件操作之前,GC不足导致ujson.dumps抛异常时,不会因以write模式打开文件破坏文件数据
+
             with open(file, "w") as f:
                 if file_type == "json":
-                    f.write(ujson.dumps(data))
+                    f.write(tmp_json_data)
                 else:
                     f.write(data)
         except Exception as e:
index ce1c426..1ce6a9a 100644 (file)
@@ -17,12 +17,20 @@ import ujson
 import utime
 import uio
 
+import uos
+name, platform = uos.uname()[1].split("=",1)
+
+if platform != "FCM360W" and platform != "FCM362K":
+    import net
+    import dataCall
+
+
 def parse_chunked_data(sock):
     data = b''
     while True:
         chunk_size_str = b''
         while True:
-            char = sock.recv(1)
+            char = sock.read(1)
             if char == b'\r':
                 continue
             if char == b'\n':
@@ -31,17 +39,20 @@ def parse_chunked_data(sock):
         chunk_size = int(chunk_size_str, 16)
         if chunk_size == 0:
             break
-        chunk_data = sock.recv(chunk_size)
+        chunk_data = sock.read(chunk_size)
         data += chunk_data
-        sock.recv(2)  # discard \r\n
+        sock.read(2)  # discard \r\n
     return data
 
 class Response:
-    def __init__(self, f, decode=True, sizeof=4096):
+    def __init__(self, f, decode=True, sizeof=4096, flag=False):
         self.raw = f
         self.encoding = "utf-8"
         self.decode = decode
         self.sizeof = sizeof
+        self.read_len = 0
+        self.read_data = sizeof
+        self.flag = flag
 
     def close(self):
         if self.raw:
@@ -60,7 +71,12 @@ class Response:
         try:
             while True:
                 # jian.yao 2020-12-28 分块yield输出
-                block = self.raw.read(self.sizeof)
+                if self.read_data > 2048:
+                    block = self.raw.read(2048)
+                    self.read_data -= 2048
+                else:
+                    block = self.raw.read(self.read_data)
+                self.read_len += len(block)
                 # jian.yao 2021-01-11 增加read读取块的大小配置
                 if block:
                     yield block.decode() if self.decode else block
@@ -68,10 +84,17 @@ class Response:
                     self.raw.close()  # jian.yao 2021-02-22 将套接字标记为关闭并释放所有资源
                     s_isopen = False
                     break
+                if (self.flag == True) and (self.sizeof == self.read_len):
+                    self.raw.close()
+                    s_isopen = False
+                    break
         except Exception as e:
             self.raw.close() # 2021-05-27
             s_isopen = False
-            pass
+            if "ETIMEDOUT" in str(e):
+                raise ValueError(str(e))
+            else:
+                pass
         return ""
 
     @property
@@ -97,14 +120,65 @@ class Response:
                 "The data for the response cannot be converted to JSON-type data,please try use response.content method")
 
 
-def request(method, url, data=None, json=None, files=None, stream=None, decode=True, sizeof=255, timeout=20, headers=None,
-            ssl_params=None, version=0):
+def request(method, url, data=None, json=None, files=None, stream=None, decode=True, sizeof=2048, timeout=20, headers=None,
+            ssl_params=None, version=0, files_data=None,files_data_len=None,files_name=None, ipvtype=0,username=None,password=None):
     global port
     global s_isopen
     s_isopen = True
     port_exist = False
+    addr = None
     URL = url
-    if not url.split(".")[0].isdigit():
+    if ipvtype == 1 and (url.split("[")[0] == "http://" or url.split("[")[0] == "https://"):
+        try:
+            proto, dummy, hosts, path = url.split("/", 3)
+        except ValueError:
+            proto, dummy, hosts = url.split("/", 2)
+            path = ""
+        
+        left = hosts.find('[')
+        if left < 0:
+            raise ValueError("http missing left delimiter:" + url)
+
+        right = hosts.find(']', left + 1)
+        if right < 0:
+            raise ValueError("http missing right delimiter:" + url)
+
+        host = hosts[left + 1:right]
+
+        try:
+            if hosts[right + 1] == ':':
+                port = int(hosts[right + 2:])
+                port_exist = True
+        except Exception as e:
+            pass
+            
+        if proto == "http:":
+            if not port_exist:
+                port = 80
+        elif proto == "https:":
+            if not port_exist:
+                port = 443
+        else:
+            raise ValueError("Unsupported protocol: " + proto)
+
+        try:
+            ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
+        except Exception as e:
+            raise IndexError("Domain name resolution error, please check network connection:" + host)
+
+        import uos
+        name, platform = uos.uname()[1].split("=",1)
+        if platform == "FCM360W" or platform == "FCM362K":
+            raise ValueError("platform Not Support IPV6!")
+        for i in ai:
+            if i[0] == 10:
+                addr = i[-1]
+                break
+        host = hosts
+
+        if addr is None:
+            raise ValueError("Request DNS Parsing IPV6 Fail")
+    elif not url.split(".")[0].isdigit():
         if not url.startswith("http"):
             url = "http://" + url
         try:
@@ -128,12 +202,30 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
                 port = 443
         else:
             raise ValueError("Unsupported protocol: " + proto)
+
         try:
             ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
-            ai = ai[0]
-        except IndexError:
+        except Exception as e:
             raise IndexError("Domain name resolution error, please check network connection")
 
+        if ipvtype == 1:
+            import uos
+            name, platform = uos.uname()[1].split("=",1)
+            if platform == "FCM360W" or platform == "FCM362K":
+                raise ValueError("platform Not Support IPV6!")
+            for i in ai:
+                if i[0] == 10:
+                    addr = i[-1]
+                    break
+            if addr is None:
+                raise ValueError("Request DNS Parsing IPV_6 Fail")
+        else:
+            for i in ai:
+                if i[0] == 2:
+                    addr = i[-1]
+                    break
+            if addr is None:
+                raise ValueError("Request DNS Parsing IPV_4 Fail")
     # jian.yao 2020-12-08 新增对错误ip的判断并提醒用户重新输入正确的ip:port
     elif url.split(".")[0].isdigit() and ":" not in url:
         raise ValueError(
@@ -154,31 +246,72 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
             raise ValueError("URL address error: " + url)
         try:
             ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
-            ai = ai[0]
-        except IndexError:
+        except Exception as e:
             raise IndexError("Domain name resolution error, please check network connection")
+
+        if ipvtype == 1:
+            import uos
+            name, platform = uos.uname()[1].split("=",1)
+            if platform == "FCM360W" or platform == "FCM362K":
+                raise ValueError("platform Not Support IPV6!")
+            for i in ai:
+                if i[0] == 10:
+                    addr = i[-1]
+                    break
+            if addr is None:
+                raise ValueError("Request DNS Parsing IPV6 Fail")
+        else:
+            for i in ai:
+                if i[0] == 2:
+                    addr = i[-1]
+                    break
+            if addr is None:
+                raise ValueError("Request DNS Parsing IPV4 Fail")
     #global s
-    try:
-        s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
-    except Exception as e:
-        raise RuntimeError("socket resource malloc FAIL='{}'".format(str(e)))
+
+    if ipvtype == 1:
+        import uos
+        name, platform = uos.uname()[1].split("=",1)
+        if platform == "FCM360W" or platform == "FCM362K":
+            raise ValueError("platform Not Support IPV6!")
+        try:
+            s = usocket.socket(usocket.AF_INET6, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
+        except Exception as e:
+            raise RuntimeError("socket resource malloc FAIL='{}'".format(str(e)))
+        call_state = dataCall.getInfo(1,1)
+        if call_state == -1:
+            raise ValueError("request Connect dataCall get Info FAIL")
+        elif call_state[2][0] != 1:
+            raise ValueError("request Connect dataCall get IPV6 Info FAIL")
+        try:
+            s.bind((call_state[2][2],0))
+        except Exception as e:
+            raise ValueError("request sock bind IPV6 IP FAIL")
+    else:
+        try:
+            s = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
+        except Exception as e:
+            raise RuntimeError("socket resource malloc FAIL='{}'".format(str(e)))
+
     # jian.yao 2021-01-11 增加socket超时时间
     s.settimeout(timeout)  # 设置socket阻塞模式
     try:
         # jian.yao 2020-12-09 check connect error
         try:
-            s.connect(ai[-1])
+            s.connect(addr)
         except Exception as e:
+            s.close()
             raise RuntimeError("HTTP Connection '{}' FAIL='{}'".format(str(e), URL))
         if proto == "https:":
             import ussl
             try:
                 if ssl_params:
-                    s = ussl.wrap_socket(s, **ssl_params)
+                    s = ussl.wrap_socket(s, **ssl_params, server_hostname=host)
                 else:
                     s = ussl.wrap_socket(s, server_hostname=host)
             except Exception as e:
-                pass
+                s.close()
+                raise RuntimeError("HTTPS USSL '{}' FAIL='{}'".format(str(e), URL))
         if version == 1:
             s.write(b"%s /%s HTTP/1.1\r\n" % (method, path))
         else:
@@ -194,6 +327,11 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
                 if headers.get('Content-Type') == "multipart/form-data":
                     headers['Content-Type'] = headers['Content-Type'] + '; boundary={}'.format(boundary)
                     headers['charset'] = 'UTF-8'
+            if files_data:
+                boundary = str(utime.time())
+                if headers.get('Content-Type') == "multipart/form-data":
+                    headers['Content-Type'] = headers['Content-Type'] + '; boundary={}'.format(boundary)
+                    headers['charset'] = 'UTF-8'
         else:
             headers = dict()
             if files:
@@ -207,6 +345,15 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
             s.write(b": ")
             s.write(headers[k])
             s.write(b"\r\n")
+        if (username is not None) and (password is not None):
+            try:
+                import ubinascii
+                key  = "{}:{}".format(username, password)
+                key_64 = ubinascii.b2a_base64(key)[:-1].decode('utf-8')
+                s.write(b"Authorization: Basic {}\r\n".format(key_64))
+            except Exception as e:
+                s.close()
+                raise RuntimeError("HTTP base64 FAIL='{}'".format(str(e)))
         if json is not None:
             assert data is None
             data = ujson.dumps(json)
@@ -214,8 +361,26 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
             s.write(b"Content-Length: %d\r\n" % len(data))
             s.write(b"\r\n")
             s.write(data)
+        if files_data:
+            if files_name == None:
+                raise ValueError("files_name must have")
+            if files_data_len == None:
+                raise ValueError("files_data_len must have")
+            import uos
+            name,platform = uos .uname()[1].split("=",1)
+            datas = '--{0}{1}Content-Disposition: form-data; name="file"; filename="{2}"{1}Content-Type: application/octet-stream{1}{1}'.format(
+                boundary, '\r\n', files_name)
+            suffix = '{1}--{0}--{1}'.format(boundary, '\r\n')
+            len_d = files_data_len + len(datas) + len(suffix)
+            s.write(b"Content-Length: %d\r\n" % len_d)
+            s.write(b"\r\n")
+            s.write(datas)
+            s.write(files_data[0:files_data_len])
+            s.write(suffix)
         if files:
             import uos
+            counter = 0
+            name,platform = uos .uname()[1].split("=",1)
             file_path = files.get("filepath")
             with open(file_path, 'rb') as f:
                 content = f.read(4096)
@@ -243,9 +408,9 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
                 s.write(datas)
                 while content:
                     s.write(content)
-                    content = f.read(4096)
+                    content = f.read(4096)                 
                 s.write(suffix)
-        if not (files and data):
+        if not (files and data and files_data):
             s.write(b"\r\n")
         l = s.readline()
         uheaders = {}
@@ -259,6 +424,8 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
         reason = ""
         if len(l) > 2:
             reason = l[2].rstrip()
+        con_len = sizeof
+        con_flag = False
         while True:
             l = s.readline()
             j = l.decode().split(":")
@@ -272,15 +439,18 @@ def request(method, url, data=None, json=None, files=None, stream=None, decode=T
             if l.lower().startswith(b"transfer-encoding:"):
                 if b"chunked" in l.lower():
                     chunked_encoding = True
-            if l.startswith(b"Location:") and not 200 <= status <= 299:
-                raise NotImplementedError("Redirects not yet supported")
+            if l.startswith(b'Content-Length:'):
+                con_len = int(l.split(b' ')[1])
+                con_flag = True
+            #if l.startswith(b"Location:") and not 200 <= status <= 299:
+                #raise NotImplementedError("Redirects not yet supported")
     except OSError:
         s.close()
         raise
     if chunked_encoding:
-        resp = Response(uio.BytesIO(parse_chunked_data(s)))
+        resp = Response(uio.BytesIO(parse_chunked_data(s)), sizeof=con_len)
     else:
-        resp = Response(s)
+        resp = Response(s,sizeof=con_len, flag=con_flag)
     resp.status_code = status
     resp.reason = reason
     resp.headers = uheaders
index d8c4a5e..91df07d 100644 (file)
 #include "helios_audio.h"
 #include "helios_debug.h"
 #include "helios_gpio.h"
-#include "helios_ringbuf.h"
+#include "audio_handle.h"
+#include "helios_fs.h"
+
 
 #if defined(BOARD_EC600MCN_LA) || defined(BOARD_EC600MCN_LA_POC_XBND)|| defined(BOARD_EC600MCN_LA_POC_QS) \
     || defined(BOARD_EC600MCN_LA_VOLTE) || defined(BOARD_EC600MCN_LA_HJT) \
-    || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LE_POC_XBND) \
+    || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MCN_LE_ALIPAY) \
        || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
-       || defined(BOARD_EC600MCN_LE_POC_QS)  || defined(BOARD_EC600MCN_LE_VOLTE) \
-       || defined(BOARD_EC800MCN_GA) || defined(BOARD_EC800MCN_GA_VOLTE)       \
-       || defined(BOARD_EC800MCN_GA_ALIPAY) || defined(BOARD_EC800MCN_GA_ALIPAY) \
-       || defined(BOARD_EC800MCN_GA_SPISD) || defined(BOARD_EC800MCN_GA_MS) \
+       || defined(BOARD_EC600MCN_LE_POC_QS)  || defined(BOARD_EC600MCN_LE_VOLTE) || defined(BOARD_EC600MCN_LE_BTZ)\
+       || defined(BOARD_EC600MCN_MC) || defined(BOARD_EC600MEU_LA) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+       || defined(BOARD_EC800MCN_GA) || defined(BOARD_EC800MCN_GA_VOLTE) || defined(BOARD_EC600MLA_LA_POC_XBND)\
+       || defined(BOARD_EC800MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_ALIPAY) \
+       || defined(BOARD_EC800MCN_GA_SPISD) || defined(BOARD_EC800MCN_GA_MS) || defined(BOARD_EC800MCN_GA_VOEXT)\
        || defined(BOARD_EC800MCN_LE) || defined(BOARD_EC800MCN_LE_VOLTE) || defined(BOARD_EC800MCN_LE_VOLVGL)\
        || defined(BOARD_EC800MCN_LA_POC_XBND) || defined(BOARD_EC800MCN_LE_POC_XBND) \
-       || defined(BOARD_EC600MEU_LA_POC_XBND) || defined(PLAT_ASR_1803s)
+       || defined(BOARD_EG810MCN_GA) || defined(BOARD_EG810MCN_GA_VOEXT) || defined(BOARD_EG810MCN_GA_VOLTE) \
+       || defined(BOARD_EG810MCN_GB) || defined(BOARD_EG810MCN_GB_VOEXT) \
+       || defined(BOARD_EG810MCN_LA) || defined(BOARD_EG810MCN_LA_VOLTE) \
+       || defined(BOARD_EG810MEU_LA) || defined(BOARD_EG810MEU_LA_VOEXT) \
+       || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EC800MCN_GB_VOEXT) \
+       || defined(BOARD_EG810MEU_LA_VOLVGL) || defined(BOARD_EC800MCN_LE_VOEXT)
+       
 
        
 
@@ -93,16 +102,16 @@ typedef struct _audio_obj_t {
 #define AUDIO_CHANNEL_MAX 3
 extern const mp_obj_type_t audio_audio_type;
 
-static c_callback_t *g_audio_callback;
+extern c_callback_t *g_audio_callback;
 static c_callback_t *g_audio_speakerpa_callback;
 static int g_gpio_pa = -1;
 static int g_pa_class = 2;
 static audio_obj_t *audio_obj[AUDIO_CHANNEL_MAX] = {NULL};
-static char montage_is_break = 0;
 char audio_playing_file_name[256] = {0};
 
 
-int audio_err_handle(void);
+extern int audio_err_handle(void);
+extern int audio_play_callback(char *ptr, size_t lens, Helios_EnumAudPlayerState state);
 
 #define FREE_BUFF(X) do \
 {                       \
@@ -122,7 +131,7 @@ int audio_err_handle(void);
     }                               \
 } while (0);
 
-#if CONFIG_AUDIO
+#if defined(CONFIG_AUDIO) && !defined(PLAT_Unisoc_8850) && !defined(PLAT_Unisoc_8850_R02)
 #define GET_FILE_VFS_PATH(x, y) \
        do                                                                                  \
        {                                                                                   \
@@ -132,7 +141,7 @@ int audio_err_handle(void);
 #else
 
 #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
-    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_Unisoc_8910_R05)|| defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02)
 #define GET_FILE_VFS_PATH(x, y) get_vfs_path(x,y)
 #else
 #define GET_FILE_VFS_PATH(x, y)                                                         \
@@ -181,6 +190,22 @@ int audio_err_handle(void);
 
 #endif
 
+
+//虚函数,用来解决ASR160X R07在关闭MP3解码库宏控时造成的编译问�?
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) \
+    || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
+
+#if (!CONFIG_AUDIO_MP3) || (!defined(CONFIG_AUDIO_MP3))
+__attribute__((weak)) void Helios_mp3_stream_close_flag(unsigned char value) 
+{
+       (void) value;
+       return;
+}
+#endif
+
+#endif
+//end
+
 STATIC void delay_us(unsigned int us)
 {
        int cnt = 26;
@@ -200,6 +225,28 @@ STATIC void set_clk_low(void)
 {
        Helios_GPIO_SetLevel(g_gpio_pa, HELIOS_LVL_LOW);
 }
+STATIC void set_pa_flag(uint8_t flag)
+{
+       Helios_Mutex_Lock(audio_pa.pa_mutex, HELIOS_WAIT_FOREVER);
+       if(flag > 0)
+       {
+               audio_pa.open_flag++;
+       }
+       else
+       {
+               if(audio_pa.open_flag > 0){
+                       audio_pa.open_flag--;
+               }
+       }
+       Helios_Mutex_Unlock(audio_pa.pa_mutex);
+}
+
+STATIC uint8_t get_pa_flag(void)
+{
+       uint8_t flag = 0;
+       flag = audio_pa.open_flag;
+       return flag;
+}
 
 STATIC void set_PA_pulse(int num)
 {
@@ -216,9 +263,22 @@ STATIC void set_PA_pulse(int num)
 
 STATIC void audio_open_power_amplifier(void)
 {
+       if(get_pa_flag() <= 0)
+       {
+               return;
+       }
     set_PA_pulse(g_pa_class);
 }
 
+STATIC void audio_close_power_amplifier(void)
+{
+       if(get_pa_flag() > 0)
+       {
+               return;
+       }
+    set_clk_low();
+}
+
 enum {
     PA_AUDIO_PLAY,
     PA_AUDIO_STOP,
@@ -227,7 +287,8 @@ static uint8_t play_state = PA_AUDIO_STOP;
 
 static Helios_MsgQ_t open_pa_q = 0;
 static Helios_Thread_t open_pa_task_id = 0;
-static uint32_t open_pa_delay = 0;
+
+
 
 // 延时打开PA
 void helios_open_pa(void * argv) {
@@ -242,13 +303,17 @@ void helios_open_pa(void * argv) {
                        continue;
                }
                if (pa_ctrl == 1) {
-                       Helios_msleep(open_pa_delay);
+                       Helios_msleep(audio_pa.open_pa_delay);
                        audio_open_power_amplifier();
                        play_state = PA_AUDIO_PLAY;
                        HELIOS_AUDIO_LOG("audio set high, event 1.\r\n");
                }
                else {
-                       set_clk_low();
+                       if(audio_pa.close_pa_delay > 0)
+                       {
+                               Helios_msleep(audio_pa.close_pa_delay);
+                       }
+                       audio_close_power_amplifier();
                        play_state = PA_AUDIO_STOP;
                        HELIOS_AUDIO_LOG("audio set low, event 0.\r\n");
                }
@@ -264,6 +329,15 @@ int asynch_open_pa_init(void) {
                open_pa_q = Helios_MsgQ_Create(1, sizeof(uint8_t));
        }
 
+       if(audio_pa.pa_mutex == 0)
+       {
+               audio_pa.pa_mutex = Helios_Mutex_Create();
+               if(audio_pa.pa_mutex == 0)
+               {
+            HELIOS_AUDIO_LOG("create open pa mutex failed\n");
+                       return -1;
+               }
+       }
 
        if(open_pa_task_id == 0)
        {
@@ -285,39 +359,89 @@ int asynch_open_pa_init(void) {
 void user_audio_speakerpa_callback(unsigned int event)
 {
        uint8_t pa_ctrl;
-       
+       unsigned int on_off = 0;
        if(g_gpio_pa != -1)
        {
-               if (event == 1)
+#if !defined(BOARD_EC600MCN_LF_SLPOC)
+               if(audio_pa.pa_is_delay_close && (event == AUDIO_PA_CLOSE_NOW))
+               {
+                       event = AUDIO_PA_CLOSE_DELAY;
+               }
+               if(audio_pa.pa_is_delay_open && (event == AUDIO_PA_OPEN_NOW))
+               {
+                       event = AUDIO_PA_OPEN_DELAY;
+               }
+#endif
+
+#if defined(BOARD_EC600MCN_LE_POC_QS)
+               extern unsigned char ptt_tone_play_end_skip_pa;
+               if(ptt_tone_play_end_skip_pa)
                {
-                       if (open_pa_delay == 0) {
-                               //打开PA
+                       ptt_tone_play_end_skip_pa--;
+                       return;
+               }
+#endif
+
+               switch(event)
+               {
+                       case AUDIO_PA_CLOSE_NOW:
+                          set_pa_flag(0);
+                          audio_close_power_amplifier();
+                  play_state = PA_AUDIO_STOP;
+                          on_off = 0;
+                          HELIOS_AUDIO_LOG("audio set low, event 0.\r\n");
+                          break;
+                       case AUDIO_PA_OPEN_DELAY:
+                               set_pa_flag(1);
+                               if (audio_pa.open_pa_delay == 0) {
+                                       audio_open_power_amplifier();
+                                       play_state = PA_AUDIO_PLAY;
+                                       HELIOS_AUDIO_LOG("audio set high, event 1.\r\n");
+                               }
+                               else {
+                                       pa_ctrl = 1;
+                                       Helios_MsgQ_Put(open_pa_q, (const void *)&pa_ctrl, sizeof(uint8_t), HELIOS_NO_WAIT);
+                               }
+                               on_off = 1;
+                               HELIOS_AUDIO_LOG("asynch_open_pa start.\r\n");
+                               break;
+                       case AUDIO_PA_OPEN_NOW:
+                               set_pa_flag(1);
                                audio_open_power_amplifier();
                                play_state = PA_AUDIO_PLAY;
+                               on_off = 1;
                                HELIOS_AUDIO_LOG("audio set high, event 1.\r\n");
-                       }
-                       else {
-                               pa_ctrl = 1;
+                               break;
+                       case AUDIO_PA_CLOSE_DELAY:
+                               set_pa_flag(0);
+                               pa_ctrl = 0;
                                Helios_MsgQ_Put(open_pa_q, (const void *)&pa_ctrl, sizeof(uint8_t), HELIOS_NO_WAIT);
-                       }
-                       HELIOS_AUDIO_LOG("asynch_open_pa start.\r\n");
-           } else {
-              //关闭PA
-                   set_clk_low();
-            play_state = PA_AUDIO_STOP;
-                       HELIOS_AUDIO_LOG("audio set low, event 0.\r\n");
+                               on_off = 0;
+                               break;
+                       default:
+                               HELIOS_AUDIO_LOG("audio pa error event:%d\r\n",event);
+                               return;
                }
        }
        if (g_audio_speakerpa_callback)
        {
            GC_STACKTOP_SET();
-               mp_sched_schedule_ex(g_audio_speakerpa_callback, mp_obj_new_int(event));
+               mp_sched_schedule_ex(g_audio_speakerpa_callback, mp_obj_new_int(on_off));
                GC_STACKTOP_CLEAR();
        }
 }
 
+#if defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_LA_POC_QS)
+STATIC mp_obj_t mpy_set_audio_read_delay(mp_obj_t self_in, mp_obj_t delay) {
+       Helios_set_audio_read_delay(mp_obj_get_int(delay));
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mpy_set_audio_read_delay_obj, mpy_set_audio_read_delay);
+#endif
+
 #if defined (PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
-    || defined(PLAT_EIGEN)  || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_EIGEN)|| defined(PLAT_EIGEN_718)  || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) \
+       || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
@@ -347,10 +471,6 @@ STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args)
        ret = Helios_GPIO_Init(g_gpio_pa, &gpio_struct);//Helios_Audio_SetPa(g_gpio_pa);
        if (ret != 0)
        {
-#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
-    || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
-               Helios_Audio_SetPaCallback(HELIOS_OUTPUT_RECEIVER, user_audio_speakerpa_callback);
-#endif
                return mp_obj_new_int(0);
        }
        return mp_obj_new_int(1);
@@ -358,11 +478,32 @@ STATIC mp_obj_t helios_set_pa(size_t n_args, const mp_obj_t *args)
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(helios_set_pa_obj, 2, 3, helios_set_pa);
 
 STATIC mp_obj_t helios_set_open_pa_delay(mp_obj_t self_in, mp_obj_t delay) {
-       open_pa_delay = mp_obj_get_int(delay);
+       audio_pa.open_pa_delay = mp_obj_get_int(delay);
+       if(audio_pa.open_pa_delay > 0)
+       {
+               audio_pa.pa_is_delay_open = 1;
+       }
+       else
+       {
+               audio_pa.pa_is_delay_open = 0;
+       }
        return mp_obj_new_int(1);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_open_pa_delay_obj, helios_set_open_pa_delay);
 
+STATIC mp_obj_t helios_set_close_pa_delay(mp_obj_t self_in, mp_obj_t delay) {
+       audio_pa.close_pa_delay = mp_obj_get_int(delay);
+       if(audio_pa.close_pa_delay > 0)
+       {
+               audio_pa.pa_is_delay_close = 1;
+       }
+       else
+       {
+               audio_pa.pa_is_delay_close = 0;
+       }
+       return mp_obj_new_int(1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_close_pa_delay_obj, helios_set_close_pa_delay);
 
 STATIC mp_obj_t helios_set_speakerpa_callback(mp_obj_t self_in, mp_obj_t callback)
 {
@@ -387,6 +528,22 @@ STATIC mp_obj_t helios_user_speakerpa_switch(mp_obj_t self_in, mp_obj_t pa_com)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_user_speakerpa_switch_obj, helios_user_speakerpa_switch);
 
+#if defined(PLAT_Unisoc_8850_R02) && defined(CONFIG_POC)
+STATIC mp_obj_t helios_set_audio_data_dump_log(mp_obj_t self_in, mp_obj_t set)
+{
+       unsigned char enable = 0;
+       int ret = -1;
+       if(mp_obj_get_int(enable) < 0 || mp_obj_get_int(enable) > 1) {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid parameter"));
+       } 
+       enable = mp_obj_get_int(set);
+       ret = Helios_Debug_PCM_Data_Dump_Log_Set(enable);
+       return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_audio_data_dump_log_obj, helios_set_audio_data_dump_log);
+#endif
+
 #if defined(PLAT_Unisoc)
 
 STATIC mp_obj_t helios_internal_pa_type(mp_uint_t n_args, const mp_obj_t *args) {
@@ -438,91 +595,10 @@ STATIC mp_obj_t helios_set_audio_callback(mp_obj_t self_in, mp_obj_t callback)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_audio_callback_obj, helios_set_audio_callback);
 
-/*=============================================================================*/
-/* FUNCTION: audio_play_callback                                               */
-/*=============================================================================*/
-/*!@brief              : callback function for audio file playing.
- * @param[in]  : state - audio state
- * @param[out]         : 
- * @return             :
- */
-/*=============================================================================*/
-int audio_play_callback(char *ptr, size_t lens, Helios_EnumAudPlayerState state)
-{
-       int audio_event = state;
-       Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER);
-       uint8_t audio_state = audio.audio_state;
-       Helios_Mutex_Unlock(audio.queue_mutex);
-       HELIOS_AUDIO_LOG("[Audio] callback, event = %d\r\n", state);
-
-
-       switch (state)
-       {
-       case HELIOS_AUD_PLAYER_FINISHED:
-               audio_event = 7;
-       break;
-       case HELIOS_AUD_PLAYER_CLOSE:
-               audio_event = 7;
-               state = HELIOS_AUD_PLAYER_FINISHED;
-       break;
-       case HELIOS_AUD_PLAYER_NODATA_STRAT:
-               audio_event = 5;
-       break;
-       case HELIOS_AUD_PLAYER_DATA_RESUME:
-               audio_event = 6;
-       break;
-       default:
-               break;
-       }
-               
-       if ((g_audio_callback != NULL) /*&& (audio_state != AUDIO_IDLE)*/)
-       {
-               HELIOS_AUDIO_LOG("[Audio] callback start.\r\n");
-               GC_STACKTOP_SET();
-               mp_sched_schedule_ex(g_audio_callback, mp_obj_new_int(audio_event));
-               GC_STACKTOP_CLEAR();
-               HELIOS_AUDIO_LOG("[Audio] callback end.\r\n");
-       }
-
-       switch (state)
-       {
-               case HELIOS_AUD_PLAYER_START:
-               case HELIOS_AUD_PLAYER_RESUME:
-                       Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER);
-                       audio.audio_state = AUDIO_PLAYING;
-                       Helios_Mutex_Unlock(audio.queue_mutex);
-                       break;
-               case HELIOS_AUD_PLAYER_FINISHED:
-                       Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER);
-                       audio.audio_state = AUDIO_IDLE;
-                       Helios_Mutex_Unlock(audio.queue_mutex);
-                       uint8_t audio_msg = AUDIO_FINISH_EVENT;
-                       if (audio.montage_is_stopping == 0) {
-                               if (Helios_MsgQ_Put(audio.queue_msg, (const void *)&audio_msg, sizeof(uint8_t), HELIOS_NO_WAIT) == -1)
-                               {
-                                       HELIOS_AUDIO_LOG("send audio msg failed[%u].\r\n", audio_msg);
-                                       return -1;
-                               }
-                       }
-                       HELIOS_AUDIO_LOG("send audio finished signal successed[%u].\r\n", audio_msg);
-                       break;
-               case HELIOS_AUD_PLAYER_ERROR:
-               case HELIOS_AUD_PLAYER_PAUSE:
-               case HELIOS_AUD_PLAYER_CLOSE:
-                       Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER);
-                       audio.audio_state = AUDIO_IDLE;
-                       Helios_Mutex_Unlock(audio.queue_mutex);
-                       break;
-               default:
-                       break;
-       }
-       //int ret = helios_audio_play_callback(p_data, len, state);
-       return 0;
-}
-
 #if !CONFIG_AUDIO_PWM
 #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc_8850) \
-    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06) \
+       || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 STATIC mp_obj_t helios_audio_set_channel(mp_obj_t self_in, mp_obj_t dev)
 {
     audio_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -554,6 +630,44 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_channel_obj, helios_audio_set_channe
 #endif
 #endif
 
+STATIC void helios_codec_callback(Helios_pcm_codec_event event)
+{
+
+       switch(event)
+       {
+               case Helios_PCM_CODEC_AboutToOpen:
+                       if(audio.play_start_mode == HELIOS_AUD_START_FIRST_PA_THEN_DEC)
+                       {
+                               user_audio_speakerpa_callback(2);
+                               Helios_msleep(audio.interval_of_start_dec_pa);
+                       }
+                       break;
+               case Helios_PCM_CODEC_Opened:
+                       if(audio.play_start_mode == HELIOS_AUD_START_FIRST_DEC_THEN_PA)
+                       {
+                               audio_pa.open_pa_delay = audio.interval_of_start_dec_pa;
+                               user_audio_speakerpa_callback(1);
+                       }
+                       break;
+               case Helios_PCM_CODEC_AboutToClose:
+                       if(audio.play_end_mode == HELIOS_AUD_END_FIRST_PA_THEN_DEC)
+                       {
+                               user_audio_speakerpa_callback(0);
+                               Helios_msleep(audio.interval_of_close_dec_pa);
+                       }                       
+                       break;
+               case Helios_PCM_CODEC_Closed:
+                       if(audio.play_end_mode == HELIOS_AUD_END_FIRST_DEC_THEN_PA)
+                       {
+                               audio_pa.close_pa_delay = audio.interval_of_close_dec_pa;
+                               user_audio_speakerpa_callback(3);
+                       }
+                       break;
+               default:
+                       break;
+       }
+}
+
 
 STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) 
 {
@@ -566,7 +680,7 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        }
        asynch_open_pa_init();
 #if !CONFIG_AUDIO_PWM
-#if !defined(PLAT_EIGEN)
+#if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
        if (!audio_channel_check(device))
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("The current platform does not support device %d."), device);
@@ -583,22 +697,24 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        //self->inited = 0;
 
        Helios_Audio_Init();
-       #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
-       || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
-#if CONFIG_AUDIO
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+       Helios_PCM_Codec_Event_Callback_Register(helios_codec_callback);
+#endif
+
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
+       || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)\
+       || defined(PLAT_EIGEN_718) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
        extern int Helios_Audio_SetPaCallback_py(Helios_AudOutputType type, helios_audio_pa_cb_t cb);
-#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
-    || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
-       Helios_Audio_SetPaCallback((Helios_AudOutputType)device, user_audio_speakerpa_callback);
-#else
        Helios_Audio_SetPaCallback_py((Helios_AudOutputType)device, user_audio_speakerpa_callback);
-#endif
-#else
+#else 
        Helios_Audio_SetPaCallback((Helios_AudOutputType)device, user_audio_speakerpa_callback);
 #endif
-       #endif
+#endif
+
 #if !CONFIG_AUDIO_PWM
-#if !defined(PLAT_EIGEN)
+#if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
        if(device == HELIOS_OUTPUT_RECEIVER||device == HELIOS_OUTPUT_SPEAKER||device == HELIOS_OUTPUT_HEADPHONE){
                Helios_Audio_SetAudioChannle(device);
        }
@@ -626,6 +742,10 @@ STATIC mp_obj_t audio_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                audio.queue_mutex = Helios_Mutex_Create();
                audio.montage_mutex = Helios_Mutex_Create();
                audio.queue_msg = Helios_MsgQ_Create(10, sizeof(uint8_t));
+               audio.play_start_mode = 0;
+               audio.play_end_mode = 0;
+               audio.interval_of_start_dec_pa = 0;
+               audio.interval_of_close_dec_pa = 0;
                if (!audio.queue_msg)
                {
                        Helios_Mutex_Delete(audio.queue_mutex);
@@ -790,13 +910,9 @@ STATIC mp_obj_t helios_play_file_start(size_t n_args, const mp_obj_t *args, mp_m
                                        {
                                                Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER);
                                                HELIOS_AUDIO_LOG("---- stop audio montage play. ----\r\n");
-                           montage_is_break = 1;
                                                audio.montage_is_stopping = 1;
-#if CONFIG_AUDIO
-                                               extern void helios_audio_montage_stop();
-                                               helios_audio_montage_stop();
-#endif
-                                               #if !defined(PLAT_EIGEN)
+                                               helios_set_montage_break_flag(1);
+                                               #if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
                            audio_err_handle();
                                                #endif
                            Helios_msleep(200);
@@ -933,15 +1049,43 @@ STATIC mp_obj_t helios_play_file_start(size_t n_args, const mp_obj_t *args, mp_m
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_file_start_obj, 1, helios_play_file_start);
 
-int helios_set_montage_break_flag(char set){
-       if(set == 1 || set == 0)
-       {
-               montage_is_break = set;
-               return 0;
-       }
-       return -1;
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+STATIC mp_obj_t helios_set_audio_play_mode(size_t n_args, const mp_obj_t *args)
+       {               
+               if (n_args == 5)
+               {
+                       if(mp_obj_get_int(args[1]) < 0 || mp_obj_get_int(args[1]) > HELIOS_AUD_START_MODE_MAX) {
+                       mp_raise_ValueError(MP_ERROR_TEXT("parameter error!"));
+                       }
+                       if(mp_obj_get_int(args[2]) > 5000 || mp_obj_get_int(args[2]) < 0) {
+                               mp_raise_ValueError(MP_ERROR_TEXT("Too many time"));
+                       }
+
+                       
+                       
+                       audio.play_start_mode              = mp_obj_get_int(args[1]);
+                       audio.interval_of_start_dec_pa = mp_obj_get_int(args[2]);
+                       audio.play_end_mode                = mp_obj_get_int(args[3]);
+                       audio.interval_of_close_dec_pa = mp_obj_get_int(args[4]);
+                       return mp_obj_new_int(0);
+               }
+               else if (n_args == 1)
+               {
+                       mp_obj_t tuple[4] = 
+                               {
+                                       mp_obj_new_int(audio.play_start_mode),
+                                       mp_obj_new_int(audio.interval_of_start_dec_pa),
+                                       mp_obj_new_int(audio.play_end_mode),
+                                       mp_obj_new_int(audio.interval_of_close_dec_pa),
+                               };
+                       return mp_obj_new_tuple(4, tuple);
+               }
+               return mp_obj_new_int(-1);
 }
 
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(helios_set_audio_play_mode_obj, 1, 5, helios_set_audio_play_mode);
+#endif
+
 STATIC mp_obj_t helios_get_audio_play_state(mp_obj_t self_in)
 {
        int state = 0;
@@ -1020,8 +1164,9 @@ STATIC mp_obj_t helios_play_file_stop_all(mp_obj_t self_in)
 {
        uint8_t i = 0;
        int ret = 0;
-    montage_is_break = 1;
-    #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+
+       helios_set_montage_break_flag(1);
+    #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     audio_err_handle();
     #endif
 
@@ -1078,7 +1223,7 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
        int format = 1;
        format = vals[ARG_format].u_int;
        int play_len = vals[ARG_len].u_int;
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        if(format <= HELIOS_AUDIO_FORMAT_UNKNOWN || format >= HELIOS_AUDIO_FORMAT_MAX)
        {
                mp_raise_ValueError(MP_ERROR_TEXT("Unsupport format!"));
@@ -1104,7 +1249,7 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
                }
        }
 #if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) \
-    || defined(PLAT_ASR_1602)
+    || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
        Helios_mp3_stream_close_flag(vals[ARG_mode].u_int);
 #endif
        MP_THREAD_GIL_EXIT();
@@ -1120,7 +1265,7 @@ STATIC mp_obj_t helios_play_stream_start(size_t n_args, const mp_obj_t *args, mp
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_stream_start_obj, 1, helios_play_stream_start);
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t helios_pcm_para_set(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
        enum { ARG_samplerate, ARG_channels };
@@ -1169,12 +1314,9 @@ STATIC mp_obj_t helios_play_stream_stop(mp_obj_t self_in)
 {
        if(0 != audio.montage_mutex)
                Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER);
-    montage_is_break = 1;
-#if CONFIG_AUDIO
-       extern void helios_audio_montage_stop();
-       helios_audio_montage_stop();
-#endif
-    #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+
+       helios_set_montage_break_flag(1);
+    #if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     audio_err_handle();
     #endif
 
@@ -1220,7 +1362,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_play_stop_obj, helios_audio_play_s
 /*=============================================================================*/
 STATIC mp_obj_t helios_get_audio_state(mp_obj_t self_in)
 {
-    #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+    #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        int ret = helios_audio_getInitState();
     #else
        int ret = 0;
@@ -1308,7 +1450,7 @@ STATIC mp_obj_t helios_set_ToneVolume(mp_obj_t self_in, mp_obj_t volume)
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_set_ToneVolume_obj, helios_set_ToneVolume);
 #endif
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t helios_play_stream_jump(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
        enum { ARG_second, ARG_drection };
@@ -1391,7 +1533,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_play_jump_frame_obj, 1, helios_play_fra
 #endif
 
 #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \
-               || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s)
+               || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #ifndef AUDIO_DTMF_TONE_NEW_SUPPORT
 STATIC const mp_arg_t tone_allowed_args[] = {
     { MP_QSTR_tone,            MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
@@ -1676,10 +1818,26 @@ STATIC mp_obj_t helios_aud_tone_play_stop(mp_obj_t self_in)
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_aud_tone_play_stop_obj, helios_aud_tone_play_stop);
 
+#if defined(BOARD_EC800GCN_LD_XBND)
+STATIC mp_obj_t helios_aud_set_tone_gain(mp_obj_t self_in, mp_obj_t gain) {
+       int tone_gain = mp_obj_get_int(gain);
+       if (tone_gain < 0 || tone_gain > 0x4000)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value,tone gain should be array between [0x0, 0x4000]"));
+               return mp_obj_new_int(-1);
+       }
+       int ret = 0;
+       ret = Helios_Audio_Set_Tone_Gain(tone_gain);
+       return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(helios_aud_set_tone_gain_obj, helios_aud_set_tone_gain);
+#endif
+
 #endif
 
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
 
@@ -1712,7 +1870,7 @@ STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(helios_setgaintabel_obj, 1, helios_setGainTabel);
 #endif
 
-#if defined (PLAT_EIGEN)
+#if defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 STATIC mp_obj_t helios_setGainTabel(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
 
@@ -1769,708 +1927,59 @@ STATIC mp_obj_t helios_audio___del__(mp_obj_t self_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio___del___obj, helios_audio___del__);
 
-
-
-int audio_err_handle(void)
-{
-       //return 0;
-    if ((g_audio_callback != NULL) /*&& (audio_state != AUDIO_IDLE)*/)
-    {
-        HELIOS_AUDIO_LOG("[Audio] callback start.\r\n");
-        GC_STACKTOP_SET();
-        mp_sched_schedule_ex(g_audio_callback, mp_obj_new_int(8));
-        GC_STACKTOP_CLEAR();
-        HELIOS_AUDIO_LOG("[Audio] callback end.\r\n");
-    }
-    Helios_Mutex_Lock(audio.queue_mutex, HELIOS_WAIT_FOREVER);
-    audio.audio_state = AUDIO_IDLE;
-    Helios_Mutex_Unlock(audio.queue_mutex);
-    uint8_t audio_msg = AUDIO_FINISH_EVENT;
-    if (audio.montage_is_stopping == 0) {
-               if (Helios_MsgQ_Put(audio.queue_msg, (const void *)&audio_msg, sizeof(uint8_t), HELIOS_NO_WAIT) == -1)
-               {
-                       HELIOS_AUDIO_LOG("send audio msg failed[%u].\r\n", audio_msg);
-                       return -1;
-               }
-       }
-    HELIOS_AUDIO_LOG("send audio finished signal successed[%u].\r\n", audio_msg);
-    return 0;
-}
-
-
 //================================montage Handel start=====================================================
 #if defined (PLAT_Unisoc) || defined (PLAT_ASR)  || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
-|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
-
-
-#include "helios_os.h"
-#if !CONFIG_AUDIO
-#include "helios_fs.h"
-
-#define MONTAGE_LEN 2048
-#define MONTAGE_FLAGE_LEN 8
-#define MONTAGE_MAX_NUMBER 16
-#define MONTAGE_IDENTIFICATION "montage"
-#define ARRAY_IS_USED 1
-#define ARRAY_NOT_USED 0
-
-
-Helios_Thread_t montage_play_task_id = 0;
-Helios_MsgQ_t montage_play_queue = 0;
-
-typedef struct
-{
-    char* montage_name;
-    char* file_name;
-    Helios_AudPlayerType type;
-    Helios_AudOutputType outputtype;
-    helios_cb_on_player usr_cb;
-} montage_play_elem;
-
-typedef struct
-{
-    char file_name[128];
-    uint32_t offset;
-    uint32_t size;
-} montage_elem;
+|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
 
-typedef struct
-{
-    char is_used;
-    char montage_name[128];
-    uint32_t file_num;
-    montage_elem *file_info_buf;
-} montage_info;
-
-enum
-{
-    PLAY_MOREFILES_ERR_OK = 0,
-    PLAY_MOREFILES_ERR_SINGLEFILE = -1,
-    PLAY_MOREFILES_ERR_FILENOTEXIST = -2,
-    PLAY_MOREFILES_ERR_FILENFSFAIL = -3,
-};
-
-
-
-static montage_info all_montage[MONTAGE_MAX_NUMBER] = {0};
-
-// Check whether it has been preprocessed
-// Check for preprocessing
-static char __check_is_preprocessed(char *montage_name)
+extern int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, int device);
+static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
-    int i = 0;
-    char ret = -1;
-
-    for (i = 0; i < MONTAGE_MAX_NUMBER; i++)
+    enum
     {
-        if (all_montage[i].is_used == ARRAY_IS_USED && (0 == strncmp(all_montage[i].montage_name, montage_name, strlen(montage_name))))
+        ARF_montage_file,
+        ARG_priority,
+        ARG_breakin,
+        ARG_data
+    };
+    static const mp_arg_t allowed_args[] =
         {
-            ret = i;
-            break;
-        }
-    }
-    return ret;
-}
-
-// Gets a free preprocessed array
-static char __Get_idle_preprocessing_array()
-{
-    int i = 0;
-    char ret = -1;
+            {MP_QSTR_montageFile, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
+            {MP_QSTR_priority, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_breakin, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
+        };
+    mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args - 1, args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals);
 
-    for (i = 0; i < MONTAGE_MAX_NUMBER; i++)
+       if(vals[ARG_priority].u_int > 4)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid priority,must be in 0~4"));
+       }
+       if(vals[ARG_breakin].u_int > 1)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid breakin,must be in 0~1"));
+       }
+       audio_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+    int new_priority = vals[ARG_priority].u_int;
+    int new_breakin = vals[ARG_breakin].u_int;
+    char vfs_name[256] = {0};
+    char *new_data = NULL;
+    char *new_monFile = NULL;
+    char vfs_monFile[256] = {0};
+    if (mp_obj_is_str(vals[ARG_data].u_obj))
     {
-        if (all_montage[i].is_used == ARRAY_NOT_USED)
-        {
-            ret = i;
-            break;
-        }
+        new_data = (char *)mp_obj_str_get_str(vals[ARG_data].u_obj);
     }
-    return ret;
-}
-
-//Pretreatment process
-//Preprocessing process
-static char montage_file_preprocessing(char *montage_name)
-{
-    char montage_buf[MONTAGE_FLAGE_LEN + 1] = {0};
-    char NumberOfFilesBuff[4] = {0};
-    uint32_t Number_of_files = 0;
-    montage_elem *file_information = NULL;
-    montage_info *ret = NULL;
-    int8_t idle_index = -1;
-    int8_t montage_index = -1;
-
-    montage_index = __check_is_preprocessed(montage_name);
-    if (montage_index != -1)
+    else
     {
-        return montage_index;
+        mp_raise_ValueError(MP_ERROR_TEXT("invalid data"));
     }
-
-    idle_index = __Get_idle_preprocessing_array();
-    if (idle_index == -1)
+    // GET_FILE_VFS_PATH(new_data, vfs_name);
+    memcpy(vfs_name, new_data, strlen(new_data));
+       
+    if (mp_obj_is_str(vals[ARF_montage_file].u_obj))
     {
-        HELIOS_AUDIO_LOG("No idle preprocessing array");
-        return -1;
-    }
-
-    HeliosFILE *fp = Helios_fopen(montage_name, "rb");
-    if (NULL == fp)
-    {
-        HELIOS_AUDIO_LOG("montage(%s) open fail\n", montage_name);
-        idle_index = -1;
-        goto err;
-    }
-
-    // Check document identification
-    if (MONTAGE_FLAGE_LEN != Helios_fread(&montage_buf, 1, MONTAGE_FLAGE_LEN, fp))
-    {
-        HELIOS_AUDIO_LOG("montage read identification fail\n");
-        idle_index = -1;
-        goto err;
-    }
-
-    if (0 != strncmp(montage_buf, MONTAGE_IDENTIFICATION, MONTAGE_FLAGE_LEN))
-    {
-        HELIOS_AUDIO_LOG("This file is not a splice file\n");
-        idle_index = -1;
-        goto err;
-    }
-
-    // Get number of files
-    if (4 != Helios_fread(&NumberOfFilesBuff, 4, 1, fp))
-    {
-        HELIOS_AUDIO_LOG("Failed to read the number of files\n");
-        idle_index = -1;
-        goto err;
-    }
-
-    Number_of_files = *(uint32_t *)NumberOfFilesBuff;
-    HELIOS_AUDIO_LOG("The number of documents is %d\n", Number_of_files);
-    if (0 == Number_of_files)
-    {
-        idle_index = -1;
-        goto err;
-    }
-
-    // Application buf save header
-    file_information = calloc(Number_of_files, sizeof(montage_elem));
-    if (NULL == file_information)
-    {
-        HELIOS_AUDIO_LOG("File information memory request failed\n");
-        idle_index = -1;
-        goto err;
-    }
-
-    int aa_debug = Helios_fread((void *)file_information, (Number_of_files * sizeof(montage_elem)), 1, fp);
-    HELIOS_AUDIO_LOG("read size= %d, actual = %d\n", Number_of_files * sizeof(montage_elem), aa_debug);
-    if ((int)(Number_of_files * sizeof(montage_elem)) != aa_debug)
-    {
-        HELIOS_AUDIO_LOG("Failed to read file information\n");
-        if (file_information)
-        {
-            free(file_information);
-            file_information = NULL;
-        }
-        return -1;
-    }
-    all_montage[idle_index].is_used = ARRAY_IS_USED;
-    memcpy(&(all_montage[idle_index].montage_name), montage_name, strlen(montage_name));
-    all_montage[idle_index].file_num = Number_of_files;
-    all_montage[idle_index].file_info_buf = file_information;
-
-err:
-    if (fp)
-    {
-        Helios_fclose(fp);
-        fp = NULL;
-    }
-
-    // if (file_information)
-    // {
-    //     free(file_information);
-    //     file_information = NULL;
-    // }
-    return idle_index;
-}
-
-// Gets the file information in the stitched file
-static montage_elem *__getElemByName(char *montage_name, char *file_name)
-{
-    int8_t montage_index = -1;
-    int8_t elem_index = -1;
-    montage_elem *elem = NULL;
-    char actual_name[128] = {0};
-
-    montage_index = montage_file_preprocessing(montage_name);
-    if (-1 == montage_index)
-    {
-        return NULL;
-    }
-    elem = (montage_elem *)(all_montage[montage_index].file_info_buf);
-
-    sprintf(actual_name, file_name + 3, strlen(file_name) - 3);
-
-    uint32_t i = 0;
-    for (i = 0; i < all_montage[montage_index].file_num; i++)
-    {
-        if (0 == strncmp(file_name, elem->file_name, strlen(actual_name)+3))
-        {
-            return elem;
-        }
-        elem++;
-    }
-
-    return NULL;
-}
-
-Helios_AudStreamFormat auStreamFormatBySuffix(const char *fname)
-{
-    if (fname == NULL)
-        return HELIOS_AUDIO_FORMAT_UNKNOWN;
-
-    char *dot = strrchr(fname, '.');
-    if (dot == NULL)
-        return HELIOS_AUDIO_FORMAT_AMRNB;
-
-    if (strcasecmp(dot, ".pcm") == 0)
-        return HELIOS_AUDIO_FORMAT_PCM;
-
-    if (strcasecmp(dot, ".wav") == 0)
-        return HELIOS_AUDIO_FORMAT_WAVPCM;
-
-    if (strcasecmp(dot, ".mp3") == 0)
-        return HELIOS_AUDIO_FORMAT_MP3;
-
-    if (strcasecmp(dot, ".amr") == 0)
-        return HELIOS_AUDIO_FORMAT_AMRNB;
-
-    if (strcasecmp(dot, ".awb") == 0)
-        return HELIOS_AUDIO_FORMAT_AMRWB;
-
-    return HELIOS_AUDIO_FORMAT_UNKNOWN;
-}
-
-static int is_play = 0;
-struct mp3_file_list
-{
-    montage_elem *elem;
-    char file_name[128];
-    struct mp3_file_list *next;
-};
-static void mp3_file_list_push(struct mp3_file_list *head, struct mp3_file_list *item)
-{
-    struct mp3_file_list *p = NULL;
-    if (head == NULL)
-    {
-        return;
-    }
-    p = head;
-    while (p->next != NULL)
-    {
-        p = p->next;
-    }
-
-    p->next = item;
-}
-
-static struct mp3_file_list *mp3_file_list_pop(struct mp3_file_list *head)
-{
-    struct mp3_file_list *p = NULL;
-    if (head == NULL)
-    {
-        return NULL;
-    }
-
-    if (head->next)
-    {
-        p = head->next;
-        head->next = p->next;
-        return p;
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-static void mp3_file_list_destroy(struct mp3_file_list *head)
-{
-    if (head == NULL)
-    {
-        return;
-    }
-    do
-    {
-        struct mp3_file_list *item = mp3_file_list_pop(head);
-               if(item == NULL) {
-                       break;
-               }
-        FREE_BUFF(item);
-    }while (head->next != NULL);
-
-}
-
-static int ql_audio_play_morefiles(char *montage_file, char *files, montage_play_elem *play_elem)
-{
-    struct mp3_file_list list_head = {.next = NULL};
-    char *path_dir = NULL;
-    char *p = NULL;
-    int total_files_size = 0;
-    int data_size = 0;
-    char *data = NULL;
-    char *files_tmp = NULL;
-    // char file_type = 0;
-    char tmp[128] = {0};
-    HeliosFILE *fp = NULL;
-    int result_ret = PLAY_MOREFILES_ERR_OK;
-    int file_cnt = 0;
-    montage_elem *elem = NULL;
-    void *elem_buf = NULL;
-    uint32_t count = 0;
-    int ret = 0;
-    int format = 0;
-    uint32_t cur_count = 0;
-    montage_is_break = 0;
-
-   uint32_t  cur_count_offset = 0;
-   uint32_t cur_count_size = 0;
-
-    if (strncmp(files, "mp3files=", 9) == 0)
-    {
-        // file_type = 1;
-    }
-    else if (strncmp(files, "amrfiles=", 9) == 0)
-    {
-        // file_type = 3;
-    }
-    else
-    {
-        /* not continue play */
-        result_ret = PLAY_MOREFILES_ERR_SINGLEFILE;
-        goto err2;
-    }
-
-    files_tmp = malloc(strlen(files) + 1);
-    memset(files_tmp, 0, strlen(files) + 1);
-    strcpy(files_tmp, files);
-
-    /* parse files info */
-    p = strtok(files_tmp + 9, "+");
-    if (p != NULL)
-    {
-        HELIOS_AUDIO_LOG("p = %s\n", p);
-    }
-    else
-    {
-        result_ret = PLAY_MOREFILES_ERR_FILENOTEXIST;
-        goto err2;
-    }
-
-    while (p != NULL)
-    {
-        struct mp3_file_list *item = NULL;
-        elem = __getElemByName(montage_file, p);
-        if (elem != NULL)
-        {
-            //HELIOS_AUDIO_LOG("XXX elem:%s, offset %d, size=%d\n", elem->file_name, elem->offset, elem->size);
-            item = calloc(1, sizeof(struct mp3_file_list));
-            sprintf(item->file_name, "%s", p);
-            item->elem = elem;
-            item->next = NULL;
-            mp3_file_list_push(&list_head, item);
-            file_cnt++;
-        }
-        else
-        {
-            while (list_head.next != NULL)
-            {
-                struct mp3_file_list *item = mp3_file_list_pop(&list_head);
-                if (item)
-                {
-                    free(item);
-                }
-            }
-            result_ret = PLAY_MOREFILES_ERR_FILENOTEXIST;
-            goto err2;
-        }
-        p = strtok(NULL, "+");
-    }
-
-
-    /* play files in once */
-    // data = malloc(total_files_size);
-    fp = Helios_fopen(montage_file, "rb");
-    if (NULL == fp)
-    {
-        result_ret = PLAY_MOREFILES_ERR_FILENOTEXIST;
-        goto err2;
-    }
-    elem_buf = (void *)calloc(1, MONTAGE_LEN);
-
-       do
-    {
-        struct mp3_file_list *item = mp3_file_list_pop(&list_head);
-               if(item == NULL) {
-                       break;
-               }
-
-        format = auStreamFormatBySuffix(item->elem->file_name);
-        HELIOS_AUDIO_LOG("format = %d\n", format);
-
-        if (item)
-        {
-            HELIOS_AUDIO_LOG("%s, offset %d, size=%d\n", item->elem->file_name, item->elem->offset, item->elem->size);
-
-            if((format == HELIOS_AUDIO_FORMAT_AMRNB) || (format == HELIOS_AUDIO_FORMAT_AMRWB)) {
-                cur_count_offset = item->elem->offset+6;
-                cur_count_size = item->elem->size - 6;
-            } else if(format == HELIOS_AUDIO_FORMAT_MP3){
-                               char mp3_head[10] = {0};
-                               int skip_size = 0;
-                               Helios_fseek(fp, item->elem->offset, SEEK_SET);
-                               Helios_fread(mp3_head, 1, 10, fp);
-                               if(mp3_head[0] == 73 && mp3_head[1] == 68 && mp3_head[2] == 51) {
-                                       skip_size = (mp3_head[6]&0x7F)*0x200000
-                                       +(mp3_head[7]&0x7F)*0x4000
-                                       +(mp3_head[8]&0x7F)*0x80
-                                       +(mp3_head[9]&0x7F) + 10;
-                                       HELIOS_AUDIO_LOG("is mp3 file, skip size[%d]\n", skip_size);
-                               }
-                cur_count_offset = item->elem->offset + skip_size;
-                cur_count_size = item->elem->size - skip_size;
-            } else {
-                cur_count_offset = item->elem->offset;
-                cur_count_size = item->elem->size;
-            }
-
-            ret = Helios_fseek(fp, cur_count_offset, SEEK_SET);
-            HELIOS_AUDIO_LOG("Helios_fseek = %d\n", ret);
-            if ((uint32_t)ret != cur_count_offset)
-            {
-                result_ret = PLAY_MOREFILES_ERR_FILENFSFAIL;
-                FREE_BUFF(item);
-                goto err2;
-            }
-
-            count = 0;
-
-            HELIOS_AUDIO_LOG("cur_count_size = %d\n", cur_count_size);
-            while (count < cur_count_size)
-            {
-                if (count + MONTAGE_LEN < cur_count_size)
-                {
-                    cur_count = Helios_fread(elem_buf, 1, MONTAGE_LEN, fp);
-                }
-                else
-                {
-                    cur_count = Helios_fread(elem_buf, 1, cur_count_size - count, fp);
-                }
-
-                HELIOS_AUDIO_LOG("cur_count = %d\n", cur_count);
-                if (cur_count <= 0)
-                    break;
-                count += cur_count;
-
-                HELIOS_AUDIO_LOG("format = %d, cur_count = %d, type = %d, outputtype = %d, usr_cb = 0x%x\n", format, cur_count, play_elem->type, play_elem->outputtype, play_elem->usr_cb);
-                               Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER);
-                ret = Helios_Audio_StreamPlayStart(format, elem_buf, cur_count, play_elem->type, play_elem->outputtype, audio_play_callback);
-                               if(ret != 0) {
-                                       HELIOS_AUDIO_LOG("old play stream ret : %d\n",  ret);
-                                       ret = Helios_Audio_StreamPlayStart(format, elem_buf, cur_count, play_elem->type, play_elem->outputtype, audio_play_callback);
-                                       HELIOS_AUDIO_LOG("again play stream ret : %d\n",  ret);
-                               }
-                               Helios_Mutex_Unlock(audio.montage_mutex);
-                Helios_msleep(100);
-                if (montage_is_break || (0 != ret))
-                {
-                    HELIOS_AUDIO_LOG("montage_is_break : %d ret : %d\n", montage_is_break, ret);
-                    #if !defined(PLAT_EIGEN)
-                    if(montage_is_break == 0) 
-                    {
-                                               audio_err_handle();
-                    }
-                    #endif
-
-                                       montage_is_break = 0;
-                    FREE_BUFF(item);
-                    goto err2;
-                }
-            }
-            FREE_BUFF(item);
-        }
-    }while (list_head.next != NULL);
-
-err2:
-
-    if (fp)
-    {
-        Helios_fclose(fp);
-        fp = NULL;
-    }
-
-    if (elem_buf)
-    {
-        free(elem_buf);
-        elem_buf = NULL;
-    }
-
-    if (files_tmp)
-    {
-        free(files_tmp);
-        files_tmp = NULL;
-    }
-
-    {
-        mp3_file_list_destroy(&list_head);
-    }
-
-    if(PLAY_MOREFILES_ERR_OK != result_ret) {
-        HELIOS_AUDIO_LOG("result_ret : %d \n", result_ret);
-        audio_err_handle();
-    }
-
-    return result_ret;
-}
-
-static void Helios_Montage_play_task(void *argv)
-{
-    (void)argv;
-    int ret = 0;
-    montage_play_elem play_elem;
-
-    while (1)
-    {
-        memset(&play_elem, 0, sizeof(montage_play_elem));
-
-        ret = Helios_MsgQ_Get(montage_play_queue, (void *)&play_elem, sizeof(montage_play_elem), HELIOS_WAIT_FOREVER);
-        if (ret != 0)
-        {
-            HELIOS_AUDIO_LOG("Splicing playback thread failed to get queue\n");
-            continue;
-        }
-        if (0 != ql_audio_play_morefiles(play_elem.montage_name, play_elem.file_name, &play_elem))
-        {
-            HELIOS_AUDIO_LOG("Failed to play montage audio\n");
-        }
-        FREE_BUFF(play_elem.montage_name);
-        FREE_BUFF(play_elem.file_name);
-    }
-}
-
-int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, uint8_t device)
-{
-
-    Helios_ThreadAttr attr = {0};
-    montage_play_elem play_elem;
-    if (0 == montage_play_queue)
-    {
-        montage_play_queue = Helios_MsgQ_Create(10, sizeof(montage_play_elem));
-        if (!montage_play_queue)
-        {
-            HELIOS_AUDIO_LOG("create montage queue failed, can not create msgQ.");
-            goto err1;
-        }
-    }
-
-    if (0 == montage_play_task_id)
-    {
-        attr.name = "audio_montage_play";
-        attr.stack_size = 4096;
-        attr.priority = 95;
-        attr.entry = Helios_Montage_play_task;
-
-        montage_play_task_id = Helios_Thread_Create(&attr);
-        if (0 == montage_play_task_id)
-        {
-            HELIOS_AUDIO_LOG("create montage task failed\n");
-            goto err1;
-        }
-    }
-
-    memset(&play_elem, 0, sizeof(montage_play_elem));
-
-    CALLOC_BUFF_SET(play_elem.montage_name, montage_name);
-    CALLOC_BUFF_SET(play_elem.file_name, file_name);
-
-    play_elem.outputtype = device;
-    play_elem.type = type;
-    play_elem.usr_cb = usr_cb;
-
-    if (montage_play_queue)
-    {
-               return Helios_MsgQ_Put(montage_play_queue, (const void *)&play_elem, sizeof(montage_play_elem), HELIOS_NO_WAIT);                
-    }
-
-    return 0;
-err1:
-    if (montage_play_queue)
-    {
-        Helios_MsgQ_Delete(montage_play_queue);
-        montage_play_queue = 0;
-    }
-
-    if (montage_play_task_id)
-    {
-        Helios_Thread_Delete(montage_play_task_id);
-        montage_play_task_id = 0;
-    }
-    return -1;
-}
-
-#else
-extern int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, int device);
-#endif
-
-
-static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
-{
-    enum
-    {
-        ARF_montage_file,
-        ARG_priority,
-        ARG_breakin,
-        ARG_data
-    };
-    static const mp_arg_t allowed_args[] =
-        {
-            {MP_QSTR_montageFile, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
-            {MP_QSTR_priority, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
-            {MP_QSTR_breakin, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
-            {MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
-        };
-    mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)];
-    mp_arg_parse_all(n_args - 1, args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals);
-
-       if(vals[ARG_priority].u_int > 4)
-       {
-               mp_raise_ValueError(MP_ERROR_TEXT("invalid priority,must be in 0~4"));
-       }
-       if(vals[ARG_breakin].u_int > 1)
-       {
-               mp_raise_ValueError(MP_ERROR_TEXT("invalid breakin,must be in 0~1"));
-       }
-       audio_obj_t *self = MP_OBJ_TO_PTR(args[0]);
-    int new_priority = vals[ARG_priority].u_int;
-    int new_breakin = vals[ARG_breakin].u_int;
-    char vfs_name[256] = {0};
-    char *new_data = NULL;
-    char *new_monFile = NULL;
-    char vfs_monFile[256] = {0};
-    if (mp_obj_is_str(vals[ARG_data].u_obj))
-    {
-        new_data = (char *)mp_obj_str_get_str(vals[ARG_data].u_obj);
-    }
-    else
-    {
-        mp_raise_ValueError(MP_ERROR_TEXT("invalid data"));
-    }
-    // GET_FILE_VFS_PATH(new_data, vfs_name);
-    memcpy(vfs_name, new_data, strlen(new_data));
-       
-    if (mp_obj_is_str(vals[ARF_montage_file].u_obj))
-    {
-        new_monFile = (char *)mp_obj_str_get_str(vals[ARF_montage_file].u_obj);
+        new_monFile = (char *)mp_obj_str_get_str(vals[ARF_montage_file].u_obj);
     }
     else
     {
@@ -2577,13 +2086,9 @@ static mp_obj_t helios_play_montage_file_start(size_t n_args, const mp_obj_t *ar
                                        {
                                                Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER);
                                                HELIOS_AUDIO_LOG("---- stop audio montage play. ----\r\n");
-                           montage_is_break = 1;
                                                audio.montage_is_stopping = 1;
-#if CONFIG_AUDIO
-                                               extern void helios_audio_montage_stop();
-                                               helios_audio_montage_stop();
-#endif
-                                               #if !defined(PLAT_EIGEN)
+                                               helios_set_montage_break_flag(1);
+                                               #if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
                            audio_err_handle();
                                                #endif
                            Helios_msleep(200);
@@ -2756,7 +2261,99 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_aud_cache_size_obj, helios_aud_mp3_cache
 #endif
 #endif
 
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R06)
+STATIC mp_obj_t mpy_get_audio_file_time_lenth(mp_obj_t self_in, mp_obj_t filename) {
+       char vfs_name[256] = {0};
+       char *new_data = NULL;
 
+       if (mp_obj_is_str(filename)) 
+       {
+               new_data = (char *)mp_obj_str_get_str(filename);
+       } 
+       else 
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid data"));
+       }
+       GET_FILE_VFS_PATH(new_data, vfs_name);
+
+       int ret = Helios_get_audio_file_time_lenth(vfs_name);
+       return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mpy_get_audio_file_time_lenth_obj, mpy_get_audio_file_time_lenth);
+#endif
+
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+STATIC mp_obj_t mpy_audio_pause(mp_obj_t self_in, mp_obj_t enable_obj) {
+       int enable = mp_obj_get_int(enable_obj);
+       if (enable == 1) {
+               return mp_obj_new_int(Helios_Audio_Stream_Pause());
+       } else {
+               return mp_obj_new_int(Helios_Audio_Stream_Continue());
+       }
+       
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mpy_audio_pause_obj, mpy_audio_pause);
+#endif
+
+#if defined(PLAT_ASR_1606) && (defined(BOARD_EC600MCN_LE_POC_QS)|| defined(BOARD_EC600MCN_LA_POC_XBND))
+STATIC mp_obj_t helios_audio_denoise_config(mp_uint_t n_args, const mp_obj_t *args) {
+       unsigned char cfg = 0;
+       int ret =-1;
+       if(n_args == 1)
+    {
+               ret = Helios_Audio_Get_Denoise(&cfg);
+               if(0 != ret)
+               {
+                       return mp_obj_new_int(-1);
+               }
+               return mp_obj_new_int(cfg);
+       }
+       else if(n_args == 2)
+       {
+               unsigned char check_flag = 0;
+               Helios_Audio_Check_Denoise_Licenses_Verify(&check_flag); 
+               if(0 == check_flag)
+               {
+                       return mp_obj_new_int(-2);
+               }
+               cfg = mp_obj_get_int(args[1]);
+               ret = Helios_Audio_Set_Denoise(cfg);
+               return mp_obj_new_int(ret);
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(helios_audio_denoise_config_obj, 1, 2, (mp_obj_t)helios_audio_denoise_config);
+
+STATIC mp_obj_t helios_audio_denoise_check_verify(mp_obj_t self_in)
+{
+       unsigned char check_flag = 0;
+       Helios_Audio_Check_Denoise_Licenses_Verify(&check_flag);  
+       return mp_obj_new_int(check_flag);        //0-unauthorized 1-authorized
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_denoise_check_verify_obj, helios_audio_denoise_check_verify);
+
+STATIC mp_obj_t helios_audio_get_denoise_libary_version(mp_obj_t self_in)
+{
+       char version[64] = {0};
+       char data_len = 0;
+       Helios_Audio_Get_Denoise_Lib_Version(&version);  
+       for(int i=0; i<64; i++)
+       {
+               if(version[i]==0)
+               {
+                       data_len = i;
+                       break;
+               }
+       }
+       return mp_obj_new_str(version, data_len);         
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_get_denoise_libary_version_obj, helios_audio_get_denoise_libary_version);
+
+
+#endif
 const mp_obj_type_t audio_audio_pcm;
 
 STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
@@ -2767,6 +2364,14 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_getState), MP_ROM_PTR(&helios_get_audio_state_obj) },
     { MP_ROM_QSTR(MP_QSTR_getPlayState), MP_ROM_PTR(&helios_get_audio_play_state_obj) },
     { MP_ROM_QSTR(MP_QSTR_getPlayFile), MP_ROM_PTR(&helios_get_audio_playing_file_name_obj) },
+#if defined(PLAT_Unisoc_8850_R02) && defined(CONFIG_POC)
+       { MP_ROM_QSTR(MP_QSTR_setDataDumpLog), MP_ROM_PTR(&helios_set_audio_data_dump_log_obj) },
+#endif
+#if defined(PLAT_ASR_1606) && (defined(BOARD_EC600MCN_LE_POC_QS)|| defined(BOARD_EC600MCN_LA_POC_XBND))
+       { MP_ROM_QSTR(MP_QSTR_audDenoiseConfig), MP_ROM_PTR(&helios_audio_denoise_config_obj) },
+       { MP_ROM_QSTR(MP_QSTR_audDenoiseCheckVerify), MP_ROM_PTR(&helios_audio_denoise_check_verify_obj) },
+       { MP_ROM_QSTR(MP_QSTR_audDenoiseVersion), MP_ROM_PTR(&helios_audio_get_denoise_libary_version_obj) },
+#endif
     #ifdef AUDIO_DTMF_TONE_NEW_SUPPORT
        { MP_ROM_QSTR(MP_QSTR_setToneVolume), MP_ROM_PTR(&helios_set_ToneVolume_obj) },
        #endif
@@ -2779,14 +2384,16 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_playStream), MP_ROM_PTR(&helios_play_stream_start_obj) },
     { MP_ROM_QSTR(MP_QSTR_stopPlayStream), MP_ROM_PTR(&helios_play_stream_stop_obj) },
 #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_Unisoc_8850) \
-    || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) \
+       || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #if !CONFIG_AUDIO_PWM
-#if !defined(PLAT_EIGEN)
+#if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
        { MP_ROM_QSTR(MP_QSTR_set_channel), MP_ROM_PTR(&helios_set_channel_obj) },
 #endif
 #endif
        { MP_ROM_QSTR(MP_QSTR_set_pa), MP_ROM_PTR(&helios_set_pa_obj) },
        { MP_ROM_QSTR(MP_QSTR_set_open_pa_delay), MP_ROM_PTR(&helios_set_open_pa_delay_obj) },
+       { MP_ROM_QSTR(MP_QSTR_set_close_pa_delay), MP_ROM_PTR(&helios_set_close_pa_delay_obj) },
        { MP_ROM_QSTR(MP_QSTR_setSpeakerpaCallback), MP_ROM_PTR(&helios_set_speakerpa_callback_obj) },
        { MP_ROM_QSTR(MP_QSTR_setSpeakerpaSwitch), MP_ROM_PTR(&helios_user_speakerpa_switch_obj) },
 #if defined (PLAT_Unisoc) 
@@ -2794,10 +2401,13 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
 #endif
 
 #endif
-#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) \
-    || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s)
+#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) \
+    || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850_R02)
        { MP_ROM_QSTR(MP_QSTR_aud_tone_play), MP_ROM_PTR(&mp_helios_aud_tone_play_obj) },
        { MP_ROM_QSTR(MP_QSTR_aud_tone_play_stop), MP_ROM_PTR(&helios_aud_tone_play_stop_obj) },
+#if defined(BOARD_EC800GCN_LD_XBND)
+       { MP_ROM_QSTR(MP_QSTR_aud_set_tone_gain), MP_ROM_PTR(&helios_aud_set_tone_gain_obj) },
+#endif
 #if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
        #if CONFIG_AUDIO_MP3
        { MP_ROM_QSTR(MP_QSTR_aud_cache_clear), MP_ROM_PTR(&helios_aud_clear_cache_obj) },
@@ -2806,25 +2416,45 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
 #endif
 #endif
 #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
-    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_montage_play), MP_ROM_PTR(&helios_play_montage_file_start_obj) },
 #endif
 #if CONFIG_AUDIO
        { MP_ROM_QSTR(MP_QSTR_FrameJumpNum), MP_ROM_PTR(&helios_play_jump_frame_obj) },
 #endif
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_pcmParaSet), MP_ROM_PTR(&helios_pcm_para_obj) },
        { MP_ROM_QSTR(MP_QSTR_StreamJump), MP_ROM_PTR(&helios_play_stream_jump_obj) },
        { MP_ROM_QSTR(MP_QSTR_StreamPause), MP_ROM_PTR(&helios_play_stream_pause_obj) },
        { MP_ROM_QSTR(MP_QSTR_StreamContinue), MP_ROM_PTR(&helios_play_stream_continue_obj) },
        { MP_ROM_QSTR(MP_QSTR_StreamSeek), MP_ROM_PTR(&helios_play_stream_seek_obj) },
 #endif
-#if defined (PLAT_Unisoc) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_setGainTabel), MP_ROM_PTR(&helios_setgaintabel_obj) },
 #endif
-#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1602)
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602) \
+       || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_PCM), MP_ROM_PTR(&audio_audio_pcm) },
 #endif
+
+#if defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_LA_POC_QS)
+       { MP_ROM_QSTR(MP_QSTR_set_audio_read_delay), MP_ROM_PTR(&mpy_set_audio_read_delay_obj) },
+#endif
+#if defined(BOARD_EC600MCN_LF_SLPOC)
+       { MP_ROM_QSTR(MP_QSTR_playModeConfig), MP_ROM_PTR(&helios_set_audio_play_mode_obj) },
+       { MP_ROM_QSTR(MP_QSTR_OPEN_CODEC_THEN_PA), MP_ROM_INT(0) },
+       { MP_ROM_QSTR(MP_QSTR_OPEN_PA_THEN_CODEC), MP_ROM_INT(1) },
+       { MP_ROM_QSTR(MP_QSTR_CLOSE_CODEC_THEN_PA), MP_ROM_INT(0) },
+       { MP_ROM_QSTR(MP_QSTR_CLOSE_PA_THEN_CODEC), MP_ROM_INT(1) },
+
+#endif
+
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+       { MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&mpy_audio_pause_obj) },
+#endif
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R06)
+       { MP_ROM_QSTR(MP_QSTR_getFileTimeLenth), MP_ROM_PTR(&mpy_get_audio_file_time_lenth_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(audio_locals_dict, audio_locals_dict_table);
 
@@ -2835,7 +2465,7 @@ const mp_obj_type_t audio_audio_type = {
     .locals_dict = (mp_obj_dict_t *)&audio_locals_dict,
 };
 
-#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1602)
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 
 #define QL_PCM_BLOCK_FLAG              (0x01)
 #define QL_PCM_NONBLOCK_FLAG   (0x02)
@@ -2862,6 +2492,8 @@ typedef struct _machine_pcm_obj_t {
     unsigned int samplerate;
        unsigned int flags;
        unsigned int mode;
+       void* PCM_stream_ring_buf;
+       char PCM_stream_RW_flag;
 } machine_pcm_obj_t;
 
 const mp_obj_type_t audio_audio_pcm;
@@ -2889,11 +2521,9 @@ enum{
        PCM_FLAG_WRITE_READ,
        PCM_FLAG_MAX,
 };
-
-
-
-//void *Helios_PCM_Open(unsigned int channels, unsigned int samplerate, unsigned int flags);
-//int Helios_PCM_Close(void* handle);
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+static int poc_mode_state = 0;
+#endif
 STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
        enum { ARG_channel, ARG_samplerate, ARG_flags, ARG_mode, ARG_periodcnt};
     static const mp_arg_t allowed_args[] = {
@@ -2905,11 +2535,10 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
     };
 
        
-
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
     mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
 
-       if(args[ARG_channel].u_int != 1 && args[ARG_channel].u_int != 2) {
+       if(args[ARG_channel].u_int > 2) {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid channels"));
        }
        
@@ -2933,7 +2562,7 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
        self->flags = args[ARG_flags].u_int;
        self->samplerate = args[ARG_samplerate].u_int;
        self->mode = args[ARG_mode].u_int;
-#if !defined(PLAT_ASR_1803s)
+#if !(defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc))
        Helios_set_mic_channel(self->mic_channel);
 #endif
        Helios_PCM_CONFIG_T pcm_info = {0};
@@ -2941,6 +2570,20 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
        pcm_info.samplerate = args[ARG_samplerate].u_int;
        pcm_info.periodcnt = args[ARG_periodcnt].u_int;
 
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+       if(args[ARG_flags].u_int == PCM_FLAG_WRITE_READ){
+               Helios_set_pcm_type(HELIOS_PCM_POC, HELIOS_POC_TYPE_FULL_DUPLEX);
+       }
+       else{
+               Helios_set_pcm_type(HELIOS_PCM_LOCAL, HELIOS_POC_TYPE_FULL_DUPLEX);
+       }
+#endif
+
+#if defined(PLAT_Unisoc_8910_R06)
+       if (args[ARG_flags].u_int == PCM_FLAG_WRITE_READ) {
+               mp_raise_ValueError(MP_ERROR_TEXT("not support this mode")); // Unisoc 8910 C2 Audio do nont support duplex mode
+       }
+#endif
        switch (args[ARG_flags].u_int)
                {
                case PCM_FLAG_READ_ONLY:
@@ -2978,6 +2621,10 @@ STATIC void machine_pcm_init_helper(machine_pcm_obj_t *self, size_t n_args, cons
                        self->handle_write = Helios_PCM_Open(pcm_info.channels, pcm_info.samplerate, QL_PCM_WRITE_FLAG|args[ARG_mode].u_int);
 #else
                        self->handle_write = Helios_PCM_Open(&pcm_info, QL_PCM_WRITE_FLAG|args[ARG_mode].u_int);
+#endif
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+                       Helios_start_poc_mode(1);
+                       poc_mode_state = 1;
 #endif
                        if(NULL == self->handle_write) {
                                mp_raise_ValueError(MP_ERROR_TEXT("pcm open write fail"));
@@ -3001,8 +2648,8 @@ STATIC mp_obj_t pcm_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
        machine_pcm_obj_t *self = m_new_obj_with_finaliser(machine_pcm_obj_t);
        self->base.type = &audio_audio_pcm;
        self->mic_channel = mic_channel;
-
-       
+       self->PCM_stream_ring_buf = NULL;
+       self->PCM_stream_RW_flag = 0;   
     mp_map_t kw_args;
     mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
     machine_pcm_init_helper(self, n_args - 1, args + 1, &kw_args);
@@ -3038,7 +2685,7 @@ STATIC mp_uint_t audio_pcm_read(mp_obj_t self_in, void *buf_in, mp_uint_t size,
 STATIC mp_uint_t audio_pcm_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) {
     machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
-       if(self->flags == PCM_FLAG_READ_ONLY || self->handle_read == NULL) {
+       if(self->flags == PCM_FLAG_READ_ONLY || self->handle_write == NULL) {
                mp_raise_ValueError(MP_ERROR_TEXT("This pcm only supports read operations"));
        }
        int bytes_written = Helios_PCM_Write(self->handle_write, (void*)buf_in, size);
@@ -3071,13 +2718,19 @@ STATIC mp_uint_t audio_pcm_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t
     }
     return ret;
 }
-helios_ring_buf_t *PCM_stream_ring_buf = NULL;
-char PCM_stream_is_open = 0;
-Helios_Thread_t PCM_stream_task_id = 0;
+
 STATIC mp_obj_t helios_audio_pcm___del__(mp_obj_t self_in)
 {
        uint8_t i = 0;
        machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+       if(self->handle_read && self->handle_write) {
+               if (poc_mode_state) {
+                       poc_mode_state = 0;
+                       Helios_stop_poc_mode();
+               }
+       }
+#endif
 
        if(self->handle_read) {
                Helios_PCM_Close(self->handle_read);
@@ -3089,119 +2742,243 @@ STATIC mp_obj_t helios_audio_pcm___del__(mp_obj_t self_in)
                self->handle_write = NULL;
        }
 
-       PCM_stream_is_open = 0;
-       if(PCM_stream_task_id != 0)
-               Helios_Thread_Delete(PCM_stream_task_id);
-       PCM_stream_task_id = 0;
-       if(PCM_stream_ring_buf != NULL) 
-       {
-               helios_rb_destroy(&PCM_stream_ring_buf);
-               PCM_stream_ring_buf = NULL;
-       }
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_pcm___del___obj, helios_audio_pcm___del__);
+#include "helios_ringbuf.h"
+#if 1
+       //helios_ring_buf_t *PCM_stream_ring_buf = NULL;
+       char PCM_stream_is_open = 0;
+       Helios_Thread_t PCM_stream_task_id = 0;
+       typedef enum
+       {
+               PCM_STREAM_NONE,
+               PCM_STREAM_READ ,
+               PCM_STREAM_WRITE,
+       }PCM_STREAM_RW_TYPE;
+       #define PCM_READ_BUF_LEN 4*1024
+       //char p_data[PCM_READ_BUF_LEN]={0};
+       static void helios_audio_PCM_stream_task(void *self_in)
+       {
+               machine_pcm_obj_t *self = (machine_pcm_obj_t *)self_in;
+               
+               //machine_pcm_obj_t *self = MP_OBJ_TO_PTR(*self_in);
+               char p_data[PCM_READ_BUF_LEN]={0};
+               //char *p_data  = NULL;
+               while(1)
+               {
+                       if(self->PCM_stream_RW_flag == PCM_STREAM_READ)
+                       {
+                               int bytes_read =Helios_PCM_Read(self->handle_read, p_data, PCM_READ_BUF_LEN);   
+                               if(bytes_read>0)
+                               {
+                                       if((helios_ring_buf_t *)self->PCM_stream_ring_buf != NULL)
+                                               helios_rb_write((helios_ring_buf_t *)self->PCM_stream_ring_buf, (unsigned char*)p_data, bytes_read);
+                               }else
+                               {
+                                       //printf("helios_audio_PCM_stream_task:READ no data\r\n");
+                               }
+                       }else if(self->PCM_stream_RW_flag == PCM_STREAM_WRITE)
+                       {
+                               int bytes_read = helios_rb_read((helios_ring_buf_t *)self->PCM_stream_ring_buf, (unsigned char*)p_data, PCM_READ_BUF_LEN);
+                               if(bytes_read>0)
+                               {
+                                       int ret = Helios_PCM_Write(self->handle_write, p_data, bytes_read);
+                                       if(ret<1)
+                                       {
+                                               //printf("helios_audio_PCM_stream_task:pcm write error\r\n");
+                                       }
+                               }
 
+                       }
+                       else
+                       {
+                               //printf("helios_audio_PCM_stream_task:NO_READ_WRITE\r\n");
+                               //Helios_msleep(2000);
+                       }
+                       Helios_msleep(1);
+               }
 
-#define PCM_READ_BUF_LEN 4*1024
-static void helios_audio_PCM_stream_task(void *self_in)
-{
-       machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       char p_data[PCM_READ_BUF_LEN]={0};
-       //char *p_data  = NULL;
-       while(1)
+       }
+       #define ring_buf_len 64*1024
+       STATIC mp_obj_t helios_audio_PCM_stream_read_start(mp_obj_t self_in)
        {
                
-               int bytes_read =Helios_PCM_Read(self->handle_read, p_data, PCM_READ_BUF_LEN);   
-               if(bytes_read>0)
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+               self->PCM_stream_RW_flag = PCM_STREAM_READ;
+               PCM_stream_is_open = 1;
+               if(self->PCM_stream_ring_buf == NULL) {
+                       self->PCM_stream_ring_buf = helios_rb_create(ring_buf_len);
+               }
+               if(self->PCM_stream_ring_buf == NULL) 
+               {
+                       mp_raise_ValueError(MP_ERROR_TEXT("Repeat opening1!!!!!!!!!!!!!!!!!!\r\n\r\n"));
+                       return mp_obj_new_int(-2);
+                       
+               }
+               if(PCM_stream_task_id == 0)
                {
-                       if(PCM_stream_ring_buf != NULL)
-                               helios_rb_write(PCM_stream_ring_buf, (unsigned char*)p_data, bytes_read);
+                       Helios_ThreadAttr attr = {0};
+                       attr.name = "PCM_stream";
+                       attr.stack_size = PCM_READ_BUF_LEN+4*1024;
+                       attr.priority = 95;
+                       attr.entry = helios_audio_PCM_stream_task;
+                       attr.argv = (void *)self;
+                       PCM_stream_task_id = Helios_Thread_Create(&attr);
+               }
+
+               if (0 == PCM_stream_task_id)
+               {
+                       mp_raise_ValueError(MP_ERROR_TEXT("helios_audio_PCM_stream_task error\n"));
+                       return mp_obj_new_int(-1);
                }
-               Helios_msleep(1);
-               
                
+               return mp_obj_new_int(0);
        }
 
-}
-#define ring_buf_len 128*1024
-STATIC mp_obj_t helios_audio_PCM_stream_start(mp_obj_t self_in)
-{
-       
-       machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       PCM_stream_is_open = 1;
-       if(PCM_stream_ring_buf == NULL) {
-               PCM_stream_ring_buf = helios_rb_create(ring_buf_len);
-       }else
+       STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_PCM_stream_read_start_obj, helios_audio_PCM_stream_read_start);
+
+       STATIC mp_obj_t helios_audio_PCM_stream_write_start(mp_obj_t self_in)
        {
-               mp_raise_ValueError(MP_ERROR_TEXT("Repeat opening1\n"));
-               return mp_obj_new_int(-2);
                
-       }
-       if(PCM_stream_task_id == 0)
-       {
-               Helios_ThreadAttr attr = {0};
-               attr.name = "audio_PCM_stream";
-               attr.stack_size = PCM_READ_BUF_LEN+4096;
-               attr.priority = 95;
-               attr.entry = helios_audio_PCM_stream_task;
-               attr.argv = self_in;
-               PCM_stream_task_id = Helios_Thread_Create(&attr);
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+               self->PCM_stream_RW_flag = PCM_STREAM_WRITE;
+               PCM_stream_is_open = 1;
+               if(self->PCM_stream_ring_buf == NULL) {
+                       self->PCM_stream_ring_buf = helios_rb_create(ring_buf_len);
+               }
+               if(self->PCM_stream_ring_buf == NULL) 
+               {
+                       mp_raise_ValueError(MP_ERROR_TEXT("Repeat opening1!!!!!!!!!!!!!!!!!!\r\n\r\n"));
+                       return mp_obj_new_int(-2);
+                       
+               }
+               if(PCM_stream_task_id == 0)
+               {
+                       Helios_ThreadAttr attr = {0};
+                       attr.name = "PCM_stream";
+                       attr.stack_size = PCM_READ_BUF_LEN+4096;
+                       attr.priority = 95;
+                       attr.entry = helios_audio_PCM_stream_task;
+                       attr.argv = (void *)self;
+                       PCM_stream_task_id = Helios_Thread_Create(&attr);
+                       
+               }
                if (0 == PCM_stream_task_id)
                {
                        mp_raise_ValueError(MP_ERROR_TEXT("helios_audio_PCM_stream_task error\n"));
                        return mp_obj_new_int(-1);
                }
-       }else
-       {
-               mp_raise_ValueError(MP_ERROR_TEXT("Repeat opening2\n"));
-               return mp_obj_new_int(-2);
                
+               return mp_obj_new_int(0);
        }
-               
-    return mp_obj_new_int(0);
-}
+       STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_PCM_stream_write_start_obj, helios_audio_PCM_stream_write_start);
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_PCM_stream_start_obj, helios_audio_PCM_stream_start);
+       STATIC mp_obj_t helios_audio_PCM_stream_read(mp_obj_t self_in,mp_obj_t read_buf, mp_obj_t len)
+       {
+               int read_actual_len = 0;
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
+               mp_buffer_info_t bufinfo;
+               mp_get_buffer_raise(read_buf, &bufinfo, MP_BUFFER_WRITE);
+               
+               int read_len = mp_obj_get_int(len);
+               if(read_len > 0 && self->PCM_stream_ring_buf) {
+                       read_actual_len = helios_rb_read((helios_ring_buf_t *)self->PCM_stream_ring_buf, bufinfo.buf, read_len);
+                       return mp_obj_new_int(read_actual_len);
+               }
+               return mp_obj_new_int(-1);
+       }
+       STATIC MP_DEFINE_CONST_FUN_OBJ_3(mp_helios_audio_PCM_stream_read_obj, helios_audio_PCM_stream_read);
 
+       STATIC mp_obj_t helios_audio_PCM_stream_write(mp_obj_t self_in,mp_obj_t write_buf, mp_obj_t len)
+       {
+               int write_actual_len = 0;
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+               
+               mp_buffer_info_t bufinfo;
+               mp_get_buffer_raise(write_buf, &bufinfo, MP_BUFFER_WRITE);
+               
+               int write_len = mp_obj_get_int(len);
+               if(write_len > 0 && self->PCM_stream_ring_buf) {
+                       int timerout = 2000;
+                       while(1)
+                       {
+                               timerout--;
+                               if(timerout <=0 ||(helios_rb_data_len((helios_ring_buf_t *)self->PCM_stream_ring_buf) + write_len < ring_buf_len))
+                                       break;
+                               Helios_msleep(1);
+                       }
+                       write_actual_len = helios_rb_write((helios_ring_buf_t *)self->PCM_stream_ring_buf, bufinfo.buf, write_len);
+                       return mp_obj_new_int(write_actual_len);
+               }
+               return mp_obj_new_int(-1);
+       }
+       STATIC MP_DEFINE_CONST_FUN_OBJ_3(mp_helios_audio_PCM_stream_write_obj, helios_audio_PCM_stream_write);
+
+       STATIC mp_obj_t helios_audio_PCM_stream_stop(mp_obj_t self_in)
+       {
+               int ret = 0;
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+               PCM_stream_is_open = 0;
+               if(PCM_stream_task_id != 0)
+                       Helios_Thread_Delete(PCM_stream_task_id);
+               PCM_stream_task_id = 0;
+               if(self->PCM_stream_ring_buf != NULL) 
+               {
+                       helios_rb_destroy((helios_ring_buf_t **)&self->PCM_stream_ring_buf);
+                       self->PCM_stream_ring_buf = NULL;
+               }
+               self->PCM_stream_RW_flag = PCM_STREAM_NONE;     
+               return mp_obj_new_int(ret);
+       }
+       STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_PCM_stream_stop_obj, helios_audio_PCM_stream_stop);
+       STATIC mp_obj_t helios_audio_pcm_rb_is_empty(mp_obj_t self_in)
+       {
+               int ret = 0;
+               machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
-STATIC mp_obj_t helios_audio_PCM_stream_read(mp_obj_t self_in,mp_obj_t read_buf, mp_obj_t len)
+               // if(self->handle_write) {
+               //      ret = Helios_PCM_Reset_Write_Buffer(self->handle_write);
+               // }
+               if(self->PCM_stream_ring_buf != NULL) 
+               {
+                       if (helios_rb_is_empty((helios_ring_buf_t *)self->PCM_stream_ring_buf))
+                               ret = 1;
+               }
+                       
+               return mp_obj_new_int(ret);
+       }
+       STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_pcm_rb_is_empty_obj, helios_audio_pcm_rb_is_empty);
+#endif
+#if defined(PLAT_ASR_1606)
+STATIC mp_obj_t helios_audio_pcm_get_write_frame_count(mp_obj_t self_in)
 {
-       int read_actual_len = 0;
+       int ret = 0;
        machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
-    mp_buffer_info_t bufinfo;
-    mp_get_buffer_raise(read_buf, &bufinfo, MP_BUFFER_WRITE);
-       
-       int read_len = mp_obj_get_int(len);
-       if(read_len > 0 && PCM_stream_ring_buf) {
-               read_actual_len = helios_rb_read(PCM_stream_ring_buf, bufinfo.buf, read_len);
-               return mp_obj_new_int(read_actual_len);
+       if(self->handle_write) {
+               ret = Helios_PCM_Get_Write_Frame_Count(self->handle_write);
        }
-       return mp_obj_new_int(-1);
-}
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(mp_helios_audio_PCM_stream_read_obj, helios_audio_PCM_stream_read);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_pcm_get_write_frame_count_obj, helios_audio_pcm_get_write_frame_count);
 
-STATIC mp_obj_t helios_audio_PCM_stream_stop(mp_obj_t self_in)
+STATIC mp_obj_t helios_audio_pcm_reset_write_buffer(mp_obj_t self_in)
 {
-    int ret = 0;
+       int ret = 0;
        machine_pcm_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       PCM_stream_is_open = 0;
-       if(PCM_stream_task_id != 0)
-               Helios_Thread_Delete(PCM_stream_task_id);
-       PCM_stream_task_id = 0;
-       if(PCM_stream_ring_buf != NULL) 
-       {
-               helios_rb_destroy(&PCM_stream_ring_buf);
-               PCM_stream_ring_buf = NULL;
+
+       if(self->handle_write) {
+               ret = Helios_PCM_Reset_Write_Buffer(self->handle_write);
        }
-               
+
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_helios_audio_PCM_stream_stop_obj, helios_audio_PCM_stream_stop);
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_audio_pcm_reset_write_buffer_obj, helios_audio_pcm_reset_write_buffer);
 
+#endif
 STATIC const mp_stream_p_t pcm_stream_p = {
     .read = audio_pcm_read,
     .write = audio_pcm_write,
@@ -3215,11 +2992,19 @@ STATIC const mp_rom_map_elem_t pcm_locals_dict[] = {
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
     { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
     { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&helios_audio_pcm___del___obj) },
-       { MP_ROM_QSTR(MP_QSTR_stream_start), MP_ROM_PTR(&mp_helios_audio_PCM_stream_start_obj)},
+       { MP_ROM_QSTR(MP_QSTR_stream_read_start), MP_ROM_PTR(&mp_helios_audio_PCM_stream_read_start_obj)},
+       { MP_ROM_QSTR(MP_QSTR_stream_write_start), MP_ROM_PTR(&mp_helios_audio_PCM_stream_write_start_obj)},
        { MP_ROM_QSTR(MP_QSTR_stream_read), MP_ROM_PTR(&mp_helios_audio_PCM_stream_read_obj)},
+       { MP_ROM_QSTR(MP_QSTR_stream_write), MP_ROM_PTR(&mp_helios_audio_PCM_stream_write_obj)},
        { MP_ROM_QSTR(MP_QSTR_stream_stop), MP_ROM_PTR(&mp_helios_audio_PCM_stream_stop_obj)},
+       { MP_ROM_QSTR(MP_QSTR_stream_is_empty), MP_ROM_PTR(&mp_helios_audio_pcm_rb_is_empty_obj)},
+       
     { MP_ROM_QSTR(MP_QSTR_setVolume), MP_ROM_PTR(&helios_set_volume_obj) },
     { MP_ROM_QSTR(MP_QSTR_getVolume), MP_ROM_PTR(&helios_get_volume_obj) },
+       #if defined(PLAT_ASR_1606)
+       { MP_ROM_QSTR(MP_QSTR_getWriteFrameCount), MP_ROM_PTR(&helios_audio_pcm_get_write_frame_count_obj) },
+       { MP_ROM_QSTR(MP_QSTR_resetWriteBuffer), MP_ROM_PTR(&helios_audio_pcm_reset_write_buffer_obj) },
+       #endif
        { MP_ROM_QSTR(MP_QSTR_MONO), MP_ROM_INT(1) },
     { MP_ROM_QSTR(MP_QSTR_STEREO), MP_ROM_INT(2) },
        { MP_ROM_QSTR(MP_QSTR_READONLY), MP_ROM_INT(PCM_FLAG_READ_ONLY) },
index c2593b6..87f4773 100644 (file)
@@ -26,6 +26,9 @@
 
 AUDIO_T audio = {0};
 
+AUDIO_PA_T audio_pa = {0};
+
+
 extern int audio_play_callback(char *ptr, size_t lens, Helios_EnumAudPlayerState state);
 extern char audio_playing_file_name[256];
 
@@ -131,7 +134,7 @@ int audio_queue_is_full(AUDIO_QUEUE_T *Q)
 
 
 #if defined (PLAT_Unisoc) || defined (PLAT_ASR)  || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
-    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
 extern int Helios_Audio_MontageFilePlayStart(char *montage_name, char *file_name, Helios_AudPlayerType type, helios_cb_on_player usr_cb, uint8_t device);
 #endif
 void helios_audio_play_queue(void)
@@ -185,7 +188,7 @@ void helios_audio_play_queue(void)
                        if (audio_type == AUDIO_TTS)
                        {
                        #if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) \
-                       || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+                       || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                                extern void Helios_Set_MP_TTS_Callback(c_callback_t* callback);
                                Helios_Set_MP_TTS_Callback(&audio.audio_queue[i].audio_data[front].mp_cb);
                                ret = Helios_TTS_Start(mode, data, strlen(data));
@@ -208,7 +211,7 @@ void helios_audio_play_queue(void)
                                HELIOS_AUDIO_QUEUE_LOG("Helios_Audio_FilePlayStart, ret = %d\r\n", ret);
                        }
                        #if defined (PLAT_Unisoc) || defined (PLAT_ASR)  || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
-                       || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+                       || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
                        else if (audio_type == AUDIO_MONTAGE)
                        {
                                ret = Helios_Audio_MontageFilePlayStart(mondata, data, HELIOS_AUDIO_PLAY_TYPE_LOCAL, audio_play_callback, device);
@@ -265,7 +268,8 @@ void helios_audio_queue_play_task(void *argv)
                                case AUDIO_FINISH_EVENT:
                                        HELIOS_AUDIO_QUEUE_LOG("----AUDIO_FINISH_EVENT---\r\n");
                                        memset(audio_playing_file_name, 0, sizeof(audio_playing_file_name));
-                                       #if !defined (PLAT_Unisoc) && !defined(PLAT_EIGEN) && !defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+                                       #if !defined (PLAT_Unisoc) && !defined(PLAT_EIGEN) && !defined(PLAT_Unisoc_8850) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8910_R06) && !defined(PLAT_Unisoc_8850_R02) \
+                                       && !defined(PLAT_EIGEN_718)
                                        #ifndef CONFIG_AUDIO
                                        Helios_Audio_StreamPlayStop();
                                        #endif
index 8c644c5..1ecb54a 100644 (file)
@@ -60,8 +60,22 @@ typedef struct
        Helios_MsgQ_t queue_msg;
        Helios_Mutex_t montage_mutex;
        uint8_t montage_is_stopping;
+       uint8_t play_start_mode;
+       uint8_t play_end_mode;
+       uint16_t interval_of_start_dec_pa;
+       uint16_t interval_of_close_dec_pa;
 }AUDIO_T;
 
+typedef struct
+{
+    uint32_t open_pa_delay;
+       uint32_t close_pa_delay;
+       uint8_t open_flag;
+       Helios_Mutex_t pa_mutex;
+       uint8_t pa_is_delay_open;
+       uint8_t pa_is_delay_close;
+}AUDIO_PA_T;
+
 typedef enum
 {
        AUDIO_TTS = 1,
@@ -84,8 +98,16 @@ typedef enum
     AUDIO_STOP_EVENT,
 }AUDIO_TTS_ENVENT_E;
 
+typedef enum 
+{
+       AUDIO_PA_CLOSE_NOW = 0,
+    AUDIO_PA_OPEN_DELAY,
+    AUDIO_PA_OPEN_NOW,
+    AUDIO_PA_CLOSE_DELAY,
+}AUDIO_PA_ENVENT_E;
 
 extern AUDIO_T audio;
+extern AUDIO_PA_T audio_pa;
 
 int audio_queue_init(AUDIO_QUEUE_T *Q);
 int audio_queue_is_empty(AUDIO_QUEUE_T *Q);
index c615a5e..1acc627 100644 (file)
@@ -69,7 +69,7 @@ static c_callback_t *callback_cur;
 
 //extern int device;
 #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
-    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #define GET_FILE_VFS_PATH(x, y) get_vfs_path(x,y)
 #else
 #define GET_FILE_VFS_PATH(x, y)                                             \
@@ -163,9 +163,12 @@ static int helios_file_record_cb(char *p_data, int len, Helios_EnumAudRecordStat
                //ret = mp_sched_schedule_ex(g_record_callback, mp_obj_new_int(res));
 #if MICROPY_ENABLE_CALLBACK_DEAL
                st_CallBack_AudioRecord *record = malloc(sizeof(st_CallBack_AudioRecord));
+               memset(record, 0x0, sizeof(st_CallBack_AudioRecord));
            if(NULL != record) {
                record->record_type = RECORE_TYPE_FILE;
-               record->p_data = malloc(strlen(p_data) + 1);
+                       if (p_data) {
+                               record->p_data = malloc(strlen(p_data) + 1);
+                       }
                if(NULL == record->p_data)
                {
                 return -1;
@@ -258,7 +261,6 @@ static int helios_stream_record_cb(char *p_data, int len, Helios_EnumAudRecordSt
        unsigned int send_len = 0;
        static int pcm_data_size = 0;
 
-       
        if(res == HELIOS_AUD_RECORD_START)
        {
                //audio_record_printf("recorder start run");
@@ -352,11 +354,27 @@ STATIC mp_obj_t helios_audio_record_stream_start(size_t n_args, const mp_obj_t *
 
        callback_cur = self->callback;
 
-       if(format != HELIOS_AUDIO_FORMAT_WAVPCM && format != HELIOS_AUDIO_FORMAT_AMRNB && format != HELIOS_AUDIO_FORMAT_AMRWB && format != HELIOS_AUDIO_FORMAT_MP3) {
+       if(format != HELIOS_AUDIO_FORMAT_AMRNB && format != HELIOS_AUDIO_FORMAT_AMRWB && format != HELIOS_AUDIO_FORMAT_MP3
+#if defined(PLAT_ASR_1606)
+               && format != HELIOS_AUDIO_FORMAT_WAVPCM
+#endif
+               ) {
                mp_raise_ValueError(MP_ERROR_TEXT("Parameter error\n"));
                return mp_obj_new_int(-1);
        }
 
+#if defined(PLAT_ASR_1606)
+       if ((format==HELIOS_AUDIO_FORMAT_AMRWB || format==HELIOS_AUDIO_FORMAT_WAVPCM) && time!=0) {
+               // elian.wang @20240718 ASR amrwb record can not be stop in ostimer.
+               mp_raise_ValueError(MP_ERROR_TEXT("Record time must be 0. You can use stream_stop to stop record.\n"));
+       }
+
+       // @20240902 SW1PQUECPYTHON-5941: samplerate only support 8000Hz(amrnb) or 16000Hz(amrwb)
+       if ((format==HELIOS_AUDIO_FORMAT_AMRNB && samplerate!=8000) || (format==HELIOS_AUDIO_FORMAT_AMRWB && samplerate!=16000)) {
+               mp_raise_ValueError(MP_ERROR_TEXT("Parameter error\n"));
+       }
+#endif
+
     //check time is valid
        if(time < 0) {
            mp_raise_ValueError(MP_ERROR_TEXT("Record time must be larger than or equal to 0.\n"));
@@ -392,44 +410,16 @@ STATIC mp_obj_t helios_audio_record_stream_start(size_t n_args, const mp_obj_t *
        record_conf.samplerate = samplerate;
 
        
-       // Helios_AUDRecordInitStruct record_info;
+       Helios_AUDRecordInitStruct record_info;
        record_conf.amrnb_param.amrnb_mode = HELIOS_AMRNB_MODE_1220;
        record_conf.amrwb_param.amrwb_mode = HELIOS_AMRWB_MODE_2385;
-       // //record_conf.len_size = 
-       // record_info.record_para = &record_conf;
-       // record_info.format = format;
+       //record_conf.len_size = 
+       record_info.record_para = &record_conf;
+       record_info.format = format;
        
-       // record_info.type = HELIOS_REC_TYPE_MIC;
-       // record_info.cb = (void *)helios_stream_record_cb;
-       // ret = Helios_Audio_StreamRecordStart(&record_info);
-
-       if(format==HELIOS_AUDIO_FORMAT_WAVPCM){
-               Helios_AUDRecordInitStruct record_info;
-               record_info.record_para = &record_conf;
-               record_info.format = HELIOS_AUDIO_FORMAT_WAVPCM;
-               record_info.type = HELIOS_REC_TYPE_MIC;
-               record_info.cb = (void *)helios_stream_record_cb;
-               ret = Helios_Audio_StreamRecordStart(&record_info);
-       }
-       else if(format==HELIOS_AUDIO_FORMAT_AMRNB||format==HELIOS_AUDIO_FORMAT_AMRWB){
-               Helios_AUDRecordInitStruct record_info;
-               record_conf.amrnb_param.amrnb_mode = HELIOS_AMRNB_MODE_1220;
-               record_conf.amrwb_param.amrwb_mode = HELIOS_AMRWB_MODE_2385;
-               //record_conf.len_size = 
-               record_info.record_para = &record_conf;
-               if(samplerate == 8000) {
-                       record_info.format = HELIOS_AUDIO_FORMAT_AMRNB;
-               } else {
-                       record_info.format = HELIOS_AUDIO_FORMAT_AMRWB;
-               }
-               record_info.type = HELIOS_REC_TYPE_MIC;
-               record_info.cb = (void *)helios_stream_record_cb;
-               ret = Helios_Audio_StreamRecordStart(&record_info);
-       }
-       else{
-               mp_raise_ValueError("The format is not supported at the moment\n");
-               return mp_obj_new_int(-1);
-       }
+       record_info.type = HELIOS_REC_TYPE_MIC;
+       record_info.cb = (void *)helios_stream_record_cb;
+       ret = Helios_Audio_StreamRecordStart(&record_info);
 
        if(ret != 0) {
                Helios_Audio_StreamRecordStop();
@@ -1049,7 +1039,7 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
 #if MICROPY_QPY_AUDIO_AUDIO
     { MP_ROM_QSTR(MP_QSTR_play),               MP_ROM_PTR(&mp_helios_record_file_play_obj)     },
 #endif
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     { MP_ROM_QSTR(MP_QSTR_PCM), MP_ROM_INT(HELIOS_AUDIO_FORMAT_PCM) },
     { MP_ROM_QSTR(MP_QSTR_WAV), MP_ROM_INT(HELIOS_AUDIO_FORMAT_WAVPCM) },
     { MP_ROM_QSTR(MP_QSTR_AMRNB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRNB) },
@@ -1057,7 +1047,6 @@ STATIC const mp_rom_map_elem_t audio_locals_dict_table[] = {
 #endif
 #if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
        { MP_ROM_QSTR(MP_QSTR_gain_set),                MP_ROM_PTR(&mp_helios_audio_record_gain_set_obj)        },
-       { MP_ROM_QSTR(MP_QSTR_gain),            MP_ROM_PTR(&mp_helios_audio_record_gain_set_obj)        },
        { MP_ROM_QSTR(MP_QSTR_gain_get),                MP_ROM_PTR(&mp_helios_audio_record_gain_get_obj)        },
        { MP_ROM_QSTR(MP_QSTR_WAV), MP_ROM_INT(HELIOS_AUDIO_FORMAT_WAVPCM) },
     { MP_ROM_QSTR(MP_QSTR_AMRNB), MP_ROM_INT(HELIOS_AUDIO_FORMAT_AMRNB) },
index 0cbcfe9..a9b7416 100644 (file)
@@ -24,6 +24,7 @@
 #include "audio_queue.h"
 #include "helios_audio.h"
 #include "helios_debug.h"
+#include "audio_handle.h"
 
 #define MAX_TTS_TEXT_LEN (500)
 
@@ -402,14 +403,9 @@ STATIC mp_obj_t audio_tts_play(size_t n_args, const mp_obj_t *args, mp_map_t *kw
                                        {
                                                Helios_Mutex_Lock(audio.montage_mutex, HELIOS_WAIT_FOREVER);
                                                HELIOS_TTS_LOG("---- stop audio montage play. ----\r\n");
-                                               extern int helios_set_montage_break_flag(char set);
                            helios_set_montage_break_flag(1);
                                                audio.montage_is_stopping = 1;
-#if CONFIG_AUDIO
-                                               extern void helios_audio_montage_stop();
-                                               helios_audio_montage_stop();
-#endif
-                                               #if !defined(PLAT_EIGEN)
+                                               #if !defined(PLAT_EIGEN) && !defined(PLAT_EIGEN_718)
                                                extern int audio_err_handle(void);
                            audio_err_handle();
                                                #endif
index 0f96a8b..122a9ac 100644 (file)
@@ -35,7 +35,7 @@
 #define QPY_CALLBACKDEAL_LOG_ENABLE
 
 #ifdef QPY_CALLBACKDEAL_LOG_ENABLE
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1602)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
 extern void ql_log_mask_set(unsigned long long module_mask, unsigned int port_mask);
 extern void _ql_app_log(const char* fmt, ...);
 static char usb_trace_init_flag = 0;
@@ -48,7 +48,7 @@ static char usb_trace_init_flag = 0;
                                                 _ql_app_log("[%s][%s, L%d]"fmt"", "cbdl", __FUNCTION__, __LINE__, ##__VA_ARGS__);   \
                                            }while(0)
 
-#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include "helios_debug.h"
 #define qpy_callbackdeal_trace(fmt, ...) Helios_Debug_Output("[%s][%s, L%d]"fmt"", "cbdl", __FUNCTION__, __LINE__, ##__VA_ARGS__)
 #else
@@ -61,7 +61,7 @@ static char usb_trace_init_flag = 0;
 
 
 #define QPY_CALLBACK_DEAL_MSG_MAX_NUM (2 * MICROPY_SCHEDULER_DEPTH)
-#if defined(PLAT_ECR6600)
+#if defined(PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define QPY_CALLBACK_DEAL_THREAD_STACK_SIZE (4 *1024)
 #else
 #define QPY_CALLBACK_DEAL_THREAD_STACK_SIZE (16 *1024)
@@ -85,6 +85,14 @@ extern void qpy_ble_msg_proc(void *msg);
 #if MICROPY_QPY_MODULE_POC
 extern void qpy_poc_msg_proc ( void *msg );
 #endif //end MICROPY_QPY_MODULE_POC
+
+#if MICROPY_QPY_MODULE_LWM2M
+extern void qpy_lwm2m_msg_proc(void *param);
+#endif //end MICROPY_QPY_MODULE_LWM2M
+
+#if MICROPY_QPY_MODULE_ESIM && MICROPY_QPY_MODULE_ESIM_IPA
+extern void qpy_esim_msg_proc(void *param);
+#endif
 /*
  * Create a task&queue that handles callback tasks exclusively
  */
@@ -155,7 +163,7 @@ st_CallBack_LoadBoundMeth * qpy_callback_para_node_add(c_callback_t *callback, m
     {
         return NULL;
     }
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     int rc = Helios_Critical_Enter();
 #endif
     loadboundmet_msg->next = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
@@ -163,7 +171,7 @@ st_CallBack_LoadBoundMeth * qpy_callback_para_node_add(c_callback_t *callback, m
     loadboundmet_msg->arg = arg;
     MP_STATE_PORT(loadmeth_para) = (void *)loadboundmet_msg;
     qpy_callbackdeal_trace("loadmeth_para:0x%x", MP_STATE_PORT(loadmeth_para));
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     Helios_Critical_Exit(rc);
 #endif
 
@@ -173,7 +181,7 @@ st_CallBack_LoadBoundMeth * qpy_callback_para_node_add(c_callback_t *callback, m
 
 void qpy_callback_para_node_delete(st_CallBack_LoadBoundMeth *cb_msg)
 {
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     int rc = Helios_Critical_Enter();
 #endif
     qpy_callbackdeal_trace("loadmeth_para:0x%x", MP_STATE_PORT(loadmeth_para));
@@ -197,7 +205,7 @@ void qpy_callback_para_node_delete(st_CallBack_LoadBoundMeth *cb_msg)
         }
         loadmeth_para_tmp = loadmeth_para_head;
     }
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     Helios_Critical_Exit(rc);
 #endif
 
@@ -206,7 +214,7 @@ void qpy_callback_para_node_delete(st_CallBack_LoadBoundMeth *cb_msg)
 void qpy_callback_para_link_mark_in_used(void)
 {
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
    int rc = Helios_Critical_Enter();
 #endif
    st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
@@ -217,7 +225,7 @@ void qpy_callback_para_link_mark_in_used(void)
            gc_collect_root((void **)&loadmeth_para_head->arg, 1);
        }
    }
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
    Helios_Critical_Exit(rc);
 #endif
 
@@ -226,7 +234,7 @@ void qpy_callback_para_link_mark_in_used(void)
 
 void qpy_callback_para_link_free_all(void)
 {
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     int rc = Helios_Critical_Enter();
 #endif
     st_CallBack_LoadBoundMeth *loadmeth_para_head = (st_CallBack_LoadBoundMeth *)MP_STATE_PORT(loadmeth_para);
@@ -238,7 +246,7 @@ void qpy_callback_para_link_free_all(void)
         free(loadmeth_para_tmp);
     }
     MP_STATE_PORT(loadmeth_para) = NULL;
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
     Helios_Critical_Exit(rc);
 #endif
 
@@ -260,7 +268,11 @@ void qpy_callback_deal_thread(void * args_in)
     st_CallBack_Deal msg = {0};
 
     mp_stack_set_top(&ts + 1); // need to include ts in root-pointer scan
+#if defined(PLAT_ECR6600) || defined (PLAT_aic8800m40)
+    mp_stack_set_limit(QPY_CALLBACK_DEAL_THREAD_STACK_SIZE * sizeof(uint32_t) - 1024);
+#else
     mp_stack_set_limit(QPY_CALLBACK_DEAL_THREAD_STACK_SIZE - 1024);
+#endif
 
     #if MICROPY_ENABLE_PYSTACK
     // TODO threading and pystack is not fully supported, for now just make a small stack
@@ -324,7 +336,7 @@ void qpy_callback_deal_thread(void * args_in)
                        }
                        arg = mp_obj_new_list(3, audio_cb);
                     mp_sched_schedule_ex(&cb_msg->callback,  arg);
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
                                        if (RECORE_TYPE_STREAM == cb_msg->record_type)
                                        {
                                                MP_THREAD_GIL_EXIT();
@@ -437,6 +449,25 @@ void qpy_callback_deal_thread(void * args_in)
                                }
                 break;
                                #endif
+                #if MICROPY_QPY_MODULE_JRTC || CONFIG_juphoon
+                case CALLBACK_TYPE_ID_JRTC:
+                {
+                    st_CallBack_jrtc *cb_msg = (st_CallBack_jrtc *)msg.msg;
+                    arg = mp_obj_new_int(cb_msg->result);
+                           mp_sched_schedule_ex(&cb_msg->callback,  arg);
+
+                }
+                break;
+                               #endif
+                #if MICROPY_QPY_MODULE_GPIO_ENCODER
+                               case CALLBACK_TYPE_ID_ENCODER:
+                               {
+                                       st_CallBack_Encoder *cb_msg = (st_CallBack_Encoder *)msg.msg;
+                               arg = mp_obj_new_int(cb_msg->spin_direct);
+                           mp_sched_schedule_ex(&cb_msg->callback,  arg);
+                               }
+                break;
+                               #endif
                 #if MICROPY_QPY_MODULE_EXTGPIO_AW9523
                                case CALLBACK_TYPE_ID_AW9523:
                                {
@@ -463,25 +494,7 @@ void qpy_callback_deal_thread(void * args_in)
                     mp_sched_schedule_ex(&cb_msg->callback,  mp_obj_new_int(cb_msg->state));
                                }
                 break;
-            #if CONFIG_juphoon
-                case CALLBACK_TYPE_ID_JRTC:
-                {
-                    st_CallBack_jrtc *cb_msg = (st_CallBack_Encoder *)msg.msg;
-                    arg = mp_obj_new_int(cb_msg->result);
-                           mp_sched_schedule_ex(&cb_msg->callback,  arg);
 
-                }
-                break;    
-            #endif
-            #if MICROPY_QPY_MODULE_GPIO_ENCODER
-                               case CALLBACK_TYPE_ID_ENCODER:
-                               {
-                                       st_CallBack_Encoder *cb_msg = (st_CallBack_Encoder *)msg.msg;
-                               arg = mp_obj_new_int(cb_msg->spin_direct);
-                           mp_sched_schedule_ex(&cb_msg->callback,  arg);
-                               }
-                break;
-                       #endif
                        #if MICROPY_QPY_MODULE_BT
                                case CALLBACK_TYPE_ID_BT:
                                {
@@ -541,7 +554,8 @@ void qpy_callback_deal_thread(void * args_in)
                                                mp_obj_new_int(uart_msg->port),
                                                mp_obj_new_int(uart_msg->size),
                     };
-                    mp_sched_schedule_ex(&uart_msg->callback, mp_obj_new_tuple(3, uart_cb));
+                                       arg = mp_obj_new_list(3,uart_cb);
+                    mp_sched_schedule_ex(&uart_msg->callback, arg);
                     break;
                }
             #endif
@@ -551,23 +565,147 @@ void qpy_callback_deal_thread(void * args_in)
                     st_CallBack_Datacall *datacall_msg = (st_CallBack_Datacall *)msg.msg;
                     mp_obj_t datacall_cb[3] = 
                     {
-                                               mp_obj_new_int(datacall_msg->profile_idx),
-                                               mp_obj_new_int(datacall_msg->nw_status),
-                                               mp_obj_new_int(datacall_msg->sim_id),
+                        mp_obj_new_int(datacall_msg->profile_idx),
+                        mp_obj_new_int(datacall_msg->nw_status),
+                        mp_obj_new_int(datacall_msg->sim_id),
                     };
                     mp_sched_schedule_ex(&datacall_msg->callback, mp_obj_new_tuple(3, datacall_cb));
                     break;
                }
             #endif
+            #if MICROPY_QPY_MODULE_ALIPAY_COLLECTION
+               case CALLBACK_TYPE_ID_ALIPAY_COLLECTION:
+               {
+                    st_CallBack_ALIPAY_COLLECTION *alipay_collection_msg = (st_CallBack_ALIPAY_COLLECTION *)msg.msg;
+                    mp_obj_t alipay_collection_cb[2] = 
+                    {
+                                               mp_obj_new_int(alipay_collection_msg->msgID),
+                                               mp_obj_new_int(alipay_collection_msg->data),
+                    };
+                    mp_sched_schedule_ex(&alipay_collection_msg->callback, mp_obj_new_tuple(2, alipay_collection_cb));
+                    break;
+               }
+            #endif
+                       #if MICROPY_QPY_MODULE_SMS
+                               case CALLBACK_TYPE_ID_SMS:
+                               {
+                                       st_CallBack_SMS *sms_msg = (st_CallBack_SMS *)msg.msg;
+                    mp_obj_t sms_cb[3] = 
+                    {
+                        mp_obj_new_int(sms_msg->sim_id),
+                                       mp_obj_new_int(sms_msg->index),
+                                       mp_obj_new_str(sms_msg->storage, strlen(sms_msg->storage))
+                    };
+                    mp_sched_schedule_ex(&sms_msg->callback, mp_obj_new_tuple(3, sms_cb));
+                                       break;
+                               }
+                       #endif
+            #if MICROPY_QPY_MODULE_SIF
+                               case CALLBACK_TYPE_ID_SIF:
+                               {
+                                       st_CallBack_SIF *sif_msg = (st_CallBack_SIF *)msg.msg;
+                    mp_sched_schedule_ex(&sif_msg->callback, mp_obj_new_bytes(sif_msg->data, sif_msg->data_len));
+                                       break;
+                               }
+                       #endif
+               #if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)//forrest.liu@20231228 add for FAE-102027 dump issue
+                       #if MICROPY_QPY_MACHINE_TIMER
+               case CALLBACK_TYPE_ID_TIMER:
+               {
+                    st_CallBack_Timer *timer_msg = (st_CallBack_Timer *)msg.msg;
+
+                    mp_sched_schedule_ex(&timer_msg->callback,  mp_const_none);
+                    break;
+               }
+            #endif
+               #endif
+               #if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+         || defined(BOARD_EC600MLA_LA_POC_XBND)
+                          case CALLBACK_TYPE_ID_POCSPEAK:
+               {
+                    st_CallBack_PocSpeak *pocspeak_msg = (st_CallBack_PocSpeak *)msg.msg;
+                    mp_obj_t pocspeak_list[2] = 
+                    {
+                                       mp_obj_new_int(pocspeak_msg->speak_op),
+                                       mp_obj_new_int(pocspeak_msg->speak_result),
+                               };
+                    arg = mp_obj_new_list(2, pocspeak_list);
+                    mp_sched_schedule_ex(&pocspeak_msg->callback,  arg);
+                    break;
+               }
+               #endif
+#if MICROPY_QPY_MODULE_NFC
+                               case CALLBACK_TYPE_ID_NFC:
+                               {
+                                       st_CallBack_nfc *nfc_msg = (st_CallBack_nfc *)msg.msg;
+                                       
+                                       mp_obj_t nfc_list[2] = {0};
+                                       nfc_list[0] = mp_obj_new_int(nfc_msg->oid);
+
+                                       if(nfc_msg->data && nfc_msg->data_len != 0)
+                                       {
+                                               nfc_list[1] = mp_obj_new_bytes(nfc_msg->data, nfc_msg->data_len);
+                                               arg = mp_obj_new_list(2, nfc_list);
+                                       } else {
+                                               arg = mp_obj_new_list(1, nfc_list);
+                                       }
+                                       mp_sched_schedule_ex(&nfc_msg->callback, arg);
+
+                                       if(nfc_msg->data) {
+                                               free(nfc_msg->data);
+                                               nfc_msg->data = NULL;
+                                       }
+                                       
+                                       break;
+                               }
+#endif
+#if MICROPY_QPY_SENSOR_VC9202
+
+                               case CALLBACK_TYPE_ID_VC9202:
+                               {
+                                       st_CallBack_Sensor_VC9202 *cb_msg = (st_CallBack_Sensor_VC9202 *)msg.msg;
+                                       mp_obj_t vc9202_list[3] = {
+                                               mp_obj_new_int(cb_msg->work_mode),
+                                               mp_obj_new_int(cb_msg->value),
+                                               mp_obj_new_int(cb_msg->measure_mode),
+                                       };
+                                       arg = mp_obj_new_list(3, vc9202_list);
+                                       mp_sched_schedule_ex(&cb_msg->callback,  arg);
+                               }
+                                       break;
+#endif
+#if MICROPY_QPY_MODULE_LWM2M
+                case CALLBACK_TYPE_ID_LWM2M:{
+                    qpy_lwm2m_msg_proc(msg.msg);
+                    break;
+                }
+#endif
+#if MICROPY_QPY_MODULE_ESIM && MICROPY_QPY_MODULE_ESIM_IPA
+                case CALLBACK_TYPE_ID_ESIM_IPA:{
+                    qpy_esim_msg_proc(msg.msg);
+                    break;
+                }
+#endif
                 case CALLBACK_TYPE_ID_NONE:
                 default:
                 break;
             }
-            
+                       
+        #if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)//forrest.liu@20231228 modify for FAE-102027 dump issue
+                       if(msg.callback_type_id != CALLBACK_TYPE_ID_TIMER)
+                       {
+                               if(msg.msg) {
+                           free(msg.msg);
+                       }
+                       }
+                       memset(&msg, 0, sizeof(st_CallBack_Deal));
+               #else
             if(msg.msg) {
                    free(msg.msg);
                }
             memset(&msg, 0, sizeof(st_CallBack_Deal));
+               #endif
+
 
             //@20220826 将callback deal 队列中的所有回调函数执行完
             while(!mp_sched_empty()) {
@@ -578,10 +716,20 @@ void qpy_callback_deal_thread(void * args_in)
                }
                else
                {
-                   if(msg.msg) {
-                   free(msg.msg);
-               }
-            memset(&msg, 0, sizeof(st_CallBack_Deal));
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)//forrest.liu@20231228 modify for FAE-102027 dump issue
+                       if(msg.callback_type_id != CALLBACK_TYPE_ID_TIMER)
+                       {
+                               if(msg.msg) {
+                                       free(msg.msg);
+                               }
+                       }
+                       memset(&msg, 0, sizeof(st_CallBack_Deal));
+#else
+                       if(msg.msg) {
+                               free(msg.msg);
+                       }
+                       memset(&msg, 0, sizeof(st_CallBack_Deal));
+#endif
             mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val));
                }
     }
index 2ac40b9..54250ee 100644 (file)
@@ -70,17 +70,16 @@ enum {
 #if MICROPY_QPY_MODULE_EXTUART_WK2114
        CALLBACK_TYPE_ID_WK2114,
 #endif
+#if MICROPY_QPY_MODULE_GPIO_ENCODER
+       CALLBACK_TYPE_ID_ENCODER,
+#endif
 #if MICROPY_QPY_MODULE_EXTGPIO_AW9523
        CALLBACK_TYPE_ID_AW9523,
 #endif
     CALLBACK_TYPE_ID_TP,
     CALLBACK_TYPE_ID_Gsensor,
-#if CONFIG_juphoon
-       CALLBACK_TYPE_ID_JRTC,
-#endif
-#if MICROPY_QPY_MODULE_GPIO_ENCODER
-    CALLBACK_TYPE_ID_ENCODER,
-#endif
+
+
 #if MICROPY_QPY_MODULE_BT
        CALLBACK_TYPE_ID_BT,
 #endif
@@ -99,12 +98,45 @@ enum {
 #if MICROPY_QPY_MODULE_DATACALL
     CALLBACK_TYPE_ID_DATACALL,
 #endif
+#if MICROPY_QPY_MODULE_ALIPAY_COLLECTION
+    CALLBACK_TYPE_ID_ALIPAY_COLLECTION,
+#endif
+#if MICROPY_QPY_MODULE_SMS
+    CALLBACK_TYPE_ID_SMS,
+#endif
+#if MICROPY_QPY_MODULE_JRTC || CONFIG_juphoon
+       CALLBACK_TYPE_ID_JRTC,
+#endif
+#if MICROPY_QPY_MODULE_SIF
+    CALLBACK_TYPE_ID_SIF,
+#endif
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)
+#if MICROPY_QPY_MACHINE_TIMER
+    CALLBACK_TYPE_ID_TIMER,
+#endif
+#endif
+#if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND)\
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
+       CALLBACK_TYPE_ID_POCSPEAK,
+#endif
+#if MICROPY_QPY_MODULE_NFC
+    CALLBACK_TYPE_ID_NFC,
+#endif
+#if MICROPY_QPY_SENSOR_VC9202
+       CALLBACK_TYPE_ID_VC9202,
+#endif
+#if MICROPY_QPY_MODULE_LWM2M
+    CALLBACK_TYPE_ID_LWM2M,
+#endif
+#if MICROPY_QPY_MODULE_ESIM && MICROPY_QPY_MODULE_ESIM_IPA
+    CALLBACK_TYPE_ID_ESIM_IPA,
+#endif
 };
 #if CONFIG_juphoon
-typedef struct{
-    uint32_t result;
-    c_callback_t callback;
-}st_CallBack_jrtc;
+// typedef struct{
+//     uint32_t result;
+//     c_callback_t callback;
+// }st_CallBack_jrtc;
 #endif
 typedef struct CallBack_LoadBoundMeth{
     c_callback_t *callback;
@@ -207,6 +239,11 @@ typedef struct{
        mp_obj_t *args;
 }st_CallBack_lvgl;
 
+typedef struct{
+    uint32_t result;
+    c_callback_t callback;
+}st_CallBack_jrtc;
+
 typedef struct{
     uint8_t event_id;
     uint8_t row;
@@ -214,6 +251,30 @@ typedef struct{
     c_callback_t callback;
 }st_CallBack_Keypad;
 
+#if MICROPY_QPY_SENSOR_VC9202
+typedef struct{
+    uint32_t work_mode;
+    uint16_t value;
+    uint32_t measure_mode;
+    c_callback_t callback;
+}st_CallBack_Sensor_VC9202;
+#endif
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)
+#if MICROPY_QPY_MACHINE_TIMER
+typedef struct{
+    c_callback_t callback;
+}st_CallBack_Timer;
+#endif
+#endif
+
+#if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND)\
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
+typedef struct{
+    uint8_t speak_op;
+    int speak_result;
+    c_callback_t callback;
+}st_CallBack_PocSpeak;
+#endif
 #if MICROPY_QPY_MACHINE_UART
 typedef struct{
     uint64_t ind_type;
@@ -223,6 +284,15 @@ typedef struct{
 }st_CallBack_Uart;
 #endif
 
+#if MICROPY_QPY_MODULE_NFC
+typedef struct{
+    uint16_t oid;
+       void* data;
+       uint8_t data_len;
+    c_callback_t callback;
+}st_CallBack_nfc;
+#endif
+
 #if MICROPY_QPY_MODULE_DATACALL
 typedef struct{
        int32_t profile_idx;
@@ -232,6 +302,15 @@ typedef struct{
 }st_CallBack_Datacall;
 #endif
 
+#if MICROPY_QPY_MODULE_SMS
+typedef struct{
+       uint8_t sim_id;
+       uint8_t index;
+       char storage[5];
+    c_callback_t callback;
+}st_CallBack_SMS;
+#endif
+
 #if MICROPY_QPY_MODULE_BT || MICROPY_QPY_MODULE_BLE
 typedef struct{
     //void *msg;
@@ -251,12 +330,29 @@ typedef struct{
 }st_CallBack_ALIPAY;
 #endif
 
+#if MICROPY_QPY_MODULE_ALIPAY_COLLECTION
+typedef struct{
+    int msgID;
+    int data;
+    c_callback_t callback;
+}st_CallBack_ALIPAY_COLLECTION;
+#endif
+
 #if MICROPY_QPY_LPM_WAKEUP
 typedef struct{
     uint8_t level;
     c_callback_t callback;
 } st_CallBack_Wakeup;
 #endif
+
+#if MICROPY_QPY_MODULE_SIF
+typedef struct{
+    int data_len;
+    uint8_t *data;
+    c_callback_t callback;
+} st_CallBack_SIF;
+#endif
+
 void qpy_callback_deal_init(void);
 void qpy_callback_deal_deinit(void);
 int qpy_send_msg_to_callback_deal_thread(uint8_t id, void *msg);
index 9cd0bdd..76a12af 100644 (file)
@@ -1,19 +1,19 @@
 /*
  * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
- *  
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- *  
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- *  
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
- 
+
 #include "py/runtime.h"
 #if MICROPY_ENABLE_DEVICE_REPORT
 
 #include "helios_debug.h"
 #include "helios_os.h"
 #include "helios_dev.h"
-#include "helios_nw.h"
-#include "helios_sim.h"
 #if !defined (PLAT_Qualcomm) 
 #include "sockets.h"
 #include "netif.h"
 #include "netdb.h"
 #include "inet.h"
 #endif
+
+#if defined (PLAT_ECR6600)
+#include "helios_wlan.h"
+#else
+#include "helios_nw.h"
+#include "helios_sim.h"
 #include "helios_datacall.h"
+#endif
 
 #if defined(PLAT_RDA)
 #include "helios_power.h"
 #include <string.h>
 
 #define DEVREPORT_RECORD_FILE      "quecreport"
+#if defined (PLAT_ECR6600)
+#define DEVREPORT_STACK_SIZE 1
+#else
 #define DEVREPORT_STACK_SIZE 3
+#endif
 #define app_debug(fmt, ...) custom_log(DEVREPORT, fmt, ##__VA_ARGS__)
 
 
 #define DEVICE_REPORT_TRY_CNT  1       // 上报重试次数
 #define DEVICE_MSG_HEAD    0x8001      // 上报数据定义头 
 
-// 失败次数计数
+ // 失败次数计数
 static int g_failure_cnt = 0;
 // 轮询等待时间,单位秒
 static int g_loop_sleep_sec = 5;
 
 
 typedef enum {
+#if defined (PLAT_ECR6600)
+       SSS_DEVICE_MAC = 0,
+#else
        SSS_DEVICE_IMSI = 0,         //  读取imsi状态
        SSS_DEVICE_IMEI,             //  读取imei状态
+#endif
        SSS_DEVICE_NETWORK_CHECK,    //  检查网络状态
        SSS_DEVICE_REPORT,           //  设备信息上报 
        SSS_DEVICE_STATION_END       //  状态结束
 } REPORT_STATUS;
 
 struct device_config {
+#if defined (PLAT_ECR6600)
+       uint8_t mac[6];
+#else
        char imei[32];
        char imsi[32];
        int profile_idx;
+#endif
        REPORT_STATUS status;
 };
 struct device_config devConfig;
@@ -89,10 +106,10 @@ typedef struct {
        uint32_t len;
 } dr_sha256_context;
 
-extern int Helios_NV_File_Exist(const char *file_name);
-extern int Helios_NV_File_Write(const char   *file_name,      void *write_buf,int write_size);
-extern int Helios_NV_File_Read(const char   *file_name,      void *read_buf,int read_size);
-extern int Helios_NV_File_Delete(const char   *file_name);
+extern int Helios_NV_File_Exist(const char* file_name);
+extern int Helios_NV_File_Write(const char* file_name, void* write_buf, int write_size);
+extern int Helios_NV_File_Read(const char* file_name, void* read_buf, int read_size);
+extern int Helios_NV_File_Delete(const char* file_name);
 
 #define FN_ inline static
 
@@ -120,76 +137,64 @@ static uint32_t W[64];
 #endif
 
 /* -------------------------------------------------------------------------- */
-FN_ uint8_t _shb(uint32_t x, uint32_t n)
-{
-       return ( (x >> (n & 31)) & 0xff );
+FN_ uint8_t _shb(uint32_t x, uint32_t n) {
+       return ((x >> (n & 31)) & 0xff);
 } /* _shb */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _shw(uint32_t x, uint32_t n)
-{
-       return ( (x << (n & 31)) & 0xffffffff );
+FN_ uint32_t _shw(uint32_t x, uint32_t n) {
+       return ((x << (n & 31)) & 0xffffffff);
 } /* _shw */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _r(uint32_t x, uint8_t n)
-{
-       return ( (x >> n) | _shw(x, 32 - n) );
+FN_ uint32_t _r(uint32_t x, uint8_t n) {
+       return ((x >> n) | _shw(x, 32 - n));
 } /* _r */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _Ch(uint32_t x, uint32_t y, uint32_t z)
-{
-       return ( (x & y) ^ ((~x) & z) );
+FN_ uint32_t _Ch(uint32_t x, uint32_t y, uint32_t z) {
+       return ((x & y) ^ ((~x) & z));
 } /* _Ch */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _Ma(uint32_t x, uint32_t y, uint32_t z)
-{
-       return ( (x & y) ^ (x & z) ^ (y & z) );
+FN_ uint32_t _Ma(uint32_t x, uint32_t y, uint32_t z) {
+       return ((x & y) ^ (x & z) ^ (y & z));
 } /* _Ma */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _S0(uint32_t x)
-{
-       return ( _r(x, 2) ^ _r(x, 13) ^ _r(x, 22) );
+FN_ uint32_t _S0(uint32_t x) {
+       return (_r(x, 2) ^ _r(x, 13) ^ _r(x, 22));
 } /* _S0 */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _S1(uint32_t x)
-{
-       return ( _r(x, 6) ^ _r(x, 11) ^ _r(x, 25) );
+FN_ uint32_t _S1(uint32_t x) {
+       return (_r(x, 6) ^ _r(x, 11) ^ _r(x, 25));
 } /* _S1 */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _G0(uint32_t x)
-{
-       return ( _r(x, 7) ^ _r(x, 18) ^ (x >> 3) );
+FN_ uint32_t _G0(uint32_t x) {
+       return (_r(x, 7) ^ _r(x, 18) ^ (x >> 3));
 } /* _G0 */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _G1(uint32_t x)
-{
-       return ( _r(x, 17) ^ _r(x, 19) ^ (x >> 10) );
+FN_ uint32_t _G1(uint32_t x) {
+       return (_r(x, 17) ^ _r(x, 19) ^ (x >> 10));
 } /* _G1 */
 
 /* -------------------------------------------------------------------------- */
-FN_ uint32_t _word(uint8_t *c)
-{
-       return ( _shw(c[0], 24) | _shw(c[1], 16) | _shw(c[2], 8) | (c[3]) );
+FN_ uint32_t _word(uint8_t* c) {
+       return (_shw(c[0], 24) | _shw(c[1], 16) | _shw(c[2], 8) | (c[3]));
 } /* _word */
 
 /* -------------------------------------------------------------------------- */
-FN_ void  _addbits(dr_sha256_context *ctx, uint32_t n)
-{
-       if ( ctx->bits[0] > (0xffffffff - n) )
+FN_ void  _addbits(dr_sha256_context* ctx, uint32_t n) {
+       if (ctx->bits[0] > (0xffffffff - n))
                ctx->bits[1] = (ctx->bits[1] + 1) & 0xFFFFFFFF;
        ctx->bits[0] = (ctx->bits[0] + n) & 0xFFFFFFFF;
 } /* _addbits */
 
 /* -------------------------------------------------------------------------- */
-static void _hash(dr_sha256_context *ctx)
-{
+static void _hash(dr_sha256_context* ctx) {
        register uint32_t a, b, c, d, e, f, g, h, i;
        uint32_t t[2];
 #ifndef MINIMIZE_STACK_IMPACT
@@ -206,7 +211,7 @@ static void _hash(dr_sha256_context *ctx)
        h = ctx->hash[7];
 
        for (i = 0; i < 64; i++) {
-               if ( i < 16 )
+               if (i < 16)
                        W[i] = _word(&ctx->buf[_shw(i, 2)]);
                else
                        W[i] = _G1(W[i - 2]) + W[i - 7] + _G0(W[i - 15]) + W[i - 16];
@@ -234,11 +239,10 @@ static void _hash(dr_sha256_context *ctx)
 } /* _hash */
 
 /* -------------------------------------------------------------------------- */
-static void dr_sha256_init(dr_sha256_context *ctx)
-{
-       if ( ctx != NULL ) {
-               ctx->bits[0]  = ctx->bits[1] = 0;
-               ctx->len      = 0;
+static void dr_sha256_init(dr_sha256_context* ctx) {
+       if (ctx != NULL) {
+               ctx->bits[0] = ctx->bits[1] = 0;
+               ctx->len = 0;
                ctx->hash[0] = 0x6a09e667;
                ctx->hash[1] = 0xbb67ae85;
                ctx->hash[2] = 0x3c6ef372;
@@ -251,16 +255,15 @@ static void dr_sha256_init(dr_sha256_context *ctx)
 } /* sha256_init */
 
 /* -------------------------------------------------------------------------- */
-static void dr_sha256_hash(dr_sha256_context *ctx, const void *data, size_t len)
-{
+static void dr_sha256_hash(dr_sha256_context* ctx, const void* data, size_t len) {
        register size_t i;
-       const uint8_t *bytes = (const uint8_t *)data;
+       const uint8_t* bytes = (const uint8_t*)data;
 
-       if ( (ctx != NULL) && (bytes != NULL) )
+       if ((ctx != NULL) && (bytes != NULL))
                for (i = 0; i < len; i++) {
                        ctx->buf[ctx->len] = bytes[i];
                        ctx->len++;
-                       if (ctx->len == sizeof(ctx->buf) ) {
+                       if (ctx->len == sizeof(ctx->buf)) {
                                _hash(ctx);
                                _addbits(ctx, sizeof(ctx->buf) * 8);
                                ctx->len = 0;
@@ -269,38 +272,37 @@ static void dr_sha256_hash(dr_sha256_context *ctx, const void *data, size_t len)
 } /* sha256_hash */
 
 /* -------------------------------------------------------------------------- */
-static void dr_sha256_done(dr_sha256_context *ctx, uint8_t *hash)
-{
+static void dr_sha256_done(dr_sha256_context* ctx, uint8_t* hash) {
        register uint32_t i, j;
 
-       if ( ctx != NULL ) {
+       if (ctx != NULL) {
                j = ctx->len % sizeof(ctx->buf);
                ctx->buf[j] = 0x80;
                for (i = j + 1; i < sizeof(ctx->buf); i++)
                        ctx->buf[i] = 0x00;
 
-               if ( ctx->len > 55 ) {
+               if (ctx->len > 55) {
                        _hash(ctx);
                        for (j = 0; j < sizeof(ctx->buf); j++)
                                ctx->buf[j] = 0x00;
                }
 
                _addbits(ctx, ctx->len * 8);
-               ctx->buf[63] = _shb(ctx->bits[0],  0);
-               ctx->buf[62] = _shb(ctx->bits[0],  8);
+               ctx->buf[63] = _shb(ctx->bits[0], 0);
+               ctx->buf[62] = _shb(ctx->bits[0], 8);
                ctx->buf[61] = _shb(ctx->bits[0], 16);
                ctx->buf[60] = _shb(ctx->bits[0], 24);
-               ctx->buf[59] = _shb(ctx->bits[1],  0);
-               ctx->buf[58] = _shb(ctx->bits[1],  8);
+               ctx->buf[59] = _shb(ctx->bits[1], 0);
+               ctx->buf[58] = _shb(ctx->bits[1], 8);
                ctx->buf[57] = _shb(ctx->bits[1], 16);
                ctx->buf[56] = _shb(ctx->bits[1], 24);
                _hash(ctx);
 
-               if ( hash != NULL )
+               if (hash != NULL)
                        for (i = 0, j = 24; i < 4; i++, j -= 8) {
-                               hash[i     ] = _shb(ctx->hash[0], j);
-                               hash[i +  4] = _shb(ctx->hash[1], j);
-                               hash[i +  8] = _shb(ctx->hash[2], j);
+                               hash[i] = _shb(ctx->hash[0], j);
+                               hash[i + 4] = _shb(ctx->hash[1], j);
+                               hash[i + 8] = _shb(ctx->hash[2], j);
                                hash[i + 12] = _shb(ctx->hash[3], j);
                                hash[i + 16] = _shb(ctx->hash[4], j);
                                hash[i + 20] = _shb(ctx->hash[5], j);
@@ -310,8 +312,7 @@ static void dr_sha256_done(dr_sha256_context *ctx, uint8_t *hash)
        }
 } /* sha256_done */
 // sha256算法实现
-static void dr_sha256(const void *data, size_t len, uint8_t *hash)
-{
+static void dr_sha256(const void* data, size_t len, uint8_t* hash) {
        dr_sha256_context ctx;
 
        dr_sha256_init(&ctx);
@@ -320,109 +321,127 @@ static void dr_sha256(const void *data, size_t len, uint8_t *hash)
 } /* sha256 */
 #endif
 // 建立udp连接,上报数据
-static int dr_udp_client_send(int cid, const char *host, unsigned char *sendData, int sendLength)
-{
-    int ret = 0;
-       struct netif *netif_cfg = NULL;
+static int dr_udp_client_send(int cid, const char* host, unsigned char* sendData, int sendLength) {
+       int ret = 0;
+       struct netif* netif_cfg = NULL;
        struct sockaddr_in server_addr;
-       struct sockaddr_in * sin_pres;
-       struct addrinfo *dev_pres = NULL;
+       struct sockaddr_in* sin_pres;
+       struct addrinfo* dev_pres = NULL;
        int sockfd;
-       char recvUdpData[128];
-       
+       char recvUdpData[128] = { 0 };
+
        socklen_t len;
        // 域名解析
-#if defined (PLAT_Unisoc_8850)
+#if defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
        ret = getaddrinfo_with_pcid(host, NULL, NULL, &dev_pres, cid);
 #else
        struct addrinfo hints;
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = AF_INET;
-    hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
-    hints.ai_protocol = 0;          /* Any protocol */
-    hints.ai_canonname = NULL;
-    hints.ai_addr = NULL;
-    hints.ai_next = NULL;
+       hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
+       hints.ai_protocol = 0;          /* Any protocol */
+       hints.ai_canonname = NULL;
+       hints.ai_addr = NULL;
+       hints.ai_next = NULL;
+#if defined (PLAT_ECR6600)
+       ret = getaddrinfo(host, NULL, &hints, &dev_pres);
+#else
        ret = getaddrinfo_with_pcid(host, NULL, &hints, &dev_pres, cid);
 #endif
-       if ( ret != 0 || dev_pres == NULL ) {
-                       return -1;
+#endif
+       if (ret != 0 || dev_pres == NULL) {
+               return -1;
        }
 #if !defined (PLAT_Qualcomm)
        sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 #else
        sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
 #endif
-       if(sockfd < 0) {
-                freeaddrinfo(dev_pres);
-         return -1;
-    }
+       if (sockfd < 0) {
+               freeaddrinfo(dev_pres);
+               return -1;
+       }
        struct timeval tv;
-    tv.tv_sec = 5;
-    tv.tv_usec = 0;
+       tv.tv_sec = 5;
+       tv.tv_usec = 0;
        // 设置接收超时,5s
-    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+       setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
 #if defined(PLAT_RDA)
-        int pdp = 1;
-        netif_cfg = netif_get_by_cid(pdp);
+       int pdp = 1;
+       netif_cfg = netif_get_by_cid(pdp);
+#elif defined (PLAT_ECR6600)
+       netif_cfg = NULL;
+       (void)netif_cfg;
 #else
-        int pdp = Helios_DataCall_GetCurrentPDP();
-#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
-        netif_cfg = netif_get_by_cid(pdp);
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1803s)
-        netif_cfg = netif_get_by_cid(pdp - 1);
+       int pdp = Helios_DataCall_GetCurrentPDP();
+#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+       netif_cfg = netif_get_by_cid(pdp);
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
+       netif_cfg = netif_get_by_cid(pdp - 1);
 #elif defined (PLAT_Qualcomm)
-               netif_cfg = NULL;
-               (void)pdp;
+       netif_cfg = NULL;
+       (void)pdp;
 #endif
 #endif
-#if !defined (PLAT_Qualcomm)
+#if defined (PLAT_ECR6600)
+       server_addr.sin_family = AF_INET;
+       server_addr.sin_port = htons(DEVICE_INFO_REPORT_PORT);
+       sin_pres = (struct sockaddr_in*)dev_pres->ai_addr;
+       server_addr.sin_addr = sin_pres->sin_addr;
+       ret = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
+       if (ret == -1) {
+               close(sockfd);
+               freeaddrinfo(dev_pres);
+               return -1;
+       }
+#elif !defined (PLAT_Qualcomm)
        struct sockaddr_in local4;
-    if(netif_cfg) {
-           local4.sin_family = AF_INET;
-               local4.sin_port = DEVICE_INFO_REPORT_PORT;
-#if defined (PLAT_Unisoc) || defined(PLAT_RDA)  || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
-        local4.sin_addr.s_addr = netif_cfg->ip_addr.u_addr.ip4.addr;
-#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1803s)
-        local4.sin_addr.s_addr = netif_cfg->ip_addr.addr;
+       if (netif_cfg) {
+               local4.sin_family = AF_INET;
+               local4.sin_port = DEVICE_INFO_REPORT_PORT;
+#if defined (PLAT_Unisoc) || defined(PLAT_RDA)  || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+               local4.sin_addr.s_addr = netif_cfg->ip_addr.u_addr.ip4.addr;
+#elif defined (PLAT_ASR) || defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined(PLAT_ASR_1602)
+               local4.sin_addr.s_addr = netif_cfg->ip_addr.addr;
 #endif
-           if(bind(sockfd,(struct sockaddr *)&local4,sizeof(struct sockaddr))) {
+               if (bind(sockfd, (struct sockaddr*)&local4, sizeof(struct sockaddr))) {
                        close(sockfd);
-                   freeaddrinfo(dev_pres);
-                       return -1;
-           }
-    }
+                       freeaddrinfo(dev_pres);
+                       return -1;
+               }
+       }
+#endif
+#if !defined (PLAT_ECR6600)
+       server_addr.sin_family = AF_INET;
+       server_addr.sin_port = htons(DEVICE_INFO_REPORT_PORT);
+       sin_pres = (struct sockaddr_in*)dev_pres->ai_addr;
+       server_addr.sin_addr = sin_pres->sin_addr;
 #endif
-    server_addr.sin_family = AF_INET;
-    server_addr.sin_port = htons(DEVICE_INFO_REPORT_PORT);
-    sin_pres = (struct sockaddr_in *)dev_pres->ai_addr;
-    server_addr.sin_addr = sin_pres->sin_addr;
-    len = sizeof(server_addr);
-       ret = sendto(sockfd, sendData, sendLength, 0, (struct sockaddr *)(&server_addr), len);
-    if(ret < 0) {
-       close(sockfd);
+       len = sizeof(server_addr);
+       ret = sendto(sockfd, sendData, sendLength, 0, (struct sockaddr*)(&server_addr), len);
+       if (ret < 0) {
+               close(sockfd);
                freeaddrinfo(dev_pres);
-       return -1;
-    }
-    ret = recvfrom(sockfd, recvUdpData, 100, 0, (struct sockaddr *)&server_addr, &len);
-       if( ret != 5 || recvUdpData[4] != 0x30 ) {
+               return -1;
+       }
+       Helios_msleep(1000);
+       ret = recvfrom(sockfd, recvUdpData, 100, 0, (struct sockaddr*)&server_addr, &len);
+       if (ret != 5 || recvUdpData[4] != 0x30) {
                close(sockfd);
                freeaddrinfo(dev_pres);
                return -1;
        }
        close(sockfd);
        freeaddrinfo(dev_pres);
-    return 0;
+       return 0;
 }
 // 大端对齐转换为小端对齐
-static short _big2littles(short be)
-{
+static short _big2littles(short be) {
        short swapped = (0xff00 & be << 8) | (0x00ff & be >> 8);
-    return swapped;
+       return swapped;
 }
 // 上报设备信息
-static void dr_report_dev_info(int profile_idx)
-{
+static void dr_report_dev_info(int profile_idx) {
        struct report_msg msg;
        msg.head = DEVICE_MSG_HEAD;
        int data_length = 0;
@@ -430,41 +449,88 @@ static void dr_report_dev_info(int profile_idx)
        //char sendhex[256] = {0};
        int ret = 0;
 #if DR_HASH256_ENABLE
-       unsigned char imei_hash[32] = {0};
+#if defined (PLAT_ECR6600)
+       unsigned char mac_hash[32] = { 0 };
+       dr_sha256(devConfig.mac, 6, mac_hash);
+       data_length = 32;
+       msg.len = data_length;
+       memcpy(msg.value, mac_hash, msg.len);
+#else
+       unsigned char imei_hash[32] = { 0 };
        dr_sha256(devConfig.imei, strlen(devConfig.imei), imei_hash);
        data_length = 32;
        msg.len = data_length;
        memcpy(msg.value, imei_hash, msg.len);
+#endif
+#else
+#if defined (PLAT_ECR6600)
+       data_length = 6;
+       msg.len = data_length;
+       memcpy(msg.value, devConfig.mac, data_length);
 #else
        data_length = strlen(devConfig.imei);
        msg.len = data_length;
        memcpy(msg.value, devConfig.imei, data_length);
+#endif
 #endif
        msg.head = _big2littles(msg.head);
        msg.len = _big2littles(msg.len);
-       for( i = 0; i < DEVICE_REPORT_TRY_CNT; i++ ) {
-               ret = dr_udp_client_send(profile_idx, DEVICE_INFO_REPORT_SERVER_CN, (unsigned char *)&msg, data_length+4);
-               if( ret == 0 ) {
-                       ret = Helios_NV_File_Write(DEVREPORT_RECORD_FILE, "success",7);
+       for (i = 0; i < DEVICE_REPORT_TRY_CNT; i++) {
+               ret = dr_udp_client_send(profile_idx, DEVICE_INFO_REPORT_SERVER_CN, (unsigned char*)&msg, data_length + 4);
+               if (ret == 0) {
+                       ret = Helios_NV_File_Write(DEVREPORT_RECORD_FILE, "success", 7);
                        break;
                }
                Helios_sleep(1);
        }
        devConfig.status = SSS_DEVICE_STATION_END;
 }
+#if defined (PLAT_ECR6600)
+// 读取设备MAC
+static void dr_read_device_mac() {
+       int ret = 0;
+       int i = 0;
+       memset(devConfig.mac, 0x0, 6);
+       ret = Helios_Dev_GetMAC(devConfig.mac, 6);
+       if (ret != 0 ||
+               (devConfig.mac[0] == 0x0
+                       && devConfig.mac[1] == 0x0
+                       && devConfig.mac[2] == 0x0
+                       && devConfig.mac[3] == 0x0
+                       && devConfig.mac[4] == 0x0
+                       && devConfig.mac[5] == 0x0)
+               ) {
+               devConfig.status = SSS_DEVICE_STATION_END;
+               return;
+       }
+
+       devConfig.status = SSS_DEVICE_NETWORK_CHECK;
+}
+// 检查网络连接
+static void dr_network_check() {
+       int ret = 0;
+       ret = Helios_Wlan_isActive(HELIOS_WLAN_STATION_IF);
+       if (ret == 1) {
+               devConfig.status = SSS_DEVICE_REPORT;
+               return;
+       }
+       g_failure_cnt += 1;
+       if (g_failure_cnt == 36) devConfig.status = SSS_DEVICE_STATION_END;
+       Helios_sleep(g_loop_sleep_sec);
+}
+#else
 // 读取设备imsi
-static void dr_read_device_imsi()
-{
+static void dr_read_device_imsi() {
        int ret = 0;
        int i = 0;
-       for( i = 0; i < 2; i++ ) {
-               ret = Helios_SIM_GetIMSI(i, devConfig.imsi, sizeof(devConfig.imsi)-1);
+       for (i = 0; i < 2; i++) {
+               ret = Helios_SIM_GetIMSI(i, devConfig.imsi, sizeof(devConfig.imsi) - 1);
 #if !defined (PLAT_Qualcomm) 
-               if( ret == 0 ) {
+               if (ret == 0) {
 #else
-               if( ret == 0 && strncmp(devConfig.imsi, "NULL", 4)) {
+               if (ret == 0 && strncmp(devConfig.imsi, "NULL", 4)) {
 #endif
-                       if( !strncmp(devConfig.imsi, STATION_CODE_CN, 3) ) {
+                       if (!strncmp(devConfig.imsi, STATION_CODE_CN, 3)) {
                                devConfig.status = SSS_DEVICE_IMEI;
                        } else {
                                devConfig.status = SSS_DEVICE_STATION_END;
@@ -473,109 +539,120 @@ static void dr_read_device_imsi()
                        g_loop_sleep_sec = 5;
                        return;
                }
-       }
+               }
        g_failure_cnt += 1;
-       if( g_failure_cnt == 6 ) g_loop_sleep_sec = 30;
+       if (g_failure_cnt == 6) g_loop_sleep_sec = 30;
        Helios_sleep(g_loop_sleep_sec);
-}
+       }
+
 // 读取设备imei
-static void dr_read_device_imei()
-{
+static void dr_read_device_imei() {
        int ret = 0;
-       ret = Helios_Dev_GetIMEI(devConfig.imei, sizeof(devConfig.imei)-1);
-       if( ret != 0 ) {
+       #if MICROPY_QPY_MODULE_DSDS
+       extern int _get_current_simid(void);
+       int cur_simid = _get_current_simid();
+       ret = Helios_Dev_GetIMEI(devConfig.imei, sizeof(devConfig.imei) - 1,cur_simid);
+       #else
+       ret = Helios_Dev_GetIMEI(devConfig.imei, sizeof(devConfig.imei) - 1,0);
+       #endif
+       if (ret != 0) {
                devConfig.status = SSS_DEVICE_STATION_END;
                return;
        }
        devConfig.status = SSS_DEVICE_NETWORK_CHECK;
 }
 // 检查网络连接
-static void dr_network_check()
-{
+static void dr_network_check() {
        int i;
        int ret = 0;
        Helios_DataCallInfoStruct info;
        memset(&info, 0x00, sizeof(info));
-       for(i = (int)HELIOS_PROFILE_IDX_MIN; i < (int)HELIOS_PROFILE_IDX_MAX + 1; i++) {
+       for (i = (int)HELIOS_PROFILE_IDX_MIN; i < (int)HELIOS_PROFILE_IDX_MAX + 1; i++) {
                ret = Helios_DataCall_GetInfo(i, 0, &info);
-               if( ret == 0 ) {
-                       if( info.v4.state == 1 && info.v4.addr.ip.s_addr != 0 ) {
-        #if defined PLAT_EIGEN
-                devConfig.profile_idx = Helios_DataCall_GetCurrentPDP();
-        #else
-                devConfig.profile_idx = info.profile_idx;
-        #endif
+               if (ret == 0) {
+                       if (info.v4.state == 1 && info.v4.addr.ip.s_addr != 0) {
+#if defined PLAT_EIGEN
+                               devConfig.profile_idx = Helios_DataCall_GetCurrentPDP();
+#else
+                               devConfig.profile_idx = info.profile_idx;
+#endif
                                devConfig.status = SSS_DEVICE_REPORT;
                                return;
                        }
                }
        }
        g_failure_cnt += 1;
-       if( g_failure_cnt == 36 ) devConfig.status = SSS_DEVICE_STATION_END;
+       if (g_failure_cnt == 36) devConfig.status = SSS_DEVICE_STATION_END;
        Helios_sleep(g_loop_sleep_sec);
 }
+#endif
 
 #if defined(PLAT_RDA)
-static int dr_check_poweron()
-{
+static int dr_check_poweron() {
        int ret = 0;
        ret = Helios_Power_GetUpReason();
-       if( ret == 1 ) {
+       if (ret == 1) {
                return 1;
        }
        return 0;
 }
 #endif
-static int check_report_flag()
-{
+static int check_report_flag() {
        int ret = 0;
-
-// 0: not exist  1: exist
+       // 0: not exist  1: exist
        ret = Helios_NV_File_Exist(DEVREPORT_RECORD_FILE);
-       if( ret == 0 ) {
+       if (ret == 0) {
                return 0;
        }
-
        return 1;
 }
 /*
 * 设备信息上报状态机
 * 读取imsi-> 读取imei -> 检查网络状态 -> 设备信息上报 -> 结束
 */
-static void devReport(void *argv)
-{
+static void devReport(void* argv) {
        (void)argv;
        Helios_sleep(15);
        memset(&devConfig, 0x00, sizeof(devConfig));
 
        int ret = check_report_flag();
-       if( ret == 1 ) devConfig.status = SSS_DEVICE_STATION_END;
-       
+       if (ret == 1) devConfig.status = SSS_DEVICE_STATION_END;
+
 #if defined(PLAT_RDA)
-       if( !dr_check_poweron() ) {
+       if (!dr_check_poweron()) {
                devConfig.status = SSS_DEVICE_STATION_END;
        }
 #endif
        do {
-               //app_debug(">>>>> devConfig.step = %d\n", devConfig.status);
-               switch( devConfig.status ) {
+               // app_debug(">>>>> devConfig.step = %d\n", devConfig.status);
+               switch (devConfig.status) {
+#if defined (PLAT_ECR6600)
+                       case SSS_DEVICE_MAC:
+                               dr_read_device_mac();
+                               break;
+#else
                        case SSS_DEVICE_IMSI:
                                dr_read_device_imsi();
                                break;
                        case SSS_DEVICE_IMEI:
                                dr_read_device_imei();
                                break;
+#endif
                        case SSS_DEVICE_NETWORK_CHECK:
                                dr_network_check();
                                break;
                        case SSS_DEVICE_REPORT:
+#if defined (PLAT_ECR6600)
+                               dr_report_dev_info(0);
+#else
                                dr_report_dev_info(devConfig.profile_idx);
+#endif
                                break;
                        case SSS_DEVICE_STATION_END:
                        default:
                                Helios_Thread_Exit();
                }
-       } while(1);
+       } while (1);
        Helios_Thread_Exit();
 }
 
index c7537c5..39bbbfd 100644 (file)
@@ -58,7 +58,6 @@ void gc_stacktop_set(void * ptr)
 {
     MP_STATE_PORT(global_stacktop_ptr) = ptr;
 }
-#include "helios_debug.h"
 
 void gc_collect(void) {
     // get current time, in case we want to time the GC
@@ -69,7 +68,6 @@ void gc_collect(void) {
        int val = 0;
 #endif
     // start the GC
-    _ql_app_log("gc_collect --start th_id:%x", Helios_Thread_GetID());
     gc_collect_start();
 #if defined(PLAT_ECR6600)
        uintptr_t sp = (uintptr_t)&val;
@@ -97,9 +95,8 @@ void gc_collect(void) {
     #endif
 
     // end the GC
-    _ql_app_log("gc_collect --end1 th_id:%x", Helios_Thread_GetID());
     gc_collect_end();
-    _ql_app_log("gc_collect --end2 th_id:%x", Helios_Thread_GetID());
+
     #if 0
     // print GC info
     uint32_t ticks = mp_hal_ticks_us() - start;
index e57a7f7..f75400e 100644 (file)
@@ -824,7 +824,13 @@ locator_encodeinfo_struct locator_info_encode(void *info, uint8_t loc_method, ui
     memcpy(authInfo.name, "quectel", strlen("quectel"));
     memcpy(authInfo.pwd, "123456", strlen("123456"));
 
-    Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1);
+    #if MICROPY_QPY_MODULE_DSDS
+    extern int _get_current_simid(void);
+       int cur_simid = _get_current_simid();
+    Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1,cur_simid);
+    #else
+    Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1,0);
+    #endif
     QPY_MODLBS_LOG("cell_locreq:  get imei [%s]\r\n", authInfo.imei);
 
     uint8_t digest1[16] = {0};
@@ -1103,7 +1109,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                 tagused = ber_fetch_tag(buffer+currentIndex,bufSize-currentIndex,&(tag));
                 if (0 >= tagused)
                 {
-                    mp_raise_ValueError("WiFi-Scan TLV ber_fetch_tag Fail.");
+                    mp_raise_ValueError("Locator TLV ber_fetch_tag Fail.");
                     return -1;
                 }
                 else
@@ -1121,7 +1127,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                 lenused = ber_fetch_length(buffer+currentIndex, bufSize-currentIndex, &(ktlvNode->length));
                 if (0 >= lenused)
                 {
-                    mp_raise_ValueError("WiFi-Scan TLV ber_fetch_length Fail.");
+                    mp_raise_ValueError("Locator TLV ber_fetch_length Fail.");
                     return -1;
                 }
                 else
@@ -1138,7 +1144,7 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                     ktlvNode->value= (uint8_t*)malloc(ktlvNode->length);
                     if (!ktlvNode->value)
                     {
-                        mp_raise_ValueError("WiFi-Scan TLV malloc Fail.");
+                        mp_raise_ValueError("Locator TLV malloc Fail.");
                                                return -1;
                     }
 
@@ -1150,13 +1156,13 @@ int32_t tlv_parse_to_tree(const uint8_t* buffer, uint32_t bufSize, QTLVNode** ro
                         QPY_MODLBS_LOG("********BER_POS_STAT_TAG ktlvNode->value :******** [%d]\r\n", start);
                         if (start == 0)
                         {
-                            mp_raise_ValueError("WiFi-Scan TLV server status Fail.");
+                            mp_raise_ValueError("Locator TLV server status Fail.");
                             return -1;
                         }
                         else if (start >= POS_POS_NUM_10)
                         {
                             char ret_buf[60];
-                            sprintf(ret_buf, "WiFi-Scan token %d Fail.",start);
+                            sprintf(ret_buf, "Locator token %d Fail.",start);
                             mp_raise_ValueError(ret_buf);
                             return -1;
                         }
index cb2df2b..eda8922 100644 (file)
@@ -26,6 +26,7 @@
 #if MICROPY_QPY_LPM_WAKEUP
 
 #include "helios_wakeup.h"
+
 #include "helios_debug.h"
 #include "callbackdeal.h"
 
@@ -33,6 +34,9 @@ typedef struct _machine_uart_obj_t {
     mp_obj_base_t base;
     unsigned char wakeup_id;
     unsigned char wakeup_pull;
+#if defined(PLAT_EIGEN_718)
+       unsigned char wakeup_edge;
+#endif
 } lpm_wakeup_obj_t;
 
 typedef void(*wakeup_handler_t)(uint8_t pin_level);
@@ -54,7 +58,7 @@ const mp_obj_type_t lpm_wakeup_type;
                                                     }while(0)                                                                                 
 #else
 #define WAKEUP_CALLBACK_OP(WAKEUP_ID, pin_level)   do{                                                                                                   \
-                                                        mp_sched_schedule_ex(callback_wakeup[WAKEUP_ID], MP_OBJ_FROM_PTR(mp_obj_new_int(pin_level)));    \
+                                                        mp_sched_schedule_ex(&callback_wakeup[WAKEUP_ID], MP_OBJ_FROM_PTR(mp_obj_new_int(pin_level)));    \
                                                    }while(0)
 
 #endif
@@ -81,7 +85,8 @@ WAKEUP_CB_PY(3)
 WAKEUP_CB_PY(4)
 WAKEUP_CB_PY(5)
 
-wakeup_handler_t wakeup_handler[HELIOS_WAKEUP_MAX] = {
+wakeup_handler_t wakeup_handler[HELIOS_WAKEUP_MAX] = 
+{
        wakeuphandler0,
     wakeuphandler1,
     wakeuphandler2,
@@ -99,16 +104,23 @@ STATIC void lpm_wakeup_print(const mp_print_t *print, mp_obj_t self_in, mp_print
 
 STATIC void lpm_wakeup_init_helper(lpm_wakeup_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) 
 {
-       enum {ARG_wakeup_id, ARG_wakeup_pull};
+#if defined(PLAT_EIGEN_718)
+       Helios_Wakeup_cfg_t wakeup_cfg = {0};
+#endif
+       enum {ARG_wakeup_id, ARG_wakeup_pull,ARG_wakeup_edge};
     static const mp_arg_t allowed_args[] = 
        {
         { MP_QSTR_wakeup_id, MP_ARG_INT, {.u_int = -1} },
         { MP_QSTR_wakeup_pull, MP_ARG_INT, {.u_int = -1} },
+        #if defined(PLAT_EIGEN_718)
+               { MP_QSTR_wakeup_edge, MP_ARG_INT, {.u_int = 2} },//default:both edge enable
+        #endif
     };
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
     mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
 
-    switch (args[ARG_wakeup_id].u_int) {
+    switch (args[ARG_wakeup_id].u_int) 
+    {
                case HELIOS_WAKEUP_0:
                case HELIOS_WAKEUP_1:
                case HELIOS_WAKEUP_2:
@@ -123,7 +135,8 @@ STATIC void lpm_wakeup_init_helper(lpm_wakeup_obj_t *self, size_t n_args, const
             break;
     }
        helios_debug("args[ARG_wakeup_id].u_int=%d,args[ARG_wakeup_pull].u_int=%d",args[ARG_wakeup_id].u_int,args[ARG_wakeup_pull].u_int);
-    switch (args[ARG_wakeup_pull].u_int) {
+    switch (args[ARG_wakeup_pull].u_int) 
+    {
                case HELIOS_WAKE_PULL_NONE:
                case HELIOS_WAKE_PULL_UP:
                case HELIOS_WAKE_PULL_DOWN:             
@@ -133,13 +146,27 @@ STATIC void lpm_wakeup_init_helper(lpm_wakeup_obj_t *self, size_t n_args, const
             mp_raise_ValueError(MP_ERROR_TEXT("invalid wakeup_pullmode"));
             break;
     }
+#if defined(PLAT_EIGEN_718)
+       if(args[ARG_wakeup_edge].u_int > HELIOS_EDGE_BOTH)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid wakeup_edge"));
+       }
+       self->wakeup_edge = args[ARG_wakeup_edge].u_int;
+#endif
+#if defined(PLAT_EIGEN_718)
+       wakeup_cfg.edge_mode =  self->wakeup_edge;
+       wakeup_cfg.pull_mode =  self->wakeup_pull;
+       if(Helios_Wakeup_Config((Helios_Wakeup_ID)self->wakeup_id,&wakeup_cfg)!=0)
+#else
        if(Helios_Wakeup_Config((Helios_Wakeup_ID)self->wakeup_id,(Helios_WAKE_PullMode)self->wakeup_pull)!=0)
+#endif
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("Wakeup(%d) init fail"), self->wakeup_id);
        }
 }
 
-STATIC mp_obj_t lpm_wakeup_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
+STATIC mp_obj_t lpm_wakeup_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) 
+{
     mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
 
     // get wakeup id
@@ -166,14 +193,16 @@ STATIC mp_obj_t lpm_wakeup_make_new(const mp_obj_type_t *type, size_t n_args, si
     return MP_OBJ_FROM_PTR(self);
 }
 
-STATIC mp_obj_t lpm_wakeup_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
+STATIC mp_obj_t lpm_wakeup_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) 
+{
     lpm_wakeup_init_helper(args[0], n_args - 1, args + 1, kw_args);
     return mp_const_none;
 }
 MP_DEFINE_CONST_FUN_OBJ_KW(lpm_wakeup_init_obj, 1, lpm_wakeup_init);
 
 
-STATIC mp_obj_t lpm_wakeup_enable(mp_obj_t self_in) {
+STATIC mp_obj_t lpm_wakeup_enable(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_Enable((Helios_Wakeup_ID) self->wakeup_id);
        helios_debug("Helios_Wakeup_Enable =%d",self->wakeup_id);
@@ -182,7 +211,8 @@ STATIC mp_obj_t lpm_wakeup_enable(mp_obj_t self_in) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_wakeup_enable_obj, lpm_wakeup_enable);
 
 
-STATIC mp_obj_t lpm_wakeup_disable(mp_obj_t self_in) {
+STATIC mp_obj_t lpm_wakeup_disable(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_Disable((Helios_Wakeup_ID) self->wakeup_id);
     return mp_obj_new_int(ret);
@@ -190,7 +220,8 @@ STATIC mp_obj_t lpm_wakeup_disable(mp_obj_t self_in) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_wakeup_disable_obj, lpm_wakeup_disable);
 
 
-STATIC mp_obj_t lpm_wakeup_get_value(mp_obj_t self_in) {
+STATIC mp_obj_t lpm_wakeup_get_value(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_Get_Pin_Value((Helios_Wakeup_ID) self->wakeup_id);
     return mp_obj_new_int(ret);
@@ -198,28 +229,34 @@ STATIC mp_obj_t lpm_wakeup_get_value(mp_obj_t self_in) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_wakeup_get_value_obj, lpm_wakeup_get_value);
 
 
-STATIC mp_obj_t lpm_wakeup_deinit(mp_obj_t self_in) {
+STATIC mp_obj_t lpm_wakeup_deinit(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_Deinit((Helios_Wakeup_ID) self->wakeup_id);
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_wakeup_deinit_obj, lpm_wakeup_deinit);
 
-STATIC mp_obj_t lpm_getwakestate(mp_obj_t self_in) {
+#if !defined(PLAT_EIGEN_718)
+STATIC mp_obj_t lpm_getwakestate(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_ReadWakePinvalue((Helios_Wakeup_ID) self->wakeup_id);
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_getwakestate_obj, lpm_getwakestate);
 
-STATIC mp_obj_t lpm_getwaketriggered(mp_obj_t self_in) {
+STATIC mp_obj_t lpm_getwaketriggered(mp_obj_t self_in) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
        int ret = Helios_Wakeup_WakeTrip((Helios_Wakeup_ID) self->wakeup_id);
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lpm_getwaketriggered_obj, lpm_getwaketriggered);
+#endif
 
-STATIC mp_obj_t lpm_set_callback(mp_obj_t self_in, mp_obj_t callback) {
+STATIC mp_obj_t lpm_set_callback(mp_obj_t self_in, mp_obj_t callback) 
+{
     lpm_wakeup_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
        mp_sched_schedule_callback_register(&(callback_wakeup[self->wakeup_id]), callback);
@@ -229,28 +266,36 @@ STATIC mp_obj_t lpm_set_callback(mp_obj_t self_in, mp_obj_t callback) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(lpm_set_callback_obj, lpm_set_callback);
 
-STATIC const mp_rom_map_elem_t lpm_wakeup_locals_dict_table[] = {
+STATIC const mp_rom_map_elem_t lpm_wakeup_locals_dict_table[] = 
+{
        { MP_ROM_QSTR(MP_QSTR___del__),         MP_ROM_PTR(&lpm_wakeup_deinit_obj) },
     { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&lpm_wakeup_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_enable), MP_ROM_PTR(&lpm_wakeup_enable_obj) },
     { MP_ROM_QSTR(MP_QSTR_disable), MP_ROM_PTR(&lpm_wakeup_disable_obj) },
     { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&lpm_wakeup_get_value_obj) },
     { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&lpm_wakeup_deinit_obj) },
+#if !defined(PLAT_EIGEN_718)
     { MP_ROM_QSTR(MP_QSTR_wakestat), MP_ROM_PTR(&lpm_getwakestate_obj) },
     { MP_ROM_QSTR(MP_QSTR_waketriggered), MP_ROM_PTR(&lpm_getwaketriggered_obj) },    
+#endif
     { MP_ROM_QSTR(MP_QSTR_set_callback), MP_ROM_PTR(&lpm_set_callback_obj) },
-       // { MP_ROM_QSTR(MP_QSTR_WAKEUP0), MP_ROM_INT(HELIOS_WAKEUP_0) },
-       // { MP_ROM_QSTR(MP_QSTR_WAKEUP1), MP_ROM_INT(HELIOS_WAKEUP_1) },//usb_vbus
+#if defined(PLAT_EIGEN_718)
+       { MP_ROM_QSTR(MP_QSTR_WAKEUP0), MP_ROM_INT(HELIOS_WAKEUP_0) },
+       { MP_ROM_QSTR(MP_QSTR_WAKEUP1), MP_ROM_INT(HELIOS_WAKEUP_1) },//usb_vbus
+#endif
        { MP_ROM_QSTR(MP_QSTR_WAKEUP2), MP_ROM_INT(HELIOS_WAKEUP_2) },
     { MP_ROM_QSTR(MP_QSTR_WAKEUP3), MP_ROM_INT(HELIOS_WAKEUP_3) },
        { MP_ROM_QSTR(MP_QSTR_WAKEUP4), MP_ROM_INT(HELIOS_WAKEUP_4) },
        { MP_ROM_QSTR(MP_QSTR_WAKEUP5), MP_ROM_INT(HELIOS_WAKEUP_5) },
-    // { MP_ROM_QSTR(MP_QSTR_IRQ_RISING),         MP_ROM_INT(HELIOS_EDGE_RISING) },
-    // { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING),        MP_ROM_INT(HELIOS_EDGE_FALLING) },
-    // { MP_ROM_QSTR(MP_QSTR_IRQ_RISING_FALLING), MP_ROM_INT(HELIOS_EDGE_BOTH) },
+
        { MP_ROM_QSTR(MP_QSTR_PULL_DISABLE),       MP_ROM_INT(HELIOS_WAKE_PULL_NONE) },
        { MP_ROM_QSTR(MP_QSTR_PULL_PU),            MP_ROM_INT(HELIOS_WAKE_PULL_UP) },
     { MP_ROM_QSTR(MP_QSTR_PULL_PD),            MP_ROM_INT(HELIOS_WAKE_PULL_DOWN) },
+#if defined(PLAT_EIGEN_718)
+    { MP_ROM_QSTR(MP_QSTR_IRQ_RISING),         MP_ROM_INT(HELIOS_EDGE_RISING) },
+    { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING),        MP_ROM_INT(HELIOS_EDGE_FALLING) },
+    { MP_ROM_QSTR(MP_QSTR_IRQ_RISING_FALLING), MP_ROM_INT(HELIOS_EDGE_BOTH) },
+#endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(lpm_wakeup_locals_dict, lpm_wakeup_locals_dict_table);
index 976cab0..40001c9 100644 (file)
 #include "helios_extint.h"
 #include "helios_debug.h"
 #include "callbackdeal.h"
-
-
+#include "helios_os.h"
+
+//#if defined(PLAT_EIGEN)
+static Helios_Thread_t thread_id = 0;
+static Helios_MsgQ_t extint_queue = 0;
+typedef struct 
+{
+    uint8_t msg_type;
+    uint8_t pin;
+       uint8_t edge;
+       void* cb;
+}extint_Msg;
+
+//#endif
+#if 1
 #define EXTINT_LOG(msg, ...)      custom_log("extint", msg, ##__VA_ARGS__)
-
+#else
+#define EXTINT_LOG(msg, ...)
+#endif
+/* sample time (ms) */
+#define EXTINT_SAMPLE_TIME             (10)
 
 extern int Helios_GPIO_GetLevel(Helios_GPIONum gpio_num);
 
-#if defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE) 
+#if defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE)
 static int __fastIntGpio = 0xffff;
 #endif
 
@@ -43,6 +60,7 @@ typedef struct {
     mp_int_t line;
        mp_int_t mode;
        mp_int_t pull;
+       mp_int_t fliter_time;
        c_callback_t callback;
 } extint_obj_t;
 
@@ -51,10 +69,17 @@ typedef struct {
        mp_int_t falling_count;
 } extint_count_t;
 
+#if defined(PLAT_aic8800m40)
+typedef void(*eint_handler_t)(int EDGE);
+#else
 typedef void(*eint_handler_t)(void);
 
+#endif
+
 static extint_obj_t *extint_obj[HELIOS_GPIOMAX];
 static extint_count_t extint_count[HELIOS_GPIOMAX] = {0};
+static Helios_OSTimer_t extint_fliter_timer[HELIOS_GPIOMAX] = {0};
+static uint8_t extint_fliter_timer_is_start[HELIOS_GPIOMAX] = {0};
 
 enum {
        HELIOS_EXTINT_RISING,
@@ -64,19 +89,21 @@ enum {
 #define EINT_HANDLER_DEF(n) handler##n
 #define PLAT_EINT_HANDLER_DEF(n) BOOST_PP_REPEAT_1(n,EINT_HANDLER_DEF)
 
-
 /*
 ** Jayceon-20200908:
 ** Replace function mp_call_function_1_protected() with mp_sched_schedule_ex to slove the dump problem.
 */
-#if MICROPY_ENABLE_CALLBACK_DEAL
+#if MICROPY_ENABLE_CALLBACK_DEAL   
 #define EXTINT_CALLBACK_OP(X, edge)     do{                                                                                     \
                                             st_CallBack_Extint *extint = malloc(sizeof(st_CallBack_Extint));                    \
                                            if(NULL != extint) {                                                                \
                                                    extint->pin_no = X;                                                             \
                                                    extint->edge = edge;                                                            \
                                                    extint->callback = extint_obj[X]->callback;                                     \
-                                                   qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_EXTINT, extint);          \
+                                                   if(qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_EXTINT, extint))          \
+                                                   {                                                                                                                                                           \
+                                                                                                       free(extint);                                                                                                                           \
+                                                   }                                                                                                                                                           \
                                                }                                                                                   \
                                         }while(0)
 #else
@@ -93,92 +120,189 @@ enum {
 #endif
 
 
-
+#if defined(PLAT_aic8800m40)   
+#define HANDLER_FUN(X)                                                                                                                                     \
+static void fliter_timer_handler##X(void *args) {                                                                                      \
+       int edge = (int)args;                                                                                                                                   \
+       static uint32_t extint_fliter_count = 0;                                                                                                \
+       uint32_t extint_fliter_count_max = extint_obj[X]->fliter_time / EXTINT_SAMPLE_TIME;             \
+       int level = Helios_GPIO_GetLevel(X);                                                                                                    \
+       switch (edge) {                                                                                                                                                 \
+               case HELIOS_EXTINT_RISING:                                                                                                                      \
+                       if (level != 1) {                                                                                                                               \
+                               extint_fliter_count = 0;                                                                                                        \
+                       }                                                                                                                                                               \
+                       break;                                                                                                                                                  \
+               case HELIOS_EXTINT_FALLING:                                                                                                                     \
+                       if (level != 0) {                                                                                                                               \
+                               extint_fliter_count = 0;                                                                                                        \
+                       }                                                                                                                                                               \
+                       break;                                                                                                                                                  \
+       }                                                                                                                                                                               \
+       if (++extint_fliter_count > extint_fliter_count_max) {                                                                  \
+               Helios_OSTimer_Stop(extint_fliter_timer[X]);                                                                            \
+               extint_fliter_count = 0;                                                                                                                        \
+               extint_fliter_timer_is_start[X] = false;                                                                                        \
+               EXTINT_CALLBACK_OP(X, edge);                                                                                                            \
+       }                                                                                                                                                                               \
+}                                                                                                                                                                                      \
+static void handler##X(int EDGE)                                                                                                               \
+{                                                                                              \
+       int edge = EDGE;                                                                                        \
+       if (extint_obj[X]->callback.cb != mp_const_none &&                                      \
+                   ((mp_sched_num_pending() < MICROPY_SCHEDULER_DEPTH)))                       \
+       {                                                                                                   \
+               if (extint_obj[X]->fliter_time > 0 && !extint_fliter_timer_is_start[X]) {                       \
+                       if (!extint_fliter_timer[X]) {                                                                                                  \
+                               extint_fliter_timer[X] = Helios_OSTimer_Create();                                                       \
+                               if (!extint_fliter_timer[X]) {                                                                                          \
+                                       EXTINT_LOG("error: extint fliter timer create failed!");                                \
+                                       EXTINT_CALLBACK_OP(X, edge);                                                                                    \
+                               }                                                                                                                                                       \
+                       } else {                                                                                                                                                \
+                               Helios_OSTimerAttr attr = {                                                                                                     \
+                                       .ms = EXTINT_SAMPLE_TIME,                                                                                               \
+                                       .cycle_enable = 1,                                                                                                              \
+                                       .cb = fliter_timer_handler##X,                                                                                  \
+                                       .argv = (void*)edge                                                                                                             \
+                               };                                                                                                                                                      \
+                               Helios_OSTimer_Start(extint_fliter_timer[X], &attr);                                            \
+                               extint_fliter_timer_is_start[X] = true;                                                                         \
+                       }                                                                                                                                                               \
+               } else if(extint_obj[X]->fliter_time == 0){                                                                                     \
+                       EXTINT_CALLBACK_OP(X, edge);                                                    \
+               }                                                                                                                                                                       \
+       }                                                                                                                                                                   \
+       Helios_ExtInt_Enable(extint_obj[X]->line);                                              \
+}                                                                                              
+#else
 #define HANDLER_FUN(X)                                                                                                                                     \
+static void fliter_timer_handler##X(void *args) {                                                                                      \
+       int edge = (int)args;                                                                                                                                   \
+       static uint32_t extint_fliter_count = 0;                                                                                                \
+       uint32_t extint_fliter_count_max = extint_obj[X]->fliter_time / EXTINT_SAMPLE_TIME;             \
+       int level = Helios_GPIO_GetLevel(X);                                                                                                    \
+       switch (edge) {                                                                                                                                                 \
+               case HELIOS_EXTINT_RISING:                                                                                                                      \
+                       if (level != 1) {                                                                                                                               \
+                               Helios_OSTimer_Stop(extint_fliter_timer[X]);                                                                            \
+                               extint_fliter_count = 0;                                                                                                                        \
+                               extint_fliter_timer_is_start[X] = false;\
+                       }                                                                                                                                                               \
+                       break;                                                                                                                                                  \
+               case HELIOS_EXTINT_FALLING:                                                                                                                     \
+                       if (level != 0) {               \
+                               Helios_OSTimer_Stop(extint_fliter_timer[X]);                                                                            \
+                               extint_fliter_count = 0;                                                                                                                        \
+                               extint_fliter_timer_is_start[X] = false;\
+                       }                                                                                                                                                               \
+                       break;                                                                                                                                                  \
+       }                                                                                                                                                                               \
+       if (++extint_fliter_count > extint_fliter_count_max) {  \
+               Helios_OSTimer_Stop(extint_fliter_timer[X]);                                                                            \
+               extint_fliter_count = 0;                                                                                                                        \
+               extint_fliter_timer_is_start[X] = false;                                                                                        \
+               EXTINT_CALLBACK_OP(X, edge);                                                        \
+               if(edge == HELIOS_EXTINT_RISING)                                                    \
+               {                                                                                   \
+                       extint_count[X].rising_count++;                                                 \
+               }                                                                                   \
+               else                                                                                \
+               {                                                                                   \
+                       extint_count[X].falling_count++;                                                \
+               }                                                                                                                                                                       \
+       }                                                                                                                                                                               \
+       Helios_ExtInt_Enable(extint_obj[X]->line);                                              \
+}                                                                                                                                                                                      \
 static void handler##X(void)                                                               \
 {                                                                                              \
-       int edge = HELIOS_EXTINT_RISING;                                                        \
+       int edge = HELIOS_EXTINT_RISING;\
        if(extint_obj[X]->mode == HELIOS_EDGE_RISING)                                                               \
        {                                                                                       \
-               extint_count[X].rising_count++;                                                     \
+               if(extint_obj[X]->fliter_time == 0)                                                                                             \
+               {                                                                                                                                                                       \
+                       extint_count[X].rising_count++;                                                 \
+               }                                                                                                                                                                       \
        }                                                                                               \
        else if(extint_obj[X]->mode == HELIOS_EDGE_FALLING)                                     \
        {                                                                                       \
                edge = HELIOS_EXTINT_FALLING;                                                       \
-               extint_count[X].falling_count++;                                                    \
+               if(extint_obj[X]->fliter_time == 0)                                                 \
+               {                                                                                   \
+                       extint_count[X].falling_count++;                                                \
+               }                                                                                   \
        }                                                                                       \
        else                                                                                    \
        {                                                                                       \
                if(Helios_GPIO_GetLevel((Helios_GPIONum)X) == 0)                                    \
                {                                                                                   \
                        edge = HELIOS_EXTINT_FALLING;                                                   \
-                       extint_count[X].falling_count++;                                                \
+                       if(extint_obj[X]->fliter_time == 0)                                             \
+                       {                                                                               \
+                               extint_count[X].falling_count++;                                            \
+                       }                                                                               \
                }                                                                                   \
                else                                                                                \
                {                                                                                   \
-            extint_count[X].rising_count++;                                                 \
+                       if(extint_obj[X]->fliter_time == 0)                                             \
+                       {                                                                               \
+               extint_count[X].rising_count++;                                                \
+            }                                                                               \
                }                                                                                   \
        }                                                                                           \
        if (extint_obj[X]->callback.cb != mp_const_none &&                                      \
                    ((mp_sched_num_pending() < MICROPY_SCHEDULER_DEPTH)))                       \
        {                                                                                                   \
-               EXTINT_CALLBACK_OP(X, edge);                                                        \
+               if (extint_obj[X]->fliter_time > 0 && !extint_fliter_timer_is_start[X]) {                       \
+                       extint_fliter_timer_is_start[X] = true;\
+                       if(extint_queue && thread_id)                                                   \
+                       {                                                                               \
+                               extint_Msg msg; \
+                               msg.msg_type = 1;\
+                               msg.pin = X;                                                                \
+                               msg.edge = edge;  \
+                               msg.cb = fliter_timer_handler##X;\
+                               Helios_MsgQ_Put(extint_queue, (void *)&msg, sizeof(extint_Msg), HELIOS_NO_WAIT);\
+                       }                                                                               \
+                       else\
+                       {\
+                               Helios_OSTimerAttr attr = \
+                               {                                               \
+                                       .ms = EXTINT_SAMPLE_TIME,\
+                                       .cycle_enable = 1,                              \
+                                       .cb = fliter_timer_handler##X,  \
+                                       .argv = (void*)edge             \
+                               };                                                      \
+                               if(extint_fliter_timer[X])\
+                               {\
+                                       Helios_OSTimer_Start(extint_fliter_timer[X], &attr);    \
+                               }\
+                       }\
+               } else if(extint_obj[X]->fliter_time == 0){\
+                       if(extint_queue && thread_id)                                                   \
+                       {                                                                               \
+                               extint_Msg msg;                                                             \
+                               msg.msg_type = 0;\
+                               msg.pin = X;                                                                \
+                               msg.edge = edge;                                                            \
+                               Helios_MsgQ_Put(extint_queue, (void *)&msg, sizeof(extint_Msg), HELIOS_NO_WAIT);\
+                       }                                                                               \
+                       else                                                                            \
+                       {                                                                               \
+                               EXTINT_CALLBACK_OP(X, edge);                                                \
+                       }                                                                               \
+               }                                                                                                                                                                       \
        }                                                                                                                                                                   \
-       Helios_ExtInt_Enable(extint_obj[X]->line);                                              \
-}                                                                                           
-
-
-HANDLER_FUN(0)
-HANDLER_FUN(1)
-HANDLER_FUN(2)
-HANDLER_FUN(3)
-HANDLER_FUN(4)
-HANDLER_FUN(5)
-HANDLER_FUN(6)
-HANDLER_FUN(7)
-HANDLER_FUN(8)
-HANDLER_FUN(9)
-HANDLER_FUN(10)
-HANDLER_FUN(11)
-HANDLER_FUN(12)
-HANDLER_FUN(13)
-HANDLER_FUN(14)
-HANDLER_FUN(15)
-HANDLER_FUN(16)
-HANDLER_FUN(17)
-HANDLER_FUN(18)
-HANDLER_FUN(19)
-HANDLER_FUN(20)
-HANDLER_FUN(21)
-HANDLER_FUN(22)
-HANDLER_FUN(23)
-HANDLER_FUN(24)
-HANDLER_FUN(25)
-HANDLER_FUN(26)
-HANDLER_FUN(27)
-HANDLER_FUN(28)
-HANDLER_FUN(29)
-HANDLER_FUN(30)
-HANDLER_FUN(31)
-HANDLER_FUN(32)
-HANDLER_FUN(33)
-HANDLER_FUN(34)
-HANDLER_FUN(35)
-HANDLER_FUN(36)
-HANDLER_FUN(37)
-HANDLER_FUN(38)
-HANDLER_FUN(39)
-HANDLER_FUN(40)
-HANDLER_FUN(41)
-HANDLER_FUN(42)
-HANDLER_FUN(43)
-HANDLER_FUN(44)
-HANDLER_FUN(45)
-HANDLER_FUN(46)
-HANDLER_FUN(47)
-HANDLER_FUN(48)
-HANDLER_FUN(49)
-HANDLER_FUN(50)
+       if((extint_obj[X]->fliter_time == 0) && !(extint_queue && thread_id))                   \
+       {                                                                                                                                                                               \
+               Helios_ExtInt_Enable(extint_obj[X]->line);                                          \
+       }                                                                                                                                                           \
+}                                                                                                                                                                                      
+#endif                                                                                                                                                                         
+
+
+HANDLER_FUN_0_N(PLAT_GPIO_NUM)
+
 
 
 
@@ -220,6 +344,42 @@ STATIC mp_obj_t extint_obj_disable(mp_obj_t self_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(extint_obj_disable_obj, extint_obj_disable);
 
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+static void extint_entry(void * argv)
+{
+       extint_Msg msg; 
+       int edge;
+       while(1)
+       {
+               Helios_MsgQ_Get(extint_queue, (void *)&msg, sizeof(extint_Msg), HELIOS_WAIT_FOREVER);
+               edge = msg.edge;
+               if(msg.msg_type == 1)//start timer
+               {
+                       if(extint_fliter_timer[msg.pin])
+                       {
+                               Helios_OSTimerAttr attr = 
+                               {                                                                                                       
+                                       .ms = EXTINT_SAMPLE_TIME,                                                                                               
+                                       .cycle_enable = 1,                                                                                                              
+                                       .cb = (void(*)(void *))msg.cb,                                                                                  
+                                       .argv = (void*)edge                                                                                                             
+                               };                                                                                                                                                      
+                               if(Helios_OSTimer_Start(extint_fliter_timer[msg.pin], &attr))//eigen 618 plat,we cant call Helios_OSTimer_Start in IRQ                          
+                               {
+                               }
+                               else
+                               {
+                               }       
+                       }                                                                                                               
+               }
+               else
+               {
+                       EXTINT_CALLBACK_OP(msg.pin,edge);  
+                       Helios_ExtInt_Enable(msg.pin); 
+               }
+       }
+}
+#endif
 /// \classmethod \constructor(pin, mode, pull, callback)
 /// Create an ExtInt object:
 ///
@@ -240,15 +400,15 @@ STATIC const mp_arg_t pyb_extint_make_new_args[] = {
     { MP_QSTR_mode,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
     { MP_QSTR_pull,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
     { MP_QSTR_callback, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
-#if defined(BOARD_EG810MCN_GA_ALIPAY)|| defined(BOARD_EG810MCN_GA_VOLTE)
+#if defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE)
     { MP_QSTR_fast,    MP_ARG_INT, {.u_int = 0} },
 #endif
+       { MP_QSTR_filter_time, MP_ARG_INT, {.u_int = 0} },
 };
 #define PYB_EXTINT_MAKE_NEW_NUM_ARGS MP_ARRAY_SIZE(pyb_extint_make_new_args)
 
 STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
     // type_in == extint_obj_type
-
     // parse args
     mp_arg_val_t vals[PYB_EXTINT_MAKE_NEW_NUM_ARGS];
     mp_arg_parse_all_kw_array(n_args, n_kw, args, PYB_EXTINT_MAKE_NEW_NUM_ARGS, pyb_extint_make_new_args, vals);
@@ -287,12 +447,13 @@ STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        extint_struct.eint_cb = NULL;
        extint_struct.wakeup_eint_cb = eint_handler[self->line];
 
-       
+       Helios_ExtInt_Deinit((Helios_GPIONum) self->line);
+
        if(0 != Helios_ExtInt_Init((Helios_GPIONum) self->line,  &extint_struct)) {
                mp_raise_ValueError(MP_ERROR_TEXT("Interrupt initialization failed"));
        }
        
-#if defined(BOARD_EG810MCN_GA_ALIPAY)|| defined(BOARD_EG810MCN_GA_VOLTE)       
+#if defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE)
        if(vals[4].u_int == 1) {
                __fastIntGpio = self->line;
                Helios_ExtInt_FastSetGpio(__fastIntGpio);
@@ -302,10 +463,57 @@ STATIC mp_obj_t extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                        Helios_ExtInt_FastSetGpio(__fastIntGpio);
                }
        }
+       self->fliter_time = vals[5].u_int;
+#else
+       self->fliter_time = vals[4].u_int;
 #endif
 
-       extint_count_reset(self->line);
+       if (self->fliter_time < 0) 
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid fliter time value"));
+       }
+
+       if(self->fliter_time > 0)
+       {
+               if(!extint_fliter_timer[self->line]) 
+               {                                                                                                       
+                       extint_fliter_timer[self->line] = Helios_OSTimer_Create();                                                      
+                       if (!extint_fliter_timer[self->line]) 
+                       {                                                                                               
+                               mp_raise_ValueError(MP_ERROR_TEXT("error: extint fliter timer create failed!"));                                                                                                                        
+                       }                                                                                                                                                       
+               }
+       }
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+
+       if(extint_queue == 0)
+       {
+               extint_queue = Helios_MsgQ_Create(256, sizeof(extint_Msg));
+               if(extint_queue == 0)
+               {
+                       mp_raise_ValueError(MP_ERROR_TEXT("initialization failed"));
+               }
+       }
+       
+       if(thread_id == 0)
+       {
+               Helios_ThreadAttr ThreadAttr = 
+               {
+               .name = "machine_extint",
+               .stack_size = 2048,
+               .priority = 92,
+               .entry = extint_entry,
+               .argv = NULL
+           };
+               thread_id = Helios_Thread_Create(&ThreadAttr);
+               if(thread_id == 0)
+               {
+                       mp_raise_ValueError(MP_ERROR_TEXT("initialization failed"));
+               }
+       }
 
+#endif
+       extint_count_reset(self->line);
     return MP_OBJ_FROM_PTR(self);
 }
 
@@ -322,7 +530,7 @@ STATIC mp_obj_t extint_obj_read_count(mp_obj_t self_in, mp_obj_t is_reset) {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid is_reset value, must in [0,1]"));
        } 
 
-#if defined(BOARD_EG810MCN_GA_ALIPAY)|| defined(BOARD_EG810MCN_GA_VOLTE)
+#if defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE)
        int count = 0;
        if(__fastIntGpio == self->line) {
                count += Helios_ExtInt_FastGetCnt();
@@ -418,7 +626,8 @@ STATIC const mp_rom_map_elem_t extint_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GPIO0), MP_ROM_INT(HELIOS_GPIO0) },
 #if defined(PLAT_Qualcomm)
 #if defined(BOARD_BG95M1) || defined(BOARD_BG95M2) || defined(BOARD_BG95M3) \
- || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M3_LX)
+ || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M3_LX) \
+ || defined(BOARD_BG95M6) || defined(BOARD_BG95M8_SANX)
        { MP_ROM_QSTR(MP_QSTR_GPIO2), MP_ROM_INT(HELIOS_GPIO2) },
        { MP_ROM_QSTR(MP_QSTR_GPIO3), MP_ROM_INT(HELIOS_GPIO3) },
        { MP_ROM_QSTR(MP_QSTR_GPIO6), MP_ROM_INT(HELIOS_GPIO6) },
@@ -434,6 +643,14 @@ STATIC const mp_rom_map_elem_t extint_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GPIO19), MP_ROM_INT(HELIOS_GPIO19) },
        { MP_ROM_QSTR(MP_QSTR_GPIO20), MP_ROM_INT(HELIOS_GPIO20) },
        { MP_ROM_QSTR(MP_QSTR_GPIO21), MP_ROM_INT(HELIOS_GPIO21) },
+
+       { MP_ROM_QSTR(MP_QSTR_GPIO22), MP_ROM_INT(HELIOS_GPIO22) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO23), MP_ROM_INT(HELIOS_GPIO23) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO24), MP_ROM_INT(HELIOS_GPIO24) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO25), MP_ROM_INT(HELIOS_GPIO25) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO26), MP_ROM_INT(HELIOS_GPIO26) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO29), MP_ROM_INT(HELIOS_GPIO29) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO30), MP_ROM_INT(HELIOS_GPIO30) },
 #elif defined(BOARD_BG77)
     { MP_ROM_QSTR(MP_QSTR_GPIO1), MP_ROM_INT(HELIOS_GPIO1) },
        { MP_ROM_QSTR(MP_QSTR_GPIO2), MP_ROM_INT(HELIOS_GPIO2) },
@@ -452,6 +669,13 @@ STATIC const mp_rom_map_elem_t extint_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GPIO31), MP_ROM_INT(HELIOS_GPIO31) },
        { MP_ROM_QSTR(MP_QSTR_GPIO33), MP_ROM_INT(HELIOS_GPIO33) },
        { MP_ROM_QSTR(MP_QSTR_GPIO34), MP_ROM_INT(HELIOS_GPIO34) },
+
+       { MP_ROM_QSTR(MP_QSTR_GPIO35), MP_ROM_INT(HELIOS_GPIO35) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO36), MP_ROM_INT(HELIOS_GPIO36) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO39), MP_ROM_INT(HELIOS_GPIO39) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO40), MP_ROM_INT(HELIOS_GPIO40) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO42), MP_ROM_INT(HELIOS_GPIO42) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO43), MP_ROM_INT(HELIOS_GPIO43) },
 #elif defined(BOARD_BG600LM3)
     { MP_ROM_QSTR(MP_QSTR_GPIO1), MP_ROM_INT(HELIOS_GPIO1) },
        { MP_ROM_QSTR(MP_QSTR_GPIO2), MP_ROM_INT(HELIOS_GPIO2) },
@@ -463,6 +687,13 @@ STATIC const mp_rom_map_elem_t extint_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GPIO11), MP_ROM_INT(HELIOS_GPIO11) },
        { MP_ROM_QSTR(MP_QSTR_GPIO15), MP_ROM_INT(HELIOS_GPIO15) },
        { MP_ROM_QSTR(MP_QSTR_GPIO16), MP_ROM_INT(HELIOS_GPIO16) },
+
+       { MP_ROM_QSTR(MP_QSTR_GPIO17), MP_ROM_INT(HELIOS_GPIO17) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO18), MP_ROM_INT(HELIOS_GPIO18) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO19), MP_ROM_INT(HELIOS_GPIO19) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO20), MP_ROM_INT(HELIOS_GPIO20) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO23), MP_ROM_INT(HELIOS_GPIO23) },
+       { MP_ROM_QSTR(MP_QSTR_GPIO25), MP_ROM_INT(HELIOS_GPIO25) },
 #endif
 #else
 #if !defined(PLAT_ECR6600)
index f36615d..6bfa8bb 100644 (file)
@@ -40,6 +40,7 @@ typedef struct _machine_hard_spi_obj_t {
        uint32_t port;
        uint32_t mode;
        uint32_t clk;
+       unsigned char group;
 } machine_hard_spi_obj_t;
 
 STATIC void machine_hard_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -47,12 +48,14 @@ STATIC void machine_hard_spi_print(const mp_print_t *print, mp_obj_t self_in, mp
     mp_printf(print, "spi%d", self->port);
 }
 
-mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
-    enum { ARG_port, ARG_mode, ARG_clk };
+mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) 
+{
+    enum { ARG_port, ARG_mode, ARG_clk, ARG_group};
     static const mp_arg_t allowed_args[] = {
                { MP_QSTR_port, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
         { MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
                { MP_QSTR_clk, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+               { MP_QSTR_group,  MP_ARG_INT, {.u_int = 0} },
     };
 
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -61,6 +64,7 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz
        uint32_t port = args[ARG_port].u_int;
        uint32_t mode = args[ARG_mode].u_int;
        uint32_t clk = args[ARG_clk].u_int;
+       uint32_t group = args[ARG_group].u_int;
     int ret=0;
 
     if (port > HELIOS_SPI3) {
@@ -71,7 +75,7 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz
        mp_raise_ValueError(MP_ERROR_TEXT("mode must be (0~3)"));
     }
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        if (clk > 9) {
        mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~9)"));
     }
@@ -79,11 +83,16 @@ mp_obj_t machine_hard_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz
        if (clk > 39) {
        mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~39)"));
     }
-#elif defined(PLAT_Unisoc_8850)
+#elif defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
 if (clk > 14) 
 {
    mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~14)"));
 }
+#elif defined(PLAT_EIGEN)
+if (clk > 8) 
+{
+   mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~8)"));
+}
 #else
        if (clk > 6) {
           mp_raise_ValueError(MP_ERROR_TEXT("clk must be (0~6)"));
@@ -97,8 +106,12 @@ if (clk > 14)
        self->port = port;
        self->mode = mode;
        self->clk = clk;
-       
+       self->group = group;
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       ret = Helios_SPI_Init((Helios_SPINum) self->port, (Helios_SPIMode) self->mode, (uint32_t) self->clk,self->group);
+#else
        ret = Helios_SPI_Init((Helios_SPINum) self->port, (Helios_SPIMode) self->mode, (uint32_t) self->clk);
+#endif
        if(ret != 0) {
                mp_raise_ValueError(MP_ERROR_TEXT("spi init fail"));
        }
@@ -193,9 +206,10 @@ STATIC mp_obj_t machine_spi_write_read_mem(size_t n_args, const mp_obj_t *pos_ar
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_spi_write_read_obj, 1, machine_spi_write_read_mem);
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 /*******************************transfor fifo***************************************/
-#ifndef BOARD_EC600MCN_CC_EXT
+#if !(defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
 STATIC mp_obj_t machine_spi_write_block_mem(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) 
 {
     enum { ARG_databuf, ARG_datasize };
@@ -283,12 +297,23 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_spi_write_read_block_obj, 1, machine_s
 /****************************************end trans fifo**********************************************************/
 #endif
 
+STATIC mp_obj_t machine_spi_deinit(mp_obj_t self_in) 
+{
+    machine_hard_spi_obj_t *self = MP_OBJ_TO_PTR(self_in);
+       
+       int ret = Helios_SPI_Deinit((Helios_SPINum)self->port);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_spi_deinit_obj, machine_spi_deinit);
+
 STATIC const mp_rom_map_elem_t machine_spi_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&machine_spi_read_obj) },
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_spi_write_obj) },
        { MP_ROM_QSTR(MP_QSTR_write_read), MP_ROM_PTR(&machine_spi_write_read_obj) },
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
-#ifndef BOARD_EC600MCN_CC_EXT
+       { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&machine_spi_deinit_obj) },
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+#if !(defined(BOARD_EC600MCN_CC_EXT)  || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
        { MP_ROM_QSTR(MP_QSTR_write_read_block), MP_ROM_PTR(&machine_spi_write_read_block_obj) },
        { MP_ROM_QSTR(MP_QSTR_write_block), MP_ROM_PTR(&machine_spi_write_block_obj) },
        { MP_ROM_QSTR(MP_QSTR_read_block), MP_ROM_PTR(&machine_spi_read_block_obj) },
@@ -298,12 +323,25 @@ STATIC const mp_rom_map_elem_t machine_spi_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_SPI0), MP_ROM_INT(HELIOS_SPI0) },
 #endif         
 #if !defined(PLAT_RDA) && !defined(BOARD_EG915NEU_AC) \
-       && !defined(BOARD_EG915NEU_AG) && !defined(PLAT_ECR6600)
+       && !defined(BOARD_EG915NEU_AG) && !defined(PLAT_ECR6600) && !defined(BOARD_EG915NEU_AP) && !defined(BOARD_EG915NLA_AP)
     { MP_ROM_QSTR(MP_QSTR_SPI1), MP_ROM_INT(HELIOS_SPI1) },
 #endif
-#if defined(PLAT_ASR)     
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1602) || defined(BOARD_BG95M1) || defined(BOARD_BG95M2) || defined(BOARD_BG95M3) || defined(BOARD_BG95M6) \
+       || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M3_LX) || defined(BOARD_BG95M8_SANX) \
+       || defined(BOARD_BG95M8_SANX)
        { MP_ROM_QSTR(MP_QSTR_SPI2), MP_ROM_INT(HELIOS_SPI2) },
 #endif  
+#if defined(PLAT_EIGEN)
+       { MP_ROM_QSTR(MP_QSTR_CLK_812_5K), MP_ROM_INT(0) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_1_625M), MP_ROM_INT(1) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_3_25M), MP_ROM_INT(2) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_6_5M), MP_ROM_INT(3) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_13M), MP_ROM_INT(4) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_100K), MP_ROM_INT(5) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_200K), MP_ROM_INT(6) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_300K), MP_ROM_INT(7) },
+       { MP_ROM_QSTR(MP_QSTR_CLK_400K), MP_ROM_INT(8) },
+#endif
 };
 
 MP_DEFINE_CONST_DICT(mp_machine_hard_spi_locals_dict, machine_spi_locals_dict_table);
index 8799281..5eab1ff 100644 (file)
@@ -36,6 +36,7 @@ typedef struct _machine_hard_i2c_obj_t {
     mp_obj_base_t base;
        uint32_t bus_id;
        uint32_t fastmode;
+       unsigned char group;
 } machine_hard_i2c_obj_t;
 
 STATIC void machine_hard_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -44,10 +45,12 @@ STATIC void machine_hard_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp
 }
 
 mp_obj_t machine_hard_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
-    enum { ARG_id, ARG_fastmode };
+    int ret = 0;
+    enum { ARG_id, ARG_fastmode, ARG_group};
     static const mp_arg_t allowed_args[] = {
                { MP_QSTR_id, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
         { MP_QSTR_fastmode, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 1} },
+               { MP_QSTR_group,  MP_ARG_INT, {.u_int = 0} },
     };
 
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -55,6 +58,7 @@ mp_obj_t machine_hard_i2c_make_new(const mp_obj_type_t *type, size_t n_args, siz
 
        uint32_t bus_id = args[ARG_id].u_int;
        uint32_t fastmode = args[ARG_fastmode].u_int;
+       uint32_t group = args[ARG_group].u_int;
     
 
     if (bus_id > HELIOS_I2C3) {
@@ -66,9 +70,20 @@ mp_obj_t machine_hard_i2c_make_new(const mp_obj_type_t *type, size_t n_args, siz
     self->base.type = &machine_hard_i2c_type;
        self->bus_id = bus_id;
        self->fastmode = fastmode;
-       if(0 != Helios_I2C_Init((Helios_I2CEnum) self->bus_id, (Helios_I2CMode) self->fastmode)) {
-               return mp_const_false;
-       }
+    self->group = group;
+
+#if !defined(PLAT_EIGEN_718)   
+       Helios_I2C_Deinit((Helios_I2CEnum) self->bus_id);
+#endif
+#if defined(PLAT_aic8800m40)
+    ret = Helios_I2C_Init((Helios_I2CEnum) self->bus_id, (Helios_I2CMode) self->fastmode,self->group);
+#else
+    ret = Helios_I2C_Init((Helios_I2CEnum) self->bus_id, (Helios_I2CMode) self->fastmode);
+#endif
+    if(ret != 0)
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("i2c init fail"));
+    }
     return MP_OBJ_FROM_PTR(self);
 }
 STATIC const mp_arg_t machine_i2c_mem_allowed_args[] = {
@@ -144,36 +159,56 @@ STATIC mp_obj_t machine_i2c_read_mem(size_t n_args, const mp_obj_t *pos_args, mp
 
     return mp_obj_new_int(ret);
 }
+
+STATIC mp_obj_t machine_i2c_deinit(mp_obj_t self_in) 
+{
+    machine_hard_i2c_obj_t *self = MP_OBJ_TO_PTR(self_in);
+       
+       int ret = Helios_I2C_Deinit((Helios_I2CEnum) self->bus_id);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_i2c_deinit_obj, machine_i2c_deinit);
+
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_i2c_read_obj, 1, machine_i2c_read_mem);
 
 STATIC const mp_rom_map_elem_t machine_i2c_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&machine_i2c_read_obj) },
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_i2c_write_obj) },
+    { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&machine_i2c_deinit_obj) },
        // class constants
 #if !defined(BOARD_EG915NEU_AC) && !defined(BOARD_EG915NEU_AG) && !defined(BOARD_EG912UGL_AA) && !defined(BOARD_EC600ECN_LC) \
-       && !defined(BOARD_EC600ECN_LC_AEF) && !defined(BOARD_EC600ECN_LC_AUD)
+       && !defined(BOARD_EC600ECN_LC_AEF) && !defined(BOARD_EC600ECN_LC_AUD) && !defined(BOARD_EG915NEU_AP) && !defined(BOARD_EG915NLA_AP)
     { MP_ROM_QSTR(MP_QSTR_I2C0),       MP_ROM_INT(HELIOS_I2C0) }, 
 #endif
-#if !defined(PLAT_ASR_1803s) && !defined(BOARD_EC800MCN_LA) && !defined(BOARD_EC800MCN_GA) \
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc) && !defined(BOARD_EC800MCN_LA) && !defined(BOARD_EC800MCN_GA) \
        && !defined(BOARD_EC800NCN_LA) && !defined(BOARD_EC800NCN_LA_VOLTE) && !defined(BOARD_EC800MCN_LC) \
-       && !defined(BOARD_EC800ECN_LC) && !defined(BOARD_EC800MCN_LF) && !defined(BOARD_EC800MCN_GC) && !defined(BOARD_EC800ECN_LC_WDF)
+       && !defined(BOARD_EC800ECN_LC) && !defined(BOARD_EC800MCN_LF) && !defined(BOARD_EC800MCN_GC) && !defined(BOARD_EC800ECN_LC_WDF)\
+       && !defined(BOARD_FCM360W) && !defined(BOARD_EG800PCN_LA) && !defined(BOARD_EC800MCN_LF_CCG) && !defined(BOARD_EG800PCN_LA_ALIPAY)
     { MP_ROM_QSTR(MP_QSTR_I2C1),       MP_ROM_INT(HELIOS_I2C1) },
 #endif        
 #if !defined(PLAT_RDA) && !defined(BOARD_EC800NCN_LA) && !defined(BOARD_EC800NCN_LA_VOLTE) \
        && !defined(BOARD_EC600GCN_LD) && !defined(BOARD_EC600GCN_LD_YM)&& !defined(BOARD_EG915NEU_AC) && !defined(BOARD_EG915NEU_AG) \
-       && !defined(BOARD_EG912UGL_AA) && !defined(BOARD_EC600ECN_LC) && !defined(BOARD_EC800ECN_LC) && !defined(BOARD_EC800ECN_LC_WDF)
+       && !defined(BOARD_EG912UGL_AA) && !defined(BOARD_EC600ECN_LC) && !defined(BOARD_EC800ECN_LC) && !defined(BOARD_EC800ECN_LC_WDF) \
+       && !defined(BOARD_EG700GCN_LC) && !defined(BOARD_FCM360W) && !defined(BOARD_EG915NEU_AP) && !defined(BOARD_EG915NLA_AP)
     { MP_ROM_QSTR(MP_QSTR_I2C2),       MP_ROM_INT(HELIOS_I2C2) },
 #if !defined(PLAT_Qualcomm) && !defined(BOARD_EC800MCN_LA) && !defined(BOARD_EC800MCN_GA) \
-       && !defined(BOARD_EC800GCN_GA) && !defined(BOARD_EC800GCN_LD) \
-       && !defined(BOARD_EC800GCN_LD_HRXM) && !defined(BOARD_EG915NEU_AC) && !defined(BOARD_EG915NEU_AG)\
+       && !defined(BOARD_EC800GCN_GA) && !defined(BOARD_EC800GCN_LD) && !defined(BOARD_EC800GCN_LD_XBND) && !defined(BOARD_EC800GCN_TT)\
+       && !defined(BOARD_EC800GCN_LD_HRXM) && !defined(BOARD_EG915NEU_AC) && !defined(BOARD_EG915NEU_AG) && !defined(BOARD_EG915NEU_AP)\
        && !defined(BOARD_EC600MCN_LC) && !defined(BOARD_EC800MCN_LC) && !defined(BOARD_EG912UGL_AA) && !defined(BOARD_EC600ECN_LC) \
        && !defined(BOARD_EC800ECN_LC) && !defined(BOARD_EC600MCN_LF) && !defined(BOARD_EC800MCN_LF) && !defined(BOARD_EC800MCN_GC) && !defined(BOARD_EC800ECN_LC_WDF) \
-       && !defined(BOARD_EC600ECN_LC_AEF) && !defined(BOARD_EC800ECN_LC_AEF) && !defined(BOARD_EC800ECN_LC_AUD) && !defined(BOARD_EC600ECN_LC_AUD) && !defined(BOARD_EC600MCN_LF_SLPOC)
+       && !defined(BOARD_EC600ECN_LC_AEF) && !defined(BOARD_EC800ECN_LC_AEF) && !defined(BOARD_EC800ECN_LC_AUD) && !defined(BOARD_EC600ECN_LC_AUD) && !defined(BOARD_EC600MCN_LF_SLPOC) \
+       && !defined(BOARD_FCM360W) && !defined(BOARD_EG800PCN_LA) && !defined(BOARD_EC800MCN_LF_CCG) && !defined(BOARD_EG800PCN_LA_ALIPAY) && !defined(BOARD_EC600MCN_LF_SPISD)\
+    && !defined(BOARD_EG915NLA_AP) && !defined(BOARD_EG800GLA_LD)
     { MP_ROM_QSTR(MP_QSTR_I2C3),       MP_ROM_INT(HELIOS_I2C3) },
 #endif
 #endif
     { MP_ROM_QSTR(MP_QSTR_STANDARD_MODE),       MP_ROM_INT(HELIOS_STANDARD_MODE) },
     { MP_ROM_QSTR(MP_QSTR_FAST_MODE),       MP_ROM_INT(HELIOS_FAST_MODE) },
+#if defined(BOARD_FCM360W)
+       { MP_ROM_QSTR(MP_QSTR_ENHANCED_FAST_MODE),       MP_ROM_INT(HELIOS_ENHANCED_FAST_MODE) },
+#endif
+
+
 };
 
 MP_DEFINE_CONST_DICT(mp_machine_hard_i2c_locals_dict, machine_i2c_locals_dict_table);
index b73df1e..21dc883 100644 (file)
@@ -36,8 +36,9 @@
 
 #if defined (PLAT_ASR)
 #define MS_REFERENCE_VALUE 43  //ASR时间 该时间由EC600NCN_LC实际测试所得
-
-#elif defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#elif defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+#define MS_REFERENCE_VALUE 26  //ASR1803 该时间由EC200CN_DA实际测试所得
+#elif defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #define MS_REFERENCE_VALUE 76  //展锐时间,该时间由EC600UCN_LB实际测试所得 76
 
 #elif defined (PLAT_RDA)
 #elif defined (PLAT_Qualcomm)
 #define MS_REFERENCE_VALUE 122 //高通时间,该时间由BG95M3实际测试所得  (不可靠)
 
-#elif defined (PLAT_ASR_1606)
+#elif defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609)
+#define MS_REFERENCE_VALUE 26
+
+#elif defined (PLAT_ASR_1602)
 #define MS_REFERENCE_VALUE 26
 
+#elif defined (PLAT_EIGEN_718) //移芯时间,该时间由EC800ZCN_LD实际测试所得 30
+#define MS_REFERENCE_VALUE 30
 
 #else
        #error "This platform does not support"
@@ -259,7 +265,9 @@ STATIC uint8_t IIC_Read_Byte(uint8_t ack)
     for (i = 0; i < 8; i++)
     {
         IIC_SCL(1);
-        
+#if  defined(BOARD_EG912UGL_AC_CFF)    
+        uudelay(5);//modify for customer YILIAN,eg912u read pt1000 data error sometimes @jimmy 20240419
+#endif
         receive <<= 1;
         if (READ_SDA) {
             receive++;
@@ -329,21 +337,16 @@ STATIC int i2c_write(uint8_t slaveaddress, uint8_t *regaddr,size_t addrlen,uint8
 {
     uint32_t i;
     uint8_t t;
-       HELIOS_IIC_SIMULATION_LOG("i2c_write1\n");
     IIC_Start(); //起始条件,开始数据通信
-    HELIOS_IIC_SIMULATION_LOG("i2c_write14\n");
     //发送地址和数据读写方向
     t = (slaveaddress << 1) | 0; //低位为0,表示写数据
     IIC_SEND_BYTE(t);
-       HELIOS_IIC_SIMULATION_LOG("i2c_write2\n");
     //写入数据
     for (i = 0; i < addrlen; i++)
         IIC_SEND_BYTE(regaddr[i]);
-       HELIOS_IIC_SIMULATION_LOG("i2c_write3\n");
        
     for (i = 0; i < datalen; i++)
         IIC_SEND_BYTE(data[i]);
-       HELIOS_IIC_SIMULATION_LOG("i2c_write4\n");
     IIC_Stop(); //终止条件,结束数据通信
     return 0;
 }
index e482afd..737727a 100644 (file)
@@ -484,7 +484,7 @@ mp_obj_t key_extint_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_
                {
                .name = "machine_key",
                .stack_size = 2048,
-#if defined(PLAT_Unisoc)
+#if defined(PLAT_Unisoc) || defined(PLAT_EIGEN)
                .priority = 92,
 #else
                        .priority = 75,
index fe91a78..789b6ff 100644 (file)
@@ -39,7 +39,8 @@
 #include "helios_keypad.h"
 #include "helios_debug.h"
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)
+#if defined(BOARD_EC600MCN_LA_POC_XBND)   || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
 #include "helios_os.h"
 #include "poc.h"
 extern Helios_ThreadAttr thread_poc_speak_t;
@@ -78,69 +79,44 @@ uint32_t helios_keypad_callback_to_python(Helios_KeyPad_Event event)
            Keypad_t->row = event.param_01;                                                            
            Keypad_t->col = event.param_02;  
         Keypad_t->callback = *helios_keypad_callback;
-#if defined(BOARD_EC600MCN_LA_POC_XBND)//彬其 PTT按键按下 直接调poc_speak
-           unsigned char ptt_cb_no_report = 0;
-               unsigned char ptt_valid = 0;
-
-               for(i=0;i<5;i++)
-               {
-                       if(ptt_cfg.key_cfg[i].key_type == TYPE_KEYPAD)
-                       {
-                               if((event.param_01 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.row) 
-                                       && (event.param_02 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.col))
+#if defined(BOARD_EC600MCN_LA_POC_XBND)   || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND)\
+ || defined(BOARD_EC600MLA_LA_POC_XBND)//彬其 PTT按键按下 直接调poc_speak
+               if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
+               {                       
+                       for(i=0;i<5;i++)
+                       {
+                               if(ptt_cfg.key_cfg[i].key_type == TYPE_KEYPAD)
                                {
-                                       if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
+                                       if((event.param_01 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.row) 
+                                               && (event.param_02 == ptt_cfg.key_cfg[i].key_info.keypad_key_info.col))
                                        {
                                                if(ptt_cfg.pressed && ((ptt_cfg.pressed & (1<<i)) == 0)) 
                                                {
-                                                       ptt_cb_no_report = 1;//ptt 按键 在有其他按键按下时不再上报回调到python,也不做任何处理
+                                               
                                                }
                                                else
-                                               {       
-                                                       ptt_valid = 1;
-                                               }
-                                       }
-                                       else
-                                       {
-                                               ptt_cb_no_report = 1;
+                                               {
+                                                        unsigned char data = event.event_id; 
+                                                        if(data)//鎸変笅
+                                            {
+                                                                ptt_cfg.pressed |= 1 << i;     
+                                            }
+                                                        else//鏉惧紑
+                                                        {
+                                                                ptt_cfg.pressed &= ~(1 << i);
+                                                        }
+                                                        if(msg_poc_speak_t)
+                                                    {
+                                                                Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
+                                                    }
+                                               }                               
+                                               break;
                                        }
-                                       break;
                                }
                        }
                }
-
-               
-               if(ptt_cb_no_report == 0)
-               {
-                       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
-               }
-               
-               if(ptt_valid)
-               {
-                       unsigned char data = 0; 
-                       ptt_valid = 0;
-                        if(event.event_id == 1)//按下
-             {
-                                if(msg_poc_speak_t)
-                            {
-                                data = 1;
-                                        Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
-                                        ptt_cfg.pressed |= 1 << i;     
-                            }
-             }
-                        else//松开
-                        {
-                           if(msg_poc_speak_t)
-                           {   
-                               data = 0;
-                                       Helios_MsgQ_Put(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_NO_WAIT);
-                                       ptt_cfg.pressed &= ~(1 << i);
-                           }
-                        }
-               }
-#else
-           qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
 #endif
+           qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_KEYPAD, Keypad_t); 
 
         return 0;
        }
index 3a71da1..7c5031e 100644 (file)
@@ -46,7 +46,7 @@
 
 #include "helios_debug.h"
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 typedef void HeliosMPFILE;
 extern HeliosMPFILE* Helios_MP_fopen(const char* path_in, const char* mode_in);
 extern int Helios_MP_fread(void *buffer, size_t size, size_t num, HeliosMPFILE *file);
@@ -89,7 +89,8 @@ typedef struct machine_lcd_obj_struct
 } machine_lcd_obj_t;
 
 static machine_lcd_obj_t *self_lcd;
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850) \
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #define GET_FILE_VFS_PATH(x, y) get_vfs_path(x,y)
 #else
 #define GET_FILE_VFS_PATH(x, y)                                             \
@@ -146,7 +147,7 @@ STATIC mp_obj_t machine_lcd_brightness(mp_obj_t self_in, mp_obj_t data)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(machine_lcd_brightness_obj, machine_lcd_brightness);
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t machine_lcd_level_brightness(mp_obj_t self_in, mp_obj_t data1, mp_obj_t data2)
 {
        int ret = 0;
@@ -243,8 +244,7 @@ STATIC mp_obj_t machine_lcd_write_data(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lcd_write_data_obj, 3, 3, machine_lcd_write_data);
 
-
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
 STATIC mp_obj_t machine_lcd_set_offset(mp_obj_t self_in,const mp_obj_t obj_offset_x, const mp_obj_t obj_offset_y)
 {
        int ret = 0;
@@ -261,6 +261,7 @@ STATIC mp_obj_t machine_lcd_set_offset(mp_obj_t self_in,const mp_obj_t obj_offse
 STATIC MP_DEFINE_CONST_FUN_OBJ_3(machine_lcd_set_offset_obj, machine_lcd_set_offset);
 #endif
 
+
 STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args)
 {
        enum
@@ -284,6 +285,7 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
                ARG_RSTPin,
                ARG_TESel,
                ARG_TEPin,
+               ARG_enforce_init,
        };
        static const mp_arg_t allowed_args[] = {
        {MP_QSTR_initbuf, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
@@ -305,6 +307,7 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
        {MP_QSTR_SPIRST, MP_ARG_INT, {.u_int = 0}},
        {MP_QSTR_TESel, MP_ARG_BOOL, {.u_bool = false}},
        {MP_QSTR_TEPin, MP_ARG_INT, {.u_int = 7}},
+       {MP_QSTR_enforce_init, MP_ARG_BOOL, {.u_bool = false}},
        };
 
        mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -353,6 +356,10 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
        {
                init_data.te_pin = args[ARG_TEPin].u_int;
        }
+       if (args[ARG_TEPin].u_int)      // TE pin
+       {
+               init_data.init_flag = args[ARG_enforce_init].u_int;
+       }
        int Interface = args[ARG_Interface].u_int;
        
        if(Interface == INTERFACE_LCD) {
@@ -360,11 +367,18 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
                {
                case 0:
                        break;
+               case HELIOS_SPI_LCD_CLK_812_5K:
+               case HELIOS_SPI_LCD_CLK_1_625M:
+               case HELIOS_SPI_LCD_CLK_3_25M:
                case HELIOS_SPI_LCD_CLK_6_5M:
                case HELIOS_SPI_LCD_CLK_13M:
                case HELIOS_SPI_LCD_CLK_26M:
+#if defined (BOARD_EC800GCN_LD_XBND)
+                       init_data.clk = args[ARG_clk].u_int * 1000;
+#else
                case HELIOS_SPI_LCD_CLK_52M:
                        init_data.clk = args[ARG_clk].u_int;
+#endif                 
                        break;
                default:
                        mp_raise_ValueError("invalid clk");
@@ -438,19 +452,19 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
        spi_info.DCPin = args[ARG_DCPin].u_int;
        spi_info.RSTPin = args[ARG_RSTPin].u_int;
 
-#if defined(BOARD_EC600MCN_LF_SLPOC)
+
        HeliosFILE *fp = Helios_fopen("U:/logo.bin","r");
-       if(fp)
-       {
+       HeliosFILE *fp_e = Helios_fopen("E:/logo.bin","r"); //py侧需要在LCD初始化代码部分重新挂载一下flash,否则这句不生效
+       LCD_LOG("Logo fp:%p fp_e:%p\r\n", fp, fp_e);
+       if(fp || fp_e) {        
+               LCD_LOG("Logo has been exist!\r\n");
                init_data.is_logo_exist = 1;
                Helios_fclose(fp);
+               Helios_fclose(fp_e);
        }
-#endif
 
        ret = QPY_LCD_Init(&init_data, spi_info);
-
-       if (ret != 0)
-       {
+       if (ret != 0) {
                mp_raise_ValueError("init fail");
        }
        return mp_obj_new_int(ret);
@@ -458,12 +472,11 @@ STATIC mp_obj_t machine_lcd_init_helper(machine_lcd_obj_t *self, mp_uint_t n_arg
 
 STATIC mp_obj_t machine_lcd_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
 {
-       //is_first_make_new = 1;
        machine_lcd_init_helper(args[0], n_args - 1, args + 1, kw_args);
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_lcd_init_obj, 1, machine_lcd_init);
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t machine_MIPI_init_helper(machine_lcd_obj_t *self, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args)
 {
        enum
@@ -489,6 +502,7 @@ STATIC mp_obj_t machine_MIPI_init_helper(machine_lcd_obj_t *self, mp_uint_t n_ar
                ARG_frame_rate,
                ARG_te_sel,
                ARG_Rst_Polarity,
+               ARG_DsiPClkRate
        };
        static const mp_arg_t allowed_args[] = {
                {MP_QSTR_initbuf, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
@@ -512,6 +526,7 @@ STATIC mp_obj_t machine_MIPI_init_helper(machine_lcd_obj_t *self, mp_uint_t n_ar
                {MP_QSTR_FrameRate, MP_ARG_INT, {.u_int = 60}},
                {MP_QSTR_TESel, MP_ARG_BOOL, {.u_bool = false}},
                {MP_QSTR_RstPolarity, MP_ARG_INT, {.u_int = 1}},
+               {MP_QSTR_DsiPClkRate, MP_ARG_INT, {.u_int = 100}},
        };
 
        mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -552,6 +567,14 @@ STATIC mp_obj_t machine_MIPI_init_helper(machine_lcd_obj_t *self, mp_uint_t n_ar
        init_data.frame_rate = args[ARG_frame_rate].u_int;
        init_data.te_sel = args[ARG_te_sel].u_int;
        init_data.rst_Polarity = args[ARG_Rst_Polarity].u_int;
+       init_data.dsi_pclk_rate = args[ARG_DsiPClkRate].u_int;
+
+       if(init_data.dsi_pclk_rate != 75 && init_data.dsi_pclk_rate != 100 && init_data.dsi_pclk_rate != 125 &&
+               init_data.dsi_pclk_rate != 150 && init_data.dsi_pclk_rate != 200 && init_data.dsi_pclk_rate != 250 &&
+               init_data.dsi_pclk_rate != 300 && init_data.dsi_pclk_rate != 350 && init_data.dsi_pclk_rate != 400) {
+               mp_raise_ValueError("mipi dsi plck error. (75,100,125,150,200,250,300,350,400)");
+       }
+       
        if (0 != Helios_LCD_MIPIInit(&init_data))
        {
                mp_raise_ValueError("mipi init fail");
@@ -565,6 +588,43 @@ STATIC mp_obj_t machine_MIPI_init(size_t n_args, const mp_obj_t *args, mp_map_t
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_mipi_init_obj, 1, machine_MIPI_init);
+
+STATIC const mp_arg_t machine_mipi_mem_allowed_read_args[] = {
+    { MP_QSTR_regaddr, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+    { MP_QSTR_regaddr_len, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_databuf,     MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+    { MP_QSTR_datasize, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 8} },
+    { MP_QSTR_dalay, MP_ARG_INT, {.u_int = 0} },
+};
+
+STATIC mp_obj_t machine_mipi_read_mem(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+    enum { ARG_regaddr, ARG_regaddr_len, ARG_databuf, ARG_datasize, ARG_dalay };
+    mp_arg_val_t args[MP_ARRAY_SIZE(machine_mipi_mem_allowed_read_args)];
+    mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args,
+        MP_ARRAY_SIZE(machine_mipi_mem_allowed_read_args), machine_mipi_mem_allowed_read_args, args);
+               
+       machine_lcd_obj_t *self = (machine_lcd_obj_t *)MP_OBJ_TO_PTR(pos_args[0]);
+
+       mp_buffer_info_t regaddr_bufinfo;
+    mp_get_buffer_raise(args[ARG_regaddr].u_obj, &regaddr_bufinfo, MP_BUFFER_READ);
+    int regaddr_length = (size_t)args[ARG_regaddr_len].u_int > regaddr_bufinfo.len ? regaddr_bufinfo.len : (size_t)args[ARG_regaddr_len].u_int;
+    
+    // get the buffer to read the data into
+    mp_buffer_info_t bufinfo;
+    mp_get_buffer_raise(args[ARG_databuf].u_obj, &bufinfo, MP_BUFFER_WRITE);
+       int data_length = (size_t)args[ARG_datasize].u_int > bufinfo.len ? bufinfo.len : (size_t)args[ARG_datasize].u_int;
+       
+       int ret = Helios_LCD_MIPI_DSI_read((char*) regaddr_bufinfo.buf, (size_t) regaddr_length, (void*) bufinfo.buf, (size_t) data_length);
+       if (ret < 0) {
+        ret = -1;
+        return mp_obj_new_int(ret);
+    }
+
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_mipi_read_obj, 1, machine_mipi_read_mem);
+
+
 #endif
 STATIC mp_obj_t machine_lcd_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
 {
@@ -652,10 +712,10 @@ STATIC int check_format(char *path)
 #define CHECK_IS_JPEG(x) (check_format(x) == FORMAT_JPEG)
 #define CHEKC_IS_BIN(x) (check_format(x) == FORMAT_BIN)
 #define CHEKC_IS_JPG(x) (check_format(x) == FORMAT_JPG)
-#if !defined(PLAT_ASR_1606)
+#if !defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x, unsigned int start_y)
 {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        HeliosMPFILE *fileID = NULL;
 #else
        HeliosFILE *fileID = NULL;
@@ -675,7 +735,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
 
        GET_FILE_VFS_PATH(file_name, name);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        fileID = Helios_MP_fopen(name, "r");
 #else
        fileID = Helios_fopen(name, "r");
@@ -684,7 +744,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
        {
                return (-1);
        }
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        ret = Helios_MP_fread(head_data, 8, 1, fileID);
 #else
        ret = Helios_fread(head_data, 8, 1, fileID);
@@ -717,7 +777,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                        }
                        for (i = 0; i < (uint16_t)(height / ratio_width); i++)
                        {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                Helios_MP_fseek(fileID, 8 + ((uint16_t)(i * ratio_width)) * width * 2, f_SEEK_SET); //读取位置偏移
                                ret = Helios_MP_fread(data_temp, 2 * width, 1, fileID);                                                  //读取一行原始数据
 #else
@@ -727,7 +787,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                                
                                if (ret <= 0)
                                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                        Helios_MP_fclose(fileID);
 #else
                                        Helios_fclose(fileID);
@@ -765,7 +825,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                        }
                        for (i = 0; i < self_lcd->height; i++)
                        {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                Helios_MP_fseek(fileID, 8 + ((uint16_t)(i * ratio_height)) * width * 2, f_SEEK_SET);
                                ret = Helios_MP_fread(data_temp, 2 * width, 1, fileID);
 #else
@@ -774,7 +834,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
 #endif                         
                                if (ret <= 0)
                                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                        Helios_MP_fclose(fileID);
 #else
                                        Helios_fclose(fileID);
@@ -810,7 +870,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                        // LCD_LOG("pic width = %d\n, pic height = %d,malloc fail 3", width, height);
                        return (-2);
                }
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                ret = Helios_MP_fread(data, width * height * 2, 1, fileID);
 #else
                ret = Helios_fread(data, width * height * 2, 1, fileID);
@@ -818,7 +878,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                
                if (ret <= 0)
                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                        Helios_MP_fclose(fileID);
 #else
                        Helios_fclose(fileID);
@@ -833,7 +893,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
                ret = QPY_LCD_Write(data, start_x, start_y, width + start_x - 1, height + start_y - 1);
        }
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        Helios_MP_fclose(fileID);
 #else
        Helios_fclose(fileID);
@@ -854,7 +914,7 @@ static int Helios_lcd_write_data_by_file(char *file_name, unsigned int start_x,
 
 static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_x, unsigned int start_y, unsigned int width, unsigned int height)
 {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        HeliosMPFILE *fileID = NULL;
 #else
        HeliosFILE *fileID = NULL;
@@ -871,7 +931,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
        char name[256] = {0};
        GET_FILE_VFS_PATH(file_name, name);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        fileID = Helios_MP_fopen(name, "r");
 #else
        fileID = Helios_fopen(name, "r");
@@ -897,7 +957,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
                        }
                        for (i = 0; i < (uint16_t)(height / ratio_width); i++)
                        {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                Helios_MP_fseek(fileID, ((uint16_t)(i * ratio_width)) * width * 2, f_SEEK_SET); //读取位置偏移
                                ret = Helios_MP_fread(data_temp, 2 * width, 1, fileID);
 #else
@@ -907,7 +967,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
                                                                                 //读取一行原始数据
                                if (ret <= 0)
                                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                        Helios_MP_fclose(fileID);
 #else
                                        Helios_fclose(fileID);
@@ -946,7 +1006,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
                        }
                        for (i = 0; i < self_lcd->height; i++)
                        {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                Helios_MP_fseek(fileID, ((uint16_t)(i * ratio_width)) * width * 2, f_SEEK_SET); //读取位置偏移
                                ret = Helios_MP_fread(data_temp, 2 * width, 1, fileID);
 #else
@@ -955,7 +1015,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
 #endif
                                if (ret <= 0)
                                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                                        Helios_MP_fclose(fileID);
 #else
                                        Helios_fclose(fileID);
@@ -991,14 +1051,14 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
                        // LCD_LOG("pic width = %d\n, pic height = %d,malloc fail 6", width, height);
                        return (-3);
                }
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                ret = Helios_MP_fread(data, width * height * 2, 1, fileID);
 #else
                ret = Helios_fread(data, width * height * 2, 1, fileID);
 #endif
                if (ret <= 0)
                {
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                        Helios_MP_fclose(fileID);
 #else
                        Helios_fclose(fileID);
@@ -1014,7 +1074,7 @@ static int Helios_lcd_write_data_by_file_wh(char *file_name, unsigned int start_
                ret = QPY_LCD_Write(data, start_x, start_y, width + start_x - 1, height + start_y - 1);
        }
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
                Helios_MP_fclose(fileID);
 #else
                Helios_fclose(fileID);
@@ -1093,7 +1153,7 @@ STATIC mp_obj_t machine_lcd_show_jpeg(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lcd_show_jpeg_obj, 4, 4, machine_lcd_show_jpeg);
 #endif
-
+#if !(defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))
 STATIC mp_obj_t machine_lcd_show_data(size_t n_args, const mp_obj_t *args)
 {
 
@@ -1142,34 +1202,51 @@ STATIC mp_obj_t machine_lcd_show_data(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_lcd_show_obj, 4, 6, machine_lcd_show_data);
 #endif
+#endif
+
+#if defined(PLAT_ASR_1609)
+STATIC mp_obj_t machine_lcd_readid(mp_obj_t self_in,const mp_obj_t IDcmd)
+{
+       int ret = 0;
+       int id_cmd = mp_obj_get_int(IDcmd);
+
+    ret = Helios_LCD_ReadID((unsigned char)id_cmd);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(machine_lcd_read_id_obj, machine_lcd_readid);
+#endif
 
 
 STATIC const mp_rom_map_elem_t lcd_locals_dict_table[] = {
        {MP_ROM_QSTR(MP_QSTR_lcd_init), MP_ROM_PTR(&machine_lcd_init_obj)},
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        {MP_ROM_QSTR(MP_QSTR_mipi_init), MP_ROM_PTR(&machine_mipi_init_obj)},
+       {MP_ROM_QSTR(MP_QSTR_mipi_read), MP_ROM_PTR(&machine_mipi_read_obj)},
 #endif
        {MP_ROM_QSTR(MP_QSTR_lcd_clear), MP_ROM_PTR(&machine_lcd_clear_obj)},
-#if !defined(PLAT_ASR_1606)
+#if !(defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))
        {MP_ROM_QSTR(MP_QSTR_lcd_show), MP_ROM_PTR(&machine_lcd_show_obj)},
 #endif
        {MP_ROM_QSTR(MP_QSTR_lcd_brightness), MP_ROM_PTR(&machine_lcd_brightness_obj)},
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        {MP_ROM_QSTR(MP_QSTR_lcd_level_brightness), MP_ROM_PTR(&machine_lcd_level_brightness_obj)},
 #endif
        {MP_ROM_QSTR(MP_QSTR_lcd_write), MP_ROM_PTR(&machine_lcd_write_obj)},
-#if defined(PLAT_ASR_1606)
+#if defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) 
        {MP_ROM_QSTR(MP_QSTR_lcd_set_offset), MP_ROM_PTR(&machine_lcd_set_offset_obj)},
-#endif 
+#endif
        {MP_ROM_QSTR(MP_QSTR_lcd_display_on), MP_ROM_PTR(&machine_lcd_display_on_obj)},
        {MP_ROM_QSTR(MP_QSTR_lcd_display_off), MP_ROM_PTR(&machine_lcd_display_off_obj)},
        {MP_ROM_QSTR(MP_QSTR_lcd_write_cmd), MP_ROM_PTR(&machine_lcd_write_cmd_obj)},
        {MP_ROM_QSTR(MP_QSTR_lcd_write_data), MP_ROM_PTR(&machine_lcd_write_data_obj)},
-#if !defined(PLAT_ASR_1606)
+#if !(defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602))
 #ifdef CONFIG_JPEG
        {MP_ROM_QSTR(MP_QSTR_lcd_show_jpg), MP_ROM_PTR(&machine_lcd_show_jpeg_obj)},
 #endif
 #endif
+#if defined(PLAT_ASR_1609)
+       {MP_ROM_QSTR(MP_QSTR_readID), MP_ROM_PTR(&machine_lcd_read_id_obj)},
+#endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(lcd_locals_dict, lcd_locals_dict_table);
index 8dfd4b1..d099d82 100644 (file)
@@ -12,8 +12,7 @@
 #include "helios_debug.h"
 #include "helios_pin.h"
 #include "helios_gpio.h"
-#include "helios_one_wire.h"
-
+#include "helios_os.h"
 
 #define HELIOS_1WIRE_LOG(msg, ...)      custom_log("machine_one_wire", msg, ##__VA_ARGS__)
 /*******************************数据类型定义************************/
@@ -22,10 +21,8 @@ typedef struct _machine_1wire_obj_t
 {
     mp_obj_base_t base;
        uint8_t pin;
-    uint8_t  internal_pin;     //used by ql_gpio api
 } machine_one_wire_obj_t;
 
-
 enum {ARG_gpio};
 
 static const mp_arg_t bus_1wire_allowed_args[] = 
@@ -35,9 +32,151 @@ static const mp_arg_t bus_1wire_allowed_args[] =
 #define KEY_ARGS_TAB_SIZE MP_ARRAY_SIZE(bus_1wire_allowed_args)
 const mp_obj_type_t machine_one_wire_type;
 
+#define DIR_OUT(x) Helios_GPIO_SetDirection(x, HELIOS_GPIO_OUTPUT)
+#define DIR_IN(x)  Helios_GPIO_SetDirection(x, HELIOS_GPIO_INPUT)
+#define IO_OUT(x,y)  Helios_GPIO_SetLevel(x, y)
+#define READ_IO(x)   Helios_GPIO_GetLevel(x)
+
+static int Helios_1wire_Reset(Helios_GPIONum gpio_num)
+{
+       unsigned char i = 0;
+       unsigned char pin_level = 0;
+
+       //reset device
+       DIR_OUT(gpio_num);
+       IO_OUT(gpio_num,HELIOS_LVL_LOW);
+#if defined(PLAT_ASR_1606)
+       Helios_delay_us(550);
+#elif defined(PLAT_Unisoc)
+       Helios_delay_us(500);
+#elif defined(PLAT_ASR_1803s)//joey.zhou 1803s onewire
+       Helios_delay_us(600);//joey.zhou 1803s onewire
+
+#endif
+       IO_OUT(gpio_num,HELIOS_LVL_HIGH);
+       Helios_delay_us(15);
+
+       //check device
+       DIR_IN(gpio_num);       
+       do
+       {
+               pin_level = READ_IO(gpio_num);
+               i++;
+               Helios_delay_us(1);
+       }while(pin_level && i<240);
+
+       if(i>=240)
+       {
+               return -1;//no ack
+       }
+       
+       i = 0;
+
+       do
+       {
+               pin_level = READ_IO(gpio_num);
+               i++;
+               Helios_delay_us(1);
+       }while((pin_level==0) && i<240);
+       
+       if(i>=240)
+       {
+               return -1;
+       }
+
+       return 0;
+}
+
+static void Helios_1wire_Write_Bytes(Helios_GPIONum gpio_num,unsigned char *data,unsigned int len)
+{
+       unsigned char i = 0;
+       unsigned int j = 0;
+       unsigned char data_ = 0;
+       DIR_OUT(gpio_num);
+       uint32_t critical = 0;
+       critical = Helios_Critical_Enter();
+       for(j=0;j<len;j++)
+       {
+               data_ = data[j];
+               for(i=0;i<8;i++)
+               {
+                       if(data_&0x1)
+                       {
+                       IO_OUT(gpio_num,HELIOS_LVL_LOW);
+                               Helios_delay_us(2);
+                               IO_OUT(gpio_num,HELIOS_LVL_HIGH);
+#if defined(PLAT_ASR_1606)
+                               Helios_delay_us(60+40);
+#elif defined(PLAT_Unisoc)
+                               Helios_delay_us(60);
+#elif defined(PLAT_ASR_1803s)//joey.zhou 1803s onewire
+                               Helios_delay_us(60+40);//joey.zhou 1803s onewire
+#endif
+                       }
+                       else
+                       {
+                               IO_OUT(gpio_num,HELIOS_LVL_LOW);
+#if defined(PLAT_ASR_1606)
+                               Helios_delay_us(60+40);
+#elif defined(PLAT_Unisoc)
+                               Helios_delay_us(60);
+#elif defined(PLAT_ASR_1803s)//joey.zhou 1803s onewire
+                               Helios_delay_us(60+40);//joey.zhou 1803s onewire
+#endif
+                               IO_OUT(gpio_num,HELIOS_LVL_HIGH);
+                               Helios_delay_us(2);
+                       }
+                       data_ >>= 1;
+               }
+       }       
+       Helios_Critical_Exit(critical);
+}
+
+static unsigned char _read_bit(Helios_GPIONum gpio_num)
+{
+       unsigned char pin_level = 0;
+       DIR_OUT(gpio_num);
+       IO_OUT(gpio_num,HELIOS_LVL_LOW);
+       DIR_IN(gpio_num);
+#if defined(PLAT_ASR_1606)
+       Helios_delay_us(2);  //
+#elif defined(PLAT_Unisoc)
+       Helios_delay_us(2);//joey.zhou 1803s onewire
+#elif defined(PLAT_ASR_1803s)//joey.zhou 1803s onewire
+#endif
+       pin_level = READ_IO(gpio_num);
+#if defined(PLAT_ASR_1606)
+       Helios_delay_us(60+40);
+#elif defined(PLAT_Unisoc)
+       Helios_delay_us(60);
+#elif defined(PLAT_ASR_1803s)//joey.zhou 1803s onewire
+       Helios_delay_us(60+40);//joey.zhou 1803s onewire
+
+#endif
+       return pin_level;
+}
+
+static void Helio_1wire_Read_Bytes(Helios_GPIONum gpio_num,unsigned char * buf,unsigned int len)
+{
+       unsigned char i = 0;
+       unsigned int j  = 0;
+       uint32_t critical = 0;
+       critical = Helios_Critical_Enter();
+       for(j=0;j<len;j++)
+       {
+               for(i=0;i<8;i++)
+               {
+                       *buf |= (_read_bit(gpio_num) << i);
+               }
+               buf++;
+       }
+       Helios_Critical_Exit(critical);
+}
+
 mp_obj_t machine_1wire_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) 
 {      
        unsigned char internal_pin = 0;
+       Helios_GPIOInitStruct gpio_struct;
        // parse args
        mp_arg_val_t vals[KEY_ARGS_TAB_SIZE];
        mp_arg_parse_all_kw_array(n_args, n_kw, args, KEY_ARGS_TAB_SIZE, bus_1wire_allowed_args, vals);
@@ -51,12 +190,15 @@ mp_obj_t machine_1wire_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        
        self->base.type = &machine_one_wire_type;
 
-       if(Helios_1wire_Init((Helios_GPIONum)(vals[ARG_gpio].u_int),&internal_pin))
+       gpio_struct.dir = HELIOS_GPIO_OUTPUT;
+       gpio_struct.pull = HELIOS_PULL_NONE;
+       gpio_struct.value = HELIOS_LVL_HIGH;
+       if(Helios_GPIO_Init((Helios_GPIONum)(vals[ARG_gpio].u_int), &gpio_struct))
        {
                mp_raise_ValueError("initialization failed");
        }
+               
        self->pin = vals[ARG_gpio].u_int;
-       self->internal_pin = internal_pin;
 
     return MP_OBJ_FROM_PTR(self);
 }
@@ -64,7 +206,7 @@ mp_obj_t machine_1wire_make_new(const mp_obj_type_t *type, size_t n_args, size_t
 STATIC mp_obj_t bus_1wire_reset(mp_obj_t self_in) 
 {
     machine_one_wire_obj_t *self = MP_OBJ_TO_PTR(self_in);
-    int ret = Helios_1wire_Reset(self->internal_pin);
+    int ret = Helios_1wire_Reset(self->pin);
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(bus_1wire_reset_obj, bus_1wire_reset);
@@ -76,7 +218,7 @@ STATIC mp_obj_t bus_1wire_write_bytes(mp_obj_t self_in,mp_obj_t data)
        mp_buffer_info_t bufinfo;
        mp_get_buffer_raise(data, &bufinfo, MP_BUFFER_READ);
        int length = bufinfo.len;
-    Helios_1wire_Write_Bytes(self->internal_pin,(unsigned char*) bufinfo.buf,length);
+    Helios_1wire_Write_Bytes(self->pin,(unsigned char*) bufinfo.buf,length);
     return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(bus_1wire_write_bytes_obj, bus_1wire_write_bytes);
@@ -87,7 +229,7 @@ STATIC mp_obj_t bus_1wire_read_bytes(mp_obj_t self_in,mp_obj_t len)
        int data_len = mp_obj_get_int(len);
        vstr_t vstr;
        vstr_init_len(&vstr, data_len);
-    Helio_1wire_Read_Bytes(self->internal_pin,(unsigned char*) vstr.buf,data_len);
+    Helio_1wire_Read_Bytes(self->pin,(unsigned char*) vstr.buf,data_len);
     return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(bus_1wire_read_bytes_obj, bus_1wire_read_bytes);
@@ -95,8 +237,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(bus_1wire_read_bytes_obj, bus_1wire_read_bytes)
 STATIC mp_obj_t machine_1wire_deinit(mp_obj_t self_in) 
 {
     machine_one_wire_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       
-       int ret = Helios_1wire_Deinit((Helios_GPIONum)self->internal_pin);
+
+       int ret = Helios_GPIO_Deinit((Helios_GPIONum)self->pin);
        if (ret != 0)
        {
                HELIOS_1WIRE_LOG("1wire deinit failed.\r\n");
index 2b5b6f6..213d30b 100644 (file)
 #define GPIO_OBJ_DEF(n) {{&machine_pin_type}, HELIOS_GPIO##n, 0, 0, 0}
 #define PLAT_GPIO_OBJ_DEF(n) BOOST_PP_REPEAT_1(n,GPIO_OBJ_DEF)
 
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+typedef struct
+{
+       unsigned int high;//ms
+       unsigned int low;//ms
+       Helios_LvlMode start_lvl;
+       int count;
+       int count_send;
+       c_callback_t g_output_callback;
+}pulse_cfg_t;
+
+typedef struct
+{
+       c_callback_t callback;
+       Helios_LvlMode detect_lvl;
+       unsigned int time_min_ms;
+       unsigned int time_max_ms;
+       unsigned int count_target;
+       unsigned int count_non_target;
+       unsigned int pulse_number;
+}capture_cfg_t;
+#endif
 
 typedef struct _machine_pin_obj_t {
     mp_obj_base_t base;
@@ -41,6 +63,11 @@ typedef struct _machine_pin_obj_t {
        uint  dir;
        uint  pull;
        uint  value;
+       Helios_OSTimer_t timer;
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+       capture_cfg_t* cfg_t;//input
+       pulse_cfg_t* out_cfg_t;//output
+#endif
 } machine_pin_obj_t;
 
 const mp_obj_type_t machine_pin_type;
@@ -166,7 +193,12 @@ mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
                gpio_struct.value = self->value;
                Helios_GPIO_Init((Helios_GPIONum) self->pin, &gpio_struct);
        }
-       
+
+       self->timer = 0;
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+       self->cfg_t = NULL;
+       self->out_cfg_t = NULL;
+#endif
        HELIOS_PIN_LOG("pin init end\n");
     return MP_OBJ_FROM_PTR(self);
 }
@@ -265,11 +297,94 @@ STATIC mp_obj_t machine_pin_get_dir(mp_obj_t self_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_get_dir_obj, machine_pin_get_dir);
 
+static void __plink_timer_cb(void* self_in){
+       if(self_in) {
+               machine_pin_obj_t *self = self_in;
+               if(Helios_GPIO_GetLevel((Helios_GPIONum) self->pin) == HELIOS_LVL_LOW) {
+                       Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_HIGH);
+               } else {
+                       Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_LOW);
+               }
+       }
+}
+
+STATIC mp_obj_t machine_pin_blink(size_t n_args, const mp_obj_t *args) 
+{
+    machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+       int blink_switch = HELIOS_GPIO_BLINK_ON;
+       int period = 500;       //ms
+
+       if(HELIOS_GPIO_INPUT == Helios_GPIO_GetDirection((Helios_GPIONum) self->pin)) {
+               mp_raise_ValueError(MP_ERROR_TEXT("The use of this interface needs to set gpio to output mode"));
+       }
+
+       if(n_args > 2) {
+               blink_switch = mp_obj_get_int(args[1]);
+               period = mp_obj_get_int(args[2]);               
+       } else if(n_args == 2) {
+               blink_switch = mp_obj_get_int(args[1]);
+       }
+
+       if(blink_switch != HELIOS_GPIO_BLINK_ON && blink_switch != HELIOS_GPIO_BLINK_OFF) {
+               mp_raise_ValueError(MP_ERROR_TEXT("The switch parameter is wrongly passed. range [0,1]"));
+       }
+
+       Helios_OSTimerAttr timer_p = {period, 1, __plink_timer_cb, self};
+
+       if(blink_switch == HELIOS_GPIO_BLINK_ON) {
+               if(self->timer == 0) {
+                       self->timer = Helios_OSTimer_Create();
+                       if(self->timer == 0) {
+                               HELIOS_PIN_LOG("PIN Blink OStimer crete fail\n");
+                               return mp_obj_new_int(-1);
+                       }
+               }
+               if(Helios_GPIO_GetLevel((Helios_GPIONum) self->pin) == HELIOS_LVL_LOW) {
+                       Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_HIGH);
+               } else {
+                       Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_LOW);
+               }
+               Helios_OSTimer_Stop(self->timer);
+               if(0 != Helios_OSTimer_Start(self->timer, &timer_p)){
+                       HELIOS_PIN_LOG("PIN Blink OStimer start fail\n");
+                       return mp_obj_new_int(-1);
+               }               
+       } else {
+               if(self->timer) {
+                       Helios_OSTimer_Stop(self->timer);
+                       Helios_OSTimer_Delete(self->timer);
+                       self->timer = 0;
+               }
+       }
+
+    return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_blink_obj, 1, 3, machine_pin_blink);
+
+
 
 STATIC mp_obj_t machine_pin_deinit(mp_obj_t self_in) {
     machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
        //HELIOS_PIN_LOG("machine pin deinit.pin=%d.\r\n", self->pin);
+
+       if(self->timer) {
+               Helios_OSTimer_Stop(self->timer);
+               Helios_OSTimer_Delete(self->timer);
+               self->timer = 0;
+       }
        
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+       if(self->cfg_t)
+       {
+               free(self->cfg_t);
+               self->cfg_t = NULL;
+       }
+       if(self->out_cfg_t)
+       {
+               free(self->out_cfg_t);
+               self->out_cfg_t = NULL;
+       }       
+#endif
        machine_pin_obj[self->pin - 1] = NULL;
        
        int ret = Helios_GPIO_Deinit((Helios_GPIONum)self->pin);
@@ -282,6 +397,295 @@ STATIC mp_obj_t machine_pin_deinit(mp_obj_t self_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_deinit_obj, machine_pin_deinit);
 
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+
+void _timer_cb(void* ptr)
+{
+       Helios_OSTimerAttr attr={0};
+       if(ptr) 
+       {
+               machine_pin_obj_t *self = (machine_pin_obj_t *)ptr;
+
+               if(Helios_GPIO_GetLevel((Helios_GPIONum) self->pin) != self->out_cfg_t->start_lvl)
+               {
+                       if(self->out_cfg_t->count != -1)//un stop
+                       {
+                               self->out_cfg_t->count--;
+                       }
+                       attr.ms = self->out_cfg_t->start_lvl? self->out_cfg_t->high : self->out_cfg_t->low;
+                       self->out_cfg_t->count_send++;
+               }
+               else
+               {
+                       attr.ms = self->out_cfg_t->start_lvl? self->out_cfg_t->low : self->out_cfg_t->high;
+               }
+
+               if(self->out_cfg_t->count)
+               {
+                       if(Helios_GPIO_GetLevel((Helios_GPIONum) self->pin) == HELIOS_LVL_LOW) 
+                       {
+                               Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_HIGH);
+                       } 
+                       else 
+                       {
+                               Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_LOW);
+                       }
+
+                       attr.argv = ptr;
+                       attr.cb = _timer_cb;
+                       attr.cycle_enable = 0;
+                       
+                       Helios_OSTimer_Start(self->timer, &attr);                       
+               }
+               else
+               {
+                       Helios_GPIO_SetLevel((Helios_GPIONum) self->pin, HELIOS_LVL_LOW);
+                       Helios_OSTimer_Delete(self->timer);
+                       self->timer = 0;
+
+                   GC_STACKTOP_SET();
+                       mp_obj_t tuple[4] = 
+                       {
+                               mp_obj_new_int(self->out_cfg_t->high),
+                               mp_obj_new_int(self->out_cfg_t->low),
+                               mp_obj_new_int(self->out_cfg_t->start_lvl),
+                               mp_obj_new_int(self->out_cfg_t->count_send),
+                       };
+
+                       mp_sched_schedule_ex(&self->out_cfg_t->g_output_callback, mp_obj_new_tuple(4,tuple));
+                       GC_STACKTOP_CLEAR();
+               }
+       }
+}
+
+STATIC mp_obj_t pulse_output(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
+{      
+       int ret;
+       machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+       Helios_OSTimerAttr timer_attr = {0};
+               
+    enum 
+       {
+      //  ARG_gpio,
+               ARG_high,       
+        ARG_low,
+        ARG_start_lvl,
+        ARG_count,
+        ARG_callback,
+    };
+    static const mp_arg_t allowed_args[] = 
+       {
+       // { MP_QSTR_gpio,         MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0xff} },
+        { MP_QSTR_high_time,         MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100} },//ms
+        { MP_QSTR_low_time,         MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100} },//ms
+        { MP_QSTR_start_lvl,           MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = HELIOS_LVL_LOW} },
+        { MP_QSTR_count,        MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} },
+        { MP_QSTR_callback,        MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+    };
+       
+    mp_arg_val_t args_parse[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args-1, args+1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args_parse);
+
+       if(self->out_cfg_t == NULL)
+       {
+               self->out_cfg_t = (pulse_cfg_t*)malloc(sizeof(pulse_cfg_t));
+               if(self->out_cfg_t == NULL)
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+
+       self->out_cfg_t->count = args_parse[ARG_count].u_int;
+       self->out_cfg_t->high = args_parse[ARG_high].u_int;
+       self->out_cfg_t->low = args_parse[ARG_low].u_int;
+       self->out_cfg_t->start_lvl = args_parse[ARG_start_lvl].u_int;
+       self->out_cfg_t->count_send = 0;
+    memset(&self->out_cfg_t->g_output_callback, 0, sizeof(c_callback_t));
+       mp_sched_schedule_callback_register(&self->out_cfg_t->g_output_callback, args_parse[ARG_callback].u_obj);
+
+       Helios_GPIO_SetLevel((Helios_GPIONum)self->pin, self->out_cfg_t->start_lvl? HELIOS_LVL_HIGH : HELIOS_LVL_LOW);
+
+       if(self->timer == 0)
+       {
+               self->timer = Helios_OSTimer_Create();  
+               if(self->timer == 0)
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+       else
+       {
+               if(Helios_OSTimer_Stop(self->timer))
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+       
+       timer_attr.ms = self->out_cfg_t->start_lvl? self->out_cfg_t->high : self->out_cfg_t->low;
+       timer_attr.cycle_enable = 0;
+       timer_attr.cb = _timer_cb;
+       timer_attr.argv = self;
+       ret = Helios_OSTimer_Start(self->timer, &timer_attr);
+       return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pulse_output_obj, 1, pulse_output);
+
+#if defined(PLAT_EIGEN)
+//input capture
+#define TIMER_INTERVAL_MS 2
+#else
+#define TIMER_INTERVAL_MS 5
+#endif
+void _cap_timer_cb(void* ptr)
+{
+       if(ptr) 
+       {
+               machine_pin_obj_t *self = ptr;
+
+               if(Helios_GPIO_GetLevel((Helios_GPIONum) self->pin) == self->cfg_t->detect_lvl)
+               {       
+                       if((self->cfg_t->count_target != 0) && (self->cfg_t->count_non_target != 0))
+                       {
+                               self->cfg_t->count_target = 0;
+                       }
+
+                       self->cfg_t->count_target++;
+                       self->cfg_t->count_non_target = 0;
+               }
+               else
+               {
+                       self->cfg_t->count_non_target++;
+                       
+                       if(self->cfg_t->count_target*TIMER_INTERVAL_MS < self->cfg_t->time_min_ms)//under min_time, shake
+                       {
+                               self->cfg_t->count_target = 0;
+                               self->cfg_t->count_non_target = 0;
+                       }
+                       
+                       if(self->cfg_t->count_non_target >= 5)
+                       {
+                               if(self->cfg_t->count_target*TIMER_INTERVAL_MS <= self->cfg_t->time_max_ms)
+                               {
+                                       self->cfg_t->pulse_number++;
+                                       if(&self->cfg_t->callback)
+                                       {
+                                           mp_sched_schedule_ex(&self->cfg_t->callback, mp_obj_new_int(self->cfg_t->pulse_number));
+                                       }
+                               }
+                               else
+                               {
+
+                               }
+                               
+                               self->cfg_t->count_target = 0;
+                               self->cfg_t->count_non_target = 0;
+                       }
+               }
+       }
+}
+
+STATIC mp_obj_t pulse_capture_start(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
+{      
+       int ret;
+       machine_pin_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+       Helios_OSTimerAttr timer_attr = {0};
+               
+    enum 
+       {
+               ARG_detect_lvl, 
+        ARG_min_ms,
+        ARG_max_ms,
+        ARG_callback,
+    };
+    static const mp_arg_t allowed_args[] = 
+       {
+        { MP_QSTR_detect_lvl,       MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = HELIOS_LVL_HIGH} },
+        { MP_QSTR_min_ms,              MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 20} },
+        { MP_QSTR_max_ms,              MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100} },
+        { MP_QSTR_callback,                    MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+    };
+       
+    mp_arg_val_t args_parse[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args-1, args+1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args_parse);
+
+       if(self->cfg_t == NULL)
+       {
+               self->cfg_t = (capture_cfg_t*)malloc(sizeof(capture_cfg_t));
+               if(self->cfg_t == NULL)
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+
+       self->cfg_t->detect_lvl = args_parse[ARG_detect_lvl].u_int;
+       self->cfg_t->time_min_ms = args_parse[ARG_min_ms].u_int;
+       self->cfg_t->time_max_ms = args_parse[ARG_max_ms].u_int;
+       self->cfg_t->count_target = 0;
+       self->cfg_t->count_non_target = 0;
+       self->cfg_t->pulse_number = 0;
+       mp_sched_schedule_callback_register(&self->cfg_t->callback, args_parse[ARG_callback].u_obj);
+
+       if(self->timer == 0)
+       {
+               self->timer = Helios_OSTimer_Create();
+               
+               if(self->timer == 0)
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+       else
+       {
+               if(Helios_OSTimer_Stop(self->timer))
+               {
+                       return mp_obj_new_int(-1);
+               }
+       }
+       
+       timer_attr.ms = TIMER_INTERVAL_MS;
+       timer_attr.cycle_enable = 1;
+       timer_attr.cb = _cap_timer_cb;
+       timer_attr.argv = self;
+       ret = Helios_OSTimer_Start(self->timer, &timer_attr);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(pulse_capture_start_obj, 1, pulse_capture_start);
+
+STATIC mp_obj_t pulse_capture_stop(mp_obj_t self_in)
+{      
+       int ret = 0;
+       machine_pin_obj_t *self = self_in;
+
+       if(self->timer)
+       {
+               ret = Helios_OSTimer_Stop(self->timer);
+               Helios_OSTimer_Delete(self->timer);
+               self->timer = 0;
+       }
+
+       if(self->cfg_t)
+       {
+               free(self->cfg_t);
+               self->cfg_t = NULL;
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(pulse_capture_stop_obj, pulse_capture_stop);
+
+STATIC mp_obj_t pulse_capture_reset(mp_obj_t self_in)
+{      
+       machine_pin_obj_t *self = self_in;
+
+       if(self->cfg_t)
+       {
+               self->cfg_t->pulse_number = 0;
+       }
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(pulse_capture_reset_obj, pulse_capture_reset);
+
+#endif
 
 STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
     // instance methods
@@ -294,6 +698,7 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_read),    MP_ROM_PTR(&machine_pin_read_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_dir),    MP_ROM_PTR(&machine_pin_set_dir_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_dir),    MP_ROM_PTR(&machine_pin_get_dir_obj) },
+    { MP_ROM_QSTR(MP_QSTR_blink),    MP_ROM_PTR(&machine_pin_blink_obj) },
     // class constants 
     //GPIO DEFINE
     { MP_ROM_QSTR(MP_QSTR_IN),        MP_ROM_INT(HELIOS_GPIO_INPUT) },
@@ -301,6 +706,14 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_PULL_PU),   MP_ROM_INT(HELIOS_PULL_UP) },
     { MP_ROM_QSTR(MP_QSTR_PULL_PD),   MP_ROM_INT(HELIOS_PULL_DOWN) },
        { MP_ROM_QSTR(MP_QSTR_PULL_DISABLE), MP_ROM_INT(HELIOS_PULL_NONE) },
+       { MP_ROM_QSTR(MP_QSTR_BLINK_ON), MP_ROM_INT(HELIOS_GPIO_BLINK_ON) },
+       { MP_ROM_QSTR(MP_QSTR_BLINK_OFF), MP_ROM_INT(HELIOS_GPIO_BLINK_OFF) },
+#if defined(PLAT_EIGEN) || defined(PLAT_ASR_1602)
+       { MP_ROM_QSTR(MP_QSTR_pulse_gen), MP_ROM_PTR(&pulse_output_obj) },
+       { MP_ROM_QSTR(MP_QSTR_pulse_cap_start), MP_ROM_PTR(&pulse_capture_start_obj) },
+       { MP_ROM_QSTR(MP_QSTR_pulse_cap_stop), MP_ROM_PTR(&pulse_capture_stop_obj) },
+       { MP_ROM_QSTR(MP_QSTR_pulse_cap_reset), MP_ROM_PTR(&pulse_capture_reset_obj) },
+#endif
 #if !defined(PLAT_ECR6600)
        PLAT_GPIO_DEF(PLAT_GPIO_NUM),
 #endif
@@ -323,3 +736,5 @@ const mp_obj_type_t machine_pin_type = {
 };
 
 #endif
+
+
index e482aa0..56d56ea 100644 (file)
@@ -123,7 +123,7 @@ STATIC mp_obj_t machine_rtc_datetime(mp_uint_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_rtc_datetime_obj, 1, 2, (mp_obj_t)machine_rtc_datetime);
 
-#if !defined(BOARD_BG95M8)
+#if !(defined(BOARD_BG95M3) || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M6) || defined(BOARD_BG95M8_SANX))
 STATIC mp_obj_t  machine_rtc_set_alarm(mp_obj_t self_in, mp_obj_t time)
 {
        Helios_RTCTime tm = {0};
@@ -209,7 +209,7 @@ STATIC const mp_rom_map_elem_t machine_rtc_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_rtc_init_obj) },
        { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_rtc_deinit_obj) },
     { MP_ROM_QSTR(MP_QSTR_datetime), MP_ROM_PTR(&machine_rtc_datetime_obj) },
-#if !defined(BOARD_BG95M8) && !defined(BOARD_BG95M9)
+#if !(defined(BOARD_BG95M3) || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M6) || defined(BOARD_BG95M8_SANX))
     { MP_ROM_QSTR(MP_QSTR_set_alarm), MP_ROM_PTR(&machine_rtc_set_alarm_obj) },
     { MP_ROM_QSTR(MP_QSTR_enable_alarm), MP_ROM_PTR(&machine_rtc_enable_alarm_obj) },
 #endif
index e90a0b9..b140805 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "helios_timer.h"
 #include "helios_debug.h"
+#include "callbackdeal.h"
 
 
 typedef unsigned long int UINT32;
@@ -73,13 +74,22 @@ STATIC void machine_timer_print(const mp_print_t *print, mp_obj_t self_in, mp_pr
     HELIOS_TIMER_LOG("timer_id=%d\r\n", self->timer_id);
 }
 
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)//forrest.liu@20231228 add for FAE-102027 dump issue
+#define HELIOS_TIMER_MAX_NUM (4)
+static st_CallBack_Timer Timer_t[HELIOS_TIMER_MAX_NUM] = {{{0,0,0,0}},{{0,0,0,0}},{{0,0,0,0}},{{0,0,0,0}}};
+#endif
 
 STATIC void machine_timer_isr(UINT32 self_in) {
 
     machine_timer_obj_t *self = (void*)self_in;
        if(self != NULL)
        {
-       mp_sched_schedule_ex(&self->callback, self);
+    #if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)//forrest.liu@20231228 modify for FAE-102027 dump issue
+           Timer_t[self->timer_id].callback = self->callback;
+           qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_TIMER, &Timer_t[self->timer_id]); 
+       #else
+               mp_sched_schedule_ex(&self->callback, self);
+       #endif
        }
 
 }
@@ -189,11 +199,18 @@ STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args,
             return t;
         }
     }
+#if !defined(PLAT_aic8800m40)   
        if ((timer_id < 0) || (timer_id > 3))
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, Timern should be in (Timer0~Timer3)."));
        }
-       
+#else
+       if ((timer_id < 0) || (timer_id > 1))
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, Timern should be in (Timer0~Timer1)."));
+       }
+#endif
+
        machine_timer_obj_t *self = m_new_obj(machine_timer_obj_t);
     self->base.type = &machine_timer_type;
        self->timer_id = timer_id;
index e126a6d..6690880 100644 (file)
@@ -99,7 +99,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
     }
 
     // get data bits
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        switch (args[ARG_bits].u_int) {
         case 8:
             self->config.data_bit = HELIOS_UART_DATABIT_8;
@@ -138,7 +138,7 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
         case 2:
             self->config.parity_bit = HELIOS_UART_PARITY_ODD;
             break;
-               #if defined(PLAT_ASR_1606)
+               #if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                case 3:
             self->config.parity_bit = HELIOS_UART_PARITY_MARK;
             break;     
@@ -248,21 +248,34 @@ STATIC mp_obj_t machine_uart_any(mp_obj_t self_in) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_uart_any_obj, machine_uart_any);
 
-#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
-STATIC mp_obj_t machine_uart_485_control(mp_obj_t self_in,mp_obj_t gpio_n,mp_obj_t direc) {
+#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) \
+       || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_aic8800m40) || defined(PLAT_Unisoc_8910_R06)
+enum{ARG_self, ARG_gipo_n, ARG_direc, ARG_block};
+STATIC mp_obj_t machine_uart_485_control(mp_uint_t n_args, const mp_obj_t *args){
        int ret = -1;
-    machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       if ( !(mp_obj_is_small_int(gpio_n) && mp_obj_is_small_int(direc)) ){
-               return mp_obj_new_int(ret);
+       if(n_args < 3)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid parameter"));
        }
-       size_t gpio = mp_obj_get_int(gpio_n);
-       Helios_UART_Direc dire = (Helios_UART_Direc)mp_obj_get_int(direc);
+       machine_uart_obj_t *self = MP_OBJ_TO_PTR(args[ARG_self]);
+       size_t gpio = mp_obj_get_int(args[ARG_gipo_n]);
+       Helios_UART_Direc dire = (Helios_UART_Direc)mp_obj_get_int(args[ARG_direc]);
        ret = Helios_UART_SetCtl_485(self->uart_num,gpio,dire);
-    return mp_obj_new_int(ret);
+#if defined(PLAT_Unisoc_8850)
+       int set = 0;
+       if(n_args >= 4)
+       {
+               set = mp_obj_get_int(args[ARG_block]);
+       }
+       Helios_UART_SetBlockMode_485((char)set);
+#endif
+       return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(machine_uart_485_control_obj, machine_uart_485_control);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_uart_485_control_obj, 3, 4, (mp_obj_t)machine_uart_485_control);
+
 #endif
 
+
 /*
 STATIC mp_obj_t machine_uart_sendbreak(mp_obj_t self_in) {
     machine_uart_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -324,7 +337,7 @@ STATIC mp_obj_t helios_uart_deinit(mp_obj_t self_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_uart_deinit_obj, helios_uart_deinit);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 STATIC mp_obj_t machine_uart_rx_disable(mp_obj_t self_in,mp_obj_t set) 
 {
     int ret = -1;
@@ -358,11 +371,14 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
 #if defined(PLAT_RDA)
        { MP_ROM_QSTR(MP_QSTR_UART1), MP_ROM_INT(HELIOS_UART1) },
 #endif
-#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) \
+    || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_aic8800m40) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_control_485), MP_ROM_PTR(&machine_uart_485_control_obj) },
        PLAT_GPIO_DEF(PLAT_GPIO_NUM),
 #endif
-#if defined (PLAT_ASR) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) 
+#if defined (PLAT_ASR) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) \
+    || defined(PLAT_ASR_1602) || defined(PLAT_ECR6600) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(BOARD_BC32RA) || defined(BOARD_BC92RB) \
+    || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
     { MP_ROM_QSTR(MP_QSTR_UART0), MP_ROM_INT(HELIOS_UART0) },
 #endif
 
@@ -379,22 +395,26 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
 #if defined(PLAT_Qualcomm) \
        || defined (PLAT_Unisoc) \
        || defined(PLAT_Unisoc_8910_R05) \
+       || defined(PLAT_Unisoc_8910_R06) \
        || defined(BOARD_EC600GCN_LD) \
     || defined(BOARD_EC600GCN_LA) \
+    || defined(BOARD_EC600GCN_LA_CDD) \
        || defined(BOARD_EC600GCN_LD_YM) \
+       || defined(BOARD_EG700GCN_LC) \
+       || defined (PLAT_ASR) \
     || MICROPY_QPY_UART4
        { MP_ROM_QSTR(MP_QSTR_UART4), MP_ROM_INT(HELIOS_UART4) },
 #endif
 
-#if defined(PLAT_Unisoc_8850) || MICROPY_QPY_USB_DOUBLE_CDC
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || MICROPY_QPY_USB_DOUBLE_CDC
     { MP_ROM_QSTR(MP_QSTR_UART5), MP_ROM_INT(HELIOS_UART5) },
 #endif
 
-#if defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
     { MP_ROM_QSTR(MP_QSTR_UART6), MP_ROM_INT(HELIOS_UART6) },
 #endif
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
     { MP_ROM_QSTR(MP_QSTR_rx_auto_disable), MP_ROM_PTR(&machine_uart_rx_disable_obj) },
 #endif
     { MP_ROM_QSTR(MP_QSTR_REPL_UART), MP_ROM_INT(QPY_REPL_UART) },
index 206eb94..db53a35 100644 (file)
@@ -134,18 +134,25 @@ STATIC const mp_rom_map_elem_t misc_adc_locals_dict_table[] = {
     && !defined(BOARD_EC600NCN_LC) && !defined(BOARD_EC600NCN_LF) \
     && !defined(BOARD_EC600NCN_LD) && !defined(BOARD_EC600NCN_LD_SL) \
     && !defined(BOARD_EC600NCN_AA) && !defined(BOARD_EC600SCN_LA) \
-    && !defined(BOARD_EC600SCN_LB) && !defined(BOARD_EC600SCN_LB_JTY)//2022-09-09 原因:EC600N和EC600S系列仅支持ADC0,不显示其他通道 @rreinhardt.peng
+    && !defined(BOARD_EC600SCN_LB) && !defined(BOARD_EC600SCN_LB_JTY) \
+    && !defined(BOARD_BC32RA) && !defined(BOARD_BC92RB)//2022-09-09 原因:EC600N和EC600S系列仅支持ADC0,不显示其他通道 @rreinhardt.peng
     { MP_ROM_QSTR(MP_QSTR_ADC1), MP_ROM_INT(ADC1) },
-#if !defined(PLAT_Unisoc_8850) && !defined(BOARD_EC600NCN_LA) \
+#if !defined(BOARD_EC600NCN_LA) \
     && !defined(BOARD_EC600NCN_LE) && !defined(BOARD_EC600NCN_LE_JTY) \
     && !defined(BOARD_EC600NCN_LC) && !defined(BOARD_EC600NCN_LF) \
     && !defined(BOARD_EC600NCN_LD) && !defined(BOARD_EC600NCN_LD_SL) \
     && !defined(BOARD_EC600NCN_AA) && !defined(BOARD_EC600SCN_LA) \
     && !defined(BOARD_EC600SCN_LB) && !defined(BOARD_EC600SCN_LB_JTY) \
     && !defined(BOARD_EC600MCN_LC) && !defined(BOARD_EC800MCN_LC) \
-    && !defined(BOARD_EC600MCN_LF) && !defined(BOARD_EC800MCN_LF) && !defined(BOARD_EC800MCN_GC) && !defined(BOARD_EC600MCN_LF_SLPOC)
+    && !defined(BOARD_EC600MCN_LF) && !defined(BOARD_EC800MCN_LF) \
+    && !defined(BOARD_EC800MCN_GC) && !defined(BOARD_EC600MCN_LF_SLPOC) \
+    && !defined(BOARD_EG800PCN_LA) && !defined(BOARD_BC32RA) && !defined(BOARD_BC92RB) \
+    && !defined(BOARD_EC800MCN_LF_CCG) && !defined(BOARD_EC600MCN_LF_SPISD) \
+    && !defined(BOARD_EC800GCN_GA) && !defined(BOARD_EC800GCN_GA_MS) && !defined(BOARD_EC800GCN_LD)  && !defined(BOARD_EC800GCN_LD_XBND)\
+       && !defined(BOARD_EC800GCN_LD_HRXM) && !defined(BOARD_EC800GCN_LB) && !defined(BOARD_EC800GCN_GA_VOLTE) && !defined(BOARD_EG800PCN_LA_ALIPAY)\
+    && !defined(BOARD_EC800GCN_TT) && !defined(BOARD_EG800GLA_LD)
     { MP_ROM_QSTR(MP_QSTR_ADC2), MP_ROM_INT(ADC2) },
-#if !defined(PLAT_ECR6600)
+#if !defined(PLAT_ECR6600) && !defined(BOARD_BC32RA) && !defined(BOARD_BC92RB)
     { MP_ROM_QSTR(MP_QSTR_ADC3), MP_ROM_INT(ADC3) },
 #endif 
 #endif
index b1cac1e..589c08e 100644 (file)
@@ -91,20 +91,67 @@ STATIC mp_obj_t misc_power_get_batt()
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(misc_power_get_batt_obj, misc_power_get_batt);
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
-STATIC mp_obj_t misc_power_set_CAMVDD_ON(mp_obj_t on_off)
+
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06)
+STATIC mp_obj_t misc_power_set_CAMVDD_ON(size_t n_args, const mp_obj_t *args)
 {
-       int value = mp_obj_get_int(on_off);
-       if(value != 0 && value != 1) {
+       int value;
+       int ret = 0;
+       value = mp_obj_get_int(args[0]);
+
+       if(value != 0 && value != 1) 
+       {
                return mp_obj_new_int(-1);
        }
-       Helios_Power_CAM_VDD_output((uint8_t)value);
-       return mp_obj_new_int(0);
+       
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) 
+       Helios_cameraVDD_t vol = HELIOS_CAM_VDD_2V80;
+       unsigned char lp_enabled = 0;
+       if(n_args == 2)
+       {
+               vol =  mp_obj_get_int(args[1]);
+       }
+       else if(n_args == 3)
+       {
+               vol =  mp_obj_get_int(args[1]);
+               lp_enabled = mp_obj_get_int(args[2]);
+       }
+#else
+    if(n_args > 1)
+    {
+               mp_raise_ValueError(MP_ERROR_TEXT("extra para gived."));
+    }
+#endif
+       
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) 
+       ret = Helios_Power_CAM_VDD_output(value, vol, lp_enabled);
+#else
+       Helios_Power_CAM_VDD_output(value);
+#endif
+       return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(misc_power_set_CamVDD_ON_obj, misc_power_set_CAMVDD_ON);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(misc_power_set_CamVDD_ON_obj, 1, 3, misc_power_set_CAMVDD_ON);
 
 #endif
 
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06)
+#if defined(BOARD_EG915UCN_AC) || defined(BOARD_EG915ULA_AD) || defined(BOARD_EG915UEC_AC) || defined(BOARD_EG915ULA_DC_CUG) || defined(BOARD_EG915ULA_AD_CUG)
+STATIC mp_obj_t misc_power_set_domain(mp_obj_t id,mp_obj_t domain)
+{
+       unsigned char power_id;
+       int level;
+       int ret = 0;
+
+       power_id = mp_obj_get_int(id);
+       level = mp_obj_get_int(domain);
+       ret = Helios_Set_Power_Level(power_id,level);
+
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(misc_power_set_domain_obj, misc_power_set_domain);
+#endif
+#endif
+
 #if defined(PLAT_EIGEN)
 STATIC mp_obj_t misc_poweron_debounce_time_set(mp_obj_t time_ms)
 {
@@ -125,9 +172,37 @@ STATIC const mp_rom_map_elem_t misc_power_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_powerDownReason), MP_ROM_PTR(&misc_power_get_down_reason_obj) },
 #endif
        { MP_ROM_QSTR(MP_QSTR_getVbatt), MP_ROM_PTR(&misc_power_get_batt_obj) },
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_camVDD2V8Enable), MP_ROM_PTR(&misc_power_set_CamVDD_ON_obj) },
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06)
+       { MP_ROM_QSTR(MP_QSTR_camVDDEnable), MP_ROM_PTR(&misc_power_set_CamVDD_ON_obj) },
+       //{ MP_ROM_QSTR(MP_QSTR_VDD_1V20), MP_ROM_INT(HELIOS_CAM_VDD_1V20) },
+       //{ MP_ROM_QSTR(MP_QSTR_VDD_1V30), MP_ROM_INT(HELIOS_CAM_VDD_1V30) },
+       //{ MP_ROM_QSTR(MP_QSTR_VDD_1V50), MP_ROM_INT(HELIOS_CAM_VDD_1V50) },
+       { MP_ROM_QSTR(MP_QSTR_VDD_1V80), MP_ROM_INT(HELIOS_CAM_VDD_1V80) },
+       { MP_ROM_QSTR(MP_QSTR_VDD_2V50), MP_ROM_INT(HELIOS_CAM_VDD_2V50) },
+       { MP_ROM_QSTR(MP_QSTR_VDD_2V80), MP_ROM_INT(HELIOS_CAM_VDD_2V80) },
+       { MP_ROM_QSTR(MP_QSTR_VDD_3V00), MP_ROM_INT(HELIOS_CAM_VDD_3V00) },
+       { MP_ROM_QSTR(MP_QSTR_LP_ENABLE), MP_ROM_INT(1) },
+       { MP_ROM_QSTR(MP_QSTR_LP_DISABLE), MP_ROM_INT(0) },
+       //s{ MP_ROM_QSTR(MP_QSTR_VDD_3V30), MP_ROM_INT(HELIOS_CAM_VDD_3V30) },
+#else
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
+       { MP_ROM_QSTR(MP_QSTR_VDD_2V80), MP_ROM_INT(HELIOS_CAM_VDD_2V80) },
+       { MP_ROM_QSTR(MP_QSTR_LP_ENABLE), MP_ROM_INT(1) },
+       { MP_ROM_QSTR(MP_QSTR_LP_DISABLE), MP_ROM_INT(0) },
+#endif
+#endif
 #endif
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R06)
+#if defined(BOARD_EG915UCN_AC) || defined(BOARD_EG915ULA_AD) || defined(BOARD_EG915UEC_AC) || defined(BOARD_EG915ULA_DC_CUG) || defined(BOARD_EG915ULA_AD_CUG)
+       { MP_ROM_QSTR(MP_QSTR_setPowerDomain), MP_ROM_PTR(&misc_power_set_domain_obj) },
+       { MP_ROM_QSTR(MP_QSTR_MMC), MP_ROM_INT(0) },
+       { MP_ROM_QSTR(MP_QSTR_VOL_3V2), MP_ROM_INT(POWER_LEVEL_3200MV) },
+       { MP_ROM_QSTR(MP_QSTR_VOL_1V8), MP_ROM_INT(POWER_LEVEL_1800MV) },
+#endif
+#endif
+
 #if defined(PLAT_EIGEN)
        { MP_ROM_QSTR(MP_QSTR_powerOnTimeSet), MP_ROM_PTR(&misc_poweron_debounce_time_set_obj) },
 #endif
index ff68b78..349e0c5 100644 (file)
@@ -45,6 +45,34 @@ STATIC void powerkey_event_callback(uint8_t status)
     } 
 }
 
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+STATIC mp_obj_t powerkey_event_register_ex(size_t n_args,const mp_obj_t *args)
+{
+       int ret = 1;
+       mp_obj_t usr_callback = args[1];
+       Helios_PowerInitStruct info = {powerkey_event_callback};
+       static c_callback_t cb = {0};
+    memset(&cb, 0, sizeof(c_callback_t));
+       g_user_callback = &cb;
+       mp_sched_schedule_callback_register(g_user_callback, usr_callback);
+       MOD_POWERKEY_LOG("powerkey_event_register\r\n");        
+       
+       if(n_args == 3)
+       {
+               int pwk_workmode = mp_obj_get_int(args[2]);
+               ret = Helios_Power_Init_ex(&info, (uint8_t)pwk_workmode);
+       }
+       else
+       {
+               ret = Helios_Power_Init_ex(&info, 0);
+       }
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(misc_powerkey_event_register_obj, 2, 3,powerkey_event_register_ex);
+
+#else
+
 STATIC mp_obj_t powerkey_event_register(mp_obj_t self_in, mp_obj_t usr_callback)
 {
        int ret = 1;
@@ -60,6 +88,7 @@ STATIC mp_obj_t powerkey_event_register(mp_obj_t self_in, mp_obj_t usr_callback)
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(misc_powerkey_event_register_obj, powerkey_event_register);
+#endif
 
 STATIC mp_obj_t misc_powerkey_deinit(mp_obj_t self_in)
 {
@@ -72,11 +101,39 @@ STATIC mp_obj_t misc_powerkey_deinit(mp_obj_t self_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(misc_powerkey__del__obj, misc_powerkey_deinit);
 
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
+STATIC mp_obj_t misc_get_powerkey_status(mp_obj_t self_in)
+{      
+       return mp_obj_new_int(Helios_Get_Pwrkey_Status());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(misc_get_powerkey_status_obj, misc_get_powerkey_status);
+#endif
+
 
+#if defined(PLAT_EIGEN)
+extern int Helios_set_powerkey_pullMode(bool isPullup);
+STATIC mp_obj_t misc_powerkey_pullMode_set(mp_obj_t self_in, mp_obj_t isPullup)
+{
+       int isPullup_value = mp_obj_get_int(isPullup);
+       if(isPullup_value > 1 || isPullup_value < 0)
+       {
+               mp_raise_OSError(22);
+       }
+       int ret = Helios_set_powerkey_pullMode((bool)isPullup_value);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(misc_powerkey_pullMode_set_obj, misc_powerkey_pullMode_set);
+#endif
 
 STATIC const mp_rom_map_elem_t misc_powerkey_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&misc_powerkey__del__obj) },
     { MP_ROM_QSTR(MP_QSTR_powerKeyEventRegister), MP_ROM_PTR(&misc_powerkey_event_register_obj) },
+#if defined(PLAT_EIGEN)
+       { MP_ROM_QSTR(MP_QSTR_powerKeyPullModeSet), MP_ROM_PTR(&misc_powerkey_pullMode_set_obj) },
+#endif 
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
+       { MP_ROM_QSTR(MP_QSTR_getpowerKeyStatus), MP_ROM_PTR(&misc_get_powerkey_status_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(misc_powerkey_locals_dict, misc_powerkey_locals_dict_table);
 
index 74dba19..3c39fff 100644 (file)
@@ -46,6 +46,9 @@ typedef struct _misc_pwm_obj_t {
     unsigned char duty;
     float frequency;
     pwm_type_t type_pwm; 
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+    unsigned char pwm_en_sleep;
+#endif
 } misc_pwm_obj_t;
 
 typedef enum HELIOS_PWM_CYCLE_RANGE_ENUM
@@ -69,24 +72,26 @@ typedef struct {
        uint16_t Right_coordinata;
 }Helios_PWM_range;
 
-//对应wiki上的取值范围
-//helios_pwm[0]: 对应1US
-//helios_pwm[1]: 对应1ms
-//helios_pwm[2]: 对应10us
-//helios_pwm[3]: 对应ns
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) 
+
+//helios_pwm[0]:1US
+//helios_pwm[1]:1ms
+//helios_pwm[2]:10us
+//helios_pwm[3]:ns
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)
 const Helios_PWM_range helios_pwm[4] = {{0, 157}, {0, 1023}, {1, 1575}, {0, 1024}};
 
-#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ECR6600) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 const Helios_PWM_range helios_pwm[4] = {{0, 10000}, {0, 10}, {1, 10000}, {99, 65535}};
-#elif defined(PLAT_ASR_1803s)
+#elif defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #elif defined(PLAT_EIGEN)
+#elif defined(PLAT_Qualcomm)
+
 #else
 #error "Please check whether the platform supports PWM"
 #endif
 
 
-#if !defined(PLAT_ASR_1803s) && !defined(PLAT_EIGEN)
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc) && !defined(PLAT_EIGEN) && !defined(PLAT_Qualcomm)
 STATIC int check_pwm_para(uint16_t cycle_range, uint16_t cycle_time, uint16_t hight_time) {
 
        if(cycle_range > HELIOS_PWM_CYCLE_ABOVE_BELOW_US ||
@@ -105,13 +110,17 @@ STATIC void misc_pwm_init_helper(misc_pwm_obj_t *self,
        { MP_QSTR_cycle_range, MP_ARG_INT, {.u_int = 0} },
         { MP_QSTR_high_time,   MP_ARG_INT, {.u_int = 0} },
         { MP_QSTR_cycle_time,  MP_ARG_INT, {.u_int = 0} },
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+        { MP_QSTR_pwm_en_sleep,  MP_ARG_INT, {.u_int = 0} },
+#endif
     };
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
     mp_arg_parse_all(n_args, pos_args, kw_args,
         MP_ARRAY_SIZE(allowed_args), allowed_args, args);
 
        //PWM_LOG("cycle_range=%d, high_time=%d, cycle_time=%d\n",args[ARG_cycle_range].u_int, args[ARG_high_time].u_int, args[ARG_cycle_time].u_int);
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) && !defined(PLAT_ASR_1803s) && !defined(PLAT_EIGEN)
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) \
+    || defined(PLAT_EIGEN) || defined(PLAT_Qualcomm) || defined(PLAT_ECR6600) || defined(PLAT_ASR_1602))
        if(-1 == check_pwm_para(args[ARG_cycle_range].u_int, args[ARG_cycle_time].u_int, args[ARG_high_time].u_int)) {
                mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error, please refer to wiki instructions to correct the parameters"));
        }
@@ -127,11 +136,15 @@ STATIC void misc_pwm_init_helper(misc_pwm_obj_t *self,
                mp_raise_ValueError(MP_ERROR_TEXT("fail"));
        }
 
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+       Helios_PWM_En_Sleep(self->pin,args[3].u_int);
+    PWM_LOG("Helios_PWM_En_Sleep->%d\n",args[3].u_int);
+#endif
 }
 
 STATIC mp_obj_t misc_pwm_make_new(const mp_obj_type_t *type,
     size_t n_args, size_t n_kw, const mp_obj_t *args) {
-    mp_arg_check_num(n_args, n_kw, 4, 4, true);
+    mp_arg_check_num(n_args, n_kw, 4, 5, true);
     int pin_id = mp_obj_get_int(args[0]);
 
        PWM_LOG("n_args = %d\n",n_args);
@@ -173,6 +186,9 @@ STATIC void misc_pwm_v2_init_helper(misc_pwm_obj_t *self,
     {
         { MP_QSTR_frequency, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
         { MP_QSTR_duty, MP_ARG_INT, {.u_int = 0} },
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+        { MP_QSTR_pwm_en_sleep,  MP_ARG_INT, {.u_int = 0} },
+#endif
     };
         
     mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
@@ -194,12 +210,16 @@ STATIC void misc_pwm_v2_init_helper(misc_pwm_obj_t *self,
        if(Helios_PWM_Init(self->pin) != 0) {
                mp_raise_ValueError(MP_ERROR_TEXT("fail"));
        }
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+       Helios_PWM_En_Sleep(self->pin,args[2].u_int);
+    PWM_LOG("Helios_PWM_En_Sleep->%d\n",args[2].u_int);
+#endif
 
 }    
 STATIC mp_obj_t misc_pwm_v2_make_new(const mp_obj_type_t *type,
     size_t n_args, size_t n_kw, const mp_obj_t *args) 
 {
-    mp_arg_check_num(n_args, n_kw, 3, 3, true);
+    mp_arg_check_num(n_args, n_kw, 3, 4, true);
     int pin_id = mp_obj_get_int(args[0]);
     
        if ((pin_id < 0) || (pin_id > PWMMAX-1))
@@ -233,7 +253,8 @@ STATIC mp_obj_t misc_pwm_enable(size_t n_args, const mp_obj_t *args)
        float duty = 0;
         if(n_args == 4)
         {
-#if !defined(PLAT_ASR) && !defined(PLAT_ASR_1606) && !defined(PLAT_ASR_1803s) && !defined(PLAT_EIGEN)
+#if !(defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) \
+    || defined(PLAT_EIGEN) || defined(PLAT_Qualcomm) || defined(PLAT_ECR6600) || defined(PLAT_ASR_1602))
             if(-1 == check_pwm_para(mp_obj_get_int(args[1]), mp_obj_get_int(args[3]), mp_obj_get_int(args[2])))
             {
                        mp_raise_ValueError(MP_ERROR_TEXT("PWM parameter error, please refer to wiki instructions to correct the parameters"));
@@ -330,7 +351,7 @@ STATIC const mp_rom_map_elem_t misc_pwm_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_ABOVE_10US), MP_ROM_INT(HELIOS_PWM_CYCLE_ABOVE_10US) },
     { MP_ROM_QSTR(MP_QSTR_ABOVE_BELOW_US), MP_ROM_INT(HELIOS_PWM_CYCLE_ABOVE_BELOW_US) },
     { MP_ROM_QSTR(MP_QSTR_PWM0), MP_ROM_INT(PWM0) },
-    #if !defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+    #if !defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     PLAT_PWM_DEF(PLAT_PWM_NUMMAX),
     #endif
 };
index cc52cac..1c91c91 100644 (file)
@@ -84,19 +84,21 @@ STATIC mp_obj_t misc_usb__Deint(mp_obj_t self_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(misc_usb__del__obj, misc_usb__Deint);
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc)
 STATIC mp_obj_t misc_usb_disable(size_t n_args,const mp_obj_t *args){
        int ret = -1;
        if(n_args == 2)
        {
                int flag = mp_obj_get_int(args[1]);
+               MP_THREAD_GIL_EXIT();
                ret = Helios_USB_function_disable(flag);
-               return mp_obj_new_int(ret);
+               MP_THREAD_GIL_ENTER();
        }
        else
        {
+               MP_THREAD_GIL_EXIT();
                ret = Helios_USB_function_state();
-               return mp_obj_new_int(ret);
+               MP_THREAD_GIL_ENTER();
        }
 
        return mp_obj_new_int(ret);
@@ -112,12 +114,16 @@ STATIC mp_obj_t misc_usb_disable(size_t n_args,const mp_obj_t *args) {
        {
                int flag = mp_obj_get_int(args[1]);
                extern int Helios_Dev_SetUSBMode_AT(int mode);
-       return mp_obj_new_int(Helios_Dev_SetUSBMode_AT(flag));
+               MP_THREAD_GIL_EXIT();
+       ret = Helios_Dev_SetUSBMode_AT(flag);
+               MP_THREAD_GIL_ENTER();
        }
        else
        {
                extern int Helios_Dev_GetUSBMode(void);
-               return mp_obj_new_int(Helios_Dev_GetUSBMode());
+               MP_THREAD_GIL_EXIT();           
+               ret = Helios_Dev_GetUSBMode();
+               MP_THREAD_GIL_ENTER();
        }
 
        return mp_obj_new_int(ret);
@@ -151,7 +157,7 @@ STATIC const mp_rom_map_elem_t misc_usb_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_setCallback), MP_ROM_PTR(&misc_usb_register_cb_obj) },
 #endif
 
-#if defined(PLAT_ASR) || defined(PLAT_Qualcomm)
+#if defined(PLAT_ASR) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc)
        { MP_ROM_QSTR(MP_QSTR_disable), MP_ROM_PTR(&misc_usb_disable_obj) },
 #endif
 
index 6e7cb67..a88b053 100644 (file)
@@ -81,7 +81,7 @@ STATIC mp_obj_t misc_usbnet_close(void)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(misc_usbnet_close_obj, misc_usbnet_close);
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t misc_usbnet_get_nat(size_t n_args, const mp_obj_t *args)
 {
        if (n_args == 2)
@@ -130,7 +130,7 @@ STATIC mp_obj_t misc_usbnet_set_nat(size_t n_args, const mp_obj_t *args)
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(misc_usbnet_set_nat_obj, 3, 3, misc_usbnet_set_nat);
 #endif
 
-#if defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
 STATIC mp_obj_t misc_usbnet_set_MAC(mp_obj_t macinfo)
 {
        mp_buffer_info_t m_macinfo;
@@ -175,11 +175,11 @@ STATIC const mp_rom_map_elem_t misc_usbnet_locals_dict_table[] = {
        {MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&misc_usbnet_close_obj)},
        {MP_ROM_QSTR(MP_QSTR_Type_ECM), MP_ROM_INT(HELIOS_USBNET_TYPE_ECM)},
        {MP_ROM_QSTR(MP_QSTR_Type_RNDIS), MP_ROM_INT(HELIOS_USBNET_TYPE_RNDIS)},
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        {MP_ROM_QSTR(MP_QSTR_getNat), MP_ROM_PTR(&misc_usbnet_get_nat_obj)},
        {MP_ROM_QSTR(MP_QSTR_setNat), MP_ROM_PTR(&misc_usbnet_set_nat_obj)},
 #endif
-#if defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
        {MP_ROM_QSTR(MP_QSTR_setMAC), MP_ROM_PTR(&misc_usbnet_set_MAC_obj)},
        {MP_ROM_QSTR(MP_QSTR_setProduct), MP_ROM_PTR(&misc_usbnet_set_product_obj)},
 #endif
index 9609bf9..9342ab1 100644 (file)
@@ -765,7 +765,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_get_step_obj, mp_SC7A20_get_step);//
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_reset_step_obj, mp_SC7A20_reset_step);//
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_SC7A20_get_x_y_z_obj, mp_SC7A20_get_x_y_z);//
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(mp_SC7A206_register_usr_cb_obj, mp_SC7A20_register_usr_cb);
-STATIC const mp_rom_map_elem_t SC7A20_locals_dict_table[] = {
+STATIC const mp_rom_map_elem_t SC7A20_locals_dict_table[] = { 
     { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_init_SC7A20_obj) },
     { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_deinit_SC7A20_obj) },
     { MP_ROM_QSTR(MP_QSTR_activate), MP_ROM_PTR(&mp_activate_SC7A20_obj) },
index e32abba..ab9482a 100644 (file)
@@ -45,9 +45,9 @@ STATIC mp_obj_t qpy_atcmd_send_sync(size_t n_args, const mp_obj_t *args)
     char *at_include_str = (char *)mp_obj_str_get_str(args[2]);
     int at_time_out = mp_obj_get_int(args[3]);
 
-       if ((at_cmd == NULL) || (cur_simid != 0) || (at_time_out <= 0))
+       if ((at_cmd == NULL) || ((cur_simid != 0) && (cur_simid != 1))|| (at_time_out <= 0))
        {
-               mp_raise_ValueError("invalid param.");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid param."));
        }
     HELIOS_AT_RESP_STATUS_E ret = 0;
     mp_buffer_info_t datainfo;
index 38b182e..20e6b65 100644 (file)
@@ -60,43 +60,60 @@ static AudioChannelSupport_t audio_channel_tab = {
        {1, 0, 0}
 #elif defined(BOARD_EC600MCN_LA) || defined(BOARD_EC600MCN_LA_POC_XBND) ||defined(BOARD_EC600MCN_LA_POC_QS) \
     || defined(BOARD_EC600MCN_LA_VOLTE) || defined(BOARD_EC600MCN_LA_HJT) || defined(BOARD_EC600MCN_LC) \
-    || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LE_POC_XBND) \
+    || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND_EN)\
        || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
        ||defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_LE_VOLTE) || defined(BOARD_EC600MCN_LF) \
-       || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS)
+       || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
+       || defined(BOARD_EC600MCN_LE_ALIPAY) || defined(BOARD_EC600KCN_CC_TTS) || defined(BOARD_EC600MCN_LE_BTZ) || defined(BOARD_EC600MCN_LF_SPISD) \
+       || defined(BOARD_EC600MEU_LA) || defined(BOARD_EC600MEU_LA_POC_XBND) || defined(BOARD_EC600KCN_LC) || defined(BOARD_EC600MCN_LF_QS) \
+       || defined(BOARD_EC600MLA_LA_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_QS) || defined(BOARD_EC600MLA_LA_POC_QS)
        {1, 0, 0}
 #elif defined(BOARD_EC800MCN_LA) || defined(BOARD_EC800MCN_GA) \
     || defined(BOARD_EC800MCN_LA_VOLTE) || defined(BOARD_EC800MCN_GC) || defined(BOARD_EC800MCN_LC) || defined(BOARD_EC800MCN_LF) \
     || defined(BOARD_EC800MCN_GA_MS) || defined(BOARD_EC800MCN_GA_VOLTE) || defined(BOARD_EC800MCN_LA_POC_XBND) \
     || defined(BOARD_EC800MCN_LE) || defined(BOARD_EC800MCN_LE_POC_XBND) || defined(BOARD_EC800MCN_GA_ALIPAY) \
        || defined(BOARD_EG810MCN_GA) || defined(BOARD_EC800MCN_CC) || defined(BOARD_EC800MCN_LE_VOLTE) \
-       || defined(BOARD_EC800MCN_GA_SPISD) || defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA_VOLTE)|| defined(BOARD_EC800MCN_GD) \
-       || defined(BOARD_EC800MCN_GA_VOEXT) || defined(BOARD_EG810MCN_GA_VOEXT)
+       || defined(BOARD_EC800MCN_GA_SPISD) || defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EC800MCN_GD) \
+       || defined(BOARD_EC800MCN_GA_VOEXT) || defined(BOARD_EG810MCN_GA_VOEXT) || defined(BOARD_EC800MCN_LE_VOLVGL) \
+       || defined(BOARD_EG810MCN_GA_VOLTE) || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) \
+       || defined(BOARD_EC800KCN_LC) || defined(BOARD_EC800KCN_CC) || defined(BOARD_EG800KEU_CC) || defined(BOARD_EG800PCN_LA) \
+       || defined(BOARD_EC800MCN_GB) || defined(BOARD_EG810MCN_GB) || defined(BOARD_EG810MCN_GB_VOEXT)\
+       || defined(BOARD_EC800MCN_LF_CCG) || defined(BOARD_EG800KCN_GC) || defined(BOARD_EG810MCN_LA) \
+       || defined(BOARD_EG810MEU_LA) || defined(BOARD_EG810MCN_LA_VOLTE) || defined(BOARD_EG810MEU_LA_VOEXT) \
+       || defined(BOARD_EG810MCN_LA_VOEXT) || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EG800PCN_LA_ALIPAY) \
+       || defined(BOARD_EC800KCN_LC_SMS) || defined(BOARD_EC800MCN_GB_VOEXT) || defined(BOARD_EG810MEU_LA_VOLVGL) \
+       || defined(BOARD_EG810MCN_GB_ALIPAY)  || defined(BOARD_EC800MCN_LE_VOEXT)
        {1, 0, 0}
-#elif defined(BOARD_EG915NEU_AC) || defined(BOARD_EG915NEU_AG)
+#elif defined(BOARD_EG915NEU_AC) || defined(BOARD_EG915NEU_AG) || defined(BOARD_EG915NEA_AC) || defined(BOARD_EG915NEA_AC_SANX)\
+   || defined(BOARD_EG915NEU_AP) || defined(BOARD_EG915NLA_AP)
     {1, 0, 0}
-#elif defined(BOARD_EG912NEN_AA)
+#elif defined(BOARD_EG912NEN_AA) || defined(BOARD_EG912NEN_AA_SANX)
     {1, 0, 0}
 #elif defined(BOARD_EC100YCN_AA)
     {1, 1, 1}
 #elif defined(BOARD_EC200UCN_AA) || defined(BOARD_EC200UCN_AA_QIOT) || defined(BOARD_EC200UCN_AA_BT) \
-       || defined(BOARD_EC200UCN_AA_EXTFS8M)
+       || defined(BOARD_EC200UCN_AA_EXTFS8M) || defined(BOARD_EC200UCN_AB_VOBT) || defined(BOARD_EC200UCN_AA_VOBT) \
+       || defined(BOARD_EC200UCN_AD) || defined(BOARD_EC200UCN_AB)
        {0, 0, 1}
 #elif defined(BOARD_EC200UCN_LA) || defined(BOARD_EC200UCN_LA_BT) || defined(BOARD_EC200UCN_LA_EXTFS8M)
        {0, 0, 1}
 #elif defined(BOARD_EC200UCN_LB) || defined(BOARD_EC200UCN_LB_BT) || defined(BOARD_EC200UCN_LB_EXTFS8M)
        {0, 0, 1}
-#elif defined(BOARD_EC200UEU_AB) || defined(BOARD_EC200UEU_AB_SANX)
+#elif defined(BOARD_EC200UEU_AB) || defined(BOARD_EC200UEU_AB_SANX) || defined(BOARD_EC200UEU_AB_VOLTE)
        {0, 0, 1}
 #elif defined(BOARD_EC200UEU_AA) \
        || defined(BOARD_EC200UEU_AA_QIOT) \
        || defined(BOARD_EC200UEU_AA_EXTFS) \
+       || defined(BOARD_EC200UEU_AA_CAM) \
+       || defined(BOARD_EC200UEU_AA_BTLVGL) \
        || defined(BOARD_EC200UEU_AA_MSDL) 
        {0, 0, 1}
 #elif defined(BOARD_EC200UAU_AB) || defined(BOARD_EC200UAU_AB_VOLTE)
        {0, 0, 1}
 #elif defined(BOARD_EC200UAU_AA)
-               {0, 0, 1}
+       {0, 0, 1}
+#elif defined(BOARD_EC200UEU_DC) 
+       {0, 0, 1}
 #elif defined(BOARD_EC600UCN_LB_TTS) \
        || defined(BOARD_EC600UCN_LB) \
        || defined(BOARD_EC600UCN_LB_VOLTE) \
@@ -108,8 +125,18 @@ static AudioChannelSupport_t audio_channel_tab = {
        || defined(BOARD_EC600UCN_LB_QIOT) \
        || defined(BOARD_EC600UCN_LB_YDWL) \
        || defined(BOARD_EC600UEC_AC) \
+       || defined(BOARD_EC600UEC_DC) \
        || defined(BOARD_EC600UEC_AC_WS) \
-       || defined(BOARD_EC600UEC_AC_VOLTE) 
+       || defined(BOARD_EC600UEC_AD_WS) \
+       || defined(BOARD_EC600UEC_AC_VOLTE) \
+       || defined(BOARD_EC600UEC_AD) \
+       || defined(BOARD_EC600ULA_AC) \
+       || defined(BOARD_EC600UCN_LB_YDWL)      \
+       || defined(BOARD_EC600ULA_AC_WS) \
+       || defined(BOARD_EC600UEU_AC_VOLTE) \
+       || defined(BOARD_EC600UEU_AC_WS) \
+       || defined(BOARD_EC600UEC_DC_WS) \
+       || defined(BOARD_EC600UEU_DC)
        {1, 1, 1}
 #elif defined(BOARD_EC600UCN_LC) \
        || defined(BOARD_EC600UCN_LC_EXTFS8M) \
@@ -117,29 +144,42 @@ static AudioChannelSupport_t audio_channel_tab = {
        {1, 1, 1}
 #elif defined(BOARD_EC600UEU_AB) || defined(BOARD_EC600UEU_AB_VOLTE)|| defined(BOARD_EC600UEU_AB_POC)
        {1, 1, 1}
-#elif defined(BOARD_EG915UEU_AB) || defined(BOARD_EG915UEU_AB_HYT) || defined(BOARD_EG915ULA_AB)
+#elif defined(BOARD_EG915UEU_AB) || defined(BOARD_EG915UEU_AB_HYT) || defined(BOARD_EG915ULA_AB) \
+       || defined(BOARD_EG915ULA_AC)|| defined(BOARD_EG915UCN_AC) || defined(BOARD_EG915UEC_AC) \
+       || defined(BOARD_EG915UEU_AC) || defined(BOARD_EG915ULA_AC_USBUP) || defined(BOARD_EG915UCN_AC_USBUP) \
+       || defined(BOARD_EG915UEU_AC_USBUP) || defined(BOARD_EG915UEC_AC_USBUP) || defined(BOARD_EG915ULA_AD) || defined(BOARD_EG915ULA_AD_CUG)
+       {1, 1, 0}
+#elif defined(BOARD_EG915ULA_DC) || defined(BOARD_EG915ULA_DC_CUG)
        {1, 1, 0}
-#elif defined(BOARD_EG912UGL_AA) || defined(BOARD_EG912UGL_AA_YL)
+#elif defined(BOARD_EG912UGL_AA) || defined(BOARD_EG912UGL_AC_CFF) || defined(BOARD_EG912UGL_AC)
        {1, 0, 0}
 #elif defined(BOARD_BG95M3) || defined(BOARD_BG95M3_LX)
        {0, 0, 0}
 #elif defined(PLAT_RDA)
        {0, 0, 0}
 #elif defined(BOARD_EC800GCN_GA) \
+       || defined(BOARD_EC800GCN_TT) \
        || defined(BOARD_EC600GCN_LA) \
+       || defined(BOARD_EC600GCN_LA_CDD) \
        || defined(BOARD_EC800GCN_GA_MS) \
        || defined(BOARD_EC800GCN_GA_VOLTE)
        {1, 1, 1}
 #elif defined(BOARD_EC600GCN_LD) \
        || defined(BOARD_EC800GCN_LD) \
        || defined(BOARD_EC800GCN_LD_HRXM) \
-       || defined(BOARD_EC800GCN_LB)
+       || defined(BOARD_EC800GCN_LB) \
+       || defined(BOARD_EC800GCN_TT) \
+       || defined(BOARD_EG800GLA_LD)
        {0, 0, 0}
-#elif defined(BOARD_EC600GCN_LD_YM)
+#elif defined(BOARD_EC800GCN_LD_XBND)
+       {1, 1, 1}
+#elif defined(BOARD_EG700GCN_LC)
+       {1, 0, 0}
+#elif defined(BOARD_EC600GCN_LD_YM) || defined(BOARD_EC600GCN_MD_HK)
        {1, 1, 1}
-#elif defined(BOARD_EC600ECN_LC) || defined(BOARD_EC600ECN_LC_AEF) || defined(BOARD_EC800ECN_LC_AEF) || defined(BOARD_EC800ECN_LC_AUD) || defined(BOARD_EC600ECN_LC_AUD)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 
-#elif defined(BOARD_EC200AAU_HA_CPE)
+#elif defined(BOARD_EC200AAU_HA_CPE) || defined(BOARD_EC200ACN_HA_CPE) || defined(BOARD_EC200AEU_HA_CPE)
        {1, 1, 1}
 #else
        #error "Please add the corresponding platform configuration items in audio_channel_tab."
@@ -164,7 +204,7 @@ int audio_channel_check(int channel)
 }
 
 
-#if defined (PLAT_ASR)
+#if defined (PLAT_ASR) || defined(BOARD_EC600MCN_LF_SPISD)
 
 #define CHECK_PROFILE_ID(id) (((HELIOS_VC_HANDSET <= id &&  HELIOS_VC_MAXCOUNT > id) || (HELIOS_AC_HANDSET <= id &&  HELIOS_AC_MAXCOUNT > id)))
 #define CHECK_LEVLE(x) ()
@@ -203,7 +243,7 @@ static int codec_gain_num(unsigned int profile_id, signed int level, uint32_t* d
        if(level < 0 || level > HELIOS_AUDIOHAL_SPK_VOL_11){    
                return -1;
        }
-       if(data[0] > 38){       
+       if(data[0] > 255){      
                return -1;
        }       
        if(data[1] > 4){        
@@ -275,6 +315,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(audio_get_current_ID_obj, helios_get_current_ID
        || defined(BOARD_EC600UCN_LB_ICC)       \
        || defined(BOARD_EC600UCN_LB_EXTFS4M)   \
        || defined(BOARD_EC600UCN_LB_EXTFS8M)   \
+       || defined(BOARD_EC600UCN_LB_YDWL)      \
        || defined(BOARD_EC600UCN_LB_BT))
 
 
@@ -322,6 +363,163 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(audio_get_earphone_status_obj, helios_get_earph
 //----------------Headphone detect -end-------------------------
 
 
+#if defined(PLAT_ASR_1602)
+STATIC mp_obj_t helios_audio_codec_switch(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
+       enum
+    {
+        ARF_type,
+        ARG_bclk,
+        ARG_sample,
+               ARG_is_i2s,
+    };
+    static const mp_arg_t allowed_args[] =
+        {
+            {MP_QSTR_type,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_bclk,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_sample, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_is_i2s, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+        };
+    mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals);
+
+    int type = vals[ARF_type].u_int;
+    int bclk = vals[ARG_bclk].u_int;
+    int sample = vals[ARG_sample].u_int;
+       int is_i2s = vals[ARG_is_i2s].u_int;
+
+    if(bclk >= Helios_PCM_FS_MAX || bclk < Helios_PCM_FS_32) {
+        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("parameter bclk error."));
+    }
+    
+    if (sample != Helios_PCM_CODEC_SAMPLE_8000 && sample != Helios_PCM_CODEC_SAMPLE_16000 && 
+        sample != Helios_PCM_CODEC_SAMPLE_32000 && sample != Helios_PCM_CODEC_SAMPLE_48000) {
+        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("parameter sample error."));
+    }
+
+    Helios_ExternalCodecPcm_config config = {bclk, sample, is_i2s};
+    Helios_Audio_Codec_Switch(type, &config);// type 0: Helios_CODEC_TYPE_INTERNAL, 1:Helios_CODEC_TYPE_EXTERNAL
+    return mp_obj_new_int(0);
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(helios_audio_codec_switch_obj, 1, helios_audio_codec_switch);
+#endif
+
+#if defined (PLAT_Unisoc)
+STATIC mp_obj_t mp_aud_set_calib_real_time(mp_obj_t mp_real_time)
+{
+       int real_time = mp_obj_get_int(mp_real_time);
+       
+       if((real_time != 0) && (real_time !=  1)) {
+               mp_raise_ValueError("Parameter error, please check whether the parameter meets the value range");
+       }
+       
+       int ret = Helios_aud_set_calib_real_time(real_time);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_aud_set_calib_real_time_obj, mp_aud_set_calib_real_time);
+#endif
+
+
+#if defined(PLAT_ASR_1606)
+STATIC mp_obj_t mp_set_qdai_cfg(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
+       enum
+    {
+        ARF_io,
+        ARG_mode,
+               ARG_fsync,
+               ARG_clock,
+               ARG_format,
+        ARG_sample,
+               ARG_num_slots,
+               ARG_slot_mapping,
+    };
+    static const mp_arg_t allowed_args[] =
+        {
+            {MP_QSTR_io,       MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_mode,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_fsync, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+            {MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+                       {MP_QSTR_format, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+                       {MP_QSTR_sample, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+                       {MP_QSTR_num_slots, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+                       {MP_QSTR_slot_mapping, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0}},
+        };
+    mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals);
+       Helios_QdaiStruct qdai;
+    qdai.io = vals[ARF_io].u_int;
+    qdai.mode = vals[ARG_mode].u_int;
+       qdai.fsync = vals[ARG_fsync].u_int;
+       qdai.clock = vals[ARG_clock].u_int;
+       qdai.format = vals[ARG_format].u_int;
+       qdai.sample = vals[ARG_sample].u_int;
+       qdai.num_slots = vals[ARG_num_slots].u_int;
+       qdai.slot_mapping = vals[ARG_slot_mapping].u_int;
+
+    return mp_obj_new_int(Helios_customer_set_qdai_cfg(qdai));
+}
+static MP_DEFINE_CONST_FUN_OBJ_KW(mp_set_qdai_cfg_obj, 4, mp_set_qdai_cfg);
+#endif
+
+
+#if defined(PLAT_Unisoc_8850_R02)
+STATIC const mp_arg_t codec_i2c_mem_allowed_args[] = {
+    { MP_QSTR_slaveaddr,    MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_regaddr, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_data,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_datasize, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 8} },
+};
+STATIC mp_obj_t codec_i2c_write_mem(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+    enum { ARG_slaveaddr, ARG_regaddr, ARG_data, ARG_datasize };
+    mp_arg_val_t args[MP_ARRAY_SIZE(codec_i2c_mem_allowed_args)];
+    mp_arg_parse_all(n_args, pos_args, kw_args,
+        MP_ARRAY_SIZE(codec_i2c_mem_allowed_args), codec_i2c_mem_allowed_args, args);
+
+       int length = args[ARG_datasize].u_int;
+       int data = args[ARG_data].u_int;
+       int regaddr = args[ARG_regaddr].u_int;
+
+    // do the transfer
+       int ret = Helios_Audio_Iic_Write((uint8_t) args[ARG_slaveaddr].u_int, (uint16_t)regaddr, (uint8_t) length, (uint16_t) data);
+    if (ret < 0) {
+        ret = -1;
+        return mp_obj_new_int(ret);
+    }
+
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(codec_i2c_write_obj, 1, codec_i2c_write_mem);
+
+STATIC const mp_arg_t codec_i2c_mem_allowed_read_args[] = {
+    { MP_QSTR_slaveaddr,    MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_regaddr, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_databuf,     MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+    { MP_QSTR_datasize, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 8} },
+};
+STATIC mp_obj_t codec_i2c_read_mem(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+    enum { ARG_slaveaddr, ARG_regaddr, ARG_databuf, ARG_datasize };
+    mp_arg_val_t args[MP_ARRAY_SIZE(codec_i2c_mem_allowed_read_args)];
+    mp_arg_parse_all(n_args, pos_args, kw_args,
+        MP_ARRAY_SIZE(codec_i2c_mem_allowed_read_args), codec_i2c_mem_allowed_read_args, args);
+
+    // get the buffer to read the data into
+    mp_buffer_info_t bufinfo;
+    mp_get_buffer_raise(args[ARG_databuf].u_obj, &bufinfo, MP_BUFFER_WRITE);
+       
+       int length = args[ARG_datasize].u_int;
+       int regaddr = args[ARG_regaddr].u_int;
+       
+    // do the transfer 
+       int ret = Helios_Audio_Iic_Read((uint8_t) args[ARG_slaveaddr].u_int, (uint16_t)regaddr, (uint8_t) length, (void*) bufinfo.buf);
+       if (ret < 0) {
+        ret = -1;
+        return mp_obj_new_int(ret);
+    }
+
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(codec_i2c_read_obj, 1, codec_i2c_read_mem);
+#endif
+
 
 STATIC const mp_rom_map_elem_t mp_module_audio_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audio) },
@@ -334,7 +532,7 @@ STATIC const mp_rom_map_elem_t mp_module_audio_globals_table[] = {
 #if MICROPY_QPY_AUDIO_RECORD
     { MP_ROM_QSTR(MP_QSTR_Record), MP_ROM_PTR(&audio_record_type) },
 #endif
-#if defined (PLAT_ASR)
+#if defined (PLAT_ASR) || defined(BOARD_EC600MCN_LF_SPISD)
     { MP_ROM_QSTR(MP_QSTR_set_DSPGain), MP_ROM_PTR(&audio_DSPGain_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_CodecGain), MP_ROM_PTR(&audio_CodecGain_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_CurrentID), MP_ROM_PTR(&audio_get_current_ID_obj) },
@@ -350,11 +548,28 @@ STATIC const mp_rom_map_elem_t mp_module_audio_globals_table[] = {
                || defined(BOARD_EC600UCN_LB_ICC)       \
                || defined(BOARD_EC600UCN_LB_EXTFS4M)   \
                || defined(BOARD_EC600UCN_LB_EXTFS8M)   \
+               || defined(BOARD_EC600UCN_LB_YDWL)      \
                || defined(BOARD_EC600UCN_LB_BT))
                
        { MP_ROM_QSTR(MP_QSTR_set_earphoneDet), MP_ROM_PTR(&audio_set_earphone_det_obj) },
        { MP_ROM_QSTR(MP_QSTR_get_earphoneStatus), MP_ROM_PTR(&audio_get_earphone_status_obj) },
 #endif
+#if defined(PLAT_ASR_1602)
+       { MP_ROM_QSTR(MP_QSTR_switch_codec), MP_ROM_PTR(&helios_audio_codec_switch_obj) },
+#endif
+
+#if defined (PLAT_Unisoc)
+       { MP_ROM_QSTR(MP_QSTR_aud_set_calib_real_time), MP_ROM_PTR(&mp_aud_set_calib_real_time_obj) },
+#endif
+
+#if defined (PLAT_ASR_1606)
+       { MP_ROM_QSTR(MP_QSTR_set_qdai_cfg), MP_ROM_PTR(&mp_set_qdai_cfg_obj) },
+#endif
+
+#if defined(PLAT_Unisoc_8850_R02)
+       { MP_ROM_QSTR(MP_QSTR_codec_i2c_write), MP_ROM_PTR(&codec_i2c_write_obj) },
+       { MP_ROM_QSTR(MP_QSTR_codec_i2c_read), MP_ROM_PTR(&codec_i2c_read_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_audio_globals, mp_module_audio_globals_table);
 
index bf2a44e..d1a0e8c 100644 (file)
@@ -86,7 +86,7 @@ static void qpy_ble_callback(void *ind_msg_buf, void *ctx)
                bt_msg->event.param1 = helios_event->param1;
                bt_msg->event.param2 = helios_event->param2;
                bt_msg->event.param3 = helios_event->param3;
-               
+       
                int ret = qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_BLE, bt_msg);
                if (ret != 0)
                {
@@ -139,8 +139,13 @@ static void qpy_ble_callback(void *ind_msg_buf, void *ctx)
                                case HELIOS_BLE_GATT_DISCOVER_SERVICE_IND:
                                {
                                        free(bt_msg);
+                               #if defined(PLAT_Unisoc_8910_R05)
+                                       Helios_BleHandleUUIDInfo *param_info = (Helios_BleHandleUUIDInfo *)helios_event->param2;
+                                       free(param_info);
+                               #else
                                        Helios_BleGattPrimeService *param_info = (Helios_BleGattPrimeService *)helios_event->param2;
                                        free(param_info);
+                               #endif
                                        break;
                                }
                                case HELIOS_BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND:
@@ -182,6 +187,9 @@ void qpy_ble_msg_proc(void *msg)
                case HELIOS_BLE_GATT_CHARA_WRITE_WITH_RSP_IND:
                case HELIOS_BLE_GATT_DESC_WRITE_WITH_RSP_IND:
                case HELIOS_BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND:
+#if defined(PLAT_Unisoc_8910_R05)
+               case HELIOS_BLE_GATT_SMP_COMPLETE_IND:
+#endif
                {
                        mp_obj_t tuple[2] = 
                        {
@@ -281,7 +289,11 @@ void qpy_ble_msg_proc(void *msg)
                                mp_obj_new_int(pinfo->addr_type),
                                mp_obj_new_bytes(pinfo->addr.addr, HELIOS_BT_MAC_ADDRESS_SIZE),
                                //mp_obj_new_str(addr_buf, strlen(addr_buf)),
+#if defined (PLAT_ECR6600)
+                               mp_obj_new_int((int8_t)pinfo->rssi),
+#else
                                mp_obj_new_int(pinfo->rssi),
+#endif
                                mp_obj_new_int(pinfo->data_length),
                                mp_obj_new_bytes(pinfo->raw_data, pinfo->data_length)
                        };
@@ -292,6 +304,21 @@ void qpy_ble_msg_proc(void *msg)
                }
                case HELIOS_BLE_GATT_DISCOVER_SERVICE_IND:
                {
+#if defined(PLAT_Unisoc_8910_R05)
+                       Helios_BleHandleUUIDInfo *pinfo = (Helios_BleHandleUUIDInfo *)helios_event.param2;
+                       mp_obj_t tuple[6] = 
+                       {
+                               mp_obj_new_int(helios_event.id),
+                               mp_obj_new_int(helios_event.param1),
+                               mp_obj_new_int(pinfo->start_handle),
+                               mp_obj_new_int(pinfo->end_handle),
+                               mp_obj_new_int(pinfo->uuid_s),
+                               mp_obj_new_bytes(pinfo->uuid_l, 16)     
+                       };
+
+                       mp_sched_schedule_ex(&bt_msg->callback, mp_obj_new_tuple(6, tuple));
+                       free(pinfo);
+#else
                        Helios_BleGattPrimeService *pinfo = (Helios_BleGattPrimeService *)helios_event.param2;
                        mp_obj_t tuple[5] = 
                        {
@@ -304,6 +331,7 @@ void qpy_ble_msg_proc(void *msg)
 
                        mp_sched_schedule_ex(&bt_msg->callback, mp_obj_new_tuple(5, tuple));
                        free(pinfo);
+#endif
                        break;
                }
                case HELIOS_BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND:
@@ -343,13 +371,35 @@ void qpy_ble_msg_proc(void *msg)
                        
                        break;
                }
+#if defined(PLAT_Unisoc_8910_R05)
+               case HELIOS_BLE_GATT_SMP_USER_CONFIRM_IND:
+               {
+                       Helios_BleSmpUserInfo *smp_user_info = (Helios_BleSmpUserInfo *)helios_event.param2;
+                       mp_obj_t tuple[5] = 
+                       {
+                               mp_obj_new_int(helios_event.id),
+                               mp_obj_new_int(helios_event.param1),
+                               mp_obj_new_int(smp_user_info->cid),
+                               mp_obj_new_int(smp_user_info->pair_mode),
+                               mp_obj_new_int(smp_user_info->pin),
+                       };
+
+                       mp_sched_schedule_ex(&bt_msg->callback, mp_obj_new_tuple(5, tuple));
+                       free(smp_user_info);
+                       break;
+               }
+#endif
        }
 }
 
 STATIC mp_obj_t qpy_ble_gatt_start(void)
 {
        int ret = 0;
-       ret = Helios_BTBLE_Start();
+#if defined(PLAT_aic8800m40)
+               ret = Helios_BLE_GattStart();
+#else
+               ret = Helios_BTBLE_Start();
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_start_obj, qpy_ble_gatt_start);
@@ -358,7 +408,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_start_obj, qpy_ble_gatt_start);
 STATIC mp_obj_t qpy_ble_gatt_stop(void)
 {
        int ret = 0;
-       ret = Helios_BTBLE_Stop();
+#if defined(PLAT_aic8800m40)
+               ret = Helios_BLE_GattStop();
+#else
+               ret = Helios_BTBLE_Stop();
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_stop_obj, qpy_ble_gatt_stop);
@@ -368,7 +422,11 @@ STATIC mp_obj_t qpy_ble_get_status(void)
 {
        int ret = 0;
        Helios_BtBle_Status status = 0;
-       ret = Helios_BTBLE_GetStatus(&status);
+#if defined(PLAT_aic8800m40)
+               ret = Helios_BLE_GetStatus(&status);
+#else
+               ret = Helios_BTBLE_GetStatus(&status);
+#endif
        if (ret == 0)
        {
                return mp_obj_new_int(status);
@@ -436,7 +494,12 @@ STATIC mp_obj_t qpy_ble_gatt_set_local_name(mp_obj_t code, mp_obj_t name)
        name_info.code_type = code_type;
        strncpy((char *)name_info.name, (const char *)nameinfo.buf, nameinfo.len);
        
-       ret = Helios_BTBLE_SetLocalName(&name_info);
+#if defined(PLAT_aic8800m40)
+               ret = Helios_BLE_GattSetLocalName(&name_info);
+#else
+               ret = Helios_BTBLE_SetLocalName(&name_info);
+#endif
+
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_ble_gatt_set_local_name_obj, qpy_ble_gatt_set_local_name);
@@ -1251,25 +1314,160 @@ STATIC mp_obj_t qpy_ble_gatt_set_scanreport_filter(mp_obj_t act)
        {
                mp_raise_ValueError("invalid value, act should be in [0,1].");
        }
-       int ret = Helios_BTBLE_SetScanReportFilter(switch_filter);
+#if defined(PLAT_aic8800m40)
+               int ret = -1;
+#else
+               int ret = Helios_BTBLE_SetScanReportFilter(switch_filter);
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_ble_set_scanreport_filter_obj, qpy_ble_gatt_set_scanreport_filter);
 
+#if defined(PLAT_Unisoc_8910_R05)
+STATIC mp_obj_t qpy_ble_gatt_smp_set_config(size_t n_args, const mp_obj_t *args)
+{
+       int ret = 0;
+       int io_cap  = mp_obj_get_int(args[0]);
+       int auth_req    = mp_obj_get_int(args[1]);
+       int passkey    = mp_obj_get_int(args[2]);
+       int timeout    = mp_obj_get_int(args[3]);
+       
+       Helios_BleSmpCfg smp_cfg = {0};
+       smp_cfg.io_cap = io_cap < 5 ? io_cap : 0;
+       smp_cfg.auth_req   = auth_req;
+       smp_cfg.passkey   = passkey;
+       smp_cfg.timeout   = timeout;
+       
+       ret = Helios_BLE_SmpSetConfig(smp_cfg);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_ble_gatt_smp_set_config_obj, 4, 4, qpy_ble_gatt_smp_set_config);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_get_config(void)
+{
+       int ret = 0;
+       Helios_BleSmpCfg smp_cfg = {0};
+
+       ret = Helios_BLE_SmpGetConfig(&smp_cfg);
+       
+       if (ret == 0)
+       {
+               mp_obj_t tuple[4] = 
+               {
+                       mp_obj_new_int(smp_cfg.io_cap),
+                       mp_obj_new_int(smp_cfg.auth_req),
+                       mp_obj_new_int(smp_cfg.passkey),
+                       mp_obj_new_int(smp_cfg.timeout)
+               };
+               return mp_obj_new_tuple(4, tuple);
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_smp_get_config_obj, qpy_ble_gatt_smp_get_config);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_start_pair(size_t n_args, const mp_obj_t *args)
+{
+       int ret = 0;
+       int conn_id   = mp_obj_get_int(args[0]);
+       uint16_t connect_id = conn_id;
+
+       ret = Helios_BLE_SmpStartPair(connect_id);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_ble_gatt_smp_start_pair_obj, 1, 1, qpy_ble_gatt_smp_start_pair);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_user_confirm(size_t n_args, const mp_obj_t *args)
+{
+       int ret = 0;
+       int conn_id   = mp_obj_get_int(args[0]);
+       int pair_op  = mp_obj_get_int(args[1]);
+       int pin    = mp_obj_get_int(args[2]);
+       
+       Helios_BleSmpUserConfirm user_confirm = {0};
+       uint16_t connect_id = conn_id;
+       user_confirm.pair_op = pair_op < 3 ? pair_op : 0;
+       user_confirm.pin   = pin;
+       
+       ret = Helios_BLE_SmpUserConfirm(user_confirm, connect_id);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_ble_gatt_smp_user_confirm_obj, 3, 3, qpy_ble_gatt_smp_user_confirm);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_get_paired_dev_info(void)
+{
+       int ret = 0;
+       int i = 0;
+       unsigned char real_paired_num = 0;
+       Helios_BleSmpDevInfo dev_list[HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT];
+       
+       ret = Helios_BLE_SmpGetPairedDevInfo(HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT, &real_paired_num, dev_list);
+       if (ret == 0)
+       {
+               mp_obj_t pair_dev_list[HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT] = {0};
+               real_paired_num = real_paired_num < HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT ? real_paired_num : HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT;
+           for (i=0; i<real_paired_num; i++)
+           {
+                       pair_dev_list[i] = mp_obj_new_bytes(dev_list[i].addr.addr, HELIOS_BT_MAC_ADDRESS_SIZE);
+           }
+               
+               return mp_obj_new_list(real_paired_num, pair_dev_list);
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_smp_get_paired_dev_info_obj, qpy_ble_gatt_smp_get_paired_dev_info);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_remove_paired_dev(size_t n_args, const mp_obj_t *args)
+{
+       int ret = 0;
+       mp_buffer_info_t datainfo = {0};
+       mp_get_buffer_raise(args[0], &datainfo, MP_BUFFER_READ);
+       Helios_BtBleAddr bleaddr = {0};
+
+       if (datainfo.len != 6)
+       {
+               mp_raise_ValueError("invalid value, addr should be 6 bytes.");
+       }
+       memcpy((void *)bleaddr.addr, (const void *)datainfo.buf, datainfo.len);
+
+       ret = Helios_BLE_SmpRemovePairedDev(&bleaddr);
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_ble_gatt_smp_remove_paired_dev_obj, 1, 1, qpy_ble_gatt_smp_remove_paired_dev);
+
+STATIC mp_obj_t qpy_ble_gatt_smp_clean_paired_dev(void)
+{
+       int ret = 0;
+
+       ret = Helios_BLE_SmpCleanPairedDev();
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_ble_gatt_smp_clean_paired_dev_obj, qpy_ble_gatt_smp_clean_paired_dev);
+#endif
+
 STATIC mp_obj_t qpy_module_ble_deinit(void)
 {
        MOD_BLE_LOG("ble module deinit.\r\n");
        if (ble_mode == HELIOS_BLE_MODE_SERVER)
        {
                MOD_BLE_LOG("ble server deinit.\r\n");
-               Helios_BTBLE_Stop();
+#if defined(PLAT_aic8800m40)
+                               Helios_BLE_GattStop();
+#else
+                               Helios_BTBLE_Stop();
+#endif
                Helios_BLE_GattServerRelease();
                ble_mode = HELIOS_BLE_MODE_NOTRUN;
        }
        else if (ble_mode == HELIOS_BLE_MODE_CLINET)
        {
                MOD_BLE_LOG("ble client deinit.\r\n");
-               Helios_BTBLE_Stop();
+#if defined(PLAT_aic8800m40)
+                               Helios_BLE_GattStop();
+#else
+                               Helios_BTBLE_Stop();
+#endif
                Helios_BLE_GattClientRelease();
                ble_mode = HELIOS_BLE_MODE_NOTRUN;
        }
@@ -1329,7 +1527,15 @@ STATIC const mp_rom_map_elem_t mp_module_ble_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_writeCharaDesc),          MP_ROM_PTR(&qpy_ble_gatt_write_chara_desc_obj)          },
        { MP_ROM_QSTR(MP_QSTR_writeCharaNoRsp),         MP_ROM_PTR(&qpy_ble_gatt_write_chara_norsp_obj)         },
        { MP_ROM_QSTR(MP_QSTR_setScanFilter),           MP_ROM_PTR(&qpy_ble_set_scanreport_filter_obj)          },
-       
+#if defined(PLAT_Unisoc_8910_R05)
+       { MP_ROM_QSTR(MP_QSTR_smpSetConfig),            MP_ROM_PTR(&qpy_ble_gatt_smp_set_config_obj)            },
+       { MP_ROM_QSTR(MP_QSTR_smpGetConfig),            MP_ROM_PTR(&qpy_ble_gatt_smp_get_config_obj)            },
+       { MP_ROM_QSTR(MP_QSTR_smpStartPair),            MP_ROM_PTR(&qpy_ble_gatt_smp_start_pair_obj)            },
+       { MP_ROM_QSTR(MP_QSTR_smpUserConfirm),          MP_ROM_PTR(&qpy_ble_gatt_smp_user_confirm_obj)          },
+       { MP_ROM_QSTR(MP_QSTR_smpGetPairedDevInfo),             MP_ROM_PTR(&qpy_ble_gatt_smp_get_paired_dev_info_obj)           },
+       { MP_ROM_QSTR(MP_QSTR_smpRemovePairedDev),              MP_ROM_PTR(&qpy_ble_gatt_smp_remove_paired_dev_obj)             },
+       { MP_ROM_QSTR(MP_QSTR_smpCleanPairedDev),               MP_ROM_PTR(&qpy_ble_gatt_smp_clean_paired_dev_obj)              },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_ble_globals, mp_module_ble_globals_table);
 
index 33deeb5..bdc2fdf 100644 (file)
-#include <stdint.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-\r
-#include "obj.h"\r
-#include "runtime.h"\r
-#include "mperrno.h"\r
-\r
-\r
-#if MICROPY_QPY_MODULE_CAN_MCP2515\r
-\r
-#include "sockets.h"\r
-#include "helios_spi.h"\r
-#include "helios_debug.h"\r
-//#include "helios_pin.h"\r
-#include "helios_extint.h"\r
-#include "helios_ringbuf.h"\r
-#include "helios_gpio.h"\r
-#include "modcan_mcp2515.h"\r
-\r
-#define HELIOS_MCP2515_LOG(msg, ...)      custom_log("can mcp2515", msg, ##__VA_ARGS__)\r
-\r
-\r
-Helios_SPINum spi_port = 0;\r
-Helios_GPIONum int_pin = 0;\r
-\r
-/* Global variables used internally */\r
-uint8_t mcp2515_txb, mcp2515_ctrl, mcp2515_exmask;\r
-\r
-/* Global variable exposed externally for IRQ handling */\r
-volatile uint8_t mcp2515_irq, mcp2515_buf;\r
-\r
-helios_ring_buf_t *mcp2515_read_ring_bufer = NULL;\r
-\r
-int can_spi_command(uint8_t cmd)\r
-{\r
-       int ret = 0;\r
-       uint32_t critical = Helios_Critical_Enter();\r
-       ret = Helios_SPI_Write(spi_port, (void *)&cmd, 1);\r
-       Helios_Critical_Exit(critical);\r
-       return ret;\r
-}\r
-\r
-int can_r_reg(uint8_t addr, void *buf, uint8_t len)\r
-{\r
-       uint8_t *read_buf = (uint8_t *)malloc(len+2);\r
-       uint8_t *send_buf = (uint8_t *)malloc(len+2);\r
-       int ret = -1;\r
-\r
-       if ((read_buf == NULL) || (send_buf == NULL)) {\r
-               return ret;\r
-       }\r
-       send_buf[0] = MCP2515_SPI_READ;\r
-       send_buf[1] = addr;\r
-       \r
-       uint32_t critical = Helios_Critical_Enter();\r
-       ret = Helios_SPI_WriteRead(spi_port, (void *)read_buf, len+2, (void *)send_buf, len+2);\r
-       Helios_Critical_Exit(critical);\r
-       \r
-       if (ret == 0) {\r
-               memcpy(buf, &read_buf[2], len);\r
-       }\r
-       free(read_buf);\r
-       free(send_buf);\r
-       return ret;\r
-}\r
-\r
-int can_w_reg(uint8_t addr, void *buf, uint8_t len)\r
-{\r
-       uint8_t *sbuf = (uint8_t *)malloc(len+2);\r
-       int ret = -1;\r
-\r
-       if (sbuf == NULL) {\r
-               return ret;\r
-       }\r
-       sbuf[0] = MCP2515_SPI_WRITE;\r
-       sbuf[1] = addr;\r
-       memcpy(&sbuf[2], buf, len);\r
-       ret = Helios_SPI_Write(spi_port, (void *)sbuf, len+2);\r
-       free(sbuf);\r
-       return ret;\r
-}\r
-\r
-int can_w_bit(uint8_t addr, uint8_t mask, uint8_t val)\r
-{\r
-       uint8_t send_data[4] = {0};\r
-       int ret = 0;\r
-\r
-       send_data[0] = MCP2515_SPI_BITMOD;\r
-       send_data[1] = addr;\r
-       send_data[2] = mask;\r
-       send_data[3] = val;\r
-       \r
-       uint32_t critical = Helios_Critical_Enter(); \r
-       ret = Helios_SPI_Write(spi_port, (void *)send_data, 4);\r
-       Helios_Critical_Exit(critical);\r
-       return ret;\r
-}\r
-\r
-int can_w_txbuf(uint8_t bufid, void *buf, uint8_t len)\r
-{\r
-       uint8_t *sbuf = (uint8_t *)malloc(len+1);\r
-       int ret = -1;\r
-\r
-       if (sbuf == NULL) {\r
-               return ret;\r
-       }\r
-       sbuf[0] = MCP2515_SPI_LOAD_TXBUF | (bufid & 0x07);\r
-       memcpy(&sbuf[1], buf, len);\r
-\r
-       uint32_t critical = Helios_Critical_Enter();\r
-       ret = Helios_SPI_Write(spi_port, (void *)sbuf, len+1);\r
-       Helios_Critical_Exit(critical);\r
-       \r
-       free(sbuf);\r
-       return ret;\r
-}\r
-\r
-int can_r_rxbuf(uint8_t bufid, void *buf, uint8_t len)\r
-{\r
-       uint8_t *read_buf = (uint8_t *)malloc(len+1);\r
-       uint8_t *send_buf = (uint8_t *)malloc(len+1);\r
-       int ret = -1;\r
-\r
-       if ((read_buf == NULL) || (send_buf == NULL)) {\r
-               return ret;\r
-       }\r
-       send_buf[0] = MCP2515_SPI_READ_RXBUF | (bufid & 0x06);\r
-       ret = Helios_SPI_WriteRead(spi_port, (void *)read_buf, len+1, (void *)send_buf, len+1);\r
-       if (ret == 0) {\r
-               memcpy(buf, &read_buf[1], len);\r
-       }\r
-       free(read_buf);\r
-       free(send_buf);\r
-       return ret;\r
-}\r
-\r
-/* Main library - Maintenance functions */\r
-/* Bitrate in Hz\r
- * propseg_hint in Time Quanta, 1-8\r
- * syncjump in Time Quanta, 1-4\r
- */\r
-\r
-int can_init(uint32_t bitrate, uint8_t propseg_hint, uint8_t syncjump)\r
-{\r
-       uint8_t ie;\r
-       uint32_t a;\r
-       uint16_t brp = 0, tq_prop, tq_ps1, tq_ps2;\r
-       uint8_t c;\r
-       \r
-       // Sanity check\r
-       if (!bitrate || bitrate > 1000000)\r
-               return -1;\r
-       if (syncjump > 4)\r
-               return -1;\r
-       if (!propseg_hint)\r
-               propseg_hint = 1;\r
-       if (!syncjump)\r
-               syncjump = 1;\r
-\r
-       int ret = Helios_SPI_Init((Helios_SPINum)spi_port, (Helios_SPIMode)0, 4); // 4:13MHz\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("spi init fail");\r
-       }\r
-       \r
-       ret = can_spi_command(MCP2515_SPI_RESET);\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_SPI_RESET fail");\r
-       }\r
-       Helios_msleep(10);\r
-       // 进入配置模式\r
-       mcp2515_ctrl = MCP2515_CANCTRL_REQOP_CONFIGURATION;\r
-       ret = can_w_reg(MCP2515_CANCTRL, &mcp2515_ctrl, 1);\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_CANCTRL fail");\r
-       }\r
-       // 开启中断\r
-       ie = MCP2515_CANINTE_RX0IE | MCP2515_CANINTE_RX1IE | MCP2515_CANINTE_ERRIE | MCP2515_CANINTE_MERRE;\r
-       ret = can_w_reg(MCP2515_CANINTE, &ie, 1); \r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_CANINTE fail");\r
-       }\r
-       mcp2515_irq = 0x00;\r
-       mcp2515_txb = 0x00;\r
-       mcp2515_exmask = 0x00;\r
-\r
-       // Resolve appropriate bitrate prescaler\r
-       do {\r
-               brp++;\r
-               a = CAN_OSC_FREQUENCY / 2 / brp;  // TQ (Time Quanta) = tOSC / 2\r
-               a /= bitrate;\r
-       } while (a > 25);\r
-\r
-       if (a < 8)\r
-               return -1;  // Invalid speed\r
-\r
-       a -= 1;  // Sync Seg fixed at 1 TQ\r
-       if ( (a - propseg_hint) < 3 )\r
-               propseg_hint = a - 3;\r
-       if (propseg_hint > 8)\r
-               propseg_hint = 8;\r
-\r
-       // Propagation segment is hinted by the user (can be tweaked to account for long cable runs)\r
-       tq_prop = propseg_hint;\r
-       a -= tq_prop;\r
-       // Split PS1 and PS2 evenly; give bias to PS2 (it needs to be at least 2xTQ)\r
-       tq_ps1 = a / 2;\r
-       a -= tq_ps1;\r
-       tq_ps2 = a;\r
-\r
-       if (syncjump >= tq_ps2)\r
-               syncjump = tq_ps2 - 1;\r
-\r
-       // Configure BRP, SJW, TQ_PropSeg, TQ_PS1, TQ_PS2\r
-       c = ((brp - 1) & 0x3F) | ((syncjump - 1) << 6);\r
-       HELIOS_MCP2515_LOG("mcp2515_init c=%d,tq_prop=%d,tq_ps1=%d,tq_ps2=%d\r\n", c,tq_prop,tq_ps1,tq_ps2);\r
-       ret = can_w_reg(MCP2515_CNF1, &c, 1);\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_CNF1 write fail");\r
-       }\r
-       ret = can_w_bit(MCP2515_CNF2, MCP2515_CNF2_PRSEG_MASK | MCP2515_CNF2_PHSEG_MASK | MCP2515_CNF2_BTLMODE,\r
-                         MCP2515_CNF2_BTLMODE | (tq_prop-1) | ((tq_ps1-1) << 3));\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_CNF2 write fail");\r
-       }\r
-       ret = can_w_bit(MCP2515_CNF3, MCP2515_CNF3_PHSEG_MASK, tq_ps2-1);\r
-       if(ret != 0) {\r
-               mp_raise_ValueError("MCP2515_CNF3 write fail");\r
-       }\r
-       uint8_t rxbn_data = 0x04;\r
-       ret = can_w_reg(MCP2515_RXB0CTRL, &rxbn_data, 1);\r
-       rxbn_data = 0x00;\r
-       ret = can_w_reg(MCP2515_RXB1CTRL,  &rxbn_data, 1);\r
-       // set rx filter\r
-       uint8_t rx_filter_data[4] = {0};\r
-       uint8_t rx_filter_data_ext[4] = {0, 0x08};\r
-       ret = can_w_reg(MCP2515_RXF0SIDH, rx_filter_data, 4);\r
-       ret = can_w_reg(MCP2515_RXF1SIDH, rx_filter_data_ext, 4);\r
-       ret = can_w_reg(MCP2515_RXF2SIDH, rx_filter_data, 4);\r
-       ret = can_w_reg(MCP2515_RXF3SIDH, rx_filter_data, 4);\r
-       ret = can_w_reg(MCP2515_RXF4SIDH, rx_filter_data, 4);\r
-       ret = can_w_reg(MCP2515_RXF5SIDH, rx_filter_data, 4);\r
-       // set rx mask\r
-       uint8_t rx_mask[4] = {0};\r
-       ret = can_w_reg(MCP2515_RXM0SIDH, rx_mask, 4);\r
-       ret = can_w_reg(MCP2515_RXM1SIDH, rx_mask, 4);\r
-       \r
-       uint8_t can_sta = 0;\r
-       can_r_reg(MCP2515_CANCTRL, &can_sta, 1);\r
-       if ( (can_sta & MCP2515_CANSTAT_OPMOD_MASK) != MCP2515_CANSTAT_OPMOD_NORMAL ) {\r
-               can_w_bit(MCP2515_CANCTRL, MCP2515_CANCTRL_REQOP_MASK, MCP2515_CANCTRL_REQOP_NORMAL);\r
-               mcp2515_ctrl &= ~MCP2515_CANCTRL_REQOP_MASK; \r
-               mcp2515_ctrl |= MCP2515_CANCTRL_REQOP_NORMAL;\r
-       }\r
-       \r
-       \r
-       return ret;\r
-}\r
-\r
-\r
-/* Standard IDs can contain extended bits, but EXIDE is cleared.  This is to support\r
- * masks on standard IDs that allow the Extended ID portion to act as a filter on the first\r
- * 16-bits of the data.\r
- *\r
- *\r
- *  CAN message ID chart\r
- *  +-----------------------------------------------------------------------------------------------+\r
- *  |31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0|\r
- *  +-----------------------------------------------------------------------------------------------+\r
- *    8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1\r
- *  \r
- *                                                                 +--------------------------------+\r
- *                                                                 | CAN Standard ID                |  < CAN 2.0B Standard Message\r
- *                                                                 +--------------------------------+\r
- *                                                                 | SIDH                  | SIDL   |  < MCP2515 Register Assignments\r
- *                                                                 +--------------------------------+\r
- *\r
- *           +--------------------------------+-----------------------------------------------------+\r
- *           | CAN Standard ID                | CAN Extended ID                                     |  < CAN 2.0B Extended Message\r
- *           +-----------------------+--------+-----+-----------------------+-----------------------+\r
- *           | SIDH                  | SIDL   | SIDL| EID8                  | EID0                  |  < MCP2515 Register Assignments\r
- *           +-----------------------+--------+-----+-----------------------+-----------------------+\r
- *\r
- */\r
-void can_compose_msgid_std(uint32_t id, uint8_t *bytebuf)\r
-{\r
-       bytebuf[0] = (uint8_t) ((id & 0x000007F8UL) >> 3);\r
-       bytebuf[1] = (uint8_t) ((id & 0x00000007UL) << 5);\r
-       bytebuf[2] = (uint8_t) ((id & 0xFF000000UL) >> 24);  // Upper 16 bits assumed to be potential byte-filter information\r
-       bytebuf[3] = (uint8_t) ((id & 0x00FF0000UL) >> 16);  // for mask & filters to filter on the first 16 bits of the frame data.\r
-}\r
-\r
-void can_compose_msgid_ext(uint32_t id, uint8_t *bytebuf)\r
-{\r
-       bytebuf[0] = (uint8_t) ((id & 0x1FE00000UL) >> 21);\r
-       bytebuf[1] = (uint8_t) ((id & 0x001C0000UL) >> 13) | (uint8_t) ((id & 0x00030000UL) >> 16) | 0x08;  // EID\r
-       bytebuf[2] = (uint8_t) ((id & 0x0000FF00UL) >> 8);\r
-       bytebuf[3] = (uint8_t) (id & 0x000000FFUL);\r
-}\r
-\r
-uint32_t can_parse_msgid(uint8_t *buf)\r
-{\r
-       uint32_t ret = 0;\r
-\r
-       if (buf[1] & 0x08) {  // Extended message ID\r
-               ret = ((uint32_t)(buf[0]) << 21) | ((uint32_t)(buf[1] & 0xE0) << 13) |\r
-                         (((uint32_t)(buf[1]) & 0x03) << 16) |\r
-                         ((uint32_t)(buf[2]) << 8) |\r
-                         (uint32_t)(buf[3]);\r
-       } else {\r
-               ret = ((uint32_t)(buf[0]) << 3) | ((uint32_t)(buf[1]) >> 5);\r
-       }\r
-       return ret;\r
-}\r
-\r
-\r
-// Returns available TXB if one is available, else -1 indicating the user must wait to TX.\r
-int can_tx_available()\r
-{\r
-       int txb = -1;\r
-       uint8_t can_ctrl = 0;\r
-\r
-       can_r_reg(MCP2515_TXB0CTRL, &can_ctrl, 1);\r
-       if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {\r
-               txb = 0;\r
-       }\r
-       else {\r
-               can_r_reg(MCP2515_TXB1CTRL, &can_ctrl, 1);\r
-               if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {\r
-                       txb = 1;\r\r
-               }\r
-               else {\r
-                       can_r_reg(MCP2515_TXB2CTRL, &can_ctrl, 1);\r
-                       if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {\r
-                               txb = 2;\r\r
-                       }\r
-               }\r
-       }\r
-\r
-       return txb;\r
-}\r
-\r
-/* CAN message transmission */\r
-int can_send(uint32_t msg, uint8_t is_ext, uint8_t is_rtr, void *buf, uint8_t len)\r
-{\r
-       int txb = 0;\r
-       uint8_t outbuf[13];\r
-\r
-       if (len > 8)\r
-               return -1;\r
-\r
-       mcp2515_txb = 0;\r
-       // Choose an available TX buffer\r
-       if ( (txb = can_tx_available()) < 0 )\r
-               return -1;\r
-       mcp2515_txb |= 1 << txb;\r
-       // Sending an Extended message?\r
-       if (is_ext) {\r
-               can_compose_msgid_ext(msg, outbuf);\r
-               if (is_rtr) {outbuf[4] = 0x40;}  // RTR=1, data length = 0\r
-       }\r
-       else {\r
-               can_compose_msgid_std(msg, outbuf);\r
-               if (is_rtr) {outbuf[1] |= 0x10;} // SRR=1\r
-       }\r
-       // Load buffer & send\r
-       if (!is_rtr) {outbuf[4] = len;}\r
-       memcpy(outbuf+5, (uint8_t *)buf, len);\r
-       can_w_txbuf(MCP2515_TXBUF_TXB0SIDH + 2*txb, outbuf, 5+len);\r
-       //can_w_bit(MCP2515_TXB0CTRL + 0x10*txb, MCP2515_TXBCTRL_TXREQ, MCP2515_TXBCTRL_TXREQ);\r
-       can_spi_command(MCP2515_SPI_RTS | mcp2515_txb);  // Initiate transmission\r
-\r
-       return txb;\r
-}\r
-\r
-\r
-// Returns RXBID of first full buffer or -1 if nothing is waiting.\r
-int can_rx_pending(void)\r
-{\r
-       uint8_t canintf;\r
-\r
-       can_r_reg(MCP2515_CANINTF, &canintf, 1);\r
-       if (canintf & MCP2515_CANINTF_RX0IF)\r
-               return 0;\r
-       if (canintf & MCP2515_CANINTF_RX1IF)\r
-               return 1;\r
-       return -1;\r
-}\r
-\r
-/* CAN message receive */\r
-\r
-// Returns length of packet or -1 if nothing to read\r
-int can_recv(can_message_t * msg, uint8_t rxb)\r
-{\r
-       uint8_t msginbuf[13] = {0};\r
-\r
-       // Pull down the message .If the CS pin is raised at the end of the command, it will automatically turn\r
-       // The relevant receive flag bit (CANINTF.RXnIF) is cleared to zero\r
-       can_r_rxbuf(MCP2515_RXBUF_RXB0SIDH + 0x04*rxb, msginbuf, 13);\r
-\r
-       msg->msg_id = can_parse_msgid(msginbuf);\r
-       if (msginbuf[1] & 0x08)\r
-               msg->is_ext = 1;\r
-       else\r
-               msg->is_ext = 0;\r
-       msg->msg_len = msginbuf[4] & 0x0F;\r
-       if (msg->msg_len > 8) {\r
-               HELIOS_MCP2515_LOG("can_recv msg_len=%d\r\n", msg->msg_len);\r
-               return -1;\r
-       }\r
-       memcpy(&(msg->data[0]), msginbuf+5, msg->msg_len);\r
-       // RTR or SRR\r
-       if (msg->is_ext)\r
-               msg->is_rtr = ((msginbuf[4]&0x40) != 0) ? 1 : 0;\r
-       else\r
-               msg->is_rtr = ((msginbuf[1] & 0x10) != 0) ? 1 : 0;\r
-       return 0;\r
-}\r
-\r
-\r
-\r
-/* IRQ handling\r
- * Handler IRQ:\r
- * MCP2515_IRQ_RX\r
- * MCP2515_IRQ_ERROR\r
- * MCP2515_IRQ_WAKEUP\r
- */\r
-void can_irq_handler(void)\r
-{\r
-       int i;\r
-       uint8_t ifg, eflg, ie, txbctrl;\r
-       can_message_t msg;\r
-\r
-       while (1) {\r
-               // Read CANINTF to get started\r
-               can_r_reg(MCP2515_CANINTF, &ifg, 1);\r
-               // RX success IRQ?\r
-               if (ifg & MCP2515_CANINTF_RX0IF) {\r
-                       if(can_recv(&msg, 0) == 0)\r
-                       {\r
-                               if (helios_rb_free_space(mcp2515_read_ring_bufer) >= sizeof(msg))\r
-                               {\r
-                                       helios_rb_write(mcp2515_read_ring_bufer, (unsigned char *)&msg, sizeof(msg));\r
-                               }\r
-                       }\r
-               }\r
-\r
-               // RX success IRQ?\r
-               if (ifg &  MCP2515_CANINTF_RX1IF) {\r
-                       if(can_recv(&msg, 1) == 0)\r
-                       {\r
-                               if (helios_rb_free_space(mcp2515_read_ring_bufer) >= sizeof(msg))\r
-                               {\r
-                                       helios_rb_write(mcp2515_read_ring_bufer, (unsigned char *)&msg, sizeof(msg));\r
-                               }\r
-                       }\r
-               }\r
-               // Message error?\r
-               if (ifg & MCP2515_CANINTF_MERRF) {\r
-                       can_w_bit(MCP2515_CANINTF, MCP2515_CANINTF_MERRF, 0);\r
-               }\r
-\r
-               // All other errors are expressed in EFLG.\r
-               if (ifg & MCP2515_CANINTF_ERRIF) {\r
-                       // ERRIF ... Read EFLG.\r
-                       can_r_reg(MCP2515_EFLG, &eflg, 1);\r
-\r
-                       if (eflg & (MCP2515_EFLG_RX0OVR | MCP2515_EFLG_RX1OVR)) {\r
-                               // RX overflow\r
-                               can_w_bit(MCP2515_EFLG, MCP2515_EFLG_RX0OVR | MCP2515_EFLG_RX1OVR, 0);\r
-                               can_w_bit(MCP2515_CANINTF, MCP2515_CANINTF_ERRIF, 0);\r
-                       }\r
-               }\r
-               if (Helios_GPIO_GetLevel(int_pin) != 0) {\r\r
-                       Helios_ExtInt_Enable(int_pin);\r
-                       if (Helios_GPIO_GetLevel(int_pin) != 0) {\r\r
-                               return;\r
-                       }\r
-               }\r
-       }\r
-       \r
-}\r
-\r
-/* 定义mcp2515_obj_t结构体 */\r
-typedef struct _mcp2515_obj_t\r
-{\r
-    mp_obj_base_t base;   //定义的对象结构体要包含该成员\r
-    uint32_t port;\r
-       uint32_t pin;\r
-       uint32_t baudrate;              // CAN 波特率 500k、250k、125k等\r
-}mcp2515_obj_t;\r
-const mp_obj_type_t can_mcp2515_type;\r
-\r
-\r
-mp_obj_t can_mcp2515_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {\r
-    enum { ARG_port, ARG_int_pin, ARG_baudrate, ARG_read_buf_size };\r
-    static const mp_arg_t allowed_args[] = {\r
-               { MP_QSTR_port, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-               { MP_QSTR_int_pin, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-        { MP_QSTR_baudrate, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-        { MP_QSTR_read_buff_size, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-    };\r
-\r
-    mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];\r
-    mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);\r
-\r
-       uint32_t port = args[ARG_port].u_int;\r
-       uint32_t baudrate = args[ARG_baudrate].u_int;\r
-       uint32_t read_buf_size = args[ARG_read_buf_size].u_int;\r
-       uint32_t pin = args[ARG_int_pin].u_int;\r
-    int ret=-1;\r
-\r
-    if (port > HELIOS_SPI3) {\r
-       mp_raise_ValueError("port must be (0~3)");\r
-    }\r
-       \r
-\r
-       if (baudrate > 1000) {\r
-       mp_raise_ValueError("baudrate must be less than 1000k");\r
-    }\r
-\r
-       \r
-       Helios_ExtIntStruct extint_struct = {0};\r
-       extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;\r
-       extint_struct.gpio_edge = HELIOS_EDGE_FALLING;\r
-       extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;\r
-       extint_struct.gpio_pull = HELIOS_PULL_UP;\r
-       extint_struct.eint_cb = NULL;\r
-       extint_struct.wakeup_eint_cb = can_irq_handler;\r
-       if((0 == Helios_ExtInt_Disable((Helios_GPIONum)pin)) && (0 == Helios_ExtInt_Deinit((Helios_GPIONum)pin))) {\r
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "obj.h"
+#include "runtime.h"
+#include "mperrno.h"
+
+
+#if MICROPY_QPY_MODULE_CAN_MCP2515
+
+#include "sockets.h"
+#include "helios_spi.h"
+#include "helios_debug.h"
+//#include "helios_pin.h"
+#include "helios_extint.h"
+#include "helios_ringbuf.h"
+#include "helios_gpio.h"
+#include "modcan_mcp2515.h"
+
+#define HELIOS_MCP2515_LOG(msg, ...)      custom_log("can mcp2515", msg, ##__VA_ARGS__)
+
+
+Helios_SPINum spi_port = 0;
+Helios_GPIONum int_pin = 0;
+
+/* Global variables used internally */
+uint8_t mcp2515_txb, mcp2515_ctrl, mcp2515_exmask;
+
+/* Global variable exposed externally for IRQ handling */
+volatile uint8_t mcp2515_irq, mcp2515_buf;
+
+helios_ring_buf_t *mcp2515_read_ring_bufer = NULL;
+
+int can_spi_command(uint8_t cmd)
+{
+       int ret = 0;
+       uint32_t critical = Helios_Critical_Enter();
+       ret = Helios_SPI_Write(spi_port, (void *)&cmd, 1);
+       Helios_Critical_Exit(critical);
+       return ret;
+}
+
+int can_r_reg(uint8_t addr, void *buf, uint8_t len)
+{
+       uint8_t *read_buf = (uint8_t *)malloc(len+2);
+       uint8_t *send_buf = (uint8_t *)malloc(len+2);
+       int ret = -1;
+
+       if ((read_buf == NULL) || (send_buf == NULL)) {
+               return ret;
+       }
+       send_buf[0] = MCP2515_SPI_READ;
+       send_buf[1] = addr;
+       
+       uint32_t critical = Helios_Critical_Enter();
+       ret = Helios_SPI_WriteRead(spi_port, (void *)read_buf, len+2, (void *)send_buf, len+2);
+       Helios_Critical_Exit(critical);
+       
+       if (ret == 0) {
+               memcpy(buf, &read_buf[2], len);
+       }
+       free(read_buf);
+       free(send_buf);
+       return ret;
+}
+
+int can_w_reg(uint8_t addr, void *buf, uint8_t len)
+{
+       uint8_t *sbuf = (uint8_t *)malloc(len+2);
+       int ret = -1;
+
+       if (sbuf == NULL) {
+               return ret;
+       }
+       sbuf[0] = MCP2515_SPI_WRITE;
+       sbuf[1] = addr;
+       memcpy(&sbuf[2], buf, len);
+       ret = Helios_SPI_Write(spi_port, (void *)sbuf, len+2);
+       free(sbuf);
+       return ret;
+}
+
+int can_w_bit(uint8_t addr, uint8_t mask, uint8_t val)
+{
+       uint8_t send_data[4] = {0};
+       int ret = 0;
+
+       send_data[0] = MCP2515_SPI_BITMOD;
+       send_data[1] = addr;
+       send_data[2] = mask;
+       send_data[3] = val;
+       
+       uint32_t critical = Helios_Critical_Enter(); 
+       ret = Helios_SPI_Write(spi_port, (void *)send_data, 4);
+       Helios_Critical_Exit(critical);
+       return ret;
+}
+
+int can_w_txbuf(uint8_t bufid, void *buf, uint8_t len)
+{
+       uint8_t *sbuf = (uint8_t *)malloc(len+1);
+       int ret = -1;
+
+       if (sbuf == NULL) {
+               return ret;
+       }
+       sbuf[0] = MCP2515_SPI_LOAD_TXBUF | (bufid & 0x07);
+       memcpy(&sbuf[1], buf, len);
+
+       uint32_t critical = Helios_Critical_Enter();
+       ret = Helios_SPI_Write(spi_port, (void *)sbuf, len+1);
+       Helios_Critical_Exit(critical);
+       
+       free(sbuf);
+       return ret;
+}
+
+int can_r_rxbuf(uint8_t bufid, void *buf, uint8_t len)
+{
+       uint8_t *read_buf = (uint8_t *)malloc(len+1);
+       uint8_t *send_buf = (uint8_t *)malloc(len+1);
+       int ret = -1;
+
+       if ((read_buf == NULL) || (send_buf == NULL)) {
+               return ret;
+       }
+       send_buf[0] = MCP2515_SPI_READ_RXBUF | (bufid & 0x06);
+       ret = Helios_SPI_WriteRead(spi_port, (void *)read_buf, len+1, (void *)send_buf, len+1);
+       if (ret == 0) {
+               memcpy(buf, &read_buf[1], len);
+       }
+       free(read_buf);
+       free(send_buf);
+       return ret;
+}
+
+/* Main library - Maintenance functions */
+/* Bitrate in Hz
+ * propseg_hint in Time Quanta, 1-8
+ * syncjump in Time Quanta, 1-4
+ */
+
+int can_init(uint32_t bitrate, uint8_t propseg_hint, uint8_t syncjump)
+{
+       uint8_t ie;
+       uint32_t a;
+       uint16_t brp = 0, tq_prop, tq_ps1, tq_ps2;
+       uint8_t c;
+       
+       // Sanity check
+       if (!bitrate || bitrate > 1000000)
+               return -1;
+       if (syncjump > 4)
+               return -1;
+       if (!propseg_hint)
+               propseg_hint = 1;
+       if (!syncjump)
+               syncjump = 1;
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       int ret = Helios_SPI_Init((Helios_SPINum)spi_port, (Helios_SPIMode)0, 3, 0); // 4:13MHz
+#else
+       int ret = Helios_SPI_Init((Helios_SPINum)spi_port, (Helios_SPIMode)0, 3); // 4:13MHz
+#endif
+       if(ret != 0) {
+               mp_raise_ValueError("spi init fail");
+       }
+       
+       ret = can_spi_command(MCP2515_SPI_RESET);
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_SPI_RESET fail");
+       }
+       Helios_msleep(10);
+       // 进入配置模式
+       mcp2515_ctrl = MCP2515_CANCTRL_REQOP_CONFIGURATION;
+       ret = can_w_reg(MCP2515_CANCTRL, &mcp2515_ctrl, 1);
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_CANCTRL fail");
+       }
+       // 开启中断
+       ie = MCP2515_CANINTE_RX0IE | MCP2515_CANINTE_RX1IE | MCP2515_CANINTE_ERRIE | MCP2515_CANINTE_MERRE;
+       ret = can_w_reg(MCP2515_CANINTE, &ie, 1); 
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_CANINTE fail");
+       }
+       mcp2515_irq = 0x00;
+       mcp2515_txb = 0x00;
+       mcp2515_exmask = 0x00;
+
+       // Resolve appropriate bitrate prescaler
+       do {
+               brp++;
+               a = CAN_OSC_FREQUENCY / 2 / brp;  // TQ (Time Quanta) = tOSC / 2
+               a /= bitrate;
+       } while (a > 25);
+
+       if (a < 8)
+               return -1;  // Invalid speed
+
+       a -= 1;  // Sync Seg fixed at 1 TQ
+       if ( (a - propseg_hint) < 3 )
+               propseg_hint = a - 3;
+       if (propseg_hint > 8)
+               propseg_hint = 8;
+
+       // Propagation segment is hinted by the user (can be tweaked to account for long cable runs)
+       tq_prop = propseg_hint;
+       a -= tq_prop;
+       // Split PS1 and PS2 evenly; give bias to PS2 (it needs to be at least 2xTQ)
+       tq_ps1 = a / 2;
+       a -= tq_ps1;
+       tq_ps2 = a;
+
+       if (syncjump >= tq_ps2)
+               syncjump = tq_ps2 - 1;
+
+       // Configure BRP, SJW, TQ_PropSeg, TQ_PS1, TQ_PS2
+       c = ((brp - 1) & 0x3F) | ((syncjump - 1) << 6);
+       HELIOS_MCP2515_LOG("mcp2515_init c=%d,tq_prop=%d,tq_ps1=%d,tq_ps2=%d\r\n", c,tq_prop,tq_ps1,tq_ps2);
+       ret = can_w_reg(MCP2515_CNF1, &c, 1);
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_CNF1 write fail");
+       }
+       ret = can_w_bit(MCP2515_CNF2, MCP2515_CNF2_PRSEG_MASK | MCP2515_CNF2_PHSEG_MASK | MCP2515_CNF2_BTLMODE,
+                         MCP2515_CNF2_BTLMODE | (tq_prop-1) | ((tq_ps1-1) << 3));
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_CNF2 write fail");
+       }
+       ret = can_w_bit(MCP2515_CNF3, MCP2515_CNF3_PHSEG_MASK, tq_ps2-1);
+       if(ret != 0) {
+               mp_raise_ValueError("MCP2515_CNF3 write fail");
+       }
+       uint8_t rxbn_data = 0x04;
+       ret = can_w_reg(MCP2515_RXB0CTRL, &rxbn_data, 1);
+       rxbn_data = 0x00;
+       ret = can_w_reg(MCP2515_RXB1CTRL,  &rxbn_data, 1);
+       // set rx filter
+       uint8_t rx_filter_data[4] = {0};
+       uint8_t rx_filter_data_ext[4] = {0, 0x08};
+       ret = can_w_reg(MCP2515_RXF0SIDH, rx_filter_data, 4);
+       ret = can_w_reg(MCP2515_RXF1SIDH, rx_filter_data_ext, 4);
+       ret = can_w_reg(MCP2515_RXF2SIDH, rx_filter_data, 4);
+       ret = can_w_reg(MCP2515_RXF3SIDH, rx_filter_data, 4);
+       ret = can_w_reg(MCP2515_RXF4SIDH, rx_filter_data, 4);
+       ret = can_w_reg(MCP2515_RXF5SIDH, rx_filter_data, 4);
+       // set rx mask
+       uint8_t rx_mask[4] = {0};
+       ret = can_w_reg(MCP2515_RXM0SIDH, rx_mask, 4);
+       ret = can_w_reg(MCP2515_RXM1SIDH, rx_mask, 4);
+       
+       uint8_t can_sta = 0;
+       can_r_reg(MCP2515_CANCTRL, &can_sta, 1);
+       if ( (can_sta & MCP2515_CANSTAT_OPMOD_MASK) != MCP2515_CANSTAT_OPMOD_NORMAL ) {
+               can_w_bit(MCP2515_CANCTRL, MCP2515_CANCTRL_REQOP_MASK, MCP2515_CANCTRL_REQOP_NORMAL);
+               mcp2515_ctrl &= ~MCP2515_CANCTRL_REQOP_MASK; 
+               mcp2515_ctrl |= MCP2515_CANCTRL_REQOP_NORMAL;
+       }
+       
+       
+       return ret;
+}
+
+
+/* Standard IDs can contain extended bits, but EXIDE is cleared.  This is to support
+ * masks on standard IDs that allow the Extended ID portion to act as a filter on the first
+ * 16-bits of the data.
+ *
+ *
+ *  CAN message ID chart
+ *  +-----------------------------------------------------------------------------------------------+
+ *  |31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0|
+ *  +-----------------------------------------------------------------------------------------------+
+ *    8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1  8  4  2  1
+ *  
+ *                                                                 +--------------------------------+
+ *                                                                 | CAN Standard ID                |  < CAN 2.0B Standard Message
+ *                                                                 +--------------------------------+
+ *                                                                 | SIDH                  | SIDL   |  < MCP2515 Register Assignments
+ *                                                                 +--------------------------------+
+ *
+ *           +--------------------------------+-----------------------------------------------------+
+ *           | CAN Standard ID                | CAN Extended ID                                     |  < CAN 2.0B Extended Message
+ *           +-----------------------+--------+-----+-----------------------+-----------------------+
+ *           | SIDH                  | SIDL   | SIDL| EID8                  | EID0                  |  < MCP2515 Register Assignments
+ *           +-----------------------+--------+-----+-----------------------+-----------------------+
+ *
+ */
+void can_compose_msgid_std(uint32_t id, uint8_t *bytebuf)
+{
+       bytebuf[0] = (uint8_t) ((id & 0x000007F8UL) >> 3);
+       bytebuf[1] = (uint8_t) ((id & 0x00000007UL) << 5);
+       bytebuf[2] = (uint8_t) ((id & 0xFF000000UL) >> 24);  // Upper 16 bits assumed to be potential byte-filter information
+       bytebuf[3] = (uint8_t) ((id & 0x00FF0000UL) >> 16);  // for mask & filters to filter on the first 16 bits of the frame data.
+}
+
+void can_compose_msgid_ext(uint32_t id, uint8_t *bytebuf)
+{
+       bytebuf[0] = (uint8_t) ((id & 0x1FE00000UL) >> 21);
+       bytebuf[1] = (uint8_t) ((id & 0x001C0000UL) >> 13) | (uint8_t) ((id & 0x00030000UL) >> 16) | 0x08;  // EID
+       bytebuf[2] = (uint8_t) ((id & 0x0000FF00UL) >> 8);
+       bytebuf[3] = (uint8_t) (id & 0x000000FFUL);
+}
+
+uint32_t can_parse_msgid(uint8_t *buf)
+{
+       uint32_t ret = 0;
+
+       if (buf[1] & 0x08) {  // Extended message ID
+               ret = ((uint32_t)(buf[0]) << 21) | ((uint32_t)(buf[1] & 0xE0) << 13) |
+                         (((uint32_t)(buf[1]) & 0x03) << 16) |
+                         ((uint32_t)(buf[2]) << 8) |
+                         (uint32_t)(buf[3]);
+       } else {
+               ret = ((uint32_t)(buf[0]) << 3) | ((uint32_t)(buf[1]) >> 5);
+       }
+       return ret;
+}
+
+
+// Returns available TXB if one is available, else -1 indicating the user must wait to TX.
+int can_tx_available()
+{
+       int txb = -1;
+       uint8_t can_ctrl = 0;
+
+       can_r_reg(MCP2515_TXB0CTRL, &can_ctrl, 1);
+       if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {
+               txb = 0;
+       }
+       else {
+               can_r_reg(MCP2515_TXB1CTRL, &can_ctrl, 1);
+               if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {
+                       txb = 1;
+               }
+               else {
+                       can_r_reg(MCP2515_TXB2CTRL, &can_ctrl, 1);
+                       if ( !(can_ctrl & MCP2515_TXBCTRL_TXREQ) ) {
+                               txb = 2;
+                       }
+               }
+       }
+
+       return txb;
+}
+
+/* CAN message transmission */
+int can_send(uint32_t msg, uint8_t is_ext, uint8_t is_rtr, void *buf, uint8_t len)
+{
+       int txb = 0;
+       uint8_t outbuf[13];
+
+       if (len > 8)
+               return -1;
+
+       mcp2515_txb = 0;
+       // Choose an available TX buffer
+       if ( (txb = can_tx_available()) < 0 )
+               return -1;
+       mcp2515_txb |= 1 << txb;
+       // Sending an Extended message?
+       if (is_ext) {
+               can_compose_msgid_ext(msg, outbuf);
+               if (is_rtr) {outbuf[4] = 0x40;}  // RTR=1, data length = 0
+       }
+       else {
+               can_compose_msgid_std(msg, outbuf);
+               if (is_rtr) {outbuf[1] |= 0x10;} // SRR=1
+       }
+       // Load buffer & send
+       if (!is_rtr) {outbuf[4] = len;}
+       memcpy(outbuf+5, (uint8_t *)buf, len);
+       can_w_txbuf(MCP2515_TXBUF_TXB0SIDH + 2*txb, outbuf, 5+len);
+       //can_w_bit(MCP2515_TXB0CTRL + 0x10*txb, MCP2515_TXBCTRL_TXREQ, MCP2515_TXBCTRL_TXREQ);
+       can_spi_command(MCP2515_SPI_RTS | mcp2515_txb);  // Initiate transmission
+
+       return txb;
+}
+
+
+// Returns RXBID of first full buffer or -1 if nothing is waiting.
+int can_rx_pending(void)
+{
+       uint8_t canintf;
+
+       can_r_reg(MCP2515_CANINTF, &canintf, 1);
+       if (canintf & MCP2515_CANINTF_RX0IF)
+               return 0;
+       if (canintf & MCP2515_CANINTF_RX1IF)
+               return 1;
+       return -1;
+}
+
+/* CAN message receive */
+
+// Returns length of packet or -1 if nothing to read
+int can_recv(can_message_t * msg, uint8_t rxb)
+{
+       uint8_t msginbuf[13] = {0};
+
+       // Pull down the message .If the CS pin is raised at the end of the command, it will automatically turn
+       // The relevant receive flag bit (CANINTF.RXnIF) is cleared to zero
+       can_r_rxbuf(MCP2515_RXBUF_RXB0SIDH + 0x04*rxb, msginbuf, 13);
+
+       msg->msg_id = can_parse_msgid(msginbuf);
+       if (msginbuf[1] & 0x08)
+               msg->is_ext = 1;
+       else
+               msg->is_ext = 0;
+       msg->msg_len = msginbuf[4] & 0x0F;
+       if (msg->msg_len > 8) {
+               HELIOS_MCP2515_LOG("can_recv msg_len=%d\r\n", msg->msg_len);
+               return -1;
+       }
+       memcpy(&(msg->data[0]), msginbuf+5, msg->msg_len);
+       // RTR or SRR
+       if (msg->is_ext)
+               msg->is_rtr = ((msginbuf[4]&0x40) != 0) ? 1 : 0;
+       else
+               msg->is_rtr = ((msginbuf[1] & 0x10) != 0) ? 1 : 0;
+       return 0;
+}
+
+
+
+/* IRQ handling
+ * Handler IRQ:
+ * MCP2515_IRQ_RX
+ * MCP2515_IRQ_ERROR
+ * MCP2515_IRQ_WAKEUP
+ */
+void can_irq_handler(void)
+{
+       int i;
+       uint8_t ifg, eflg, ie, txbctrl;
+       can_message_t msg;
+
+       while (1) {
+               // Read CANINTF to get started
+               can_r_reg(MCP2515_CANINTF, &ifg, 1);
+               // RX success IRQ?
+               if (ifg & MCP2515_CANINTF_RX0IF) {
+                       if(can_recv(&msg, 0) == 0)
+                       {
+                               if (helios_rb_free_space(mcp2515_read_ring_bufer) >= sizeof(msg))
+                               {
+                                       helios_rb_write(mcp2515_read_ring_bufer, (unsigned char *)&msg, sizeof(msg));
+                               }
+                       }
+               }
+
+               // RX success IRQ?
+               if (ifg &  MCP2515_CANINTF_RX1IF) {
+                       if(can_recv(&msg, 1) == 0)
+                       {
+                               if (helios_rb_free_space(mcp2515_read_ring_bufer) >= sizeof(msg))
+                               {
+                                       helios_rb_write(mcp2515_read_ring_bufer, (unsigned char *)&msg, sizeof(msg));
+                               }
+                       }
+               }
+               // Message error?
+               if (ifg & MCP2515_CANINTF_MERRF) {
+                       can_w_bit(MCP2515_CANINTF, MCP2515_CANINTF_MERRF, 0);
+               }
+
+               // All other errors are expressed in EFLG.
+               if (ifg & MCP2515_CANINTF_ERRIF) {
+                       // ERRIF ... Read EFLG.
+                       can_r_reg(MCP2515_EFLG, &eflg, 1);
+
+                       if (eflg & (MCP2515_EFLG_RX0OVR | MCP2515_EFLG_RX1OVR)) {
+                               // RX overflow
+                               can_w_bit(MCP2515_EFLG, MCP2515_EFLG_RX0OVR | MCP2515_EFLG_RX1OVR, 0);
+                               can_w_bit(MCP2515_CANINTF, MCP2515_CANINTF_ERRIF, 0);
+                       }
+               }
+               if (Helios_GPIO_GetLevel(int_pin) != 0) {
+                       Helios_ExtInt_Enable(int_pin);
+                       if (Helios_GPIO_GetLevel(int_pin) != 0) {
+                               return;
+                       }
+               }
+       }
+       
+}
+
+/* 定义mcp2515_obj_t结构体 */
+typedef struct _mcp2515_obj_t
+{
+    mp_obj_base_t base;   //定义的对象结构体要包含该成员
+    uint32_t port;
+       uint32_t pin;
+       uint32_t baudrate;              // CAN 波特率 500k、250k、125k等
+}mcp2515_obj_t;
+const mp_obj_type_t can_mcp2515_type;
+
+
+mp_obj_t can_mcp2515_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+    enum { ARG_port, ARG_int_pin, ARG_baudrate, ARG_read_buf_size };
+    static const mp_arg_t allowed_args[] = {
+               { MP_QSTR_port, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+               { MP_QSTR_int_pin, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+        { MP_QSTR_baudrate, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+        { MP_QSTR_read_buff_size, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    };
+
+    mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+       uint32_t port = args[ARG_port].u_int;
+       uint32_t baudrate = args[ARG_baudrate].u_int;
+       uint32_t read_buf_size = args[ARG_read_buf_size].u_int;
+       uint32_t pin = args[ARG_int_pin].u_int;
+    int ret=-1;
+
+    if (port > HELIOS_SPI3) {
+       mp_raise_ValueError("port must be (0~3)");
+    }
+       
+
+       if (baudrate > 1000) {
+       mp_raise_ValueError("baudrate must be less than 1000k");
+    }
+
+       
+       Helios_ExtIntStruct extint_struct = {0};
+       extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
+       extint_struct.gpio_edge = HELIOS_EDGE_FALLING;
+       extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
+       extint_struct.gpio_pull = HELIOS_PULL_UP;
+       extint_struct.eint_cb = NULL;
+       extint_struct.wakeup_eint_cb = can_irq_handler;
+       if((0 == Helios_ExtInt_Disable((Helios_GPIONum)pin)) && (0 == Helios_ExtInt_Deinit((Helios_GPIONum)pin))) {
                ret = 0;
-       }\r
-       if(0 != Helios_ExtInt_Init((Helios_GPIONum)pin,  &extint_struct)) {\r
-               mp_raise_ValueError("Interrupt initialization failed");\r
-       }\r
-       Helios_ExtInt_Enable((Helios_GPIONum)pin);\r
-\r
-    mcp2515_obj_t *self = m_new_obj(mcp2515_obj_t);\r
-    self->base.type = &can_mcp2515_type;\r
-       self->port = port;\r
-       self->baudrate = baudrate;\r
-       spi_port = port;\r
-       int_pin = (Helios_GPIONum)pin;\r
-       ret = can_init(baudrate*1000, 1, 1);\r
-       if (ret != 0)\r
-       {\r
-               mp_raise_ValueError("mcp2515 init fail");\r
-       }\r
-       if (mcp2515_read_ring_bufer == NULL)\r
-       {\r
-               mcp2515_read_ring_bufer = helios_rb_create(read_buf_size*sizeof(can_message_t));\r
-       }\r
-       \r
-    return MP_OBJ_FROM_PTR(self);\r
-}\r
-\r
-STATIC mp_obj_t mcp2515_obj_get_frame_number(mp_obj_t self_in) {\r
-       int ret = 0;\r
-    mcp2515_obj_t *self = MP_OBJ_TO_PTR(self_in);\r
-       ret = helios_rb_data_len(mcp2515_read_ring_bufer)/sizeof(can_message_t);\r
-\r
-       return mp_obj_new_int(ret);\r
+       }
+       if(0 != Helios_ExtInt_Init((Helios_GPIONum)pin,  &extint_struct)) {
+               mp_raise_ValueError("Interrupt initialization failed");
+       }
+       Helios_ExtInt_Enable((Helios_GPIONum)pin);
+
+    mcp2515_obj_t *self = m_new_obj(mcp2515_obj_t);
+    self->base.type = &can_mcp2515_type;
+       self->port = port;
+       self->baudrate = baudrate;
+       spi_port = port;
+       int_pin = (Helios_GPIONum)pin;
+       ret = can_init(baudrate*1000, 1, 1);
+       if (ret != 0)
+       {
+               mp_raise_ValueError("mcp2515 init fail");
+       }
+       if (mcp2515_read_ring_bufer == NULL)
+       {
+               mcp2515_read_ring_bufer = helios_rb_create(read_buf_size*sizeof(can_message_t));
+       }
+       
+    return MP_OBJ_FROM_PTR(self);
+}
+
+STATIC mp_obj_t mcp2515_obj_get_frame_number(mp_obj_t self_in) {
+       int ret = 0;
+    mcp2515_obj_t *self = MP_OBJ_TO_PTR(self_in);
+       ret = helios_rb_data_len(mcp2515_read_ring_bufer)/sizeof(can_message_t);
+
+       return mp_obj_new_int(ret);
        
-}\r
-\r
-STATIC mp_obj_t mcp2515_obj_read_register(mp_obj_t self_in, mp_obj_t register_addr_obj) {\r
-       int read_data = 0;\r
-    int register_addr = mp_obj_get_int(register_addr_obj);\r
-       \r
-       can_r_reg(register_addr, &read_data, 1);\r
-\r
-       return mp_obj_new_int(read_data);\r
+}
+
+STATIC mp_obj_t mcp2515_obj_read_register(mp_obj_t self_in, mp_obj_t register_addr_obj) {
+       int read_data = 0;
+    int register_addr = mp_obj_get_int(register_addr_obj);
+       
+       can_r_reg(register_addr, &read_data, 1);
+
+       return mp_obj_new_int(read_data);
+       
+}
+
+STATIC mp_obj_t mcp2515_obj_read(mp_obj_t self_in, mp_obj_t read_num_obj) {
+    mcp2515_obj_t *self = MP_OBJ_TO_PTR(self_in);
+       int read_num = mp_obj_get_int(read_num_obj);
+       unsigned int i = 0;
+       int remain_frame_num = 0;
+       mp_obj_t tuple[5];
+       mp_obj_t can_frame_list = mp_obj_new_list(0, NULL);
+
+       if(read_num == 0) {
+               mp_raise_ValueError("read_num can not be 0");
+       } 
+       remain_frame_num = helios_rb_data_len(mcp2515_read_ring_bufer)/sizeof(can_message_t);
+       read_num = (read_num > remain_frame_num) ? remain_frame_num : read_num;
+       uint8_t *read_data = (uint8_t *)malloc(read_num*sizeof(can_message_t));
+       if (read_data == NULL) {
+               mp_raise_ValueError("malloc read_data err");
+       }
+       if(helios_rb_read(mcp2515_read_ring_bufer, read_data, read_num*sizeof(can_message_t)) != read_num*sizeof(can_message_t)) {
+               mp_raise_ValueError("read can flame err");
+       }
        
-}\r
-\r
-STATIC mp_obj_t mcp2515_obj_read(mp_obj_t self_in, mp_obj_t read_num_obj) {\r
-    mcp2515_obj_t *self = MP_OBJ_TO_PTR(self_in);\r
-       int read_num = mp_obj_get_int(read_num_obj);\r
-       unsigned int i = 0;\r
-       int remain_frame_num = 0;\r
-       mp_obj_t tuple[5];\r
-       mp_obj_t can_frame_list = mp_obj_new_list(0, NULL);\r
-
-       if(read_num == 0) {\r
-               mp_raise_ValueError("read_num can not be 0");\r
-       } \r
-       remain_frame_num = helios_rb_data_len(mcp2515_read_ring_bufer)/sizeof(can_message_t);\r
-       read_num = (read_num > remain_frame_num) ? remain_frame_num : read_num;\r
-       uint8_t *read_data = (uint8_t *)malloc(read_num*sizeof(can_message_t));\r
-       if (read_data == NULL) {\r
-               mp_raise_ValueError("malloc read_data err");\r
-       }\r
-       if(helios_rb_read(mcp2515_read_ring_bufer, read_data, read_num*sizeof(can_message_t)) != read_num*sizeof(can_message_t)) {\r
-               mp_raise_ValueError("read can flame err");\r
-       }\r
-       \r
-       for(i=0; i<read_num*sizeof(can_message_t); ) {\r
-               tuple[0] = mp_obj_new_int(read_data[i] + (read_data[i+1] << 8) + (read_data[i+2] << 16) + (read_data[i+3] << 24));\r
-               tuple[1] = mp_obj_new_int(read_data[i+4]);\r
-               tuple[2] = mp_obj_new_int(read_data[i+5]);\r
-               tuple[3] = mp_obj_new_int(read_data[i+6]);\r
-               tuple[4] = mp_obj_new_bytes(&read_data[i+8], 8);\r
-               mp_obj_list_append(can_frame_list, mp_obj_new_tuple(5, tuple));\r
-               \r
-               //mp_obj_list_append(can_frame_list, mp_obj_new_bytes(&read_data[i], 16));\r
-               i += sizeof(can_message_t);\r
-       }\r
-       free(read_data);\r
-    return can_frame_list;\r
+       for(i=0; i<read_num*sizeof(can_message_t); ) {
+               tuple[0] = mp_obj_new_int(read_data[i] + (read_data[i+1] << 8) + (read_data[i+2] << 16) + (read_data[i+3] << 24));
+               tuple[1] = mp_obj_new_int(read_data[i+4]);
+               tuple[2] = mp_obj_new_int(read_data[i+5]);
+               tuple[3] = mp_obj_new_int(read_data[i+6]);
+               tuple[4] = mp_obj_new_bytes(&read_data[i+8], 8);
+               mp_obj_list_append(can_frame_list, mp_obj_new_tuple(5, tuple));
+               
+               //mp_obj_list_append(can_frame_list, mp_obj_new_bytes(&read_data[i], 16));
+               i += sizeof(can_message_t);
+       }
+       free(read_data);
+    return can_frame_list;
 }
-\r
-\r
-STATIC const mp_arg_t mcp2515_obj_write_allowed_args[] = {\r
-       { MP_QSTR_msg_id,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-    { MP_QSTR_is_ext,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-    { MP_QSTR_is_rtr,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },\r
-    { MP_QSTR_writebuf,     MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },\r
-};\r
-STATIC mp_obj_t mcp2515_obj_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {\r
-    enum { ARG_msg_id, ARG_is_ext, ARG_is_rtr, ARG_writebuf };\r
-    mp_arg_val_t args[MP_ARRAY_SIZE(mcp2515_obj_write_allowed_args)];\r
-    mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args,\r
-        MP_ARRAY_SIZE(mcp2515_obj_write_allowed_args), mcp2515_obj_write_allowed_args, args);\r
-       mcp2515_obj_t *self = (mcp2515_obj_t *)MP_OBJ_TO_PTR(pos_args[0]);\r
-\r
-    // get the buffer to read the data into\r
-       mp_buffer_info_t writebuf;\r
-    mp_get_buffer_raise(args[ARG_writebuf].u_obj, &writebuf, MP_BUFFER_READ);\r
-       int length = writebuf.len;\r
-       int rtr = args[ARG_is_rtr].u_int;\r
-       int ret = -1;\r
-    // do the transfer\r
-       if (rtr == 0) {\r
-               ret = can_send(args[ARG_msg_id].u_int, args[ARG_is_ext].u_int, 0, writebuf.buf, length);\r
-       }\r
-       else if(rtr == 1) {\r
-               ret = can_send(args[ARG_msg_id].u_int, args[ARG_is_ext].u_int, 1, writebuf.buf, 0);\r
-       }\r
- \r
-    if (ret < 0) {\r
-        HELIOS_MCP2515_LOG("mcp2515_obj_write ret=%d\r\n",ret);\r
-    }\r
-    return mp_obj_new_int(ret);\r
-}\r
-\r
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcp2515_obj_get_frame_number_obj, mcp2515_obj_get_frame_number);\r
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(mcp2515_obj_read_obj, mcp2515_obj_read);\r
-STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mcp2515_obj_write_obj, 1, mcp2515_obj_write);\r
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(mcp2515_obj_read_register_obj, mcp2515_obj_read_register);\r
-\r
-\r
-\r
-/* 定义type的本地字典 */\r
-STATIC const mp_rom_map_elem_t mcp2515_locals_dict_table[] = {\r
-       { MP_OBJ_NEW_QSTR(MP_QSTR___name__),MP_ROM_QSTR(MP_QSTR_MCP2515) },\r
-    { MP_ROM_QSTR(MP_QSTR_get_frame_number), MP_ROM_PTR(&mcp2515_obj_get_frame_number_obj) },\r
-    { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mcp2515_obj_read_obj) },\r
-    { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mcp2515_obj_write_obj) },\r
-    { MP_ROM_QSTR(MP_QSTR_read_register), MP_ROM_PTR(&mcp2515_obj_read_register_obj) },\r
-};\r
-\r
-STATIC MP_DEFINE_CONST_DICT(mcp2515_locals_dict, mcp2515_locals_dict_table);\r
-\r
-/* 定义mp_obj_type_t类型的结构体;注意这里和定义module使用的类型是不一样的 */\r
-const mp_obj_type_t can_mcp2515_type = {\r
-    .base={ &mp_type_type }, \r
-    .name = MP_QSTR_MCP2515, //type类的name属性是放在这里定义,而不是放在DICT中\r
-    .make_new = can_mcp2515_make_new, //添加的make new属性\r
-    .locals_dict = (mp_obj_dict_t*)&mcp2515_locals_dict, //注册mcp2515_locals_dict\r
-};\r
-\r
-\r
-\r
-#endif /* MICROPY_QPY_CAN_MCP2515 */\r
-\r
+
+
+STATIC const mp_arg_t mcp2515_obj_write_allowed_args[] = {
+       { MP_QSTR_msg_id,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_is_ext,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_is_rtr,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+    { MP_QSTR_writebuf,     MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+};
+STATIC mp_obj_t mcp2515_obj_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+    enum { ARG_msg_id, ARG_is_ext, ARG_is_rtr, ARG_writebuf };
+    mp_arg_val_t args[MP_ARRAY_SIZE(mcp2515_obj_write_allowed_args)];
+    mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args,
+        MP_ARRAY_SIZE(mcp2515_obj_write_allowed_args), mcp2515_obj_write_allowed_args, args);
+       mcp2515_obj_t *self = (mcp2515_obj_t *)MP_OBJ_TO_PTR(pos_args[0]);
+
+    // get the buffer to read the data into
+       mp_buffer_info_t writebuf;
+    mp_get_buffer_raise(args[ARG_writebuf].u_obj, &writebuf, MP_BUFFER_READ);
+       int length = writebuf.len;
+       int rtr = args[ARG_is_rtr].u_int;
+       int ret = -1;
+    // do the transfer
+       if (rtr == 0) {
+               ret = can_send(args[ARG_msg_id].u_int, args[ARG_is_ext].u_int, 0, writebuf.buf, length);
+       }
+       else if(rtr == 1) {
+               ret = can_send(args[ARG_msg_id].u_int, args[ARG_is_ext].u_int, 1, writebuf.buf, 0);
+       }
+ 
+    if (ret < 0) {
+        HELIOS_MCP2515_LOG("mcp2515_obj_write ret=%d\r\n",ret);
+    }
+    return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcp2515_obj_get_frame_number_obj, mcp2515_obj_get_frame_number);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mcp2515_obj_read_obj, mcp2515_obj_read);
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(mcp2515_obj_write_obj, 1, mcp2515_obj_write);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(mcp2515_obj_read_register_obj, mcp2515_obj_read_register);
+
+
+
+/* 定义type的本地字典 */
+STATIC const mp_rom_map_elem_t mcp2515_locals_dict_table[] = {
+       { MP_OBJ_NEW_QSTR(MP_QSTR___name__),MP_ROM_QSTR(MP_QSTR_MCP2515) },
+    { MP_ROM_QSTR(MP_QSTR_get_frame_number), MP_ROM_PTR(&mcp2515_obj_get_frame_number_obj) },
+    { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mcp2515_obj_read_obj) },
+    { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mcp2515_obj_write_obj) },
+    { MP_ROM_QSTR(MP_QSTR_read_register), MP_ROM_PTR(&mcp2515_obj_read_register_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(mcp2515_locals_dict, mcp2515_locals_dict_table);
+
+/* 定义mp_obj_type_t类型的结构体;注意这里和定义module使用的类型是不一样的 */
+const mp_obj_type_t can_mcp2515_type = {
+    .base={ &mp_type_type }, 
+    .name = MP_QSTR_MCP2515, //type类的name属性是放在这里定义,而不是放在DICT中
+    .make_new = can_mcp2515_make_new, //添加的make new属性
+    .locals_dict = (mp_obj_dict_t*)&mcp2515_locals_dict, //注册mcp2515_locals_dict
+};
+
+
+
+#endif /* MICROPY_QPY_CAN_MCP2515 */
+
index 7ff0354..8a784f3 100644 (file)
@@ -30,7 +30,7 @@
 
 extern Helios_LBSInfoStruct position_rec;
 #define MAX_CELL_NUM 2
-#if !defined(PLAT_ASR_1803s) && !defined(PLAT_RDA)
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc) && !defined(PLAT_RDA)
 STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
 {
 #if 1
@@ -61,7 +61,7 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
 #endif
 
     /* cell info encode*/
-#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8850)
+#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05)  && !defined(PLAT_Unisoc_8910_R06) && !defined(PLAT_Unisoc_8850) && !defined(PLAT_Unisoc_8850_R02)
     char para[5]={0};
 #endif
     tlv_cellinfo_struct info[MAX_CELL_NUM] = {0};
@@ -83,7 +83,7 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
                 {
                     info[0].radio_type = NETWORK_MODE_GSM;
                                        
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                                        info[0].mcc = cell_info.gsm_info[i].mcc;
                                        info[0].mnc = cell_info.gsm_info[i].mnc;
                                #else
@@ -111,7 +111,7 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
                 {
                     info[0].radio_type = NETWORK_MODE_WCDMA;
                                        
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                                        info[0].mcc = cell_info.umts_info[i].mcc;
                                        info[0].mnc = cell_info.umts_info[i].mnc;
                                #else
@@ -147,7 +147,7 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
                 cell_info.lte_info[i].tac,cell_info.lte_info[i].earfcn,cell_info.lte_info[i].rssi, cell_info.lte_info[i].pci, cell_info.lte_info[i].rsrq);
                     info[cell_num].radio_type = NETWORK_MODE_LTE;
                                        
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                                        info[cell_num].mcc = cell_info.lte_info[i].mcc;
                                        info[cell_num].mnc = cell_info.lte_info[i].mnc;
                                #else
@@ -224,8 +224,11 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
     memset(&authInfo, 0, sizeof(QTlvAuthInfo));
     memcpy(authInfo.name, "quectel", strlen("quectel"));
     memcpy(authInfo.pwd, "123456", strlen("123456"));
-
-    ret = Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1);
+    #if MICROPY_QPY_MODULE_DSDS
+    ret = Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1,simid);
+    #else
+    ret = Helios_Dev_GetIMEI((void *)authInfo.imei, AUTH_IMEI_LEN+1,0);
+    #endif
     QPY_MODLBS_LOG("cell_locreq:  get imei [%s]\r\n", authInfo.imei);
 
     mp_buffer_info_t tokeninfo = {0};
@@ -431,6 +434,8 @@ STATIC mp_obj_t cell_wifi_locreqencode(size_t n_args, const mp_obj_t *args)
                 mp_obj_new_str((char *)retBuffer, retLen),
             };
 
+    SAFE_FREE(retBuffer);//@20230706 added by Mark to fix the memory leak in celllocator
+    
     return mp_obj_new_tuple(2, codeinfo_objs);
 #else
     /* cell info encode*/
@@ -817,7 +822,7 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
     /* cell info encode*/
     uint8_t ret = 0;
     uint8_t i = 0;
-#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8850)
+#if !defined(PLAT_Unisoc) && !defined(PLAT_Unisoc_8910_R05) && !defined(PLAT_Unisoc_8910_R06) && !defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
     char para[5]={0};
 #endif
     //tlv_cellinfo_struct info = {0};
@@ -845,7 +850,7 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
                                        
                                        info.cellinfo[i].radio_type = NETWORK_MODE_GSM;
                                        
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
                                        info.cellinfo[i].mcc = cell_info.gsm_info[i].mcc;
                                        info.cellinfo[i].mnc = cell_info.gsm_info[i].mnc;
                                #else
@@ -882,7 +887,7 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
                                        
                     info.cellinfo[i].radio_type = NETWORK_MODE_WCDMA;
 
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850_R02)
                                        info.cellinfo[i].mcc = cell_info.umts_info[i].mcc;
                                        info.cellinfo[i].mnc = cell_info.umts_info[i].mnc;
                                #else
@@ -918,7 +923,7 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
                                        
                     info.cellinfo[i].radio_type = NETWORK_MODE_LTE;
 
-                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+                               #if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                                        info.cellinfo[i].mcc = cell_info.lte_info[i].mcc;
                                        info.cellinfo[i].mnc = cell_info.lte_info[i].mnc;
                                #else
@@ -965,6 +970,7 @@ STATIC mp_obj_t cell_locreqencode(size_t n_args, const mp_obj_t *args)
                 mp_obj_new_str((char *)encode_info.retBuffer, encode_info.len),
             };
 
+    SAFE_FREE(encode_info.retBuffer);//@20230706 added by Mark to fix the memory leak in celllocator
     return mp_obj_new_tuple(2, codeinfo_objs);
 #endif
 }
@@ -974,15 +980,13 @@ STATIC mp_obj_t encode_cell_locreq_tlvinfo(size_t n_args, const mp_obj_t *args)
 {
     QTLVNode* firstNode = NULL;
     int32_t retValue = 0;
-    uint8_t buffer[512];
 
     firstNode = QTLVNode_Create();
-    mp_buffer_info_t datainfo = {0};
-    mp_get_buffer_raise(args[0], &datainfo, MP_BUFFER_READ);
-    memcpy(buffer, datainfo.buf, datainfo.len);
+    mp_buffer_info_t bufinfo;
+    mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
 
     memset(&position_rec, 0, sizeof(Helios_LBSInfoStruct));
-    retValue = tlv_parse_to_tree(buffer, (uint32_t)strlen((char *)buffer), &firstNode);
+    retValue = tlv_parse_to_tree(bufinfo.buf, bufinfo.len, &firstNode);
     if (retValue == 0)
     {
         mp_obj_t codeinfo_objs[3] = {
@@ -1010,7 +1014,7 @@ STATIC const mp_rom_map_elem_t mp_module_celllocator_qpy_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_encodeCellLocreq), MP_ROM_PTR(&qpy_lbs_encode_cell_tlvinfo_obj) },
     { MP_ROM_QSTR(MP_QSTR_getCellLocreq), MP_ROM_PTR(&qpy_lbs_get_cellinfo_locreqencode_obj) },
 
-#if !defined(PLAT_ASR_1803s)  && !defined(PLAT_RDA)
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc)  && !defined(PLAT_RDA)
 
     { MP_ROM_QSTR(MP_QSTR_getCellAndWifiLocreq), MP_ROM_PTR(&qpy_lbs_get_cellwifiinfo_locreqencode_obj) },
 
index 17227d0..de31e5d 100644 (file)
@@ -102,7 +102,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_csd_modem_config_obj, qpy_csd_modem_config)
 STATIC mp_obj_t qpy_csd_modem_ims_config(mp_obj_t mode)
 {
        int modom_mode = mp_obj_get_int(mode);
-       int ret = Helios_Csd_Modem_Config(modom_mode);
+       int ret = Helios_Csd_Modem_Ims_Config(modom_mode);
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_csd_modem_ims_config_obj, qpy_csd_modem_ims_config);
index 366c3a5..a10571f 100644 (file)
 #include "helios_datacall.h"
 #include "callbackdeal.h"
 
+#if MICROPY_QPY_MODULE_WANINFO
+#include "netif.h"
+#include "ip6_addr.h"
+#endif
 
 #define MOD_DATACALL_LOG(msg, ...)      custom_log(DataCall, msg, ##__VA_ARGS__)
 
@@ -75,6 +79,18 @@ STATIC mp_obj_t qpy_datacall_set_pdp_context(size_t n_args, const mp_obj_t *args
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of password should be no more than [%d] bytes."), HELIOS_PWD_LEN_MAX);
        }
+       if (usrinfo.len == 0 && pwdinfo.len == 0 && auth_type != 0) {
+               auth_type = 0;
+       }
+
+       int cur_simid = _get_current_simid();
+       if (n_args ==7) {
+               cur_simid = mp_obj_get_int(args[6]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
 
        Helios_DataCallStartStruct pdp_context = {0};
        pdp_context.ip_type = ip_type;
@@ -82,11 +98,16 @@ STATIC mp_obj_t qpy_datacall_set_pdp_context(size_t n_args, const mp_obj_t *args
        memcpy((void *)pdp_context.apn, apninfo.buf, apninfo.len);
        memcpy((void *)pdp_context.user, usrinfo.buf, usrinfo.len);
        memcpy((void *)pdp_context.pwd, pwdinfo.buf, pwdinfo.len);
-
+       MP_THREAD_GIL_EXIT();
+       #if MICROPY_QPY_MODULE_DSDS
+       ret = Helios_DataCall_SetPDPContext(cur_simid,profile_id, &pdp_context);
+       #else
        ret = Helios_DataCall_SetPDPContext(profile_id, &pdp_context);
+       #endif
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_pdp_context_obj, 6, 6, qpy_datacall_set_pdp_context);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_pdp_context_obj, 6, 7, qpy_datacall_set_pdp_context);
 
 
 STATIC mp_obj_t qpy_datacall_get_pdp_context(size_t n_args, const mp_obj_t *args)
@@ -102,8 +123,21 @@ STATIC mp_obj_t qpy_datacall_get_pdp_context(size_t n_args, const mp_obj_t *args
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
-
+       int cur_simid = _get_current_simid();
+       if (n_args ==2) {
+               cur_simid = mp_obj_get_int(args[1]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
+       #if MICROPY_QPY_MODULE_DSDS
+       ret = Helios_DataCall_GetPDPContext(cur_simid,profile_id, &pdp_context);
+       #else
        ret = Helios_DataCall_GetPDPContext(profile_id, &pdp_context);
+       #endif
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                mp_obj_t pdp_ctx[5] = 
@@ -119,7 +153,7 @@ STATIC mp_obj_t qpy_datacall_get_pdp_context(size_t n_args, const mp_obj_t *args
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_pdp_context_obj, 1, 1, qpy_datacall_get_pdp_context);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_pdp_context_obj, 1, 2, qpy_datacall_get_pdp_context);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_datacall_start                                                */
@@ -189,13 +223,21 @@ STATIC mp_obj_t qpy_datacall_start(size_t n_args, const mp_obj_t *args)
     snprintf(DataCallStartStruct.pwd, sizeof(DataCallStartStruct.pwd), "%s", (char *)pwdinfo.buf);
 
     int cur_simid = _get_current_simid();
+       if (n_args ==7) {
+               cur_simid = mp_obj_get_int(args[6]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+
     MP_THREAD_GIL_EXIT();
     ret = Helios_DataCall_Start(profile_id, cur_simid, &DataCallStartStruct);
     MP_THREAD_GIL_ENTER();
     
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_start_obj, 5, 6, qpy_datacall_start);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_start_obj, 5, 7, qpy_datacall_start);
 
 
 STATIC mp_obj_t qpy_datacall_stop(size_t n_args, const mp_obj_t *args)
@@ -216,13 +258,19 @@ STATIC mp_obj_t qpy_datacall_stop(size_t n_args, const mp_obj_t *args)
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, ipTpye should be in [0,2]."));
        }
-
+       if (n_args ==3) {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_DataCall_Stop((int32_t)profile_id, cur_simid, (int32_t)ip_type);
        MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_stop_obj, 2, 2, qpy_datacall_stop);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_stop_obj, 2, 3, qpy_datacall_stop);
 
 
 /*=============================================================================*/
@@ -250,10 +298,17 @@ STATIC mp_obj_t qpy_datacall_set_autoconnect(size_t n_args, const mp_obj_t *args
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, profileID should be in [%d,%d]."), min_profile_id, max_profile_id);
        }
        int cur_simid = _get_current_simid();
+       if (n_args ==3) {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        ret = Helios_DataCall_SetAutoConnect((int32_t)profile_id, cur_simid, enable);
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_autoconnect_obj, 1, 2, qpy_datacall_set_autoconnect);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_autoconnect_obj, 1, 3, qpy_datacall_set_autoconnect);
 
 
 /*=============================================================================*/
@@ -300,7 +355,16 @@ STATIC mp_obj_t qpy_datacall_get_info(size_t n_args, const mp_obj_t *args)
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, ipType should be in [0~%d]."), HELIOS_PDP_TYPE_NUM - 1);
        }
        int cur_simid = _get_current_simid();
+       if (n_args ==3) {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
        ret = Helios_DataCall_GetInfo(profile_id, cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (0 == ret)
        {
                inet_ntop(AF_INET, &info.v4.addr.ip, ip4_ip_addr, sizeof(ip4_ip_addr));
@@ -360,7 +424,7 @@ STATIC mp_obj_t qpy_datacall_get_info(size_t n_args, const mp_obj_t *args)
        return mp_obj_new_int(ret);
 }
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_info_obj, 1, 2, qpy_datacall_get_info);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_info_obj, 1, 3, qpy_datacall_get_info);
 
 
 
@@ -481,7 +545,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_datacall_get_apn_obj, qpy_datacall_get_apn)
 
 STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
 {
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s)|| defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)|| defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
     int sim_id = mp_obj_get_int(args[0]);
     int ret = 0;
     char apn[99+1] = {0};
@@ -491,7 +556,9 @@ STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
        }
     if (n_args == 1)
     {
+               MP_THREAD_GIL_EXIT();
         ret = Helios_DataCall_GetApn(2, sim_id, apn);
+               MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(apn, strlen(apn));
@@ -501,8 +568,9 @@ STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
     else if (n_args == 2)
     {
         int pid = mp_obj_get_int(args[1]);
-        
+        MP_THREAD_GIL_EXIT();
         ret = Helios_DataCall_GetApn(3, sim_id, apn, pid);
+               MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(apn, strlen(apn));
@@ -519,7 +587,7 @@ STATIC mp_obj_t qpy_datacall_get_apn(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_apn_obj, 1, 2, qpy_datacall_get_apn);
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t qpy_datacall_set_dns_server(size_t n_args, const mp_obj_t *args)
 {
     int profile_id  = mp_obj_get_int(args[0]);
@@ -547,8 +615,9 @@ STATIC mp_obj_t qpy_datacall_set_dns_server(size_t n_args, const mp_obj_t *args)
     memcpy(new_sec, new_sec_dns.buf, new_sec_dns.len);
 
     int ret = 0;
+       MP_THREAD_GIL_EXIT();
     ret = Helios_DataCall_SetDnsServer(profile_id, sim_id, new_pri, new_sec);
-
+       MP_THREAD_GIL_ENTER();
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_dns_server_obj, 4, 4, qpy_datacall_set_dns_server);
@@ -557,8 +626,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_set_dns_server_obj, 4, 4
 STATIC mp_obj_t qpy_datacall_get_date_speed(size_t n_args, const mp_obj_t *args)
 {
        uint32_t rx = 0, tx = 0;
-#ifdef PLAT_ASR_1803s
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+       MP_THREAD_GIL_EXIT();
        Helios_DataCall_GetDataSpeed(&rx, &tx);
+       MP_THREAD_GIL_ENTER();
 #endif
        mp_obj_t date_speed[2] = {
                mp_obj_new_int_from_uint(rx),   //bps
@@ -568,17 +639,175 @@ STATIC mp_obj_t qpy_datacall_get_date_speed(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_date_speed_obj, 0, 0, qpy_datacall_get_date_speed);
 
+STATIC mp_obj_t qpy_datacall_get_address_info(size_t n_args, const mp_obj_t *args)
+{
+    int profile_id  = mp_obj_get_int(args[0]);
+    int ip_type = 0;
+
+    if (n_args == 2)
+    {
+        ip_type = mp_obj_get_int(args[1]);
+    }
+
+#if MICROPY_QPY_MODULE_WANINFO
+    struct netif* netif_cfg = netif_get_by_cid(profile_id-1);
+
+    if(netif_cfg)
+    {
+        static uint8_t g_mac[6] = {0};
+        g_mac[0] = netif_cfg->hwaddr[0];
+        g_mac[1] = netif_cfg->hwaddr[1];
+        g_mac[2] = netif_cfg->hwaddr[2];
+        g_mac[3] = netif_cfg->hwaddr[3];
+        g_mac[4] = netif_cfg->hwaddr[4];
+        g_mac[5] = netif_cfg->hwaddr[5];
+
+        char mac[64] = {0};
+        sprintf(mac, "%02X-%02X-%02X-%02X-%02X-%02X", g_mac[0], g_mac[1], g_mac[2], g_mac[3], g_mac[4], g_mac[5]);
+
+        if (ip_type == 0)//IPV4
+        {
+            char mask[16] = {0};
+            char gw[16] = {0};
+            
+            struct sockaddr_in local_v4;
+
+            local_v4.sin_addr.s_addr = netif_cfg->netmask.addr;
+            inet_ntop(AF_INET, &local_v4.sin_addr.s_addr, mask, sizeof(mask));
+
+            local_v4.sin_addr.s_addr = netif_cfg->gw.addr;
+            inet_ntop(AF_INET, &local_v4.sin_addr.s_addr, gw, sizeof(gw));
+
+            mp_obj_t addrinfo_tuple[3] = {
+                mp_obj_new_str(mac, strlen(mac)),
+                mp_obj_new_str(mask, strlen(mask)),
+                mp_obj_new_str(gw, strlen(gw))
+            };
+
+            return mp_obj_new_tuple(3,addrinfo_tuple);
+        }
+        else if (ip_type == 1)//IPV6
+        {
+            struct sockaddr_in6 local_v6;
+            char ip6_gw[64] = {0};
+            ip6_addr_t * ip6_addr_ptr = NULL;
+
+            ip6_addr_ptr = &(netif_cfg->ip6_gw);
+            memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
+            inet_ntop(AF_INET6, &local_v6.sin6_addr, ip6_gw, sizeof(ip6_gw));
+
+            mp_obj_t addrinfo_tuple[2] = {
+                mp_obj_new_str(mac, strlen(mac)),
+                mp_obj_new_str(ip6_gw, strlen(ip6_gw))
+            };
+
+            return mp_obj_new_tuple(2,addrinfo_tuple);
+        }
+        else if (ip_type == 2)//IPV4&6
+        {
+            char mask[16] = {0};
+            char gw[16] = {0};
+
+            struct sockaddr_in local_v4;
+
+            local_v4.sin_addr.s_addr = netif_cfg->netmask.addr;
+            inet_ntop(AF_INET, &local_v4.sin_addr.s_addr, mask, sizeof(mask));
+
+            local_v4.sin_addr.s_addr = netif_cfg->gw.addr;
+            inet_ntop(AF_INET, &local_v4.sin_addr.s_addr, gw, sizeof(gw));
+
+            mp_obj_t addrinfo_tuple[3] = {
+                mp_obj_new_str(mac, strlen(mac)),
+                mp_obj_new_str(mask, strlen(mask)),
+                mp_obj_new_str(gw, strlen(gw))
+            };
+
+            char ip6_gw[64] = {0};
+            struct sockaddr_in6 local_v6;
+            ip6_addr_t * ip6_addr_ptr = NULL;
+
+            ip6_addr_ptr = &(netif_cfg->ip6_gw);
+            memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
+            inet_ntop(AF_INET6, &local_v6.sin6_addr, ip6_gw, sizeof(ip6_gw));
+
+            mp_obj_t addr6info_tuple[2] = {
+                mp_obj_new_str(mac, strlen(mac)),
+                mp_obj_new_str(ip6_gw, strlen(ip6_gw))
+            };
+
+            mp_obj_t ipconfig_list[2] = {
+                mp_obj_new_tuple(3, addrinfo_tuple),
+                mp_obj_new_tuple(2, addr6info_tuple)
+            };
+            return mp_obj_new_list(2, ipconfig_list);
+        }
+    }
+#else
+    (void)profile_id;(void)ip_type;
+#endif
+
+    return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_address_info_obj, 1, 2, qpy_datacall_get_address_info);
+
+STATIC mp_obj_t qpy_datacall_get_sim_info(size_t n_args, const mp_obj_t *args)
+{
+    int sim_id  = mp_obj_get_int(args[0]);
+
+#if MICROPY_QPY_MODULE_WANINFO
+    Helios_DataCallSimUsed info;
+
+    Helios_DataCall_GetSimUsed(sim_id, &info);
+    
+    mp_obj_t siminfo_tuple[4] = {
+        mp_obj_new_int(info.recv_MBytes_sim),
+        mp_obj_new_int(info.recv_Bytes_sim),
+        mp_obj_new_int(info.used_MBytes_sim),
+        mp_obj_new_int(info.used_Bytes_sim)
+    };
+
+    return mp_obj_new_tuple(4,siminfo_tuple);
+#endif
+
+    return mp_obj_new_int(-1);
+}STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_get_sim_info_obj, 1, 1, qpy_datacall_get_sim_info);
+
 STATIC mp_obj_t qpy_module_datacall_deinit(void)
 {
        g_usr_callback = NULL;
     MOD_DATACALL_LOG("module datacall deinit.\r\n");
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        Helios_DataCall_Deinit();
 #endif
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_datacall_deinit_obj, qpy_module_datacall_deinit);
 
+
+STATIC mp_obj_t qpy_datacall_use_attach_apn(size_t n_args, const mp_obj_t *args)
+{
+#if defined(PLAT_ASR)
+    int ret = 0;
+    bool is_using_attach_apn = false;
+    if (n_args == 1) {
+        is_using_attach_apn = mp_obj_is_true(args[0]);
+               MP_THREAD_GIL_EXIT();
+        ret = Helios_DataCall_SetIsUseAttachApn(is_using_attach_apn ? 0 : 1);
+               MP_THREAD_GIL_ENTER(); 
+        return mp_obj_new_int(ret); 
+    } else {
+               MP_THREAD_GIL_EXIT();
+        is_using_attach_apn = Helios_DataCall_GetIsUseAttachApn();
+               MP_THREAD_GIL_ENTER();
+        return mp_obj_new_bool(!is_using_attach_apn); 
+    }
+#else
+        mp_raise_ValueError(MP_ERROR_TEXT("NOT SUPPORT"));
+#endif
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_datacall_use_attach_apn_obj, 0, 1, qpy_datacall_use_attach_apn);
+
+
 STATIC const mp_rom_map_elem_t mp_module_datacall_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR___name__),                MP_ROM_QSTR(MP_QSTR_dial) },
        { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_datacall_deinit_obj) },
@@ -593,10 +822,13 @@ STATIC const mp_rom_map_elem_t mp_module_datacall_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_getPdpRange),             MP_ROM_PTR(&qpy_get_pdp_range_obj) },
        { MP_ROM_QSTR(MP_QSTR_getRange),                MP_ROM_PTR(&qpy_datacall_get_range_obj) },
        { MP_ROM_QSTR(MP_QSTR_getApn),          MP_ROM_PTR(&qpy_datacall_get_apn_obj) },
-       #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+       #if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_setDnsserver),    MP_ROM_PTR(&qpy_datacall_set_dns_server_obj) },
        #endif
+       { MP_ROM_QSTR(MP_QSTR_useAttachApn),    MP_ROM_PTR(&qpy_datacall_use_attach_apn_obj) },
        { MP_ROM_QSTR(MP_QSTR_getSpeed),        MP_ROM_PTR(&qpy_datacall_get_date_speed_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getAddressinfo),  MP_ROM_PTR(&qpy_datacall_get_address_info_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getSiminfo),      MP_ROM_PTR(&qpy_datacall_get_sim_info_obj) },
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_datacall_globals, mp_module_datacall_globals_table);
 
index 02af9ae..c01ea20 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "helios_dev.h"
 
+
 STATIC mp_obj_t queclib_dev_product_id()
 {
        char product_id_str[64] = {0};
@@ -37,12 +38,26 @@ STATIC mp_obj_t queclib_dev_product_id()
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_product_id_obj, queclib_dev_product_id);
 
+extern int _get_current_simid(void);
 
-
-STATIC mp_obj_t queclib_dev_serial_number()
+STATIC mp_obj_t queclib_dev_serial_number(size_t n_args, const mp_obj_t *args)
 {
+#if !defined(PLAT_aic8800m40) && !defined(PLAT_ECR6600)
+       int cur_simid = _get_current_simid();
+       if (n_args ==1) {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+#endif
        char serial_number_str[64] = {0};
-       int ret = Helios_Dev_GetSN((void *)serial_number_str, sizeof(serial_number_str));
+       #if MICROPY_QPY_MODULE_DSDS
+       int ret = Helios_Dev_GetSN((void *)serial_number_str, sizeof(serial_number_str), cur_simid);
+       #else
+       int ret = Helios_Dev_GetSN((void *)serial_number_str, sizeof(serial_number_str),0);
+       #endif
        if(ret == 0)
        {
                return mp_obj_new_str(serial_number_str, strlen(serial_number_str));
@@ -50,8 +65,7 @@ STATIC mp_obj_t queclib_dev_serial_number()
        return mp_obj_new_int(-1);
 }
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_serial_number_obj, queclib_dev_serial_number);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(queclib_dev_serial_number_obj, 0, 1, queclib_dev_serial_number);
 
 STATIC mp_obj_t queclib_dev_model()
 {
@@ -67,7 +81,7 @@ STATIC mp_obj_t queclib_dev_model()
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_model_obj, queclib_dev_model);
 
 
-STATIC mp_obj_t queclib_dev_fw_version()
+mp_obj_t queclib_dev_fw_version()
 {
        char fw_version_str[64] = {0};
        int ret = Helios_Dev_GetFwVersion((void *)fw_version_str, sizeof(fw_version_str));
@@ -81,12 +95,30 @@ STATIC mp_obj_t queclib_dev_fw_version()
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_fw_version_obj, queclib_dev_fw_version);
 
 
+#if !defined(PLAT_aic8800m40) && !defined(PLAT_ECR6600)
 
-STATIC mp_obj_t queclib_dev_imei()
+STATIC mp_obj_t queclib_dev_imei(size_t n_args, const mp_obj_t *args)
 {
+       int cur_simid = _get_current_simid();
+       if (n_args ==1) {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        //the imei length is 15-17 bytes
        char imei_str[19] = {0};
-       int ret = Helios_Dev_GetIMEI((void *)imei_str, sizeof(imei_str));
+#if MICROPY_QPY_MODULE_DSDS
+       int ret = Helios_Dev_GetIMEI((void *)imei_str, sizeof(imei_str), cur_simid);
+#else
+       #if MICROPY_QPY_MODULE_DUALIMEI
+       cur_simid = (n_args ==1) ? cur_simid + 2 : 0;
+       int ret = Helios_Dev_GetIMEI((void *)imei_str, sizeof(imei_str),cur_simid);
+       #else
+       int ret = Helios_Dev_GetIMEI((void *)imei_str, sizeof(imei_str),0);
+       #endif
+#endif
        if(ret == 0)
        {
                return mp_obj_new_str(imei_str, strlen(imei_str));
@@ -94,7 +126,8 @@ STATIC mp_obj_t queclib_dev_imei()
        return mp_obj_new_int(-1);
 }
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_imei_obj, queclib_dev_imei);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(queclib_dev_imei_obj, 0, 1, queclib_dev_imei);
+#endif
 
 #if defined (PLAT_Qualcomm)
 STATIC mp_obj_t queclib_dev_backup()
@@ -157,14 +190,63 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(main_uart_enable_get_obj, main_uart_enable_get)
 
 #endif
 
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+
+STATIC mp_obj_t queclib_dev_mac()
+{
+       char serial_number_str[64] = {0};
+       int ret = Helios_Dev_GetMAC((void *)serial_number_str, sizeof(serial_number_str));
+       sprintf(serial_number_str,"%02x:%02x:%02x:%02x:%02x:%02x",
+       serial_number_str[0]&0xff,
+       serial_number_str[1]&0xff,
+       serial_number_str[2]&0xff,
+       serial_number_str[3]&0xff,
+       serial_number_str[4]&0xff,
+       serial_number_str[5]&0xff);
+
+       if(ret == 0)
+       {
+               return mp_obj_new_str(serial_number_str, strlen(serial_number_str));
+       }
+
+       return mp_obj_new_int(-1);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(queclib_dev_mac_obj, queclib_dev_mac);
+#endif
+
+
+#if defined(BOARD_EG915ULA_AC_USBUP) || defined(BOARD_EG915UCN_AC_USBUP) \
+       || defined(BOARD_EG915UEU_AC_USBUP) || defined(BOARD_EG915UEC_AC_USBUP)
+int Helios_Dev_SetIMEI(void *buffer);
+
+STATIC mp_obj_t queclib_dev_imei_set(mp_obj_t imei) {
+    char *imei_str = (char *)mp_obj_str_get_str(imei);
+       MP_THREAD_GIL_EXIT();
+    int ret = Helios_Dev_SetIMEI(imei_str);
+       MP_THREAD_GIL_ENTER();
+       if(ret != 0)
+       {
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_int(0);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(queclib_dev_imei_set_obj, queclib_dev_imei_set);
+#endif
 
 STATIC const mp_rom_map_elem_t mp_module_modem_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_modem) },
-    { MP_ROM_QSTR(MP_QSTR_getDevSN), MP_ROM_PTR(&queclib_dev_serial_number_obj) },
+#if !defined(PLAT_aic8800m40)
+       { MP_ROM_QSTR(MP_QSTR_getDevSN), MP_ROM_PTR(&queclib_dev_serial_number_obj) },
+#endif
+#if !defined(PLAT_aic8800m40) && !defined(PLAT_ECR6600)
     { MP_ROM_QSTR(MP_QSTR_getDevImei), MP_ROM_PTR(&queclib_dev_imei_obj) },
+#endif
        { MP_ROM_QSTR(MP_QSTR_getDevModel), MP_ROM_PTR(&queclib_dev_model_obj) },
        { MP_ROM_QSTR(MP_QSTR_getDevFwVersion), MP_ROM_PTR(&queclib_dev_fw_version_obj) },
        { MP_ROM_QSTR(MP_QSTR_getDevProductId), MP_ROM_PTR(&queclib_dev_product_id_obj) },
+
 #if defined (PLAT_Qualcomm)
        { MP_ROM_QSTR(MP_QSTR_backup), MP_ROM_PTR(&queclib_dev_backup_obj) },
        { MP_ROM_QSTR(MP_QSTR_backupStatus), MP_ROM_PTR(&queclib_dev_backup_status_obj) },
@@ -172,6 +254,13 @@ STATIC const mp_rom_map_elem_t mp_module_modem_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_main_uart_enable_set), MP_ROM_PTR(&main_uart_enable_set_obj) },
        { MP_ROM_QSTR(MP_QSTR_main_uart_enable_get), MP_ROM_PTR(&main_uart_enable_get_obj) },
 #endif
+#if defined(BOARD_EG915ULA_AC_USBUP) || defined(BOARD_EG915UCN_AC_USBUP) \
+       || defined(BOARD_EG915UEU_AC_USBUP) || defined(BOARD_EG915UEC_AC_USBUP) 
+       { MP_ROM_QSTR(MP_QSTR_setDevImei), MP_ROM_PTR(&queclib_dev_imei_set_obj) },
+#endif
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    { MP_ROM_QSTR(MP_QSTR_getDevMAC), MP_ROM_PTR(&queclib_dev_mac_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_modem_globals, mp_module_modem_globals_table);
 
index c59a731..b439570 100644 (file)
@@ -4,7 +4,7 @@
 #include "obj.h"
 #include "runtime.h"
 
-#if MICROPY_QPY_MODULE_ETHERNET
+#if MICROPY_QPY_MODULE_ETHERNET || CONFIG_ETHERNET
 
 /* 定义的ethernet全局字典,之后我们添加type和function就要添加在这里 */
 extern const mp_obj_type_t ethernet_DM9051_type;
@@ -17,7 +17,7 @@ STATIC const mp_rom_map_elem_t ethernet_globals_table[] = {
 #if MICROPY_QPY_ETHERNET_DM9051
     {MP_OBJ_NEW_QSTR(MP_QSTR_DM9051), MP_ROM_PTR(&ethernet_DM9051_type)},
 #endif
-#if MICROPY_QPY_ETHERNET_W5500
+#if MICROPY_QPY_ETHERNET_W5500 || CONFIG_ETHERNET_W5500
     {MP_OBJ_NEW_QSTR(MP_QSTR_W5500), MP_ROM_PTR(&ethernet_W5500_type)},
 #endif
 #if MICROPY_QPY_ETHERNET_CH395
index 8bcfe87..9f144ee 100644 (file)
@@ -317,7 +317,7 @@ STATIC mp_obj_t get_status(mp_obj_t self_in) {
     return mp_obj_new_tuple(3, status_tuple);
 }
 
-#if 0
+#if 1
 /* 定义设置默认网卡函数 */
 STATIC mp_obj_t set_default_network_card(mp_obj_t self_in, mp_obj_t ip_str) {
     (void)self_in;
@@ -467,7 +467,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(set_up_obj, set_up);
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(set_down_obj, set_down);
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(start_dhcp_obj, start_dhcp);
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(ipconfig_obj, ipconfig);
-//STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_default_network_card_obj, set_default_network_card);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_default_network_card_obj, set_default_network_card);
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(dhcpserver_init_obj, 3, dhcpserver_init);
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(dhcpserver_deinit_obj, dhcpserver_deinit);
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(dhcpserver_start_obj, dhcpserver_start);
@@ -488,9 +488,9 @@ STATIC const mp_rom_map_elem_t CH395_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_dhcp), MP_ROM_PTR(&start_dhcp_obj) },
     { MP_ROM_QSTR(MP_QSTR_ipconfig), MP_ROM_PTR(&ipconfig_obj) },
     { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&status_obj) },
-    //{ MP_ROM_QSTR(MP_QSTR_set_default_network_card), MP_ROM_PTR(&set_default_network_card_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_default_network_card), MP_ROM_PTR(&set_default_network_card_obj) },
     // 优化对外接口显示
-    //{ MP_ROM_QSTR(MP_QSTR_set_default_NIC), MP_ROM_PTR(&set_default_network_card_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_default_NIC), MP_ROM_PTR(&set_default_network_card_obj) },
     { MP_ROM_QSTR(MP_QSTR_dhcpServerInit), MP_ROM_PTR(&dhcpserver_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_dhcpServerDeinit), MP_ROM_PTR(&dhcpserver_deinit_obj) },
     { MP_ROM_QSTR(MP_QSTR_dhcpServerStart), MP_ROM_PTR(&dhcpserver_start_obj) },
index b4d1e3e..5f25894 100644 (file)
@@ -20,6 +20,130 @@ typedef struct _DM9051_obj_t
 
 const mp_obj_type_t ethernet_DM9051_type;
 DM9051_obj_t *single_dm9051 = NULL;
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR)
+STATIC mp_obj_t ethernet_DM9051_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
+{
+    mp_arg_check_num(n_args, n_kw, 0, 9, false);   //检查参数个数
+    if( single_dm9051 == NULL ) {
+               single_dm9051 = m_new_obj_with_finaliser(DM9051_obj_t);     //创建对象,分配空间
+       }
+    DM9051_obj_t *self = single_dm9051;
+    self->base.type = &ethernet_DM9051_type;         //定义对象的类型
+
+    uint8_t mac[6] = {0};
+    char *ip_str = NULL, *mask_str = NULL, *gw_str = NULL;
+    int spi_port = -1, spi_cs_pin = -1, eint_pin = -1, reset_pin = -1, work_mode = 0;
+    switch(n_args) {
+               case 9: {
+            work_mode = mp_obj_get_int(args[8]);
+                       if( work_mode != 0 && work_mode != 1 ) {
+                               mp_raise_ValueError(MP_ERROR_TEXT("invalid wz work mode"));
+                break;
+                       }
+            // no break
+        }
+        case 8: {
+            extern int export2internal_pin(Helios_GPIONum export_pin);
+            reset_pin = mp_obj_get_int(args[7]);
+            if(reset_pin != -1) {
+                if(!(reset_pin > HELIOS_GPIO0 && reset_pin < HELIOS_GPIOMAX)) {
+                    mp_raise_ValueError(MP_ERROR_TEXT("invalid reset pin"));
+                    break;
+                }
+                reset_pin = export2internal_pin((Helios_GPIONum)reset_pin);
+            }
+            // no break
+        }
+
+        case 7: {
+            extern int export2internal_pin(Helios_GPIONum export_pin);
+            eint_pin = mp_obj_get_int(args[6]);
+            if(eint_pin != -1) {
+                if(!(eint_pin > HELIOS_GPIO0 && eint_pin < HELIOS_GPIOMAX)) {
+                    mp_raise_ValueError(MP_ERROR_TEXT("invalid eint pin"));
+                    break;
+                }
+                eint_pin = export2internal_pin((Helios_GPIONum)eint_pin);
+            }
+            // no break
+        }
+        
+        case 6: {
+            extern int export2internal_pin(Helios_GPIONum export_pin);
+            spi_cs_pin = mp_obj_get_int(args[5]);
+            if(spi_cs_pin != -1) {
+                if(!(spi_cs_pin > HELIOS_GPIO0 && spi_cs_pin < HELIOS_GPIOMAX)) {
+                    mp_raise_ValueError(MP_ERROR_TEXT("invalid spi cs pin"));
+                    break;
+                }
+                spi_cs_pin = export2internal_pin((Helios_GPIONum)spi_cs_pin);
+            }
+            // no break
+        }
+
+        case 5: {
+            spi_port = mp_obj_get_int(args[4]);
+        }
+
+        case 4: {
+            char *_gw_str = (char *)mp_obj_str_get_str(args[3]);
+            gw_str = (_gw_str[0] == '\0' ? NULL : _gw_str);
+            // no break
+        }
+
+        case 3: {
+            char *_mask_str = (char *)mp_obj_str_get_str(args[2]);
+            mask_str = (_mask_str[0] == '\0' ? NULL : _mask_str);
+            // no break
+        }
+
+        case 2: {
+            char *_ip_str = (char *)mp_obj_str_get_str(args[1]);
+            ip_str = (_ip_str[0] == '\0' ? NULL : _ip_str);
+            // no break
+        }
+
+        case 1: {
+            mp_buffer_info_t macinfo;
+            mp_get_buffer_raise(args[0], &macinfo, MP_BUFFER_READ);
+                       if( macinfo.len != 6 ) {
+                               mp_raise_ValueError(MP_ERROR_TEXT("mac length error"));
+                       }
+            memcpy(&mac, macinfo.buf, 6);
+            break;
+        }
+
+        default:
+            mp_raise_OSError(MP_EFAULT);
+            break;
+    }
+       
+       if( spi_cs_pin == eint_pin && spi_cs_pin != -1 ) {
+               mp_raise_ValueError(MP_ERROR_TEXT("gpio spi_cs_pin/eint_pin reused"));
+       }
+       if( spi_cs_pin == reset_pin && spi_cs_pin != -1 ) {
+               mp_raise_ValueError(MP_ERROR_TEXT("gpio spi_cs_pin/reset_pin reused"));
+       }
+       if( eint_pin == reset_pin && eint_pin != -1 ) {
+               mp_raise_ValueError(MP_ERROR_TEXT("gpio eint_pin/reset_pin reused"));
+       }
+
+               //mp_printf(&mp_plat_print, "spi_cs_pin=%d, eint_pin=%d, reset_pin=%d\r\n", spi_cs_pin, eint_pin, reset_pin);
+       Helios_DM9051_Destroy();
+    Helios_DM9051_NICSetSPI(spi_port, spi_cs_pin);
+    Helios_DM9051_NICSetEINTPin(eint_pin);
+    Helios_DM9051_NICSetResetPin(reset_pin);
+    int ret = Helios_DM9051_NICRegister(mac, ip_str, mask_str, gw_str, work_mode);
+    if( ret == 1 ) { 
+        mp_raise_OSError(MP_ESRCH);
+       }
+    if( ret != 0) {
+               mp_raise_OSError(MP_EIO);
+       }
+    
+    return MP_OBJ_FROM_PTR(self);                 //返回对象的指针
+}
+#else
 STATIC mp_obj_t ethernet_DM9051_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
 {
     mp_arg_check_num(n_args, n_kw, 0, 7, false);   //检查参数个数
@@ -107,6 +231,7 @@ STATIC mp_obj_t ethernet_DM9051_make_new(const mp_obj_type_t *type, size_t n_arg
     return MP_OBJ_FROM_PTR(self);                 //返回对象的指针
 }
 
+#endif
 /* 定义set_addr函数 */
 
 STATIC const mp_arg_t ethernet_dm9051_set_addr_allowed_args[] = {
index b1f3e1a..6708b02 100644 (file)
@@ -7,7 +7,7 @@
 #include "mperrno.h"
 
 
-#if MICROPY_QPY_ETHERNET_W5500
+#if MICROPY_QPY_ETHERNET_W5500 || CONFIG_ETHERNET_W5500
 
 #include "sockets.h"
 #include "helios_pin.h"
 #include "helios_dhcpserver.h"
 #endif
 
+#if CONFIG_ETHERNET_W5500
+#include "wizchip_ethnetif.h"
+#endif
+
 /* 定义W5500_obj_t结构体 */
 typedef struct _W5500_obj_t
 {
@@ -25,9 +29,17 @@ typedef struct _W5500_obj_t
 const mp_obj_type_t ethernet_W5500_type;
 W5500_obj_t *single_w5500 = NULL;
 
+#if !CONFIG_ETHERNET_W5500
+extern int export2internal_pin(Helios_GPIONum export_pin);
+#endif
+
 STATIC mp_obj_t ethernet_W5500_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
 {
-    mp_arg_check_num(n_args, n_kw, 0, 9, false);   //检查参数个数
+#if defined(PLAT_ASR_1606)
+    mp_arg_check_num(n_args, n_kw, 0, 10, false);   //检查参数个数
+#else 
+    mp_arg_check_num(n_args, n_kw, 0, 9, false);
+#endif   
     if( single_w5500 == NULL ) {
                single_w5500 = m_new_obj_with_finaliser(W5500_obj_t);  //创建对象,分配空间
        }
@@ -37,7 +49,20 @@ STATIC mp_obj_t ethernet_W5500_make_new(const mp_obj_type_t *type, size_t n_args
     uint8_t mac[6] = {0};
     char *ip_str = NULL, *mask_str = NULL, *gw_str = NULL;
     int spi_port = -1, spi_cs_pin = -1, eint_pin = -1, reset_pin = -1, work_mode = 0;
+#if defined(PLAT_ASR_1606)
+    int spi_group=0;
+#endif    
     switch(n_args) {
+#if defined(PLAT_ASR_1606)
+        case 10: {
+            spi_group = mp_obj_get_int(args[9]);
+                       if( spi_group != 0 && spi_group != 1 ) {
+                               mp_raise_ValueError(MP_ERROR_TEXT("invalid wz spi group"));
+                break;
+                       }
+            // no break
+        }
+#endif
                case 9: {
             work_mode = mp_obj_get_int(args[8]);
                        if( work_mode != 0 && work_mode != 1 ) {
@@ -47,52 +72,49 @@ STATIC mp_obj_t ethernet_W5500_make_new(const mp_obj_type_t *type, size_t n_args
             // no break
         }
         case 8: {
-            extern int export2internal_pin(Helios_GPIONum export_pin);
             reset_pin = mp_obj_get_int(args[7]);
             if(reset_pin != -1) {
                 if(!(reset_pin > HELIOS_GPIO0 && reset_pin < HELIOS_GPIOMAX)) {
                     mp_raise_ValueError(MP_ERROR_TEXT("invalid reset pin"));
                     break;
                 }
+#if !CONFIG_ETHERNET_W5500
                 reset_pin = export2internal_pin((Helios_GPIONum)reset_pin);
+#endif
             }
             // no break
         }
 
         case 7: {
-            extern int export2internal_pin(Helios_GPIONum export_pin);
             eint_pin = mp_obj_get_int(args[6]);
             if(eint_pin != -1) {
                 if(!(eint_pin > HELIOS_GPIO0 && eint_pin < HELIOS_GPIOMAX)) {
                     mp_raise_ValueError(MP_ERROR_TEXT("invalid eint pin"));
                     break;
                 }
+#if !CONFIG_ETHERNET_W5500
                 eint_pin = export2internal_pin((Helios_GPIONum)eint_pin);
+#endif
             }
             // no break
         }
         
         case 6: {
-            extern int export2internal_pin(Helios_GPIONum export_pin);
             spi_cs_pin = mp_obj_get_int(args[5]);
             if(spi_cs_pin != -1) {
                 if(!(spi_cs_pin > HELIOS_GPIO0 && spi_cs_pin < HELIOS_GPIOMAX)) {
                     mp_raise_ValueError(MP_ERROR_TEXT("invalid spi cs pin"));
                     break;
                 }
+#if !CONFIG_ETHERNET_W5500
                 spi_cs_pin = export2internal_pin((Helios_GPIONum)spi_cs_pin);
+#endif
             }
             // no break
         }
 
         case 5: {
             spi_port = mp_obj_get_int(args[4]);
-            if(spi_port != -1) {
-                if(spi_port != 0 && spi_port != 1) {
-                    mp_raise_ValueError(MP_ERROR_TEXT("invalid spi port"));
-                    break;
-                }
-            }
             // no break
         }
 
@@ -139,12 +161,29 @@ STATIC mp_obj_t ethernet_W5500_make_new(const mp_obj_type_t *type, size_t n_args
                mp_raise_ValueError(MP_ERROR_TEXT("gpio eint_pin/reset_pin reused"));
        }
        //mp_printf(&mp_plat_print, "spi_cs_pin=%d, eint_pin=%d, reset_pin=%d\r\n", spi_cs_pin, eint_pin, reset_pin);
+#if CONFIG_ETHERNET_W5500
+       wiznet_ethnetif_destroy();
+    wiznet_ethnetif_set_spi(spi_port, spi_cs_pin);
+    wiznet_ethnetif_set_eint_pin(eint_pin);
+    wiznet_ethnetif_set_reset_pin(reset_pin);
+    int ret = wiznet_ethnetif_register(mac, ip_str, mask_str, gw_str, work_mode);
+#else
        Helios_W5500_Destroy();
+#if defined(PLAT_ASR_1606)
+    Helios_W5500_NICSetSPI(spi_port, spi_cs_pin,spi_group);
+#else
     Helios_W5500_NICSetSPI(spi_port, spi_cs_pin);
+#endif   
     Helios_W5500_NICSetEINTPin(eint_pin);
     Helios_W5500_NICSetResetPin(reset_pin);
-    if(Helios_W5500_NICRegister(mac, ip_str, mask_str, gw_str, work_mode))
-        mp_raise_OSError(MP_EIO);
+    int ret = Helios_W5500_NICRegister(mac, ip_str, mask_str, gw_str, work_mode);
+#endif
+       if( ret == 1 ) { 
+        mp_raise_OSError(MP_ESRCH);
+       }
+    if( ret != 0) {
+               mp_raise_OSError(MP_EIO);
+       }
     
     return MP_OBJ_FROM_PTR(self);                 //返回对象的指针
 }
@@ -184,8 +223,11 @@ STATIC mp_obj_t set_addr(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_a
         memcpy(gw_str, gwaddrinfo.buf, gwaddrinfo.len);
         gw_str_fin = gw_str;
     }
-    
-    return mp_obj_new_int(Helios_W5500_NICSetAddr(ip_str_fin, mask_str_fin, gw_str_fin));
+#if CONFIG_ETHERNET_W5500
+    return mp_obj_new_int(wiznet_ethnetif_set_addr(ip_str_fin, mask_str_fin, gw_str_fin));
+#else
+       return mp_obj_new_int(Helios_W5500_NICSetAddr(ip_str_fin, mask_str_fin, gw_str_fin));
+#endif
 }
 
 /* 定义set_dns函数 */
@@ -201,8 +243,11 @@ STATIC mp_obj_t set_dns(mp_obj_t self_in, mp_obj_t pri_addr, mp_obj_t sec_addr)
     char *_sec_str = (char *)mp_obj_str_get_str(sec_addr);
     if (_sec_str[0] != '\0')
         sec_str = _sec_str;
-
-    ret = Helios_W5500_NICSetDNS(pri_str, sec_str);
+#if CONFIG_ETHERNET_W5500
+       ret = wiznet_ethnetif_set_dns(pri_str, sec_str);
+#else
+       ret = Helios_W5500_NICSetDNS(pri_str, sec_str);
+#endif
        if( ret != 0 ) {
                return mp_obj_new_int(ret);
        }
@@ -213,19 +258,31 @@ STATIC mp_obj_t set_dns(mp_obj_t self_in, mp_obj_t pri_addr, mp_obj_t sec_addr)
 /* 定义set_up函数 */
 STATIC mp_obj_t set_up(mp_obj_t self_in) {
     (void)self_in;
-    return mp_obj_new_int(Helios_W5500_NICSetUp());
+#if CONFIG_ETHERNET_W5500
+    return mp_obj_new_int(wiznet_ethnetif_set_up());
+#else
+       return mp_obj_new_int(Helios_W5500_NICSetUp());
+#endif
 }
 
 /* 定义set_down函数 */
 STATIC mp_obj_t set_down(mp_obj_t self_in) {
     (void)self_in;
-    return mp_obj_new_int(Helios_W5500_NICSetDown());
+#if CONFIG_ETHERNET_W5500
+    return mp_obj_new_int(wiznet_ethnetif_set_down());
+#else
+       return mp_obj_new_int(Helios_W5500_NICSetDown());
+#endif
 }
 
 /* 定义start_dhcp函数 */
 STATIC mp_obj_t start_dhcp(mp_obj_t self_in) {
     (void)self_in;
-    return mp_obj_new_int(Helios_W5500_NICDHCP());
+#if CONFIG_ETHERNET_W5500
+    return mp_obj_new_int(wiznet_ethnetif_dhcp());
+#else
+       return mp_obj_new_int(Helios_W5500_NICDHCP());
+#endif
 }
 
 /* 定义ipconfig函数 */
@@ -239,8 +296,11 @@ STATIC mp_obj_t ipconfig(mp_obj_t self_in) {
     char dns1[16] = {0};
     char dns2[16] = {0};
 
-    Helios_W5500_IPConfig(&ipconfig);
-
+#if CONFIG_ETHERNET_W5500
+    wiznet_ethnetif_ipconfig((wiznet_ethnetif_ipconfig_t *)&ipconfig);
+#else
+       Helios_W5500_IPConfig(&ipconfig);
+#endif
     sprintf(mac, "%02X-%02X-%02X-%02X-%02X-%02X", ipconfig.mac[0], ipconfig.mac[1], ipconfig.mac[2], ipconfig.mac[3], ipconfig.mac[4], ipconfig.mac[5]);
 
     mp_obj_t generic_tuple[2] = {
@@ -277,10 +337,36 @@ STATIC mp_obj_t set_default_network_card(mp_obj_t self_in, mp_obj_t ip_str) {
        char *m_ip_str = NULL;
 
     m_ip_str = (char *)mp_obj_str_get_str(ip_str);
-       
-    return mp_obj_new_int(Helios_W5500_SetDefaultNetworkCard(m_ip_str));
+#if CONFIG_ETHERNET_W5500
+    return mp_obj_new_int(wiznet_ethnetif_set_defult_nic(m_ip_str));
+#else
+       return mp_obj_new_int(Helios_W5500_SetDefaultNetworkCard(m_ip_str));
+#endif
 }
 
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc)
+/* 定义状态查询函数 */
+STATIC mp_obj_t qpy_module_w5500_status(mp_obj_t self_in)
+{
+       (void)self_in;
+       int status[3];
+       memset(status, 0x00, sizeof(status));
+#if CONFIG_ETHERNET_W5500
+       wiznet_ethnetif_status(status);
+#else
+       Helios_W5500_Status(status);
+#endif
+       mp_obj_t status_tuple[3] = {
+        mp_obj_new_bool(status[0]),
+               mp_obj_new_bool(status[1]),
+               mp_obj_new_bool(status[2])
+    };
+       return mp_obj_new_tuple(3, status_tuple);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_w5500_status_obj, qpy_module_w5500_status);
+#endif
+
 #if defined(PLAT_ASR)
 STATIC const mp_arg_t dhcpserver_set_addr_allowed_args[] = {
        { MP_QSTR_ipaddr,     MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
@@ -387,7 +473,11 @@ STATIC mp_obj_t qpy_module_w5500_delete(mp_obj_t self_in)
 {
        (void)self_in;
        single_w5500 = NULL;
+#if CONFIG_ETHERNET_W5500
+       wiznet_ethnetif_destroy();
+#else
        Helios_W5500_Destroy();
+#endif
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_w5500_delete_obj, qpy_module_w5500_delete);
@@ -421,6 +511,9 @@ STATIC const mp_rom_map_elem_t W5500_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_default_network_card), MP_ROM_PTR(&set_default_network_card_obj) },
     // 优化对外接口显示
     { MP_ROM_QSTR(MP_QSTR_set_default_NIC), MP_ROM_PTR(&set_default_network_card_obj) },
+    #if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc)
+    { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&qpy_module_w5500_status_obj) },
+    #endif
     #if defined(PLAT_ASR)
     { MP_ROM_QSTR(MP_QSTR_dhcpServerInit), MP_ROM_PTR(&dhcpserver_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_dhcpServerDeinit), MP_ROM_PTR(&dhcpserver_deinit_obj) },
index 1a1baa9..4277802 100644 (file)
@@ -268,7 +268,7 @@ STATIC mp_obj_t qpy_module_YT8512H_node(mp_obj_t self_in)
        return list;
 }
 
-#if defined(BOARD_EC200AAU_HA_CPE)
+#if defined(BOARD_EC200AAU_HA_CPE) || defined(BOARD_EC200ACN_HA_CPE) || defined(BOARD_EC200AEU_HA_CPE)
 STATIC const mp_arg_t ethernet_YT8512H_pool_config_allowed_args[] = {
        { MP_QSTR_pool_start,     MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
     { MP_QSTR_pool_end,       MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
@@ -290,6 +290,53 @@ STATIC mp_obj_t qpy_module_YT8512H_pool_config(size_t n_args, const mp_obj_t *po
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(qpy_module_YT8512H_pool_config_obj, 4, qpy_module_YT8512H_pool_config);
 #endif
 
+STATIC mp_obj_t qpy_module_YT8512H_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+
+    YT8512H_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+       (void)self;
+
+    if (kwargs->used != 0) {
+
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_autosleep: {
+                                               bool m_enable = mp_obj_is_true(kwargs->table[i].value);
+                                               if( m_enable ) {
+                                                       Helios_YT8512H_AutoSleep(1);
+                                               } else {
+                                                       Helios_YT8512H_AutoSleep(0);
+                                               }
+
+                        break;
+                    }
+
+                    default:
+                        goto unknown;
+                }
+            }
+        }
+
+        return mp_const_none;
+    }
+
+unknown:
+    mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(qpy_module_YT8512H_config_obj, 1, qpy_module_YT8512H_config);
+
+#ifdef BOARD_EC200AEU_HA_CPE
+STATIC mp_obj_t qpy_module_YT8512H_DeInit(mp_obj_t self_in)
+{
+       (void)self_in;
+       return mp_obj_new_int_from_uint(Helios_YT8512H_RGMII_DeInit());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_YT8512H_deinit_obj, qpy_module_YT8512H_DeInit);
+#endif
 
 /*=============================================================================*/
 /* FUNCTION: qpy_module_YT8512H_deinit                                         */
@@ -338,8 +385,12 @@ STATIC const mp_rom_map_elem_t YT8512H_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&qpy_module_YT8512H_status_obj) },
     { MP_ROM_QSTR(MP_QSTR_speed), MP_ROM_PTR(&qpy_module_YT8512H_tx_rx_speed_obj) },
     { MP_ROM_QSTR(MP_QSTR_node), MP_ROM_PTR(&qpy_module_YT8512H_node_obj) },
-#if defined(BOARD_EC200AAU_HA_CPE)
+#if defined(BOARD_EC200AAU_HA_CPE) || defined(BOARD_EC200ACN_HA_CPE) || defined(BOARD_EC200AEU_HA_CPE)
     { MP_ROM_QSTR(MP_QSTR_pool), MP_ROM_PTR(&qpy_module_YT8512H_pool_config_obj) },
+#endif
+       { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&qpy_module_YT8512H_config_obj) },
+#ifdef BOARD_EC200AEU_HA_CPE
+       { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&qpy_module_YT8512H_deinit_obj) },
 #endif
 };
 
index 3b380e8..6833077 100644 (file)
@@ -59,58 +59,53 @@ typedef void(*aw_eint_handler_t)(void);
 static void aw9523_key_extint_event(void * argv)
 {
        Key_Msg msg;
-       while(1)
-               {
-                       Helios_MsgQ_Get(key_queue, (void *)&msg, sizeof(Key_Msg), HELIOS_WAIT_FOREVER);
-
-                       aw9523_obj_t *self = NULL;
-                       self = aw9523_obj[msg.pin];
+       aw9523_obj_t *self = NULL;
+       uint8_t pin_value0 = 0;
+       uint8_t pin_value1 = 0;
+       uint8_t input_reg0 = _AW9523_REG_INPUT0;
+       uint8_t input_reg1 = _AW9523_REG_INPUT1;
+       uint16_t reg_level = 0;
+       int level_change = 0;
+       uint16_t pin = 0;
+       uint8_t pin_level = 0;
 
-                       uint8_t read_buf = 0;
-                       uint8_t read_buf_1 = 0;
-                       uint8_t reg_output = _AW9523_REG_INPUT0;
-                       uint8_t reg_output_1 = _AW9523_REG_INPUT1;
-                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
-                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
+       while(1)
+       {
+               Helios_MsgQ_Get(key_queue, (void *)&msg, sizeof(Key_Msg), HELIOS_WAIT_FOREVER);
+               self = aw9523_obj[msg.pin];
+               while(1) {
+                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &input_reg0, 1, &pin_value0, 1, 5);
+                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &input_reg1, 1, &pin_value1, 1, 5);
 
                        //port0和port1的电平
-                       uint16_t reg_level = (read_buf_1 << 8) | read_buf;
-                       int level_change = (default_level ^ reg_level);
+                       reg_level = (pin_value1 << 8) | pin_value0;
+                       level_change = (default_level ^ reg_level);
                        default_level = reg_level;
-
-                       //判断两组寄存器的电平是否有变化
+                       pin = 0;
                        if (level_change != 0)
                        {
-                               uint16_t pin = 0;
-                               uint8_t pin_level = 0;
                                //获取触发引脚和电平
-                               while (pin < 16){
-                                       if (level_change & (1 << pin)){
-                                               break;
-                                       }else{
-                                               pin = pin + 1;
+                               while (pin < 16) {
+                                       if (level_change & (1 << pin)) {
+                                               if (reg_level & (1 << pin)) {
+                                                       pin_level = 1;
+                                               } else {
+                                                       pin_level = 0;
+                                               }
+                                               // 判断是否使能
+                                               if (!(cb_reg_enable_flag & (1 << pin))){
+                                                       HELIOS_AW9523_LOG("AW9523 cb msg.pin:%d,pin:%d,pin_level:%d\n", msg.pin, pin, pin_level);
+                                                       AW9523_EXTINT_CALLBACK_OP(msg.pin, pin, pin_level);
+                                               }
                                        }
+                                       pin++;
                                }
-                               if (reg_level & (1 << pin)){
-                                       pin_level = 1;
-                               }else{
-                                       pin_level = 0;
-                               }
-                               // 判断是否使能
-                               if (!(cb_reg_enable_flag & (1 << pin))){
-                                       AW9523_EXTINT_CALLBACK_OP(msg.pin, pin, pin_level);
-                               }
-                               if (Helios_GPIO_GetLevel(self->int_pin) != 1) {
-                                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
-                                       HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
-                               }
-                       }       
-                       else if (Helios_GPIO_GetLevel(self->int_pin) != 1)
-                       {
-                               HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output, 1, &read_buf, 1, 5);
-                               HELIOS_I2C_Read((Helios_I2CEnum) self->i2c_id, self->addr, &reg_output_1, 1, &read_buf_1, 1, 5);
+                       }
+                       if (Helios_GPIO_GetLevel(self->int_pin) == 1) {
+                               break;
                        }
                }
+       }
 }
 
 
@@ -152,6 +147,7 @@ static const mp_arg_t allowed_args[] = {
 
 STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_map_t *kw_args) {
        // parse args
+       int ret = 0;
        mp_arg_val_t vals[AW9523_ARGS_TAB_SIZE];
        mp_arg_parse_all_kw_array(n_args, n_kw, kw_args, AW9523_ARGS_TAB_SIZE, allowed_args, vals);
 
@@ -179,9 +175,16 @@ STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t
        // Helios_GPIO_Init(17, &_struct);
 
        // init I2C
-       if(0 != Helios_I2C_Init((Helios_I2CEnum) self->i2c_id, HELIOS_FAST_MODE)) {
-               mp_raise_ValueError("I2C initialization failed");
-       }
+
+#if defined(PLAT_aic8800m40)
+    ret = Helios_I2C_Init((Helios_I2CEnum) self->i2c_id, HELIOS_FAST_MODE, 0);
+#else
+    ret = Helios_I2C_Init((Helios_I2CEnum) self->i2c_id, HELIOS_FAST_MODE);
+#endif
+    if(ret != 0)
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("i2c init fail"));
+    }
        // init extint
        if (self->int_pin != 0 && vals[ARG_callback].u_obj != NULL)
        {
@@ -215,14 +218,14 @@ STATIC mp_obj_t aw9523_make_new(const mp_obj_type_t *type, size_t n_args, size_t
                        Helios_ThreadAttr attr = {0};
                        attr.name = "extgpio_aw9523";
                        attr.stack_size = 4096;
-                       attr.priority = 90;
+                       attr.priority = 95;
                        attr.entry = aw9523_key_extint_event;
 
                        int_thread_id = Helios_Thread_Create(&attr);
-                               if(int_thread_id == 0)
-                               {
-                                       mp_raise_ValueError("create extgpio_aw9523 interrupt handle task failed");
-                               }
+                       if(int_thread_id == 0)
+                       {
+                               mp_raise_ValueError("create extgpio_aw9523 interrupt handle task failed");
+                       }
                }
        }
 
@@ -256,10 +259,9 @@ static int set_mode(aw9523_obj_t * self, int pin,int mode)
        
        HELIOS_AW9523_LOG("AW9523mode = 0x%x\n", read_buf);
        int bit = (1 << (pin % 8));
-       if (mode){
+       if (mode) {
                read_buf = read_buf | bit;
-       }
-       else{
+       } else {
                read_buf = read_buf & ~bit;
        }
        int ret = HELIOS_I2C_Write((Helios_I2CEnum) self->i2c_id,  self->addr, &reg_config, 1, &read_buf, 1);
@@ -357,10 +359,10 @@ STATIC mp_obj_t aw9523_obj_pin_init_helper(mp_obj_t self_in,size_t n_args, const
        // # value = 0: pin set to low
        // # value = 1: pin set to high
        set_mode(self,pin,mode);
-       if (mode){
-       set_enable(self,pin,interrupt_enable);
-       }{
-       set_value(self,pin,value);
+       if (mode) {
+               set_enable(self, pin, interrupt_enable);
+       } else {
+               set_value(self, pin, value);
        }
     return mp_obj_new_int(0);
 }
index 91bb369..55e6ddb 100644 (file)
@@ -41,7 +41,6 @@ static c_callback_t *usr_callback[5] = {NULL};
 static c_callback_t cb[5] = {0};
 
 Helios_Mutex_t main_uart_mutex = 0;
-static Helios_MsgQ_t int_happen_q = 0;
 static Helios_Thread_t int_handle_task_id = 0;
 
 int read_main_uart(wk2114_obj_t * self, uint8_t * data, uint32_t nbytes, uint32_t timeout) {
@@ -53,7 +52,7 @@ int read_main_uart(wk2114_obj_t * self, uint8_t * data, uint32_t nbytes, uint32_
        while (Helios_UART_Any(self->port) == 0)
        {
                read_cnt++;
-               if (read_cnt > 100000) {
+               if (read_cnt > 10000) {
                        HELIOS_WK2114_LOG("read_main_uart read uart timeout\r\n");
                        return 0;
                }
@@ -199,6 +198,7 @@ int read_sub_uart_data(wk2114_obj_t * self, uint8_t slave_port) {
        int num = 0;
        uint8_t read_data[16] = {0};
        int ret = 0;
+       int read_sub_uart_cnt = 0;
 
        int s_ifr = read_s_reg(self, slave_port, WK2XXX_SIFR);
        self->int_type = s_ifr;
@@ -206,7 +206,7 @@ int read_sub_uart_data(wk2114_obj_t * self, uint8_t slave_port) {
                HELIOS_WK2114_LOG("Read WK2XXX_SIFR register failed");
                return -1;
        }
-       if ((s_ifr&WK2XXX_RFTRIG_INT) || (s_ifr&WK2XXX_RXOVT_INT)) {
+       while ((s_ifr&WK2XXX_RFTRIG_INT) || (s_ifr&WK2XXX_RXOVT_INT)) {
                int fsr = read_s_reg(self, slave_port, WK2XXX_FSR);
                if (fsr < 0) {
                        HELIOS_WK2114_LOG("Read WK2XXX_FSR register failed");
@@ -224,10 +224,14 @@ int read_sub_uart_data(wk2114_obj_t * self, uint8_t slave_port) {
                        lenth = 0;
                }
                num = lenth;
+               HELIOS_WK2114_LOG("Read data lenth:%d, s_ifr:%d, fsr:%d, rfcnt:%d,", lenth, s_ifr, fsr, rfcnt);
                while (lenth > 0)
                {
                        if (lenth >= 16) {
                                ret = read_s_fifo(self, slave_port, read_data, 16);
+                               if (ret <= 0) {
+                                       HELIOS_WK2114_LOG("Read 16 byte data result:%d", ret);
+                               }
                                if ((helios_rb_free_space(wk2114_read_ring_bufer[slave_port]) >= ret) && (ret > 0))
                                {
                                        helios_rb_write(wk2114_read_ring_bufer[slave_port], read_data, ret);
@@ -236,6 +240,9 @@ int read_sub_uart_data(wk2114_obj_t * self, uint8_t slave_port) {
                        }
                        else {
                                ret = read_s_fifo(self, slave_port, read_data, lenth);
+                               if (ret <= 0) {
+                                       HELIOS_WK2114_LOG("Read %d byte data result:%d", lenth, ret);
+                               }
                                if ((helios_rb_free_space(wk2114_read_ring_bufer[slave_port]) >= ret) && (ret > 0))
                                {
                                        helios_rb_write(wk2114_read_ring_bufer[slave_port], read_data, ret);
@@ -243,75 +250,63 @@ int read_sub_uart_data(wk2114_obj_t * self, uint8_t slave_port) {
                                lenth = 0;
                        }
                }
+               s_ifr = read_s_reg(self, slave_port, WK2XXX_SIFR);
+               HELIOS_WK2114_LOG("s_ifr:%d", s_ifr);
+               if (((s_ifr&WK2XXX_RFTRIG_INT) == 0) && ((s_ifr&WK2XXX_RXOVT_INT) == 0)) {
+                       break;
+               }
+
+               // 最多获取三次即退出
+               read_sub_uart_cnt++;
+               if (read_sub_uart_cnt > 2) {
+                       break;
+               }
        }
-       else {
-               num = 0;
-       }
+       
        return num;
 }
 
-
-
-void extuart_irq_handler(void)
-{
-       uint8_t int_happen = 1;
-       Helios_MsgQ_Put(int_happen_q, (const void *)&int_happen, sizeof(uint8_t), HELIOS_NO_WAIT);
-       Helios_ExtInt_Enable(wk2114_obj->int_pin);
-}
-
-void extint_handle(void * argv) {
+void ext_uart_handle(void * argv) {
        uint8_t int_happen = 0;
        int ret = -1;
-
-       while (1) {
-               ret = Helios_MsgQ_Get(int_happen_q, (void *)&int_happen, sizeof(uint8_t), HELIOS_WAIT_FOREVER);
-               if (ret != 0)
-               {
-                       HELIOS_WK2114_LOG("interrupt handle thread failed to get queue\n");
-                       continue;
-               }
-               if (int_happen == 1) {
-                       uint8_t port = 0;
-                       // Software reset sub uart
-                       int g_ifr = read_global_reg(wk2114_obj, WK2XXX_GIFR);
-                       if (g_ifr < 0) {
-                               HELIOS_WK2114_LOG("Read WK2XXX_GIFR register failed");
-                               return;
+       int g_ifr = 0;
+
+       while (1) {     
+               uint8_t port = 0;
+               // Software reset sub uart
+               g_ifr = read_global_reg(wk2114_obj, WK2XXX_GIFR);
+               HELIOS_WK2114_LOG("g_ifr:%d, self->sub_enable:%d", g_ifr, wk2114_obj->sub_enable);
+               if (g_ifr < 0) {
+                       HELIOS_WK2114_LOG("Read WK2XXX_GIFR register failed");
+               } else if ((g_ifr & 0x0F) && (wk2114_obj->sub_enable != 0)) {
+                       if ((g_ifr & WK2XXX_UT1IE) && (wk2114_obj->sub_enable & 0x01)) {
+                               read_sub_uart_data(wk2114_obj, 1);
+                               port = 1;
                        }
-                       while (g_ifr & 0x0F) {
-                               if (g_ifr & WK2XXX_UT1IE) {
-                                       read_sub_uart_data(wk2114_obj, 1);
-                                       port = 1;
-                               }
-                               if (g_ifr & WK2XXX_UT2IE) {
-                                       read_sub_uart_data(wk2114_obj, 2);
-                                       port = 2;
-                               }
-                               if (g_ifr & WK2XXX_UT3IE) {
-                                       read_sub_uart_data(wk2114_obj, 3);
-                                       port = 3;
-                               }
-                               if (g_ifr & WK2XXX_UT4IE) {
-                                       read_sub_uart_data(wk2114_obj, 4);
-                                       port = 4;
-                               }
-                               if (usr_callback[port]) {
-                                       st_CallBack_Wk2114 *wk2114_int = malloc(sizeof(st_CallBack_Wk2114));
-                                       if(NULL != wk2114_int) { 
-                                               wk2114_int->int_type = wk2114_obj->int_type;
-                                               wk2114_int->port = port;
-                                               wk2114_int->read_lenth = helios_rb_data_len(wk2114_read_ring_bufer[port]);
-                                               wk2114_int->callback = cb[port];
-                                               qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_WK2114, wk2114_int);
-                                       }
-                               }
-                               g_ifr = read_global_reg(wk2114_obj, WK2XXX_GIFR);
-                               if (g_ifr < 0) {
-                                       HELIOS_WK2114_LOG("Read WK2XXX_GIFR register failed");
-                                       break;
+                       if ((g_ifr & WK2XXX_UT2IE) && (wk2114_obj->sub_enable & 0x02)) {
+                               read_sub_uart_data(wk2114_obj, 2);
+                               port = 2;
+                       }
+                       if ((g_ifr & WK2XXX_UT3IE) && (wk2114_obj->sub_enable & 0x04)) {
+                               read_sub_uart_data(wk2114_obj, 3);
+                               port = 3;
+                       }
+                       if ((g_ifr & WK2XXX_UT4IE) && (wk2114_obj->sub_enable & 0x08)) {
+                               read_sub_uart_data(wk2114_obj, 4);
+                               port = 4;
+                       }
+                       if (usr_callback[port]) {
+                               st_CallBack_Wk2114 *wk2114_int = malloc(sizeof(st_CallBack_Wk2114));
+                               if(NULL != wk2114_int) { 
+                                       wk2114_int->int_type = wk2114_obj->int_type;
+                                       wk2114_int->port = port;
+                                       wk2114_int->read_lenth = helios_rb_data_len(wk2114_read_ring_bufer[port]);
+                                       wk2114_int->callback = cb[port];
+                                       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_WK2114, wk2114_int);
                                }
                        }
                }
+               Helios_msleep(50);
        }
 }
 
@@ -358,22 +353,6 @@ mp_obj_t wk2114_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
        int stopbits = args[ARG_stopbits].u_int;
 
     int ret=-1;
-       // init extint
-       Helios_ExtIntStruct extint_struct = {0};
-       extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
-       extint_struct.gpio_edge = HELIOS_EDGE_FALLING;
-       extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
-       extint_struct.gpio_pull = HELIOS_PULL_UP;
-       extint_struct.eint_cb = NULL;
-       extint_struct.wakeup_eint_cb = extuart_irq_handler;
-       if((0 == Helios_ExtInt_Disable((Helios_GPIONum)int_pin)) && (0 == Helios_ExtInt_Deinit((Helios_GPIONum)int_pin))) {
-               ret = 0;
-       }
-       if(0 != Helios_ExtInt_Init((Helios_GPIONum)int_pin,  &extint_struct)) {
-               mp_raise_ValueError("Interrupt initialization failed");
-       }
-       Helios_ExtInt_Enable((Helios_GPIONum)int_pin);
-
        // init level en pin
        Helios_GPIOInitStruct gpio_struct = {0};
        gpio_struct.dir = HELIOS_GPIO_OUTPUT;
@@ -411,16 +390,17 @@ mp_obj_t wk2114_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
        self->sub_enable = 0;
 
        main_uart_mutex = Helios_Mutex_Create();
+       
+       main_uart_baud_adapt(self);
+
        Helios_ThreadAttr attr = {0};
-       if (int_happen_q == 0) {
-               int_happen_q = Helios_MsgQ_Create(1, sizeof(uint8_t));
-       }
+
        if(int_handle_task_id == 0)
        {
-           attr.name = "int_handle";
-        attr.stack_size = 1024*2;
-        attr.priority = 95;
-        attr.entry = extint_handle;
+           attr.name = "ext_uart_handle";
+        attr.stack_size = 1024*4;
+        attr.priority = 99;
+        attr.entry = ext_uart_handle;
 
         int_handle_task_id = Helios_Thread_Create(&attr);
         if (0 == int_handle_task_id)
@@ -428,8 +408,6 @@ mp_obj_t wk2114_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
             mp_raise_ValueError("create interrupt handle task failed\n");
         }
        }
-
-       main_uart_baud_adapt(self);
        
     return MP_OBJ_FROM_PTR(self);
 }
@@ -544,6 +522,7 @@ STATIC mp_obj_t tx_available_len(mp_obj_t self_in, mp_obj_t port_obj)
        else {
                lenth = 256 - tfcnt;
        }
+       
     return mp_obj_new_int(lenth);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(tx_available_len_obj, tx_available_len);
@@ -556,13 +535,6 @@ STATIC mp_obj_t slave_uart_disable(mp_obj_t self_in, mp_obj_t port_obj) {
                mp_raise_ValueError("Slave port illegal");
        }
 
-       int g_ena = read_global_reg(self, WK2XXX_GENA);
-       if (g_ena < 0) {
-               HELIOS_WK2114_LOG("Read WK2XXX_GENA register failed");
-               return mp_obj_new_int(0);
-       }
-       g_ena = g_ena & (~(1 << (port - 1)));
-       write_global_reg(self, WK2XXX_GENA, g_ena);
        helios_rb_clear(wk2114_read_ring_bufer[port]);
        self->sub_enable &= ~(1 << (port - 1));
        return mp_obj_new_int(1);
@@ -577,13 +549,6 @@ STATIC mp_obj_t slave_uart_enable(mp_obj_t self_in, mp_obj_t port_obj) {
                mp_raise_ValueError("Slave port illegal");
        }
 
-       int g_ena = read_global_reg(self, WK2XXX_GENA);
-       if (g_ena < 0) {
-               HELIOS_WK2114_LOG("Read WK2XXX_GENA register failed");
-               return mp_obj_new_int(0);
-       }
-       g_ena = g_ena | (1<<(port-1));
-       write_global_reg(self, WK2XXX_GENA, g_ena);
        self->sub_enable |= 1 << (port - 1);
        return mp_obj_new_int(1);
 }
@@ -656,7 +621,6 @@ STATIC mp_obj_t wk2114_obj_read(mp_obj_t self_in, mp_obj_t port_obj, mp_obj_t re
        if(read_num == 0) {
                mp_raise_ValueError("read_num can not be 0");
        } 
-       
        remain_data_num = helios_rb_data_len(wk2114_read_ring_bufer[port]);
        read_num = (read_num > remain_data_num) ? remain_data_num : read_num;
        uint8_t *read_buffer = (uint8_t *)malloc(read_num);
@@ -667,6 +631,7 @@ STATIC mp_obj_t wk2114_obj_read(mp_obj_t self_in, mp_obj_t port_obj, mp_obj_t re
        mp_obj_t read_byte = mp_obj_new_bytes(read_buffer, read_num);
        free(read_buffer);
 
+
     return read_byte;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_3(wk2114_obj_read_obj, wk2114_obj_read);
index 0558651..58dc084 100644 (file)
@@ -51,7 +51,7 @@ static fota_obj_t *fota_self_obj = NULL;
 
 extern void Helios_Fota_SslConfig(char *rootCA, char *clientCert, char *clientKey);
 
-#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 extern int Helios_Fota_Download_Cancel(void);
 extern int Helios_Fota_Reset_Disable(int flag);
 extern int Helios_Fota_APN_Set(int ip_type, char *apn, char *user, char *pass);
@@ -68,11 +68,11 @@ STATIC mp_obj_t fota_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
        self->base.type = &mp_fota_type;
        self->ctx = Helios_Fota_Init();
 
-#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_ASR) || defined (PLAT_Unisoc) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        const byte *key = NULL;
        const byte *cert = NULL;
        const byte *root_cert = NULL;
-#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        int reset_disable = 0; 
 #endif
 
@@ -111,14 +111,14 @@ STATIC mp_obj_t fota_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
                        size_t root_cert_len;
                        root_cert = (const byte *)mp_obj_str_get_data(args_dest[ARG_root_cert].u_obj, &root_cert_len);
                }
-       #if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+       #if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                if (args_dest[ARG_reset_disable].u_int != -1)
                {
                        reset_disable = args_dest[ARG_reset_disable].u_int;
                }
        #endif
        }
-#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        Helios_Fota_Reset_Disable(reset_disable);
 #endif
        Helios_Fota_SslConfig((char *)(root_cert), (char *)(cert), (char *)(key));
@@ -165,10 +165,51 @@ STATIC mp_obj_t fota_write(size_t n_args, const mp_obj_t *args)
        
        return mp_obj_new_int(0);
 }
-#if !defined(PLAT_RDA)
+#if !defined(PLAT_RDA) || defined(BOARD_BC92RB)
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fota_write_obj, 1, 3, fota_write);
 #endif
 
+#if defined(PLAT_aic8800m40)
+STATIC mp_obj_t fcm362k_ota_write(mp_obj_t self_in, const mp_obj_t data, mp_obj_t len)
+{
+       unsigned char* buffer = NULL;
+       int data_len = 0;
+       int ret = 0;
+       buffer = (unsigned char*)calloc(1,1024);
+    if(NULL == buffer)
+    {
+        return mp_obj_new_int(-1);
+    }
+       data_len = mp_obj_get_int(len);
+       memcpy(buffer, mp_obj_str_get_str(data), data_len);
+       ret = Helios_Fota_Write_ForFCM362K(buffer, data_len);
+       free(buffer);
+    buffer = NULL;
+
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(fcm362k_ota_write_obj, fcm362k_ota_write);
+
+STATIC mp_obj_t fcm362k_ota_start(mp_obj_t self_in, const mp_obj_t size)
+{
+       int file_size;
+       int ret = 0;
+       file_size = mp_obj_get_int(size); 
+       ret = Helios_Fota_Start_ForFCM362K(file_size);
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(fcm362k_ota_start_obj, fcm362k_ota_start);
+
+STATIC mp_obj_t fcm362k_ota_end(mp_obj_t self_in)
+{
+       int ret = 0;
+       ret = Helios_Fota_End_ForFCM362K();
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(fcm362k_ota_end_obj, fcm362k_ota_end);
+#endif
 
 STATIC mp_obj_t fota_flush(const mp_obj_t arg0)
 {
@@ -185,7 +226,7 @@ STATIC mp_obj_t fota_flush(const mp_obj_t arg0)
        
        return mp_obj_new_int(0);
 }
-#if !defined(PLAT_RDA)
+#if !defined(PLAT_RDA) || defined(BOARD_BC92RB)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(fota_flush_obj, fota_flush);
 #endif
 STATIC mp_obj_t fota_verify(const mp_obj_t arg0)
@@ -205,7 +246,7 @@ STATIC mp_obj_t fota_verify(const mp_obj_t arg0)
        
        return mp_obj_new_int(0);
 }
-#if !defined(PLAT_RDA)
+#if !defined(PLAT_RDA) || defined(BOARD_BC92RB)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(fota_verify_obj, fota_verify);
 #endif
 STATIC c_callback_t *fota_callback = NULL;
@@ -260,16 +301,31 @@ STATIC mp_obj_t fota_firmware_download(size_t n_args, const mp_obj_t *args, mp_m
                ARG_url2,       
         ARG_callback,
         ARG_header,
+        ARG_ssl_params,
+        ARG_public_key,
     };
     static const mp_arg_t allowed_args[] = {
         { MP_QSTR_url1,         MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
         { MP_QSTR_url2,         MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
         { MP_QSTR_callback,     MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
         { MP_QSTR_header,       MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+        { MP_QSTR_ssl_params,   MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+        { MP_QSTR_public_key,   MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
     };
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)//forrest.liu@20220611 add for http header set by python
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)//forrest.liu@20220611 add for http header set by python
        struct header http_header[64] = {0};
 #endif
+
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)//forrest.liu@20231127 add for ssl_params set by python
+       char * dict_key = NULL;
+       char *client_key = NULL;
+       char *client_cert = NULL;
+       char *ca_cert = NULL;
+       int ssl_version = 4;
+       int cipher_suites = 0xffff;
+       int sec_level = 0;
+#endif
+
     mp_arg_val_t args_parse[MP_ARRAY_SIZE(allowed_args)];
     mp_arg_parse_all(n_args-1, args+1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args_parse);
 
@@ -287,12 +343,15 @@ STATIC mp_obj_t fota_firmware_download(size_t n_args, const mp_obj_t *args, mp_m
        fota_callback = &cb;
        mp_sched_schedule_callback_register(fota_callback, args_parse[ARG_callback].u_obj);
     }
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)//forrest.liu@20220611 add for http header set by python
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)//forrest.liu@20220611 add for http header set by python
     if (args_parse[ARG_header].u_obj != mp_const_none) {
                if(mp_obj_get_type(args_parse[ARG_header].u_obj) == &mp_type_dict) {
                        mp_map_t *map = &((mp_obj_dict_t *)MP_OBJ_TO_PTR(args_parse[ARG_header].u_obj))->map;
             // copy across the keyword arguments
             for (size_t i = 0; i < map->alloc; ++i) {
+                               if(i > 63){
+                                       break;
+                               }
                 if (mp_map_slot_is_filled(map, i)) {
                     http_header[i].key = (char *)(mp_obj_str_get_str(map->table[i].key));
                     http_header[i].value = (char *)(mp_obj_str_get_str(map->table[i].value));
@@ -303,6 +362,84 @@ STATIC mp_obj_t fota_firmware_download(size_t n_args, const mp_obj_t *args, mp_m
        extern void Helios_Fota_Http_Header(struct header *header);
        Helios_Fota_Http_Header(http_header);
 #endif
+
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc)//forrest.liu@20231127 add for ssl_params set by python
+               if (args_parse[ARG_ssl_params].u_obj != mp_const_none) {
+                       if(mp_obj_get_type(args_parse[ARG_ssl_params].u_obj) == &mp_type_dict) 
+                       {
+                               mp_map_t *map = &((mp_obj_dict_t *)MP_OBJ_TO_PTR(args_parse[ARG_ssl_params].u_obj))->map;
+                               // copy across the keyword arguments
+                               for (size_t i = 0; i < map->alloc; ++i) 
+                               {
+                                       if (mp_map_slot_is_filled(map, i)) 
+                                       {
+                                               dict_key = (char *)(mp_obj_str_get_str(map->table[i].key));
+                                               if(strncmp("ca_cert", dict_key, 7) == 0)
+                                               {
+                                                       ca_cert = (char *)(mp_obj_str_get_str(map->table[i].value));
+                                               }
+                                               else if(strncmp("client_cert", dict_key, 11) == 0)
+                                               {
+                                                       client_cert = (char *)(mp_obj_str_get_str(map->table[i].value));
+                                               }
+                                               else if(strncmp("client_key", dict_key, 10) == 0)
+                                               {
+                                                       client_key = (char *)(mp_obj_str_get_str(map->table[i].value));
+                                               }
+                                               else if(strncmp("ssl_version", dict_key, 11) == 0)
+                                               {
+                                                       ssl_version = mp_obj_get_int(map->table[i].value);
+                                               }
+                                               else if(strncmp("cipher_suites", dict_key, 13) == 0)
+                                               {
+                                                       cipher_suites = mp_obj_get_int(map->table[i].value);
+                                               }
+                                               else if(strncmp("sec_level", dict_key, 9) == 0)
+                                               {
+                                                       sec_level = mp_obj_get_int(map->table[i].value);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               Helios_Fota_SslConfig((char *)(ca_cert), (char *)(client_cert), (char *)(client_key));
+               extern int Helios_Fota_SslConfig_Ex(int ssl_version, int cipher_suites, int sec_level);
+               ret = Helios_Fota_SslConfig_Ex(ssl_version, cipher_suites, sec_level);
+               if(ret)
+               {
+                       MOD_FOTA_LOG("*** fota cert key config fail ***\r\n");
+               }
+#endif
+
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc)
+               char *public_key = NULL;
+               mp_buffer_info_t public_key_buf = {0};
+
+               if (args_parse[ARG_public_key].u_obj != MP_OBJ_NULL) {
+                       if(mp_obj_get_type(args_parse[ARG_public_key].u_obj) == &mp_type_str) 
+                       {
+                               
+                               public_key = (char *)(mp_obj_str_get_str(args_parse[ARG_public_key].u_obj));
+                               MOD_FOTA_LOG("public_key is str. len[%d] is %s\n", strlen(public_key), public_key);
+                               Helios_Fota_Set_PublicKey((unsigned char*)public_key, strlen(public_key));
+                       } else if (mp_obj_get_type(args_parse[ARG_public_key].u_obj) == &mp_type_bytearray)
+                       {
+                               mp_get_buffer_raise(args_parse[ARG_public_key].u_obj, &public_key_buf, MP_BUFFER_READ);
+                               if (public_key_buf.len <= 0 || public_key_buf.buf == NULL)
+                               {
+                                       mp_raise_ValueError("invalid public key data");
+                               }
+                               
+                               MOD_FOTA_LOG("public_key is bytearray. len[%d], str is %s\n", public_key_buf.len, public_key_buf.buf);
+                               Helios_Fota_Set_PublicKey(public_key_buf.buf, public_key_buf.len);
+                       } else {
+                               MOD_FOTA_LOG("public_key is not bytearray and str \n");
+                       }               
+               
+               }
+#endif
+
+
     MP_THREAD_GIL_EXIT();
        ret  = Helios_Fota_firmware_download(server_address1, server_address2, mpFotaProgressCB);
        MP_THREAD_GIL_ENTER();
@@ -318,6 +455,51 @@ STATIC mp_obj_t fota_firmware_download(size_t n_args, const mp_obj_t *args, mp_m
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(fota_firmware_download_obj, 1, fota_firmware_download);
 
+#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+STATIC mp_obj_t fota_ftp_download(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args)
+{      
+       int ret;
+       char *server_address = NULL;
+
+    enum {
+        ARG_url,
+        ARG_callback,
+    };
+    static const mp_arg_t allowed_args[] = {
+        { MP_QSTR_url,         MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+        { MP_QSTR_callback,     MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+    };
+
+    mp_arg_val_t args_parse[MP_ARRAY_SIZE(allowed_args)];
+    mp_arg_parse_all(n_args-1, args+1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args_parse);
+
+    if (args_parse[ARG_url].u_obj != mp_const_none) {
+        server_address = (char *)(mp_obj_str_get_str(args_parse[ARG_url].u_obj));
+    }
+
+    if (args_parse[ARG_callback].u_obj != mp_const_none) {
+        static c_callback_t cb = {0};
+        memset(&cb, 0, sizeof(c_callback_t));
+       fota_callback = &cb;
+       mp_sched_schedule_callback_register(fota_callback, args_parse[ARG_callback].u_obj);
+    }
+
+    MP_THREAD_GIL_EXIT();
+       ret  = Helios_Fota_firmware_download(server_address, NULL, mpFotaProgressCB);
+       MP_THREAD_GIL_ENTER();
+       
+       if(ret)
+       {
+               MOD_FOTA_LOG("*** fota ftp download fail ***\r\n");
+               return mp_obj_new_int(-1);
+       }
+
+       return mp_obj_new_int(0);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(fota_ftp_download_obj, 1, fota_ftp_download);
+#endif
+
 #if defined(PLAT_Qualcomm)
 STATIC mp_obj_t fota_download_cancel(const mp_obj_t arg0)
 {
@@ -390,6 +572,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(fota_apn_set_obj, 1, fota_apn_set);
 
 #endif
 
+
 STATIC mp_obj_t fota___del__(mp_obj_t self_in)
 {
     fota_obj_t *self = MP_OBJ_TO_PTR(self_in);
@@ -406,7 +589,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(fota___del___obj, fota___del__);
 STATIC const mp_rom_map_elem_t fota_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&fota___del___obj) },
        { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_fota) },
-#if !defined(PLAT_RDA)
+#if !defined(PLAT_RDA) || defined(BOARD_BC92RB)
        { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&fota_write_obj) },
        { MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&fota_flush_obj) },
        { MP_ROM_QSTR(MP_QSTR_verify), MP_ROM_PTR(&fota_verify_obj) },
@@ -416,6 +599,14 @@ STATIC const mp_rom_map_elem_t fota_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_download_cancel), MP_ROM_PTR(&fota_download_cancel_obj) },
        { MP_ROM_QSTR(MP_QSTR_apn_set), MP_ROM_PTR(&fota_apn_set_obj) },
 #endif
+#if defined(PLAT_Qualcomm) || defined (PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+       { MP_ROM_QSTR(MP_QSTR_ftpDownload), MP_ROM_PTR(&fota_ftp_download_obj) },
+#endif
+#if defined(PLAT_aic8800m40)
+       { MP_ROM_QSTR(MP_QSTR_fcm362k_ota_write), MP_ROM_PTR(&fcm362k_ota_write_obj) },
+       { MP_ROM_QSTR(MP_QSTR_fcm362k_ota_start), MP_ROM_PTR(&fcm362k_ota_start_obj) },
+       { MP_ROM_QSTR(MP_QSTR_fcm362k_ota_end), MP_ROM_PTR(&fcm362k_ota_end_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(fota_locals_dict, fota_locals_dict_table);
 
index c46ba13..426665d 100644 (file)
@@ -501,7 +501,7 @@ STATIC mp_obj_t qpy_module_gnss_config_set(mp_obj_t mp_config_type, mp_obj_t mp_
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_module_gnss_config_set_obj, qpy_module_gnss_config_set);
- 
+
 STATIC mp_obj_t qpy_module_gnss_config_get(mp_obj_t mp_config_type)
 {
        int config_type = mp_obj_get_int(mp_config_type);
index b196345..2331988 100644 (file)
 #include "helios_debug.h"
 #endif
 
+#if defined (PLAT_ECR6600)
+#define LPM_SLEEP_MODE_DEFAULT          (HELIOS_LPM_MODE_MODEM_SLEEP)
+#define LPM_LISTEN_INTERVAL_DEFAULT     (10)
+#endif
+
+#if defined (PLAT_aic8800m40)
+#define LPM_SLEEP_MODE_DEFAULT          (HELIOS_LPM_MODE_LIGHT_SLEEP)
+#define LPM_LISTEN_INTERVAL_DEFAULT     (10)
+#endif
+
 /*=============================================================================*/
 /* FUNCTION: Helios_sleep_enable_mp                                             */
 /*=============================================================================*/
@@ -54,13 +64,21 @@ STATIC mp_obj_t Helios_sleep_enable_mp(const mp_obj_t s_flag)
   int sleep_flag;
   
   sleep_flag = mp_obj_get_int(s_flag);
-  if(sleep_flag == 0 || sleep_flag ==1){
-       ret = Helios_LPM_AutoSleepEnable((uint32_t) sleep_flag);
+  if(sleep_flag == 0 || sleep_flag == 1)
+  {
+         ret = Helios_LPM_AutoSleepEnable((uint32_t) sleep_flag);
     return mp_obj_new_int(ret);
-  }else{
-       return mp_obj_new_int(-1);
   }
-
+#if defined(PLAT_EIGEN) || defined(BOARD_BC32RA) || defined(PLAT_EIGEN_718)
+  else if(sleep_flag == 2)
+  {
+    return mp_obj_new_int(Helios_LPM_forcehib());
+  }  
+#endif  
+  else
+  {
+         return mp_obj_new_int(-1);
+  }
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(Helios_sleep_enable_mp_obj, Helios_sleep_enable_mp);
 
@@ -127,6 +145,78 @@ STATIC mp_obj_t Helios_lpm_wakelock_unlock_mp(const mp_obj_t lpm_fd)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(Helios_lpm_wakelock_unlock_mp_obj, Helios_lpm_wakelock_unlock_mp);
 #endif
 
+#if defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
+/*=============================================================================*/
+/* FUNCTION: Helios_lpm_config_mp                                             */
+/*=============================================================================*/
+/*!@brief     : config
+ * @param[in]   : 
+ * @param[out]  : 
+ * @return    :
+ *        -  0--successful
+  *       -  -1--error
+ */
+/*=============================================================================*/
+STATIC mp_obj_t Helios_lpm_config_mp(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
+  Helios_LPM_Mode mode = LPM_SLEEP_MODE_DEFAULT;
+  unsigned char interval = LPM_LISTEN_INTERVAL_DEFAULT;
+
+  for (size_t i = 0; i < kwargs->alloc; i++) {
+    if (mp_map_slot_is_filled(kwargs, i)) {
+      switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+        case MP_QSTR_mode: {
+          mode = mp_obj_get_int(kwargs->table[i].value);
+#if defined (PLAT_ECR6600)     /* not support others mode now */
+          if (mode != LPM_SLEEP_MODE_DEFAULT) {
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid value"));
+          }
+#endif
+#if defined (PLAT_aic8800m40)
+          if (mode != HELIOS_LPM_MODE_LIGHT_SLEEP
+              && mode != HELIOS_LPM_MODE_DEEP_SLEEP
+              && mode != HELIOS_LPM_MODE_HIBERNATE) {
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid value"));
+          }
+#endif
+          break;
+        }
+        case MP_QSTR_interval: {
+          if(mp_obj_get_type(args[1]) != &mp_type_int)
+          {
+            mp_raise_ValueError(MP_ERROR_TEXT("invalid value"));
+          }
+          else
+          {
+            if(mp_obj_get_int(kwargs->table[i].value)<0||mp_obj_get_int(kwargs->table[i].value)>255)
+            {
+              mp_raise_ValueError(MP_ERROR_TEXT("invalid value"));
+            }
+            else
+            {
+              interval = mp_obj_get_int(kwargs->table[i].value);
+            }
+
+          }        
+            break;
+        }
+        default:
+          goto unknown;
+      }
+    }
+  }
+
+  if (Helios_LPM_Config(mode, interval) != 0) {
+    return MP_OBJ_NEW_SMALL_INT(-1);
+  }
+  return MP_OBJ_NEW_SMALL_INT(0);
+
+unknown:
+  mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+}
+
+MP_DEFINE_CONST_FUN_OBJ_KW(Helios_lpm_config_mp_obj, 0, Helios_lpm_config_mp);
+#endif
+
 /*=============================================================================*/
 /* FUNCTION: Helios_lpm_wakelock_create_mp                                             */
 /*=============================================================================*/
@@ -232,7 +322,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(Helios_lpm_get_wakelock_num_mp_obj, Helios_lpm_
  *               else  fail
  */
 /*=============================================================================*/
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN)|| defined(PLAT_ASR_1606) \
+|| defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)\
+|| defined(PLAT_EIGEN_718)|| defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t Helios_lpm_ex_set_mp(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
@@ -291,7 +383,44 @@ STATIC mp_obj_t helios_sleep_set_callback(mp_obj_t callback)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_set_sleep_cb_obj, helios_sleep_set_callback);
 #endif
-#if defined(PLAT_RDA) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_RDA) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) \
+|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_EIGEN_718)\
+|| defined(PLAT_Qualcomm) && !defined(BOARD_BG95M6)
+
+#if defined(PLAT_Qualcomm)
+
+typedef struct{
+       uint8_t net_psm_mode;
+       uint64_t net_tau;
+       uint64_t net_act;
+}helios_lpm_real_psm_info_t;
+
+extern int Helios_LPM_get_Real_PsmTime(helios_lpm_real_psm_info_t *psm_real_info);
+
+STATIC mp_obj_t helios_pm_get_net_psm_value(void)
+{
+  int ret = -1;
+  helios_lpm_real_psm_info_t temp_psm_value;
+  memset((void *)&temp_psm_value, 0x00, sizeof(temp_psm_value));
+  ret = Helios_LPM_get_Real_PsmTime(&temp_psm_value);
+
+  if(ret != 0)
+  {
+    return mp_obj_new_int(-1);
+  }
+  
+  mp_obj_t psm_nw_val_list[3] = 
+  {
+    mp_obj_new_int((mp_int_t)temp_psm_value.net_psm_mode),
+    mp_obj_new_int((mp_int_t)temp_psm_value.net_tau),
+    mp_obj_new_int((mp_int_t)temp_psm_value.net_act),
+  };
+
+  return mp_obj_new_list(3, psm_nw_val_list);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(helios_pm_get_net_psm_value_obj, helios_pm_get_net_psm_value);
+#endif
+
 STATIC mp_obj_t helios_pm_set_psm_time(size_t n_args, const mp_obj_t *args)
 {
   int tau_uint = 0;
@@ -418,7 +547,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(helios_pm_get_edrx_time_obj,  helios_pm_get_edr
 extern const mp_obj_type_t lpm_wakeup_type;
 #endif
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 STATIC mp_obj_t helios_force_hib_mp(void)
 {
     return mp_obj_new_int(Helios_LPM_forcehib());
@@ -427,6 +556,27 @@ STATIC mp_obj_t helios_force_hib_mp(void)
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(helios_force_hib_mp_obj,  helios_force_hib_mp);
 #endif
 
+#if defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_QS)
+extern void Helios_LPM_ex_usb_busy_set(uint8_t usb_busy_allow);
+STATIC mp_obj_t helios_pm_ex_usb_busy_set(const mp_obj_t mp_usb_busy_allow)
+{
+  int usb_busy_allow;
+  
+  usb_busy_allow = mp_obj_get_int(mp_usb_busy_allow);
+
+  if(usb_busy_allow == 0 || usb_busy_allow == 1)
+  {
+           Helios_LPM_ex_usb_busy_set((uint8_t) usb_busy_allow);
+      return mp_obj_new_int(0);
+  }
+  else
+  {
+           return mp_obj_new_int(-1);
+  }  
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(helios_pm_ex_usb_busy_set_obj,  helios_pm_ex_usb_busy_set);
+#endif
+
 STATIC const mp_rom_map_elem_t pm_module_globals_table[] = {
   { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pm) },
 #if !defined(PLAT_RDA)
@@ -435,32 +585,57 @@ STATIC const mp_rom_map_elem_t pm_module_globals_table[] = {
   { MP_ROM_QSTR(MP_QSTR_wakelock_lock), MP_ROM_PTR(&Helios_lpm_wakelock_lock_mp_obj) },
   { MP_ROM_QSTR(MP_QSTR_wakelock_unlock), MP_ROM_PTR(&Helios_lpm_wakelock_unlock_mp_obj) },
   { MP_ROM_QSTR(MP_QSTR_get_wakelock_num), MP_ROM_PTR(&Helios_lpm_get_wakelock_num_mp_obj) },
+#endif
+#if defined(PLAT_ECR6600)
+  { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&Helios_lpm_config_mp_obj) },
+  { MP_ROM_QSTR(MP_QSTR_MODEM_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_MODEM_SLEEP)},
+  /* not support now */
+  // { MP_ROM_QSTR(MP_QSTR_LIGHT_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_LIGHT_SLEEP)},
+  // { MP_ROM_QSTR(MP_QSTR_DEEP_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_DEEP_SLEEP)},
+#endif
+#if defined (PLAT_aic8800m40)
+  { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&Helios_lpm_config_mp_obj) },
+  { MP_ROM_QSTR(MP_QSTR_LIGHT_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_LIGHT_SLEEP)},
+  { MP_ROM_QSTR(MP_QSTR_DEEP_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_DEEP_SLEEP)},
+  { MP_ROM_QSTR(MP_QSTR_HIBERNATE_SLEEP_MODE), MP_ROM_INT(HELIOS_LPM_MODE_HIBERNATE)},
 #endif
   { MP_ROM_QSTR(MP_QSTR_autosleep), MP_ROM_PTR(&Helios_sleep_enable_mp_obj) },
   // { MP_ROM_QSTR(MP_QSTR_getFreeSize), MP_ROM_PTR(&mp_get_free_size_obj) },
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN)|| defined(PLAT_ASR_1606) \
+|| defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602)\
+|| defined(PLAT_EIGEN_718)|| defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
   { MP_ROM_QSTR(MP_QSTR_sclkEx_set), MP_ROM_PTR(&Helios_lpm_ex_set_mp_obj) },
 #endif
 #if defined(PLAT_RDA)
   { MP_ROM_QSTR(MP_QSTR_set_sleep_cb), MP_ROM_PTR(&machine_set_sleep_cb_obj) },
 #endif
-#if defined(PLAT_RDA) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_RDA) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN)\
+|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_EIGEN_718)\
+|| defined(PLAT_Qualcomm) && !defined(BOARD_BG95M6)
   { MP_ROM_QSTR(MP_QSTR_set_psm_time), MP_ROM_PTR(&helios_pm_set_psm_time_obj) },
   { MP_ROM_QSTR(MP_QSTR_get_psm_time), MP_ROM_PTR(&helios_pm_get_psm_time_obj) },
 #if defined(PLAT_RDA)
   { MP_ROM_QSTR(MP_QSTR_set_edrx_time), MP_ROM_PTR(&helios_pm_set_edrx_time_obj) },
   { MP_ROM_QSTR(MP_QSTR_get_edrx_time), MP_ROM_PTR(&helios_pm_get_edrx_time_obj) },
 #endif
+#if defined(PLAT_Qualcomm)
+  { MP_ROM_QSTR(MP_QSTR_get_psm_netinfo), MP_ROM_PTR(&helios_pm_get_net_psm_value_obj) },
+#endif
+
 #endif
 
 #if MICROPY_QPY_LPM_WAKEUP
   { MP_ROM_QSTR(MP_QSTR_WakeUp), MP_ROM_PTR(&lpm_wakeup_type) },  //add for eigen plat 20230301
 #endif
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
   { MP_ROM_QSTR(MP_QSTR_forceHib), MP_ROM_PTR(&helios_force_hib_mp_obj) },
 #endif
 
+#if defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_QS)
+  { MP_ROM_QSTR(MP_QSTR_sclkEx_usb_allow), MP_ROM_PTR(&helios_pm_ex_usb_busy_set_obj) },
+#endif
+
 };
 STATIC MP_DEFINE_CONST_DICT(pm_module_globals, pm_module_globals_table);
 
index d407227..338428d 100644 (file)
@@ -45,6 +45,7 @@
 /*
  * lvgl includes
  */
+#include "modlvgl_other_hander.h"
 
 #include "lvgl.h"
 #include "qpy_lcd.h"
@@ -2411,6 +2412,7 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_DRAW_MASK_RES_type = {
 #endif
 };
     
+#if LV_DRAW_COMPLEX != 0
 
 /*
  * lvgl LV_DRAW_MASK_TYPE object definitions
@@ -2497,7 +2499,7 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_DRAW_MASK_LINE_SIDE_type = {
     NULL
 #endif
 };
-    
+#endif //#if LV_DRAW_COMPLEX != 0    
 
 /*
  * lvgl ENUM_LV_RADIUS object definitions
@@ -2879,6 +2881,7 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_LABEL_LONG_type = {
 #endif
 };
     
+#if LV_USE_TABLE != 0
 
 /*
  * lvgl ENUM_LV_TABLE_CELL object definitions
@@ -2963,7 +2966,8 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_TABLE_CELL_CTRL_type = {
     NULL
 #endif
 };
-    
+
+#endif //#if LV_USE_TABLE != 0
 
 /*
  * lvgl LV_BAR_MODE object definitions
@@ -3136,6 +3140,7 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_BTNMATRIX_CTRL_type = {
 #endif
 };
     
+#if LV_USE_DROPDOWN != 0
 
 /*
  * lvgl ENUM_LV_DROPDOWN_POS object definitions
@@ -3175,7 +3180,10 @@ STATIC const mp_lv_obj_type_t mp_lv_ENUM_LV_DROPDOWN_POS_type = {
     NULL
 #endif
 };
+
+#endif //#if LV_USE_DROPDOWN != 0
     
+#if LV_USE_ROLLER != 0
 
 /*
  * lvgl LV_ROLLER_MODE object definitions
@@ -3217,18 +3225,19 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_ROLLER_MODE_type = {
 #endif
 };
     
-
+#endif //#if LV_USE_ROLLER != 0
 /*
  * lvgl ENUM_LV_TEXTAREA_CURSOR object definitions
  */
     
-
+#if LV_USE_TEXTAREA != 0
 STATIC const mp_rom_map_elem_t ENUM_LV_TEXTAREA_CURSOR_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_LAST), MP_ROM_PTR(MP_ROM_INT(ENUM_LV_TEXTAREA_CURSOR_LAST)) }
 };
 
 STATIC MP_DEFINE_CONST_DICT(ENUM_LV_TEXTAREA_CURSOR_locals_dict, ENUM_LV_TEXTAREA_CURSOR_locals_dict_table);
 
+
 STATIC void ENUM_LV_TEXTAREA_CURSOR_print(const mp_print_t *print,
     mp_obj_t self_in,
     mp_print_kind_t kind)
@@ -3296,6 +3305,9 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_PART_TEXTAREA_type = {
     NULL
 #endif
 };
+
+#endif
+
     
 #if LV_USE_ANIMIMG
 /*
@@ -3547,8 +3559,9 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_KEYBOARD_MODE_type = {
     NULL
 #endif
 };
-#endif    
+#endif  
 
+#if LV_USE_FLEX != 0 
 /*
  * lvgl ENUM_LV_OBJ_FLAG_FLEX_IN_NEW object definitions
  */
@@ -3587,6 +3600,8 @@ STATIC const mp_lv_obj_type_t mp_lv_ENUM_LV_OBJ_FLAG_FLEX_IN_NEW_type = {
     NULL
 #endif
 };
+
+#endif //#if LV_USE_FLEX != 0 
     
 #if LV_USE_COLORWHEEL
 /*
@@ -3715,6 +3730,8 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_SPAN_MODE_type = {
 };
 #endif    
 
+#if LV_USE_GRID != 0
+
 /*
  * lvgl ENUM_LV_GRID object definitions
  */
@@ -3794,7 +3811,7 @@ STATIC const mp_lv_obj_type_t mp_lv_ENUM_LV_GRID_TEMPLATE_type = {
 #endif
 };
     
-
+#endif //#if LV_USE_GRID != 0
 /*
  * lvgl LV_ANIM object definitions
  */
@@ -4657,6 +4674,9 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_ARC_DRAW_PART_type = {
 };
     
 #endif
+
+#if LV_USE_TABLE != 0
+
 /*
  * lvgl LV_TABLE_DRAW_PART object definitions
  */
@@ -4695,6 +4715,8 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_TABLE_DRAW_PART_type = {
     NULL
 #endif
 };
+
+#endif //#if LV_USE_TABLE != 0
     
 
 /*
@@ -4902,7 +4924,10 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_CHART_DRAW_PART_type = {
     NULL
 #endif
 };
-#endif    
+#endif  
+
+#if LV_USE_FLEX != 0 
+
 
 /*
  * lvgl LV_FLEX_ALIGN object definitions
@@ -4994,7 +5019,8 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_FLEX_FLOW_type = {
     NULL
 #endif
 };
-    
+#endif //#if LV_USE_FLEX != 0 
+
 #if LV_USE_METER
 /*
  * lvgl LV_METER_INDICATOR_TYPE object definitions
@@ -5169,6 +5195,9 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_IMGBTN_STATE_type = {
 };
     
 #endif
+
+#if LV_USE_GRID != 0
+
 /*
  * lvgl LV_GRID_ALIGN object definitions
  */
@@ -5214,7 +5243,7 @@ STATIC const mp_lv_obj_type_t mp_lv_LV_GRID_ALIGN_type = {
 #endif
 };
     
-
+#endif //#if LV_USE_GRID != 0
 /*
  * lvgl LV_SYMBOL object definitions
  */
@@ -6853,6 +6882,7 @@ STATIC mp_obj_t mp_lv_obj_dpx(size_t mp_n_args, const mp_obj_t *mp_args, void *l
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_dpx_obj, 2, mp_lv_obj_dpx, lv_obj_dpx);
     
+#if LV_USE_FLEX != 0 
 
 /*
  * lvgl extension definition for:
@@ -6917,7 +6947,10 @@ STATIC mp_obj_t mp_lv_obj_get_style_flex_grow(size_t mp_n_args, const mp_obj_t *
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_get_style_flex_grow_obj, 2, mp_lv_obj_get_style_flex_grow, lv_obj_get_style_flex_grow);
-    
+
+#endif //#if LV_USE_FLEX != 0    
+
+
 
 /*
  * Array convertors for lv_coord_t *
@@ -6948,7 +6981,7 @@ STATIC mp_obj_t mp_arr_from_lv_coord_t_ptr(const lv_coord_t *arr)
     return mp_obj_new_list(1, obj_arr); // TODO: return custom iterable object!
 }
     
-
+#if LV_USE_GRID != 0
 /*
  * lvgl extension definition for:
  * inline static const lv_coord_t *lv_obj_get_style_grid_row_dsc_array(const lv_obj_t *obj, uint32_t part)
@@ -7032,6 +7065,8 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_get_style_grid_cell_x_align_obj,
 /* Reusing lv_obj_get_style_grid_cell_column_pos for lv_obj_get_style_grid_cell_y_align */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_get_style_grid_cell_y_align_obj, 2, mp_lv_obj_get_style_grid_cell_column_pos, lv_obj_get_style_grid_cell_y_align);
+
+#endif //#if LV_USE_GRID != 0
     
 /* Reusing lv_obj_center for lv_obj_del */
 
@@ -11340,6 +11375,7 @@ STATIC mp_obj_t mp_lv_obj_is_valid(size_t mp_n_args, const mp_obj_t *mp_args, vo
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_is_valid_obj, 1, mp_lv_obj_is_valid, lv_obj_is_valid);
     
+#if LV_USE_FLEX != 0 
 
 /*
  * lvgl extension definition for:
@@ -11379,7 +11415,8 @@ STATIC mp_obj_t mp_lv_obj_set_flex_align(size_t mp_n_args, const mp_obj_t *mp_ar
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_flex_align_obj, 4, mp_lv_obj_set_flex_align, lv_obj_set_flex_align);
-    
+
+#endif    
 
 /*
  * lvgl extension definition for:
@@ -11395,7 +11432,7 @@ STATIC mp_obj_t mp_lv_obj_set_flex_grow(size_t mp_n_args, const mp_obj_t *mp_arg
     return mp_const_none;
 }
 
- 
+#if LV_USE_FLEX != 0  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_flex_grow_obj, 2, mp_lv_obj_set_flex_grow, lv_obj_set_flex_grow);
     
@@ -11466,6 +11503,8 @@ STATIC mp_obj_t mp_lv_obj_set_style_flex_grow(size_t mp_n_args, const mp_obj_t *
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_style_flex_grow_obj, 3, mp_lv_obj_set_style_flex_grow, lv_obj_set_style_flex_grow);
+
+#endif //#if LV_USE_FLEX != 0 
     
 #if LV_USE_TILEVIEW
 /*
@@ -11507,7 +11546,9 @@ STATIC mp_obj_t mp_lv_obj_set_tile_id(size_t mp_n_args, const mp_obj_t *mp_args,
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_tile_id_obj, 4, mp_lv_obj_set_tile_id, lv_obj_set_tile_id);
-#endif    
+#endif   
+
+
 
 /*
  * Array convertors for lv_coord_t []
@@ -11538,6 +11579,7 @@ STATIC mp_obj_t mp_arr_from_lv_coord_t_____(const lv_coord_t *arr)
     return mp_obj_new_list(1, obj_arr); // TODO: return custom iterable object!
 }
     
+#if LV_USE_GRID != 0
 
 /*
  * lvgl extension definition for:
@@ -11690,7 +11732,7 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_style_grid_cell_x_align_obj,
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_obj_set_style_grid_cell_y_align_obj, 3, mp_lv_obj_set_style_grid_cell_column_pos, lv_obj_set_style_grid_cell_y_align);
     
-
+#endif //#if LV_USE_GRID != 0
 /*
  * lvgl extension definition for:
  * lv_obj_t *lv_obj_create(lv_obj_t *parent)
@@ -11814,11 +11856,14 @@ STATIC const mp_rom_map_elem_t obj_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_user_data), MP_ROM_PTR(&mp_lv_obj_set_user_data_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_user_data), MP_ROM_PTR(&mp_lv_obj_get_user_data_obj) },
     { MP_ROM_QSTR(MP_QSTR_dpx), MP_ROM_PTR(&mp_lv_obj_dpx_obj) },
+#if LV_USE_FLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_get_style_flex_flow), MP_ROM_PTR(&mp_lv_obj_get_style_flex_flow_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_flex_main_place), MP_ROM_PTR(&mp_lv_obj_get_style_flex_main_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_flex_cross_place), MP_ROM_PTR(&mp_lv_obj_get_style_flex_cross_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_flex_track_place), MP_ROM_PTR(&mp_lv_obj_get_style_flex_track_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_flex_grow), MP_ROM_PTR(&mp_lv_obj_get_style_flex_grow_obj) },
+#endif  
+#if LV_USE_GRID != 0
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_row_dsc_array), MP_ROM_PTR(&mp_lv_obj_get_style_grid_row_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_column_dsc_array), MP_ROM_PTR(&mp_lv_obj_get_style_grid_column_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_row_align), MP_ROM_PTR(&mp_lv_obj_get_style_grid_row_align_obj) },
@@ -11829,6 +11874,7 @@ STATIC const mp_rom_map_elem_t obj_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_cell_row_span), MP_ROM_PTR(&mp_lv_obj_get_style_grid_cell_row_span_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_cell_x_align), MP_ROM_PTR(&mp_lv_obj_get_style_grid_cell_x_align_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_style_grid_cell_y_align), MP_ROM_PTR(&mp_lv_obj_get_style_grid_cell_y_align_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_delete), MP_ROM_PTR(&mp_lv_obj_del_obj) },
     { MP_ROM_QSTR(MP_QSTR_clean), MP_ROM_PTR(&mp_lv_obj_clean_obj) },
     { MP_ROM_QSTR(MP_QSTR_del_delayed), MP_ROM_PTR(&mp_lv_obj_del_delayed_obj) },
@@ -12044,6 +12090,7 @@ STATIC const mp_rom_map_elem_t obj_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_has_class), MP_ROM_PTR(&mp_lv_obj_has_class_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_class), MP_ROM_PTR(&mp_lv_obj_get_class_obj) },
     { MP_ROM_QSTR(MP_QSTR_is_valid), MP_ROM_PTR(&mp_lv_obj_is_valid_obj) },
+#if LV_USE_FLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_set_flex_flow), MP_ROM_PTR(&mp_lv_obj_set_flex_flow_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_align), MP_ROM_PTR(&mp_lv_obj_set_flex_align_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_grow), MP_ROM_PTR(&mp_lv_obj_set_flex_grow_obj) },
@@ -12052,13 +12099,15 @@ STATIC const mp_rom_map_elem_t obj_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_style_flex_cross_place), MP_ROM_PTR(&mp_lv_obj_set_style_flex_cross_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_flex_track_place), MP_ROM_PTR(&mp_lv_obj_set_style_flex_track_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_flex_grow), MP_ROM_PTR(&mp_lv_obj_set_style_flex_grow_obj) },
+#endif
 #if LV_USE_TILEVIEW
     { MP_ROM_QSTR(MP_QSTR_set_tile), MP_ROM_PTR(&mp_lv_obj_set_tile_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_tile_id), MP_ROM_PTR(&mp_lv_obj_set_tile_id_obj) },
 #endif
+#if LV_USE_GRID != 0
     { MP_ROM_QSTR(MP_QSTR_set_grid_dsc_array), MP_ROM_PTR(&mp_lv_obj_set_grid_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_grid_align), MP_ROM_PTR(&mp_lv_obj_set_grid_align_obj) },
-    { MP_ROM_QSTR(MP_QSTR_set_grid_cell), MP_ROM_PTR(&mp_lv_obj_set_grid_cell_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_grid_cell), MP_ROM_PTR(&mp_lv_obj_set_grid_cell_obj) },  
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_row_dsc_array), MP_ROM_PTR(&mp_lv_obj_set_style_grid_row_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_column_dsc_array), MP_ROM_PTR(&mp_lv_obj_set_style_grid_column_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_row_align), MP_ROM_PTR(&mp_lv_obj_set_style_grid_row_align_obj) },
@@ -12069,6 +12118,7 @@ STATIC const mp_rom_map_elem_t obj_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_cell_row_span), MP_ROM_PTR(&mp_lv_obj_set_style_grid_cell_row_span_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_cell_x_align), MP_ROM_PTR(&mp_lv_obj_set_style_grid_cell_x_align_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_style_grid_cell_y_align), MP_ROM_PTR(&mp_lv_obj_set_style_grid_cell_y_align_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_FLAG), MP_ROM_PTR(&mp_lv_LV_OBJ_FLAG_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_DRAW_PART), MP_ROM_PTR(&mp_lv_LV_OBJ_DRAW_PART_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_TREE_WALK), MP_ROM_PTR(&mp_lv_LV_OBJ_TREE_WALK_type.mp_obj_type) },
@@ -13481,8 +13531,14 @@ STATIC mp_obj_t mp_lv_img_set_src(size_t mp_n_args, const mp_obj_t *mp_args, voi
 {
        (void)mp_n_args;
     lv_obj_t *obj = mp_to_lv(mp_args[0]);
-    const void *src = (const void *)mp_to_ptr(mp_args[1]);
-    ((void (*)(lv_obj_t *, const void *))lv_func_ptr)(obj, src);
+    const void *src = (const void *)mp_to_ptr(mp_args[1]);     
+       
+       lv_img_dsc_t img_src = {0};
+       if(helios_lv_get_img_dsc_by_img_name(src, &img_src)) {
+               ((void (*)(lv_obj_t *, const void *))lv_func_ptr)(obj, (const void*)&img_src);
+       } else {
+               ((void (*)(lv_obj_t *, const void *))lv_func_ptr)(obj, src);
+       }    
     return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_img_set_src_obj, 2, mp_lv_img_set_src, lv_img_set_src);
@@ -13862,6 +13918,8 @@ STATIC mp_obj_t mp_lv_img_deinit(size_t mp_n_args, const mp_obj_t *mp_args, void
 }
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_img___del___obj, 1, mp_lv_img_deinit, NULL);
 #endif
+
+
 /*
  * lvgl extension definition for:
  * void lv_img_set_offset_x(lv_obj_t *obj, lv_coord_t x)
@@ -14088,6 +14146,7 @@ STATIC const mp_rom_map_elem_t img_locals_dict_table[] = {
 #ifdef BOARD_EC600UCN_LB_ICC
     { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_lv_img___del___obj) },
 #endif
+
     { MP_ROM_QSTR(MP_QSTR_buf_alloc), MP_ROM_PTR(&mp_lv_img_buf_alloc_obj) },
     { MP_ROM_QSTR(MP_QSTR_buf_get_px_color), MP_ROM_PTR(&mp_lv_img_buf_get_px_color_obj) },
     { MP_ROM_QSTR(MP_QSTR_buf_get_px_alpha), MP_ROM_PTR(&mp_lv_img_buf_get_px_alpha_obj) },
@@ -14614,7 +14673,9 @@ STATIC const mp_lv_obj_type_t mp_lv_line_type = {
  * lvgl extension definition for:
  * void lv_table_set_cell_value(lv_obj_t *obj, uint16_t row, uint16_t col, const char *txt)
  */
- 
+
+#if LV_USE_TABLE != 0
+
 STATIC mp_obj_t mp_lv_table_set_cell_value(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
 {
        (void)mp_n_args;
@@ -14850,6 +14911,8 @@ STATIC const mp_lv_obj_type_t mp_lv_table_type = {
     &lv_table_class
 #endif
 };
+
+#endif //#if LV_USE_TABLE != 0
     
 /* Reusing lv_label_set_text for lv_checkbox_set_text */
 
@@ -15575,7 +15638,9 @@ STATIC const mp_lv_obj_type_t mp_lv_btnmatrix_type = {
     &lv_btnmatrix_class
 #endif
 };
-    
+
+#if LV_USE_DROPDOWN != 0
+
 /* Reusing lv_label_set_text for lv_dropdown_set_text */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_dropdown_set_text_obj, 2, mp_lv_label_set_text, lv_dropdown_set_text);
@@ -15802,8 +15867,21 @@ STATIC const mp_lv_obj_type_t mp_lv_dropdown_type = {
     &lv_dropdown_class
 #endif
 };
-    
 
+#else 
+//for msgbox
+STATIC mp_obj_t mp_lv_dropdown_get_text(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
+{
+       (void)mp_n_args;
+    lv_obj_t *obj = mp_to_lv(mp_args[0]);
+    const char * _res = ((const char *(*)(lv_obj_t *))lv_func_ptr)(obj);
+    return convert_to_str((void*)_res);
+}
+
+
+#endif //#if LV_USE_DROPDOWN != 0
+    
+#if LV_USE_ROLLER != 0
 /*
  * lvgl extension definition for:
  * void lv_roller_set_options(lv_obj_t *obj, const char *options, lv_roller_mode_t mode)
@@ -15842,7 +15920,7 @@ STATIC mp_obj_t mp_lv_roller_set_selected(size_t mp_n_args, const mp_obj_t *mp_a
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_roller_set_selected_obj, 3, mp_lv_roller_set_selected, lv_roller_set_selected);
-    
+
 /* Reusing lv_obj_set_flex_grow for lv_roller_set_visible_row_count */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_roller_set_visible_row_count_obj, 2, mp_lv_obj_set_flex_grow, lv_roller_set_visible_row_count);
@@ -15922,9 +16000,13 @@ STATIC const mp_lv_obj_type_t mp_lv_roller_type = {
     &lv_roller_class
 #endif
 };
+#endif //#if LV_USE_ROLLER != 0
     
 /* Reusing lv_label_set_text_sel_start for lv_textarea_add_char */
 
+#if LV_USE_TEXTAREA != 0
+
+
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_textarea_add_char_obj, 2, mp_lv_label_set_text_sel_start, lv_textarea_add_char);
     
 /* Reusing lv_label_set_text for lv_textarea_add_text */
@@ -16204,6 +16286,8 @@ STATIC const mp_lv_obj_type_t mp_lv_textarea_type = {
     &lv_textarea_class
 #endif
 };
+
+#endif //#if LV_USE_TEXTAREA != 0
     
 #if LV_USE_CANVAS != 0
 /*
@@ -21593,6 +21677,9 @@ STATIC const mp_lv_struct_t mp_lv_line_class = {
 };
     
 #endif
+
+#if LV_USE_TABLE != 0
+
 /*
  * lvgl lv_table_class global definitions
  */
@@ -21601,6 +21688,8 @@ STATIC const mp_lv_struct_t mp_lv_table_class = {
     { &mp_lv_obj_class_t_type },
     (lv_obj_class_t*)&lv_table_class
 };
+
+#endif //#if LV_USE_TABLE != 0
     
 
 /*
@@ -21642,6 +21731,7 @@ STATIC const mp_lv_struct_t mp_lv_btnmatrix_class = {
     (lv_obj_class_t*)&lv_btnmatrix_class
 };
     
+#if LV_USE_DROPDOWN != 0
 
 /*
  * lvgl lv_dropdown_class global definitions
@@ -21661,8 +21751,10 @@ STATIC const mp_lv_struct_t mp_lv_dropdownlist_class = {
     { &mp_lv_obj_class_t_type },
     (lv_obj_class_t*)&lv_dropdownlist_class
 };
-    
 
+#endif //#if LV_USE_DROPDOWN != 0
+    
+#if LV_USE_ROLLER != 0
 /*
  * lvgl lv_roller_class global definitions
  */
@@ -21671,8 +21763,9 @@ STATIC const mp_lv_struct_t mp_lv_roller_class = {
     { &mp_lv_obj_class_t_type },
     (lv_obj_class_t*)&lv_roller_class
 };
+#endif
     
-
+#if LV_USE_TEXTAREA != 0
 /*
  * lvgl lv_textarea_class global definitions
  */
@@ -21681,6 +21774,7 @@ STATIC const mp_lv_struct_t mp_lv_textarea_class = {
     { &mp_lv_obj_class_t_type },
     (lv_obj_class_t*)&lv_textarea_class
 };
+       #endif
     
 #if LV_USE_CANVAS != 0
 /*
@@ -21846,7 +21940,9 @@ STATIC inline const mp_obj_type_t *get_mp__lv_mp_int_wrapper_type()
 {
     return &mp__lv_mp_int_wrapper_type;
 }
-    
+
+#if LV_USE_FLEX != 0 
+
 
 /*
  * lvgl LV_LAYOUT_FLEX global definitions
@@ -21906,6 +22002,8 @@ STATIC const mp_lv_struct_t mp_LV_STYLE_FLEX_GROW = {
     { &mp__lv_mp_int_wrapper_type },
     (lv_style_prop_t*)&LV_STYLE_FLEX_GROW
 };
+
+#endif //#if LV_USE_FLEX != 0 
     
 #if LV_USE_LIST
 /*
@@ -22079,6 +22177,8 @@ STATIC const mp_lv_struct_t mp_lv_spangroup_class = {
 };
 #endif    
 
+#if LV_USE_GRID != 0
+
 /*
  * lvgl LV_LAYOUT_GRID global definitions
  */
@@ -22187,6 +22287,8 @@ STATIC const mp_lv_struct_t mp_LV_STYLE_GRID_CELL_Y_ALIGN = {
     { &mp__lv_mp_int_wrapper_type },
     (lv_style_prop_t*)&LV_STYLE_GRID_CELL_Y_ALIGN
 };
+       
+#endif //#if LV_USE_GRID != 0  
 
 #if LV_USE_QRCODE
 /*
@@ -23763,7 +23865,7 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_funcptr_lv_draw_mask_xcb_t_obj,
     
 STATIC inline mp_obj_t mp_lv_funcptr_lv_draw_mask_xcb_t(void *func){ return mp_lv_funcptr(&mp_funcptr_lv_draw_mask_xcb_t_obj, func, NULL, MP_QSTR_, NULL); }
 
-
+#if LV_DRAW_COMPLEX != 0
 /*
  * Function NOT generated:
  * Missing 'user_data' as a field of the first parameter of the callback function '_lv_draw_mask_common_dsc_t_cb_callback'
@@ -24272,7 +24374,7 @@ STATIC inline const mp_obj_type_t *get_mp_lv_draw_mask_radius_param_cfg_t_type()
 {
     return &mp_lv_draw_mask_radius_param_cfg_t_type;
 }
-    
+#endif //#if LV_DRAW_COMPLEX != 0    
 
 /*
  * Struct lv_sqrt_res_t
@@ -24352,7 +24454,7 @@ STATIC inline const mp_obj_type_t *get_mp_lv_sqrt_res_t_type()
     return &mp_lv_sqrt_res_t_type;
 }
     
-
+#if LV_DRAW_COMPLEX != 0
 /*
  * Struct lv_draw_mask_radius_param_t
  */
@@ -24758,7 +24860,7 @@ STATIC inline const mp_obj_type_t *get_mp_lv_draw_mask_map_param_t_type()
 {
     return &mp_lv_draw_mask_map_param_t_type;
 }
-    
+#endif //#if LV_DRAW_COMPLEX != 0    
 
 STATIC const mp_rom_map_elem_t mp_C_Pointer_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR___SIZE__), MP_ROM_PTR(MP_ROM_INT(sizeof(C_Pointer))) },
@@ -27022,7 +27124,96 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_bg_grad_stop_obj, 2, mp_lv
  * lvgl extension definition for:
  * void lv_style_set_bg_img_src(lv_style_t *style, const void *value)
  */
+
+#ifdef BOARD_EC600GCN_LA_CDD
+#include "helios_flash.h"
+
+#define IMG_IDEN_START "IMG_S"
+#define IMG_IDEN_END "IMG_E"
+
+typedef struct {
+    char img_name[16];
+    uint32_t size;
+    uint32_t offset;
+}Img_Struct;
+
+lv_img_dsc_t background = {
+  .header.cf = LV_IMG_CF_TRUE_COLOR,
+  .header.always_zero = 0,
+  .header.reserved = 0,
+  .header.w = 320,
+  .header.h = 240,
+  .data_size = 76800 * LV_COLOR_SIZE / 8,
+  .data = NULL,
+};
+
+
+STATIC int customer_img_get_bg_img(Img_Struct* data, uint8_t num) {
+    if(data == NULL) return -1;
+    HeliosFlashPartiCtx *img_addr = Helios_Flash_GetPartiCtx("bg_image");
+    QPY_LVGL_LOG("customer_image = %x\n",img_addr->addr);
+    
+    uint8_t *addr = (uint8_t*)(img_addr->addr);
+
+    if (strncmp((char*)addr, IMG_IDEN_START, strlen(IMG_IDEN_START)) != 0) {
+        QPY_LVGL_LOG("bg_img identification error\n");
+        return -1;
+    }
+
+    uint8_t img_num = *(addr+strlen(IMG_IDEN_START));
+    QPY_LVGL_LOG("img_num[%d], need num[%d]\n", img_num, num);
+    if(num >= img_num) return -1;
+
+    char img_iden_name[8] = {0};
+    sprintf(img_iden_name, "img_%d", num);
+    QPY_LVGL_LOG("img_iden_name is %s\n", img_iden_name);
+    Img_Struct* img_s = (Img_Struct*)(addr+strlen(IMG_IDEN_START)+1);
+
+    QPY_LVGL_LOG("flash1_name[%s], size[%d], offset[%d]\n", img_s[0].img_name, img_s[0].size, img_s[0].offset);
+    QPY_LVGL_LOG("flash2_name[%s], size[%d], offset[%d]\n", img_s[1].img_name, img_s[1].size, img_s[1].offset);
+
+    if(0 != strncmp(img_s[num].img_name, img_iden_name, strlen(img_iden_name))) {
+        QPY_LVGL_LOG("Corresponding file ID error, please check customer_img partition content\n");
+        return -1;
+    }
+
+    memcpy(data, img_s + num, sizeof(Img_Struct));
+    QPY_LVGL_LOG("img_name[%s], size[%d], offset[%d]\n", data->img_name, data->size, data->offset);
+
+    return 0;
+    
+}
  
+STATIC mp_obj_t mp_lv_style_set_bg_img_src(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
+{
+       (void)mp_n_args;
+    static uint8_t img_flag = 0;
+    lv_style_t *style = mp_write_ptr_lv_style_t(mp_args[0]);
+    //const void *value = (const void *)mp_to_ptr(mp_args[1]);
+    uint8_t num = (uint8_t)mp_obj_get_int(mp_args[1]);
+
+    Img_Struct bg_s = {0};
+    if(0 != customer_img_get_bg_img(&bg_s, num)) {
+        QPY_LVGL_LOG("img data get fail\n");
+        return mp_const_none;
+    }
+
+    HeliosFlashPartiCtx *img_addr = Helios_Flash_GetPartiCtx("bg_image");
+    QPY_LVGL_LOG("img_addr = %x\n",img_addr->addr);
+    uint8_t *addr = (uint8_t*)img_addr->addr;
+
+    if(img_flag == 0) {
+        img_flag = 1;
+        background.data = addr + bg_s.offset;
+        ((void (*)(lv_style_t *, const void *))lv_func_ptr)(style, &background);
+    }
+    
+    return mp_const_none;
+}
+
+STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_bg_img_src_obj, 2, mp_lv_style_set_bg_img_src, lv_style_set_bg_img_src);
+
+#else
 STATIC mp_obj_t mp_lv_style_set_bg_img_src(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
 {
        (void)mp_n_args;
@@ -27032,10 +27223,10 @@ STATIC mp_obj_t mp_lv_style_set_bg_img_src(size_t mp_n_args, const mp_obj_t *mp_
     return mp_const_none;
 }
 
- 
-
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_bg_img_src_obj, 2, mp_lv_style_set_bg_img_src, lv_style_set_bg_img_src);
-    
+
+#endif
+
 /* Reusing lv_style_set_opa for lv_style_set_bg_img_opa */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_bg_img_opa_obj, 2, mp_lv_style_set_opa, lv_style_set_bg_img_opa);
@@ -27144,7 +27335,8 @@ typedef struct{
     uint8_t r;
 }glyph_dsc_t;
 
-#if defined(PLAT_ASR_1606) || defined(PLAT_ASR)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8850_R02)
+
 
 #define MAX_BIN_NUM 16
 #define BIN_START_LEN 1
@@ -27229,7 +27421,7 @@ static void read_font_bin_header()
     uint8_t buf[2] = {0};
     if (!flash_type)
     {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) //0x80 addr
         Helios_Flash_Read(flash_vstart_address, buf, 2);
 #else      //without 0x80 addr
         Helios_Flash_Read(flash_start_address, buf, 2);
@@ -27237,7 +27429,7 @@ static void read_font_bin_header()
     }
     else
     {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
         Helios_External_Flash_Read(flash_port, flash_start_address, buf, 2);
 #endif
     }
@@ -27248,7 +27440,7 @@ static void read_font_bin_header()
         if (i == MAX_BIN_NUM-1) break;
         if (!flash_type)
         {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)//0x80 addr
             Helios_Flash_Read(flash_vstart_address + 2 + (bin_header->font_num)* 128 + sizeof(uint32_t)*i, &bin_header->bin_size[i], sizeof(uint32_t));
 #else      //without 0x80 addr
             Helios_Flash_Read(flash_start_address + 2 + (bin_header->font_num)* 128 + sizeof(uint32_t)*i, &bin_header->bin_size[i], sizeof(uint32_t));
@@ -27256,7 +27448,7 @@ static void read_font_bin_header()
         }
         else
         {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
             Helios_External_Flash_Read(flash_port, flash_start_address + 2 + (bin_header->font_num)* 128 + sizeof(uint32_t)*i, &bin_header->bin_size[i], sizeof(uint32_t));
 #endif
         }
@@ -27284,7 +27476,7 @@ static void get_bin_header(uint32_t bin_offset, x_header_t *header)
     
     if (!flash_type)
     {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)//0x80 addr
         Helios_Flash_Read(flash_vstart_address + bin_offset, header_buf, 5);
 #else      //without 0x80 addr
         Helios_Flash_Read(flash_start_address + bin_offset, header_buf, 5);
@@ -27292,7 +27484,7 @@ static void get_bin_header(uint32_t bin_offset, x_header_t *header)
     }
     else
     {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
         Helios_External_Flash_Read(flash_port, flash_start_address + bin_offset, header_buf, 5);
 #endif
     }
@@ -27311,7 +27503,7 @@ static uint8_t bin_find_index(char *bin_name)
     {
         if (!flash_type)
         {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)//0x80 addr
             Helios_Flash_Read(flash_vstart_address + 2 + 128*i, name_buf, 128);
 #else      //without 0x80 addr
             Helios_Flash_Read(flash_start_address + 2 + 128*i, name_buf, 128);
@@ -27319,7 +27511,7 @@ static uint8_t bin_find_index(char *bin_name)
         }
         else
         {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
             Helios_External_Flash_Read(flash_port, flash_start_address + 2 + 128*i, name_buf, 128);
 #endif
         }        
@@ -27347,7 +27539,7 @@ static uint8_t *__user_font_getdata(user_font_t *font_user, int offset, int size
                {
             if (!flash_type)
             {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)//0x80 addr
                 Helios_Flash_Read(flash_vstart_address + real_offset, font_user->__g_font_buf, size);
 #else      //without 0x80 addr
                 Helios_Flash_Read(flash_start_address + real_offset, font_user->__g_font_buf, size);
@@ -27356,7 +27548,7 @@ static uint8_t *__user_font_getdata(user_font_t *font_user, int offset, int size
             }
             else
             {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 Helios_External_Flash_Read(flash_port, flash_start_address + real_offset, font_user->__g_font_buf, size);
 #endif
             }
@@ -27376,7 +27568,7 @@ static uint8_t *__user_font_getdata(user_font_t *font_user, int offset, int size
                        }
             if (!flash_type)
             {
-#if defined(PLAT_ASR_1606) //0x80 addr
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602)//0x80 addr
                 Helios_Flash_Read(flash_vstart_address + font_buffer[font_buf_cnt].offset, font_buffer[font_buf_cnt].font, FONT_BUFFER_SIZE);
 #else      //without 0x80 addr
                 Helios_Flash_Read(flash_start_address + font_buffer[font_buf_cnt].offset, font_buffer[font_buf_cnt].font, FONT_BUFFER_SIZE);
@@ -27385,7 +27577,7 @@ static uint8_t *__user_font_getdata(user_font_t *font_user, int offset, int size
             }
             else
             {
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 Helios_External_Flash_Read(flash_port, flash_start_address + font_buffer[font_buf_cnt].offset, font_buffer[font_buf_cnt].font, FONT_BUFFER_SIZE);
 #endif
             }
@@ -27467,6 +27659,35 @@ static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_
     return false;
 }
 
+#ifdef CONFIG_LVGL_USE_FREETYPE
+STATIC mp_obj_t mp_lv_style_set_freetype_text_font(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
+{
+    char bin_name[128] = {0};
+    /*Create a font*/
+    static lv_ft_info_t info;
+
+       (void)mp_n_args;
+    lv_style_t *style = mp_write_ptr_lv_style_t(mp_args[0]);
+    memcpy(bin_name, (void *)mp_obj_str_get_str(mp_args[1]), strlen((char *)mp_obj_str_get_str(mp_args[1])));
+    int weight = mp_obj_get_int(mp_args[2]);
+    int font_style = mp_obj_get_int(mp_args[3]); // FT_FONT_STYLE_NORMAL
+    
+    QPY_LVGL_LOG("----bin_name: %s, weight: %d, style: %d\n", bin_name, weight, font_style);
+    info.name = bin_name;
+    info.weight = weight;
+    info.style = font_style;
+    info.mem = NULL;
+    if(!lv_ft_font_init(&info)) {
+        QPY_LVGL_LOG("create failed.");
+    }
+    
+    ((void (*)(lv_style_t *, const lv_font_t *))lv_func_ptr)(style, info.font);
+    return mp_const_none;
+}
+
+STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_freetype_text_font_obj, 4, mp_lv_style_set_freetype_text_font, lv_style_set_text_font);
+#endif
+
 //Helios_Flash_Get_addr
 STATIC mp_obj_t mp_lv_style_set_text_font_v2(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
 {
@@ -27484,6 +27705,10 @@ STATIC mp_obj_t mp_lv_style_set_text_font_v2(size_t mp_n_args, const mp_obj_t *m
     Helios_Flash_GetPartiCtx("ext_font");
     Helios_Flash_Get_addr("ext_font",&flash_vstart_address,&flash_address_size);
     QPY_LVGL_LOG("*************ext_font flash_vstart_address is %x\n",flash_vstart_address);
+#if defined(PLAT_Unisoc_8850_R02)
+       flash_start_address = flash_vstart_address;
+       flash_type = 0;
+#else
     //internal flash
     if((flash_vstart_address < 0x90000000) && flash_address_size)
     {
@@ -27491,12 +27716,13 @@ STATIC mp_obj_t mp_lv_style_set_text_font_v2(size_t mp_n_args, const mp_obj_t *m
         flash_type = 0;
     }
     //external flash
-    else if ((flash_vstart_address > 0x90000000) && flash_address_size)
+    else if ((flash_vstart_address >= 0x90000000) && flash_address_size)
     {
         flash_start_address = flash_vstart_address & 0xffffff;
         flash_port = mp_obj_get_int(mp_args[3]);
         flash_type = 1;
     }
+#endif
     read_font_bin_header();
     QPY_LVGL_LOG("----------font_num : %d, num_1 bin size is %d, num_2 bin size is %d, num_3 bin size is %d\n", font_bin_header->font_num, font_bin_header->bin_size[0], font_bin_header->bin_size[1], font_bin_header->bin_size[2]);
     
@@ -27540,7 +27766,7 @@ STATIC mp_obj_t mp_lv_style_set_text_font_v2(size_t mp_n_args, const mp_obj_t *m
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_text_font_v2_obj, 4, mp_lv_style_set_text_font_v2, lv_style_set_text_font);
 
-#elif defined (PLAT_ASR_1803s)
+#elif defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc)
 STATIC mp_obj_t mp_lv_style_set_text_font_v2(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
 {
        (void)mp_n_args;
@@ -27865,10 +28091,12 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_arc_opa_obj, 2, mp_lv_styl
     
 /* Reusing lv_style_set_bg_img_src for lv_style_set_arc_img_src */
 
-STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_arc_img_src_obj, 2, mp_lv_style_set_bg_img_src, lv_style_set_arc_img_src);
+//STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_arc_img_src_obj, 2, mp_lv_style_set_bg_img_src, lv_style_set_arc_img_src);
 
 #endif  
 
+#if LV_USE_FLEX != 0 
+
 /*
  * lvgl extension definition for:
  * void lv_style_set_flex_flow(lv_style_t *style, lv_flex_flow_t value)
@@ -27932,8 +28160,11 @@ STATIC mp_obj_t mp_lv_style_set_flex_grow(size_t mp_n_args, const mp_obj_t *mp_a
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_flex_grow_obj, 2, mp_lv_style_set_flex_grow, lv_style_set_flex_grow);
-    
 
+#endif //#if LV_USE_FLEX != 0     
+
+
+#if LV_USE_GRID != 0   
 /*
  * lvgl extension definition for:
  * void lv_style_set_grid_row_dsc_array(lv_style_t *style, const lv_coord_t value[])
@@ -28002,6 +28233,8 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_grid_cell_x_align_obj, 2,
 /* Reusing lv_style_set_pad_all for lv_style_set_grid_cell_y_align */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_style_set_grid_cell_y_align_obj, 2, mp_lv_style_set_pad_all, lv_style_set_grid_cell_y_align);
+
+#endif // #if LV_USE_GRID != 0 
     
 
 STATIC const mp_rom_map_elem_t mp_lv_style_t_locals_dict_table[] = {
@@ -28061,7 +28294,9 @@ STATIC const mp_rom_map_elem_t mp_lv_style_t_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_bg_grad_dir), MP_ROM_PTR(&mp_lv_style_set_bg_grad_dir_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_bg_main_stop), MP_ROM_PTR(&mp_lv_style_set_bg_main_stop_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_bg_grad_stop), MP_ROM_PTR(&mp_lv_style_set_bg_grad_stop_obj) },
+//#ifdef BOARD_EC600GCN_LA_CDD
     { MP_ROM_QSTR(MP_QSTR_set_bg_img_src), MP_ROM_PTR(&mp_lv_style_set_bg_img_src_obj) },
+//#endif
     { MP_ROM_QSTR(MP_QSTR_set_bg_img_opa), MP_ROM_PTR(&mp_lv_style_set_bg_img_opa_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_bg_img_recolor), MP_ROM_PTR(&mp_lv_style_set_bg_img_recolor_obj) },
     // { MP_ROM_QSTR(MP_QSTR_set_bg_img_recolor_filtered), MP_ROM_PTR(&mp_lv_style_set_bg_img_recolor_filtered_obj) },
@@ -28078,6 +28313,9 @@ STATIC const mp_rom_map_elem_t mp_lv_style_t_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_text_opa), MP_ROM_PTR(&mp_lv_style_set_text_opa_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_text_font), MP_ROM_PTR(&mp_lv_style_set_text_font_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_text_font_v2), MP_ROM_PTR(&mp_lv_style_set_text_font_v2_obj) },
+#ifdef CONFIG_LVGL_USE_FREETYPE
+    { MP_ROM_QSTR(MP_QSTR_set_freetype_text_font), MP_ROM_PTR(&mp_lv_style_set_freetype_text_font_obj) },
+#endif
     { MP_ROM_QSTR(MP_QSTR_set_text_letter_space), MP_ROM_PTR(&mp_lv_style_set_text_letter_space_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_text_line_space), MP_ROM_PTR(&mp_lv_style_set_text_line_space_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_text_decor), MP_ROM_PTR(&mp_lv_style_set_text_decor_obj) },
@@ -28111,13 +28349,16 @@ STATIC const mp_rom_map_elem_t mp_lv_style_t_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_arc_color), MP_ROM_PTR(&mp_lv_style_set_arc_color_obj) },
     // { MP_ROM_QSTR(MP_QSTR_set_arc_color_filtered), MP_ROM_PTR(&mp_lv_style_set_arc_color_filtered_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_arc_opa), MP_ROM_PTR(&mp_lv_style_set_arc_opa_obj) },
-    { MP_ROM_QSTR(MP_QSTR_set_arc_img_src), MP_ROM_PTR(&mp_lv_style_set_arc_img_src_obj) },
+    //{ MP_ROM_QSTR(MP_QSTR_set_arc_img_src), MP_ROM_PTR(&mp_lv_style_set_arc_img_src_obj) },
 #endif
+#if LV_USE_FLEX != 0
     { MP_ROM_QSTR(MP_QSTR_set_flex_flow), MP_ROM_PTR(&mp_lv_style_set_flex_flow_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_main_place), MP_ROM_PTR(&mp_lv_style_set_flex_main_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_cross_place), MP_ROM_PTR(&mp_lv_style_set_flex_cross_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_track_place), MP_ROM_PTR(&mp_lv_style_set_flex_track_place_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_flex_grow), MP_ROM_PTR(&mp_lv_style_set_flex_grow_obj) },
+#endif  
+#if LV_USE_GRID != 0
     { MP_ROM_QSTR(MP_QSTR_set_grid_row_dsc_array), MP_ROM_PTR(&mp_lv_style_set_grid_row_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_grid_column_dsc_array), MP_ROM_PTR(&mp_lv_style_set_grid_column_dsc_array_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_grid_row_align), MP_ROM_PTR(&mp_lv_style_set_grid_row_align_obj) },
@@ -28128,7 +28369,7 @@ STATIC const mp_rom_map_elem_t mp_lv_style_t_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_set_grid_cell_row_span), MP_ROM_PTR(&mp_lv_style_set_grid_cell_row_span_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_grid_cell_x_align), MP_ROM_PTR(&mp_lv_style_set_grid_cell_x_align_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_grid_cell_y_align), MP_ROM_PTR(&mp_lv_style_set_grid_cell_y_align_obj) },
-    
+#endif    
 };
 
 STATIC MP_DEFINE_CONST_DICT(mp_lv_style_t_locals_dict, mp_lv_style_t_locals_dict_table);
@@ -28905,6 +29146,14 @@ STATIC const mp_rom_map_elem_t mp_lv_span_t_locals_dict_table[] = {
 STATIC MP_DEFINE_CONST_DICT(mp_lv_span_t_locals_dict, mp_lv_span_t_locals_dict_table);
 #endif        
 
+#ifdef CONFIG_LVGL_IME_PINYIN
+STATIC const mp_rom_map_elem_t mp_lv_pinyin_dict_t_locals_dict_table[] = {
+    { MP_ROM_QSTR(MP_QSTR___SIZE__), MP_ROM_PTR(MP_ROM_INT(sizeof(lv_pinyin_dict_t))) },
+    
+};
+STATIC MP_DEFINE_CONST_DICT(mp_lv_pinyin_dict_t_locals_dict, mp_lv_pinyin_dict_t_locals_dict_table);
+#endif
+
 STATIC const mp_rom_map_elem_t mp__lv_mp_int_wrapper_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR___SIZE__), MP_ROM_PTR(MP_ROM_INT(sizeof(_lv_mp_int_wrapper))) },
     { MP_ROM_QSTR(MP_QSTR___cast__), MP_ROM_PTR(&mp_lv_cast_class_method) },
@@ -29836,7 +30085,7 @@ STATIC const mp_rom_map_elem_t mp_lv_fs_dir_t_locals_dict_table[] = {
 
 STATIC MP_DEFINE_CONST_DICT(mp_lv_fs_dir_t_locals_dict, mp_lv_fs_dir_t_locals_dict_table);
         
-
+#if LV_DRAW_COMPLEX != 0
 /*
  * lvgl extension definition for:
  * void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t *param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, lv_coord_t p2y, lv_draw_mask_line_side_t side)
@@ -30104,7 +30353,8 @@ STATIC const mp_rom_map_elem_t mp_lv_draw_mask_map_param_cfg_t_locals_dict_table
 };
 
 STATIC MP_DEFINE_CONST_DICT(mp_lv_draw_mask_map_param_cfg_t_locals_dict, mp_lv_draw_mask_map_param_cfg_t_locals_dict_table);
-        
+
+#endif //#if LV_DRAW_COMPLEX != 0
 
 /* 
  *
@@ -30361,7 +30611,7 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_dpx_obj, 1, mp_lv_pct, lv_dpx
        MP_THREAD_GIL_EXIT();
 
         while(1) { 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
         if(lv_handler.blockFlag == true && 0 == Helios_LPM_WakeLock_GetLockActiveNum())
 #else
         if(lv_handler.blockFlag == true)
@@ -30427,7 +30677,9 @@ STATIC mp_obj_t mp_lv_task_handler(size_t mp_n_args, const mp_obj_t *mp_args)
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_task_handler_obj, 0, mp_lv_task_handler, lv_task_handler);
-    
+
+
+#if LV_USE_GRID != 0   
 
 /*
  * lvgl extension definition for:
@@ -30446,7 +30698,7 @@ STATIC mp_obj_t mp_lv_grid_fr(size_t mp_n_args, const mp_obj_t *mp_args, void *l
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_grid_fr_obj, 1, mp_lv_grid_fr, lv_grid_fr);
     
-
+#endif //#if LV_USE_GRID != 0  
 /*
  * lvgl extension definition for:
  * inline static int lv_version_major(void)
@@ -30490,6 +30742,7 @@ STATIC mp_obj_t mp_lv_version_info(size_t mp_n_args, const mp_obj_t *mp_args, vo
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_version_info_obj, 0, mp_lv_version_info, lv_version_info);
     
+#if LV_USE_LOG != 0
 
 /*
  * Callback function lv_log_print_g_cb_t_print_cb
@@ -30526,7 +30779,8 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_log_register_print_cb_obj, 1,
 /* Reusing funcptr_lv_log_print_g_cb_t for lv_log */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_log_obj, 1, mp_funcptr_lv_log_print_g_cb_t, lv_log);
-    
+
+#endif //#if LV_USE_LOG != 0    
 
 /*
  * lvgl extension definition for:
@@ -30540,6 +30794,7 @@ STATIC mp_obj_t mp_lv_mem_init(size_t mp_n_args, const mp_obj_t *mp_args, void *
     ((void (*)(void))lv_func_ptr)();
     if(lv_func_ptr == lv_init) {
         QPY_LVGL_LOG("lv init,set flag is 1\n");
+               helios_lv_customer_img_handle();
         mp_lvgl_init_flag = 1;
     }
     return mp_const_none;
@@ -31299,7 +31554,7 @@ STATIC mp_obj_t mp_lv_tick_inc(size_t mp_n_args, const mp_obj_t *mp_args)
 
 STATIC mp_obj_t mp_lv_block(size_t mp_n_args, const mp_obj_t *mp_args) {
     uint32_t block_flag = (uint32_t)mp_obj_get_int(mp_args[0]);
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     QPY_LVGL_LOG("lv block set [%d], wakelock_activeNum[%d]\n", block_flag, Helios_LPM_WakeLock_GetLockActiveNum());
 #else
     QPY_LVGL_LOG("lv block set [%d]\n", block_flag);
@@ -31565,6 +31820,7 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_fs_up_obj, 1, mp_lv_fs_get_le
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_fs_get_last_obj, 1, mp_lv_fs_get_ext, lv_fs_get_last);
     
+#if LV_DRAW_COMPLEX != 0
 
 /*
  * lvgl extension definition for:
@@ -31644,7 +31900,8 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_draw_mask_remove_custom_obj,
 /* Reusing lv_timer_get_idle for lv_draw_mask_get_cnt */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_draw_mask_get_cnt_obj, 0, mp_lv_timer_get_idle, lv_draw_mask_get_cnt);
-    
+
+#endif //#if LV_DRAW_COMPLEX != 0
 
 /*
  * lvgl extension definition for:
@@ -32176,15 +32433,20 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_font_load_obj, 1, mp_lv_font_
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_extra_init_obj, 0, mp_lv_mem_init, lv_extra_init);
     
+#if LV_USE_FLEX != 0 
+
 /* Reusing lv_mem_init for lv_flex_init */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_flex_init_obj, 0, mp_lv_mem_init, lv_flex_init);
+#endif
+
+#if LV_USE_GRID != 0   
     
 /* Reusing lv_mem_init for lv_grid_init */
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_grid_init_obj, 0, mp_lv_mem_init, lv_grid_init);
     
-
+#endif
 /*
  * lvgl extension definition for:
  * lv_theme_t *lv_theme_default_init(lv_disp_t *disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t *font)
@@ -32224,6 +32486,7 @@ STATIC mp_obj_t mp_lv_theme_default_is_inited(size_t mp_n_args, const mp_obj_t *
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_theme_default_is_inited_obj, 0, mp_lv_theme_default_is_inited, lv_theme_default_is_inited);
     
+#if LV_USE_THEME_MONO != 0
 
 /*
  * lvgl extension definition for:
@@ -32243,6 +32506,7 @@ STATIC mp_obj_t mp_lv_theme_mono_init(size_t mp_n_args, const mp_obj_t *mp_args,
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_theme_mono_init_obj, 3, mp_lv_theme_mono_init, lv_theme_mono_init);
+#endif //#if LV_USE_THEME_MONO != 0
     
 /* Reusing lv_disp_get_theme for lv_theme_basic_init */
 
@@ -32253,7 +32517,9 @@ STATIC MP_DEFINE_CONST_LV_FUN_OBJ_STATIC_VAR(mp_lv_theme_basic_init_obj, 1, mp_l
  * lvgl extension definition for:
  * lv_img_dsc_t *lv_snapshot_take(lv_obj_t *obj, lv_img_cf_t cf)
  */
- 
+
+#if LV_USE_SNAPSHOT != 0
+
 STATIC mp_obj_t mp_lv_snapshot_take(size_t mp_n_args, const mp_obj_t *mp_args, void *lv_func_ptr)
 {
        (void)mp_n_args;
@@ -32311,7 +32577,7 @@ STATIC mp_obj_t mp_lv_snapshot_take_to_buf(size_t mp_n_args, const mp_obj_t *mp_
  
 
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_snapshot_take_to_buf_obj, 5, mp_lv_snapshot_take_to_buf, lv_snapshot_take_to_buf);
-    
+#endif //#if LV_USE_SNAPSHOT != 0   
 
 /*
  * Callback function lv_color_filter_dsc_t_filter_cb
@@ -32852,7 +33118,7 @@ STATIC lv_fs_res_t lv_fs_drv_t_dir_close_cb_callback(struct _lv_fs_drv_t * arg0,
  
  STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(qpy_module_lvgl_deinit_obj, 0, mp_lvgl_deinit, qpy_lvgl_deinit);
 
-#if CONFIG_LVGL_PNG_DECODE
+#if LV_USE_PNG
 extern void lv_png_init(void); 
  STATIC mp_obj_t mp_lv_png_init(size_t mp_n_args, const mp_obj_t *mp_args)
 {
@@ -32864,7 +33130,7 @@ extern void lv_png_init(void);
 STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_lv_png_init_obj, 0, mp_lv_png_init, lv_png_init);
 #endif
 
-#if CONFIG_LVGL_JPG_DECODE
+#if LV_USE_SJPG
 extern void lv_split_jpeg_init(void); 
  STATIC mp_obj_t mp_lv_sjpeg_init(size_t mp_n_args, const mp_obj_t *mp_args)
 {
@@ -33019,14 +33285,22 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_LINE
     { MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&mp_lv_line_type.mp_obj_type) },
 #endif
+#if LV_USE_TABLE != 0
     { MP_ROM_QSTR(MP_QSTR_table), MP_ROM_PTR(&mp_lv_table_type.mp_obj_type) },
+#endif   
     { MP_ROM_QSTR(MP_QSTR_checkbox), MP_ROM_PTR(&mp_lv_checkbox_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_bar), MP_ROM_PTR(&mp_lv_bar_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_slider), MP_ROM_PTR(&mp_lv_slider_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_btnmatrix), MP_ROM_PTR(&mp_lv_btnmatrix_type.mp_obj_type) },
+#if LV_USE_DROPDOWN != 0    
     { MP_ROM_QSTR(MP_QSTR_dropdown), MP_ROM_PTR(&mp_lv_dropdown_type.mp_obj_type) },
+#endif    
+#if LV_USE_ROLLER != 0    
     { MP_ROM_QSTR(MP_QSTR_roller), MP_ROM_PTR(&mp_lv_roller_type.mp_obj_type) },
+#endif
+#if LV_USE_TEXTAREA != 0   
     { MP_ROM_QSTR(MP_QSTR_textarea), MP_ROM_PTR(&mp_lv_textarea_type.mp_obj_type) },
+#endif    
 #if LV_USE_CANVAS != 0
     { MP_ROM_QSTR(MP_QSTR_canvas), MP_ROM_PTR(&mp_lv_canvas_type.mp_obj_type) },
 #endif
@@ -33069,6 +33343,9 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_WIN
     { MP_ROM_QSTR(MP_QSTR_win), MP_ROM_PTR(&mp_lv_win_type.mp_obj_type) },
 #endif
+#ifdef CONFIG_LVGL_IME_PINYIN
+       { MP_ROM_QSTR(MP_QSTR_ime_pinyin), MP_ROM_PTR(&mp_lv_ime_pinyin_type.mp_obj_type) },
+#endif
 #if LV_USE_COLORWHEEL
     { MP_ROM_QSTR(MP_QSTR_colorwheel), MP_ROM_PTR(&mp_lv_colorwheel_type.mp_obj_type) },
 #endif
@@ -33104,13 +33381,17 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_scr_load), MP_ROM_PTR(&mp_lv_scr_load_obj) },
     { MP_ROM_QSTR(MP_QSTR_dpx), MP_ROM_PTR(&mp_lv_dpx_obj) },
     { MP_ROM_QSTR(MP_QSTR_task_handler), MP_ROM_PTR(&mp_lv_task_handler_obj) },
+#if LV_USE_GRID != 0    
     { MP_ROM_QSTR(MP_QSTR_grid_fr), MP_ROM_PTR(&mp_lv_grid_fr_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_version_major), MP_ROM_PTR(&mp_lv_version_major_obj) },
     { MP_ROM_QSTR(MP_QSTR_version_minor), MP_ROM_PTR(&mp_lv_version_minor_obj) },
     { MP_ROM_QSTR(MP_QSTR_version_patch), MP_ROM_PTR(&mp_lv_version_patch_obj) },
     { MP_ROM_QSTR(MP_QSTR_version_info), MP_ROM_PTR(&mp_lv_version_info_obj) },
+#if LV_USE_LOG != 0    
     { MP_ROM_QSTR(MP_QSTR_log_register_print_cb), MP_ROM_PTR(&mp_lv_log_register_print_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_log), MP_ROM_PTR(&mp_lv_log_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_mem_init), MP_ROM_PTR(&mp_lv_mem_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_mem_deinit), MP_ROM_PTR(&mp_lv_mem_deinit_obj) },
     { MP_ROM_QSTR(MP_QSTR_mem_alloc), MP_ROM_PTR(&mp_lv_mem_alloc_obj) },
@@ -33174,11 +33455,13 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_fs_get_ext), MP_ROM_PTR(&mp_lv_fs_get_ext_obj) },
     { MP_ROM_QSTR(MP_QSTR_fs_up), MP_ROM_PTR(&mp_lv_fs_up_obj) },
     { MP_ROM_QSTR(MP_QSTR_fs_get_last), MP_ROM_PTR(&mp_lv_fs_get_last_obj) },
+#if LV_DRAW_COMPLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_draw_mask_add), MP_ROM_PTR(&mp_lv_draw_mask_add_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_apply), MP_ROM_PTR(&mp_lv_draw_mask_apply_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_remove_id), MP_ROM_PTR(&mp_lv_draw_mask_remove_id_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_remove_custom), MP_ROM_PTR(&mp_lv_draw_mask_remove_custom_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_get_cnt), MP_ROM_PTR(&mp_lv_draw_mask_get_cnt_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_draw_rect), MP_ROM_PTR(&mp_lv_draw_rect_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_label), MP_ROM_PTR(&mp_lv_draw_label_obj) },
     { MP_ROM_QSTR(MP_QSTR_draw_letter), MP_ROM_PTR(&mp_lv_draw_letter_obj) },
@@ -33198,10 +33481,10 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_group_focus_obj), MP_ROM_PTR(&mp_lv_group_focus_obj_obj) },
     { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mp_lv_init_obj) },
     //{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mp_lv_deinit_obj) },
-#if CONFIG_LVGL_PNG_DECODE
+#if LV_USE_PNG
        { MP_ROM_QSTR(MP_QSTR_png_init), MP_ROM_PTR(&mp_lv_png_init_obj) },
 #endif
-#if CONFIG_LVGL_JPG_DECODE
+#if LV_USE_SJPG
     { MP_ROM_QSTR(MP_QSTR_sjpeg_init), MP_ROM_PTR(&mp_lv_sjpeg_init_obj) },
 #endif
     { MP_ROM_QSTR(MP_QSTR_indev_read_timer_cb), MP_ROM_PTR(&mp_lv_indev_read_timer_cb_obj) },
@@ -33221,16 +33504,24 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_scr_load_anim), MP_ROM_PTR(&mp_lv_scr_load_anim_obj) },
     { MP_ROM_QSTR(MP_QSTR_font_load), MP_ROM_PTR(&mp_lv_font_load_obj) },
     { MP_ROM_QSTR(MP_QSTR_extra_init), MP_ROM_PTR(&mp_lv_extra_init_obj) },
+#if LV_USE_FLEX != 0     
     { MP_ROM_QSTR(MP_QSTR_flex_init), MP_ROM_PTR(&mp_lv_flex_init_obj) },
+#endif    
+#if LV_USE_GRID != 0
     { MP_ROM_QSTR(MP_QSTR_grid_init), MP_ROM_PTR(&mp_lv_grid_init_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_theme_default_init), MP_ROM_PTR(&mp_lv_theme_default_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_theme_default_is_inited), MP_ROM_PTR(&mp_lv_theme_default_is_inited_obj) },
+#if LV_USE_THEME_MONO != 0
     { MP_ROM_QSTR(MP_QSTR_theme_mono_init), MP_ROM_PTR(&mp_lv_theme_mono_init_obj) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_theme_basic_init), MP_ROM_PTR(&mp_lv_theme_basic_init_obj) },
+#if LV_USE_SNAPSHOT != 0    
     { MP_ROM_QSTR(MP_QSTR_snapshot_take), MP_ROM_PTR(&mp_lv_snapshot_take_obj) },
     { MP_ROM_QSTR(MP_QSTR_snapshot_free), MP_ROM_PTR(&mp_lv_snapshot_free_obj) },
     { MP_ROM_QSTR(MP_QSTR_snapshot_buf_size_needed), MP_ROM_PTR(&mp_lv_snapshot_buf_size_needed_obj) },
     { MP_ROM_QSTR(MP_QSTR_snapshot_take_to_buf), MP_ROM_PTR(&mp_lv_snapshot_take_to_buf_obj) },
+#endif    
     
     { MP_ROM_QSTR(MP_QSTR_DPI), MP_ROM_PTR(&mp_lv_ENUM_LV_DPI_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_LOG_LEVEL), MP_ROM_PTR(&mp_lv_ENUM_LV_LOG_LEVEL_type.mp_obj_type) },
@@ -33257,33 +33548,45 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_SCROLL_SNAP), MP_ROM_PTR(&mp_lv_LV_SCROLL_SNAP_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_FS_RES), MP_ROM_PTR(&mp_lv_LV_FS_RES_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_FS_MODE), MP_ROM_PTR(&mp_lv_LV_FS_MODE_type.mp_obj_type) },
+#if LV_DRAW_COMPLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_DRAW_MASK_RES), MP_ROM_PTR(&mp_lv_LV_DRAW_MASK_RES_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_DRAW_MASK_TYPE), MP_ROM_PTR(&mp_lv_LV_DRAW_MASK_TYPE_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_DRAW_MASK_LINE_SIDE), MP_ROM_PTR(&mp_lv_LV_DRAW_MASK_LINE_SIDE_type.mp_obj_type) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_RADIUS), MP_ROM_PTR(&mp_lv_ENUM_LV_RADIUS_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_KEY), MP_ROM_PTR(&mp_lv_LV_KEY_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_FONT_FMT_TXT_CMAP), MP_ROM_PTR(&mp_lv_LV_FONT_FMT_TXT_CMAP_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_LABEL_DOT), MP_ROM_PTR(&mp_lv_ENUM_LV_LABEL_DOT_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_LABEL_POS), MP_ROM_PTR(&mp_lv_ENUM_LV_LABEL_POS_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_LABEL_TEXT_SELECTION), MP_ROM_PTR(&mp_lv_ENUM_LV_LABEL_TEXT_SELECTION_type.mp_obj_type) },
+#if LV_USE_TABLE != 0   
     { MP_ROM_QSTR(MP_QSTR_TABLE_CELL), MP_ROM_PTR(&mp_lv_ENUM_LV_TABLE_CELL_type.mp_obj_type) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_BTNMATRIX_BTN), MP_ROM_PTR(&mp_lv_ENUM_LV_BTNMATRIX_BTN_type.mp_obj_type) },
+#if LV_USE_DROPDOWN != 0    
     { MP_ROM_QSTR(MP_QSTR_DROPDOWN_POS), MP_ROM_PTR(&mp_lv_ENUM_LV_DROPDOWN_POS_type.mp_obj_type) },
+#endif    
+#if LV_USE_TEXTAREA != 0    
     { MP_ROM_QSTR(MP_QSTR_TEXTAREA_CURSOR), MP_ROM_PTR(&mp_lv_ENUM_LV_TEXTAREA_CURSOR_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_PART_TEXTAREA), MP_ROM_PTR(&mp_lv_LV_PART_TEXTAREA_type.mp_obj_type) },
+#endif   
 #if LV_USE_ANIMIMG
     { MP_ROM_QSTR(MP_QSTR_ANIM_IMG_PART), MP_ROM_PTR(&mp_lv_LV_ANIM_IMG_PART_type.mp_obj_type) },
 #endif
 #if LV_USE_CHART
     { MP_ROM_QSTR(MP_QSTR_CHART_POINT), MP_ROM_PTR(&mp_lv_ENUM_LV_CHART_POINT_type.mp_obj_type) },
 #endif
+#if LV_USE_FLEX != 0
     { MP_ROM_QSTR(MP_QSTR_OBJ_FLAG_FLEX_IN_NEW), MP_ROM_PTR(&mp_lv_ENUM_LV_OBJ_FLAG_FLEX_IN_NEW_type.mp_obj_type) },
+#endif    
 #if LV_USE_SPAN
     { MP_ROM_QSTR(MP_QSTR_SPAN_OVERFLOW), MP_ROM_PTR(&mp_lv_LV_SPAN_OVERFLOW_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_SPAN_MODE), MP_ROM_PTR(&mp_lv_LV_SPAN_MODE_type.mp_obj_type) },
 #endif
+#if LV_USE_GRID != 0   
     { MP_ROM_QSTR(MP_QSTR_GRID), MP_ROM_PTR(&mp_lv_ENUM_LV_GRID_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_GRID_TEMPLATE), MP_ROM_PTR(&mp_lv_ENUM_LV_GRID_TEMPLATE_type.mp_obj_type) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_ANIM), MP_ROM_PTR(&mp_lv_LV_ANIM_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_PALETTE), MP_ROM_PTR(&mp_lv_LV_PALETTE_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_DISP_ROT), MP_ROM_PTR(&mp_lv_LV_DISP_ROT_type.mp_obj_type) },
@@ -33296,9 +33599,13 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_GROUP_REFOCUS_POLICY), MP_ROM_PTR(&mp_lv_LV_GROUP_REFOCUS_POLICY_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_SCR_LOAD_ANIM), MP_ROM_PTR(&mp_lv_LV_SCR_LOAD_ANIM_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_FONT_FMT_TXT), MP_ROM_PTR(&mp_lv_LV_FONT_FMT_TXT_type.mp_obj_type) },
+#if LV_USE_FLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_FLEX_ALIGN), MP_ROM_PTR(&mp_lv_LV_FLEX_ALIGN_type.mp_obj_type) },
     { MP_ROM_QSTR(MP_QSTR_FLEX_FLOW), MP_ROM_PTR(&mp_lv_LV_FLEX_FLOW_type.mp_obj_type) },
+#endif    
+#if LV_USE_GRID != 0
     { MP_ROM_QSTR(MP_QSTR_GRID_ALIGN), MP_ROM_PTR(&mp_lv_LV_GRID_ALIGN_type.mp_obj_type) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_SYMBOL), MP_ROM_PTR(&mp_lv_LV_SYMBOL_type.mp_obj_type) },
     
     { MP_ROM_QSTR(MP_QSTR_C_Pointer), MP_ROM_PTR(&mp_C_Pointer_type) },
@@ -33353,6 +33660,9 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_color_hsv_t), MP_ROM_PTR(&mp_lv_color_hsv_t_type) },
 #if LV_USE_SPAN
     { MP_ROM_QSTR(MP_QSTR_span_t), MP_ROM_PTR(&mp_lv_span_t_type) },
+#endif
+#ifdef CONFIG_LVGL_IME_PINYIN
+       { MP_ROM_QSTR(MP_QSTR_pinyin_dict_t), MP_ROM_PTR(&mp_lv_pinyin_dict_t_type) },
 #endif
     { MP_ROM_QSTR(MP_QSTR__lv_mp_int_wrapper), MP_ROM_PTR(&mp__lv_mp_int_wrapper_type) },
     { MP_ROM_QSTR(MP_QSTR_mem_monitor_t), MP_ROM_PTR(&mp_lv_mem_monitor_t_type) },
@@ -33369,6 +33679,7 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_fs_drv_t), MP_ROM_PTR(&mp_lv_fs_drv_t_type) },
     { MP_ROM_QSTR(MP_QSTR_fs_file_t), MP_ROM_PTR(&mp_lv_fs_file_t_type) },
     { MP_ROM_QSTR(MP_QSTR_fs_dir_t), MP_ROM_PTR(&mp_lv_fs_dir_t_type) },
+#if LV_DRAW_COMPLEX != 0    
     { MP_ROM_QSTR(MP_QSTR_draw_mask_line_param_t), MP_ROM_PTR(&mp_lv_draw_mask_line_param_t_type) },
     { MP_ROM_QSTR(MP_QSTR__lv_draw_mask_common_dsc_t), MP_ROM_PTR(&mp__lv_draw_mask_common_dsc_t_type) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_line_param_cfg_t), MP_ROM_PTR(&mp_lv_draw_mask_line_param_cfg_t_type) },
@@ -33381,6 +33692,7 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_draw_mask_fade_param_cfg_t), MP_ROM_PTR(&mp_lv_draw_mask_fade_param_cfg_t_type) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_map_param_t), MP_ROM_PTR(&mp_lv_draw_mask_map_param_t_type) },
     { MP_ROM_QSTR(MP_QSTR_draw_mask_map_param_cfg_t), MP_ROM_PTR(&mp_lv_draw_mask_map_param_cfg_t_type) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_hit_test_info_t), MP_ROM_PTR(&mp_lv_hit_test_info_t_type) },
     { MP_ROM_QSTR(MP_QSTR_draw_label_hint_t), MP_ROM_PTR(&mp_lv_draw_label_hint_t_type) },
     
@@ -33543,15 +33855,23 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_LINE
     { MP_ROM_QSTR(MP_QSTR_line_class), MP_ROM_PTR(&mp_lv_line_class) },
 #endif
+#if LV_USE_TABLE != 0
     { MP_ROM_QSTR(MP_QSTR_table_class), MP_ROM_PTR(&mp_lv_table_class) },
+#endif    
     { MP_ROM_QSTR(MP_QSTR_checkbox_class), MP_ROM_PTR(&mp_lv_checkbox_class) },
     { MP_ROM_QSTR(MP_QSTR_bar_class), MP_ROM_PTR(&mp_lv_bar_class) },
     { MP_ROM_QSTR(MP_QSTR_slider_class), MP_ROM_PTR(&mp_lv_slider_class) },
     { MP_ROM_QSTR(MP_QSTR_btnmatrix_class), MP_ROM_PTR(&mp_lv_btnmatrix_class) },
+#if LV_USE_DROPDOWN != 0    
     { MP_ROM_QSTR(MP_QSTR_dropdown_class), MP_ROM_PTR(&mp_lv_dropdown_class) },
     { MP_ROM_QSTR(MP_QSTR_dropdownlist_class), MP_ROM_PTR(&mp_lv_dropdownlist_class) },
+#endif    
+#if LV_USE_ROLLER != 0    
     { MP_ROM_QSTR(MP_QSTR_roller_class), MP_ROM_PTR(&mp_lv_roller_class) },
+#endif    
+#if LV_USE_TEXTAREA != 0    
     { MP_ROM_QSTR(MP_QSTR_textarea_class), MP_ROM_PTR(&mp_lv_textarea_class) },
+#endif    
 #if LV_USE_CANVAS != 0
     { MP_ROM_QSTR(MP_QSTR_canvas_class), MP_ROM_PTR(&mp_lv_canvas_class) },
 #endif
@@ -33570,12 +33890,14 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_KEYBOARD
     { MP_ROM_QSTR(MP_QSTR_keyboard_class), MP_ROM_PTR(&mp_lv_keyboard_class) },
 #endif
+#if LV_USE_FLEX != 0 
     { MP_ROM_QSTR(MP_QSTR_LAYOUT_FLEX), MP_ROM_PTR(&mp_LV_LAYOUT_FLEX) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_FLOW), MP_ROM_PTR(&mp_LV_STYLE_FLEX_FLOW) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_MAIN_PLACE), MP_ROM_PTR(&mp_LV_STYLE_FLEX_MAIN_PLACE) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_CROSS_PLACE), MP_ROM_PTR(&mp_LV_STYLE_FLEX_CROSS_PLACE) },
-    { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_TRACK_PLACE), MP_ROM_PTR(&mp_LV_STYLE_FLEX_TRACK_PLACE) },
+    { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_TRACK_PLACE), MP_ROM_PTR(&mp_LV_STYLE_FLEX_TRACK_PLACE) }, 
     { MP_ROM_QSTR(MP_QSTR_STYLE_FLEX_GROW), MP_ROM_PTR(&mp_LV_STYLE_FLEX_GROW) },
+#endif    
 #if LV_USE_LIST
     { MP_ROM_QSTR(MP_QSTR_list_class), MP_ROM_PTR(&mp_lv_list_class) },
     { MP_ROM_QSTR(MP_QSTR_list_text_class), MP_ROM_PTR(&mp_lv_list_text_class) },
@@ -33603,6 +33925,9 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_WIN
     { MP_ROM_QSTR(MP_QSTR_win_class), MP_ROM_PTR(&mp_lv_win_class) },
 #endif
+#ifdef CONFIG_LVGL_IME_PINYIN
+       { MP_ROM_QSTR(MP_QSTR_ime_pinyin_class), MP_ROM_PTR(&mp_lv_ime_pinyin_class) },
+#endif
 #if LV_USE_COLORWHEEL
     { MP_ROM_QSTR(MP_QSTR_colorwheel_class), MP_ROM_PTR(&mp_lv_colorwheel_class) },
 #endif
@@ -33615,7 +33940,8 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
 #if LV_USE_SPAN
     { MP_ROM_QSTR(MP_QSTR_spangroup_class), MP_ROM_PTR(&mp_lv_spangroup_class) },
 #endif
-    { MP_ROM_QSTR(MP_QSTR_LAYOUT_GRID), MP_ROM_PTR(&mp_LV_LAYOUT_GRID) },
+#if LV_USE_GRID != 0
+    { MP_ROM_QSTR(MP_QSTR_LAYOUT_GRID), MP_ROM_PTR(&mp_LV_LAYOUT_GRID) },  
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_COLUMN_DSC_ARRAY), MP_ROM_PTR(&mp_LV_STYLE_GRID_COLUMN_DSC_ARRAY) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_COLUMN_ALIGN), MP_ROM_PTR(&mp_LV_STYLE_GRID_COLUMN_ALIGN) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_ROW_DSC_ARRAY), MP_ROM_PTR(&mp_LV_STYLE_GRID_ROW_DSC_ARRAY) },
@@ -33626,6 +33952,7 @@ STATIC const mp_rom_map_elem_t lvgl_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_CELL_ROW_POS), MP_ROM_PTR(&mp_LV_STYLE_GRID_CELL_ROW_POS) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_CELL_ROW_SPAN), MP_ROM_PTR(&mp_LV_STYLE_GRID_CELL_ROW_SPAN) },
     { MP_ROM_QSTR(MP_QSTR_STYLE_GRID_CELL_Y_ALIGN), MP_ROM_PTR(&mp_LV_STYLE_GRID_CELL_Y_ALIGN) },
+#endif    
     //{ MP_ROM_QSTR(MP_QSTR_gif_src), MP_ROM_PTR(&mp_lv_gif_set_src_obj) },
 #if LV_USE_QRCODE
     { MP_ROM_QSTR(MP_QSTR_qrcode_class), MP_ROM_PTR(&mp_lv_qrcode_class) },
@@ -33658,14 +33985,24 @@ STATIC const mp_lv_obj_type_t *mp_lv_obj_types[] = {
 #if LV_USE_LINE
     &mp_lv_line_type,
 #endif
+#if LV_USE_TABLE != 0
     &mp_lv_table_type,
+#endif
     &mp_lv_checkbox_type,
     &mp_lv_bar_type,
     &mp_lv_slider_type,
+#if LV_USE_BTNMATRIX != 0    
     &mp_lv_btnmatrix_type,
+#endif  
+#if LV_USE_DROPDOWN != 0
     &mp_lv_dropdown_type,
+#endif    
+#if LV_USE_ROLLER != 0
     &mp_lv_roller_type,
+#endif    
+#if LV_USE_TEXTAREA != 0
     &mp_lv_textarea_type,
+#endif
 #if LV_USE_CANVAS != 0
     &mp_lv_canvas_type,
 #endif
@@ -33725,6 +34062,9 @@ STATIC const mp_lv_obj_type_t *mp_lv_obj_types[] = {
 #endif
 #if LV_USE_GIF
        &mp_lv_gif_type,
+#endif
+#if LV_USE_IME_PINYIN
+       &mp_lv_ime_pinyin_type,
 #endif
     NULL
 };
index d9adb1f..d05cf5e 100644 (file)
@@ -41,7 +41,18 @@ WHEN         WHO                     WHAT,WHERE,WHY
 #include "stream.h"
 #include "mperrno.h"
 
+#include "callbackdeal.h"
 #if MICROPY_QPY_MODULE_LWM2M
+#define lwm2m_log(msg, ...)      custom_log(pylwm2m, msg, ##__VA_ARGS__)
+extern void mp_hal_stdout_tx_str(const char *str);
+
+char sbuf_lwm2m[513];
+#define LWM2M_LOG(msg, ...) \
+{\
+    memset(sbuf_lwm2m,0x00,512+1); \
+    snprintf(sbuf_lwm2m,512,"[%s,%d]" msg "\n",__FUNCTION__,__LINE__,##__VA_ARGS__);\
+    mp_hal_stdout_tx_str(sbuf_lwm2m);\
+}
 
 #include "modlwm2m_parase.c"
 
@@ -72,7 +83,23 @@ STATIC mp_obj_t lwm2m_deinit(mp_obj_t args)
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwm2m_deinit_obj, lwm2m_deinit);
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwm2m__del__obj, lwm2m_deinit);
+
+STATIC mp_obj_t lwm2m_delete(mp_obj_t args)
+{
+       if ( lwm2m_obj != NULL )
+       {
+               lwm2m_obj = NULL;
+       }
+       if ( lwm2m_callback != NULL ){
+               lwm2m_callback = NULL;
+       }
+       Helios_Lwm2m_Error_Code ret = helios_lwm2m_free();
+       if ( ret != Helios_Lwm2m_ErrorCode_Success ){
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwm2m__del__obj, lwm2m_delete);
 
 STATIC mp_obj_t lwm2m_init(mp_obj_t args){
        MP_THREAD_GIL_EXIT();
@@ -110,15 +137,22 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwm2m_unregister_obj, lwm2m_unregister);
 /**************************************************
  * function name:lwm2m_config_type_is_notsupport
  * description  : juge if support config this 
- * type.
+ * type.this function shuld defined helios sdk
  * param        : config type
  * return       :
  *  0 - notsupport
  *  1 - support
  * ************************************************/
 STATIC int lwm2m_config_type_is_support(Helios_Config_Type config_type){
-#if !defined(BOARD_BG95M8)
-       #define SUPPORT_NUMS    11
+
+       #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+       #define QPY_Lwm2m_Config_Case_epname Helios_Lwm2m_Config_Case_epname,
+       #else 
+       #define QPY_Lwm2m_Config_Case_epname 
+       #endif
+
+#if !(defined(BOARD_BG95M3) || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M6) || defined(BOARD_BG95M8_SANX))
+       #define SUPPORT_NUMS    12
        int support_list[SUPPORT_NUMS] = { \
         Helios_Lwm2m_Config_Case_apnretry,\
         Helios_Lwm2m_Config_Case_appaccount,\
@@ -130,16 +164,18 @@ STATIC int lwm2m_config_type_is_support(Helios_Config_Type config_type){
                Helios_Lwm2m_Config_Case_server,\
                Helios_Lwm2m_Config_Case_startup,\
                Helios_Lwm2m_Config_Case_urc,\
-               Helios_Lwm2m_Config_Case_fota\
+               QPY_Lwm2m_Config_Case_epname \
+               Helios_Lwm2m_Config_Case_fota 
                };
 #else
-       #define SUPPORT_NUMS    5
+       #define SUPPORT_NUMS    6
        int support_list[SUPPORT_NUMS] = { \
         Helios_Lwm2m_Config_Case_epnamemode,\
         Helios_Lwm2m_Config_Case_reset,\
         Helios_Lwm2m_Config_Case_security,\
         Helios_Lwm2m_Config_Case_server,\
-        Helios_Lwm2m_Config_Case_startup\
+               QPY_Lwm2m_Config_Case_epname  \
+        Helios_Lwm2m_Config_Case_startup
                };
 #endif
        int support_list_index = 0;
@@ -223,6 +259,73 @@ STATIC mp_obj_t lwm2m_get_stat(mp_obj_t self_in){
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(lwm2m_stat_obj, lwm2m_get_stat);
 
+#if MICROPY_QPY_MODULE_LWM2M_ACK
+STATIC mp_obj_t lwm2m_ack_message(mp_obj_t self_in,mp_obj_t args,mp_obj_t type){
+       if ( !mp_obj_is_int(args) || !mp_obj_is_int(type) ){
+               return mp_obj_new_int(-1);
+       }
+       uint32_t messageid      = (uint32_t)mp_obj_get_int(args);
+       uint32_t type_in        = (uint32_t)mp_obj_get_int(type);
+       MP_THREAD_GIL_EXIT();
+       Helios_Lwm2m_Error_Code ret = helios_lwm2m_ack_messageid(messageid,type_in);
+       MP_THREAD_GIL_ENTER();
+       if ( ret != Helios_Lwm2m_ErrorCode_Success ){
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(lwm2m_ack_message_obj, lwm2m_ack_message);
+
+
+STATIC mp_obj_t lwm2m_enable_ack_support(mp_obj_t self_in,mp_obj_t is_enable){
+       if ( !mp_obj_is_int(is_enable) ){
+               return mp_obj_new_int(-1);
+       }
+       uint32_t enable         = (uint32_t)mp_obj_get_int(is_enable);
+       MP_THREAD_GIL_EXIT();
+       Helios_Lwm2m_Error_Code ret = helios_lwm2m_enable_ack_support(enable);
+       MP_THREAD_GIL_ENTER();
+       if ( ret != Helios_Lwm2m_ErrorCode_Success ){
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(lwm2m_enable_ack_support_obj, lwm2m_enable_ack_support);
+#endif
+
+#if MICROPY_QPY_MODULE_LWM2M_SUPPORT_CHANGE
+STATIC mp_obj_t lwm2m_change_value(mp_obj_t self_in,mp_obj_t args,mp_obj_t value_in){
+       if ( !mp_obj_is_str(args) || !mp_obj_is_str(value_in) ){
+               return mp_obj_new_int(-3);
+       }
+       const char *uri = mp_obj_str_get_str(args);
+       const char *value = mp_obj_str_get_str(value_in);
+       if ( uri == NULL  || value == NULL ){
+               return mp_obj_new_int(-2);
+       }
+       Helios_Lwm2m_Error_Code ret = Helios_lwm2m_change_value(uri,strlen(uri),value,strlen(value));
+       if ( ret != Helios_Lwm2m_ErrorCode_Success ){
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(lwm2m_change_value_obj, lwm2m_change_value);
+#endif
+
+void qpy_lwm2m_msg_proc(void *param){
+       Helios_Lwm2m_Event * event = (Helios_Lwm2m_Event *)param;
+       mp_obj_t decode_cb[3] = {
+               mp_obj_new_int(((mp_int_t)event->event_id)),            
+               mp_obj_new_int((mp_int_t)event->event_code),            
+        mp_obj_new_str((char *)event->param,strlen((char *)event->param)==0?1:strlen((char *)event->param)),
+    };
+       if ( event->param != NULL ){
+               free(event->param);
+               event->param = NULL;
+       }
+       mp_sched_schedule_ex(lwm2m_callback, MP_OBJ_FROM_PTR(mp_obj_new_list(3, decode_cb)));
+}
+
 STATIC void helios_lwm2m_callback_to_python(Helios_Lwm2m_Event event)
 {
     if( lwm2m_callback == NULL) {
@@ -230,12 +333,28 @@ STATIC void helios_lwm2m_callback_to_python(Helios_Lwm2m_Event event)
        }
        MP_THREAD_GIL_ENTER();
        GC_STACKTOP_SET();
-       mp_obj_t decode_cb[3] = {
-               mp_obj_new_int(((mp_int_t)event.event_id)),             
-               mp_obj_new_int((mp_int_t)event.event_code),             
-        mp_obj_new_str((char *)event.param,strlen((char *)event.param)),
-    };
-    mp_sched_schedule_ex(lwm2m_callback, MP_OBJ_FROM_PTR(mp_obj_new_list(3, decode_cb)));
+       Helios_Lwm2m_Event  * param = (Helios_Lwm2m_Event *)malloc(sizeof(Helios_Lwm2m_Event));
+       if ( param == NULL ){
+               lwm2m_log("NULL");
+               GC_STACKTOP_CLEAR();
+               MP_THREAD_GIL_EXIT();
+               return;
+       }
+       param->event_id = event.event_id;
+       param->event_code = event.event_code;
+       if (  event.param != NULL ){
+               param->param = malloc(strlen((char *)event.param)+1);
+               if ( param->param == NULL ){
+                       lwm2m_log("NULL");
+                       GC_STACKTOP_CLEAR();
+                       MP_THREAD_GIL_EXIT();
+                       return ;
+               }
+               memset(param->param,0x00,strlen((char *)event.param)+1);
+               memcpy(param->param,event.param,strlen((char *)event.param));
+       }
+    
+       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_LWM2M, param);
     GC_STACKTOP_CLEAR();
     MP_THREAD_GIL_EXIT();
        return ;
@@ -267,6 +386,13 @@ STATIC const mp_rom_map_elem_t lwm2m_module_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_update), MP_ROM_PTR(&lwm2m_update_obj) },
     { MP_ROM_QSTR(MP_QSTR_stat), MP_ROM_PTR(&lwm2m_stat_obj) },
 
+       #if MICROPY_QPY_MODULE_LWM2M_ACK
+       { MP_ROM_QSTR(MP_QSTR_ack_message), MP_ROM_PTR(&lwm2m_ack_message_obj) },
+       { MP_ROM_QSTR(MP_QSTR_enable_ack_support), MP_ROM_PTR(&lwm2m_enable_ack_support_obj) },
+       #endif
+       #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_CHANGE
+       {MP_ROM_QSTR(MP_QSTR_change_value),MP_ROM_PTR(&lwm2m_change_value_obj)},
+       #endif
        { MP_ROM_QSTR(MP_QSTR_register_call), MP_ROM_PTR(&lwm2m_register_call_obj) },
 
        { MP_ROM_QSTR(MP_QSTR_Security          ), MP_ROM_INT(Helios_Lwm2m_Config_Case_security         ) },
@@ -280,6 +406,9 @@ STATIC const mp_rom_map_elem_t lwm2m_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_Appaccount        ), MP_ROM_INT(Helios_Lwm2m_Config_Case_appaccount       ) },
        { MP_ROM_QSTR(MP_QSTR_Apnretry          ), MP_ROM_INT(Helios_Lwm2m_Config_Case_apnretry         ) },
        { MP_ROM_QSTR(MP_QSTR_Hostdevice        ), MP_ROM_INT(Helios_Lwm2m_Config_Case_hostdevice       ) },
+       #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+       { MP_ROM_QSTR(MP_QSTR_Epname    ), MP_ROM_INT(Helios_Lwm2m_Config_Case_epname   ) },
+       #endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(lwm2m_module_globals, lwm2m_module_globals_table);
index ef9b65f..e0bc64e 100644 (file)
@@ -88,7 +88,7 @@ STATIC int lwm2m_set_config_security(Helios_Config_t *config,mp_obj_t args,LWM2M
                if ( !mp_obj_is_int(items[3]) ){
                        goto error_exit;
                }
-               config->config_security->iBootstrap = mp_obj_get_int(items[3]);
+               config->config_security->iBootstrap = (int8_t)mp_obj_get_int(items[3]);
                
                if ( !mp_obj_is_int(items[4]) ){
                        goto error_exit;
@@ -162,7 +162,7 @@ STATIC int lwm2m_set_config_server(Helios_Config_t *config,mp_obj_t args,LWM2M_C
                if ( !mp_obj_is_int(items[1]) ){
                        goto error_exit;
                }
-               config->config_server->iLifetime = (Helios_Lwm2m_ServerType) mp_obj_get_int(items[1]);
+               config->config_server->iLifetime =  mp_obj_get_int(items[1]);
                
                if ( !mp_obj_is_int(items[2]) ){
                        goto error_exit;
@@ -182,13 +182,13 @@ STATIC int lwm2m_set_config_server(Helios_Config_t *config,mp_obj_t args,LWM2M_C
                if ( !mp_obj_is_int(items[5]) ){
                        goto error_exit;
                }
-               config->config_server->sStoring = mp_obj_get_int(items[5]);
+               config->config_server->sStoring = (int8_t)mp_obj_get_int(items[5]);
                
                if ( !mp_obj_is_str(items[6]) ){
                        goto error_exit;
                }
                const char *strBind_mode = mp_obj_str_get_data(items[6], &len);
-               if ( len > 128 || strBind_mode == NULL ){
+               if ( len > 4 || strBind_mode == NULL ){
                        goto error_exit;
                }
                memcpy(config->config_server->strBind_mode,strBind_mode,len);
@@ -234,6 +234,42 @@ error_exit:
        config->config_epmode = NULL;
        return -1;
 }
+#if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+STATIC int lwm2m_set_config_epname(Helios_Config_t *config,mp_obj_t args,LWM2M_CONFIG_DEAL_TYPE deal_type){
+
+       if ( deal_type == LWM2M_CREATE ){
+               config->config_epmode = (Helios_Config_EpMode_t *)malloc(sizeof(Helios_Config_EpMode_t));
+               if ( config->config_epmode == NULL ){
+                       return -1;
+               }
+               memset(config->config_epmode,0x00,sizeof(Helios_Config_EpMode_t));
+               mp_obj_t *items = NULL;
+               size_t len = 0;
+               char *str = NULL;
+               mp_obj_list_get(args, &len, &items);
+               
+               if ( len !=1 ){
+                       goto error_exit;
+               }
+               if ( !mp_obj_is_str(items[0]) ){
+                       goto error_exit;
+               }
+               const char * strepname = mp_obj_str_get_data(items[0], &len);
+               if ( len > 64 || strepname == NULL ){
+                       goto error_exit;
+               }
+               memcpy(config->config_epmode->strEpname,strepname,len);
+       }else{
+               free(config->config_epmode);
+               config->config_epmode = NULL;
+       }
+       return 0;
+error_exit:
+       free(config->config_epmode);
+       config->config_epmode = NULL;
+       return -1;
+}
+#endif
 STATIC int lwm2m_set_config_urc(Helios_Config_t *config,mp_obj_t args,LWM2M_CONFIG_DEAL_TYPE deal_type){
 
        if ( deal_type == LWM2M_CREATE ){
@@ -349,7 +385,7 @@ STATIC int lwm2m_set_config_hostdevice(Helios_Config_t *config,mp_obj_t args,LWM
                if ( !mp_obj_is_int(items[4]) ){
                        goto error_exit;
                }
-               config->config_hostdevice->iHost_id = mp_obj_get_int(items[4]);
+               config->config_hostdevice->iHost_id = (int8_t)mp_obj_get_int(items[4]);
        }else{
                free(config->config_hostdevice);
                config->config_hostdevice = NULL;
@@ -498,12 +534,12 @@ STATIC int lwm2m_set_config_fota(Helios_Config_t *config,mp_obj_t args,LWM2M_CON
                if ( !mp_obj_is_int(items[0]) ){
                        goto error_exit;
                }
-               config->config_fota->i8AutoDownload = mp_obj_get_int(items[0]);
+               config->config_fota->i8AutoDownload = (int8_t)mp_obj_get_int(items[0]);
                
                if ( !mp_obj_is_int(items[1]) ){
                        goto error_exit;
                }
-               config->config_fota->i8AutoUpdate = mp_obj_get_int(items[1]);
+               config->config_fota->i8AutoUpdate = (int8_t)mp_obj_get_int(items[1]);
                return 0;
        }else{
                free(config->config_fota);
@@ -527,6 +563,11 @@ lwm2m_config_t config_list[]={
                {Helios_Lwm2m_Config_Case_nettype,              lwm2m_set_config_nettype},
                {Helios_Lwm2m_Config_Case_apnretry,     lwm2m_set_config_apnretry},
                {Helios_Lwm2m_Config_Case_appaccount,   lwm2m_set_config_appaccount},
+
+               #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+               {Helios_Lwm2m_Config_Case_epname,               lwm2m_set_config_epname},
+               #endif
+               
                {Helios_Lwm2m_Config_Case_fota,                 lwm2m_set_config_fota},
                {Helios_Lwm2m_Config_Case_unknown,NULL},
 };
@@ -534,7 +575,7 @@ lwm2m_config_t config_list[]={
 int lwm2m_set_config(Helios_Config_t *config,Helios_Config_Type config_type,mp_obj_t args,LWM2M_CONFIG_DEAL_TYPE deal_type){
 
        int i = 0 ;
-       if ( config_type > Helios_Lwm2m_Config_Case_waitafterbs || config_type < Helios_Lwm2m_Config_Case_pdpcid)
+       if ( config_type >= Helios_Lwm2m_Config_Case_Max || config_type < Helios_Lwm2m_Config_Case_pdpcid)
        {
                return -1;
        }else {
index 5b9d86b..e96b6e8 100644 (file)
@@ -37,6 +37,7 @@
 #include "pyexec.h"
 #include "mphalport.h"
 #include "helios_platform.h"
+#include "helios_power.h"
 #if MICROPY_QPY_MODULE_MACHINE
 #ifdef MICROPY_PY_MACHINE
 #if MICROPY_PY_SOFT_RESET
@@ -58,7 +59,6 @@ MP_DEFINE_CONST_FUN_OBJ_0(machine_soft_reset_obj, machine_soft_reset);
 #endif
 
 #if MICROPY_QPY_MACHINE_IOV0LTSET
-
 STATIC mp_obj_t IOVoltSet(mp_obj_t domain,mp_obj_t voltage) {
        int ret = -1;
        
@@ -67,11 +67,11 @@ STATIC mp_obj_t IOVoltSet(mp_obj_t domain,mp_obj_t voltage) {
 
        if (pin_domain >= DomainMAX) 
        {
-        mp_raise_ValueError("Please check the first parameter");
+        mp_raise_ValueError(MP_ERROR_TEXT("Please check the first parameter"));
     }
        if (pin_voltage >= IOVOLT_MAX) 
        {
-        mp_raise_ValueError("Please check the second parameter");
+        mp_raise_ValueError(MP_ERROR_TEXT("Please check the second parameter"));
     }
        
        ret = Helios_IOVoltSet((Power_Domain)pin_domain,(IOVoltageSel_t)pin_voltage);
@@ -80,7 +80,19 @@ STATIC mp_obj_t IOVoltSet(mp_obj_t domain,mp_obj_t voltage) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(IOVoltSet_obj, IOVoltSet);
 #endif
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_EIGEN_718)
+STATIC mp_obj_t set_io_voltage(mp_obj_t value) 
+{
+    int voltage = mp_obj_get_int(value);
+
+       int ret = Helios_IO_Set_Vol((Helios_IOLevel)voltage);
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(set_io_voltage_obj, set_io_voltage);
+#endif
+
+
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
 STATIC mp_obj_t enable_clk_output(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) 
 {      
        int ret;
@@ -100,7 +112,7 @@ STATIC mp_obj_t enable_clk_output(size_t n_args, const mp_obj_t *args, mp_map_t
 
        if((args_parse[ARG_switch].u_int != 0) && (args_parse[ARG_switch].u_int != 1))
        {
-               mp_raise_ValueError("switch must be 0 or 1");
+               mp_raise_ValueError(MP_ERROR_TEXT("switch must be 0 or 1"));
        }
        ret = helios_clk_output(args_parse[ARG_pin].u_int,(HELIOS_CLK_E)args_parse[ARG_clk].u_int,args_parse[ARG_switch].u_int);
     return mp_obj_new_int(ret);
@@ -109,6 +121,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(enable_clk_output_obj, 1, enable_clk_output);
 #endif
 
 
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
+STATIC mp_obj_t ctrl_camera_power(mp_obj_t arg)
+{
+       int on_off = mp_obj_get_int(arg);
+    
+       if (on_off == 1) {
+               Helios_camera_poweron();
+               return mp_obj_new_int(0);
+       }
+       else {
+               Helios_camera_poweroff();
+               return mp_obj_new_int(0);
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(ctrl_camera_power_obj, ctrl_camera_power);
+
+#endif
+
+
 STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
        { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) },
 #if MICROPY_QPY_MACHINE_PIN
@@ -164,6 +196,12 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
                { MP_ROM_QSTR(MP_QSTR_OneWire), MP_ROM_PTR(&machine_one_wire_type) },
 #endif
 
+#if defined(PLAT_EIGEN_718)
+               { MP_ROM_QSTR(MP_QSTR_io_set_volt), MP_ROM_PTR(&set_io_voltage_obj) },
+               { MP_ROM_QSTR(MP_QSTR_VOL_1_80V), MP_ROM_INT(HELIOS_VOL_1_80V) },
+               { MP_ROM_QSTR(MP_QSTR_VOL_3_30V), MP_ROM_INT(HELIOS_VOL_3_30V) },
+#endif
+
 #if MICROPY_QPY_MACHINE_IOV0LTSET
     { MP_ROM_QSTR(MP_QSTR_IOVoltSet), MP_ROM_PTR(&IOVoltSet_obj) }, 
        { MP_ROM_QSTR(MP_QSTR_AONIO), MP_ROM_INT(AONIO) },
@@ -194,11 +232,14 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_VOLT_3_40V), MP_ROM_INT(IOVOLT_3_40V) },
 #endif
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
        { MP_ROM_QSTR(MP_QSTR_clk_out), MP_ROM_PTR(&enable_clk_output_obj) }, 
        { MP_ROM_QSTR(MP_QSTR_CLK_32K), MP_ROM_INT(CLK_32K) },
 #endif
 
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
+       { MP_ROM_QSTR(MP_QSTR_ctrl_camera_power), MP_ROM_PTR(&ctrl_camera_power_obj) }, 
+#endif
 
 };
 
index 33eae8a..77b1665 100644 (file)
@@ -41,12 +41,13 @@ extern const mp_obj_type_t machine_hard_spi_type;
 extern const mp_obj_type_t machine_wdt_type;
 extern const mp_obj_type_t machine_nandflash_type;
 extern const mp_obj_type_t machine_simulation_spi_type;
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) ||defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) ||defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) \
+       || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 extern const mp_obj_type_t machine_keypad_type;
 #endif
 extern const mp_obj_type_t machine_one_wire_type;
 
-#if defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR_1602) || defined(BOARD_EC800GCN_LD_XBND)
 extern const mp_obj_type_t machine_key_type;
 #endif
 
@@ -104,6 +105,16 @@ typedef enum
 int Helios_IOVoltSet(Power_Domain domain,IOVoltageSel_t voltage);
 #endif
 
+#if defined(PLAT_EIGEN_718)
+typedef enum
+{
+    HELIOS_VOL_1_80V,
+    HELIOS_VOL_3_30V
+}Helios_IOLevel;
+
+int Helios_IO_Set_Vol(Helios_IOLevel lvl);
+#endif
+
 void machine_timer_deinit_all(void);
 
 #endif /* __MOD_MACHINE_H_ */
index 98e9aca..d5c5907 100644 (file)
 #include "helios_atcmd.h"
 #endif
 
+#if defined(PLAT_RDA)
+#include "helios_fs.h"
+#endif
+
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+#include "helios_lpm.h"
+#endif
+
 #define QPY_MISC_LOG(msg, ...)      custom_log("modmisc", msg, ##__VA_ARGS__)
 
 #ifdef MICROPY_PY_MISC
@@ -56,7 +64,7 @@ extern char g_repl_protect_pswd[64+1];
 #endif
 
 #if MICROPY_QPY_MODULE_ATCMD
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 
 int _get_SecRXOffValue_antenna(void)
 {
@@ -234,8 +242,8 @@ STATIC mp_obj_t qpy_misc_set_repl_password(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_misc_set_repl_password_obj, 1, 2, qpy_misc_set_repl_password);
 
-#if !defined(PLAT_ASR_1803s)
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 STATIC mp_obj_t qpy_misc_IncCoreVoltage(void)
 {
     if(0 != Helios_Dev_IncreaseCoreVoltage()) {
@@ -273,6 +281,76 @@ STATIC mp_obj_t net_light_enable(size_t n_args,const mp_obj_t *args)
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(net_light_enable_obj, 0, 1, net_light_enable);
 #endif
 
+#if defined(PLAT_RDA)
+extern int qpy_log_port;
+
+STATIC mp_obj_t py_log_port(size_t n_args,const mp_obj_t *args) 
+{   
+    int ret = 0;  
+       int value_from_nv;
+    if(n_args == 1)
+    {       
+        int value = mp_obj_get_int(args[0]);
+        if((value == 0) || (value == 1))
+        {
+               if(Helios_NV_File_Exist(PYLOG_PORT_CFG_FILE) == 0)//file not exist
+               {
+                               if(Helios_NV_File_Write(PYLOG_PORT_CFG_FILE,(void *)&value,sizeof(int)))
+                               {
+                                       QPY_MISC_LOG("write nv file fail\n");
+                                       ret = -1;
+                               }
+               }
+                       else//file exist
+                       {
+                               if(Helios_NV_File_Read(PYLOG_PORT_CFG_FILE, (void *)&value_from_nv,sizeof(int)))
+                               {
+                                       QPY_MISC_LOG("read nv file fail before write\n");
+                                       ret = -1;
+                               }
+                               else
+                               {
+                                       if(value_from_nv != value)
+                                       {
+                                               if(Helios_NV_File_Write(PYLOG_PORT_CFG_FILE,(void *)&value,sizeof(int)))
+                                               {
+                                                       QPY_MISC_LOG("file exist,write nv file fail\n");
+                                                       ret = -1;
+                                               }
+                                               else
+                                               {
+                                                       QPY_MISC_LOG("write nv file success\n");
+                                                       ret = 0;
+                                               }
+                                       }
+                               }
+                       }
+               qpy_log_port = value;
+        }
+        else
+        {
+            ret = -1;
+        }
+    }
+    else
+    {          
+               ret = qpy_log_port;//not cfg, repl port
+    } 
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_log_port_obj, 0, 1, py_log_port);
+#endif
+
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+STATIC mp_obj_t qpy_lpm_fast_extint(mp_obj_t arg) 
+{
+       unsigned char value = mp_obj_get_int(arg);
+       Helios_LPM_fast_extint(value);
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_lpm_fast_extint_obj, qpy_lpm_fast_extint);
+#endif
+
 STATIC const mp_rom_map_elem_t misc_module_globals_table[] = {
 
     { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_misc) },
@@ -300,7 +378,7 @@ STATIC const mp_rom_map_elem_t misc_module_globals_table[] = {
 #endif
     { MP_ROM_QSTR(MP_QSTR_replEnable), MP_ROM_PTR(&qpy_misc_set_replEnable_obj) },
     { MP_ROM_QSTR(MP_QSTR_replUpdatePassswd), MP_ROM_PTR(&qpy_misc_set_repl_password_obj) },
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     { MP_ROM_QSTR(MP_QSTR_IncCoreVoltage), MP_ROM_PTR(&qpy_misc_IncCoreVoltage_obj)},
 #endif
 #if MICROPY_QPY_MISC_CFG_NETLIGHT
@@ -308,10 +386,19 @@ STATIC const mp_rom_map_elem_t misc_module_globals_table[] = {
 #endif
 
 #if MICROPY_QPY_MODULE_ATCMD
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
     { MP_ROM_QSTR(MP_QSTR_antennaSecRXOffCtrl), MP_ROM_PTR(&qpy_misc_antennaSecRXOffCtrl_obj) }, 
 #endif
 #endif
+
+#if defined(PLAT_RDA)
+       { MP_ROM_QSTR(MP_QSTR_pylog_port), MP_ROM_PTR(&py_log_port_obj)}, 
+#endif
+
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+       { MP_ROM_QSTR(MP_QSTR_fast_extint), MP_ROM_PTR(&qpy_lpm_fast_extint_obj)},
+#endif
+
 };
 STATIC MP_DEFINE_CONST_DICT(misc_module_globals, misc_module_globals_table);
 
index 46022b5..2aaeaea 100644 (file)
@@ -25,6 +25,7 @@
 #include "helios_dev.h"
 #include "helios_sim.h"
 #include "helios_datacall.h"
+#include "helios_atcmd.h"
 
 #define QPY_NET_LOG(msg, ...)      custom_log(modnet, msg, ##__VA_ARGS__)
 
@@ -66,7 +67,14 @@ STATIC mp_obj_t qpy_net_set_configuration(size_t n_args, const mp_obj_t *args)
                config_info.roaming_switch = roaming;
                QPY_NET_LOG("[network] set config, roaming=%d\r\n", roaming);
        }
-
+       if (n_args ==3) 
+       {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        config_info.net_mode = mode;
 
        MP_THREAD_GIL_EXIT();
@@ -74,7 +82,7 @@ STATIC mp_obj_t qpy_net_set_configuration(size_t n_args, const mp_obj_t *args)
        MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret); 
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_configuration_obj, 1, 2, qpy_net_set_configuration);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_configuration_obj, 1, 3, qpy_net_set_configuration);
 
 
 /*=============================================================================*/
@@ -87,14 +95,24 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_configuration_obj, 1, 2,
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_configuration(void)
+STATIC mp_obj_t qpy_net_get_configuration(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        Helios_NwConfigInfoStruct config_info;
     memset(&config_info, 0, sizeof(Helios_NwConfigInfoStruct));
 
     int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetConfiguration(cur_simid, &config_info);
+       MP_THREAD_GIL_ENTER();
        if(ret == 0)
        {
                mp_obj_t tuple[2] = {mp_obj_new_int(config_info.net_mode), mp_obj_new_bool(config_info.roaming_switch)};
@@ -102,7 +120,7 @@ STATIC mp_obj_t qpy_net_get_configuration(void)
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_configuration_obj, qpy_net_get_configuration);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_configuration_obj, 0, 1, qpy_net_get_configuration);
 
 
 /*=============================================================================*/
@@ -115,14 +133,23 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_configuration_obj, qpy_net_get_conf
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_csq(void)
+STATIC mp_obj_t qpy_net_get_csq(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int csq = -1;
     uint8_t status = 0;
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_GetCardStatus(cur_simid, (Helios_SIM_Status_e *)&status);
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
     {
         if (status != 1)
@@ -144,7 +171,7 @@ STATIC mp_obj_t qpy_net_get_csq(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_csq_obj, qpy_net_get_csq);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_csq_obj, 0, 1, qpy_net_get_csq);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_net_get_nitz_time                                             */
@@ -161,8 +188,9 @@ STATIC mp_obj_t qpy_net_get_nitz_time(void)
        int ret = 0; 
        Helios_NwNITZTimeInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwNITZTimeInfoStruct));
-       
+       MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetNITZTime(&info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                QPY_NET_LOG("nitz_time:%s\r\n",info.nitz_time);
@@ -189,7 +217,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_nitz_time_obj, qpy_net_get_nitz_tim
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_operator_name(void)
+STATIC mp_obj_t qpy_net_get_operator_name(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0; 
        Helios_NwOperatorInfoStruct info;
@@ -198,6 +226,14 @@ STATIC mp_obj_t qpy_net_get_operator_name(void)
     memset(&reg_info, 0, sizeof(Helios_NwRegisterStatusInfoStruct));
     
     int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetRegisterStatus(cur_simid, &reg_info);
        MP_THREAD_GIL_ENTER();
@@ -233,7 +269,7 @@ STATIC mp_obj_t qpy_net_get_operator_name(void)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_operator_name_obj,        qpy_net_get_operator_name);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_operator_name_obj, 0, 1, qpy_net_get_operator_name);
 
 #if 0
 /*=============================================================================*/
@@ -313,13 +349,21 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_selection_obj, 3, 4, qpy_
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_selection(void)
+STATIC mp_obj_t qpy_net_get_selection(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        Helios_NwSelectionInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwSelectionInfoStruct));
 
     int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetSelection(cur_simid, &info);
        MP_THREAD_GIL_ENTER();
@@ -335,7 +379,7 @@ STATIC mp_obj_t qpy_net_get_selection(void)
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_selection_obj, qpy_net_get_selection);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_selection_obj, 0, 1, qpy_net_get_selection);
 
 
 /*=============================================================================*/
@@ -348,13 +392,21 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_selection_obj, qpy_net_get_selectio
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_reg_status(void)
+STATIC mp_obj_t qpy_net_get_reg_status(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        Helios_NwRegisterStatusInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwRegisterStatusInfoStruct));
 
     int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetRegisterStatus(cur_simid, &info);
        MP_THREAD_GIL_ENTER();
@@ -385,7 +437,7 @@ STATIC mp_obj_t qpy_net_get_reg_status(void)
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_reg_status_obj, qpy_net_get_reg_status);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_reg_status_obj, 0, 1, qpy_net_get_reg_status);
 
 
 /*=============================================================================*/
@@ -398,17 +450,20 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_reg_status_obj, qpy_net_get_reg_sta
  *    -1       -       error
  */
 /*=============================================================================*/
-#if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR)
 STATIC mp_obj_t qpy_net_get_signal_strength(size_t n_args, const mp_obj_t *args)
-#else
-STATIC mp_obj_t qpy_net_get_signal_strength(void)
-#endif
 {
        int ret = 0;
        Helios_NwSignalStrengthInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwSignalStrengthInfoStruct));
        int cur_simid = _get_current_simid();
-
+       if (n_args ==2) 
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetSignalStrength(cur_simid, &info);
        MP_THREAD_GIL_ENTER();
@@ -421,7 +476,7 @@ STATIC mp_obj_t qpy_net_get_signal_strength(void)
                        mp_obj_new_int(info.gw_signal_strength.rscp), 
                        mp_obj_new_int(info.gw_signal_strength.ecno)};
 
-    #if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR)
+    #if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR)
         if (n_args > 0)
         {
             int flag = mp_obj_get_int(args[0]);
@@ -456,54 +511,8 @@ STATIC mp_obj_t qpy_net_get_signal_strength(void)
        }
        return mp_obj_new_int(-1);
 }
-#if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR)
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_signal_strength_obj, 0, 1, qpy_net_get_signal_strength);
-#else
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_signal_strength_obj, qpy_net_get_signal_strength);
-#endif
-
-#if 0//defined(PLAT_ASR_1606)
-STATIC mp_obj_t qpy_net_get_signal_strength_ex(mp_obj_t simid)
-{
-       int ret = 0;
-       Helios_NwSignalStrengthInfoStruct info;
-    memset(&info, 0, sizeof(Helios_NwSignalStrengthInfoStruct));
-
-       int cur_simid = mp_obj_get_int(simid);
-    if ((cur_simid != 0) && (cur_simid != 1))
-    {
-        mp_raise_ValueError("invalid value, sim id should be 0/1.");
-    }
-    
-       ret = Helios_Nw_GetSignalStrength(cur_simid, &info);
-       if (ret == 0)
-       {
-               mp_obj_t gw_list[4] = {
-                       mp_obj_new_int(info.gw_signal_strength.rssi), 
-                       mp_obj_new_int(info.gw_signal_strength.bit_error_rate), 
-                       mp_obj_new_int(info.gw_signal_strength.rscp), 
-                       mp_obj_new_int(info.gw_signal_strength.ecno)
-                       };
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_signal_strength_obj, 0, 2, qpy_net_get_signal_strength);
 
-        mp_obj_t lte_list[5] = {
-                       mp_obj_new_int(info.lte_signal_strength.rssi), 
-                       mp_obj_new_int(info.lte_signal_strength.rsrp), 
-                       mp_obj_new_int(info.lte_signal_strength.rsrq), 
-                       mp_obj_new_int(info.lte_signal_strength.cqi),
-                       mp_obj_new_int(info.lte_signal_strength.sinr)
-                       };
-
-        mp_obj_t tuple[2] = {
-                       mp_obj_new_list(4,gw_list), 
-                       mp_obj_new_list(5,lte_list)
-                       };
-            
-        return mp_obj_new_tuple(2, tuple);
-       }
-       return mp_obj_new_int(-1);
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_get_signal_strength_ex_obj, qpy_net_get_signal_strength_ex);
-#endif
 
 /*=============================================================================*/
 /* FUNCTION: qpy_net_get_mnc                                                   */
@@ -515,7 +524,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_get_signal_strength_ex_obj, qpy_net_get
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_mnc(void)
+STATIC mp_obj_t qpy_net_get_mnc(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
@@ -523,7 +532,14 @@ STATIC mp_obj_t qpy_net_get_mnc(void)
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -559,16 +575,23 @@ STATIC mp_obj_t qpy_net_get_mnc(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mnc_obj, qpy_net_get_mnc);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_mnc_obj, 0, 1, qpy_net_get_mnc);
 
-STATIC mp_obj_t qpy_net_get_mnc_servingcell(void)
+STATIC mp_obj_t qpy_net_get_mnc_servingcell(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -611,7 +634,7 @@ STATIC mp_obj_t qpy_net_get_mnc_servingcell(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mnc_servingcell_obj, qpy_net_get_mnc_servingcell);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_mnc_servingcell_obj, 0, 1, qpy_net_get_mnc_servingcell);
 
 
 /*=============================================================================*/
@@ -624,7 +647,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mnc_servingcell_obj, qpy_net_get_mn
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_mcc(void)
+STATIC mp_obj_t qpy_net_get_mcc(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
@@ -632,7 +655,14 @@ STATIC mp_obj_t qpy_net_get_mcc(void)
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -668,16 +698,23 @@ STATIC mp_obj_t qpy_net_get_mcc(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mcc_obj, qpy_net_get_mcc);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_mcc_obj, 0, 1, qpy_net_get_mcc);
 
-STATIC mp_obj_t qpy_net_get_mcc_servingcell(void)
+STATIC mp_obj_t qpy_net_get_mcc_servingcell(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -720,7 +757,7 @@ STATIC mp_obj_t qpy_net_get_mcc_servingcell(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mcc_servingcell_obj, qpy_net_get_mcc_servingcell);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_mcc_servingcell_obj, 0, 1, qpy_net_get_mcc_servingcell);
 
 
 /*=============================================================================*/
@@ -733,7 +770,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_mcc_servingcell_obj, qpy_net_get_mc
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_lac(void)
+STATIC mp_obj_t qpy_net_get_lac(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
@@ -741,7 +778,14 @@ STATIC mp_obj_t qpy_net_get_lac(void)
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -777,16 +821,23 @@ STATIC mp_obj_t qpy_net_get_lac(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_lac_obj, qpy_net_get_lac);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_lac_obj, 0, 1, qpy_net_get_lac);
 
-STATIC mp_obj_t qpy_net_get_lac_servingcell(void)
+STATIC mp_obj_t qpy_net_get_lac_servingcell(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -829,7 +880,7 @@ STATIC mp_obj_t qpy_net_get_lac_servingcell(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_lac_servingcell_obj, qpy_net_get_lac_servingcell);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_lac_servingcell_obj, 0, 1, qpy_net_get_lac_servingcell);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_net_get_cid                                                   */
@@ -841,7 +892,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_lac_servingcell_obj, qpy_net_get_la
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_cid(void)
+STATIC mp_obj_t qpy_net_get_cid(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
@@ -849,7 +900,14 @@ STATIC mp_obj_t qpy_net_get_cid(void)
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -885,16 +943,23 @@ STATIC mp_obj_t qpy_net_get_cid(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_cid_obj, qpy_net_get_cid);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_cid_obj, 0, 1, qpy_net_get_cid);
 
-STATIC mp_obj_t qpy_net_get_cid_servingcell(void)
+STATIC mp_obj_t qpy_net_get_cid_servingcell(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int i = 0;
        Helios_NwCellInfoStruct info;
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
     int cur_simid = _get_current_simid();
-
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
@@ -937,9 +1002,9 @@ STATIC mp_obj_t qpy_net_get_cid_servingcell(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_cid_servingcell_obj, qpy_net_get_cid_servingcell);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_cid_servingcell_obj, 0, 1, qpy_net_get_cid_servingcell);
 
-#if defined(PLAT_Qualcomm) || defined(PLAT_ASR)
+#if defined(PLAT_Qualcomm) || defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
 STATIC mp_obj_t qpy_net_set_band(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
@@ -999,7 +1064,9 @@ STATIC mp_obj_t qpy_net_get_band(mp_obj_t net_type)
     memset(&band_info, 0, sizeof(Helios_NwBandStruct));
        band_info.band_type = band_type;
     int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetBand(cur_simid, &band_info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                char str[64] = {0};
@@ -1011,7 +1078,18 @@ STATIC mp_obj_t qpy_net_get_band(mp_obj_t net_type)
                {
                        if (band_info.band_hign == 0)
                        {
+#if MICROPY_QPY_MODULE_NET_BAND
+                               uint32_t band_lh = band_info.band_low >> 32;
+                       uint32_t band_ll = band_info.band_low & 0xFFFFFFFF;
+                               QPY_NET_LOG("[helios_nw_band]band_hign=%lx, band_low=%lx\r\n", band_lh, band_ll);
+                               if (band_lh ==0) {
+                                       snprintf(str, 64, "0x%lx", band_ll);
+                               } else {
+                                       snprintf(str, 64, "0x%lx%08lx", band_lh, band_ll);
+                               }
+#else
                                snprintf(str, 64, "0x%llx", band_info.band_low);
+#endif
                        }
                        else
                        {
@@ -1025,7 +1103,7 @@ STATIC mp_obj_t qpy_net_get_band(mp_obj_t net_type)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_get_band_obj, qpy_net_get_band);
 #endif
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
 STATIC mp_obj_t qpy_net_band_restore(void)
 {
        int ret = 0;
@@ -1048,17 +1126,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_band_restore_obj, qpy_net_band_restore)
  *    -1       -       error
  */
 /*=============================================================================*/
-#if defined(PLAT_RDA) || defined(PLAT_EIGEN)
 STATIC mp_obj_t qpy_net_get_cell_info(size_t n_args, const mp_obj_t *args)
-#else
-STATIC mp_obj_t qpy_net_get_cell_info()
-#endif
 {
        int i = 0;
        int ret = 0;
-#if defined(PLAT_RDA) || defined(PLAT_EIGEN)
-    int flag_args = -1;
-#endif
+
        mp_obj_t list_gsm  = mp_obj_new_list(0, NULL);
        mp_obj_t list_umts = mp_obj_new_list(0, NULL);
        mp_obj_t list_lte  = mp_obj_new_list(0, NULL);
@@ -1066,10 +1138,22 @@ STATIC mp_obj_t qpy_net_get_cell_info()
     memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
 
     int cur_simid = _get_current_simid();
+#if defined(PLAT_RDA) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+    int flag_args = -1;
+#else
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+#endif 
     MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetCellInfo(cur_simid, &info);
     MP_THREAD_GIL_ENTER();
-    
+       
     if (ret == 0)
     {
                if (info.gsm_info_num > 0)
@@ -1113,7 +1197,7 @@ STATIC mp_obj_t qpy_net_get_cell_info()
        
                if (info.lte_info_num > 0)
                {
-               #if defined(PLAT_RDA) || defined(PLAT_EIGEN)
+               #if defined(PLAT_RDA) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
             if (n_args > 0)
             {
                 flag_args = mp_obj_get_int(args[0]);
@@ -1173,13 +1257,149 @@ STATIC mp_obj_t qpy_net_get_cell_info()
     }
        return mp_obj_new_int(-1);
 }
-#if defined(PLAT_RDA) || defined(PLAT_EIGEN)
+
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_cell_info_obj, 0, 1, qpy_net_get_cell_info);
-#else
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_cell_info_obj, qpy_net_get_cell_info);
+
+
+
+
+STATIC mp_obj_t qpy_net_get_cell_info_v2(size_t n_args, const mp_obj_t *args)
+{
+       int i = 0;
+       int ret = 0;
+#if    defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+       int mcc = 0;
+       int mnc = 0;
+       char para[5]={0};
 #endif
+       mp_obj_t list_gsm  = mp_obj_new_list(0, NULL);
+       mp_obj_t list_umts = mp_obj_new_list(0, NULL);
+       mp_obj_t list_lte  = mp_obj_new_list(0, NULL);
+       Helios_NwCellInfoStruct info;
+    memset(&info, 0, sizeof(Helios_NwCellInfoStruct));
+
+    int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+    MP_THREAD_GIL_EXIT();
+       ret = Helios_Nw_GetCellInfo(cur_simid, &info);
+    MP_THREAD_GIL_ENTER();
+    
+    if (ret == 0)
+    {
+               if (info.gsm_info_num > 0)
+               {
+                       for (i=0; i<info.gsm_info_num; i++)
+                       {
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)              
+                               memset(para, 0, 5);
+                               sprintf(para, "%x", info.gsm_info[i].mcc);
+                               sscanf(para, "%d", &mcc);
+                               memset(para, 0, 5);
+                sprintf(para, "%x", info.gsm_info[i].mnc);
+                               sscanf(para, "%d", &mnc);
+                       #endif
+                               mp_obj_t gsm[8] = {
+                                       mp_obj_new_int(info.gsm_info[i].flag), 
+                                       mp_obj_new_int(info.gsm_info[i].cid),
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+                                       mp_obj_new_int(mcc),
+                                       mp_obj_new_int(mnc),
+                       #else
+                                       mp_obj_new_int(info.gsm_info[i].mcc),
+                                       mp_obj_new_int(info.gsm_info[i].mnc),
+                       #endif
+                                       mp_obj_new_int(info.gsm_info[i].lac),
+                                       mp_obj_new_int(info.gsm_info[i].arfcn),
+                                       mp_obj_new_int(info.gsm_info[i].bsic), 
+                                       //Pawn.zhou Edit 2020/12/18
+                                       mp_obj_new_int(info.gsm_info[i].rssi)};
 
-#if 0//defined(PLAT_ASR_1606)
+                               mp_obj_list_append(list_gsm, mp_obj_new_tuple(8, gsm));
+                       }                       
+               }
+       
+               if (info.umts_info_num > 0)
+               {
+                       for (i=0; i<info.umts_info_num; i++)
+                       {
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)              
+                               memset(para, 0, 5);
+                               sprintf(para, "%x", info.umts_info[i].mcc);
+                               sscanf(para, "%d", &mcc);
+                               memset(para, 0, 5);
+                sprintf(para, "%x", info.umts_info[i].mnc);
+                               sscanf(para, "%d", &mnc);
+                       #endif
+                               mp_obj_t umts[9] = {
+                                       mp_obj_new_int(info.umts_info[i].flag), 
+                                       mp_obj_new_int(info.umts_info[i].cid),
+                                       mp_obj_new_int(info.umts_info[i].lcid),
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+                                       mp_obj_new_int(mcc),
+                                       mp_obj_new_int(mnc),
+                       #else
+                                       mp_obj_new_int(info.umts_info[i].mcc),
+                                       mp_obj_new_int(info.umts_info[i].mnc),
+                       #endif
+                                       mp_obj_new_int(info.umts_info[i].lac),
+                                       mp_obj_new_int(info.umts_info[i].uarfcn),
+                                       mp_obj_new_int(info.umts_info[i].psc),
+                                       //Pawn.zhou Edit 2020/12/18
+                                       mp_obj_new_int(info.umts_info[i].rssi)};
+                               
+                               mp_obj_list_append(list_umts, mp_obj_new_tuple(9, umts));
+                       }
+               }
+       
+               if (info.lte_info_num > 0)
+               {
+                       for (i=0; i<info.lte_info_num; i++)
+                       {
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)              
+                               memset(para, 0, 5);
+                               sprintf(para, "%x", info.lte_info[i].mcc);
+                               sscanf(para, "%d", &mcc);
+                               memset(para, 0, 5);
+                sprintf(para, "%x", info.lte_info[i].mnc);
+                               sscanf(para, "%d", &mnc);
+                       #endif
+                               mp_obj_t lte[9] = {
+                                       mp_obj_new_int(info.lte_info[i].flag),
+                                       mp_obj_new_int(info.lte_info[i].cid),
+                       #if     defined(PLAT_Qualcomm) || defined(PLAT_ASR) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+                                       mp_obj_new_int(mcc),
+                                       mp_obj_new_int(mnc),
+                       #else
+                                       mp_obj_new_int(info.lte_info[i].mcc),
+                                       mp_obj_new_int(info.lte_info[i].mnc),
+                       #endif
+                                       mp_obj_new_int(info.lte_info[i].pci),
+                                       mp_obj_new_int(info.lte_info[i].tac),
+                                       mp_obj_new_int(info.lte_info[i].earfcn),
+                                       mp_obj_new_int(info.lte_info[i].rssi),
+                                       mp_obj_new_int(info.lte_info[i].rsrq)};
+
+                               mp_obj_list_append(list_lte, mp_obj_new_tuple(9, lte));
+                       }
+               }
+               mp_obj_t list[3] = {list_gsm, list_umts, list_lte};
+
+               return mp_obj_new_tuple(3, list);
+    }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_cell_info_v2_obj, 0, 1, qpy_net_get_cell_info_v2);
+
+
+
+#if 0//defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
 STATIC mp_obj_t qpy_net_get_cell_info_ex(mp_obj_t simid)
 {
        int i = 0;
@@ -1280,12 +1500,29 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_get_cell_info_ex_obj, qpy_net_get_cell_
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_net_get_modem_fun(void)
+STATIC mp_obj_t qpy_net_get_modem_fun(size_t n_args, const mp_obj_t *args)
 {
 
        int ret = 0;
        Helios_DevModemFunction current_fun = 0;
-       ret = Helios_Dev_GetModemFunction(&current_fun);
+       #if MICROPY_QPY_MODULE_DSDS
+       int cur_simid = _get_current_simid();
+       if (n_args ==1) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Dev_GetModemFunction(&current_fun, cur_simid);
+       MP_THREAD_GIL_ENTER();
+       #else
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Dev_GetModemFunction(&current_fun,0);
+       MP_THREAD_GIL_ENTER();
+       #endif
        if (ret == 0)
        {
                return mp_obj_new_int(current_fun);
@@ -1293,7 +1530,7 @@ STATIC mp_obj_t qpy_net_get_modem_fun(void)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_modem_fun_obj, qpy_net_get_modem_fun);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_modem_fun_obj, 0, 1, qpy_net_get_modem_fun);
 
 
 /*=============================================================================*/
@@ -1323,9 +1560,24 @@ STATIC mp_obj_t qpy_net_set_modem_fun(size_t n_args, const mp_obj_t *args)
        
        modem_fun = (uint8_t)mp_obj_get_int(args[0]);
 
+       #if MICROPY_QPY_MODULE_DSDS
+       int cur_simid = _get_current_simid();
+       if (n_args ==3) 
+       {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        MP_THREAD_GIL_EXIT();
-       ret = Helios_Dev_SetModemFunction(modem_fun, rst);
+       ret = Helios_Dev_SetModemFunction(modem_fun, rst, cur_simid);
        MP_THREAD_GIL_ENTER();
+       #else
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Dev_SetModemFunction(modem_fun, rst,0);
+       MP_THREAD_GIL_ENTER();
+       #endif
        if (ret == 0)
        {
                return mp_obj_new_int(0);
@@ -1333,11 +1585,12 @@ STATIC mp_obj_t qpy_net_set_modem_fun(size_t n_args, const mp_obj_t *args)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_modem_fun_obj, 1, 2, qpy_net_set_modem_fun);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_modem_fun_obj, 1, 3, qpy_net_set_modem_fun);
 
 STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
 {
-#if defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) \
+    || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
     if (n_args == 2)
     {
         mp_buffer_info_t apninfo = {0};
@@ -1351,8 +1604,10 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
         if (apninfo.len > HELIOS_APN_LEN_MAX)
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of apn should be no more than [%d] bytes."), HELIOS_APN_LEN_MAX);
-       }       
+       }
+               MP_THREAD_GIL_EXIT();
         ret = Helios_Nw_SetApn((char *)apninfo.buf, net_simid);
+               MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(0);
@@ -1380,7 +1635,11 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
                int min_profile_id = (int)HELIOS_PROFILE_IDX_MIN;
                int max_profile_id = (int)HELIOS_PROFILE_IDX_MAX;
 
-            if (net_simid != 0)
+            #if MICROPY_QPY_MODULE_DSDS
+            if ((net_simid != 0) && (net_simid != 1))
+                       #else
+                       if (net_simid != 0)
+                       #endif
             {
                 mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
             }
@@ -1420,9 +1679,13 @@ STATIC mp_obj_t qpy_net_set_apn(size_t n_args, const mp_obj_t *args)
             snprintf(pdpinfo_set.apn, sizeof(pdpinfo_set.apn), "%s", (char *)apninfo.buf);
             snprintf(pdpinfo_set.user, sizeof(pdpinfo_set.user), "%s", (char *)usrinfo.buf);
             snprintf(pdpinfo_set.pwd, sizeof(pdpinfo_set.pwd), "%s", (char *)pwdinfo.buf);
-            
+            MP_THREAD_GIL_EXIT();
+                       #if MICROPY_QPY_MODULE_DSDS
+            ret = Helios_DataCall_SetPDPContext(net_simid, profile_id, &pdpinfo_set);
+                       #else
             ret = Helios_DataCall_SetPDPContext(profile_id, &pdpinfo_set);
-            
+                       #endif
+            MP_THREAD_GIL_ENTER();
                return mp_obj_new_int(ret);
         }
         else
@@ -1436,7 +1699,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_set_apn_obj, 2, 7, qpy_net_se
 
 STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
 {
-#if defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) \
+    || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
     if (n_args == 1)
     {
         uint8_t net_simid = mp_obj_get_int(args[0]);
@@ -1446,7 +1710,9 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
         {
             mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
         }
+               MP_THREAD_GIL_EXIT();
         ret = Helios_Nw_GetApn(apn, net_simid);
+               MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(apn, strlen(apn));
@@ -1463,7 +1729,11 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
             uint8_t profile_id = mp_obj_get_int(args[0]);
             Helios_DataCallStartStruct pdpinfo_get;
 
-            if (net_simid != 0)
+                       #if MICROPY_QPY_MODULE_DSDS
+            if ((net_simid != 0) && (net_simid != 1))
+                       #else
+                       if (net_simid != 0)
+                       #endif
             {
                 mp_raise_ValueError(MP_ERROR_TEXT("invalid simid."));
             }
@@ -1473,7 +1743,13 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
                        mp_raise_ValueError(MP_ERROR_TEXT("invalid profile_id."));
                }
             memset(&pdpinfo_get, 0, sizeof(Helios_DataCallStartStruct));
+                       MP_THREAD_GIL_EXIT();
+                       #if MICROPY_QPY_MODULE_DSDS
+            ret = Helios_DataCall_GetPDPContext(net_simid,profile_id, &pdpinfo_get);
+                       #else
             ret = Helios_DataCall_GetPDPContext(profile_id, &pdpinfo_get);
+                       #endif
+                       MP_THREAD_GIL_ENTER();
             if (ret != 0)
                 return mp_obj_new_int(-1);
             
@@ -1495,6 +1771,41 @@ STATIC mp_obj_t qpy_net_get_apn(size_t n_args, const mp_obj_t *args)
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_apn_obj, 1, 2, qpy_net_get_apn);
 
+#if MICROPY_QPY_MODULE_NET_LED
+STATIC mp_obj_t qpy_set_networkled_config( const mp_obj_t args)
+{
+
+       typedef struct network_led_control_info{
+               int                             i_gpio_num;                     // GPIO_NO
+               uint32_t                i_net_type;                     // TCP  UDP 0-tcp 1-udp
+               uint32_t                i_gpio_low_time;        // GPIO LOW times  ms
+               uint32_t                i_gpio_hight_time;  // GPIO hight times ms
+               uint32_t                i_loop_nums;            // cycle nums
+       }network_led_control_info_t;
+       
+       int Helios_NW_Led_Config(network_led_control_info_t config);
+       volatile network_led_control_info_t config;
+       mp_obj_t *items = NULL;
+       size_t len = 0;
+       char *str = NULL;
+       mp_obj_list_get(args, &len, &items);
+       if ( len!= 5){
+               return  mp_obj_new_int(-1);
+       }
+       config.i_gpio_num = (int)mp_obj_get_int(items[0]);
+       config.i_net_type = (int)mp_obj_get_int(items[1]);
+       config.i_gpio_low_time =(int) mp_obj_get_int(items[2]);
+       config.i_gpio_hight_time = (int)mp_obj_get_int(items[3]);
+       config.i_loop_nums =(int) mp_obj_get_int(items[4]);
+       MP_THREAD_GIL_EXIT();
+       Helios_NW_Led_Config(config);
+       MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(0);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_set_networkled_config_obj, qpy_set_networkled_config);
+#endif
+
 static c_callback_t *g_net_user_callback = NULL;
 
 static void qpy_net_event_handler(uint8_t sim_id, int32_t event_id, void *ctx)
@@ -1525,6 +1836,29 @@ static void qpy_net_event_handler(uint8_t sim_id, int32_t event_id, void *ctx)
                        }
                        break;
                }
+       #if MICROPY_QPY_MODULE_JAMDET
+               case HELIOS_NW_JAMMING_DETECT_IND:
+               {
+                       /* ... */
+                       QPY_NET_LOG("[net]jamming event.\r\n", event_id);
+                       uint8_t jam_status = *(uint8_t *)ctx;
+                       if (g_net_user_callback)
+                       {
+                               MP_THREAD_GIL_ENTER();
+                               GC_STACKTOP_SET();
+                               mp_obj_t tuple[3] = 
+                       {
+                               mp_obj_new_int(event_id),
+                               mp_obj_new_int(jam_status),
+                               mp_obj_new_int(sim_id)
+                       };
+                               mp_sched_schedule_ex(g_net_user_callback, mp_obj_new_tuple(3, tuple));
+                               GC_STACKTOP_CLEAR();
+                               MP_THREAD_GIL_EXIT();
+                       }
+                       break;
+               }
+       #endif
                case HELIOS_NW_VOICE_REG_STATUS_IND:
                        /* ... */
                        QPY_NET_LOG("[net] ind_flag = %x\r\n", event_id);
@@ -1583,8 +1917,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_add_event_handler_obj, qpy_net_add_even
 STATIC mp_obj_t qpy_module_net_deinit(void)
 {
        QPY_NET_LOG("module net deinit.\r\n");
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+       MP_THREAD_GIL_EXIT();
        Helios_Nw_Deinit();
+       MP_THREAD_GIL_ENTER();
 #endif
        g_net_user_callback = NULL;
        return mp_obj_new_int(0);
@@ -1603,7 +1939,7 @@ STATIC mp_obj_t qpy_ftm_mode_switch(mp_obj_t mode)
        MP_THREAD_GIL_EXIT();
        if(ftm_mode)
        {
-               ret = Helios_Dev_SetModemFunction(!ftm_mode, 0);
+               ret = Helios_Dev_SetModemFunction(!ftm_mode, 0, 0);
                Helios_sleep(1);
                ret = (!ret) ? helios_ftm_mode_switch(ftm_mode) : -1;
        }
@@ -1611,7 +1947,7 @@ STATIC mp_obj_t qpy_ftm_mode_switch(mp_obj_t mode)
        {
                ret = helios_ftm_mode_switch(ftm_mode);
                Helios_sleep(1);
-               ret = (!ret) ? Helios_Dev_SetModemFunction(!ftm_mode, 0) : -1;
+               ret = (!ret) ? Helios_Dev_SetModemFunction(!ftm_mode, 0, 0) : -1;
        }
        MP_THREAD_GIL_ENTER();  
 
@@ -1709,7 +2045,9 @@ STATIC mp_obj_t qpy_get_black_cell_cfg(void)
        int8_t ret = 0;
        int blackcellCfg = 0;
        int blackcellCfg_num = 0;
+       MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_GetBlackCellCfg(&blackcellCfg,&blackcellCfg_num);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                mp_obj_t list[2] = {mp_obj_new_int(blackcellCfg), mp_obj_new_int(blackcellCfg_num)};
@@ -1729,14 +2067,16 @@ STATIC mp_obj_t qpy_set_black_cell_cfg(size_t n_args, const mp_obj_t *args)
        uint8_t blackcellCfg = mp_obj_get_int(args[0]);
        if (blackcellCfg > 1)
        {
-               mp_raise_ValueError("invalid value, blackcellCfg should be in [0,1].");
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, blackcellCfg should be in [0,1]."));
        }
        uint8_t blackcellCfg_num = mp_obj_get_int(args[1]);
-       if (blackcellCfg_num > 8)
+       if (blackcellCfg_num == 0 || blackcellCfg_num > 8)
        {
-               mp_raise_ValueError("invalid value, blackcellCfg_num should be in [0,8].");
+                       mp_raise_ValueError(MP_ERROR_TEXT("invalid value, blackcellCfg_num should be in [1,8]."));
        }
+       MP_THREAD_GIL_EXIT();
        ret = Helios_Nw_SetBlackCellCfg(blackcellCfg, blackcellCfg_num);
+       MP_THREAD_GIL_ENTER();
        if (ret != 0){
                ret =-1;
        }
@@ -1766,28 +2106,379 @@ STATIC mp_obj_t qpy_delete_black_cell(size_t n_args, const mp_obj_t *args)
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_delete_black_cell_obj, 0, 1, qpy_delete_black_cell);
+#endif
 
 
-STATIC mp_obj_t qpy_set_black_cell(mp_obj_t mode)
+#if MICROPY_QPY_MODULE_DRX_TIMER
+STATIC mp_obj_t qpy_net_get_drxtm(void)
 {
-       int8_t ret = -1;
-       uint8_t black_cell_mode = mp_obj_get_int(mode);
-       if (black_cell_mode > 1)
-       {
-               mp_raise_ValueError("invalid value, mode should be in [0,1].");
+       uint8_t cur_simid = _get_current_simid();
+       uint16_t drx_timer_value = 0;
+       MP_THREAD_GIL_EXIT();
+       if(0 != Helios_Nw_GetDrxtm(cur_simid, &drx_timer_value)) {
+               MP_THREAD_GIL_ENTER();
+               return mp_obj_new_int(-1);
        }
+       MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(drx_timer_value);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_drxtm_obj, qpy_net_get_drxtm);
+
+STATIC mp_obj_t qpy_net_set_drxtm(mp_obj_t drx_timer)
+{
+       uint8_t cur_simid = _get_current_simid();
+       uint16_t drx_timer_value = (uint16_t)mp_obj_get_int(drx_timer);
        MP_THREAD_GIL_EXIT();
-       ret = Helios_Nw_SetBlackCell(black_cell_mode);
+       if(0 != Helios_Nw_SetDrxtm(cur_simid, drx_timer_value)) {
+               MP_THREAD_GIL_ENTER();
+               return mp_obj_new_int(-1);
+       }
        MP_THREAD_GIL_ENTER();
-       if (ret != 0){
-               ret = -1;
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_net_set_drxtm_obj, qpy_net_set_drxtm);
+#endif
+
+#if MICROPY_QPY_MODULE_JAMDET
+STATIC mp_obj_t qpy_jamdet_set_switch(size_t n_args, const mp_obj_t *args)
+{
+    uint8_t sim_id = 0;
+       
+    uint8_t opt = (uint8_t)mp_obj_get_int(args[0]);
+    if ((opt != 0) && (opt != 1))
+    {
+        mp_raise_ValueError("invalid value, opt shuould be 0 or 1,");
+    }
+
+       if (n_args == 2)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[1]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
        }
+       
+    MP_THREAD_GIL_EXIT();
+    int ret = Helios_Nw_SetJamdetSwitch(sim_id, opt);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_set_black_cell_obj, qpy_set_black_cell);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_jamdet_set_switch_obj, 1, 2, qpy_jamdet_set_switch);
+
+STATIC mp_obj_t qpy_jamdet_get_switch(size_t n_args, const mp_obj_t *args)
+{
+    uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       uint8_t opt = 0;
+    MP_THREAD_GIL_EXIT();
+    Helios_Nw_GetJamdetSwitch(sim_id, &opt);
+    MP_THREAD_GIL_ENTER();
+       
+       return mp_obj_new_int(opt);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_jamdet_get_switch_obj, 0, 1, qpy_jamdet_get_switch);
+
+STATIC mp_obj_t qpy_jamdet_set_configuration(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+       if (n_args == 8)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[7]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+
+       Helios_NwJamDetConfigStruct cfg = {0};
+       cfg.gsm_minch = mp_obj_get_int(args[0]);
+       cfg.gsm_sinr  = mp_obj_get_int(args[1]);
+       cfg.gsm_rssi  = mp_obj_get_int(args[2]);
+       cfg.lte_rsrp  = mp_obj_get_int(args[3]);
+       cfg.lte_rsrq  = mp_obj_get_int(args[4]);
+       cfg.lte_rssi  = mp_obj_get_int(args[5]);
+       cfg.shake_period = mp_obj_get_int(args[6]);
+
+       if ((cfg.gsm_minch < 0) || (cfg.gsm_minch > 254))
+       {
+               mp_raise_ValueError("invalid value, gsm_minch should be in [0,254].");
+       }
+       if ((cfg.gsm_sinr < 0) || (cfg.gsm_sinr > 63))
+       {
+               mp_raise_ValueError("invalid value, gsm_sinr should be in [0,63].");
+       }
+       if ((cfg.gsm_rssi < -110) || (cfg.gsm_rssi > -50))
+       {
+               mp_raise_ValueError("invalid value, gsm_rssi should be in [-110,-50].");
+       }
+       if ((cfg.lte_rsrp < -140) || (cfg.lte_rsrp > -44))
+       {
+               mp_raise_ValueError("invalid value, lte_rsrp should be in [-140,-44].");
+       }
+       if ((cfg.lte_rsrq < -19) || (cfg.lte_rsrq > -3))
+       {
+               mp_raise_ValueError("invalid value, lte_rsrq should be in [-19,-3].");
+       }
+       if ((cfg.lte_rssi < -120) || (cfg.lte_rssi > -20))
+       {
+               mp_raise_ValueError("invalid value, lte_rssi should be in [-120,-20].");
+       }
+       if ((cfg.shake_period < 1) || (cfg.shake_period > 10))
+       {
+               mp_raise_ValueError("invalid value, shake_period should be in [1,10].");
+       }
+
+       MP_THREAD_GIL_EXIT();
+    int ret = Helios_Nw_SetJamdetConfiguration(sim_id, &cfg);
+    MP_THREAD_GIL_ENTER();
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_jamdet_set_config_obj, 7, 8, qpy_jamdet_set_configuration);
+
+STATIC mp_obj_t qpy_jamdet_get_configuration(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
+       Helios_NwJamDetConfigStruct cfg = {0};
+       MP_THREAD_GIL_EXIT();
+    Helios_Nw_GetJamdetConfiguration(sim_id, &cfg);
+    MP_THREAD_GIL_ENTER();
+       mp_obj_t info[7] = 
+       {
+               mp_obj_new_int(cfg.gsm_minch),
+               mp_obj_new_int(cfg.gsm_sinr),
+               mp_obj_new_int(cfg.gsm_rssi),
+               mp_obj_new_int(cfg.lte_rsrp),
+               mp_obj_new_int(cfg.lte_rsrq),
+               mp_obj_new_int(cfg.lte_rssi),
+               mp_obj_new_int(cfg.shake_period)
+       };
+       return mp_obj_new_tuple(7, info);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_jamdet_get_config_obj, 0, 1, qpy_jamdet_get_configuration);
+
+STATIC mp_obj_t qpy_jamdet_get_stauts(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+
+       uint8_t opt = 0;
+    MP_THREAD_GIL_EXIT();
+    Helios_Nw_GetJamdetSwitch(sim_id, &opt);
+    MP_THREAD_GIL_ENTER();
+       if (opt == 0)
+       {
+               mp_raise_ValueError("Please enable the jamdet function first.");
+       }
+
+       uint8_t status = 0;
+       MP_THREAD_GIL_EXIT();
+    int ret = Helios_Nw_GetJamdetStatus(sim_id, &status);
+    MP_THREAD_GIL_ENTER();
+       if (ret == 0)
+       {
+               return mp_obj_new_int(status);
+       }
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_jamdet_get_stauts_obj, 0, 1, qpy_jamdet_get_stauts);
 
 #endif
 
+#if defined(MICROPY_QPY_MODULE_IMS_STATUS)
+STATIC mp_obj_t qpy_net_get_ims_register(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = _get_current_simid();;
+       if (n_args == 1) {
+               sim_id = mp_obj_get_int(args[0]);
+       }
+    if ((sim_id != 0) && (sim_id != 1))
+    {
+        mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+    }
+       MP_THREAD_GIL_EXIT();
+    int ret = Helios_Nw_ImsIsRegister(sim_id);
+    MP_THREAD_GIL_ENTER();
+    return mp_obj_new_int(ret);
+}
+STATIC  MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_net_get_ims_register_obj, 0, 1, qpy_net_get_ims_register);
+#endif
+
+#if MICROPY_QPY_MODULE_NET_EX
+
+STATIC mp_obj_t qpy_net_get_T3402(void)
+{
+    char resp[128] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+QCFG=\"emmtimer\"\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 1, para, sizeof(para));
+               if(strlen(para) != 0) {
+                       return mp_obj_new_str(para, strlen(para));
+               }
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_T3402_obj, qpy_net_get_T3402);
+
+
+STATIC mp_obj_t qpy_net_get_T3412(void)
+{
+    char resp[128] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+QCFG=\"emmtimer\"\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 2, para, sizeof(para));
+               if(strlen(para) != 0) {
+                       return mp_obj_new_str(para, strlen(para));
+               }
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_T3412_obj, qpy_net_get_T3412);
+
+
+STATIC mp_obj_t qpy_net_get_T3324(void)
+{
+    char resp[128] = {0};
+       char para[64] = {0};
+       char cmd[64] = {0};
+       int n = 0;
+       HELIOS_AT_RESP_STATUS_E ret = HELIOS_AT_RESP_OK;
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Atcmd_Send_Sync(0, "AT+CEREG?\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret != HELIOS_AT_RESP_OK) {
+               return mp_obj_new_int(-1);
+       }
+       Helios_Atcmd_Get_Para_Value_Str(resp, 1, 0, para, sizeof(para));
+       if(strlen(para) != 0) {
+               n = atoi(para);
+       }
+       memset(resp, 0 ,sizeof(resp));
+       memset(para, 0 ,sizeof(para));
+       if (n !=4) {
+               MP_THREAD_GIL_EXIT();
+               ret = Helios_Atcmd_Send_Sync(0, "AT+CEREG=4\r\n", NULL, 0, NULL, 10);
+               MP_THREAD_GIL_ENTER();
+               if(ret != HELIOS_AT_RESP_OK) {
+                       return mp_obj_new_int(-1);
+               }
+       }else {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 7, para, sizeof(para));
+               if(strlen(para) != 0) {
+                       return mp_obj_new_str(para, strlen(para));
+               }
+       }
+       MP_THREAD_GIL_EXIT();
+       Helios_Atcmd_Send_Sync(0, "AT+CEREG?\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       Helios_Atcmd_Get_Para_Value_Str(resp, 1, 7, para, sizeof(para));
+       snprintf(cmd, 64, "AT+CEREG=%d\r\n", n);
+       MP_THREAD_GIL_EXIT();
+       ret = Helios_Atcmd_Send_Sync(0, cmd, NULL, 0, NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret != HELIOS_AT_RESP_OK) {
+               return mp_obj_new_int(-1);
+       }
+       return mp_obj_new_str(para, strlen(para));
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_T3324_obj, qpy_net_get_T3324);
+
+
+STATIC mp_obj_t qpy_net_get_TeDRX(void)
+{
+       char resp[128] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+CEDRXRDP\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 1, para, sizeof(para));
+               return mp_obj_new_str(para, strlen(para));
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_TeDRX_obj, qpy_net_get_TeDRX);
+
+STATIC mp_obj_t qpy_net_get_TPTW(void)
+{
+       char resp[128] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+CEDRXRDP\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 3, para, sizeof(para));
+               return mp_obj_new_str(para, strlen(para));
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_TPTW_obj, qpy_net_get_TPTW);
+
+STATIC mp_obj_t qpy_net_get_qRxlevMin(void)
+{
+       char resp[256] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+QCFG=\"sibinfo\"\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 3, para, sizeof(para));
+               if(strlen(para) != 0) {
+                       return mp_obj_new_str(para, strlen(para));
+               }
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_qRxlevMin_obj, qpy_net_get_qRxlevMin);
+
+STATIC mp_obj_t qpy_net_get_reject_cause(void)
+{
+       char resp[128] = {0};
+       char para[64] = {0};
+       MP_THREAD_GIL_EXIT();
+       HELIOS_AT_RESP_STATUS_E ret = Helios_Atcmd_Send_Sync(0, "AT+QCFG=\"emmcause\"\r\n", resp, sizeof(resp), NULL, 10);
+       MP_THREAD_GIL_ENTER();
+       if(ret == HELIOS_AT_RESP_OK) {
+               Helios_Atcmd_Get_Para_Value_Str(resp, 1, 1, para, sizeof(para));
+               return mp_obj_new_str(para, strlen(para));
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_net_get_reject_cause_obj, qpy_net_get_reject_cause);
+#endif
+
+
 STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
        { MP_OBJ_NEW_QSTR(MP_QSTR___name__),    MP_ROM_QSTR(MP_QSTR_net)                                        },
        { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_net_deinit_obj) },
@@ -1801,6 +2492,7 @@ STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_getNetMode),              MP_ROM_PTR(&qpy_net_get_selection_obj)          },      
        { MP_ROM_QSTR(MP_QSTR_getSignal),               MP_ROM_PTR(&qpy_net_get_signal_strength_obj)},
        { MP_ROM_QSTR(MP_QSTR_getCellInfo),     MP_ROM_PTR(&qpy_net_get_cell_info_obj)          },
+       { MP_ROM_QSTR(MP_QSTR_getCellInfos),    MP_ROM_PTR(&qpy_net_get_cell_info_v2_obj)       },
 
        { MP_ROM_QSTR(MP_QSTR_getCi),                   MP_ROM_PTR(&qpy_net_get_cid_obj)                        },
        { MP_ROM_QSTR(MP_QSTR_getLac),                  MP_ROM_PTR(&qpy_net_get_lac_obj)                        },
@@ -1812,16 +2504,18 @@ STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
 
     { MP_ROM_QSTR(MP_QSTR_setApn),     MP_ROM_PTR(&qpy_net_set_apn_obj)        },
     { MP_ROM_QSTR(MP_QSTR_getApn),     MP_ROM_PTR(&qpy_net_get_apn_obj)        },
-
+       #if MICROPY_QPY_MODULE_NET_LED
+       { MP_ROM_QSTR(MP_QSTR_set_networkled_config),   MP_ROM_PTR(&qpy_set_networkled_config_obj)      },
+       #endif
     { MP_ROM_QSTR(MP_QSTR_getServingCi),    MP_ROM_PTR(&qpy_net_get_cid_servingcell_obj) },
        { MP_ROM_QSTR(MP_QSTR_getServingLac),   MP_ROM_PTR(&qpy_net_get_lac_servingcell_obj) },
        { MP_ROM_QSTR(MP_QSTR_getServingMnc),   MP_ROM_PTR(&qpy_net_get_mnc_servingcell_obj) },
        { MP_ROM_QSTR(MP_QSTR_getServingMcc),   MP_ROM_PTR(&qpy_net_get_mcc_servingcell_obj) },
-#if defined(PLAT_Qualcomm) || defined(PLAT_ASR)
+#if defined(PLAT_Qualcomm) || defined(PLAT_ASR)|| MICROPY_QPY_MODULE_NET_BAND
        { MP_ROM_QSTR(MP_QSTR_setBand),                 MP_ROM_PTR(&qpy_net_set_band_obj) },
        { MP_ROM_QSTR(MP_QSTR_getBand),                 MP_ROM_PTR(&qpy_net_get_band_obj) },
 #endif
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
     { MP_ROM_QSTR(MP_QSTR_bandRst),         MP_ROM_PTR(&qpy_net_band_restore_obj) },
 #endif
 
@@ -1832,7 +2526,6 @@ STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
 #endif
 
 #if MICROPY_QPY_MODULE_BACKCELL
-       { MP_ROM_QSTR(MP_QSTR_setBlackCell),         MP_ROM_PTR(&qpy_set_black_cell_obj) },
        { MP_ROM_QSTR(MP_QSTR_addBlackCell),         MP_ROM_PTR(&qpy_add_black_cell_obj) },
        { MP_ROM_QSTR(MP_QSTR_getBlackCell),         MP_ROM_PTR(&qpy_get_black_cell_obj) },
        { MP_ROM_QSTR(MP_QSTR_getBlackCellCfg),         MP_ROM_PTR(&qpy_get_black_cell_cfg_obj) },
@@ -1840,6 +2533,32 @@ STATIC const mp_rom_map_elem_t net_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_deleteBlackCell),         MP_ROM_PTR(&qpy_delete_black_cell_obj) },
 #endif
 
+#if MICROPY_QPY_MODULE_DRX_TIMER
+    { MP_ROM_QSTR(MP_QSTR_setDrxTm),   MP_ROM_PTR(&qpy_net_set_drxtm_obj)      },
+    { MP_ROM_QSTR(MP_QSTR_getDrxTm),   MP_ROM_PTR(&qpy_net_get_drxtm_obj)      },
+#endif
+
+#if MICROPY_QPY_MODULE_JAMDET
+    { MP_ROM_QSTR(MP_QSTR_setJamdetSwitch),    MP_ROM_PTR(&qpy_jamdet_set_switch_obj)  },
+    { MP_ROM_QSTR(MP_QSTR_getJamdetSwitch),    MP_ROM_PTR(&qpy_jamdet_get_switch_obj)  },
+       { MP_ROM_QSTR(MP_QSTR_setJamdetParam),          MP_ROM_PTR(&qpy_jamdet_set_config_obj)  },
+       { MP_ROM_QSTR(MP_QSTR_getJamdetParam),          MP_ROM_PTR(&qpy_jamdet_get_config_obj)  },
+       { MP_ROM_QSTR(MP_QSTR_getJamdetStatus),         MP_ROM_PTR(&qpy_jamdet_get_stauts_obj)  },
+#endif
+
+#if defined(MICROPY_QPY_MODULE_IMS_STATUS)
+    { MP_ROM_QSTR(MP_QSTR_getImsRegister),     MP_ROM_PTR(&qpy_net_get_ims_register_obj) },
+#endif
+
+#if MICROPY_QPY_MODULE_NET_EX
+       { MP_ROM_QSTR(MP_QSTR_getT3402),                 MP_ROM_PTR(&qpy_net_get_T3402_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getT3412),                 MP_ROM_PTR(&qpy_net_get_T3412_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getT3324),                 MP_ROM_PTR(&qpy_net_get_T3324_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getTeDRX),                 MP_ROM_PTR(&qpy_net_get_TeDRX_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getTPTW),                  MP_ROM_PTR(&qpy_net_get_TPTW_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getqRxlevMin),             MP_ROM_PTR(&qpy_net_get_qRxlevMin_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getRejectCause),           MP_ROM_PTR(&qpy_net_get_reject_cause_obj) },
+#endif
 };
 
 STATIC MP_DEFINE_CONST_DICT(net_module_globals, net_module_globals_table);
index 97c0ca6..81a5bed 100644 (file)
@@ -9,7 +9,7 @@
 /* 定义的network全局字典,之后我们添加type和function就要添加在这里 */
 #if MICROPY_QPY_NETWORK_WLAN
 #include "helios_wlan.h"
-extern const mp_obj_type_t wlan_if_type;
+extern const mp_obj_type_t wlan_netif_type;
 #endif
 
 #if MICROPY_QPY_NETWORK_WLAN_5803W
@@ -20,30 +20,20 @@ extern const mp_obj_type_t wlan_ASR5803W_type;
 STATIC const mp_rom_map_elem_t network_globals_table[] = {
     {MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_network)},
 #if MICROPY_QPY_NETWORK_WLAN
-    {MP_OBJ_NEW_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&wlan_if_type)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_WLAN), MP_ROM_PTR(&wlan_netif_type)},
 #endif
 #if MICROPY_QPY_NETWORK_WLAN_5803W
-       {MP_OBJ_NEW_QSTR(MP_QSTR_ASR5803W), MP_ROM_PTR(&wlan_ASR5803W_type)},
+    {MP_OBJ_NEW_QSTR(MP_QSTR_ASR5803W), MP_ROM_PTR(&wlan_ASR5803W_type)},
 #endif
 
 #if MICROPY_QPY_NETWORK_WLAN
-    { MP_ROM_QSTR(MP_QSTR_STA_IF), MP_ROM_INT(HELIOS_WLAN_STATION)},
-    { MP_ROM_QSTR(MP_QSTR_AP_IF), MP_ROM_INT(HELIOS_WLAN_SOFTAP)},
-
-    { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(HELIOS_WLAN_AUTH_OPEN) },
-    { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(HELIOS_WLAN_AUTH_WEP) },
-    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA_PSK) },
-    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA2_PSK) },
-    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA_WPA2_PSK) },
-    { MP_ROM_QSTR(MP_QSTR_AUTH_MAX), MP_ROM_INT(HELIOS_WLAN_AUTH_MAX) },
-
-    { MP_ROM_QSTR(MP_QSTR_STAT_IDLE), MP_ROM_INT(HELIOS_WLAN_AP_STATUS_STOP)},
-    { MP_ROM_QSTR(MP_QSTR_STAT_AP_STARTED), MP_ROM_INT(HELIOS_WLAN_AP_STATUS_STARTED)},
-
-    { MP_ROM_QSTR(MP_QSTR_STAT_STA_STOPPED), MP_ROM_INT(HELIOS_WLAN_STA_STATUS_STOP)},
-    { MP_ROM_QSTR(MP_QSTR_STAT_STA_STARTED), MP_ROM_INT(HELIOS_WLAN_STA_STATUS_START)},
-    { MP_ROM_QSTR(MP_QSTR_STAT_STA_DISCONNECTED), MP_ROM_INT(HELIOS_WLAN_STA_STATUS_DISCON)},
-    { MP_ROM_QSTR(MP_QSTR_STAT_STA_CONNECTED), MP_ROM_INT(HELIOS_WLAN_STA_STATUS_CONNECTED)},
+    { MP_ROM_QSTR(MP_QSTR_NONE_MODE), MP_ROM_INT(HELIOS_WLAN_MODE_NONE)},
+    { MP_ROM_QSTR(MP_QSTR_AP_MODE), MP_ROM_INT(HELIOS_WLAN_MODE_AP)},
+    { MP_ROM_QSTR(MP_QSTR_STA_MODE), MP_ROM_INT(HELIOS_WLAN_MODE_STA)},
+    { MP_ROM_QSTR(MP_QSTR_AP_STA_MODE), MP_ROM_INT(HELIOS_WLAN_MODE_AP_STA)},
+
+    { MP_ROM_QSTR(MP_QSTR_NO_WAIT), MP_ROM_INT(HELIOS_NO_WAIT)},
+    { MP_ROM_QSTR(MP_QSTR_WAIT_FOREVER), MP_ROM_INT(HELIOS_WAIT_FOREVER)},
 #endif
 };
 
@@ -53,8 +43,8 @@ STATIC MP_DEFINE_CONST_DICT(mp_module_network_globals, network_globals_table);
 
 /* 定义一个module类型 */
 const mp_obj_module_t mp_module_network = {
-    .base = {&mp_type_module},    
-    .globals = (mp_obj_dict_t *)&mp_module_network_globals,
+    .base = {&mp_type_module},
+    .globals = (mp_obj_dict_t*)&mp_module_network_globals,
 };
 
 #endif /* MICROPY_QPY_MODULE_NETWORK */
index bc07eac..1018a9d 100644 (file)
@@ -5,8 +5,10 @@
 #include "runtime.h"
 #include "binary.h"
 #include "objarray.h"
+#include "helios_fs.h"
 
 #if MICROPY_QPY_MODULE_POC
+#include "mphalport.h"
 
 #if CONFIG_POC_SLPOC
 #include "modpoc_slpoc.c"
 #elif CONFIG_POC_RDA_BND
 #include "modpocrda.c"
 
+#elif CONFIG_POC_RDA_BND_XIN
+#include "modpocrda.c"
+
+#elif CONFIG_POC_TID
+#include "modpoc_tid.c"
+
 #else 
 
 #include "poc.h"
@@ -35,7 +43,8 @@
         (PTR) = NULL; \
     }
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)
+#if defined(BOARD_EC600MCN_LA_POC_XBND)  || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
 #include "helios_pin.h"
 #include "helios_os.h"
 #include "helios_extint.h"
@@ -103,21 +112,32 @@ typedef struct _poc_obj_t
     c_callback_t register_member_audio_enable_cb;
     c_callback_t register_sos_status_cb;
     c_callback_t register_sos_map_cb;
+    c_callback_t register_recv_sos_alarm_cb;
     c_callback_t register_recv_sos_info_cb;
+    c_callback_t register_recv_report_sos_ack_cb;
+    c_callback_t register_recv_report_sos_ack_timeout_cb;
     c_callback_t register_recv_enclosure_alarm_cb;
     c_callback_t register_recv_broadcast_info_cb;
     c_callback_t login_by_saved_cb;
     #endif
-    #if defined(CONFIG_POC_QS)
+    #if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
     c_callback_t register_error_callback;
     c_callback_t register_online_state_cb;
     c_callback_t register_called_cb;
+    c_callback_t register_get_3days_weather_cb;
     #endif
     #if defined(CONFIG_POC_ZZD) || defined(CONFIG_POC_YDWL)
     c_callback_t notify_spker_callback;
     #endif
     #if defined(CONFIG_POC_YDWL)
     c_callback_t tts_init_callback;
+    c_callback_t sos_callback;
+    c_callback_t invite_info_callback;
+    c_callback_t cell_locator_info_callback;
+    c_callback_t ctrl_pa_callback;
+    c_callback_t weather_info_callback;
+    c_callback_t map_png_callback;
+    c_callback_t login_sta_callback;
     #endif
 } poc_obj_t;
 
@@ -170,10 +190,11 @@ void qpy_poc_msg_proc( void * msg ){
     }
     if(cb_msg->len == 1) {
         arg = poc_cb[0];
+               mp_sched_schedule_ex(&cb_msg->callback, arg);
     } else {
-        arg = mp_obj_new_list(cb_msg->len, poc_cb);
+               mp_sched_schedule_ex(&cb_msg->callback,  mp_obj_new_list(cb_msg->len, poc_cb));
     }
-    mp_sched_schedule_ex(&cb_msg->callback,  arg);
+    
     if(poc_cb) {
         free(poc_cb);
         poc_cb = NULL;
@@ -280,26 +301,167 @@ int qpy_poc_calluser_callback(int ret) {
     return ret;
 }
 
-void qpy_poc_register_notify_spker_callback(int allow_speak, poc_uid_t uid) {
+void qpy_poc_register_notify_spker_callback(int allow_speak, poc_uid_t uid, char * name) {
     
     if(!(poc_obj.notify_spker_callback.cb)) return;
-    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(3);
 
     poc_para->para[0].type = POC_CAL_ELEM_INT;
     poc_para->para[0].data = calloc(1, sizeof(int));
     poc_para->para[1].type = POC_CAL_ELEM_INT;
     poc_para->para[1].data = calloc(1, sizeof(int));
+    poc_para->para[2].type = POC_CAL_ELEM_STR;
+    poc_para->para[2].data = calloc(1, strlen(name)+1);
 
-    if(!(poc_para->para[0].data) || !(poc_para->para[1].data)) {
+    if(!(poc_para->para[0].data) || !(poc_para->para[1].data) || !(poc_para->para[2].data)) {
         POC_LOG("buf calloc fail\n");
         st_CallBack_POC_free(poc_para);
         return;
     }
     *(int*)poc_para->para[0].data = allow_speak;
     *(int*)poc_para->para[1].data = uid;
+    memcpy(poc_para->para[2].data, name, strlen(name));
     poc_para->callback = poc_obj.notify_spker_callback;
     qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
 }
+
+void qpy_poc_register_sos_callback(char * sos_name) {
+    if(!(poc_obj.sos_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
+
+    poc_para->para[0].type = POC_CAL_ELEM_STR;
+    poc_para->para[0].data = calloc(1, strlen(sos_name)+1);
+
+    if(!(poc_para->para[0].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    memcpy(poc_para->para[0].data, sos_name, strlen(sos_name));
+    poc_para->callback = poc_obj.sos_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+void qpy_poc_register_ctrl_pa_callback(int pa) {
+    if(!(poc_obj.ctrl_pa_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
+
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+
+    if(!(poc_para->para[0].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(int*)poc_para->para[0].data = pa;
+    poc_para->callback = poc_obj.ctrl_pa_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+
+void qpy_poc_register_weather_info_callback(void) {
+    if(!(poc_obj.weather_info_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
+
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+
+    if(!(poc_para->para[0].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(int*)poc_para->para[0].data = 1;
+    poc_para->callback = poc_obj.weather_info_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+
+void qpy_poc_register_map_png_callback(int state) {
+    if(!(poc_obj.map_png_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
+
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+
+    if(!(poc_para->para[0].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(int*)poc_para->para[0].data = state;
+    poc_para->callback = poc_obj.map_png_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+
+void qpy_poc_register_login_sta_callback(int state, int uid, char* name) {
+    if(!(poc_obj.login_sta_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(3);
+
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    poc_para->para[1].type = POC_CAL_ELEM_INT;
+    poc_para->para[1].data = calloc(1, sizeof(int));
+    poc_para->para[2].type = POC_CAL_ELEM_STR;
+    poc_para->para[2].data = calloc(1, strlen(name)+1);
+
+    if(!(poc_para->para[0].data) || !(poc_para->para[1].data) || !(poc_para->para[2].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(int*)poc_para->para[0].data = state;
+    *(int*)poc_para->para[1].data = uid;
+    memcpy(poc_para->para[2].data, name, strlen(name));
+    poc_para->callback = poc_obj.login_sta_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+
+void qpy_poc_invite_info_callback(int invite_info, char * user_name) {
+    
+    if(!(poc_obj.invite_info_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
+
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    poc_para->para[1].type = POC_CAL_ELEM_STR;
+    poc_para->para[1].data = calloc(1, strlen(user_name)+1);
+
+    if(!(poc_para->para[0].data) || !(poc_para->para[0].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(int*)poc_para->para[0].data = invite_info;
+    memcpy(poc_para->para[1].data, user_name, strlen(user_name));
+    poc_para->callback = poc_obj.invite_info_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
+void qpy_poc_cell_locator_info_callback(float lat, float lng) {
+    
+    if(!(poc_obj.cell_locator_info_callback.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
+
+    poc_para->para[0].type = POC_CAL_ELEM_FLOAT;
+    poc_para->para[0].data = calloc(1, sizeof(float));
+    poc_para->para[1].type = POC_CAL_ELEM_FLOAT;
+    poc_para->para[1].data = calloc(1, sizeof(float));
+
+    if(!(poc_para->para[0].data) || !(poc_para->para[1].data)) {
+        POC_LOG("buf calloc fail\n");
+        st_CallBack_POC_free(poc_para);
+        return;
+    }
+    *(float*)poc_para->para[0].data = lat;
+    *(float*)poc_para->para[1].data = lng;
+    poc_para->callback = poc_obj.cell_locator_info_callback;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+}
+
 #endif
 #if defined(CONFIG_POC_ZZD)
 
@@ -432,7 +594,7 @@ void qpy_poc_egister_upgrade_callback(int ret) {
     qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
 }
 
-#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_BND_XIN)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_BND_XIN) || defined(CONFIG_POC_QS_R07)
 
 int qpy_poc_calluser_callback(int ret) {
     if(poc_obj.calluser_callback.cb) {
@@ -461,7 +623,7 @@ STATIC void qpy_poc_register_error_callback(const char *info){
 
 }
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
 STATIC void qpy_poc_register_online_state_cb_callback(int result){
 
     if(!(poc_obj.register_online_state_cb.cb)) return;
@@ -478,22 +640,38 @@ STATIC void qpy_poc_register_online_state_cb_callback(int result){
     return;
 }
 
-STATIC void qpy_poc_register_called_cb_callback(const char * data){
+STATIC void qpy_poc_register_called_cb_callback(int result){
 
     if(!(poc_obj.register_called_cb.cb)) return;
     st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
     if(poc_para == NULL) {
         return;
     }
-    poc_para->para[0].type = POC_CAL_ELEM_STR;
-    poc_para->para[0].data = calloc(1, strlen(data)+1);
-    memcpy(poc_para->para[0].data, data, strlen(data));
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(POC_CAL_ELEM_INT));
+    *(int*)poc_para->para[0].data = result;
     poc_para->callback = poc_obj.register_called_cb;
     qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
 
     return;
 }
 
+STATIC void qpy_poc_get_3days_weather_cb_callback(void) {
+
+    if(!(poc_obj.register_get_3days_weather_cb.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(1);
+    if(poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(POC_CAL_ELEM_INT));
+    *(int*)poc_para->para[0].data = 1;
+    poc_para->callback = poc_obj.register_get_3days_weather_cb;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+
+    return;
+}
+
 #endif
 
 #endif
@@ -507,10 +685,17 @@ int location_switch= 0;
 int report_rate = 0;
 STATIC void qpy_poc_cell_location_change_callback(int location_switch, int report_rate);
 
+#if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
 STATIC void qpy_poc_register_sos_status_callback(char send_sos_status);
 STATIC void qpy_poc_register_sos_map_callback(char *z8filename,char *z12filename, char *z16filename,char is_sos_map);
+STATIC void qpy_poc_register_recv_sos_alarm_callback(uint32_t reporter, uint64_t uuid, double lon , double lat, uint32_t gid);
 STATIC void qpy_poc_register_recv_sos_info_callback(char *sendname, char *timestamp, double lon, double lat);
+STATIC void qpy_poc_register_recv_report_sos_ack_callback(int result);
+STATIC void qpy_poc_register_recv_report_sos_ack_timeout_callback(void);
 STATIC void qpy_poc_register_recv_enclosure_alarm_callback(int alarm, char *tips);
+#endif
+STATIC int check_datetime_is_right(bnd_time_t timer);
 
 static void qpy_poc_prefunction_cell_location_change_cb(int location_switch_in, int report_rate_in){
     
@@ -872,7 +1057,7 @@ STATIC mp_obj_t qpy_poc_init(mp_obj_t arg)
        
     poc_ops->register_listupdate_cb(qpy_poc_register_listupdate_callback);
 
-    #if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+    #if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL) && !defined(CONFIG_POC_QS_R07)
     poc_ops->register_upgrade_cb(qpy_poc_egister_upgrade_callback);
 
     poc_ops->register_member_change_cb(qpy_poc_register_member_change_callback);
@@ -891,28 +1076,43 @@ STATIC mp_obj_t qpy_poc_init(mp_obj_t arg)
     poc_ops->register_request_lbs_info_cb(qpy_poc_register_request_lbs_info_callback);
        poc_ops->register_error_cb(qpy_poc_register_error_callback);
     poc_ops->register_member_audio_enable_cb(qpy_poc_register_member_audio_enable_callback);
+#if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
     poc_ops->register_sos_status_cb(qpy_poc_register_sos_status_callback);
     poc_ops->register_sos_map_cb(qpy_poc_register_sos_map_callback);
+    poc_ops->register_recv_sos_alarm_cb(qpy_poc_register_recv_sos_alarm_callback);
     poc_ops->register_recv_sos_info_cb(qpy_poc_register_recv_sos_info_callback);
+    poc_ops->register_recv_report_sos_ack_cb(qpy_poc_register_recv_report_sos_ack_callback);
+    poc_ops->register_recv_report_sos_ack_timeout_cb(qpy_poc_register_recv_report_sos_ack_timeout_callback);
     poc_ops->register_recv_enclosure_alarm_cb(qpy_poc_register_recv_enclosure_alarm_callback);
+#endif
     poc_ops->register_recv_broadcast_info_cb(qpy_poc_register_recv_broadcast_info_callback);
     #endif  //CONFIG_POC_BND_XIN
     #endif   // CONFIG_POC_QS
     #if defined(CONFIG_POC_YDWL)
     poc_ops->register_notify_spker_cb(qpy_poc_register_notify_spker_callback);
+    poc_ops->register_sos_cb(qpy_poc_register_sos_callback);
+    poc_ops->register_ctrl_pa_cb(qpy_poc_register_ctrl_pa_callback);
+    poc_ops->register_invite_info_cb(qpy_poc_invite_info_callback);
+    poc_ops->register_cell_locator_cb(qpy_poc_cell_locator_info_callback);
+    poc_ops->register_weather_info_cb(qpy_poc_register_weather_info_callback);
+    poc_ops->register_map_png_cb(qpy_poc_register_map_png_callback);
+    poc_ops->register_login_sta_cb(qpy_poc_register_login_sta_callback);
     #endif
 
-    #if defined(CONFIG_POC_QS)
+    #if defined(CONFIG_POC_QS)  || defined(CONFIG_POC_QS_R07)
     poc_ops->register_error_cb(qpy_poc_register_error_callback);
     poc_ops->register_online_state_cb(qpy_poc_register_online_state_cb_callback);
     poc_ops->register_called_cb(qpy_poc_register_called_cb_callback);
+    poc_ops->register_get_3days_weather_cb(qpy_poc_get_3days_weather_cb_callback);
     #endif
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1602)
        if(0 != Helios_Nw_SetWorkMode(HELIOS_NW_WORKMODE_POC)) {
                POC_LOG("set poc workmode fail\n");
        }
 #endif
-#if defined(BOARD_EC600MCN_LA_POC_XBND)//彬其定制
+#if defined(BOARD_EC600MCN_LA_POC_XBND)  || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)//彬其定制
         if(msg_poc_speak_t == 0)
         {
                 msg_poc_speak_t = Helios_MsgQ_Create(10, sizeof(unsigned char));
@@ -942,7 +1142,7 @@ STATIC mp_obj_t qpy_poc_free()
        POC_LOG("poc free\n");
        poc_ops_t *poc_ops = poc_get_ops();
     poc_ops->free();
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)        
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)        || defined(PLAT_ASR_1602)
        if(0 != Helios_Nw_SetWorkMode(HELIOS_NW_WORKMODE_NORMAL)) {
                POC_LOG("set normal workmode fail\n");
        }
@@ -1051,9 +1251,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_group_getbyid_obj, qpy_poc_group_getbyi
 STATIC mp_obj_t qpy_poc_speak(mp_obj_t value) 
 {
        if(mp_obj_get_int(value) == 1) {
+#ifdef CONFIG_TTS
                Helios_TTS_Stop();
+#endif
        }
-#if !defined(BOARD_EC600MCN_LA_POC_XBND)//20221102 jimmy  彬其 speak在底层调
+#if !(defined(BOARD_EC600MCN_LA_POC_XBND)  || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+   || defined(BOARD_EC600MLA_LA_POC_XBND))//20221102 jimmy  彬其 speak在底层调
 
        poc_ops_t *poc_ops = poc_get_ops();
     int ret = 0;
@@ -1079,13 +1282,28 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_speak_obj, qpy_poc_speak);
 //speak end
 
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)
+#if defined(BOARD_EC600MCN_LA_POC_XBND) || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)
+static c_callback_t *poc_speak_callback = NULL;
+
+STATIC mp_obj_t qpy_pocspeak_set_callback(mp_obj_t callback)
+{
+       
+       static c_callback_t cb = {0};
+    memset(&cb, 0, sizeof(c_callback_t));
+       poc_speak_callback = &cb;
+       mp_sched_schedule_callback_register(poc_speak_callback, callback);
+       
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_pocspeak_set_callback_obj, qpy_pocspeak_set_callback);
 
 void poc_speak_ctl_entry(void* p)
 {
        int ret = 0;
     unsigned char data =0;
        poc_ops_t *poc_ops = poc_get_ops();
+       int result = 0;
     while(1)
         {
                ret = Helios_MsgQ_Get(msg_poc_speak_t, &data, sizeof(unsigned char), HELIOS_WAIT_FOREVER);
@@ -1098,18 +1316,26 @@ void poc_speak_ctl_entry(void* p)
         {
                        if(poc_ops)
                        {
-                               poc_ops->speak(0);
+                               result = poc_ops->speak(0);
                        }
         }
                else
                {
                        if(poc_ops)
                        {
-                               poc_ops->speak(1);
+                               result = poc_ops->speak(1);
                        }
                }
-        }
 
+               st_CallBack_PocSpeak *poc_speak_t = malloc(sizeof(st_CallBack_PocSpeak));
+               if((NULL != poc_speak_t) && poc_speak_callback)
+               {                                                                
+                   poc_speak_t->speak_op = data;                                                             
+                   poc_speak_t->speak_result = result;                                                            
+                   poc_speak_t->callback = *poc_speak_callback;
+                       qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POCSPEAK, poc_speak_t); 
+               }
+    }
 }
 
 //set poc speak direct / read speak direct or not
@@ -1204,8 +1430,8 @@ static void debounce_timer_isr(uint32_t p)
 {
        extint_obj_t *pt = (extint_obj_t *)p;
        int edge = HELIOS_EXTINT_RISING;
-       if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
-       {
+       //if(ptt_cfg.speak_deal_mode == DEAL_BY_CALLBACK)
+       //{
                if(pt->mode != HELIOS_EDGE_BOTH)
                {
                        return;
@@ -1215,16 +1441,17 @@ static void debounce_timer_isr(uint32_t p)
                        edge = HELIOS_EXTINT_FALLING;                                                                                          
                }                                                                                   
 
-               if((ptt_cfg.pressed == 0) || (ptt_cfg.pressed & (1<<(pt->ptt_num))))                                                                                                    
-               {                                                                                                                                                                                                                               
-                       if(pt->callback.cb != mp_const_none &&                               
+               if(pt->callback.cb != mp_const_none &&                               
                                            ((mp_sched_num_pending() < MICROPY_SCHEDULER_DEPTH)))                       
-                       {                                                                                                   
-                               EXTINT_CALLBACK_OP(pt, edge);                                       
-                       }               
+               {
+                       EXTINT_CALLBACK_OP(pt, edge);                                       
+               }
+
+               if((ptt_cfg.pressed == 0) || (ptt_cfg.pressed & (1<<(pt->ptt_num))))                                                                                                    
+               {                       
                        extra_deal(pt,edge);  
                }
-       }
+       //}
        Helios_ExtInt_Enable(pt->line);                                       
 }
 
@@ -1265,10 +1492,10 @@ STATIC mp_obj_t qpy_poc_ptt_cfg(size_t n_args,const mp_obj_t *args)
        //helios_debug("qpy_poc_ptt_cfg n_args:%d\r\n",n_args);
        if((n_args > 0) && (n_args <= 5))//set ptt, max support ptt key number:5
        {
-               if(ptt_cfg.speak_deal_mode == DEAL_BY_USER)
-               {
-                       mp_raise_ValueError("mode error");
-               }
+               //if(ptt_cfg.speak_deal_mode == DEAL_BY_USER)
+               //{
+               //      mp_raise_ValueError("mode error");
+               //}
 
                mp_obj_t *items;
                memset(&ptt_cfg.key_cfg,0,sizeof(ptt_cfg.key_cfg));
@@ -1308,13 +1535,13 @@ STATIC mp_obj_t qpy_poc_ptt_cfg(size_t n_args,const mp_obj_t *args)
                                }
                                if(extint_obj[i] == NULL)
                                {
-                                       extint_obj[i] = m_new_obj_with_finaliser(extint_obj_t);
+                                       extint_obj[i] = malloc(sizeof(extint_obj_t));
                                }
 
                                extint_obj[i]->line = mp_obj_get_int(items[1]);
                                extint_obj[i]->mode = HELIOS_EDGE_BOTH;
                                extint_obj[i]->pull = (ptt_cfg.key_cfg[i].key_info.gpio_key_info.level_press == PRESS_LEVEL_LOW)?HELIOS_PULL_UP:HELIOS_PULL_DOWN;
-                               extint_obj[i]->press_lvl = mp_obj_get_int(items[2]);
+                               extint_obj[i]->press_lvl = (PTT_KEY_LEVEL_T)mp_obj_get_int(items[2]);
                                extint_obj[i]->ptt_num  = i;
                                mp_sched_schedule_callback_register(&extint_obj[i]->callback, items[3]);
                                
@@ -1330,12 +1557,22 @@ STATIC mp_obj_t qpy_poc_ptt_cfg(size_t n_args,const mp_obj_t *args)
                                if(0 != Helios_ExtInt_Init((Helios_GPIONum) extint_obj[i]->line,  &extint_struct)) 
                                {
                                        ptt_cfg = ptt_cfg_back;
+                                       if(extint_obj[i])
+                                       {
+                                               free(extint_obj[i]);
+                                               extint_obj[i] = NULL;
+                                       }
                                        mp_raise_ValueError("Interrupt initialization failed");
                                }
                                ret = Helios_ExtInt_Enable((Helios_GPIONum) extint_obj[i]->line);
                                if(ret)
                                {
                                        ptt_cfg = ptt_cfg_back;
+                                       if(extint_obj[i])
+                                       {
+                                               free(extint_obj[i]);
+                                               extint_obj[i] = NULL;
+                                       }
                                return mp_obj_new_int(ret);
                                }
 
@@ -1423,6 +1660,34 @@ STATIC void qpy_poc_register_sos_map_callback(char *z8filename,char *z12filename
     return;
 }
 
+STATIC void qpy_poc_register_recv_sos_alarm_callback(uint32_t reporter, uint64_t uuid, double lon , double lat, uint32_t gid){
+    if(!(poc_obj.register_recv_sos_alarm_cb.cb)) return;
+    st_CallBack_POC *poc_para = qpy_poc_pushCallBack(5);
+    if(poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    poc_para->para[1].type = POC_CAL_ELEM_UINT64;
+    poc_para->para[1].data = (uint64_t*)calloc(1, sizeof(uint64_t));
+    poc_para->para[2].type = POC_CAL_ELEM_FLOAT;
+    poc_para->para[2].data = calloc(1, sizeof(float));
+    poc_para->para[3].type = POC_CAL_ELEM_FLOAT;
+    poc_para->para[3].data = calloc(1, sizeof(float));
+    poc_para->para[4].type = POC_CAL_ELEM_INT;
+    poc_para->para[4].data = calloc(1, sizeof(int));
+
+    *(int*)poc_para->para[0].data = reporter;
+    *(uint64_t*)poc_para->para[1].data = uuid;
+    *(float*)poc_para->para[2].data = lon;
+    *(float*)poc_para->para[3].data = lat;
+    *(int*)poc_para->para[4].data = gid;
+
+    poc_para->callback = poc_obj.register_recv_sos_alarm_cb;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    return;
+}
+
 STATIC void qpy_poc_register_recv_sos_info_callback(char *sendname, char *timestamp, double lon, double lat){
     if(!(poc_obj.register_recv_sos_info_cb.cb)) return;
     st_CallBack_POC *poc_para = qpy_poc_pushCallBack(4);
@@ -1448,6 +1713,36 @@ STATIC void qpy_poc_register_recv_sos_info_callback(char *sendname, char *timest
     return;
 }
 
+STATIC void qpy_poc_register_recv_report_sos_ack_callback(int result) {
+    if (!(poc_obj.register_recv_report_sos_ack_cb.cb)) return;
+    st_CallBack_POC* poc_para = qpy_poc_pushCallBack(1);
+    if (poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    *(int*)poc_para->para[0].data = result;
+
+    poc_para->callback = poc_obj.register_recv_report_sos_ack_cb;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    return;
+}
+
+STATIC void qpy_poc_register_recv_report_sos_ack_timeout_callback(void) {
+    if (!(poc_obj.register_recv_report_sos_ack_timeout_cb.cb)) return;
+    st_CallBack_POC* poc_para = qpy_poc_pushCallBack(1);
+    if (poc_para == NULL) {
+        return;
+    }
+    poc_para->para[0].type = POC_CAL_ELEM_INT;
+    poc_para->para[0].data = calloc(1, sizeof(int));
+    *(int*)poc_para->para[0].data = 1;
+
+    poc_para->callback = poc_obj.register_recv_report_sos_ack_timeout_cb;
+    qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    return;
+}
+
 STATIC void qpy_poc_register_recv_enclosure_alarm_callback(int alarm, char *tips){
     if(!(poc_obj.register_recv_enclosure_alarm_cb.cb)) return;
     st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
@@ -1483,7 +1778,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_tone_switch_obj, qpy_poc_set_tone_s
 #endif
 //tone switch end
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
 STATIC mp_obj_t qpy_poc_set_tone_CodeGain(mp_obj_t value) 
 {
        poc_ops_t *poc_ops = poc_get_ops();
@@ -1493,67 +1788,968 @@ STATIC mp_obj_t qpy_poc_set_tone_CodeGain(mp_obj_t value)
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_tone_codeGain_obj, qpy_poc_set_tone_CodeGain);
-#endif
 
-//calluser
+STATIC mp_obj_t qpy_poc_get_playing_status() 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = -1;
+    ret = poc_ops->get_playing_status();
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_playing_status_obj, qpy_poc_get_playing_status);
 
-STATIC mp_obj_t qpy_poc_calluser(mp_obj_t poc_uid, mp_obj_t poc_cb)
+STATIC mp_obj_t qpy_poc_get_recording_status() 
 {
        poc_ops_t *poc_ops = poc_get_ops();
+    int ret = -1;
+    ret = poc_ops->get_recording_status();
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_recording_status_obj, qpy_poc_get_recording_status);
 
-    int ret = 0;
-       
-    int uid = mp_obj_get_int(poc_uid);
-    if( uid <= 0 )
-    {
-        return mp_obj_new_int(-1);
-    }
+STATIC mp_obj_t qpy_poc_check_update_werther() 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->check_update_werther();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_check_update_werther_obj, qpy_poc_check_update_werther);
 
-       POC_LOG("poc call user uid %d",uid);
+STATIC mp_obj_t qpy_poc_get_Weather_info() 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+       int Temp = 0;
+    char WeatherBytes[16] = {0};
+    char WindDirectionBytes[16] = {0};
+    char WindClassBytes[16] = {0};
+    char CityBytes[16] = {0};
+
+       if(poc_ops->get_weather_info(&Temp, WeatherBytes, sizeof(WeatherBytes), WindDirectionBytes, sizeof(WindDirectionBytes),
+        WindClassBytes, sizeof(WindClassBytes), CityBytes, sizeof(CityBytes)) == 1) {
+        mp_obj_t weather_info_list[5] = {
+            mp_obj_new_int(Temp), 
+            mp_obj_new_str(WeatherBytes, strlen(WeatherBytes)), 
+            mp_obj_new_str(WindDirectionBytes, strlen(WindDirectionBytes)), 
+            mp_obj_new_str(WindClassBytes, strlen(WindClassBytes)), 
+            mp_obj_new_str(CityBytes, strlen(CityBytes))
+        };
+
+        return mp_obj_new_list(5, weather_info_list);
+       }       
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_Weather_info_obj, qpy_poc_get_Weather_info);
+
+STATIC mp_obj_t qpy_poc_get_3days_Weather_info() 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+       int todayMinTemp = 0;
+    int todayMaxTemp = 0;
+    int TomorrowMinTemp = 0;
+    int TomorrowMaxTemp = 0;
+    int DayAfterTomorrowMinTemp = 0;
+    int DayAfterTomorrowMaxTemp = 0;
+
+    char WeatherToday[32] = {0};
+    char WeatherTomorrow[32] = {0};
+    char WeatherDayAfterTomorrow[32] = {0};
     
-    mp_sched_schedule_callback_register(&(poc_obj.calluser_callback), poc_cb);
+    int ret = poc_ops->get_3days_weather_info(WeatherToday, 32, &todayMinTemp, &todayMaxTemp, 
+                                        WeatherTomorrow, 32, &TomorrowMinTemp, &TomorrowMaxTemp,
+                                        WeatherDayAfterTomorrow, 32, &DayAfterTomorrowMinTemp, &DayAfterTomorrowMaxTemp);
 
-    ret = poc_ops->calluser(uid,qpy_poc_calluser_callback);
+    POC_LOG("get_3days_weather_info ret %d",ret);
+       if(ret == 1) {
 
-    return mp_obj_new_int(ret);
+        mp_obj_t weather_info_list[9] = {
+            mp_obj_new_str(WeatherToday, strlen(WeatherToday)), 
+            mp_obj_new_int(todayMinTemp), 
+            mp_obj_new_int(todayMaxTemp),
+
+            mp_obj_new_str(WeatherTomorrow, strlen(WeatherTomorrow)), 
+            mp_obj_new_int(TomorrowMinTemp), 
+            mp_obj_new_int(TomorrowMaxTemp), 
+
+            mp_obj_new_str(WeatherDayAfterTomorrow, strlen(WeatherDayAfterTomorrow)), 
+            mp_obj_new_int(DayAfterTomorrowMinTemp), 
+            mp_obj_new_int(DayAfterTomorrowMaxTemp),
+        };
+
+        return mp_obj_new_list(9, weather_info_list);
+       }       
+    return mp_const_none;
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_calluser_obj, qpy_poc_calluser);
-//calluser end
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_3days_Weather_info_obj, qpy_poc_get_3days_Weather_info);
 
-#if !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
-//group_getbyindexr
-STATIC mp_obj_t qpy_poc_group_getbyindex(mp_obj_t value) 
+STATIC mp_obj_t qpy_poc_get_is_support_weather(void) 
 {
        poc_ops_t *poc_ops = poc_get_ops();
-    int ret = 0;
-    group_t group_info = {0};
-    int index = mp_obj_get_int(value);
-       ret = poc_ops->group_getbyindex(index, &group_info);
-       
-       POC_LOG("qpy_poc_group_getbyindex ret = %d",ret);
-       if(ret != 0 || group_info.name == NULL) return mp_obj_new_int(-1);
-    
-    mp_obj_t group_info_list[4] = {
-                       mp_obj_new_int(group_info.gid), 
-                       mp_obj_new_str(group_info.name, strlen(group_info.name)), 
-                       mp_obj_new_int(group_info.type), 
-                       mp_obj_new_int(group_info.index)};
+    return mp_obj_new_int(poc_ops->get_is_support_weather());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_is_support_weather_obj, qpy_poc_get_is_support_weather);
 
-    return mp_obj_new_list(4, group_info_list);
+
+STATIC mp_obj_t qpy_poc_set_is_support_weather(mp_obj_t is_enable_obj) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int is_enable = mp_obj_get_int(is_enable_obj);
+    poc_ops->set_is_support_weather(is_enable);
+    return mp_const_none;
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_group_getbyindex_obj, qpy_poc_group_getbyindex);
-//group_getbyindexr end
-#endif
-#if !defined(CONFIG_POC_YDWL)
-//member_getbyid
-STATIC mp_obj_t qpy_poc_member_getbyid(mp_obj_t value) 
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_is_support_weather_obj, qpy_poc_set_is_support_weather);
+
+STATIC mp_obj_t qpy_poc_send_addr_request(void) 
 {
        poc_ops_t *poc_ops = poc_get_ops();
-    int ret = 0;
-    member_t member_info = {0};
-    int uid = mp_obj_get_int(value);
-       ret = poc_ops->member_getbyid(uid, &member_info);
-       
+       poc_ops->send_address_request();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_send_addr_request_obj, qpy_poc_send_addr_request);
+
+
+STATIC mp_obj_t qpy_poc_get_address_data(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+       char addrbuff[128+1] = {0};
+       if(poc_ops->get_address_data(addrbuff, (sizeof(addrbuff)-1)) == 1) {
+               return mp_obj_new_str(addrbuff, strlen(addrbuff));
+       }
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_address_data_obj, qpy_poc_get_address_data);
+
+
+STATIC mp_obj_t qpy_poc_taskrun(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->taskrun();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_taskrun_obj, qpy_poc_taskrun);
+
+STATIC mp_obj_t qpy_poc_setaccountandpassword(mp_obj_t account,mp_obj_t password,mp_obj_t aliTestServerIndex) 
+{
+    if ( !mp_obj_is_str(account) || !mp_obj_is_str(password) )
+    {
+        return mp_const_false;
+    }
+    const char * in_account = mp_obj_str_get_str(account);
+    const char * in_password = mp_obj_str_get_str(password);
+       int in_aliTestServerIndex = (int)mp_obj_get_int(aliTestServerIndex);
+    poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->setaccountandpassword(in_account,in_password,in_aliTestServerIndex);
+       return mp_const_true;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_setaccountandpassword_obj, qpy_poc_setaccountandpassword);
+
+STATIC mp_obj_t qpy_poc_exitsingleormulticall(mp_obj_t args)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(args)){
+        return mp_obj_new_int(-1);
+    }
+    int isNeedSendExitReq = mp_obj_get_int(args);
+    poc_ops->exitsingleormulticall(isNeedSendExitReq);
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_exitsingleormulticall_obj, qpy_poc_exitsingleormulticall);
+
+STATIC mp_obj_t qpy_poc_refreshmulticallmember(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshmulticallmember();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshmulticallmember_obj, qpy_poc_refreshmulticallmember);
+
+STATIC mp_obj_t qpy_poc_getisintempgroup(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getisintempgroup());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getisintempgroup_obj, qpy_poc_getisintempgroup);
+
+STATIC mp_obj_t qpy_poc_getissinglecall(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getissinglecall());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getissinglecall_obj, qpy_poc_getissinglecall);
+
+
+STATIC mp_obj_t qpy_poc_getismulticall(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getismulticall());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getismulticall_obj, qpy_poc_getismulticall);
+
+
+STATIC mp_obj_t qpy_poc_getmulticallid(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getmulticallid());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getmulticallid_obj, qpy_poc_getmulticallid);
+
+STATIC mp_obj_t qpy_poc_getisactivesinglecall(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getisactivesinglecall());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getisactivesinglecall_obj, qpy_poc_getisactivesinglecall);
+
+STATIC mp_obj_t qpy_poc_getisactivemulticall(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getisactivemulticall());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getisactivemulticall_obj, qpy_poc_getisactivemulticall);
+
+STATIC mp_obj_t qpy_poc_getactivesingleormulticallusercount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getactivesingleormulticallusercount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getactivesingleormulticallusercount_obj, qpy_poc_getactivesingleormulticallusercount);
+
+
+STATIC mp_obj_t qpy_poc_getsingleormulticalluserdata(mp_obj_t in_index) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_index)){
+        return mp_obj_new_int(-1);
+    }
+    int index = mp_obj_get_int(in_index);
+    int pUserId = 0;
+    char status[64] = {0};
+    char utf8Name[64] = {0};
+
+    poc_ops->getsingleormulticalluserdata(index, &pUserId, &status, utf8Name,sizeof(utf8Name));
+
+    mp_obj_t singleormulticalluserdata_list[3] = {
+        mp_obj_new_int(pUserId),
+        mp_obj_new_str(status, strlen(status)), 
+        mp_obj_new_str(utf8Name, strlen(utf8Name)), 
+    };
+
+    return mp_obj_new_list(3, singleormulticalluserdata_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getsingleormulticalluserdata_obj, qpy_poc_getsingleormulticalluserdata);
+
+STATIC mp_obj_t qpy_poc_getsinglegroupdata(mp_obj_t in_index) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_index)){
+        return mp_obj_new_int(-1);
+    }
+    int index = mp_obj_get_int(in_index);
+       int groupId = 0;
+    char pUtf8NameBuf[64] = {0};
+
+       int isTerminalGroup = 0;
+       int isMeCreate = 0;
+
+       int terminalGroupId = 0;
+
+    poc_ops->getsinglegroupdata(index, &groupId, pUtf8NameBuf,sizeof(pUtf8NameBuf),&isTerminalGroup,&isMeCreate);
+
+    mp_obj_t singlegroupdata_list[4] = {
+        mp_obj_new_int(groupId), 
+        mp_obj_new_str(pUtf8NameBuf, strlen(pUtf8NameBuf)), 
+        mp_obj_new_int(isTerminalGroup), 
+        mp_obj_new_int(isMeCreate), 
+
+    };
+
+    return mp_obj_new_list(4, singlegroupdata_list);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getsinglegroupdata_obj, qpy_poc_getsinglegroupdata);
+
+
+STATIC mp_obj_t qpy_poc_getcurrentgroupid(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getcurrentgroupid());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getcurrentgroupid_obj, qpy_poc_getcurrentgroupid);
+
+STATIC mp_obj_t qpy_poc_getcurrentgroupnamemutex(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    char pUtf8NameBuf[64] = {0};
+    poc_ops->getcurrentgroupnamemutex(pUtf8NameBuf,sizeof(pUtf8NameBuf));
+
+    mp_obj_t currentgroupnamemutex_list[2] = {
+
+        mp_obj_new_str(pUtf8NameBuf, strlen(pUtf8NameBuf)), 
+        mp_obj_new_int(sizeof(pUtf8NameBuf)), 
+    };
+    return mp_obj_new_list(2, currentgroupnamemutex_list);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getcurrentgroupnamemutex_obj, qpy_poc_getcurrentgroupnamemutex);
+
+    // void   (*refreshgrouplist)(void);
+STATIC mp_obj_t qpy_poc_refreshgrouplist(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshgrouplist();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshgrouplist_obj, qpy_poc_refreshgrouplist);
+
+    // int    (*getcurrentgroupmemberlistcount)(void);
+STATIC mp_obj_t qpy_poc_getcurrentgroupmemberlistcount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getcurrentgroupmemberlistcount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getcurrentgroupmemberlistcount_obj, qpy_poc_getcurrentgroupmemberlistcount);
+
+STATIC mp_obj_t qpy_poc_getcurrentgrouponlinemembercount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getcurrentgrouponlinemembercount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getcurrentgrouponlinemembercount_obj, qpy_poc_getcurrentgrouponlinemembercount);
+
+STATIC mp_obj_t qpy_poc_getcurrentgroupmemberuserdata(mp_obj_t in_groupMemberIndex) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupMemberIndex)){
+        return mp_obj_new_int(-1);
+    }
+    int groupMemberIndex = mp_obj_get_int(in_groupMemberIndex);
+       unsigned int MemberUserId = 0;
+    char MemberStatus[64] = {0};
+    char Utf8MemberNameBuffer[64] = {0};
+
+    poc_ops->getcurrentgroupmemberuserdata(groupMemberIndex, &MemberUserId, MemberStatus,(unsigned char*)Utf8MemberNameBuffer,sizeof(Utf8MemberNameBuffer));
+
+    mp_obj_t currentgroupmemberuserdata_list[4] = {
+        mp_obj_new_int(MemberUserId), 
+        mp_obj_new_str(MemberStatus, strlen(MemberStatus)), 
+        mp_obj_new_str(Utf8MemberNameBuffer, strlen(Utf8MemberNameBuffer)), 
+        mp_obj_new_int(sizeof(Utf8MemberNameBuffer)), 
+
+    };
+
+    return mp_obj_new_list(4, currentgroupmemberuserdata_list);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getcurrentgroupmemberuserdata_obj, qpy_poc_getcurrentgroupmemberuserdata);
+
+STATIC mp_obj_t qpy_poc_refreshgroupmemberlist(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshgroupmemberlist();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshgroupmemberlist_obj, qpy_poc_refreshgroupmemberlist);
+
+// int    (*getfriendmemberlistcount)(void);
+STATIC mp_obj_t qpy_poc_getfriendmemberlistcount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getfriendmemberlistcount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getfriendmemberlistcount_obj, qpy_poc_getfriendmemberlistcount);
+
+// void   (*getfriendmemberuserdata)(int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+STATIC mp_obj_t qpy_poc_getfriendmemberuserdata(mp_obj_t in_userIndex) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_userIndex)){
+        return mp_obj_new_int(-1);
+    }
+    int userIndex = mp_obj_get_int(in_userIndex);
+       uint64 pUserId = 0;
+    char pStatus[64] = {0};
+    char pUtf8Name[64] = {0};
+
+    poc_ops->getfriendmemberuserdata(userIndex, &pUserId, pStatus,pUtf8Name,sizeof(pUtf8Name));
+
+    mp_obj_t friendmemberuserdata_list[4] = {
+        mp_obj_new_int(pUserId), 
+        mp_obj_new_str(pStatus, strlen(pStatus)), 
+        mp_obj_new_str(pUtf8Name, strlen(pUtf8Name)), 
+        mp_obj_new_int(sizeof(pUtf8Name)), 
+
+    };
+
+    return mp_obj_new_list(4, friendmemberuserdata_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getfriendmemberuserdata_obj, qpy_poc_getfriendmemberuserdata);
+
+// void   (*refreshfriendmemberlist)(void);
+STATIC mp_obj_t qpy_poc_refreshfriendmemberlist(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshfriendmemberlist();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshfriendmemberlist_obj, qpy_poc_refreshfriendmemberlist);
+
+// void   (*getaccountnickname)(char* pUtf8Name,int utf8BytesLength);
+STATIC mp_obj_t qpy_poc_getaccountnickname() 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    char pUtf8Name[64] = {0};
+
+    poc_ops->getaccountnickname(pUtf8Name,sizeof(pUtf8Name));
+
+    mp_obj_t accountnickname_list[2] = {
+        mp_obj_new_str(pUtf8Name, strlen(pUtf8Name)), 
+        mp_obj_new_int(sizeof(pUtf8Name)), 
+    };
+
+    return mp_obj_new_list(2, accountnickname_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getaccountnickname_obj, qpy_poc_getaccountnickname);
+
+// int    (*getfriendisenable)(void);
+STATIC mp_obj_t qpy_poc_getfriendisenable(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getfriendisenable());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getfriendisenable_obj, qpy_poc_getfriendisenable);
+
+// int    (*getcurrentstate)(void);
+STATIC mp_obj_t qpy_poc_getcurrentstate(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getcurrentstate());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getcurrentstate_obj, qpy_poc_getcurrentstate);
+
+// void   (*updatetailkerwithuserid)(char* pUserNameUtf8,int userNameUtf8ByteLength,uint64 useId,int groupId,uint32 environmentId);
+STATIC mp_obj_t qpy_poc_updatetailkerwithuserid(mp_obj_t in_useId,mp_obj_t in_groupId,mp_obj_t in_environmentId) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_useId)||!mp_obj_is_int(in_groupId)||!mp_obj_is_int(in_environmentId)){
+        return mp_obj_new_int(-1);
+    }
+    uint64 useId = (uint64)mp_obj_get_int(in_useId);
+    int groupId = mp_obj_get_int(in_groupId);
+    uint32 environmentId = (uint32)mp_obj_get_int(in_environmentId);
+    char pUserNameUtf8[64] = {0};
+
+    poc_ops->updatetailkerwithuserid(pUserNameUtf8, sizeof(pUserNameUtf8),useId,groupId,environmentId );
+
+    mp_obj_t updatetailkerwithuserid_list[2] = {
+        mp_obj_new_str(pUserNameUtf8, strlen(pUserNameUtf8)), 
+        mp_obj_new_int(sizeof(pUserNameUtf8)), 
+    };
+
+    return mp_obj_new_list(2, updatetailkerwithuserid_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_updatetailkerwithuserid_obj, qpy_poc_updatetailkerwithuserid);
+
+// void   (*handlesocketpackage)(int dataBytesLength, char* pData);
+STATIC mp_obj_t qpy_poc_handlesocketpackage(mp_obj_t in_dataBytesLength,char* pData) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    int dataBytesLength = mp_obj_get_int(in_dataBytesLength);
+
+    poc_ops->handlesocketpackage(dataBytesLength,pData);
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_handlesocketpackage_obj, qpy_poc_handlesocketpackage);
+
+// int    (*getdeviceuserid)(void);
+STATIC mp_obj_t qpy_poc_getdeviceuserid(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getdeviceuserid());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getdeviceuserid_obj, qpy_poc_getdeviceuserid);
+
+// int    (*getisvoicepacket)(int dataBytesLength, char* pData);
+STATIC mp_obj_t qpy_poc_getisvoicepacket(mp_obj_t in_dataBytesLength,char* pData) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    int dataBytesLength = mp_obj_get_int(in_dataBytesLength);
+
+    return mp_obj_new_int(poc_ops->getisvoicepacket(dataBytesLength,pData));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_getisvoicepacket_obj, qpy_poc_getisvoicepacket);
+
+// int    (*getdevicevoicepriority)(void);
+STATIC mp_obj_t qpy_poc_getdevicevoicepriority(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getdevicevoicepriority());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getdevicevoicepriority_obj, qpy_poc_getdevicevoicepriority);
+
+// int    (*getreceivevoicepriorityafterhandlesocketpackage)(void);
+STATIC mp_obj_t qpy_poc_getreceivevoicepriorityafterhandlesocketpackage(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getreceivevoicepriorityafterhandlesocketpackage());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getreceivevoicepriorityafterhandlesocketpackage_obj, qpy_poc_getreceivevoicepriorityafterhandlesocketpackage);
+
+// int    (*getreceivevoicepriority)(int wParam, int dwParam);
+STATIC mp_obj_t qpy_poc_getreceivevoicepriority(mp_obj_t in_wParam,mp_obj_t in_dwParam) 
+{
+    if (!mp_obj_is_int(in_wParam)||!mp_obj_is_int(in_dwParam)){
+        return mp_obj_new_int(-1);
+    }
+    int wParam = mp_obj_get_int(in_wParam);
+    int dwParam = mp_obj_get_int(in_dwParam);
+
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    return mp_obj_new_int(poc_ops->getreceivevoicepriority(wParam,dwParam));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getreceivevoicepriority_obj, qpy_poc_getreceivevoicepriority);
+
+// int    (*islistenchannel)(int groupId);
+STATIC mp_obj_t qpy_poc_islistenchannel(mp_obj_t in_groupId) 
+{
+    if (!mp_obj_is_int(in_groupId)){
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    return mp_obj_new_int(poc_ops->islistenchannel(groupId));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_islistenchannel_obj, qpy_poc_islistenchannel);
+
+// void   (*addlistenchannel)(int groupId);
+STATIC mp_obj_t qpy_poc_addlistenchannel(mp_obj_t in_groupId)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    poc_ops->addlistenchannel(groupId);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_addlistenchannel_obj, qpy_poc_addlistenchannel);
+
+// void   (*removelistenchannel)(int groupId);
+STATIC mp_obj_t qpy_poc_removelistenchannel(mp_obj_t in_groupId)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    poc_ops->removelistenchannel(groupId);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_removelistenchannel_obj, qpy_poc_removelistenchannel);
+
+// int    (*getlistenchannelcount)(void);
+STATIC mp_obj_t qpy_poc_getlistenchannelcount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getlistenchannelcount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getlistenchannelcount_obj, qpy_poc_getlistenchannelcount);
+
+// void   (*refreshmultichannellistenlist)(void);
+STATIC mp_obj_t qpy_poc_refreshmultichannellistenlist(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshmultichannellistenlist();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshmultichannellistenlist_obj, qpy_poc_refreshmultichannellistenlist);
+
+// void   (*refreshalllistengroupmember)(void);
+STATIC mp_obj_t qpy_poc_refreshalllistengroupmember(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->refreshalllistengroupmember();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_refreshalllistengroupmember_obj, qpy_poc_refreshalllistengroupmember);
+
+// int    (*getonegroupmemberlistcount)(int groupId);
+STATIC mp_obj_t qpy_poc_getonegroupmemberlistcount(mp_obj_t in_groupId) 
+{
+    if (!mp_obj_is_int(in_groupId)){
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    return mp_obj_new_int(poc_ops->getonegroupmemberlistcount(groupId));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getonegroupmemberlistcount_obj, qpy_poc_getonegroupmemberlistcount);
+
+// void   (*refreshonegroupmember)(int groupId);
+STATIC mp_obj_t qpy_poc_refreshonegroupmember(mp_obj_t in_groupId)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    poc_ops->refreshonegroupmember(groupId);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_refreshonegroupmember_obj, qpy_poc_refreshonegroupmember);
+
+// void   (*deleteterminalgroup)(int groupId);
+STATIC mp_obj_t qpy_poc_deleteterminalgroup(mp_obj_t in_groupId)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    poc_ops->deleteterminalgroup(groupId);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_deleteterminalgroup_obj, qpy_poc_deleteterminalgroup);
+
+// void   (*exitterminalgroup)(int groupId);
+STATIC mp_obj_t qpy_poc_exitterminalgroup(mp_obj_t in_groupId)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    poc_ops->exitterminalgroup(groupId);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_exitterminalgroup_obj, qpy_poc_exitterminalgroup);
+
+// void   (*addterminalgroupmember)(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+STATIC mp_obj_t qpy_poc_addterminalgroupmember(mp_obj_t in_groupId, mp_obj_t in_pArrayMemberUserId, mp_obj_t in_arrayMemberUserIdCount) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId) || !mp_obj_is_int(in_arrayMemberUserIdCount)){
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    int arrayMemberUserIdCount = mp_obj_get_int(in_arrayMemberUserIdCount);
+    mp_obj_t *items = NULL;
+    size_t len = 0;
+    mp_obj_list_get(in_pArrayMemberUserId, &len, &items);
+    uint64_t * uids =(uint64_t *) calloc(len,sizeof(uint64_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0; i<len; i++){        
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (uint64_t) mp_obj_get_int(items[i]);
+    }
+    poc_ops->addterminalgroupmember(groupId, uids,arrayMemberUserIdCount);
+    if (uids != NULL)
+    {
+        free(uids);
+    }
+    return mp_obj_new_int(0);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_addterminalgroupmember_obj, qpy_poc_addterminalgroupmember);
+
+// void   (*removeterminalgroupmember)(int groupId,uint64* pArrayMemberUserId,int arrayMemberUserIdCount);
+STATIC mp_obj_t qpy_poc_removeterminalgroupmember(mp_obj_t in_groupId, mp_obj_t in_pArrayMemberUserId, mp_obj_t in_arrayMemberUserIdCount) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_groupId) || !mp_obj_is_int(in_arrayMemberUserIdCount)){
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    int arrayMemberUserIdCount = mp_obj_get_int(in_arrayMemberUserIdCount);
+    mp_obj_t *items = NULL;
+    size_t len = 0;
+    mp_obj_list_get(in_pArrayMemberUserId, &len, &items);
+    uint64_t * uids =(uint64_t *) calloc(len,sizeof(uint64_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0; i<len; i++){        
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (uint64_t) mp_obj_get_int(items[i]);
+    }
+    poc_ops->removeterminalgroupmember(groupId, uids,arrayMemberUserIdCount);
+    if (uids != NULL)
+    {
+        free(uids);
+    }
+    return mp_obj_new_int(0);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_removeterminalgroupmember_obj, qpy_poc_removeterminalgroupmember);
+
+// void   (*requestterminalgroupname)(void);
+STATIC mp_obj_t qpy_poc_requestterminalgroupname(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->requestterminalgroupname();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_requestterminalgroupname_obj, qpy_poc_requestterminalgroupname);
+
+// int    (*getterminalgroupnamecount)(void);
+STATIC mp_obj_t qpy_poc_getterminalgroupnamecount(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getterminalgroupnamecount());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getterminalgroupnamecount_obj, qpy_poc_getterminalgroupnamecount);
+
+// void   (*getterminalgroupnamelistdata)(int index, char* pUtf8NameBuf,int utf8NameBufferBytesLength);
+STATIC mp_obj_t qpy_poc_getterminalgroupnamelistdata(mp_obj_t in_userIndex) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_userIndex)){
+        return mp_obj_new_int(-1);
+    }
+    int userIndex = mp_obj_get_int(in_userIndex);
+    char pUtf8NameBuf[64] = {0};
+
+    poc_ops->getterminalgroupnamelistdata(userIndex, pUtf8NameBuf,sizeof(pUtf8NameBuf));
+
+    mp_obj_t friendmemberuserdata_list[2] = {
+        mp_obj_new_str(pUtf8NameBuf, strlen(pUtf8NameBuf)), 
+        mp_obj_new_int(sizeof(pUtf8NameBuf)), 
+
+    };
+
+    return mp_obj_new_list(2, friendmemberuserdata_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_getterminalgroupnamelistdata_obj, qpy_poc_getterminalgroupnamelistdata);
+
+// int    (*getisinbroadcastgroup)(void);
+STATIC mp_obj_t qpy_poc_getisinbroadcastgroup(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getisinbroadcastgroup());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getisinbroadcastgroup_obj, qpy_poc_getisinbroadcastgroup);
+
+// void   (*enterbroadcast)(int* pArrayGroupId,int arrayGroupIdCount);
+STATIC mp_obj_t qpy_poc_enterbroadcast(mp_obj_t in_pArrayGroupId,mp_obj_t in_arrayGroupIdCount )
+{
+
+    poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    mp_obj_t *items = NULL;
+    size_t len = 0;
+    mp_obj_list_get(in_pArrayGroupId, &len, &items);
+    uint64_t * uids =(uint64_t *) calloc(len,sizeof(uint64_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0; i<len; i++){        
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (uint64_t) mp_obj_get_int(items[i]);
+    }
+    int count_id = mp_obj_get_int(in_arrayGroupIdCount);
+
+    poc_ops->enterbroadcast(uids, count_id);
+    if (uids != NULL)
+    {
+        free(uids);
+    }
+    
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_enterbroadcast_obj,qpy_poc_enterbroadcast);
+
+// void   (*exitbroadcast)(int isNeedSendExitReq);
+STATIC mp_obj_t qpy_poc_exitbroadcast(mp_obj_t in_isNeedSendExitReq)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_isNeedSendExitReq))
+    {
+        return mp_obj_new_int(-1);
+    }
+    int isNeedSendExitReq = mp_obj_get_int(in_isNeedSendExitReq);
+    poc_ops->exitbroadcast(isNeedSendExitReq);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_exitbroadcast_obj, qpy_poc_exitbroadcast);
+
+// void   (*resetlistenautoguardaftersetting)(void);
+STATIC mp_obj_t qpy_poc_resetlistenautoguardaftersetting(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->resetlistenautoguardaftersetting();
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_resetlistenautoguardaftersetting_obj, qpy_poc_resetlistenautoguardaftersetting);
+
+// int    (*getlistenautoguardleftseconds)(void);
+STATIC mp_obj_t qpy_poc_getlistenautoguardleftseconds(void) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->getlistenautoguardleftseconds());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_getlistenautoguardleftseconds_obj, qpy_poc_getlistenautoguardleftseconds);
+
+
+//   void   (*createterminalgroup)(uint64* pArrayMemberUserId,int arrayMemberUserIdCount,char* pNameUtf8Buffer);
+STATIC mp_obj_t qpy_poc_createterminalgroup(mp_obj_t in_pArrayMemberUserId,mp_obj_t in_arrayMemberUserIdCount,mp_obj_t in_pNameUtf8Buffer) 
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    mp_obj_t *items = NULL;
+    size_t len = 0;
+    mp_obj_list_get(in_pArrayMemberUserId, &len, &items);
+    uint64_t * uids =(uint64_t *) calloc(len,sizeof(uint64_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0; i<len; i++){        
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (uint64_t) mp_obj_get_int(items[i]);
+    }
+    int pArrayGroupId_len = mp_obj_get_int(in_arrayMemberUserIdCount);
+    int pNameUtf8Buffer_len = 0;
+    char pNameUtf8Buffer[64];
+    mp_buffer_info_t bufinfo_in_pNameUtf8Buffer={0};
+    mp_get_buffer_raise(in_pNameUtf8Buffer, &bufinfo_in_pNameUtf8Buffer, MP_BUFFER_READ);
+    pNameUtf8Buffer_len = bufinfo_in_pNameUtf8Buffer.len;
+    memcpy(pNameUtf8Buffer,bufinfo_in_pNameUtf8Buffer.buf,pNameUtf8Buffer_len);
+
+    poc_ops->createterminalgroup(uids,pArrayGroupId_len,pNameUtf8Buffer);
+    if (uids != NULL)
+    {
+        free(uids);
+    }
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_createterminalgroup_obj, qpy_poc_createterminalgroup);
+
+//void POC_GetOneGroupMemberUserData(int groupId,int userIndex, uint64* pUserId, char* pStatus,  char* pUtf8Name,int utf8ByteLength);
+
+STATIC mp_obj_t qpy_poc_getonegroupmemberuserdata(mp_obj_t in_groupId,mp_obj_t in_userIndex) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    if (!mp_obj_is_int(in_userIndex)||!mp_obj_is_int(in_groupId)){
+        return mp_obj_new_int(-1);
+    }
+    int groupId = mp_obj_get_int(in_groupId);
+    int userIndex = mp_obj_get_int(in_userIndex);
+
+    uint64 pUserId = 0;
+    char pStatus[64] = {0};
+    char pUtf8Name[64] = {0};
+
+    poc_ops->getonegroupmemberuserdata(groupId,userIndex, &pUserId, pStatus, pUtf8Name,sizeof(pUtf8Name));
+
+    mp_obj_t friendmemberuserdata_list[4] = {
+        mp_obj_new_int(pUserId),
+        mp_obj_new_str(pStatus, strlen(pStatus)), 
+        mp_obj_new_str(pUtf8Name, strlen(pUtf8Name)), 
+        mp_obj_new_int(sizeof(pUtf8Name)), 
+
+    };
+
+    return mp_obj_new_list(4, friendmemberuserdata_list);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_getonegroupmemberuserdata_obj, qpy_poc_getonegroupmemberuserdata);
+
+
+#endif
+
+//calluser
+
+STATIC mp_obj_t qpy_poc_calluser(mp_obj_t poc_uid, mp_obj_t poc_cb)
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+
+    int ret = 0;
+       
+    int uid = mp_obj_get_int(poc_uid);
+    #ifdef CONFIG_POC_YDWL
+    if( uid < 0 )
+    #else
+    if( uid <= 0 )
+    #endif
+    {
+        return mp_obj_new_int(-1);
+    }
+
+       POC_LOG("poc call user uid %d",uid);
+    
+    mp_sched_schedule_callback_register(&(poc_obj.calluser_callback), poc_cb);
+
+    ret = poc_ops->calluser(uid,qpy_poc_calluser_callback);
+
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_calluser_obj, qpy_poc_calluser);
+//calluser end
+
+#if !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+//group_getbyindexr
+STATIC mp_obj_t qpy_poc_group_getbyindex(mp_obj_t value) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    group_t group_info = {0};
+    int index = mp_obj_get_int(value);
+       ret = poc_ops->group_getbyindex(index, &group_info);
+       
+       POC_LOG("qpy_poc_group_getbyindex ret = %d",ret);
+       if(ret != 0 || group_info.name == NULL) return mp_obj_new_int(-1);
+    
+    mp_obj_t group_info_list[4] = {
+                       mp_obj_new_int(group_info.gid), 
+                       mp_obj_new_str(group_info.name, strlen(group_info.name)), 
+                       mp_obj_new_int(group_info.type), 
+                       mp_obj_new_int(group_info.index)};
+
+    return mp_obj_new_list(4, group_info_list);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_group_getbyindex_obj, qpy_poc_group_getbyindex);
+//group_getbyindexr end
+#endif
+#if !defined(CONFIG_POC_YDWL)
+//member_getbyid
+STATIC mp_obj_t qpy_poc_member_getbyid(mp_obj_t value) 
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    member_t member_info = {0};
+    int uid = mp_obj_get_int(value);
+       ret = poc_ops->member_getbyid(uid, &member_info);
+       
        POC_LOG("qpy_poc_member_getbyid ret = %d",ret);
        if(ret != 0 || member_info.name == NULL) return mp_obj_new_int(-1);
     #ifdef CONFIG_POC_BND_XIN
@@ -1578,7 +2774,27 @@ STATIC mp_obj_t qpy_poc_member_getbyid(mp_obj_t value)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_member_getbyid_obj, qpy_poc_member_getbyid);
 //member_getbyid end
 #endif
-
+#if defined(CONFIG_POC_YDWL)
+//get_loginstate 
+STATIC mp_obj_t qpy_poc_get_loginstate()
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    login_sta_t *sta = poc_ops->get_loginstate();
+    if (sta) {
+        mp_obj_t sta_list[3] = {
+            mp_obj_new_int(sta->state), 
+            mp_obj_new_int(sta->uid),
+            mp_obj_new_str(sta->name, strlen(sta->name))
+        };
+        return mp_obj_new_list(3, sta_list);
+    }
+    else {
+        return mp_obj_new_list(0, NULL);
+    }
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_loginstate_obj, qpy_poc_get_loginstate);
+//get_loginstate end
+#else
 //get_loginstate 
 STATIC mp_obj_t qpy_poc_get_loginstate()
 {
@@ -1589,6 +2805,7 @@ STATIC mp_obj_t qpy_poc_get_loginstate()
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_loginstate_obj, qpy_poc_get_loginstate);
 //get_loginstate end
+#endif
 
 //get_groupcount 
 STATIC mp_obj_t qpy_poc_get_groupcount()
@@ -1922,6 +3139,25 @@ STATIC mp_obj_t qpy_poc_register_member_change_cb(mp_obj_t args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_member_change_cb_obj, qpy_poc_register_member_change_cb);
 
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
+STATIC uint8_t g_voice_vol = HELIOS_AUDIOHAL_SPK_VOL_1;
+
+int qpy_poc_set_voice_vol(int vol) {
+    if (vol < 0) {
+        g_voice_vol = 0;
+    } else if (vol > HELIOS_AUDIOHAL_SPK_VOL_11) {
+        g_voice_vol = HELIOS_AUDIOHAL_SPK_VOL_11;
+    } else {
+        g_voice_vol = vol;
+    }
+    return 0;
+}
+
+uint8_t qpy_poc_get_voice_vol(void){
+    return g_voice_vol;
+}
+#endif
+
 STATIC mp_obj_t qpy_poc_set_vol(mp_obj_t type,mp_obj_t vol)
 {
     size_t len = 0;
@@ -1936,7 +3172,15 @@ STATIC mp_obj_t qpy_poc_set_vol(mp_obj_t type,mp_obj_t vol)
 #else
     Helios_AudPlayerType voice_type = (Helios_AudPlayerType) mp_obj_get_int(type);
     Helios_AudHALSPKLevel voice_value = (Helios_AudHALSPKLevel) mp_obj_get_int(vol);
-    Helios_Audio_SetVolume(voice_type,voice_value);
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
+    if (voice_type == HELIOS_AUDIO_PLAY_TYPE_VOICE) {
+        qpy_poc_set_voice_vol(voice_value);
+    } else {
+        Helios_Audio_SetVolume(voice_type, voice_value);
+    }
+#else
+    Helios_Audio_SetVolume(voice_type, voice_value);
+#endif
 #endif
        return mp_obj_new_int(0);
 }
@@ -1956,9 +3200,16 @@ STATIC mp_obj_t qpy_poc_get_vol(mp_obj_t type)
 
 #else
     Helios_AudPlayerType  voice_type = (Helios_AudPlayerType) mp_obj_get_int(type);
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
+    if (voice_type == HELIOS_AUDIO_PLAY_TYPE_VOICE) {
+        ret = qpy_poc_get_voice_vol();
+    }else {
+        ret = Helios_Audio_GetVolume(voice_type);
+    }
+#else
     ret = Helios_Audio_GetVolume(voice_type);
 #endif
-
+#endif
 
        return mp_obj_new_int(ret);
 }
@@ -2054,92 +3305,324 @@ STATIC mp_obj_t qpy_poc_set_gps(mp_obj_t lat, mp_obj_t lng)
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_set_gps_obj, qpy_poc_set_gps);
 //set_GPS end
 
-//set_locationtype 
-STATIC mp_obj_t qpy_poc_set_locationtype(mp_obj_t loc_type)
+//set_locationtype 
+STATIC mp_obj_t qpy_poc_set_locationtype(mp_obj_t loc_type)
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+
+    int arg_loc = mp_obj_get_int(loc_type);
+    ret = poc_ops->set_locationtype(arg_loc);
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_locationtype_obj, qpy_poc_set_locationtype);
+//set_locationtype end
+
+#endif
+
+#if defined(CONFIG_POC_YDWL)
+
+STATIC mp_obj_t qpy_poc_set_account(mp_obj_t ip, mp_obj_t id, mp_obj_t pwd)
+{
+    int ret = 0;
+    char *poc_id = NULL;
+    char *poc_pwd = NULL;
+    char *poc_ip = NULL;
+
+    poc_ip = (char*)mp_obj_str_get_str(ip);
+    poc_id = (char*)mp_obj_str_get_str(id);
+    poc_pwd = (char*)mp_obj_str_get_str(pwd);
+    if ( poc_id == NULL || poc_pwd == NULL){
+        return mp_obj_new_int(-1);
+    }
+    poc_ops_t *poc_ops = poc_get_ops();
+
+    ret = poc_ops->set_account(poc_ip, poc_id, poc_pwd);
+
+
+
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_set_account_obj, qpy_poc_set_account);
+
+void qpy_poc_tts_init_callback(int id, int status) {
+    POC_LOG("qpy_poc_tts_init_callback start \n");
+    if(poc_obj.tts_init_callback.cb) {
+        st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
+        poc_para->para[0].type = POC_CAL_ELEM_INT;
+        poc_para->para[0].data = calloc(1, sizeof(int));
+        poc_para->para[1].type = POC_CAL_ELEM_INT;
+        poc_para->para[1].data = calloc(1, sizeof(int));
+        *(int*)poc_para->para[0].data = id;
+        *(int*)poc_para->para[1].data = status;
+        poc_para->callback = poc_obj.tts_init_callback;
+        POC_LOG("qpy_poc_tts_init_callback id:%d,status:%d \n", id, status);
+        qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    }
+}
+
+STATIC mp_obj_t qpy_poc_tts_init(mp_obj_t callback)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.tts_init_callback), callback);
+    POC_LOG("tts_init \n");
+    poc_ops->tts_init(qpy_poc_tts_init_callback);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_tts_init_obj, qpy_poc_tts_init);
+
+STATIC mp_obj_t qpy_poc_tts_play(mp_obj_t data_obj) {
+    mp_buffer_info_t bufinfo;
+    mp_get_buffer_raise(data_obj, &bufinfo, MP_BUFFER_READ);
+    poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->tts_play(bufinfo.buf, bufinfo.len);
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_tts_play_obj, qpy_poc_tts_play);
+
+STATIC mp_obj_t qpy_poc_get_map_png(size_t n_args, const mp_obj_t *args) 
+{      
+    if (  !mp_obj_is_int(args[2])   || !mp_obj_is_int(args[3]) ||\
+          !mp_obj_is_float(args[0]) || !mp_obj_is_float(args[1]) )
+    {
+        return mp_obj_new_int(-1);
+    }
+    poc_ops_t *poc_ops = poc_get_ops();
+    int ret = poc_ops->get_map_png(mp_obj_get_float_to_d(args[0]), mp_obj_get_float_to_d(args[1]),mp_obj_get_int(args[2]),mp_obj_get_int(args[3]));
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_get_map_png_obj, 4, 4, qpy_poc_get_map_png);
+
+STATIC mp_obj_t qpy_poc_report_alarm(mp_obj_t lat, mp_obj_t lng) {
+    if (  !mp_obj_is_float(lat) || !mp_obj_is_float(lng) )
+    {
+        return mp_obj_new_int(-1);
+    }
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->report_alarm(mp_obj_get_float_to_d(lat), mp_obj_get_float_to_d(lng)));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_report_alarm_obj, qpy_poc_report_alarm);
+
+STATIC mp_obj_t qpy_poc_stop_alarm(void) {
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->stop_alarm());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_stop_alarm_obj, qpy_poc_stop_alarm);
+
+STATIC mp_obj_t qpy_poc_ignore_alarm(void) {
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->ignore_alarm());
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_ignore_alarm_obj, qpy_poc_ignore_alarm);
+
+
+STATIC mp_obj_t qpy_poc_register_sos_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.sos_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_sos_cb_obj, qpy_poc_register_sos_cb);
+
+STATIC mp_obj_t qpy_poc_register_ctrl_pa_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.ctrl_pa_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_ctrl_pa_cb_obj, qpy_poc_register_ctrl_pa_cb);
+
+
+STATIC mp_obj_t qpy_poc_register_weather_info_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.weather_info_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_weather_info_cb_obj, qpy_poc_register_weather_info_cb);
+
+
+STATIC mp_obj_t qpy_poc_register_map_png_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.map_png_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_map_png_cb_obj, qpy_poc_register_map_png_cb);
+
+STATIC mp_obj_t qpy_poc_register_login_sta_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.login_sta_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_login_sta_cb_obj, qpy_poc_register_login_sta_cb);
+
+STATIC mp_obj_t qpy_poc_register_invite_info_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.invite_info_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_invite_info_cb_obj, qpy_poc_register_invite_info_cb);
+
+
+STATIC mp_obj_t qpy_poc_register_cell_locator_info_cb(mp_obj_t args)
+{
+    mp_sched_schedule_callback_register(&(poc_obj.cell_locator_info_callback), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_cell_locator_info_cb_obj, qpy_poc_register_cell_locator_info_cb);
+
+STATIC mp_obj_t qpy_poc_gps_send_location(mp_obj_t lat, mp_obj_t lng) {
+    if (  !mp_obj_is_float(lat) || !mp_obj_is_float(lng) )
+    {
+        return mp_obj_new_int(-1);
+    }
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->gps_send_location(mp_obj_get_float_to_d(lat), mp_obj_get_float_to_d(lng)));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_gps_send_location_obj, qpy_poc_gps_send_location);
+
+STATIC mp_obj_t qpy_poc_ufs_open(mp_obj_t path_in, mp_obj_t mode_in) {
+    const char *path = mp_obj_str_get_str(path_in);
+    const char *mode = mp_obj_str_get_str(mode_in);
+    HeliosFILE * fd;
+    fd = Helios_fopen(path, mode);
+       
+       if(NULL == fd)
+       {
+               mp_raise_OSError(-1);
+               return mp_const_none;
+       }
+    return MP_OBJ_FROM_PTR(fd);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_ufs_open_obj, qpy_poc_ufs_open);
+
+STATIC mp_obj_t qpy_poc_ufs_read(mp_obj_t size_obj, mp_obj_t fd_obj)
+{
+    int size  = mp_obj_get_int(size_obj);
+    HeliosFILE * fd = MP_OBJ_TO_PTR(fd_obj);
+    uint8_t *read_buffer = (uint8_t *)malloc(size);
+       if (read_buffer == NULL) {
+               mp_raise_ValueError("usf read malloc failed");
+       }
+    int r = Helios_fread(read_buffer, size, 1, fd);
+    
+    if (r <= 0) {
+        return mp_const_none;
+    }
+    mp_obj_t read_byte = mp_obj_new_bytes(read_buffer, size);
+    return read_byte;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_ufs_read_obj, qpy_poc_ufs_read);
+
+STATIC mp_obj_t qpy_poc_ufs_write(mp_obj_t data, mp_obj_t fd_obj)
 {
-       poc_ops_t *poc_ops = poc_get_ops();
-    int ret = 0;
-
-    int arg_loc = mp_obj_get_int(loc_type);
-    ret = poc_ops->set_locationtype(arg_loc);
-       return mp_obj_new_int(ret);
+    HeliosFILE * fd = MP_OBJ_TO_PTR(fd_obj);
+    // get the buffer to read the data into
+       mp_buffer_info_t writebuf;
+    mp_get_buffer_raise(data, &writebuf, MP_BUFFER_READ);
+    int r = Helios_fwrite(writebuf.buf, writebuf.len, 1, fd);
+    if (r < 0) {
+        return mp_const_none;
+    }
+    return mp_obj_new_int(r);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_locationtype_obj, qpy_poc_set_locationtype);
-//set_locationtype end
+MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_ufs_write_obj, qpy_poc_ufs_write);
 
-#endif
+STATIC mp_obj_t qpy_poc_ufs_close(mp_obj_t fd_obj)
+{
+    HeliosFILE * fd = MP_OBJ_TO_PTR(fd_obj);
+    return mp_obj_new_int(Helios_fclose(fd));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_ufs_close_obj, qpy_poc_ufs_close);
 
-#if defined(CONFIG_POC_YDWL)
 
-STATIC mp_obj_t qpy_poc_set_account(mp_obj_t ip, mp_obj_t id, mp_obj_t pwd)
+STATIC mp_obj_t qpy_poc_get_cfg_from_file(void)
 {
-    int ret = 0;
-    char *poc_id = NULL;
-    char *poc_pwd = NULL;
-    char *poc_ip = NULL;
-
-    poc_ip = (char*)mp_obj_str_get_str(ip);
-    poc_id = (char*)mp_obj_str_get_str(id);
-    poc_pwd = (char*)mp_obj_str_get_str(pwd);
-    if ( poc_id == NULL || poc_pwd == NULL){
-        return mp_obj_new_int(-1);
-    }
     poc_ops_t *poc_ops = poc_get_ops();
+    stPocSetPar * set_par = poc_ops->get_cfg_from_file();
 
-    ret = poc_ops->set_account(poc_ip, poc_id, poc_pwd);
-
+    if (set_par == NULL) {
+        return mp_const_none;
+    }
+               
+    mp_obj_t cfg_list[10] = {
+        mp_obj_new_str(set_par->ip, strlen(set_par->ip)),
+        mp_obj_new_str(set_par->account, strlen(set_par->account)),
+        mp_obj_new_str(set_par->passwd, strlen(set_par->passwd)), 
+        mp_obj_new_str(set_par->apnname, strlen(set_par->apnname)), 
+        mp_obj_new_str(set_par->apnacc, strlen(set_par->apnacc)),
+        mp_obj_new_str(set_par->apnpwd, strlen(set_par->apnpwd)),
+        mp_obj_new_str(set_par->agentpwd, strlen(set_par->agentpwd)),
+        mp_obj_new_int(set_par->inviteFlg), 
+        mp_obj_new_int(set_par->gps_sw),
+        mp_obj_new_int(set_par->offlineFlg)
+    };
+    return mp_obj_new_list(10, cfg_list);
+}
+MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_cfg_from_file_obj, qpy_poc_get_cfg_from_file);
 
 
-       return mp_obj_new_int(ret);
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_set_account_obj, qpy_poc_set_account);
+STATIC mp_obj_t qpy_poc_get_cfg(void)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    stPocSetPar * set_par = poc_ops->get_cfg();
 
-void qpy_poc_tts_init_callback(int id, int status) {
-    POC_LOG("qpy_poc_tts_init_callback start \n");
-    if(poc_obj.tts_init_callback.cb) {
-        st_CallBack_POC *poc_para = qpy_poc_pushCallBack(2);
-        poc_para->para[0].type = POC_CAL_ELEM_INT;
-        poc_para->para[0].data = calloc(1, sizeof(int));
-        poc_para->para[1].type = POC_CAL_ELEM_INT;
-        poc_para->para[1].data = calloc(1, sizeof(int));
-        *(int*)poc_para->para[0].data = id;
-        *(int*)poc_para->para[1].data = status;
-        poc_para->callback = poc_obj.tts_init_callback;
-        POC_LOG("qpy_poc_tts_init_callback id:%d,status:%d \n", id, status);
-        qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_POC, poc_para);
+    if (set_par == NULL) {
+        return mp_const_none;
     }
+               
+    mp_obj_t cfg_list[10] = {
+        mp_obj_new_str(set_par->ip, strlen(set_par->ip)),
+        mp_obj_new_str(set_par->account, strlen(set_par->account)),
+        mp_obj_new_str(set_par->passwd, strlen(set_par->passwd)), 
+        mp_obj_new_str(set_par->apnname, strlen(set_par->apnname)), 
+        mp_obj_new_str(set_par->apnacc, strlen(set_par->apnacc)),
+        mp_obj_new_str(set_par->apnpwd, strlen(set_par->apnpwd)),
+        mp_obj_new_str(set_par->agentpwd, strlen(set_par->agentpwd)),
+        mp_obj_new_int(set_par->inviteFlg), 
+        mp_obj_new_int(set_par->gps_sw),
+        mp_obj_new_int(set_par->offlineFlg)
+    };
+    return mp_obj_new_list(10, cfg_list);
 }
+MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_cfg_obj, qpy_poc_get_cfg);
 
-STATIC mp_obj_t qpy_poc_tts_init(mp_obj_t callback)
+
+
+STATIC mp_obj_t qpy_poc_get_login_from_file(void)
 {
     poc_ops_t *poc_ops = poc_get_ops();
-    mp_sched_schedule_callback_register(&(poc_obj.tts_init_callback), callback);
-    POC_LOG("tts_init \n");
-    poc_ops->tts_init(qpy_poc_tts_init_callback);
-       return mp_const_none;
+    stLoginCfg * login_cfg = poc_ops->get_login_from_file();
+
+    if (login_cfg == NULL) {
+        return mp_const_none;
+    }
+               
+    mp_obj_t login_list[2] = {
+        mp_obj_new_str(login_cfg->cDefAddr, strlen(login_cfg->cDefAddr)),
+        mp_obj_new_int(login_cfg->uiLoginType)
+    };
+    return mp_obj_new_list(2, login_list);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_tts_init_obj, qpy_poc_tts_init);
+MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_login_from_file_obj, qpy_poc_get_login_from_file);
 
-STATIC mp_obj_t qpy_poc_tts_play(mp_obj_t data_obj) {
-    mp_buffer_info_t bufinfo;
-    mp_get_buffer_raise(data_obj, &bufinfo, MP_BUFFER_READ);
+
+STATIC mp_obj_t qpy_poc_set_cfg(mp_obj_t data) {
     poc_ops_t *poc_ops = poc_get_ops();
-    poc_ops->tts_play(bufinfo.buf, bufinfo.len);
-    return mp_const_none;
+    // get the buffer to read the data into
+       mp_buffer_info_t writebuf;
+    mp_get_buffer_raise(data, &writebuf, MP_BUFFER_READ);
+    return mp_obj_new_int(poc_ops->set_cfg(writebuf.buf, writebuf.len));
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_tts_play_obj, qpy_poc_tts_play);
+MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_set_cfg_obj, qpy_poc_set_cfg);
+
+STATIC mp_obj_t qpy_poc_set_icmic_gain(mp_obj_t ana_gain, mp_obj_t adc_gain)
+{
+    int ret = 0;
 
-STATIC mp_obj_t qpy_poc_get_map_png(size_t n_args, const mp_obj_t *args) 
-{      
-    if (  !mp_obj_is_int(args[2])   || !mp_obj_is_int(args[3]) ||\
-          !mp_obj_is_float(args[0]) || !mp_obj_is_float(args[1]) )
-    {
-        return mp_obj_new_int(-1);
-    }
     poc_ops_t *poc_ops = poc_get_ops();
-    return mp_obj_new_int(poc_ops->get_map_png(mp_obj_get_float_to_d(args[0]), mp_obj_get_float_to_d(args[1]),mp_obj_get_int(args[2]),mp_obj_get_int(args[3])));
+    ret = poc_ops->set_icmic_gain(mp_obj_get_int(ana_gain), mp_obj_get_int(adc_gain));
+       return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_get_map_png_obj, 4, 4, qpy_poc_get_map_png);
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_set_icmic_gain_obj, qpy_poc_set_icmic_gain);
+
 #endif
 
 #if defined(CONFIG_POC_ZZD) || defined(CONFIG_POC_YDWL)
@@ -2164,6 +3647,14 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_notify_spker_cb_obj, qpy_poc_r
 #endif
 
 #if defined(CONFIG_POC_BND_XIN)
+STATIC mp_obj_t qpy_poc_set_terminal_info(mp_obj_t battery_level,mp_obj_t signal_level) 
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    return mp_obj_new_int(poc_ops->set_terminal_info(mp_obj_get_int(battery_level), mp_obj_get_int(signal_level)));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_set_terminal_info_obj, qpy_poc_set_terminal_info);
+
+
 STATIC mp_obj_t qpy_poc_sos_start(mp_obj_t lon_in,mp_obj_t lat_in) 
 {
     if ( !mp_obj_is_float(lon_in) || !mp_obj_is_float(lat_in) )
@@ -2177,6 +3668,58 @@ STATIC mp_obj_t qpy_poc_sos_start(mp_obj_t lon_in,mp_obj_t lat_in)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_sos_start_obj, qpy_poc_sos_start);
 
+STATIC mp_obj_t qpy_poc_report_sos(size_t n_args, const mp_obj_t *args)
+{
+    if (   !mp_obj_is_float(args[0]) ||!mp_obj_is_float(args[1]) || !mp_obj_is_float(args[3])\
+         ||!mp_obj_is_float(args[4]) ||!mp_obj_is_float(args[5])){
+        POC_LOG("obj is not float\n");
+        goto error_exit;
+    }
+    mp_obj_t *items = NULL;
+       size_t len = 0;
+       mp_obj_list_get(args[2], &len, &items);
+       if ( len != 7 ){
+        POC_LOG("Wrong time value\n");
+               goto error_exit;
+       }
+    bnd_time_t timer_value;
+    double  lon     =  (double)mp_obj_get_float(args[0]);
+    double  lat     =  (double)mp_obj_get_float(args[1]);
+    double  alt     =  (double)mp_obj_get_float(args[3]);
+    double  speed   =  (double)mp_obj_get_float(args[4]);
+    double  dirang  =  (double)mp_obj_get_float(args[5]);
+
+    if (!mp_obj_is_int(items[0]) || !mp_obj_is_int(items[1]) || !mp_obj_is_int(items[2]) || \
+        !mp_obj_is_int(items[3]) || !mp_obj_is_int(items[4]) || !mp_obj_is_int(items[5]) ||\
+        !mp_obj_is_int(items[6])){
+        POC_LOG("time is not int\n");
+               goto error_exit;
+       }
+
+    timer_value.year      = mp_obj_get_int(items[0]);
+    timer_value.month     = mp_obj_get_int(items[1]);
+    timer_value.day       = mp_obj_get_int(items[2]);
+    timer_value.hour      = mp_obj_get_int(items[3]);
+    timer_value.minute    = mp_obj_get_int(items[4]);
+    timer_value.second    = mp_obj_get_int(items[5]);
+    timer_value.millisecond = mp_obj_get_int(items[6]);
+
+    if ( !check_datetime_is_right(timer_value)  ){
+        POC_LOG("time is not valid\n");
+        goto error_exit;
+    }
+
+    poc_ops_t *poc_ops = poc_get_ops();
+    extern int broad_report_sos(double lon,double lat,bnd_time_t time, double alt, double speed, double dirang);
+    extern int broad_write_custom(BND_CUSTOM_TYPE type, const char* value);
+    POC_LOG("poc_ops->report_sos=%p, broad_report_sos=%p, broad_write_custom=%p", poc_ops->report_sos, broad_report_sos, broad_write_custom);
+    int ret = poc_ops->report_sos(lon, lat,timer_value,alt,speed,dirang);
+       return  mp_obj_new_int(ret);
+
+error_exit:
+    return  mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_report_sos_obj, 6, 6, qpy_poc_report_sos);
 
 STATIC mp_obj_t qpy_poc_query_sos_map(size_t n_args,const mp_obj_t *args) 
 {      
@@ -2206,6 +3749,14 @@ STATIC mp_obj_t qpy_poc_register_sos_map_cb(mp_obj_t args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_sos_map_cb_obj,  qpy_poc_register_sos_map_cb);
 
+STATIC mp_obj_t qpy_poc_register_recv_sos_alarm_cb(mp_obj_t args) 
+{      
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.register_recv_sos_alarm_cb), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_recv_sos_alarm_cb_obj,  qpy_poc_register_recv_sos_alarm_cb);
+
 STATIC mp_obj_t qpy_poc_register_recv_sos_info_cb(mp_obj_t args) 
 {      
     poc_ops_t *poc_ops = poc_get_ops();
@@ -2214,6 +3765,22 @@ STATIC mp_obj_t qpy_poc_register_recv_sos_info_cb(mp_obj_t args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_recv_sos_info_cb_obj,  qpy_poc_register_recv_sos_info_cb);
 
+STATIC mp_obj_t qpy_poc_register_recv_report_sos_ack_cb(mp_obj_t args) 
+{      
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.register_recv_report_sos_ack_cb), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_recv_report_sos_ack_cb_obj,  qpy_poc_register_recv_report_sos_ack_cb);
+
+STATIC mp_obj_t qpy_poc_register_recv_report_sos_ack_timeout_cb(mp_obj_t args) 
+{      
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.register_recv_report_sos_ack_timeout_cb), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_recv_report_sos_ack_timeout_cb_obj,  qpy_poc_register_recv_report_sos_ack_timeout_cb);
+
 STATIC mp_obj_t qpy_poc_register_recv_enclosure_alarm_cb(mp_obj_t args) 
 {      
     poc_ops_t *poc_ops = poc_get_ops();
@@ -2351,13 +3918,19 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_logininfo_obj, qpy_poc_get_logininf
 
 STATIC mp_obj_t qpy_poc_request_weather_info(void)
 {
-    POC_LOG("qpy_poc_request_weather_info\n");
     poc_ops_t *poc_ops = poc_get_ops();
-    static stWeather_info *weather_info = NULL;
+    int ret = poc_ops->request_weather_info();
+    
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_request_weather_info_obj, qpy_poc_request_weather_info);
 
-    int ret = poc_ops->request_weather_info(&weather_info);
+STATIC mp_obj_t qpy_poc_get_weather_info(void)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    static stWeather_info *weather_info = NULL;
+    int ret = poc_ops->get_weather_info(&weather_info);
     POC_LOG("weather_info->cCity : %s\n", weather_info->cCity);
-    POC_LOG("weather_info->iWeather[1].nightWind : %s\n", weather_info->iWeather[1].nightWind);
     if (ret == 0) {
         mp_obj_t weather1[7] = {
             mp_obj_new_str(weather_info->iWeather[0].dayTime, strlen(weather_info->iWeather[0].dayTime)),
@@ -2396,7 +3969,25 @@ STATIC mp_obj_t qpy_poc_request_weather_info(void)
     }
        return mp_obj_new_tuple(0, NULL);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_request_weather_info_obj, qpy_poc_request_weather_info);
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_weather_info_obj, qpy_poc_get_weather_info);
+
+STATIC mp_obj_t qpy_poc_get_account_info(void)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    MP_THREAD_GIL_EXIT();
+    account_info_t * act_info = poc_ops->poc_get_account_info();
+    MP_THREAD_GIL_ENTER();
+    if (act_info) {
+        mp_obj_t accout_info_list[3] = {
+            mp_obj_new_str(act_info->account, strlen(act_info->account)),
+            mp_obj_new_str(act_info->ip, strlen(act_info->ip)),
+            mp_obj_new_int(act_info->inv),
+        };
+        return mp_obj_new_list(3, accout_info_list);
+    }
+       return mp_obj_new_list(0, NULL);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_account_info_obj, qpy_poc_get_account_info);
 
 STATIC mp_obj_t qpy_poc_record_onoff(mp_obj_t en) {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -2407,21 +3998,43 @@ STATIC mp_obj_t qpy_poc_record_onoff(mp_obj_t en) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_record_onoff_obj, qpy_poc_record_onoff);
 
-// This interface is no longer used
-// STATIC mp_obj_t qpy_poc_record_clear(void) {
-//     poc_ops_t *poc_ops = poc_get_ops();
-//     int ret = poc_ops->record_clear();
+STATIC mp_obj_t qpy_poc_record_get_folder_list(void) {
 
-//     return mp_obj_new_int(ret);
-// }
-// STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_record_clear_obj, qpy_poc_record_clear);
+    static ydwl_record_list_t *ydwl_record_list = NULL;
+
+    poc_ops_t *poc_ops = poc_get_ops();
+    int actual_read_num = poc_ops->record_get_folder_list(&ydwl_record_list);
+
+    POC_LOG("record_list actual_read_num is %d\n",actual_read_num);
+    if(actual_read_num > 0)
+    {
+        static mp_obj_t *record_list_py = NULL;
+        if(record_list_py != NULL) {
+            free(record_list_py);
+            record_list_py = NULL;
+        }
+        
+        record_list_py = malloc(sizeof(mp_obj_t)*actual_read_num);
+        memset(record_list_py, 0, sizeof(mp_obj_t)*actual_read_num);
+        int i;
+        for(i = 0; i < actual_read_num; i++) {
+            record_list_py[i] = mp_obj_new_str(ydwl_record_list->ucFolderName[i], strlen(ydwl_record_list->ucFolderName[i]));
+        }
+        return mp_obj_new_list(actual_read_num, record_list_py);
+    }
+    else {
+        return mp_obj_new_int(-1);
+    }
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_record_get_folder_list_obj, qpy_poc_record_get_folder_list);
 
-STATIC mp_obj_t qpy_poc_record_get_list(void) {
+
+STATIC mp_obj_t qpy_poc_record_get_file_list(mp_obj_t index_obj) {
 
     static ydwl_record_list_t *ydwl_record_list = NULL;
 
     poc_ops_t *poc_ops = poc_get_ops();
-    int actual_read_num = poc_ops->record_get_list(&ydwl_record_list);
+    int actual_read_num = poc_ops->record_get_file_list(&ydwl_record_list, mp_obj_get_int(index_obj));
 
     POC_LOG("record_list actual_read_num is %d\n",actual_read_num);
     if(actual_read_num > 0)
@@ -2437,16 +4050,15 @@ STATIC mp_obj_t qpy_poc_record_get_list(void) {
             tuple_return = NULL;
         }
         
-        record_list_py = malloc(sizeof(mp_obj_t)*actual_read_num*3);
-        memset(record_list_py,0,sizeof(mp_obj_t)*actual_read_num*3);
+        record_list_py = malloc(sizeof(mp_obj_t)*actual_read_num*2);
+        memset(record_list_py,0,sizeof(mp_obj_t)*actual_read_num*2);
         tuple_return = malloc(sizeof(mp_obj_t)*actual_read_num);
         memset(tuple_return,0,sizeof(mp_obj_t)*actual_read_num);
         int i;
         for(i = 0; i < actual_read_num; i++) {
-            record_list_py[i*3] = mp_obj_new_str(ydwl_record_list->ucUserName[i],strlen(ydwl_record_list->ucUserName[i]));
-            record_list_py[i*3+1] = mp_obj_new_str(ydwl_record_list->FolderName[i],strlen(ydwl_record_list->FolderName[i]));
-            record_list_py[i*3+2] = mp_obj_new_str(ydwl_record_list->ucFileName[i],strlen(ydwl_record_list->ucFileName[i]));
-            tuple_return[i] = mp_obj_new_list(3, record_list_py+3*i);
+            record_list_py[i*2] = mp_obj_new_str(ydwl_record_list->ucUserName[i],strlen(ydwl_record_list->ucUserName[i]));
+            record_list_py[i*2+1] = mp_obj_new_str(ydwl_record_list->ucFileName[i],strlen(ydwl_record_list->ucFileName[i]));
+            tuple_return[i] = mp_obj_new_list(2, record_list_py+2*i);
         }
         return mp_obj_new_tuple(actual_read_num, tuple_return);
     }
@@ -2454,7 +4066,7 @@ STATIC mp_obj_t qpy_poc_record_get_list(void) {
         return mp_obj_new_int(-1);
     }
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_record_get_list_obj, qpy_poc_record_get_list);
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_record_get_file_list_obj, qpy_poc_record_get_file_list);
 
 STATIC mp_obj_t qpy_poc_record_req_play(mp_obj_t record_file_obj) {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -2496,7 +4108,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_record_get_state_obj, qpy_poc_record_ge
 
 //register_member_change_cb end
 // wgw add
-#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL) && !defined(CONFIG_POC_QS_R07)
 
 // log
 STATIC mp_obj_t qpy_poc_log(mp_obj_t value) 
@@ -2707,9 +4319,7 @@ STATIC mp_obj_t qpy_poc_callusers(mp_obj_t poc_uid, mp_obj_t poc_cb)
         uids[i] = (poc_uid_t) mp_obj_get_int(items[i]);
     }
     mp_sched_schedule_callback_register(&(poc_obj.callusers_callback), poc_cb);
-
     ret = poc_ops->callusers(uids,len,qpy_poc_callusers_callback);
-
     return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_callusers_obj, qpy_poc_callusers);
@@ -2987,6 +4597,24 @@ error_exit:
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_poc_send_gpsinfo_obj, 6, 6, qpy_poc_send_gpsinfo_cb);
 #endif
 
+#else
+
+#if defined(CONFIG_POC_QS)  || defined(CONFIG_POC_QS_R07)
+STATIC mp_obj_t qpy_poc_set_login_account_cb(mp_obj_t account,mp_obj_t password,mp_obj_t aliTestServerIndex)
+{
+    if ( !mp_obj_is_str(account) || !mp_obj_is_str(password) )
+    {
+        return mp_const_false;
+    }
+    const char * in_account = mp_obj_str_get_str(account);
+    const char * in_password = mp_obj_str_get_str(password);
+       int in_aliTestServerIndex = (int)mp_obj_get_int(aliTestServerIndex);
+    poc_ops_t *poc_ops = poc_get_ops();
+    poc_ops->set_login_account(in_account,in_password,in_aliTestServerIndex);
+       return mp_const_true;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_poc_set_login_account_obj, qpy_poc_set_login_account_cb);
+
 #else
 STATIC mp_obj_t qpy_poc_set_login_account_cb(mp_obj_t account,mp_obj_t password)
 {
@@ -3001,9 +4629,10 @@ STATIC mp_obj_t qpy_poc_set_login_account_cb(mp_obj_t account,mp_obj_t password)
        return mp_const_true;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_set_login_account_obj, qpy_poc_set_login_account_cb);
+#endif
 
 // only CONFIG_POC_QS
-#if defined(CONFIG_POC_QS)  
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
 STATIC mp_obj_t qpy_poc_get_friendcount()
 {
        
@@ -3017,11 +4646,22 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_friendcount_obj, qpy_poc_get_friend
 STATIC mp_obj_t qpy_poc_play_tone()
 {
        poc_ops_t *poc_ops = poc_get_ops();
+       MP_THREAD_GIL_EXIT();
     poc_ops->play_tone();
+    MP_THREAD_GIL_ENTER();
        return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_play_tone_obj, qpy_poc_play_tone);
 
+STATIC mp_obj_t qpy_poc_get_is_device_paused()
+{
+       poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    ret = poc_ops->get_is_device_paused();
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_is_device_paused_obj, qpy_poc_get_is_device_paused);
+
 STATIC mp_obj_t qpy_poc_get_friendlist()
 {
        poc_ops_t *poc_ops = poc_get_ops();
@@ -3084,6 +4724,16 @@ STATIC mp_obj_t qpy_poc_register_online_state_cb(mp_obj_t args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_online_state_cb_obj, qpy_poc_register_online_state_cb);
 
+STATIC mp_obj_t qpy_poc_register_get_3days_weather_cb(mp_obj_t args)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    mp_sched_schedule_callback_register(&(poc_obj.register_get_3days_weather_cb), args);
+       return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_register_get_3days_weather_cb_obj, qpy_poc_register_get_3days_weather_cb);
+
+
+
 STATIC mp_obj_t qpy_poc_register_called_cb(mp_obj_t args)
 {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -3145,6 +4795,36 @@ STATIC mp_obj_t qpy_poc_request_flush_member(mp_obj_t args)
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_poc_request_flush_member_obj, qpy_poc_request_flush_member);
 
 
+STATIC mp_obj_t qpy_poc_entry_single_or_multiCall(mp_obj_t poc_uid, mp_obj_t count_obj)
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    int ret = 0;
+    mp_obj_t *items = NULL;
+    size_t len = 0;
+    mp_obj_list_get(poc_uid, &len, &items);
+    uint64_t * uids =(uint64_t *) calloc(len,sizeof(uint64_t));
+    if ( uids == NULL ){
+        return mp_obj_new_int(-1);
+    }
+    for ( int i =0; i<len; i++){        
+        if ( !mp_obj_is_int(items[i]) )
+        {
+            free(uids);
+            return mp_obj_new_int(-1);
+        }
+        uids[i] = (uint64_t) mp_obj_get_int(items[i]);
+    }
+    int count_id = mp_obj_get_int(count_obj);
+    poc_ops->entrySingleOrMultiCall(uids, count_id);
+    if (uids != NULL)
+    {
+        free(uids);
+    }
+       return mp_obj_new_int(0);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_poc_entry_single_or_multiCall_obj, qpy_poc_entry_single_or_multiCall);
+
+// 
 STATIC mp_obj_t qpy_poc_get_is_support_location()
 {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -3153,6 +4833,16 @@ STATIC mp_obj_t qpy_poc_get_is_support_location()
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_is_support_location_obj, qpy_poc_get_is_support_location);
 
+// 
+STATIC mp_obj_t qpy_poc_get_inactive_single_or_multi_callUser_count()
+{
+    poc_ops_t *poc_ops = poc_get_ops();
+    int ret = poc_ops->getInactiveSingleOrMultiCallUserCount();
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_get_inactive_single_or_multi_callUser_count_obj, qpy_poc_get_inactive_single_or_multi_callUser_count);
+
+
 STATIC mp_obj_t qpy_poc_set_dev_location_type(mp_obj_t location_type,mp_obj_t isenable)
 {
     poc_ops_t *poc_ops = poc_get_ops();
@@ -3287,6 +4977,7 @@ STATIC mp_obj_t qpy_poc_start_scan_wifi(void)
     return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_start_scan_wifi_obj,qpy_poc_start_scan_wifi);
+    //void (*upload_wifi_data)(char* arg1,int arg2,int* arg3,int arg4,int arg5);
 
 STATIC mp_obj_t qpy_poc_upload_wifi_data(mp_obj_t lcoationwifimac, mp_obj_t localtionwifirssi,mp_obj_t wificount)
 {
@@ -3328,12 +5019,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_poc_send_heart_package_obj,qpy_poc_send_hea
 
 #endif // !CONFIG_POC_QS
 
-#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_BND_XIN)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_BND_XIN)  || defined(CONFIG_POC_QS_R07)
 
 STATIC mp_obj_t qpy_poc_set_ptt_status(mp_obj_t status)
 {
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS)  || defined(CONFIG_POC_QS_R07)
     poc_ops_t *poc_ops = poc_get_ops();
     if (!mp_obj_is_int(status)){
         return mp_obj_new_int(-1);
@@ -3367,7 +5058,7 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     
     POC_LOG("qpy_module_poc_deinit\n");
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS)  || defined(CONFIG_POC_QS_R07)
     poc_ops_t *poc_ops = poc_get_ops();
     int log_status = poc_ops->get_loginstate();
     if ( log_status == 1 ){ // login state,so we will do logout
@@ -3395,7 +5086,7 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     poc_ops_t *poc_ops = poc_get_ops();
     int log_status = poc_ops->get_loginstate();
     if ( log_status == 1 ){ // login state,so we will do logout
-        poc_ops->logout();
+    poc_ops->logout();
     }
        qpy_poc_deregister_cb(&poc_obj.audio_callback);
        qpy_poc_deregister_cb(&poc_obj.join_group_callback);
@@ -3409,7 +5100,7 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     poc_ops->register_audio_cb(NULL);
 //    poc_ops->register_called_cb(NULL);
     //poc->register_poc_at_cb(NULL);
-#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL) && !defined(CONFIG_POC_QS_R07)
 
     qpy_poc_deregister_cb(&poc_obj.login_callback);
        qpy_poc_deregister_cb(&poc_obj.calluser_callback);
@@ -3433,7 +5124,10 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     qpy_poc_deregister_cb(&poc_obj.register_member_audio_enable_cb);
     qpy_poc_deregister_cb(&poc_obj.register_sos_status_cb);
     qpy_poc_deregister_cb(&poc_obj.register_sos_map_cb);
+    qpy_poc_deregister_cb(&poc_obj.register_recv_sos_alarm_cb);
     qpy_poc_deregister_cb(&poc_obj.register_recv_sos_info_cb);
+    qpy_poc_deregister_cb(&poc_obj.register_recv_report_sos_ack_cb);
+    qpy_poc_deregister_cb(&poc_obj.register_recv_report_sos_ack_timeout_cb);
     qpy_poc_deregister_cb(&poc_obj.register_recv_enclosure_alarm_cb);
     qpy_poc_deregister_cb(&poc_obj.register_recv_broadcast_info_cb);
 
@@ -3449,7 +5143,10 @@ STATIC mp_obj_t qpy_module_poc_deinit(void){
     poc_ops->register_member_audio_enable_cb(NULL);
     poc_ops->register_sos_status_cb(NULL);
     poc_ops->register_sos_map_cb(NULL);
+    poc_ops->register_recv_sos_alarm_cb(NULL);
     poc_ops->register_recv_sos_info_cb(NULL);
+    poc_ops->register_recv_report_sos_ack_cb(NULL);
+    poc_ops->register_recv_report_sos_ack_timeout_cb(NULL);
     poc_ops->register_recv_enclosure_alarm_cb(NULL);
     poc_ops->register_recv_broadcast_info_cb(NULL);
 
@@ -3499,6 +5196,7 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_open_app), MP_ROM_PTR(&qpy_poc_open_app_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_account), MP_ROM_PTR(&qpy_poc_set_account_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_notify_spker_cb), MP_ROM_PTR(&qpy_poc_register_notify_spker_cb_obj) },
+    
 #endif
 
 #if defined(CONFIG_POC_ZZD)
@@ -3513,27 +5211,118 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
 #endif
 
 #if defined(CONFIG_POC_YDWL)
-    { MP_ROM_QSTR(MP_QSTR_request_weather_info), MP_ROM_PTR(&qpy_poc_request_weather_info_obj) },
     { MP_ROM_QSTR(MP_QSTR_record_onoff), MP_ROM_PTR(&qpy_poc_record_onoff_obj) },
-    // { MP_ROM_QSTR(MP_QSTR_record_clear), MP_ROM_PTR(&qpy_poc_record_clear_obj) },
-    { MP_ROM_QSTR(MP_QSTR_record_get_list), MP_ROM_PTR(&qpy_poc_record_get_list_obj) },
+    { MP_ROM_QSTR(MP_QSTR_record_get_folder_list), MP_ROM_PTR(&qpy_poc_record_get_folder_list_obj) },
+    { MP_ROM_QSTR(MP_QSTR_record_get_file_list), MP_ROM_PTR(&qpy_poc_record_get_file_list_obj) },
     { MP_ROM_QSTR(MP_QSTR_record_play), MP_ROM_PTR(&qpy_poc_record_req_play_obj) },
     { MP_ROM_QSTR(MP_QSTR_record_stop_play), MP_ROM_PTR(&qpy_poc_record_stop_play_obj) },
-    // { MP_ROM_QSTR(MP_QSTR_record_save_flash), MP_ROM_PTR(&qpy_poc_record_save_flash_obj) },
     { MP_ROM_QSTR(MP_QSTR_record_get_state), MP_ROM_PTR(&qpy_poc_record_get_state_obj) },
     { MP_ROM_QSTR(MP_QSTR_tts_init), MP_ROM_PTR(&qpy_poc_tts_init_obj) },
     { MP_ROM_QSTR(MP_QSTR_tts_play), MP_ROM_PTR(&qpy_poc_tts_play_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_map), MP_ROM_PTR(&qpy_poc_get_map_png_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_account_info), MP_ROM_PTR(&qpy_poc_get_account_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_report_alarm), MP_ROM_PTR(&qpy_poc_report_alarm_obj) },
+    { MP_ROM_QSTR(MP_QSTR_stop_alarm), MP_ROM_PTR(&qpy_poc_stop_alarm_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ignore_alarm), MP_ROM_PTR(&qpy_poc_ignore_alarm_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_sos_cb), MP_ROM_PTR(&qpy_poc_register_sos_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_ctrl_pa_cb), MP_ROM_PTR(&qpy_poc_register_ctrl_pa_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_invite_info_cb), MP_ROM_PTR(&qpy_poc_register_invite_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_cell_locator_info_cb), MP_ROM_PTR(&qpy_poc_register_cell_locator_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_gps_send_location), MP_ROM_PTR(&qpy_poc_gps_send_location_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ufs_open), MP_ROM_PTR(&qpy_poc_ufs_open_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ufs_read), MP_ROM_PTR(&qpy_poc_ufs_read_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ufs_write), MP_ROM_PTR(&qpy_poc_ufs_write_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ufs_close), MP_ROM_PTR(&qpy_poc_ufs_close_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_cfg_from_file), MP_ROM_PTR(&qpy_poc_get_cfg_from_file_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_login_from_file), MP_ROM_PTR(&qpy_poc_get_login_from_file_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_cfg), MP_ROM_PTR(&qpy_poc_set_cfg_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_cfg), MP_ROM_PTR(&qpy_poc_get_cfg_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_icmic_gain), MP_ROM_PTR(&qpy_poc_set_icmic_gain_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_weather_info_cb), MP_ROM_PTR(&qpy_poc_register_weather_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_request_weather_info), MP_ROM_PTR(&qpy_poc_request_weather_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_weather_info), MP_ROM_PTR(&qpy_poc_get_weather_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_map_png_cb), MP_ROM_PTR(&qpy_poc_register_map_png_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_login_sta_cb), MP_ROM_PTR(&qpy_poc_register_login_sta_cb_obj) },
 #endif
 
-#if defined(CONFIG_POC_QS)
+#if defined(CONFIG_POC_QS) || defined(CONFIG_POC_QS_R07)
        { MP_ROM_QSTR(MP_QSTR_set_tone_switch),  MP_ROM_PTR(&qpy_poc_set_tone_switch_obj) },
     { MP_ROM_QSTR(MP_QSTR_play_tone),  MP_ROM_PTR(&qpy_poc_play_tone_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_device_paused),  MP_ROM_PTR(&qpy_poc_get_is_device_paused_obj) },
        { MP_ROM_QSTR(MP_QSTR_Set_Tone_Gain),  MP_ROM_PTR(&qpy_poc_set_tone_codeGain_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_playing_status), MP_ROM_PTR(&qpy_poc_get_playing_status_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_recording_status), MP_ROM_PTR(&qpy_poc_get_recording_status_obj) },
+    { MP_ROM_QSTR(MP_QSTR_check_update_weather), MP_ROM_PTR(&qpy_poc_check_update_werther_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_weather_info), MP_ROM_PTR(&qpy_poc_get_Weather_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_3days_weather_info), MP_ROM_PTR(&qpy_poc_get_3days_Weather_info_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_support_weather), MP_ROM_PTR(&qpy_poc_get_is_support_weather_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_is_support_weather), MP_ROM_PTR(&qpy_poc_set_is_support_weather_obj) },
+       { MP_ROM_QSTR(MP_QSTR_send_address_request), MP_ROM_PTR(&qpy_poc_send_addr_request_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_address_data), MP_ROM_PTR(&qpy_poc_get_address_data_obj) },
+    //2.0
+    { MP_ROM_QSTR(MP_QSTR_task_run), MP_ROM_PTR(&qpy_poc_taskrun_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_account_and_password), MP_ROM_PTR(&qpy_poc_setaccountandpassword_obj) },
+    { MP_ROM_QSTR(MP_QSTR_exit_single_or_multicall), MP_ROM_PTR(&qpy_poc_exitsingleormulticall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_multicall_member), MP_ROM_PTR(&qpy_poc_refreshmulticallmember_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_in_tempgroup), MP_ROM_PTR(&qpy_poc_getisintempgroup_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_singlecall), MP_ROM_PTR(&qpy_poc_getissinglecall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_multicall), MP_ROM_PTR(&qpy_poc_getismulticall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_multicall_id), MP_ROM_PTR(&qpy_poc_getmulticallid_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_active_singlecall), MP_ROM_PTR(&qpy_poc_getisactivesinglecall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_active_multicall), MP_ROM_PTR(&qpy_poc_getisactivemulticall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_active_single_or_multicall_usercount), MP_ROM_PTR(&qpy_poc_getactivesingleormulticallusercount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_single_or_multicall_userdata), MP_ROM_PTR(&qpy_poc_getsingleormulticalluserdata_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_single_groupdata), MP_ROM_PTR(&qpy_poc_getsinglegroupdata_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_groupid), MP_ROM_PTR(&qpy_poc_getcurrentgroupid_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_groupname_mutex), MP_ROM_PTR(&qpy_poc_getcurrentgroupnamemutex_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_grouplist), MP_ROM_PTR(&qpy_poc_refreshgrouplist_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_groupmember_listcount), MP_ROM_PTR(&qpy_poc_getcurrentgroupmemberlistcount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_group_onlinemembercount), MP_ROM_PTR(&qpy_poc_getcurrentgrouponlinemembercount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_groupmember_userdata), MP_ROM_PTR(&qpy_poc_getcurrentgroupmemberuserdata_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_groupmemberlist), MP_ROM_PTR(&qpy_poc_refreshgroupmemberlist_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_friendmember_listcount), MP_ROM_PTR(&qpy_poc_getfriendmemberlistcount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_friendmember_userdata), MP_ROM_PTR(&qpy_poc_getfriendmemberuserdata_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_friendmemberlist), MP_ROM_PTR(&qpy_poc_refreshfriendmemberlist_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_account_nickname), MP_ROM_PTR(&qpy_poc_getaccountnickname_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_friend_is_enable), MP_ROM_PTR(&qpy_poc_getfriendisenable_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_current_state), MP_ROM_PTR(&qpy_poc_getcurrentstate_obj) },
+    { MP_ROM_QSTR(MP_QSTR_update_tailker_with_userid), MP_ROM_PTR(&qpy_poc_updatetailkerwithuserid_obj) },
+    { MP_ROM_QSTR(MP_QSTR_handle_socketpackage), MP_ROM_PTR(&qpy_poc_handlesocketpackage_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_device_userid), MP_ROM_PTR(&qpy_poc_getdeviceuserid_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_voice_packet), MP_ROM_PTR(&qpy_poc_getisvoicepacket_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_devicevoice_priority), MP_ROM_PTR(&qpy_poc_getdevicevoicepriority_obj) },
+    { MP_ROM_QSTR(MP_QSTR_ge_treceivevoice_priorityafterhandlesocketpackage), MP_ROM_PTR(&qpy_poc_getreceivevoicepriorityafterhandlesocketpackage_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_receivevoice_priority), MP_ROM_PTR(&qpy_poc_getreceivevoicepriority_obj) },
+    { MP_ROM_QSTR(MP_QSTR_is_listen_channel), MP_ROM_PTR(&qpy_poc_islistenchannel_obj) },
+    { MP_ROM_QSTR(MP_QSTR_add_listen_channel), MP_ROM_PTR(&qpy_poc_addlistenchannel_obj) },
+    { MP_ROM_QSTR(MP_QSTR_remove_listen_channel), MP_ROM_PTR(&qpy_poc_removelistenchannel_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_listen_channel_count), MP_ROM_PTR(&qpy_poc_getlistenchannelcount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_multi_channel_listenlist), MP_ROM_PTR(&qpy_poc_refreshmultichannellistenlist_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_all_listen_groupmember), MP_ROM_PTR(&qpy_poc_refreshalllistengroupmember_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_one_groupmember_listcount), MP_ROM_PTR(&qpy_poc_getonegroupmemberlistcount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_refresh_onegroupmember), MP_ROM_PTR(&qpy_poc_refreshonegroupmember_obj) },
+    { MP_ROM_QSTR(MP_QSTR_delete_terminalgroup), MP_ROM_PTR(&qpy_poc_deleteterminalgroup_obj) },
+    { MP_ROM_QSTR(MP_QSTR_exit_terminalgroup), MP_ROM_PTR(&qpy_poc_exitterminalgroup_obj) },
+    { MP_ROM_QSTR(MP_QSTR_add_terminalgroupmember), MP_ROM_PTR(&qpy_poc_addterminalgroupmember_obj) },
+    { MP_ROM_QSTR(MP_QSTR_remove_terminalgroupmember), MP_ROM_PTR(&qpy_poc_removeterminalgroupmember_obj) },
+    { MP_ROM_QSTR(MP_QSTR_request_terminalgroupname), MP_ROM_PTR(&qpy_poc_requestterminalgroupname_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_terminalgroupnamecount), MP_ROM_PTR(&qpy_poc_getterminalgroupnamecount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_terminalgroupnamelistdata), MP_ROM_PTR(&qpy_poc_getterminalgroupnamelistdata_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_is_in_broadcastgroup), MP_ROM_PTR(&qpy_poc_getisinbroadcastgroup_obj) },
+    { MP_ROM_QSTR(MP_QSTR_enter_broadcast), MP_ROM_PTR(&qpy_poc_enterbroadcast_obj) },
+    { MP_ROM_QSTR(MP_QSTR_exit_broadcast), MP_ROM_PTR(&qpy_poc_exitbroadcast_obj) },
+    { MP_ROM_QSTR(MP_QSTR_reset_listen_autoguard_after_setting), MP_ROM_PTR(&qpy_poc_resetlistenautoguardaftersetting_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_listen_autoguard_left_seconds), MP_ROM_PTR(&qpy_poc_getlistenautoguardleftseconds_obj) },
+    { MP_ROM_QSTR(MP_QSTR_create_terminalgroup), MP_ROM_PTR(&qpy_poc_createterminalgroup_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_one_groupmember_userdata), MP_ROM_PTR(&qpy_poc_getonegroupmemberuserdata_obj) },
+
+
+
+
 #endif
 
 
-#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL)
+#if !defined(CONFIG_POC_QS) && !defined(CONFIG_POC_ZZD) && !defined(CONFIG_POC_YDWL) && !defined(CONFIG_POC_QS_R07)
        { MP_ROM_QSTR(MP_QSTR_log), MP_ROM_PTR(&qpy_poc_log_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_audiostate), MP_ROM_PTR(&qpy_poc_get_audiostate_obj) },
     { MP_ROM_QSTR(MP_QSTR_play_tts), MP_ROM_PTR(&qpy_poc_play_tts_obj) },
@@ -3603,10 +5392,14 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_send_gpsinfo), MP_ROM_PTR(&qpy_poc_send_gpsinfo_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_member_audio_enable_cb), MP_ROM_PTR(&qpy_poc_register_member_audio_enable_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_sos_start), MP_ROM_PTR(&qpy_poc_sos_start_obj) },
+    { MP_ROM_QSTR(MP_QSTR_report_sos), MP_ROM_PTR(&qpy_poc_report_sos_obj) },
     { MP_ROM_QSTR(MP_QSTR_query_sos_map), MP_ROM_PTR(&qpy_poc_query_sos_map_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_sos_status_cb), MP_ROM_PTR(&qpy_poc_register_sos_status_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_sos_map_cb), MP_ROM_PTR(&qpy_poc_register_sos_map_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_recv_sos_alarm_cb), MP_ROM_PTR(&qpy_poc_register_recv_sos_alarm_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_recv_sos_info_cb), MP_ROM_PTR(&qpy_poc_register_recv_sos_info_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_recv_report_sos_ack_cb), MP_ROM_PTR(&qpy_poc_register_recv_report_sos_ack_cb_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_recv_report_sos_ack_timeout_cb), MP_ROM_PTR(&qpy_poc_register_recv_report_sos_ack_timeout_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_recv_enclosure_alarm_cb), MP_ROM_PTR(&qpy_poc_register_recv_enclosure_alarm_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_current_zone_time), MP_ROM_PTR(&qpy_poc_current_zone_time_obj) },
     { MP_ROM_QSTR(MP_QSTR_request_upgrade), MP_ROM_PTR(&qpy_poc_request_upgrade_obj) },
@@ -3616,15 +5409,17 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_change_logininfo), MP_ROM_PTR(&qpy_poc_change_logininfo_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_logininfo), MP_ROM_PTR(&qpy_poc_get_logininfo_obj) },
     { MP_ROM_QSTR(MP_QSTR_set_ptt_status), MP_ROM_PTR(&qpy_poc_set_ptt_status_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_terminal_info), MP_ROM_PTR(&qpy_poc_set_terminal_info_obj) },
 
     #endif
 #else
 
-    #if defined(CONFIG_POC_QS)
+    #if defined(CONFIG_POC_QS)  || defined(CONFIG_POC_QS_R07)
     { MP_ROM_QSTR(MP_QSTR_register_error_cb), MP_ROM_PTR(&qpy_poc_register_error_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_online_state_cb), MP_ROM_PTR(&qpy_poc_register_online_state_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_register_called_cb), MP_ROM_PTR(&qpy_poc_register_called_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_friendcount), MP_ROM_PTR(&qpy_poc_get_friendcount_obj) },
+    { MP_ROM_QSTR(MP_QSTR_register_get_3days_weather_cb), MP_ROM_PTR(&qpy_poc_register_get_3days_weather_cb_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_friendlist), MP_ROM_PTR(&qpy_poc_get_friendlist_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_isenable_single_call), MP_ROM_PTR(&qpy_poc_get_isenable_single_call_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_isenable_gprs), MP_ROM_PTR(&qpy_poc_get_isenable_gprs_obj) },
@@ -3652,15 +5447,18 @@ STATIC const mp_rom_map_elem_t mp_module_poc_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_LOCATION_TYPE_GPS), MP_ROM_INT(LOCATION_TYPE_GPS) },
     { MP_ROM_QSTR(MP_QSTR_LOCATION_TYPE_CELL), MP_ROM_INT(LOCATION_TYPE_CELL) },
     { MP_ROM_QSTR(MP_QSTR_LOCATION_TYPE_WIFI), MP_ROM_INT(LOCATION_TYPE_WIFI) },
-
+    { MP_ROM_QSTR(MP_QSTR_entry_single_or_multiCall), MP_ROM_PTR(&qpy_poc_entry_single_or_multiCall_obj) },
+    { MP_ROM_QSTR(MP_QSTR_get_inactive_single_or_multi_callUser_count), MP_ROM_PTR(&qpy_poc_get_inactive_single_or_multi_callUser_count_obj) },
     #endif
 
     { MP_ROM_QSTR(MP_QSTR_set_login_account), MP_ROM_PTR(&qpy_poc_set_login_account_obj) },
 #endif  // !CONFIG_POC_QS
 
-#if defined(BOARD_EC600MCN_LA_POC_XBND)//彬其
+#if defined(BOARD_EC600MCN_LA_POC_XBND)  || defined(BOARD_EC600MCN_LE_POC_XBND) || defined(BOARD_EC600MEU_LA_POC_XBND) \
+ || defined(BOARD_EC600MLA_LA_POC_XBND)//彬其
        { MP_ROM_QSTR(MP_QSTR_speak_mode), MP_ROM_PTR(&qpy_poc_speak_mode_obj) },
        { MP_ROM_QSTR(MP_QSTR_ptt_cfg), MP_ROM_PTR(&qpy_poc_ptt_cfg_obj) },
+       { MP_ROM_QSTR(MP_QSTR_set_speak_callback), MP_ROM_PTR(&qpy_pocspeak_set_callback_obj) },
 #endif
 
 };
index 720bd4f..f11aa85 100644 (file)
@@ -23,6 +23,7 @@
 #include "helios_debug.h"
 
 #if MICROPY_QPY_MODULE_URSA
+#include "mbedtls/bignum.h"
 #include "mbedtls/rsa.h"
 #include "mbedtls/rsa_internal.h"
 #include "mbedtls/oid.h"
@@ -138,7 +139,7 @@ exit:
     mbedtls_entropy_free( &entropy );
     if (ret != 0)
     {
-        mp_raise_ValueError("Generate an RSA keypair FAIL");
+        mp_raise_ValueError(MP_ERROR_TEXT("Generate an RSA keypair FAIL"));
     }
 
     return mp_const_none;
@@ -374,12 +375,624 @@ exit:
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ql_decrypt_obj, 1, 2, ql_rsa_decrypt);
 
+STATIC mp_obj_t ql_rsa_pub_verify (size_t n_args, const mp_obj_t *args)
+{
+    mp_buffer_info_t bufinfo;
+    mp_buffer_info_t datainfo;
+    
+    mp_buffer_info_t pub_info;
+    mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+    mp_get_buffer_raise(args[3], &datainfo, MP_BUFFER_READ);
+
+    unsigned char* publickey = NULL;
+    int size, n, ret=1;
+    const int method = mp_obj_get_int(args[1]);
+
+    if (n_args == 4)
+    {
+        if (method == 0)
+        {
+            const char *file_name = mp_obj_str_get_str(args[2]);
+
+            if (strlen(file_name) > 120)//max file name size
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("File path too long"));
+            }
+            HeliosFILE *fpub = NULL;
+            char path[128];
+            memset(path, 0, sizeof(path));
+
+            sprintf(path, "U:/%s", file_name);
+
+            if( ( fpub = Helios_fopen( path, "rb" ) ) == NULL )
+            {
+                Helios_fclose( fpub );
+                mp_printf(&mp_plat_print, "{RSA} failed Helios_fopen = %s \n", path);
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign Helios_fopen "));
+            }
+
+            Helios_fseek(fpub, 0, SEEK_END);
+            if ((size = Helios_ftell(fpub)) == -1)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign Helios_ftell "));
+            }
+            Helios_fseek(fpub, 0, SEEK_SET);
+
+            n = (size_t)size;
+            if (n + 1 == 0 || (publickey = mbedtls_calloc(1, n + 1)) == NULL)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign mbedtls_calloc "));
+            }
+
+            if (fread(publickey, 1, n, fpub) != n)
+            {
+                Helios_fclose( fpub );
+                free(publickey);
+                publickey = NULL;
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign fread "));
+            }
+
+            Helios_fclose( fpub );
+            
+        }
+        else if (method == 1)
+        {
+            mp_get_buffer_raise(args[2], &pub_info, MP_BUFFER_READ);
+
+            if (pub_info.len <= 0)
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv info FAIL"));
+            }
+        }
+    }
+    else
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv_encrypt FAIL"));
+    }
+
+    const char *pers = "rsa_pub_verify";
+
+    mbedtls_rsa_context rsa;
+    mbedtls_mpi N, E;
+    mbedtls_entropy_context entropy;
+    mbedtls_ctr_drbg_context ctr_drbg;
+
+    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );
+    mbedtls_ctr_drbg_init( &ctr_drbg );
+    mbedtls_entropy_init( &entropy );
+    mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E );
+    mbedtls_pk_context ctx_pk;
+    mbedtls_pk_init(&ctx_pk);
+
+    if (method == 0)
+    {
+        if (0 != mbedtls_pk_parse_public_key(&ctx_pk, publickey, n + 1))
+        {
+            free(publickey);
+            publickey = NULL;
+            mp_printf(&mp_plat_print, "{RSA} failed priv publickey mbedtls_pk_parse_public_key returned = %d \n", ret);
+            goto exit;
+        }
+
+        free(publickey);
+        publickey = NULL;
+    }
+    else if (method == 1)
+    {
+        if (0 != mbedtls_pk_parse_public_key(&ctx_pk, pub_info.buf, pub_info.len + 1))
+        {
+            mp_printf(&mp_plat_print, "{RSA} failed pub info mbedtls_pk_parse_public_key returned = %d \n", ret);
+            goto exit;
+        }
+    }
+
+    ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen( pers ) );
+    if( ret != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed pub encrypt mbedtls_ctr_drbg_seed returned = %d \n", ret);
+        goto exit;
+    }
+
+    /*导入pem内的公钥*/
+    rsa = *(mbedtls_rsa_context*)ctx_pk.pk_ctx;
+
+    if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL,
+                                MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, 0,
+                                datainfo.buf, bufinfo.buf ) != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed pub encrypt mbedtls_rsa_pkcs1_verify \n");
+        ret = -1;
+        goto exit;
+    }
+
+exit:
+    mbedtls_mpi_free( &N ); 
+    mbedtls_mpi_free( &E );
+    mbedtls_ctr_drbg_free( &ctr_drbg );
+    mbedtls_entropy_free( &entropy );
+    mbedtls_rsa_free( &rsa );
+
+    if (ret != 0 )
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("RSA Pub Verify FAIL"));
+    }
+
+    return mp_obj_new_int(0);
+ }
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ql_pub_verify_obj, 4, 4, ql_rsa_pub_verify);
+
+STATIC mp_obj_t ql_rsa_priv_sign (size_t n_args, const mp_obj_t *args)
+{
+    mp_buffer_info_t bufinfo;
+    mp_buffer_info_t priv_info;
+    mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+
+    unsigned char* privatekey = NULL;
+    int size, n, ret=1;
+    const int method = mp_obj_get_int(args[1]);
+
+    if (n_args == 3)
+    {
+        if (method == 0)
+        {
+            const char *file_name = mp_obj_str_get_str(args[2]);
+
+            if (strlen(file_name) > 120)//max file name size
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("File path too long"));
+            }
+            HeliosFILE *fpub = NULL;
+            char path[128];
+            memset(path, 0, sizeof(path));
+
+            sprintf(path, "U:/%s", file_name);
+
+            if( ( fpub = Helios_fopen( path, "rb" ) ) == NULL )
+            {
+                Helios_fclose( fpub );
+                mp_printf(&mp_plat_print, "{RSA} failed Helios_fopen = %s \n", path);
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign Helios_fopen "));
+            }
+
+            Helios_fseek(fpub, 0, SEEK_END);
+            if ((size = Helios_ftell(fpub)) == -1)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign Helios_ftell "));
+            }
+            Helios_fseek(fpub, 0, SEEK_SET);
+
+            n = (size_t)size;
+            if (n + 1 == 0 || (privatekey = mbedtls_calloc(1, n + 1)) == NULL)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign mbedtls_calloc "));
+            }
+
+            if (fread(privatekey, 1, n, fpub) != n)
+            {
+                Helios_fclose( fpub );
+                free(privatekey);
+                privatekey = NULL;
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed sign fread "));
+            }
+
+            Helios_fclose( fpub );
+            
+        }
+        else if (method == 1)
+        {
+            mp_get_buffer_raise(args[2], &priv_info, MP_BUFFER_READ);
+
+            if (priv_info.len <= 0)
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv info FAIL"));
+            }
+        }
+    }
+    else
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv_encrypt FAIL"));
+    }
+
+    const char *pers = "rsa_priv_sign";
+
+    mbedtls_rsa_context rsa;
+    mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
+    mbedtls_entropy_context entropy;
+    mbedtls_ctr_drbg_context ctr_drbg;
+
+    //mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );
+    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V21, 0 );
+    mbedtls_ctr_drbg_init( &ctr_drbg );
+    mbedtls_entropy_init( &entropy );
+    mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P ); mbedtls_mpi_init( &Q );
+    mbedtls_mpi_init( &D ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &DP );
+    mbedtls_mpi_init( &DQ ); mbedtls_mpi_init( &QP );
+
+    mbedtls_pk_context ctx_pk;
+    mbedtls_pk_init(&ctx_pk);
+
+    if (method == 0)
+    {
+        if (0 != mbedtls_pk_parse_key(&ctx_pk, privatekey, n + 1, NULL, 0))
+        {
+            free(privatekey);
+            privatekey = NULL;
+            mp_printf(&mp_plat_print, "{RSA} failed priv privatekey mbedtls_pk_parse_key returned = %d \n", ret);
+            goto exit;
+        }
+
+        free(privatekey);
+        privatekey = NULL;
+    }
+    else if (method == 1)
+    {
+        if (0 != mbedtls_pk_parse_key(&ctx_pk, priv_info.buf, priv_info.len + 1, NULL, 0))
+        {
+            mp_printf(&mp_plat_print, "{RSA} failed priv info mbedtls_pk_parse_key returned = %d \n", ret);
+            goto exit;
+        }
+    }
+
+    ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func,
+                                 &entropy, (const unsigned char *) pers, strlen( pers ) );
+    if( ret != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed priv encrypt mbedtls_ctr_drbg_seed returned = %d \n", ret);
+        goto exit;
+    }
+
+    /*导入pem内的私钥*/
+    rsa = *(mbedtls_rsa_context*)ctx_pk.pk_ctx;
+
+    unsigned char rsa_plaintext[1024];
+    unsigned char rsa_ciphertext[300];
+
+    memset(rsa_plaintext, 0, sizeof( rsa_plaintext ) );
+    memset(rsa_ciphertext, 0, sizeof( rsa_ciphertext ) );
+    memcpy( rsa_plaintext, bufinfo.buf, bufinfo.len );
+    
+    //if( mbedtls_rsa_pkcs1_encrypt( &rsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PRIVATE,
+    //                               bufinfo.len, rsa_plaintext, rsa_ciphertext ) != 0 )
+    if( mbedtls_rsa_pkcs1_sign( &rsa, mbedtls_ctr_drbg_random, &ctr_drbg,
+                                MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256, bufinfo.len,
+                                rsa_plaintext, rsa_ciphertext ) != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed priv encrypt mbedtls_rsa_pkcs1_encrypt returned = %d \n", ret);
+        ret = -1;
+        goto exit;
+    }
+
+exit:
+    mbedtls_mpi_free( &N ); 
+    mbedtls_mpi_free( &E );
+    mbedtls_ctr_drbg_free( &ctr_drbg );
+    mbedtls_entropy_free( &entropy );
+    mbedtls_rsa_free( &rsa );
+
+    if (ret != 0 )
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("RSA priv Encrypt FAIL"));
+    }
+
+    return mp_obj_new_str((char *)rsa_ciphertext, rsa.len);
+ }
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ql_priv_sign_obj, 3, 3, ql_rsa_priv_sign);
+
+STATIC mp_obj_t ql_rsa_priv_decrypt (size_t n_args, const mp_obj_t *args)
+{
+    mp_buffer_info_t bufinfo;
+    mp_buffer_info_t priv_info;
+    mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+
+    const int method = mp_obj_get_int(args[1]);
+
+    int size, n, ret = 1;
+    unsigned char* privatekey = NULL;
+
+    if (method == 0)
+    {        
+        if (n_args == 3)
+        {
+            HeliosFILE *fpub = NULL;
+            const char *file_name = mp_obj_str_get_str(args[2]);
+
+            if (strlen(file_name) > 120)//max file name size
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("File path too long"));
+            }
+
+            char path[128];
+            memset(path, 0, sizeof(path));
+            sprintf(path, "U:/%s", file_name);
+            if( ( fpub = Helios_fopen( path, "rb" ) ) == NULL )
+            {
+                Helios_fclose( fpub );
+                mp_printf(&mp_plat_print, "{RSA} failed Helios_fopen = %s \n", path);
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed decrypt Helios_fopen"));
+            }
+
+            Helios_fseek(fpub, 0, SEEK_END);
+            if ((size = Helios_ftell(fpub)) == -1)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed decrypt Helios_ftell"));
+            }
+            Helios_fseek(fpub, 0, SEEK_SET);
+
+            n = (size_t)size;
+            if (n + 1 == 0 || (privatekey = mbedtls_calloc(1, n + 1)) == NULL)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed decrypt Helios_fclose"));
+            }
+
+            if (fread(privatekey, 1, n, fpub) != n)
+            {
+                Helios_fclose( fpub );
+                free(privatekey);
+                privatekey = NULL;
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed decrypt fread "));
+            }
+            Helios_fclose( fpub );
+        }
+        else
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv_decrypt FAIL"));
+        }
+    }
+    else if (method == 1)
+    {
+        mp_get_buffer_raise(args[2], &priv_info, MP_BUFFER_READ);
+
+        if (priv_info.len <= 0)
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("input rsa priv info FAIL"));
+        }
+    }
+
+    const char *pers = "rsa_priv_decrypt";
+
+    mbedtls_rsa_context rsa;
+    mbedtls_mpi N, P, Q, D, E, DP, DQ, QP;
+    mbedtls_entropy_context entropy;
+    mbedtls_ctr_drbg_context ctr_drbg;
+
+    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );
+    mbedtls_ctr_drbg_init( &ctr_drbg );
+    mbedtls_entropy_init( &entropy );
+    mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P ); mbedtls_mpi_init( &Q );
+    mbedtls_mpi_init( &D ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &DP );
+    mbedtls_mpi_init( &DQ ); mbedtls_mpi_init( &QP );
+
+    mbedtls_pk_context ctx_pk;
+    mbedtls_pk_init(&ctx_pk);
+
+    if (method == 0)
+    {
+        if (0 != mbedtls_pk_parse_key(&ctx_pk, privatekey, n + 1, NULL, 0))
+        {
+            free(privatekey);
+            privatekey = NULL;
+            mp_printf(&mp_plat_print, "{RSA} failed priv privatekey mbedtls_pk_parse_key returned = %d \n", ret);
+            goto exit;
+        }
+
+        free(privatekey);
+        privatekey = NULL;
+    }
+    else if (method == 1)
+    {
+        if (0 != mbedtls_pk_parse_key(&ctx_pk, priv_info.buf, priv_info.len + 1, NULL, 0))
+        {
+            mp_printf(&mp_plat_print, "{RSA} failed priv info mbedtls_pk_parse_key returned = %d \n", ret);
+            goto exit;
+        }
+    }
+
+    ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func,
+                                 &entropy, (const unsigned char *) pers, strlen( pers ) );
+    if( ret != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed priv encrypt mbedtls_ctr_drbg_seed returned = %d \n", ret);
+        goto exit;
+    }
+
+    /*导入pem内的私钥*/
+    rsa = *(mbedtls_rsa_context*)ctx_pk.pk_ctx;
+
+    if ((ret = mbedtls_rsa_complete(&rsa)) != 0)
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed priv decrypt mbedtls_rsa_complete returned = %d \n", ret);
+        goto exit;
+    }
+
+    size_t len = 0;
+    unsigned char out_buf[1024];
+
+    memset(out_buf, 0, sizeof( out_buf ) );
+
+    if( (ret = mbedtls_rsa_pkcs1_decrypt( &rsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PRIVATE,
+                                   &len, bufinfo.buf, out_buf, sizeof(out_buf) ) ) != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed decrypt mbedtls_rsa_pkcs1_decrypt ret = %d \n", ret);
+        goto exit;
+    }
+
+exit:
+    mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P ); mbedtls_mpi_free( &Q );
+    mbedtls_mpi_free( &D ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &DP );
+    mbedtls_mpi_free( &DQ ); mbedtls_mpi_free( &QP );
+    mbedtls_ctr_drbg_free( &ctr_drbg );
+    mbedtls_entropy_free( &entropy );
+    mbedtls_rsa_free( &rsa );
+
+    if (ret != 0 )
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("RSA priv Encrypt FAIL"));
+    }
+
+    return mp_obj_new_str((char *)out_buf, len);
+ }
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ql_priv_decrypt_obj, 3, 3, ql_rsa_priv_decrypt);
+
+STATIC mp_obj_t ql_rsa_pub_encrypt (size_t n_args, const mp_obj_t *args)
+{
+    mp_buffer_info_t bufinfo;
+    mp_buffer_info_t priv_info;
+    mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+
+    const int method = mp_obj_get_int(args[1]);
+
+    int size, n, ret = 1;
+    unsigned char* publickey = NULL;
+
+    if (method == 0)
+    {        
+        if (n_args == 3)
+        {
+            HeliosFILE *fpub = NULL;
+            const char *file_name = mp_obj_str_get_str(args[2]);
+
+            if (strlen(file_name) > 120)//max file name size
+            {
+                mp_raise_ValueError(MP_ERROR_TEXT("File path too long"));
+            }
+
+            char path[128];
+            memset(path, 0, sizeof(path));
+            sprintf(path, "U:/%s", file_name);
+            if( ( fpub = Helios_fopen( path, "rb" ) ) == NULL )
+            {
+                Helios_fclose( fpub );
+                mp_printf(&mp_plat_print, "{RSA} failed Helios_fopen = %s \n", path);
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed encrypt Helios_fopen"));
+            }
+
+            Helios_fseek(fpub, 0, SEEK_END);
+            if ((size = Helios_ftell(fpub)) == -1)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed encrypt Helios_ftell"));
+            }
+            Helios_fseek(fpub, 0, SEEK_SET);
+
+            n = (size_t)size;
+            if (n + 1 == 0 || (publickey = mbedtls_calloc(1, n + 1)) == NULL)
+            {
+                Helios_fclose( fpub );
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed encrypt Helios_fclose"));
+            }
+
+            if (fread(publickey, 1, n, fpub) != n)
+            {
+                Helios_fclose( fpub );
+                free(publickey);
+                publickey = NULL;
+                mp_raise_ValueError(MP_ERROR_TEXT("{RSA} failed encrypt fread "));
+            }
+            Helios_fclose( fpub );
+        }
+        else
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("input rsa pub encrypt FAIL"));
+        }
+    }
+    else if (method == 1)
+    {
+        mp_get_buffer_raise(args[2], &priv_info, MP_BUFFER_READ);
+
+        if (priv_info.len <= 0)
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("input rsa public info FAIL"));
+        }
+    }
+
+    const char *pers = "rsa_pub_encrypt";
+
+    mbedtls_rsa_context rsa;
+    mbedtls_mpi N, E;
+    mbedtls_entropy_context entropy;
+    mbedtls_ctr_drbg_context ctr_drbg;
+
+    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );
+    mbedtls_ctr_drbg_init( &ctr_drbg );
+    mbedtls_entropy_init( &entropy );
+
+    mbedtls_mpi_init( &N ); mbedtls_mpi_init( &E ); 
+
+    mbedtls_pk_context ctx_pk;
+    mbedtls_pk_init(&ctx_pk);
+
+    if (method == 0)
+    {
+        if (0 != mbedtls_pk_parse_public_key(&ctx_pk, publickey, n + 1))
+        {
+            free(publickey);
+            publickey = NULL;
+            mp_printf(&mp_plat_print, "{RSA} failed public encrypt mbedtls_pk_parse_public_key returned = %d \n", ret);
+            goto exit;
+        }
+
+        free(publickey);
+        publickey = NULL;
+    }
+    else if (method == 1)
+    {
+        if (0 != mbedtls_pk_parse_public_key(&ctx_pk, priv_info.buf, priv_info.len + 1))
+        {
+            mp_printf(&mp_plat_print, "{RSA} failed public encrypt mbedtls_pk_parse_public_key returned = %d \n", ret);
+            goto exit;
+        }
+    }
+
+    ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func,
+                                 &entropy, (const unsigned char *) pers, strlen( pers ) );
+    if( ret != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed public encrypt mbedtls_ctr_drbg_seed returned = %d \n", ret);
+        goto exit;
+    }
+
+    /*导入pem内的公钥*/
+    rsa = *(mbedtls_rsa_context*)ctx_pk.pk_ctx;
+
+    unsigned char out_buf[512];
+    memset(out_buf, 0, sizeof( out_buf ) );
+
+    if( (ret = mbedtls_rsa_pkcs1_encrypt( &rsa, mbedtls_ctr_drbg_random, &ctr_drbg, MBEDTLS_RSA_PUBLIC,
+                                   bufinfo.len, bufinfo.buf, out_buf) ) != 0 )
+    {
+        mp_printf(&mp_plat_print, "{RSA} failed public encrypt mbedtls_rsa_pkcs1_decrypt ret = %d \n", ret);
+        goto exit;
+    }
+
+exit:
+    mbedtls_mpi_free( &N );
+    mbedtls_mpi_free( &E );
+
+    if (ret != 0 )
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("RSA Public Encrypt FAIL"));
+    }
+
+    return mp_obj_new_str((char *)out_buf, rsa.len);
+ }
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ql_pub_encrypt_obj, 3, 3, ql_rsa_pub_encrypt);
+
 STATIC const mp_rom_map_elem_t mp_module_rsa_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_rsa) },
     { MP_ROM_QSTR(MP_QSTR_gen_keypair), MP_ROM_PTR(&ql_gen_keypair_obj) },
     { MP_ROM_QSTR(MP_QSTR_get_pubkey), MP_ROM_PTR(&ql_get_pubkey_obj) },
     { MP_ROM_QSTR(MP_QSTR_encrypt), MP_ROM_PTR(&ql_encrypt_obj) },
     { MP_ROM_QSTR(MP_QSTR_decrypt), MP_ROM_PTR(&ql_decrypt_obj) },
+    { MP_ROM_QSTR(MP_QSTR_pub_verify), MP_ROM_PTR(&ql_pub_verify_obj) },
+    { MP_ROM_QSTR(MP_QSTR_priv_sign), MP_ROM_PTR(&ql_priv_sign_obj) },
+    { MP_ROM_QSTR(MP_QSTR_pub_encrypt), MP_ROM_PTR(&ql_pub_encrypt_obj) },
+    { MP_ROM_QSTR(MP_QSTR_priv_decrypt), MP_ROM_PTR(&ql_priv_decrypt_obj) },
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_rsa_globals, mp_module_rsa_globals_table);
 
index 91cbf37..2955d7b 100644 (file)
@@ -39,6 +39,10 @@ STATIC const mp_rom_map_elem_t mp_module_sensor_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_GNSS),                    MP_ROM_PTR(&sensor_gnss_type) },
 #endif
 
+#if MICROPY_QPY_SENSOR_VC9202
+       { MP_ROM_QSTR(MP_QSTR_VC9202),                  MP_ROM_PTR(&sensor_vc9202_type) },
+#endif
+
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_sensor_globals, mp_module_sensor_globals_table);
 
index e1e65fb..048d721 100644 (file)
@@ -35,6 +35,10 @@ extern const mp_obj_type_t handmic_key_type;
 extern const mp_obj_type_t sensor_gnss_type;
 #endif
 
+#if MICROPY_QPY_SENSOR_VC9202
+extern const mp_obj_type_t sensor_vc9202_type;
+#endif
+
 #endif 
 
 
index a0b71bc..ad5cd1a 100644 (file)
 #include "helios_debug.h"
 #include "helios_sim.h"
 
+#if MICROPY_QPY_MODULE_ESIM_SIM_SWITCH
+#include "rt_lpa.h"
+#include "rt_port_at.h"
+#include "rt_utils.h"
+
+#define MAX_EID_HEX_LEN  16
+#define MAX_EID_LEN      33
+#define THE_MAX_CARD_NUM 20
+#endif
+
 #define QPY_MODSIM_LOG(msg, ...)      custom_log("SIM", msg, ##__VA_ARGS__)
 
+
+static void toUpperCase(char *str) 
+{
+       while (*str != '\0') {
+               if(*str >='a' && *str <= 'z') {
+                       *str -= 32;
+               }
+               str++;
+       }
+}
+
 int _get_current_simid(void)
 {
     int cur_simid = 0;
     
-#if defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) //|| defined(PLAT_ASR) 
+#if defined(PLAT_ASR) ||defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_EIGEN)  || defined(PLAT_ASR_1602) || defined(PLAT_EIGEN_718)
+
        uint8_t sim_id = 0;
+       MP_THREAD_GIL_EXIT();
        Helios_SIM_GetCurrentSimid(&sim_id);
+       MP_THREAD_GIL_ENTER();
        cur_simid = sim_id;
-#elif defined(PLAT_Unisoc)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850)
        cur_simid = 0;
 #endif
 
@@ -56,14 +80,25 @@ int _get_current_simid(void)
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_get_imsi(void)
+STATIC mp_obj_t qpy_sim_get_imsi(size_t n_args, const mp_obj_t *args)
 {
+       int cur_simid = 0;
        char imsi_str[HELIOS_SIM_IMSI_LEN+1] = {0};
     uint8_t status = 0;
     int ret = 0;
-    int cur_simid = _get_current_simid();
-
+       if ( n_args > 0  )
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
     Helios_SIM_GetCardStatus(cur_simid, (Helios_SIM_Status_e *)&status);
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
     {
         if (status != 1)
@@ -75,8 +110,9 @@ STATIC mp_obj_t qpy_sim_get_imsi(void)
     {
         return mp_obj_new_int(-1);
     }
-    
+    MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_GetIMSI(cur_simid, (void *)imsi_str, sizeof(imsi_str));
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(imsi_str, strlen(imsi_str));
@@ -84,7 +120,7 @@ STATIC mp_obj_t qpy_sim_get_imsi(void)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_imsi_obj, qpy_sim_get_imsi);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_get_imsi_obj, 0, 1, qpy_sim_get_imsi);
 
 
 /*=============================================================================*/
@@ -97,14 +133,25 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_imsi_obj, qpy_sim_get_imsi);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_get_iccid(void)
+STATIC mp_obj_t qpy_sim_get_iccid(size_t n_args, const mp_obj_t *args)
 {
        char iccid_str[HELIOS_SIM_ICCID_LEN+1] = {0};
        uint8_t status = 0;
        int ret = 0;
-       int cur_simid = _get_current_simid();
-    
+       int cur_simid = 0;
+       if ( n_args > 0  )
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+    MP_THREAD_GIL_EXIT();
     Helios_SIM_GetCardStatus(cur_simid, (Helios_SIM_Status_e *)&status);
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
     {
         if (status != 1)
@@ -116,16 +163,18 @@ STATIC mp_obj_t qpy_sim_get_iccid(void)
     {
         return mp_obj_new_int(-1);
     }
-
+       MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_GetICCID(cur_simid, (void *)iccid_str, sizeof(iccid_str));
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
     {
+               toUpperCase(iccid_str);
         return mp_obj_new_str(iccid_str, strlen(iccid_str));
     }
     
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_iccid_obj, qpy_sim_get_iccid);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_get_iccid_obj, 0, 1, qpy_sim_get_iccid);
 
 
 /*=============================================================================*/
@@ -138,13 +187,24 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_iccid_obj, qpy_sim_get_iccid);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_get_phonenumber(void)
+STATIC mp_obj_t qpy_sim_get_phonenumber(size_t n_args, const mp_obj_t *args)
 {
        char phone_number[HELIOS_SIM_PHONENUM_LEN+1] = {0};
        int ret = 0;
-       int cur_simid = _get_current_simid();
-    
+       int cur_simid = 0;
+       if ( n_args > 0  )
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+    MP_THREAD_GIL_EXIT();
        ret = Helios_SIM_GetPhoneNumber(cur_simid, (void *)phone_number, sizeof(phone_number));
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(phone_number, strlen(phone_number));
@@ -152,10 +212,10 @@ STATIC mp_obj_t qpy_sim_get_phonenumber(void)
 
        return mp_obj_new_int(-1);
 }
+
 #if !defined (PLAT_RDA)
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_phonenumber_obj, qpy_sim_get_phonenumber);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_get_phonenumber_obj, 0, 1, qpy_sim_get_phonenumber);
 #endif
-
 /*=============================================================================*/
 /* FUNCTION: qpy_sim_enable_pin                                                */
 /*=============================================================================*/
@@ -167,12 +227,23 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_phonenumber_obj, qpy_sim_get_phonen
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_enable_pin(const mp_obj_t pin)
+#ifndef MICROPY_QPY_MODULE_NO_SIMPIN
+STATIC mp_obj_t qpy_sim_enable_pin(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIMPinInfoStruct info = {0};
        mp_buffer_info_t bufinfo = {0};
-       mp_get_buffer_raise(pin, &bufinfo, MP_BUFFER_READ);
-
+       int cur_simid = 0;
+       if ( n_args > 1  )
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
     if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
@@ -180,8 +251,10 @@ STATIC mp_obj_t qpy_sim_enable_pin(const mp_obj_t pin)
        
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
 
-    int cur_simid = _get_current_simid();
+    
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_PINEnable(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -189,7 +262,7 @@ STATIC mp_obj_t qpy_sim_enable_pin(const mp_obj_t pin)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_enable_pin_obj, qpy_sim_enable_pin);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_enable_pin_obj, 1, 2, qpy_sim_enable_pin);
 
 
 /*=============================================================================*/
@@ -203,21 +276,32 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_enable_pin_obj, qpy_sim_enable_pin);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_disable_pin(const mp_obj_t pin)
+STATIC mp_obj_t qpy_sim_disable_pin(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIMPinInfoStruct info = {0};
        mp_buffer_info_t bufinfo = {0};
-       mp_get_buffer_raise(pin, &bufinfo, MP_BUFFER_READ);
-
+       int cur_simid = 0;
+       if ( n_args > 1  )
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       
+       mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
        if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
-       
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
     
-       int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_PINDisable(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -225,7 +309,7 @@ STATIC mp_obj_t qpy_sim_disable_pin(const mp_obj_t pin)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_disable_pin_obj, qpy_sim_disable_pin);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_disable_pin_obj, 1, 2, qpy_sim_disable_pin);
 
 
 /*=============================================================================*/
@@ -239,21 +323,32 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_disable_pin_obj, qpy_sim_disable_pin);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_verify_pin(const mp_obj_t pin)
+STATIC mp_obj_t qpy_sim_verify_pin(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIMPinInfoStruct info = {0};
        mp_buffer_info_t bufinfo = {0};
-       mp_get_buffer_raise(pin, &bufinfo, MP_BUFFER_READ);
+       int cur_simid = 0;
+       if ( n_args > 1  )
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
 
        if (bufinfo.len > HELIOS_SIM_PIN_LEN_MAX)
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
-       
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        strncpy((char *)info.pin, (const char *)bufinfo.buf, bufinfo.len);
 
-    int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_PINVerify(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -261,8 +356,7 @@ STATIC mp_obj_t qpy_sim_verify_pin(const mp_obj_t pin)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_verify_pin_obj, qpy_sim_verify_pin);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_verify_pin_obj, 1, 2,qpy_sim_verify_pin);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sim_change_pin                                                */
@@ -276,23 +370,35 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_verify_pin_obj, qpy_sim_verify_pin);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_change_pin(const mp_obj_t old_pin, const mp_obj_t new_pin)
+
+STATIC mp_obj_t qpy_sim_change_pin(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIMChangePinInfoStruct info = {0};
        mp_buffer_info_t bufinfo[2] = {0};
-       mp_get_buffer_raise(old_pin, &bufinfo[0], MP_BUFFER_READ);
-       mp_get_buffer_raise(new_pin, &bufinfo[1], MP_BUFFER_READ);
+       int cur_simid = 0;
+       if ( n_args > 2  )
+       {
+               cur_simid = mp_obj_get_int(args[2]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       mp_get_buffer_raise(args[0], &bufinfo[0], MP_BUFFER_READ);
+       mp_get_buffer_raise(args[1], &bufinfo[1], MP_BUFFER_READ);
 
        if ((bufinfo[0].len > HELIOS_SIM_PIN_LEN_MAX) || (bufinfo[1].len > HELIOS_SIM_PIN_LEN_MAX))
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
-       
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        strncpy((char *)info.old_pin, (const char *)bufinfo[0].buf, bufinfo[0].len);
        strncpy((char *)info.new_pin, (const char *)bufinfo[1].buf, bufinfo[1].len);
 
-    int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_PINChange(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -300,7 +406,7 @@ STATIC mp_obj_t qpy_sim_change_pin(const mp_obj_t old_pin, const mp_obj_t new_pi
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sim_change_pin_obj, qpy_sim_change_pin);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_change_pin_obj, 2,3,qpy_sim_change_pin);
 
 
 /*=============================================================================*/
@@ -316,23 +422,39 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sim_change_pin_obj, qpy_sim_change_pin);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_unblock_pin(const mp_obj_t puk, const mp_obj_t new_pin)
+STATIC mp_obj_t qpy_sim_unblock_pin(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIMUnlockPinInfoStruct info = {0};
        mp_buffer_info_t bufinfo[2] = {0};
-       mp_get_buffer_raise(puk, &bufinfo[0], MP_BUFFER_READ);
-       mp_get_buffer_raise(new_pin, &bufinfo[1], MP_BUFFER_READ);
+       
+       int cur_simid = 0;
+       if ( n_args > 2  )
+       {
+               cur_simid = mp_obj_get_int(args[2]);
+       }else{
+               cur_simid = _get_current_simid();
+
+       }
+       mp_get_buffer_raise(args[0], &bufinfo[0], MP_BUFFER_READ);
+
+
+       mp_get_buffer_raise(args[1], &bufinfo[1], MP_BUFFER_READ);
+
     
     if ((bufinfo[0].len > HELIOS_SIM_PIN_LEN_MAX) || (bufinfo[1].len > HELIOS_SIM_PIN_LEN_MAX))
        {
                mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of pin or puk should be no more than [%d] bytes."), HELIOS_SIM_PIN_LEN_MAX);
        }
-       
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        strncpy((char *)info.puk, (const char *)bufinfo[0].buf, bufinfo[0].len);
        strncpy((char *)info.new_pin, (const char *)bufinfo[1].buf, bufinfo[1].len);
 
-    int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_PINUnlock(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -340,9 +462,62 @@ STATIC mp_obj_t qpy_sim_unblock_pin(const mp_obj_t puk, const mp_obj_t new_pin)
        
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sim_unblock_pin_obj, qpy_sim_unblock_pin);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_unblock_pin_obj, 2, 3, qpy_sim_unblock_pin);
+#endif
 
+#if MICROPY_QPY_MODULE_PIN_REMATTEMPTS
 
+STATIC mp_obj_t qpy_sim_pin_remain_attempts(size_t n_args, const mp_obj_t *args)
+{
+       Helios_SIMRemainPinAttempts info = {0};
+       
+       uint8_t cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SIM_PINRemainAttempts(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
+       if (ret == 0)
+       {
+               if (n_args > 0)
+               {
+                       int flag = mp_obj_get_int(args[0]);
+                       if (flag == 0)
+                       {
+                               mp_obj_t tuple[2] = {
+                                       mp_obj_new_int(info.pin_remain_attempts), 
+                                       mp_obj_new_int(info.puk_remain_attempts)
+                               };
+                               return mp_obj_new_tuple(2, tuple);
+                       }
+                       else if (flag == 1)
+                       {
+                               mp_obj_t tuple[4] = {
+                                       mp_obj_new_int(info.pin_remain_attempts), 
+                                       mp_obj_new_int(info.puk_remain_attempts),
+                                       mp_obj_new_int(info.pin2_remain_attempts), 
+                                       mp_obj_new_int(info.puk2_remain_attempts)
+                               };
+                               return mp_obj_new_tuple(4, tuple);
+                       }
+                       else
+                       {
+                               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, flag should be in [0,1]."));
+                       }
+               }
+               else
+               {
+                       mp_obj_t tuple[2] = {
+                               mp_obj_new_int(info.pin_remain_attempts), 
+                               mp_obj_new_int(info.puk_remain_attempts)
+                               };
+                       return mp_obj_new_tuple(2, tuple);
+               }
+       }
+       return mp_obj_new_int(-1);
+
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_pin_remain_attempts_obj, 0, 1, qpy_sim_pin_remain_attempts);
+
+#endif
 /*=============================================================================*/
 /* FUNCTION: sim_get_card_status                                               */
 /*=============================================================================*/
@@ -374,31 +549,43 @@ SIM is locked due to a network subset personalization check failure.
  *               - 21          Unknow status.
  */
  /*=============================================================================*/
-STATIC mp_obj_t qpy_sim_get_card_status(void)
+
+STATIC mp_obj_t qpy_sim_get_card_status(size_t n_args, const mp_obj_t *args)
 {
        Helios_SIM_Status_e status = 0;
     int ret = 0;
-    int cur_simid = _get_current_simid();
-    
+    int cur_simid = 0 ;
+       if ( n_args > 0 )
+       {
+               cur_simid = (uint8_t)mp_obj_get_int(args[0]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+    MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_GetCardStatus(cur_simid, &status);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(status);
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_card_status_obj, qpy_sim_get_card_status);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_get_card_status_obj, 0, 1, qpy_sim_get_card_status);
 
 #if MICROPY_QPY_MODULE_PHB
 STATIC mp_obj_t qpy_sim_get_phonebookstatus(void)
 {
        uint8_t pb_ready_flag = 0;
+       MP_THREAD_GIL_EXIT();
     Helios_SIM_GetPbReady(&pb_ready_flag);
-       
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(pb_ready_flag);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_phonebookstatus_obj, qpy_sim_get_phonebookstatus);
-
 /*=============================================================================*/
 /* FUNCTION: qpy_sim_read_phonebook_record                                 */
 /*=============================================================================*/
@@ -416,18 +603,25 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_phonebookstatus_obj, qpy_sim_get_ph
  *     (2, [(1, 'zhangsan', '18122483511'), (2, 'lisi', '18122483542')])
  */
 /*=============================================================================*/
+
 STATIC mp_obj_t qpy_sim_read_phonebook_record(size_t n_args, const mp_obj_t *args)
 {
        uint8_t i = 0;
-       int32_t storage = mp_obj_get_int(args[0]);
+       int32_t storage = 0;
+       int cur_simid = 0;
        Helios_SIMReadPhoneBookInfoStruct records = {0};
+       mp_buffer_info_t nameinfo = {0};
        mp_obj_t list_records = mp_obj_new_list(0, NULL);
 
+       if ( n_args > 4 ){
+               cur_simid = mp_obj_get_int(args[4]);
+       }else{
+       cur_simid = _get_current_simid();
+       }
+       storage = mp_obj_get_int(args[0]);
        records.start_index = mp_obj_get_int(args[1]);
        records.end_index   = mp_obj_get_int(args[2]);
-
-       mp_buffer_info_t nameinfo = {0};
-       mp_get_buffer_raise(args[3], &nameinfo, MP_BUFFER_READ);
+       mp_get_buffer_raise(args[3], &nameinfo, MP_BUFFER_READ);
 
        if ((storage < 0) || (storage > 15))
        {
@@ -441,15 +635,19 @@ STATIC mp_obj_t qpy_sim_read_phonebook_record(size_t n_args, const mp_obj_t *arg
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, end - start <= 20."));
        }
-
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        if (nameinfo.len > 30)
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of username should be no more than 30 bytes."));
        }
        records.user_name = (char *)nameinfo.buf;
     
-    int cur_simid = _get_current_simid();
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_ReadPhonebookRecord(cur_simid, storage, &records);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                for (i=0; i<records.phonebook.count; ++i)
@@ -473,8 +671,7 @@ STATIC mp_obj_t qpy_sim_read_phonebook_record(size_t n_args, const mp_obj_t *arg
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_read_phonebook_record_obj, 3, 4, qpy_sim_read_phonebook_record);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_read_phonebook_record_obj, 3, 5, qpy_sim_read_phonebook_record);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sim_write_phonebook_record                                */
@@ -495,12 +692,17 @@ STATIC mp_obj_t qpy_sim_write_phonebook_record(size_t n_args, const mp_obj_t *ar
        int32_t storage = 0;
        mp_buffer_info_t bufinfo[2] = {0};
        Helios_SIMPhoneInfoStruct record = {0};
-       
+       int cur_simid = 0;
+       if( n_args > 4 ){
+               cur_simid =  mp_obj_get_int(args[4]);
+       } else{
+               cur_simid = _get_current_simid();
+       }
        storage = mp_obj_get_int(args[0]);
        record.index = mp_obj_get_int(args[1]);
-       mp_get_buffer_raise(args[2], &bufinfo[0], MP_BUFFER_READ);
-       mp_get_buffer_raise(args[3], &bufinfo[1], MP_BUFFER_READ);
-
+       mp_get_buffer_raise(args[2], &bufinfo[0], MP_BUFFER_READ);
+       mp_get_buffer_raise(args[3], &bufinfo[1], MP_BUFFER_READ);
+       
        if ((storage < 0) || (storage > 15))
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, storage should be in (0,15)."));
@@ -517,35 +719,59 @@ STATIC mp_obj_t qpy_sim_write_phonebook_record(size_t n_args, const mp_obj_t *ar
        {
                mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of phonenumber should be no more than 20 bytes."));
        }
-
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        strncpy(record.user_name, bufinfo[0].buf, bufinfo[0].len);
        strncpy(record.phone_num, bufinfo[1].buf, bufinfo[1].len);
 
-    int cur_simid = _get_current_simid();
+   
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_WritePhonebookRecord(cur_simid, storage, &record);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_int(0);
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_write_phonebook_record_obj, 3, 4, qpy_sim_write_phonebook_record);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_write_phonebook_record_obj, 3,5, qpy_sim_write_phonebook_record);
+
 #endif
 
+
 #if MICROPY_QPY_MODULE_SIMDET
-STATIC mp_obj_t qpy_sim_set_simdet(const mp_obj_t obj_detenable, const mp_obj_t obj_insertlevel)
+STATIC mp_obj_t qpy_sim_set_simdet(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
-       int detenable = mp_obj_get_int(obj_detenable);
-    int insertlevel = mp_obj_get_int(obj_insertlevel);
+       int cur_simid = 0;
+
+       int detenable = 0;
+       int insertlevel = 0;
+       if ( n_args > 2 ){
+               cur_simid = mp_obj_get_int(args[2]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       detenable = mp_obj_get_int(args[0]);
+       insertlevel = mp_obj_get_int(args[1]);
 
        if (detenable != 0 && detenable != 1)
+       {
         mp_raise_ValueError(MP_ERROR_TEXT("invalid value, detenable should be in (0,1)."));
+       }
     if (insertlevel != 0 && insertlevel != 1)
+       {
         mp_raise_ValueError(MP_ERROR_TEXT("invalid value, insertlevel should be in (0,1)."));
-
-    int cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_SetSimDet(cur_simid, detenable, insertlevel);
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
        {
                return mp_obj_new_int(ret);
@@ -554,14 +780,24 @@ STATIC mp_obj_t qpy_sim_set_simdet(const mp_obj_t obj_detenable, const mp_obj_t
        return mp_obj_new_int(-1);
 }
 
-STATIC mp_obj_t qpy_sim_get_simdet(void)
+STATIC mp_obj_t qpy_sim_get_simdet(size_t n_args, const mp_obj_t *args)
 {
        int ret = 0;
        int detenable = 99;
     int insertlevel = 99;
-
-    int cur_simid = _get_current_simid();
+       int cur_simid  = 0;
+       if ( n_args > 0 ){
+               cur_simid = mp_obj_get_int(args[0]);
+       }else{
+               cur_simid = _get_current_simid();
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
     ret = Helios_SIM_GetSimDet(cur_simid, &detenable, &insertlevel);
+       MP_THREAD_GIL_ENTER();
     if (ret == 0)
        {
            mp_obj_t tuple[2] = 
@@ -595,14 +831,16 @@ STATIC mp_obj_t qpy_sim_add_event_handler(mp_obj_t handler)
     memset(&cb, 0, sizeof(c_callback_t));
     g_sim_user_callback = &cb;
     mp_sched_schedule_callback_register(g_sim_user_callback, handler);
-
+       MP_THREAD_GIL_EXIT();
        Helios_SIM_Add_Event_Handler(qpy_sim_event_handler);
-       
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(0);
 }
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sim_set_simdet_obj, qpy_sim_set_simdet);
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_simdet_obj, qpy_sim_get_simdet);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_set_simdet_obj, 2, 3, qpy_sim_set_simdet);
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sim_get_simdet_obj, 0, 1, qpy_sim_get_simdet);
+
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_add_event_handler_obj, qpy_sim_add_event_handler);
 #endif
 
@@ -626,7 +864,9 @@ STATIC mp_obj_t qpy_sim_genericaccess(const mp_obj_t sim_id, const mp_obj_t cmd)
 
        strncpy((char *)info.cmd, (const char *)bufinfo.buf, bufinfo.len);
        info.len = bufinfo.len;
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_GenericAccess(simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
            mp_obj_t tuple[2] = 
@@ -642,7 +882,7 @@ STATIC mp_obj_t qpy_sim_genericaccess(const mp_obj_t sim_id, const mp_obj_t cmd)
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sim_genericaccess_obj, qpy_sim_genericaccess);
 #endif
 
-#if MICROPY_QPY_MODULE_DUALSIM
+#if MICROPY_QPY_MODULE_DUALSIM || MICROPY_QPY_MODULE_DSDS
 static c_callback_t * g_switchsim_done_callback;
 
 static void switch_sim_done_callback(uint8_t state)
@@ -668,8 +908,24 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_set_switchcard_cb_obj, qpy_sim_set_swit
 
 STATIC mp_obj_t qpy_sim_switch_card(mp_obj_t sim_id)
 {
-    int simid = mp_obj_get_int(sim_id);
+    uint8_t simid = mp_obj_get_int(sim_id);
+       if ((simid != 0) && (simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simid should be in [0,1]."));
+       }
+#if MICROPY_QPY_MODULE_DUALSIM
+       uint8_t old_simid = HELIOS_SIM_0;
+       MP_THREAD_GIL_EXIT();
+       Helios_SIM_GetCurrentSimid(&old_simid);
+       MP_THREAD_GIL_ENTER();
+       if (simid == old_simid)
+       {
+               return mp_obj_new_int(-1);
+       }
+#endif
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SIM_SwitchCard(simid, switch_sim_done_callback);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_switch_card_obj, qpy_sim_switch_card);
@@ -677,21 +933,43 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_switch_card_obj, qpy_sim_switch_card);
 STATIC mp_obj_t qpy_sim_get_current_simid()
 {
        uint8_t simid = HELIOS_SIM_0;
+       MP_THREAD_GIL_EXIT();
        Helios_SIM_GetCurrentSimid(&simid);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(simid);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_current_simid_obj, qpy_sim_get_current_simid);
+
+#if defined(BOARD_EC800MCN_LE_VOLVGL) || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EG810MEU_LA_VOLVGL)
+STATIC mp_obj_t qpy_sim_is_insert(mp_obj_t sim_id)
+{
+    int simid = mp_obj_get_int(sim_id);
+       if ((simid != 0) && (simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simid should be in [0,1]."));
+       }
+       uint8_t insert_sta = 0;
+       MP_THREAD_GIL_EXIT();
+       Helios_SIM_GetInsertStatus(simid, &insert_sta);
+       MP_THREAD_GIL_ENTER();
+       return mp_obj_new_bool(insert_sta);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_is_insert_obj, qpy_sim_is_insert);
+#endif
+
 #endif
 
 STATIC mp_obj_t qpy_module_sim_deinit(void)
 {
-    #if MICROPY_QPY_MODULE_DUALSIM
+    #if MICROPY_QPY_MODULE_DUALSIM || MICROPY_QPY_MODULE_DSDS
     g_switchsim_done_callback = NULL;
     #endif
 
        #if MICROPY_QPY_MODULE_SIMDET
     g_sim_user_callback = NULL;
+       MP_THREAD_GIL_EXIT();
     Helios_SIM_Add_Event_Handler(NULL);
+       MP_THREAD_GIL_ENTER();
     #endif
        
        return mp_obj_new_int(0);
@@ -699,6 +977,73 @@ STATIC mp_obj_t qpy_module_sim_deinit(void)
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_sim_deinit_obj, qpy_module_sim_deinit);
 
+#if MICROPY_QPY_MODULE_ESIM_SIM_SWITCH
+STATIC mp_obj_t qpy_sim_get_esim_list(void)
+{
+       int ret = 0;
+       u08 profile_num =0;
+       profile_info_t card_info[THE_MAX_CARD_NUM] = {0};
+       mp_obj_t list_profile = mp_obj_new_list(0, NULL);
+       MP_THREAD_GIL_EXIT();
+       ret = rt_lpa_get_profile_info(card_info, &profile_num, THE_MAX_CARD_NUM);
+       MP_THREAD_GIL_ENTER();
+       if (ret == 0)
+    {
+        int i = 0;
+               for (i = 0; i < profile_num; i++)
+               {
+            mp_obj_t profile_info[3] = {
+                       mp_obj_new_str(card_info[i].iccid, strlen(card_info[i].iccid)),
+                       mp_obj_new_int(card_info[i].state),
+                       mp_obj_new_int(card_info[i].class)};
+               mp_obj_list_append(list_profile, mp_obj_new_tuple(3, profile_info));
+               }
+    }
+       mp_obj_t tuple[2] = 
+       {
+               mp_obj_new_int(profile_num),
+               list_profile,
+       };
+       return mp_obj_new_tuple(2, tuple);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_esim_list_obj, qpy_sim_get_esim_list);
+
+
+STATIC mp_obj_t qpy_sim_get_esim_eid(void)
+{
+       char eid_buf[MAX_EID_HEX_LEN] = {0};
+       char eid[MAX_EID_LEN] = {0};
+    int ret = -1;
+       MP_THREAD_GIL_EXIT();
+    ret = rt_lpa_get_eid((u08 *)eid_buf);
+    rt_utils_bytes_to_hex((cpu08)eid_buf, sizeof(eid_buf), eid);
+       MP_THREAD_GIL_ENTER();
+       if (ret != 0)
+       {
+               memset(eid, 0, sizeof(eid));
+       }
+    return mp_obj_new_str(eid, strlen(eid));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sim_get_esim_eid_obj, qpy_sim_get_esim_eid);
+
+STATIC mp_obj_t qpy_sim_enable_esim(const mp_obj_t iccid)
+{
+    int ret = -1;
+    mp_buffer_info_t qpy_iccid = {0};
+    mp_get_buffer_raise(iccid, &qpy_iccid, MP_BUFFER_READ);
+
+       if (qpy_iccid.len != 20)
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, the length of iccid should be 20 bytes."));
+       }
+       MP_THREAD_GIL_EXIT();
+       ret = rt_lpa_enable_profile(qpy_iccid.buf);
+       MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sim_enable_esim_obj, qpy_sim_enable_esim);
+#endif
+
 #if MICROPY_QPY_MODULE_ESIM
 extern const struct _mp_obj_module_t mp_module_esim;
 #endif
@@ -713,11 +1058,15 @@ STATIC const mp_rom_map_elem_t mp_module_sim_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_getImsi),            MP_ROM_PTR(&qpy_sim_get_imsi_obj)               },
        { MP_ROM_QSTR(MP_QSTR_getIccid),                MP_ROM_PTR(&qpy_sim_get_iccid_obj)              },
 
+#ifndef MICROPY_QPY_MODULE_NO_SIMPIN
        { MP_ROM_QSTR(MP_QSTR_verifyPin),               MP_ROM_PTR(&qpy_sim_verify_pin_obj)     },
        { MP_ROM_QSTR(MP_QSTR_changePin),               MP_ROM_PTR(&qpy_sim_change_pin_obj)     },
        { MP_ROM_QSTR(MP_QSTR_unblockPin),              MP_ROM_PTR(&qpy_sim_unblock_pin_obj)    },
+
        { MP_ROM_QSTR(MP_QSTR_enablePin),               MP_ROM_PTR(&qpy_sim_enable_pin_obj)     },
        { MP_ROM_QSTR(MP_QSTR_disablePin),              MP_ROM_PTR(&qpy_sim_disable_pin_obj)    },
+#endif
+
        { MP_ROM_QSTR(MP_QSTR_getStatus),               MP_ROM_PTR(&qpy_sim_get_card_status_obj)},
 #if MICROPY_QPY_MODULE_PHB
     { MP_ROM_QSTR(MP_QSTR_getPhonebookStatus),       MP_ROM_PTR(&qpy_sim_get_phonebookstatus_obj) },
@@ -727,10 +1076,13 @@ STATIC const mp_rom_map_elem_t mp_module_sim_globals_table[] = {
 #if defined (PLAT_ASR)
        { MP_ROM_QSTR(MP_QSTR_genericAccess),  MP_ROM_PTR(&qpy_sim_genericaccess_obj) },
 #endif
-#if MICROPY_QPY_MODULE_DUALSIM
+#if MICROPY_QPY_MODULE_DUALSIM || MICROPY_QPY_MODULE_DSDS
        { MP_ROM_QSTR(MP_QSTR_switchCard),      MP_ROM_PTR(&qpy_sim_switch_card_obj) },
        { MP_ROM_QSTR(MP_QSTR_setSwitchcardCallback),      MP_ROM_PTR(&qpy_sim_set_switchcard_cb_obj) },
        { MP_ROM_QSTR(MP_QSTR_getCurSimid),     MP_ROM_PTR(&qpy_sim_get_current_simid_obj) },
+#if defined(BOARD_EC800MCN_LE_VOLVGL) || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EG810MEU_LA_VOLVGL)
+       { MP_ROM_QSTR(MP_QSTR_isInsert),     MP_ROM_PTR(&qpy_sim_is_insert_obj) },
+#endif
 #endif
 #if MICROPY_QPY_MODULE_SIMDET
     { MP_ROM_QSTR(MP_QSTR_setSimDet),       MP_ROM_PTR(&qpy_sim_set_simdet_obj) },
@@ -743,7 +1095,14 @@ STATIC const mp_rom_map_elem_t mp_module_sim_globals_table[] = {
 #if !defined (PLAT_RDA)
        { MP_ROM_QSTR(MP_QSTR_getPhoneNumber),  MP_ROM_PTR(&qpy_sim_get_phonenumber_obj)},
 #endif
-
+#if MICROPY_QPY_MODULE_PIN_REMATTEMPTS
+       { MP_ROM_QSTR(MP_QSTR_getPinRemAttempts),       MP_ROM_PTR(&qpy_sim_pin_remain_attempts_obj)    },
+#endif
+#if MICROPY_QPY_MODULE_ESIM_SIM_SWITCH
+       { MP_ROM_QSTR(MP_QSTR_eSimGetList),     MP_ROM_PTR(&qpy_sim_get_esim_list_obj)  },
+       { MP_ROM_QSTR(MP_QSTR_eSimGetEid),      MP_ROM_PTR(&qpy_sim_get_esim_eid_obj)   },
+       { MP_ROM_QSTR(MP_QSTR_eSimSwitch),      MP_ROM_PTR(&qpy_sim_enable_esim_obj)    },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_sim_globals, mp_module_sim_globals_table);
 
index 4774f27..922986b 100644 (file)
 #include "runtime.h"
 #include "mphalport.h"
 
-#if MICROPY_QPY_MODULE_SLIP
+#if MICROPY_QPY_MODULE_SLIP || CONFIG_SLIP
 
 #include "slipif.h"
 #include "netif.h"
 #include "ip4.h"
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_Unisoc)
 #include "ip4_addr.h"
 #endif
 #include "sockets.h"
 #include "helios_debug.h"
 #include "helios_uart_slip.h"
 
+#if CONFIG_SLIP
+#include "slip_uart_netif.h"
+#include "helios_lwip_api.h"
+#endif
+
 
 #define test_log(fmt, ...)     custom_log(SLIP, fmt, ##__VA_ARGS__)
 
@@ -71,14 +76,18 @@ static unsigned long user_inet_addr(const char *str)
 STATIC mp_obj_t qpy_slipif_netif_set_default(mp_obj_t ip_str)
 {
        char *m_ip_str = (char *)mp_obj_str_get_str(ip_str);
-       #if defined(PLAT_EIGEN)
-       ip4_addr_t ipaddr;
+       
+       test_log("qpy_slipif_netif_set_default ip_str = %s\n", m_ip_str);
+       #if CONFIG_SLIP
+       int ret = helios_netif_set_defult_nic(m_ip_str);
+       #elif defined(PLAT_Unisoc)
+       unsigned int m_addr = user_inet_addr(m_ip_str);
+       int ret = Helios_Slip_Set_Default_NIC(m_addr);
        #else
-       ip_addr_t ipaddr;
+       unsigned int m_addr = user_inet_addr(m_ip_str);
+       int ret = slipif_netif_set_default(m_addr);
        #endif
-       test_log("qpy_slipif_netif_set_default ip_str = %s\n", ip_str);
-       ipaddr.addr = user_inet_addr(m_ip_str);
-       int ret = slipif_netif_set_default(ipaddr.addr);
+       
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_slipif_netif_set_default_obj, qpy_slipif_netif_set_default);
@@ -92,7 +101,18 @@ STATIC mp_obj_t qpy_slip_netif_construct(mp_obj_t port, mp_obj_t type, mp_obj_t
        int m_type = (int)mp_obj_get_int(type);
        unsigned int m_addr = (unsigned int)mp_obj_get_int(addr);
        test_log("m_port = %d, m_type = %d, m_addr = %d\n", m_port, m_type, m_addr);
+#if CONFIG_SLIP
+       char m_addr_str[32] = {0};
+       char *external_ip = m_addr_str;
+       if( m_addr == 0 ) {
+               external_ip = NULL;
+       } else {
+               inet_ntop(AF_INET, &m_addr, external_ip, 32);
+       }
+       ret = slip_netif_register((Helios_UARTNum)m_port, (slip_netif_work_mode)m_type, external_ip);
+#else
        ret = Helios_Slip_Netif_Construct((Helios_UARTNum)m_port, (Helios_Slip_Work_Mode)m_type, m_addr);
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_slip_netif_construct_obj, qpy_slip_netif_construct);
@@ -101,10 +121,12 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_slip_netif_construct_obj, qpy_slip_netif_co
 STATIC mp_obj_t qpy_slipif_router_add(mp_obj_t ip, mp_obj_t netmask)
 {
        int ret = 0;
+#if !defined(PLAT_Unisoc)
        char *m_ip = (char *)mp_obj_str_get_str(ip);
        char *m_netmask = (char *)mp_obj_str_get_str(netmask);
        test_log("m_ip = %s, m_netmask = %s\n", m_ip, m_netmask);
        ret = slipif_router_add(m_ip, m_netmask);
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_slipif_router_add_obj, qpy_slipif_router_add);
@@ -112,9 +134,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_slipif_router_add_obj, qpy_slipif_router_ad
 STATIC mp_obj_t qpy_slipif_router_delete(mp_obj_t ip, mp_obj_t netmask)
 {
        int ret = 0;
+#if !defined(PLAT_Unisoc)
        char *m_ip = (char *)mp_obj_str_get_str(ip);
        char *m_netmask = (char *)mp_obj_str_get_str(netmask);
        ret = slipif_router_delete(m_ip, m_netmask);
+#endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_slipif_router_delete_obj, qpy_slipif_router_delete);
@@ -128,8 +152,12 @@ STATIC mp_obj_t qpy_get_slip_ipconfig(void)
        char gw_str[16] = {0};
        char dns1[16] = {0};
        char dns2[16] = {0};
-       
+
+       #if CONFIG_SLIP
+       ret = slip_netif_ipconfig(ipconfig);
+       #else
        ret = Helios_Get_Slip_Ipconfig(ipconfig);
+       #endif
        if( ret != 0 ) return mp_obj_new_int(-1);
        inet_ntop(AF_INET, &ipconfig[0], ip_str, sizeof(ip_str));
        inet_ntop(AF_INET, &ipconfig[1], netmask_str, sizeof(netmask_str));
@@ -154,8 +182,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_get_slip_ipconfig_obj, qpy_get_slip_ipconfi
 
 STATIC mp_obj_t qpy_slipif_destroy(void)
 {
-       test_log("qpy_slipif_destroy-----------\n");
+       #if CONFIG_SLIP
+       slip_netif_destroy();
+       #else
        Helios_Slip_Netif_Destroy();
+       #endif
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_slipif_destroy_obj, qpy_slipif_destroy);
@@ -171,7 +202,11 @@ STATIC mp_obj_t qpy_slipif_netif_set_dns(mp_obj_t pri_dns, mp_obj_t sec_dns)
        int ret = 0;
        char *m_pri_dns = (char *)mp_obj_str_get_str(pri_dns);
        char *m_sec_dns = (char *)mp_obj_str_get_str(sec_dns);
+       #if CONFIG_SLIP
+       ret = slip_netif_set_dns(m_pri_dns, m_sec_dns);
+       #else
        ret = Helios_Slip_Netif_NICSetDNS(m_pri_dns, m_sec_dns);
+       #endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_slipif_netif_set_dns_obj, qpy_slipif_netif_set_dns);
@@ -180,7 +215,11 @@ STATIC mp_obj_t qpy_slipif_config(mp_obj_t flow)
 {
        int ret = 0;
        int m_flow = mp_obj_get_int(flow);
+       #if CONFIG_SLIP
+       ret = slip_uart_flow_config(m_flow);
+       #else
        ret = Helios_Slip_Config(m_flow);
+       #endif
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_slipif_config_obj, qpy_slipif_config);
index 387994c..2ef9b55 100644 (file)
 #include "mphalport.h"
 
 #if MICROPY_QPY_MODULE_SMS
-
+#include "callbackdeal.h"
 #include "helios_debug.h"
 #include "helios_sms.h"
 
 #define QPY_MODSMS_LOG(msg, ...)      custom_log("SMS", msg, ##__VA_ARGS__)
 
+extern int _get_current_simid(void);
+
 static c_callback_t *g_sms_user_callback = NULL;
 
 STATIC mp_obj_t qpy_sms_pdu_decode(mp_obj_t data, mp_obj_t datalen)
@@ -37,7 +39,9 @@ STATIC mp_obj_t qpy_sms_pdu_decode(mp_obj_t data, mp_obj_t datalen)
                mp_raise_ValueError("invalid value.");
        }
     Helios_SMSStatusInfo info = {0};
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SMS_DecodePdu(&info, pdu_data);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                mp_obj_t msg_info[4] = 
@@ -53,7 +57,6 @@ STATIC mp_obj_t qpy_sms_pdu_decode(mp_obj_t data, mp_obj_t datalen)
     return mp_obj_new_int(-1); 
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sms_pdu_decode_obj, qpy_sms_pdu_decode);
-
 /*=============================================================================*/
 /* FUNCTION: qpy_sms_send_text_msg                                             */
 /*=============================================================================*/
@@ -67,15 +70,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_sms_pdu_decode_obj, qpy_sms_pdu_decode);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_send_text_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_obj_t code_mode)
+STATIC mp_obj_t qpy_sms_send_text_msg(size_t n_args, const mp_obj_t *args)
 {
        Helios_SMSSendMsgInfoStruct info = {0};
        mp_buffer_info_t phninfo = {0};
        mp_buffer_info_t msginfo = {0};
-       mp_get_buffer_raise(phone_num, &phninfo, MP_BUFFER_READ);
-       mp_get_buffer_raise(msg_data, &msginfo, MP_BUFFER_READ);
-       char *codemode = (char *)mp_obj_str_get_str(code_mode);
-    
+
+       char *codemode = NULL;
+    int cur_simid = _get_current_simid();
+       if (n_args > 3 ) 
+       {
+               cur_simid = mp_obj_get_int(args[3]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }       
+       mp_get_buffer_raise(args[0], &phninfo, MP_BUFFER_READ);
+       mp_get_buffer_raise(args[1], &msginfo, MP_BUFFER_READ);
+       codemode = (char *)mp_obj_str_get_str(args[2]);
+
        if (phninfo.len > 20)
        {
                mp_raise_ValueError("invalid value, the length of phone number should be no more than 20 bytes.");
@@ -84,10 +98,13 @@ STATIC mp_obj_t qpy_sms_send_text_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_
     {
                mp_raise_ValueError("The [phonenumber] parameter is invalid.");
        }
+
+       #if !MICROPY_QPY_SMS_SEND_NULL
     if (msginfo.len == 0)
     {
                mp_raise_ValueError("Empty SMS is not supported.");
        }
+       #endif
 
        char *p = codemode;
        while (*p)
@@ -102,10 +119,17 @@ STATIC mp_obj_t qpy_sms_send_text_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_
        if (strcmp(codemode, "UCS2") == 0)
        {
                info.code = HELIOS_UCS2;
-        if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2)
+               #if  MICROPY_QPY_MODULE_SMS_MOD_LEN_LIMITED
+               if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2*3)
+       {
+            mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of msg should be no more than [%d] bytes.", HELIOS_MAX_SMS_DATA_LEN/2);
+       }
+               #else
+               if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2)
        {
             mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of msg should be no more than [%d] bytes.", HELIOS_MAX_SMS_DATA_LEN/2);
        }
+               #endif
        }
        else if (strcmp(codemode, "GSM") == 0)
        {
@@ -122,11 +146,12 @@ STATIC mp_obj_t qpy_sms_send_text_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_
 
        info.phone_num = (char *)phninfo.buf;
        info.msg = (char *)msginfo.buf;
-       
-       int ret = Helios_SMS_SendTextMsg(0, &info);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_SendTextMsg(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_send_text_msg_obj, qpy_sms_send_text_msg);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_send_text_msg_obj, 3, 4, qpy_sms_send_text_msg);
 
 
 /*=============================================================================*/
@@ -142,14 +167,24 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_send_text_msg_obj, qpy_sms_send_text_ms
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_send_pdu_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_obj_t code_mode)
+STATIC mp_obj_t qpy_sms_send_pdu_msg(size_t n_args, const mp_obj_t *args)
 {
        Helios_SMSSendMsgInfoStruct info = {0};
        mp_buffer_info_t phninfo = {0};
        mp_buffer_info_t msginfo = {0};
-       mp_get_buffer_raise(phone_num, &phninfo, MP_BUFFER_READ);
-       mp_get_buffer_raise(msg_data, &msginfo, MP_BUFFER_READ);
-       char *codemode = (char *)mp_obj_str_get_str(code_mode);
+       char *codemode = NULL;
+    int cur_simid = _get_current_simid();
+       if (n_args > 3 ) 
+       {
+               cur_simid = mp_obj_get_int(args[3]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }               
+       mp_get_buffer_raise(args[0], &phninfo, MP_BUFFER_READ);
+       mp_get_buffer_raise(args[1], &msginfo, MP_BUFFER_READ);
+       codemode = (char *)mp_obj_str_get_str(args[2]);
 
        if (phninfo.len > 20)
        {
@@ -176,10 +211,18 @@ STATIC mp_obj_t qpy_sms_send_pdu_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_o
        if (strcmp(codemode, "UCS2") == 0)
        {
                info.code = HELIOS_UCS2;
-        if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2)
+               #if  MICROPY_QPY_MODULE_SMS_MOD_LEN_LIMITED
+               // burols.wang add change only for EC800MCNLE_VOLVGL project ,Due to the pythonSDK UTF-8 method Chinese it occupies three bytes
+               if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2*3)
        {
             mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of msg should be no more than [%d] bytes.", HELIOS_MAX_SMS_DATA_LEN/2);
        }
+               #else
+               if (msginfo.len > HELIOS_MAX_SMS_DATA_LEN/2)
+       {
+            mp_raise_msg_varg(&mp_type_ValueError, "invalid value, the length of msg should be no more than [%d] bytes.", HELIOS_MAX_SMS_DATA_LEN/2);
+       }
+               #endif
        }
        else if (strcmp(codemode, "GSM") == 0)
        {
@@ -196,13 +239,12 @@ STATIC mp_obj_t qpy_sms_send_pdu_msg(mp_obj_t phone_num, mp_obj_t msg_data, mp_o
     
        info.phone_num = (char *)phninfo.buf;
        info.msg = (char *)msginfo.buf;
-
-       int ret = Helios_SMS_SendPDUMsg(0, &info);
-       
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_SendPDUMsg(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_send_pdu_msg_obj, qpy_sms_send_pdu_msg);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_send_pdu_msg_obj, 3, 4, qpy_sms_send_pdu_msg);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sms_delete_msg                                                */
@@ -215,20 +257,30 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_send_pdu_msg_obj, qpy_sms_send_pdu_msg)
  *    -1       -       error
  */
 /*=============================================================================*/
-//#if defined(PLAT_ASR_1803s) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_ASR) || defined(PLAT_EIGEN)
 #if !defined(PLAT_Unisoc_8850) && !defined(PLAT_RDA)
 STATIC mp_obj_t qpy_sms_delete_msg(size_t n_args, const mp_obj_t *args)
 {
     int ret = 0;
+       int cur_simid = _get_current_simid();
+       if (n_args > 2 ) 
+       {
+               cur_simid = mp_obj_get_int(args[2]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }       
+
     if (n_args == 1) {
         int msgindex = mp_obj_get_int(args[0]);
         if (msgindex < 0)
         {
             mp_raise_ValueError("invalid value, index must be greater than or equal to 0.");
         }
-
+               MP_THREAD_GIL_EXIT();
         ret = Helios_SMS_DeleteMsg(0, msgindex);
-    } else if (n_args == 2) {
+               MP_THREAD_GIL_ENTER();
+       } else if (n_args > 1) {
         int msgindex = mp_obj_get_int(args[0]);
         int delmode  = mp_obj_get_int(args[1]);
         if (msgindex < 0)
@@ -240,13 +292,13 @@ STATIC mp_obj_t qpy_sms_delete_msg(size_t n_args, const mp_obj_t *args)
         {
             mp_raise_ValueError("invalid value, delmode just can be 0 or 4.");
         }
-
-        ret = Helios_SMS_DeleteMsg_Ex(0, msgindex, delmode);
+               MP_THREAD_GIL_EXIT();
+        ret = Helios_SMS_DeleteMsg_Ex(cur_simid, msgindex, delmode);
+               MP_THREAD_GIL_ENTER();
     }
     return mp_obj_new_int(ret);
 }
-
-STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_delete_msg_obj, 1, 2, qpy_sms_delete_msg);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_delete_msg_obj, 1, 3, qpy_sms_delete_msg);
 #else
 STATIC mp_obj_t qpy_sms_delete_msg(mp_obj_t index)
 {
@@ -257,10 +309,11 @@ STATIC mp_obj_t qpy_sms_delete_msg(mp_obj_t index)
     }
     
     uint8_t mindex = msgindex;
+       MP_THREAD_GIL_EXIT();
     int ret = Helios_SMS_DeleteMsg(0, mindex);
+       MP_THREAD_GIL_ENTER();
     return mp_obj_new_int(ret);
 }
-
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_delete_msg_obj, qpy_sms_delete_msg);
 #endif
 
@@ -274,19 +327,29 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_delete_msg_obj, qpy_sms_delete_msg);
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_get_center_address(void)
-{
-       char address[30] = {0};
 
-       int ret = Helios_SMS_GetCenterAddress(0, (void *)address, sizeof(address));
+STATIC mp_obj_t qpy_sms_get_center_address(size_t n_args, const mp_obj_t *args)
+{
+       char address[128] = {0};
+       int cur_simid = _get_current_simid();
+       if (n_args > 0 ) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_GetCenterAddress(cur_simid, (void *)address, sizeof(address));
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                return mp_obj_new_str(address, strlen(address));
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_center_address_obj, qpy_sms_get_center_address);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_get_center_address_obj, 0, 1, qpy_sms_get_center_address);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sms_set_center_address                                        */
@@ -299,20 +362,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_center_address_obj, qpy_sms_get_cen
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_set_center_address(mp_obj_t address)
+STATIC mp_obj_t qpy_sms_set_center_address(size_t n_args, const mp_obj_t *args) 
 {
-       char *addr = (char *)mp_obj_str_get_str(address);
-
-    //mia.zhong @20210816
-       /*if (strlen(addr) > 30)
+       char *addr = NULL;
+       int cur_simid = _get_current_simid();
+       if (n_args > 1 ) 
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
        {
-               mp_raise_ValueError("invalid value, the length of center addr should be no more than 30 bytes.");
-       }*/
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       addr = (char *)mp_obj_str_get_str(args[0]);
 
-       int ret = Helios_SMS_SetCenterAddress(0, (void *)addr);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_SetCenterAddress(cur_simid, (void *)addr);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_set_center_address_obj, qpy_sms_set_center_address);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_set_center_address_obj, 1, 2, qpy_sms_set_center_address);
 
 
 /*=============================================================================*/
@@ -328,12 +397,21 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_set_center_address_obj, qpy_sms_set_cen
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_set_save_location(mp_obj_t mem1, mp_obj_t mem2, mp_obj_t mem3)
+STATIC mp_obj_t qpy_sms_set_save_location(size_t n_args, const mp_obj_t *args) 
 {
        Helios_SMSMemSetInfoStruct info = {0};
-       char *addr1 = (char *)mp_obj_str_get_str(mem1);
-       char *addr2 = (char *)mp_obj_str_get_str(mem2);
-       char *addr3 = (char *)mp_obj_str_get_str(mem3);
+       int cur_simid = _get_current_simid();
+       if (n_args > 3 ) 
+       {
+               cur_simid = mp_obj_get_int(args[3]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       char *addr1 = (char *)mp_obj_str_get_str(args[0]);
+       char *addr2 = (char *)mp_obj_str_get_str(args[1]);
+       char *addr3 = (char *)mp_obj_str_get_str(args[2]);
 
        if (((strcmp(addr1,"SM") != 0) && (strcmp(addr1,"ME") != 0)) \
                || ((strcmp(addr2,"SM") != 0) && (strcmp(addr2,"ME") != 0)) \
@@ -345,12 +423,12 @@ STATIC mp_obj_t qpy_sms_set_save_location(mp_obj_t mem1, mp_obj_t mem2, mp_obj_t
        strncpy(info.mem1, addr1, strlen(addr1));
        strncpy(info.mem2, addr2, strlen(addr2));
        strncpy(info.mem3, addr3, strlen(addr3));
-       
-       int ret = Helios_SMS_SetSavingLocation(0, &info);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_SetSavingLocation(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_set_save_location_obj, qpy_sms_set_save_location);
-
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_set_save_location_obj, 3, 4, qpy_sms_set_save_location);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sms_set_save_location                                         */
@@ -362,11 +440,22 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_sms_set_save_location_obj, qpy_sms_set_save
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_get_save_location(void)
+
+STATIC mp_obj_t qpy_sms_get_save_location(size_t n_args, const mp_obj_t *args)
 {
+       int cur_simid = _get_current_simid();
+       if (n_args > 0 ) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
        Helios_SMSMemGetInfoStruct info = {0};
-
-       int ret = Helios_SMS_GetSavingLocation(0, &info);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_GetSavingLocation(cur_simid, &info);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                mp_obj_t mem1[3] = 
@@ -404,8 +493,7 @@ STATIC mp_obj_t qpy_sms_get_save_location(void)
        }
        return mp_obj_new_int(ret);
 }
-
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_save_location_obj, qpy_sms_get_save_location);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_get_save_location_obj, 0, 1, qpy_sms_get_save_location);
 
 
 /*=============================================================================*/
@@ -419,9 +507,22 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_save_location_obj, qpy_sms_get_save
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_read_text_msg(mp_obj_t index)
+
+STATIC mp_obj_t qpy_sms_read_text_msg(size_t n_args, const mp_obj_t *args) 
 {
-       int msgindex = mp_obj_get_int(index);
+       int cur_simid = _get_current_simid();
+       if (n_args > 1 ) 
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+
+       int msgindex  = 0;
+       msgindex = mp_obj_get_int(args[0]);
+
        Helios_SMSRecvMsgInfoStruct text_msg = {0};
        char data[400] = {0};
        text_msg.msg_buf = data;
@@ -432,8 +533,9 @@ STATIC mp_obj_t qpy_sms_read_text_msg(mp_obj_t index)
                mp_raise_ValueError("invalid value, index must be greater than or equal to 0.");
        }
        uint8_t mindex = msgindex;
-       
-       int ret = Helios_SMS_ReadTextMsg(0, mindex, &text_msg);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_ReadTextMsg(cur_simid, mindex, &text_msg);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0)
        {
                mp_obj_t msg_info[3] = 
@@ -446,7 +548,7 @@ STATIC mp_obj_t qpy_sms_read_text_msg(mp_obj_t index)
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_read_text_msg_obj, qpy_sms_read_text_msg);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_read_text_msg_obj, 1, 2, qpy_sms_read_text_msg);
 
 
 /*=============================================================================*/
@@ -460,9 +562,20 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_read_text_msg_obj, qpy_sms_read_text_ms
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_read_pdu_msg(mp_obj_t index)
+
+STATIC mp_obj_t qpy_sms_read_pdu_msg(size_t n_args, const mp_obj_t *args) 
 {
-       int msgindex = mp_obj_get_int(index);
+       int cur_simid = _get_current_simid();
+       if (n_args > 1 ) 
+       {
+               cur_simid = mp_obj_get_int(args[1]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+       int     msgindex = mp_obj_get_int(args[0]);
+
        Helios_SMSRecvMsgInfoStruct pdu_msg = {0};
        char data[512] = {0};
        pdu_msg.msg_buf = data;
@@ -473,8 +586,9 @@ STATIC mp_obj_t qpy_sms_read_pdu_msg(mp_obj_t index)
                mp_raise_ValueError("invalid value, index must be greater than or equal to 0.");
        }
        uint8_t mindex = msgindex;
-       
-       int ret = Helios_SMS_ReadPDUMsg(0, mindex, &pdu_msg);
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_ReadPDUMsg(cur_simid, mindex, &pdu_msg);
+       MP_THREAD_GIL_ENTER();
        if (ret == 0 && pdu_msg.msg_buf !=NULL && strlen(pdu_msg.msg_buf) !=0)
        {
                return mp_obj_new_str(pdu_msg.msg_buf, strlen(pdu_msg.msg_buf));
@@ -482,7 +596,7 @@ STATIC mp_obj_t qpy_sms_read_pdu_msg(mp_obj_t index)
 
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_read_pdu_msg_obj, qpy_sms_read_pdu_msg);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_read_pdu_msg_obj, 1, 2, qpy_sms_read_pdu_msg);
 
 
 /*=============================================================================*/
@@ -497,16 +611,17 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_read_pdu_msg_obj, qpy_sms_read_pdu_msg)
 STATIC mp_obj_t qpy_sms_get_pdu_length(mp_obj_t data)
 {
        char *pdumsg = (char *)mp_obj_str_get_str(data);
-       
+       MP_THREAD_GIL_EXIT();
        int ret = Helios_SMS_GetPDUMsgLength((void *)pdumsg);
+       MP_THREAD_GIL_ENTER();
        if (ret > 0)
        {
                return mp_obj_new_int(ret);
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_get_pdu_length_obj, qpy_sms_get_pdu_length);
 
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_get_pdu_length_obj, qpy_sms_get_pdu_length);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_sms_get_msg_nums                                              */
@@ -518,23 +633,36 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_get_pdu_length_obj, qpy_sms_get_pdu_len
  *    -1       -       error
  */
 /*=============================================================================*/
-STATIC mp_obj_t qpy_sms_get_msg_nums(void)
+STATIC mp_obj_t qpy_sms_get_msg_nums(size_t n_args, const mp_obj_t *args)
 {
-       int ret = Helios_SMS_GetMsgIndex(0);
+       int cur_simid = _get_current_simid();
+       if (n_args > 0 ) 
+       {
+               cur_simid = mp_obj_get_int(args[0]);
+       }
+       if ((cur_simid != 0) && (cur_simid != 1))
+       {
+               mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, simId should be in [0~1]."));
+       }
+
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_SMS_GetMsgIndex(cur_simid);
+       MP_THREAD_GIL_ENTER();
        if (ret != -1)
        {
                return mp_obj_new_int(ret);
        }
        return mp_obj_new_int(-1);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_msg_nums_obj, qpy_sms_get_msg_nums);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_sms_get_msg_nums_obj, 0, 1, qpy_sms_get_msg_nums);
 
-#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
 STATIC mp_obj_t qpy_sms_get_msgstatus(void)
 {
        uint8_t sms_ready_flag = 0;
+       MP_THREAD_GIL_EXIT();
     Helios_SMS_GetMsgStatus(&sms_ready_flag);
-       
+       MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(sms_ready_flag);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_sms_get_msgstatus_obj, qpy_sms_get_msgstatus);
@@ -545,8 +673,21 @@ static void qpy_sms_event_handler(uint8_t sim_id, int32_t event_id, void *ctx)
        if (event_id == HELIOS_SMS_NEW_MSG_IND)
        {
                Helios_SMSNewMsgInfoStruct *pctx = (Helios_SMSNewMsgInfoStruct *)ctx;
-
-
+       #if 1
+               if (g_sms_user_callback)
+               {
+                       st_CallBack_SMS *sms_t = malloc(sizeof(st_CallBack_SMS));
+                       memset((void *)sms_t, 0, sizeof(st_CallBack_SMS));
+                       if(NULL != sms_t) 
+                       {                                                                                                                                
+                               sms_t->sim_id = sim_id;                                                                                                                    
+                               sms_t->index = pctx->index;                                                                                                                       
+                               strncpy(sms_t->storage, pctx->mem, strlen(pctx->mem));
+                               sms_t->callback = *g_sms_user_callback;
+                               qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_SMS, sms_t); 
+                       }
+               }
+       #else
                if (g_sms_user_callback)
                {
                        uint8_t index  = pctx->index;
@@ -565,6 +706,7 @@ static void qpy_sms_event_handler(uint8_t sim_id, int32_t event_id, void *ctx)
                        GC_STACKTOP_CLEAR();
                        QPY_MODSMS_LOG("[SMS] callback end.\r\n");
                }
+       #endif
        }
 }
 
@@ -582,6 +724,7 @@ STATIC mp_obj_t qpy_sms_add_event_handler(mp_obj_t handler)
        
        return mp_obj_new_int(0);
 }
+
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_sms_add_event_handler_obj, qpy_sms_add_event_handler);
 
 STATIC mp_obj_t qpy_module_sms_deinit(void)
@@ -593,7 +736,6 @@ STATIC mp_obj_t qpy_module_sms_deinit(void)
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_sms_deinit_obj, qpy_module_sms_deinit);
-
 STATIC const mp_rom_map_elem_t mp_module_sms_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__),           MP_ROM_QSTR(MP_QSTR_sms) },
     { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_sms_deinit_obj) },
@@ -610,7 +752,7 @@ STATIC const mp_rom_map_elem_t mp_module_sms_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_getPduLength),       MP_ROM_PTR(&qpy_sms_get_pdu_length_obj) },
     { MP_ROM_QSTR(MP_QSTR_getMsgNums),         MP_ROM_PTR(&qpy_sms_get_msg_nums_obj) },
        { MP_ROM_QSTR(MP_QSTR_setCallback),        MP_ROM_PTR(&qpy_sms_add_event_handler_obj) },
-#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
     { MP_ROM_QSTR(MP_QSTR_getMsgStatus),       MP_ROM_PTR(&qpy_sms_get_msgstatus_obj) },
 #endif
 };
index 56976da..ac4938f 100644 (file)
 #define _htons(x) ((unsigned short)((((unsigned short)(x) & 0x00ff) << 8) | (((unsigned short)(x) & 0xff00) >> 8)))
 #endif
 
-#if !defined(PLAT_ASR_1803s)
+#if !defined(PLAT_ASR_1803s) && !defined(PLAT_ASR_1803sc)
 extern int lwip_getTcpState(int nSocket);
 #endif
 
+#if MICROPY_QPY_MODULE_WIFI
+#include "modwifi.h"
+
+extern int wifi_flag;
+extern wifi_obj_t *wifi;
+extern Helios_wifi_ring_buf_t *Helios_wifi_ring_buf_socket[4];
+
+
+static int8_t sock_fd[4]={-1,-1,-1,-1};
+#endif
 
 #define QPY_SOCKET_LOG(msg, ...)      custom_log(modsocket, msg, ##__VA_ARGS__)
 
@@ -91,11 +101,12 @@ typedef struct _socket_obj_t {
     bool connect_flag;
     unsigned int retries;
     unsigned int timeout;
+    unsigned int bind_port;
     #if MICROPY_PY_USOCKET_EVENTS
     mp_obj_t events_callback;
     struct _socket_obj_t *events_next;
     #endif
-    #if defined (PLAT_Qualcomm) || defined (PLAT_EIGEN)
+    #if defined (PLAT_Qualcomm) || defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     char host[64];
     int port;
     #endif
@@ -193,7 +204,7 @@ static inline void check_for_exceptions(void) {
 // This function mimics lwip_getaddrinfo, with added support for mDNS queries
 static int _socket_getaddrinfo3(const char *nodename, const char *servname,
     const struct addrinfo *hints, struct addrinfo **res) {
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc)
     if (netif_get_default_nw()) {
         return getaddrinfo(nodename, servname, hints, res);
     } else {
@@ -205,19 +216,36 @@ static int _socket_getaddrinfo3(const char *nodename, const char *servname,
         ** Solve the problem of not being able to connect to the Internet after dialing 
         ** with a PDP other than the first PDP . 
         */
-#if defined(PLAT_ECR6600)
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
         return lwip_getaddrinfo(nodename, servname, hints, res);
 #else
-    #if defined(PLAT_RDA) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s)
+    #if defined(PLAT_RDA) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
         int pdp = 1;
     #else
+        #if MICROPY_QPY_MODULE_DSDS
+        uint8_t sim_id = 0 , cid = 0;
+        uint16_t pdp;
+        cid = Helios_DataCall_GetCurrentPDP();
+        
+        pdp = (uint16_t)(sim_id << 8 | cid);
+        int ret = getaddrinfo_with_pcid(nodename, servname, hints, res, pdp);
+        if (ret != 0)
+        {
+            sim_id = 1;
+            pdp = (uint16_t)(sim_id << 8 | cid);
+            return getaddrinfo_with_pcid(nodename, servname, hints, res, pdp);
+        }
+        return ret;
+
+        #else
         int pdp = Helios_DataCall_GetCurrentPDP();
+        #endif
     #endif
 
         return getaddrinfo_with_pcid(nodename, servname, hints, res, pdp);
         /* Jayceon 2020/12/03 --part1 end-- */
 #endif
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc)
     }
 #endif
 }
@@ -283,7 +311,106 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
             }
         }
     }
-       QPY_SOCKET_LOG("lwip_socket: %d, %d, %d\r\n", sock->domain, sock->type, sock->proto);
+
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    if (sock->domain == AF_INET6) {
+        mp_raise_ValueError(MP_ERROR_TEXT("[socket]Not Support IPV6 Now\r\n"));
+    }
+#endif
+
+    QPY_SOCKET_LOG("lwip_socket: %d, %d, %d\r\n", sock->domain, sock->type, sock->proto);
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        MP_THREAD_GIL_EXIT();
+        Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+        MP_THREAD_GIL_ENTER();
+
+        int ret = _wifi_send_atcmd("AT+CIPMUX?\r\n", strlen("AT+CIPMUX?\r\n"));
+
+        Helios_Mutex_Unlock(wifi->mutex);
+        if (ret == 1)
+        {
+            char sock_recv[32];
+            memset(sock_recv, 0, sizeof(sock_recv));
+            strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+            if (strstr((const char *)sock_recv, "CIPMUX"))
+            {
+                int mode = 0;
+                sscanf(sock_recv,"%*[^:]:%d",&mode);
+                memset(sock_recv, 0, sizeof(sock_recv));
+                if (mode == 0)
+                {
+                    Helios_msleep(100);
+                    MP_THREAD_GIL_EXIT();
+                    Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+                    MP_THREAD_GIL_ENTER();
+
+                    int r = _wifi_send_atcmd("AT+CIPMUX=1\r\n", strlen("AT+CIPMUX=1\r\n"));
+
+                    Helios_Mutex_Unlock(wifi->mutex);
+                    QPY_SOCKET_LOG("[modsocket][wifi] socket_make_new  ret = %d \r\n", r);
+                    //mp_printf(&mp_plat_print, "[modsocket] socket_make_new  ret = %d \r\n", r);
+                    if (r != 0)
+                    {
+                        exception_from_errno(EINVAL);
+                    }
+                }
+            }
+        }
+
+        sock->fd = -1;
+        for (int i = 0; i <= 3; i++)
+        {
+            if (sock_fd[i] == -1)
+            {
+                sock_fd[i] = i;
+                sock->fd = i;
+                break;
+            }
+        }
+
+        if (sock->fd == -1)
+        {
+            exception_from_errno(EINVAL);
+        }
+        else if (sock->fd == 0)
+        {
+            Helios_wifi_ring_buf_socket[0] = malloc(sizeof(Helios_wifi_ring_buf_t) + (1024 * 10)+10);
+            Helios_wifi_rb_init(Helios_wifi_ring_buf_socket[0]);
+            Helios_wifi_ring_buf_socket[0]->capacity = (1024 * 10);
+            Helios_wifi_ring_buf_socket[0]->peer_closed = 0;
+        }
+        else if (sock->fd == 1)
+        {
+            Helios_wifi_ring_buf_socket[1] = malloc(sizeof(Helios_wifi_ring_buf_t) + (1024 * 10)+10);
+            Helios_wifi_rb_init(Helios_wifi_ring_buf_socket[1]);
+            Helios_wifi_ring_buf_socket[1]->capacity = (1024 * 10);
+            Helios_wifi_ring_buf_socket[1]->peer_closed = 0;
+        }
+        else if (sock->fd == 2)
+        {
+            Helios_wifi_ring_buf_socket[2] = malloc(sizeof(Helios_wifi_ring_buf_t) + (1024 * 10)+10);
+            Helios_wifi_rb_init(Helios_wifi_ring_buf_socket[2]);
+            Helios_wifi_ring_buf_socket[2]->capacity = (1024 * 10);
+            Helios_wifi_ring_buf_socket[2]->peer_closed = 0;
+        }
+        else if (sock->fd == 3)
+        {
+            Helios_wifi_ring_buf_socket[3] = malloc(sizeof(Helios_wifi_ring_buf_t) + (1024 * 10)+10);
+            Helios_wifi_rb_init(Helios_wifi_ring_buf_socket[3]);
+            Helios_wifi_ring_buf_socket[3]->capacity = (1024 * 10);
+            Helios_wifi_ring_buf_socket[3]->peer_closed = 0;
+        }
+
+        _socket_settimeout(sock, 10000);
+
+        QPY_SOCKET_LOG("[modsocket][wifi] socket_make_new sock->fd = %d \r\n", sock->fd);
+        //mp_printf(&mp_plat_print, "[modsocket] socket_make_new sock->fd = %d\r\n", sock->fd);
+        return MP_OBJ_FROM_PTR(sock);
+    }
+#endif
+
 #if !defined(PLAT_Qualcomm)
     if((sock->proto == 7) || (sock->proto == 8))
     {
@@ -303,6 +430,9 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
 #else
     sock->fd = lwip_socket(sock->domain, sock->type, sock->proto);
 #endif
+
+    mp_printf(&mp_plat_print, "[modsocket] socket makenew socket->fd = %d\r\n", sock->fd);
+
     if (sock->fd < 0) {
                QPY_SOCKET_LOG("lwip_socket: create socket failed!\r\n");
         exception_from_errno(EINVAL);
@@ -310,9 +440,10 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
 
 #if defined(PLAT_Qualcomm)
     _socket_settimeout(sock, UINT64_MAX);
+    QPY_SOCKET_LOG("lwip_socket: create socket id[%d] success!\r\n", sock->fd);
     return MP_OBJ_FROM_PTR(sock);
 
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     Helios_DataCallInfoStruct info = {0};
     int ret = 0, pid = 0;
     for (pid=1; pid<5; pid++)
@@ -346,7 +477,17 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
         QPY_SOCKET_LOG("[socket]make new bind IPV4 %s.\r\n", ip4_ip_addr);
         inet_pton(AF_INET, ip4_ip_addr, &server_addr.sin_addr.s_addr);
 
-        lwip_bind(sock->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
+        
+        if (lwip_bind(sock->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)))
+        {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket]bind IPV4 failed.\r\n");
+            exception_from_errno(errno(sock->fd));
+        }
+        else
+        {
+            QPY_SOCKET_LOG("[socket]bind IPV4 success.\r\n");
+        }
     }
     else if (sock->domain == AF_INET6)
     {
@@ -361,27 +502,41 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
         QPY_SOCKET_LOG("[socket]make new bind IPV6 %s.\r\n", ip6_ip_addr);
         inet_pton(AF_INET6, ip6_ip_addr, &local_v6.sin6_addr);
 
-        lwip_bind(sock->fd, (struct sockaddr *)&local_v6, sizeof(struct sockaddr_in6));
+        if (lwip_bind(sock->fd, (struct sockaddr *)&local_v6, sizeof(struct sockaddr_in6)))
+        {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket]bind IPV6 failed.\r\n");
+            exception_from_errno(errno(sock->fd));
+        }
+        else
+        {
+            QPY_SOCKET_LOG("[socket]bind IPV6 success.\r\n");
+        }
     }
     _socket_settimeout(sock, UINT64_MAX);
     return MP_OBJ_FROM_PTR(sock);
-#elif defined(PLAT_ECR6600)
-
+#elif defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    /* Quecpython bob.xian 2023/10/24 [reason: JIRA SW1PQUECPYTHON-4201] begin */
+#if 0
     int on = 1;
     setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
     on = 1;
     setsockopt(sock->fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on));
+#endif
+    /* Quecpython bob.xian 2023/10/24 [reason: JIRA SW1PQUECPYTHON-4201] end */
 
+#if 0
     struct sockaddr_in local4 = {0};
     memset(&local4, 0x00, sizeof(struct sockaddr_in));
 
     local4.sin_family = AF_INET;
     local4.sin_port = 0;
     lwip_bind(sock->fd, (struct sockaddr*)&local4, sizeof(struct sockaddr_in));
+#endif
 
     return MP_OBJ_FROM_PTR(sock);
 #else
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc)
     if (!netif_get_default_nw()) {
 #endif
        /*
@@ -394,9 +549,9 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
         struct netif* netif_cfg = netif_get_by_cid(pdp);
     #else
         int pdp = Helios_DataCall_GetCurrentPDP();
-    #if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+    #if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
         struct netif* netif_cfg = netif_get_by_cid(pdp);
-    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
         struct netif* netif_cfg = netif_get_by_cid(pdp - 1);
     #endif
     #endif
@@ -409,9 +564,9 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
                 struct sockaddr_in local_v4;
                 local_v4.sin_family = AF_INET;
                 local_v4.sin_port = 0;
-    #if defined (PLAT_Unisoc) || defined(PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+    #if defined (PLAT_Unisoc) || defined(PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                 local_v4.sin_addr.s_addr = netif_cfg->ip_addr.u_addr.ip4.addr;
-    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 local_v4.sin_addr.s_addr = netif_cfg->ip_addr.addr;
     #endif
                 if(lwip_bind(sock->fd,(struct sockaddr *)&local_v4,sizeof(struct sockaddr)))
@@ -429,11 +584,11 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
             {
                 struct sockaddr_in6 local_v6;
 
-    #if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+    #if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                 const ip6_addr_t * ip6_addr_ptr = NULL;
                 ip6_addr_ptr = netif_ip6_addr(netif_cfg, 1);
                 memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
-    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+    #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 ip6_addr_t * ip6_addr_ptr = NULL;
                 ip6_addr_ptr = netif_get_global_ip6addr(netif_cfg);
                 memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
@@ -458,7 +613,7 @@ STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, siz
         }
 
         //end
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc)
     }
 #endif
     _socket_settimeout(sock, UINT64_MAX);
@@ -474,6 +629,8 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
     mp_obj_get_array_fixed_n(arg1, 2, &elem);
     const char *addr_info = mp_obj_str_get_str(elem[0]);
     int server_port = mp_obj_get_int(elem[1]);
+
+    self->bind_port = server_port;
     
 #if defined(PLAT_Qualcomm)
     Helios_DataCallInfoStruct info = {0};
@@ -513,7 +670,18 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             server_addr.sin_addr.s_addr = inet_addr(addr_info);
             QPY_SOCKET_LOG("[socket][%s]bind IPV4 addr info .\r\n", addr_info);
         }
-        lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
+
+        if (lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)))
+        {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket][%d][%d] Failed bind IPV4.\r\n", server_port, self->fd);
+            exception_from_errno(errno(self->fd));
+        }
+        else
+        {
+            QPY_SOCKET_LOG("[socket][%d][%d]bind IPV4 success.\r\n", server_port, self->fd);
+        }
+        
     }
     else if (self->domain == AF_INET6)
     {
@@ -524,7 +692,7 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         {
             char ip6_ip_addr[64] = {0};
             inet_ntop(AF_INET6, &info.v6.addr.ip, ip6_ip_addr, sizeof(ip6_ip_addr));
-            QPY_SOCKET_LOG("[socket][%s]bind IPV6 datacall info .\r\n", ip6_ip_addr);
+            QPY_SOCKET_LOG("[socket][%s][%d]bind IPV6 datacall info .\r\n", ip6_ip_addr, self->fd);
             inet_pton(AF_INET6, ip6_ip_addr, &local_v6.sin_addr);
         }
         else
@@ -540,17 +708,17 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         if(lwip_bind(self->fd, (struct sockaddr *)&local_v6, sizeof(struct sockaddr_in6)))
         {
             //bind failed.
-            QPY_SOCKET_LOG("[socket]bind IPV6 failed.\r\n");
+            QPY_SOCKET_LOG("[socket][%d] Failed bind IPV6.\r\n", server_port);
             exception_from_errno(errno(self->fd));
         }
         else
         {
-            QPY_SOCKET_LOG("[socket]bind IPV6 success.\r\n");
+            QPY_SOCKET_LOG("[socket][%d]bind IPV6 success.\r\n", server_port);
         }
     }
 
     return mp_const_none;
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     Helios_DataCallInfoStruct info = {0};
     if (addr_info[0] == '\0')
     {
@@ -593,7 +761,16 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             inet_pton(AF_INET, addr_info, &server_addr.sin_addr.s_addr);
         }
 
-        lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
+        if(lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)))
+        {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket][%d]bind IPV4 failed.\r\n", server_port);
+            exception_from_errno(errno(self->fd));
+        }
+        else
+        {
+            QPY_SOCKET_LOG("[socket][%d]bind IPV4 success.\r\n", server_port);
+        }
     }
     else if (self->domain == AF_INET6)
     {
@@ -616,10 +793,20 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             inet_pton(AF_INET6, addr_info, &local_v6.sin6_addr);
         }
 
-        lwip_bind(self->fd, (struct sockaddr *)&local_v6, sizeof(struct sockaddr_in6));
+        
+        if(lwip_bind(self->fd, (struct sockaddr *)&local_v6, sizeof(struct sockaddr_in6)))
+        {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket][%d]bind IPV6 failed.\r\n", server_port);
+            exception_from_errno(errno(self->fd));
+        }
+        else
+        {
+            QPY_SOCKET_LOG("[socket][%d]bind IPV6 success.\r\n", server_port);
+        }
     }
     return mp_const_none;
-#elif defined(PLAT_ECR6600)
+#elif defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
     if (self->domain == AF_INET)
     {
         struct sockaddr_in server_addr;
@@ -629,9 +816,15 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
 
         if (addr_info[0] == '\0')
         {
-            char *ip4_ip_addr = "0.0.0.0";
+            /* Quecpython bob.xian 2023/10/24 [reason: JIRA SW1PQUECPYTHON-4193] begin */
+#if 0
+            char* ip4_ip_addr = "0.0.0.0";
             QPY_SOCKET_LOG("[socket] bind IPV4: 0.0.0.0 \r\n");
             inet_pton(AF_INET, ip4_ip_addr, &server_addr.sin_addr.s_addr);
+#else
+            mp_raise_ValueError(MP_ERROR_TEXT("[socket]find IPV4 netif cfg failed..\r\n"));
+#endif
+            /* Quecpython bob.xian 2023/10/24 [reason: JIRA SW1PQUECPYTHON-4193] end */
         }
         else
         {
@@ -639,11 +832,18 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
             inet_pton(AF_INET, addr_info, &server_addr.sin_addr.s_addr);
         }
 
-        lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));
+        if (lwip_bind(self->fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in))) {
+            //bind failed.
+            QPY_SOCKET_LOG("[socket]bind IPV4 failed.\r\n");
+            exception_from_errno(errno);
+        } else {
+            QPY_SOCKET_LOG("[socket]bind IPV4 success.\r\n");
+        }
     }
     else if (self->domain == AF_INET6)
-    {
+    {        
         QPY_SOCKET_LOG("[socket] NOT Support.\r\n");
+        mp_raise_ValueError(MP_ERROR_TEXT("[socket]Not Support IPV6 Now\r\n"));
     }
     return mp_const_none;
 #else
@@ -658,9 +858,9 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
     struct netif* netif_cfg = netif_get_by_cid(pdp);
 #else
     int pdp = Helios_DataCall_GetCurrentPDP();
-#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     struct netif* netif_cfg = netif_get_by_cid(pdp);
-#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
     struct netif* netif_cfg = netif_get_by_cid(pdp - 1);
 #else
     struct netif* netif_cfg = NULL;
@@ -675,9 +875,9 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         {
             if(netif_cfg)
             {
-#if defined (PLAT_Unisoc) || defined(PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                 local_v4.sin_addr.s_addr = netif_cfg->ip_addr.u_addr.ip4.addr;
-#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 local_v4.sin_addr.s_addr = netif_cfg->ip_addr.addr;
 #endif
             }
@@ -688,7 +888,8 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         }
         else
         {
-#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) \
+    || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8910_R06)
             inet_pton(AF_INET, addr_info, &local_v4.sin_addr.s_addr);
 #endif
         }
@@ -711,11 +912,11 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         {
             if(netif_cfg)
             {
-#if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
                 const ip6_addr_t * ip6_addr_ptr = NULL;
                 ip6_addr_ptr = netif_ip6_addr(netif_cfg, 1);
                 memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
-#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+#elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
                 ip6_addr_t * ip6_addr_ptr = NULL;
                 ip6_addr_ptr = netif_get_global_ip6addr(netif_cfg);
                 memcpy(&local_v6.sin6_addr, ip6_addr_ptr, sizeof(ip6_addr_t));
@@ -728,7 +929,8 @@ STATIC mp_obj_t socket_bind(const mp_obj_t arg0, const mp_obj_t arg1) {
         }
         else
         {
-#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) \
+    || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8910_R06)
             inet_pton(AF_INET6, addr_info, &local_v6.sin6_addr);
 #endif
         }
@@ -767,7 +969,7 @@ STATIC mp_obj_t socket_listen(const mp_obj_t arg0, const mp_obj_t arg1) {
         {
             exception_from_errno(ret);
         }
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         exception_from_errno(errno(self->fd));
 #else
         exception_from_errno(errno);
@@ -784,22 +986,42 @@ STATIC mp_obj_t socket_accept(const mp_obj_t arg0) {
     char ip6_addr_buf[128] = {0};
     int ip4_port = 0;
     int ip6_port = 0;
-#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined (PLAT_EIGEN) || defined(PLAT_Qualcomm)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_EIGEN) \
+    || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_RDA) || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
     int sock_errno = 0;
 #endif
 
+#if defined(PLAT_Qualcomm) || defined(PLAT_RDA)
+    if ((self->timeout > 0) && (self->timeout < 10000))
+    {
+        lwip_fcntl(self->fd, F_SETFL, O_NONBLOCK);
+        
+        fd_set rfds;
+        FD_ZERO(&rfds);
+        FD_SET(self->fd, &rfds);
+
+        struct timeval timeout = { .tv_sec = self->timeout, .tv_usec = 0 };
+        MP_THREAD_GIL_EXIT();
+        lwip_select(self->fd + 1, &rfds, NULL, NULL, &timeout);
+        MP_THREAD_GIL_ENTER();
+    }
+#endif
+
     int new_fd = -1;
     for (unsigned int i = 0; i <= self->retries; i++) {
         if (self->domain == AF_INET)
         {
-#if defined (PLAT_Unisoc) || defined (PLAT_ASR_1803s) || defined (PLAT_Qualcomm) || defined (PLAT_ASR) || defined (PLAT_Unisoc_8850) || defined(PLAT_ASR_1606) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_Qualcomm) || defined (PLAT_ASR) \
+    || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) \
+    || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_RDA) || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
             struct sockaddr_in addr_v4;
             socklen_t addr_v4_len = sizeof(addr_v4);
             MP_THREAD_GIL_EXIT();
             new_fd = lwip_accept(self->fd, (struct sockaddr *)&addr_v4, &addr_v4_len);
-#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_aic8800m40) \
+    || defined(PLAT_RDA)
             sock_errno = errno;
-#elif defined (PLAT_EIGEN)
+#elif defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
             sock_errno = get_error();
 #elif defined(PLAT_Qualcomm)
             sock_errno = errno(self->fd);
@@ -812,14 +1034,17 @@ STATIC mp_obj_t socket_accept(const mp_obj_t arg0) {
         }
         else if (self->domain == AF_INET6)
         {
-#if defined (PLAT_Unisoc) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined (PLAT_Unisoc_8850) || defined (PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) || defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)\
+    || defined (PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) \
+    || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_RDA) || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
             struct sockaddr_in6 addr_v6;
             socklen_t addr_v6_len = sizeof(addr_v6);
             MP_THREAD_GIL_EXIT();
             new_fd = lwip_accept(self->fd, (struct sockaddr *)&addr_v6, &addr_v6_len);
-#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_aic8800m40) \
+    || defined(PLAT_RDA)
             sock_errno = errno;
-#elif defined (PLAT_EIGEN)
+#elif defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
             sock_errno = get_error();
 #elif defined(PLAT_Qualcomm)
             sock_errno = errno(self->fd);
@@ -834,6 +1059,7 @@ STATIC mp_obj_t socket_accept(const mp_obj_t arg0) {
         }
 
         if (new_fd >= 0) {
+            QPY_SOCKET_LOG("[socket][%d]new_fd= %d accept success.\r\n", self->fd, new_fd);
             break;
         }
 #if defined(PLAT_Qualcomm)
@@ -842,12 +1068,33 @@ STATIC mp_obj_t socket_accept(const mp_obj_t arg0) {
         if (socket_error != 6) {
             exception_from_errno(socket_error);
         }
-#elif defined(PLAT_EIGEN)
+        else if (self->retries == 0)
+        {
+            mp_raise_OSError(MP_EAGAIN);
+        }
+        else
+        {
+            mp_raise_OSError(MP_ETIMEDOUT);
+        }
+#elif defined(PLAT_RDA)
+        QPY_SOCKET_LOG("[socket] accept socket_error= %d new_fd =%d.\r\n", sock_errno, new_fd);
+        if (sock_errno != EAGAIN) {
+            exception_from_errno(sock_errno);
+        }
+        else if (self->retries == 0)
+        {
+            mp_raise_OSError(MP_EAGAIN);
+        }
+        else
+        {
+            mp_raise_OSError(MP_ETIMEDOUT);
+        }
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         QPY_SOCKET_LOG("[socket] accept socket_error= %d.\r\n", sock_errno);
         if (sock_errno != 62) {
             exception_from_errno(sock_errno);
-        }
-#elif defined (PLAT_ASR_1803s) || defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+        } 
+#elif defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined (PLAT_ECR6600) || defined(PLAT_aic8800m40)
         if (sock_errno != EAGAIN) {
             exception_from_errno(sock_errno);
         }
@@ -886,6 +1133,10 @@ STATIC mp_obj_t socket_accept(const mp_obj_t arg0) {
         tuple[1] = mp_obj_new_str(ip6_addr_buf, strlen(ip6_addr_buf));
         tuple[2] = mp_obj_new_int(ip6_port);
     }
+    
+#if defined(PLAT_Qualcomm)
+    QPY_SOCKET_LOG("[socket] accept addr= %s & port= %d.\r\n", tuple[1], tuple[2]);
+#endif
 
     _socket_settimeout(sock, UINT64_MAX);
     return mp_obj_new_tuple(3, tuple);
@@ -894,6 +1145,46 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_accept_obj, socket_accept);
 
 STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
     socket_obj_t *self = MP_OBJ_TO_PTR(arg0);
+
+#if MICROPY_QPY_MODULE_WIFI
+        if (!wifi_flag)
+        {
+            mp_obj_t *wifi_elem;
+            mp_obj_get_array_fixed_n(arg1, 2, &wifi_elem);
+
+            char sock_at[256];
+            memset(sock_at, 0, sizeof(sock_at));
+
+            sprintf(sock_at, "AT+CIPSTART=%d,\"TCP\",\"%s\",%ld\r\n", self->fd, mp_obj_str_get_str(wifi_elem[0]), mp_obj_get_int(wifi_elem[1]));
+
+            MP_THREAD_GIL_EXIT();
+            Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+            MP_THREAD_GIL_ENTER();
+
+            int ret = _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+            Helios_Mutex_Unlock(wifi->mutex);
+            if (ret == 1)
+            {
+                char sock_recv[256];
+                char *data = NULL;
+                memset(sock_recv, 0, sizeof(sock_recv));
+                strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+
+                data = strstr((const char *)sock_recv, "CONNECT");
+                if (data)
+                {
+                    //mp_printf(&mp_plat_print, "[modsocket] socket_connect success\r\n");
+                    return mp_const_none;
+                }
+                else
+                {
+                    mp_raise_ValueError(MP_ERROR_TEXT("WiFi Connect Fail."));
+                }
+            }
+            exception_from_errno(114);
+        }
+#endif
+
     int r;
     if (self->connect_flag == true)
     {
@@ -997,7 +1288,7 @@ STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
     struct addrinfo *res;
     _socket_getaddrinfo(arg1, &res);
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     mp_obj_t *elem;
     mp_obj_get_array_fixed_n(arg1, 2, &elem);
     const char * host = mp_obj_str_get_str(elem[0]);
@@ -1020,12 +1311,15 @@ STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
         t.tv_sec = self->timeout;
         t.tv_usec = 0;
         
-#if !defined(PLAT_ECR6600)
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+        int sock_nbio = 0;
+#else 
         int sock_nbio = 1;
-        lwip_ioctl(self->fd, FIONBIO, &sock_nbio);
 #endif
+        lwip_ioctl(self->fd, FIONBIO, &sock_nbio);
+
         r = lwip_connect(self->fd, res->ai_addr, res->ai_addrlen);
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int socket_error = errno(self->fd);
 #else
         int socket_error = errno;
@@ -1045,24 +1339,24 @@ STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
             QPY_SOCKET_LOG("*** select timeout or error ***\r\n");
             mp_raise_OSError(MP_ETIMEDOUT);
         }
-#if defined(PLAT_EIGEN) || defined(PLAT_ECR6600) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_ECR6600) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) \
+    || defined(PLAT_RDA) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         socket_error = errno(self->fd);
 #else
         socket_error = errno;
 #endif
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
         if(FD_ISSET(self->fd , &write_fds))
         {
-            int len = 0;
-
             FD_CLR(self->fd , &write_fds);
-
-            len = sizeof(socket_error);
-            lwip_getsockopt(self->fd , SOL_SOCKET, SO_ERROR, &socket_error, &len);
+#if defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc)
+            int len = sizeof(socket_error);
+            lwip_getsockopt(self->fd, SOL_SOCKET, SO_ERROR, &socket_error, (socklen_t *)&len);
+#endif
             QPY_SOCKET_LOG("*** lwip_select error = %d ***\r\n", socket_error);
-            if (!((socket_error == 0) || (socket_error == EISCONN)))
+            if (!((socket_error == 0) || (socket_error == EISCONN) || (socket_error == EINPROGRESS)))
             {
                 mp_raise_OSError(socket_error);
             }
@@ -1076,7 +1370,21 @@ STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
 #endif
 #endif
 
-#if !defined(PLAT_ECR6600)
+#if defined(PLAT_ASR) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+        if(r == 2)
+        {
+            //using recv to check connect be RST or not
+            char buf[10];
+            int bytes = lwip_recvfrom(self->fd, buf, 0, 0, NULL, NULL);
+            if(bytes < 0)
+            {
+                mp_raise_OSError(errno);
+            }
+        }
+#endif
+
+#if !(defined(PLAT_ECR6600) || defined(PLAT_RDA) || defined(PLAT_aic8800m40))
+        QPY_SOCKET_LOG("*** lwip_ioctl sock_nbio = %d ***\r\n", sock_nbio);
         sock_nbio = 0;
         lwip_ioctl(self->fd, FIONBIO, &sock_nbio);
 #endif
@@ -1088,7 +1396,7 @@ STATIC mp_obj_t socket_connect(const mp_obj_t arg0, const mp_obj_t arg1) {
         lwip_freeaddrinfo(res);
         if (r != 0) 
         {
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
             int socket_error = errno(self->fd);
 #else
             int socket_error = errno;
@@ -1115,7 +1423,7 @@ STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
             int val = mp_obj_get_int(args[3]);
             int ret = lwip_setsockopt(self->fd, SOL_SOCKET, opt, &val, sizeof(int));
             if (ret != 0) {
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
                 exception_from_errno(errno(self->fd));
 #else
                 exception_from_errno(errno);
@@ -1141,7 +1449,7 @@ STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
                 optval = 3;
                 ret = lwip_setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPCNT, &optval, sizeof(int));
                 if (ret != 0) {
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
                     exception_from_errno(errno(self->fd));
 #else
                     exception_from_errno(errno);
@@ -1151,6 +1459,89 @@ STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
             break;
         }
 
+#if defined(PLAT_Qualcomm)
+        case TCP_MAXSEG:
+        {
+            int val = mp_obj_get_int(args[3]);
+
+            int ret = lwip_setsockopt(self->fd, SOL_SOCKET, TCP_MAXSEG, &val, sizeof(int));
+            if (ret != 0) 
+            {
+                exception_from_errno(errno(self->fd));
+            }
+
+            break;
+        }
+#endif
+        
+#if defined (PLAT_Unisoc)
+        case SO_KEEPALIVE:
+        {
+            if (self->type == SOCK_STREAM)
+            {
+                int val = mp_obj_get_int(args[3]);
+                if ((val == 0) || (val == 1))
+                {
+                    int ret = lwip_setsockopt(self->fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int));
+                    if (ret != 0) {
+                        exception_from_errno(errno);
+                    }
+
+                    int optval = 3;
+                    ret = lwip_setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPCNT, &optval, sizeof(int));
+                    if (ret != 0) {
+                        exception_from_errno(errno);
+                    }
+                }
+                else
+                {
+                    mp_printf(&mp_plat_print, "Warning: lwip.setsockopt() SO_KEEPALIVE not implemented\n");
+                }
+           }
+            break;
+        }
+
+        case TCP_KEEPIDLE:
+        {
+            if (self->type == SOCK_STREAM)
+            {
+                int val = mp_obj_get_int(args[3]);
+                if (val > 0 )
+                {
+                    int ret = lwip_setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPIDLE, &val, sizeof(int));
+                    if (ret != 0) {
+                        exception_from_errno(errno);
+                    }
+                }
+                else
+                {
+                    mp_printf(&mp_plat_print, "Warning: lwip.setsockopt() TCP_KEEPIDLE not implemented\n");
+                }
+           }
+            break;
+        }
+
+        case 10:
+        {
+            if (self->type == SOCK_STREAM)
+            {
+                int val = mp_obj_get_int(args[3]);
+                if (val > 0 )
+                {
+                    int ret = lwip_setsockopt(self->fd, IPPROTO_TCP, TCP_KEEPINTVL, &val, sizeof(int));
+                    if (ret != 0) {
+                        exception_from_errno(errno);
+                    }
+                }
+                else
+                {
+                    mp_printf(&mp_plat_print, "Warning: lwip.setsockopt() TCP_KEEPINTVL not implemented\n");
+                }
+           }
+            break;
+        }
+#endif
+
         #if MICROPY_PY_USOCKET_EVENTS
         // level: SOL_SOCKET
         // special "register callback" option
@@ -1194,6 +1585,48 @@ STATIC mp_obj_t socket_setsockopt(size_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_setsockopt_obj, 4, 4, socket_setsockopt);
 
+STATIC mp_obj_t socket_getsockopt(size_t n_args, const mp_obj_t *args) {
+    (void)n_args;
+    socket_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+
+    int opt = mp_obj_get_int(args[2]);
+
+    switch (opt) {
+        case SO_ACCEPTCONN: {
+            int val = 0;
+            int optlen = sizeof(int);
+            int ret = lwip_getsockopt(self->fd, SOL_SOCKET, opt, &val, (socklen_t *)&optlen);
+            if (ret == 0)
+            {
+                               if (val == 0)
+                               {
+                    mp_obj_t tuple[2];
+                    tuple[0] = mp_obj_new_int(0);
+                    tuple[1] = mp_obj_new_int(self->bind_port);
+                    return mp_obj_new_tuple(2, tuple);
+                               }
+                               else
+                               {
+                    mp_obj_t tuple[2];
+                    tuple[0] = mp_obj_new_int(1);
+                    tuple[1] = mp_obj_new_int(self->bind_port);
+                    return mp_obj_new_tuple(2, tuple);
+                               }
+            }
+            else
+            {
+                mp_printf(&mp_plat_print, "lwip.getsockopt() option SO_ACCEPTCONN [%d] Fail \n", ret);
+                return mp_obj_new_int(-1);
+            }
+        }
+
+        default:
+            mp_printf(&mp_plat_print, "Warning: lwip.getsockopt() option not implemented\n");
+    }
+    return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_getsockopt_obj, 3, 3, socket_getsockopt);
+
 void _socket_settimeout(socket_obj_t *sock, uint64_t timeout_ms) {
     // Rather than waiting for the entire timeout specified, we wait sock->retries times
     // for SOCKET_POLL_US each, checking for a MicroPython interrupt between timeouts.
@@ -1203,19 +1636,43 @@ void _socket_settimeout(socket_obj_t *sock, uint64_t timeout_ms) {
 
     sock->timeout = timeout_ms/1000;
 
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        if (timeout_ms == UINT64_MAX)
+        {
+            timeout_ms = 8000000;
+        }
+
+        sock->retries = timeout_ms/100;
+        return;
+    }
+#else
+#if defined(PLAT_ECR6600)
+    int nNetTimeout = timeout_ms ? SOCKET_POLL_US / 1000 : 0;
+    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&nNetTimeout, sizeof(int));
+    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&nNetTimeout, sizeof(int));
+#else
     struct timeval timeout = {
         .tv_sec = 0,
         .tv_usec = timeout_ms ? SOCKET_POLL_US : 0
     };
-    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_SNDTIMEO, (const void *)&timeout, sizeof(timeout));
-    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_RCVTIMEO, (const void *)&timeout, sizeof(timeout));
-    #if CONFIG_POC_SLPOC
+    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_SNDTIMEO, (const void*)&timeout, sizeof(timeout));
+    lwip_setsockopt(sock->fd, SOL_SOCKET, SO_RCVTIMEO, (const void*)&timeout, sizeof(timeout));
+#endif
+    #if CONFIG_POC_SLPOC  || CONFIG_POC_QS_R07
     fcntl(sock->fd, F_SETFL, timeout_ms ? 0 : O_NONBLOCK);
+    #elif defined(PLAT_RDA)
+    if (timeout_ms != UINT64_MAX)
+    {
+        lwip_fcntl(sock->fd, F_SETFL, O_NONBLOCK);
+    }
     #else
     #if defined(PLAT_ECR6600)
-    lwip_fcntl(sock->fd, F_SETFL, O_NONBLOCK);
+    lwip_fcntl(sock->fd, F_SETFL, timeout_ms ? 0 : O_NONBLOCK);
     #else
     lwip_fcntl(sock->fd, F_SETFL, timeout_ms ? 0 : O_NONBLOCK);
+#endif
     #endif
     #endif
 }
@@ -1277,6 +1734,67 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
     {
         retries = sock->retries;
     }
+    
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+       char flag = 0;
+               int ret = 0;
+        int recv_size = 0;
+        int send_size = 0;
+               int current_size = 0;
+               if (sock->fd == -1)
+        {
+            *errcode = EINVAL;
+            return MP_STREAM_ERROR;
+        }
+               MP_THREAD_GIL_EXIT();
+
+               current_size = Helios_wifi_rb_data_space(Helios_wifi_ring_buf_socket[sock->fd]);
+               if( current_size == 0 ) {
+                       do {
+                               ret = Helios_MsgQ_Get(wifi->data_ind[sock->fd], &flag, sizeof(char), sock->timeout*1000);
+                               if( ret != 0 ) break;
+                               current_size = Helios_wifi_rb_data_space(Helios_wifi_ring_buf_socket[sock->fd]);
+                               if( current_size > 0 ) break;
+                       }while(1);
+               }
+
+               if (Helios_wifi_ring_buf_socket[sock->fd])
+        {
+             recv_size = Helios_wifi_rb_read(Helios_wifi_ring_buf_socket[sock->fd], (unsigned char *)buf, size);
+             if (recv_size <= 0 && Helios_wifi_ring_buf_socket[sock->fd]->peer_closed)
+             {
+                sock->peer_closed = true;
+             }
+        }
+
+        if (recv_size > 0)
+        {
+            QPY_SOCKET_LOG("lwip[%d] read data recv_size = %d retries = %d \n", sock->fd, recv_size, sock->retries);
+            *errcode = 0;
+            send_size += recv_size;
+            MP_THREAD_GIL_ENTER();
+            return recv_size;
+        }
+         
+        if (sock->peer_closed) 
+        {
+            *errcode = 107;
+            MP_THREAD_GIL_ENTER();
+            return MP_STREAM_ERROR;
+        }
+        MP_THREAD_GIL_ENTER();
+
+        if (send_size > 0)
+        {
+            *errcode = 0;
+            return send_size;
+        }
+        *errcode = ret == 0 ? MP_EWOULDBLOCK : MP_ETIMEDOUT;
+        return MP_STREAM_ERROR;
+    }
+#endif
     // XXX Would be nicer to use RTC to handle timeouts
     for (unsigned int i = 0; i <= retries; ++i) {
         if (sock->timeout > 5)
@@ -1294,6 +1812,12 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
         }
         // Poll the socket to see if it has waiting data and only release the GIL if it doesn't.
         // This ensures higher performance in the case of many small reads, eg for readline.
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+        if (sock->fd < 0)
+        {
+            mp_raise_OSError(-1);
+        }
+#endif
 
         fd_set rfds;
         int r = 0;
@@ -1301,7 +1825,7 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
         FD_SET(sock->fd, &rfds);
 
         MP_THREAD_GIL_EXIT();
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
         if (sock->timeout > 5)
         {
             struct timeval timeout = { .tv_sec = 5, .tv_usec = 0 };
@@ -1316,10 +1840,14 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
         }
         else
         {
-#if !defined(PLAT_Qualcomm)
+/* bob.xian 2023/9/20 [To avoid not receiving data, do this temporarily] begin */
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40) 
             struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
-#else
+/* bob.xian 2023/9/20 [To avoid not receiving data, do this temporarily] end */
+#elif defined(PLAT_Qualcomm) || defined(PLAT_RDA)
             struct timeval timeout = { .tv_sec = 0, .tv_usec = 100000 };
+#else
+            struct timeval timeout = { .tv_sec = 0, .tv_usec = 0 };
 #endif
             r = lwip_select(sock->fd + 1, &rfds, NULL, NULL, &timeout);
         }
@@ -1329,7 +1857,7 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
 #if defined(PLAT_Qualcomm)
         int socket_error = errno(sock->fd);
         QPY_SOCKET_LOG("lwip[%d] read data r = %d socket_error = %d \n", sock->fd, r, socket_error);
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int socket_error = get_error();
 #else
         int socket_error = errno;
@@ -1386,7 +1914,9 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
                 return MP_STREAM_ERROR;
             }
         }
-#elif defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined (PLAT_ASR_1803s) || defined(PLAT_ASR_1606)|| defined(PLAT_ASR) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#elif defined (PLAT_Unisoc) || defined (PLAT_Unisoc_8850) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \
+    || defined(PLAT_ASR) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8850_R02) \
+    || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
         int32_t tcpstate = (int32_t)lwip_getTcpState(sock->fd);
         if ((tcpstate < 4) && (sock->type == SOCK_STREAM) && (sock->fd >=0))
         {
@@ -1396,7 +1926,7 @@ STATIC mp_uint_t _socket_read_data(mp_obj_t self_in, void *buf, size_t size,
             }
         }
 
-#if defined (PLAT_EIGEN)
+#if defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         if (socket_error != 62) {
             *errcode = socket_error;
             return MP_STREAM_ERROR;
@@ -1449,9 +1979,9 @@ STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
     mp_obj_t tuple[2];
     tuple[0] = _socket_recvfrom(self_in, len_in, &from, &fromlen);
 
-#if defined (PLAT_Qualcomm) || defined (PLAT_EIGEN)
+#if defined (PLAT_Qualcomm) || defined (PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     socket_obj_t *sock = MP_OBJ_TO_PTR(self_in);
-    if (sock->type == SOCK_STREAM)
+    if ((sock->type == SOCK_STREAM) && !(sock->proto == 7))
     {
         mp_obj_t tuple_info[2] = {
                tuple_info[0] = mp_obj_new_str(sock->host, strlen(sock->host)),
@@ -1471,16 +2001,56 @@ STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) {
 STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_recvfrom_obj, socket_recvfrom);
 
 int _socket_send(socket_obj_t *sock, const char *data, size_t datalen) {
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        char sock_at[64];
+        memset(sock_at, 0, sizeof(sock_at));
+
+        sprintf(sock_at, "AT+CIPSEND=%d,%d\r\n", sock->fd, datalen);
+
+        MP_THREAD_GIL_EXIT();
+        Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+        MP_THREAD_GIL_ENTER();
+
+        int ret =  _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+        if (ret == 0)
+        {
+            Helios_msleep(20);
+            ret = _wifi_send_atcmd((char *)data, datalen);
+            QPY_SOCKET_LOG("[modsocket][wifi] socket_stream_write ret = %d datalen=%d \r\n", ret, datalen);
+            //mp_printf(&mp_plat_print, "[modsocket] socket_stream_write ret = %d datalen=%d\r\n", ret, datalen);
+            if (ret == 2)
+            {
+                Helios_Mutex_Unlock(wifi->mutex);
+                return datalen;
+            }
+        }
+        Helios_Mutex_Unlock(wifi->mutex);
+        mp_raise_OSError(MP_ETIMEDOUT);
+    }
+#endif
+    if(datalen == 0){
+       mp_printf(&mp_plat_print, "[modsocket] socket_send datalen = %d\r\n", datalen);
+       return datalen; 
+    }
+    
     int sentlen = 0;
     for (unsigned int i = 0; i <= sock->retries && sentlen < (int)datalen; i++) {
         MP_THREAD_GIL_EXIT();
-        #if CONFIG_POC_SLPOC
+        #if CONFIG_POC_SLPOC || CONFIG_POC_QS_R07
         int r = write(sock->fd, data + sentlen, datalen - sentlen);
         #else
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+        if (sock->fd < 0)
+        {
+            mp_raise_OSError(-1);
+        }
+#endif
         int r = lwip_write(sock->fd, data + sentlen, datalen - sentlen);
         #endif
         MP_THREAD_GIL_ENTER();
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int socket_error = errno(sock->fd);
         if (r < 0 && socket_error != 11) {
             exception_from_errno(socket_error);
@@ -1532,6 +2102,72 @@ STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_
     mp_buffer_info_t bufinfo;
     mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
 
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        char sock_at[256];
+        memset(sock_at, 0, sizeof(sock_at));
+        
+        mp_obj_t *wifi_elem;
+        mp_obj_get_array_fixed_n(addr_in, 2, &wifi_elem);
+
+        if (self->type == SOCK_DGRAM)
+        {
+            sprintf(sock_at, "AT+CIPSTART=%d,\"UDP\",\"%s\",%ld\r\n", self->fd, mp_obj_str_get_str(wifi_elem[0]), mp_obj_get_int(wifi_elem[1]));
+
+            MP_THREAD_GIL_EXIT();
+            Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+            MP_THREAD_GIL_ENTER();
+
+            int ret = _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+            if (ret == 1)
+            {
+                char sock_recv[256];
+                char *data = NULL;
+                memset(sock_recv, 0, sizeof(sock_recv));
+                strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+            
+                data = strstr((const char *)sock_recv, "CONNECT");
+                if (data)
+                {
+                    memset(sock_at, 0, sizeof(sock_at));
+
+                    sprintf(sock_at, "AT+CIPSEND=%d,%ld\r\n", self->fd, bufinfo.len);
+
+                    Helios_msleep(20);
+                    int ret = _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+                    if (ret == 0)
+                    {
+                        Helios_msleep(20);
+                        ret = _wifi_send_atcmd((char *)bufinfo.buf, bufinfo.len);
+                        if (ret == 2)
+                        {
+                            Helios_Mutex_Unlock(wifi->mutex);
+                            return mp_obj_new_int_from_uint(ret);
+                        }
+                    }
+                    Helios_Mutex_Unlock(wifi->mutex);
+                    mp_raise_OSError(MP_ETIMEDOUT);
+                }
+                else
+                {
+                    Helios_Mutex_Unlock(wifi->mutex);
+                    mp_raise_ValueError(MP_ERROR_TEXT("WiFi UDP sendto Fail."));
+                }
+            }
+            else
+            {
+                Helios_Mutex_Unlock(wifi->mutex);
+                mp_raise_OSError(MP_EHOSTUNREACH);
+            }
+        }
+        else
+        {
+            mp_raise_ValueError(MP_ERROR_TEXT("WiFi Not Support."));
+        }
+    }
+#endif
+
     // create the destination address
     struct sockaddr_in to;
 #if !defined(PLAT_Qualcomm)
@@ -1548,7 +2184,7 @@ STATIC mp_obj_t socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_
         if (ret > 0) {
             return mp_obj_new_int_from_uint(ret);
         }
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int socket_error = errno(self->fd);
         if (ret == -1 && socket_error != 11) {
             exception_from_errno(socket_error);
@@ -1579,14 +2215,68 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 3, socket_mak
 /*[Jayceon][2021/03/18][start]add this api to get socket state*/
 STATIC mp_obj_t socket_getstate(const mp_obj_t self_in) 
 {
-       socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       int32_t tcpstate = (int32_t)lwip_getTcpState(self->fd);
-       return mp_obj_new_int(tcpstate);
+    socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        char sock_at[32];
+        memset(sock_at, 0, sizeof(sock_at));
+
+        sprintf(sock_at, "AT+CIPSTATUS\r\n");
+
+        MP_THREAD_GIL_EXIT();
+        Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+        MP_THREAD_GIL_ENTER();
+
+        int ret =  _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+        Helios_Mutex_Unlock(wifi->mutex);
+        if (ret == 1)
+        {
+            char sock_recv[384];
+            char *data = NULL;
+            memset(sock_recv, 0, sizeof(sock_recv));
+            strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+
+            data = strstr((const char *)sock_recv, "STATUS");
+            if (data)
+            {
+                int sta = data[7];
+                int len = 0, sockid = -1;
+                //mp_printf(&mp_plat_print, "[modsocket] socket_getstate sta[%c]\r\n", sta);
+                if (sta == '3')
+                {
+                    while (1) 
+                    {
+                        data = strstr((const char *)(data + len), "+CIPSTATUS");
+                        if (!data)
+                        {
+                            break;
+                        }
+
+                        sscanf(data, "%*[^:]:%d,[^,]", &sockid);
+                        //mp_printf(&mp_plat_print, "[modsocket] socket_getstate sockid[%d]\r\n", sockid);
+                        if (sockid == self->fd)
+                        {
+                            return mp_obj_new_int(4);
+                        }
+                        len += 47;
+                    }
+                }
+            }
+       }
+
+        return mp_obj_new_int(-1);
+    }
+#endif
+
+    int32_t tcpstate = (int32_t)lwip_getTcpState(self->fd);
+    return mp_obj_new_int(tcpstate);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_getstate_obj, socket_getstate);
 /*[Jayceon][2021/03/18][end]add this api to get socket state*/
 
-#if defined (PLAT_ASR_1803s) || defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN) \
+    || defined(PLAT_EIGEN_718) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8910_R06)
 /*[xjin.gao][2023/03/16][start]add this api to get socket send data server ack has been received normally*/
 STATIC mp_obj_t socket_getsendacksize(const mp_obj_t self_in) 
 {
@@ -1595,10 +2285,16 @@ STATIC mp_obj_t socket_getsendacksize(const mp_obj_t self_in)
         return mp_obj_new_int(-1);
 
     int32_t tcpacksize = 0;
-#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_ASR)
     int optlen = sizeof(int);
     int32_t ret = lwip_getsockopt(self->fd, IPPROTO_TCP, TCP_TXB_ACKED, &tcpacksize, (socklen_t *)&optlen);
-#elif defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN)
+#elif defined(PLAT_RDA)
+    #if MICROPY_QPY_MODULE_USOCKET_SENDACK
+        tcpacksize = lwip_getAckedSize(self->fd);
+    #else
+        mp_raise_ValueError(MP_ERROR_TEXT("Getsendacksize Not Support."));
+    #endif
+#elif defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
     tcpacksize = lwip_getAckedSize(self->fd);
 #endif
 
@@ -1615,17 +2311,59 @@ STATIC mp_uint_t socket_stream_read(mp_obj_t self_in, void *buf, mp_uint_t size,
 STATIC mp_uint_t socket_stream_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) {
     socket_obj_t *sock = self_in;
     for (unsigned int i = 0; i <= sock->retries; i++) {
+#if MICROPY_QPY_MODULE_WIFI
+        if (!wifi_flag)
+        {
+            if (sock->fd < 0) {
+                return MP_STREAM_ERROR;
+            }
+
+            char sock_at[32];
+            memset(sock_at, 0, sizeof(sock_at));
+
+            sprintf(sock_at, "AT+CIPSEND=%d,%d\r\n", sock->fd, size);
+
+            MP_THREAD_GIL_EXIT();
+            Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+            MP_THREAD_GIL_ENTER();
+
+            int ret =  _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+            if (ret == 0)
+            {
+                Helios_msleep(50);
+                ret = _wifi_send_atcmd((char *)buf, size);
+
+                QPY_SOCKET_LOG("[modsocket][wifi] socket_stream_write ret = %d \r\n", ret);
+                //mp_printf(&mp_plat_print, "[modsocket] socket_stream_write ret = %d\r\n", ret);
+                if (ret == 2)
+                {
+                    Helios_Mutex_Unlock(wifi->mutex);
+                    return size;
+                }
+            }
+            Helios_Mutex_Unlock(wifi->mutex);
+            *errcode = sock->retries == 0 ? MP_EWOULDBLOCK : MP_ETIMEDOUT;
+            return MP_STREAM_ERROR;
+        }
+#endif
+
         MP_THREAD_GIL_EXIT();
-        #if CONFIG_POC_SLPOC
+        #if CONFIG_POC_SLPOC || CONFIG_POC_QS_R07
         int r = write(sock->fd, buf, size);
         #else
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
+        if (sock->fd < 0)
+        {
+            mp_raise_OSError(-1);
+        }
+#endif
         int r = lwip_write(sock->fd, buf, size);
         #endif
         MP_THREAD_GIL_ENTER();
         if (r > 0) {
             return r;
         }
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         int socket_error = errno(sock->fd);
         if (r < 0 && socket_error != 11) {
             *errcode = socket_error;
@@ -1682,14 +2420,66 @@ STATIC mp_uint_t socket_stream_ioctl(mp_obj_t self_in, mp_uint_t request, uintpt
         }
         return ret;
     } else if (request == MP_STREAM_CLOSE) {
+    
+        mp_printf(&mp_plat_print, "[modsocket] socket close socket->fd = %d\r\n", socket->fd);
         if (socket->fd >= 0) {
+#if MICROPY_QPY_MODULE_WIFI
+            if (!wifi_flag) {
+                               
+                 if( Helios_wifi_ring_buf_socket[socket->fd] )
+                 {
+                     free(Helios_wifi_ring_buf_socket[socket->fd]);
+                     Helios_wifi_ring_buf_socket[socket->fd] = NULL;
+                 }
+
+                char sock_at[32];
+                memset(sock_at, 0, sizeof(sock_at));
+                sprintf(sock_at, "AT+CIPCLOSE=%d\r\n", socket->fd);
+
+                socket->peer_closed = true;
+                socket->connect_flag = false;
+
+                MP_THREAD_GIL_EXIT();
+                Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+                MP_THREAD_GIL_ENTER();
+
+                int ret =  _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+                Helios_Mutex_Unlock(wifi->mutex);
+                QPY_SOCKET_LOG("[modsocket][wifi] socket_close sock_at[%s] ret[%d]\r\n", sock_at, ret);
+                if (ret == 1)
+                {
+                    char sock_recv[256];
+                    char *data = NULL;
+                    memset(sock_recv, 0, sizeof(sock_recv));
+                    strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+
+                    data = strstr((const char *)sock_recv, "CLOSED");
+                    if (data)
+                    {
+                        sock_fd[socket->fd] = -1;
+                        socket->fd = -1;
+                        return 0;
+                    }
+                    else
+                    {
+                        return 0;
+                    }
+                }
+
+                sock_fd[socket->fd] = -1;
+                socket->fd = -1;
+
+                return 0;
+            }
+#endif
+
             #if MICROPY_PY_USOCKET_EVENTS
             if (socket->events_callback != MP_OBJ_NULL) {
                 usocket_events_remove(socket);
                 socket->events_callback = MP_OBJ_NULL;
             }
             #endif
-            #if CONFIG_POC_SLPOC
+            #if CONFIG_POC_SLPOC || CONFIG_POC_QS_R07
             int ret = close(socket->fd);
             #else
             int ret = lwip_close(socket->fd);
@@ -1698,9 +2488,10 @@ STATIC mp_uint_t socket_stream_ioctl(mp_obj_t self_in, mp_uint_t request, uintpt
 #if defined(PLAT_Qualcomm)
             QPY_SOCKET_LOG("lwip_close[%d] ret:%d errno:%d \n", socket->fd, ret, errno(socket->fd));
 #endif
+            mp_printf(&mp_plat_print, "[modsocket] socket close ret = %d && errno = %d \r\n", ret, errno);
 
             if (ret != 0) {
-#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+#if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
                 *errcode = errno(socket->fd);
 #else
                 *errcode = errno;
@@ -1715,6 +2506,14 @@ STATIC mp_uint_t socket_stream_ioctl(mp_obj_t self_in, mp_uint_t request, uintpt
     *errcode = MP_EINVAL;
     return MP_STREAM_ERROR;
 }
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+STATIC mp_obj_t socket_shutdown(const mp_obj_t arg0) {
+    socket_obj_t *sock = MP_OBJ_TO_PTR(arg0);
+    int r = shutdown(sock->fd, SHUT_RDWR);
+    return mp_obj_new_int(r);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(socket_shutdown_obj, socket_shutdown);
+#endif
 
 STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mp_stream_close_obj) },
@@ -1729,18 +2528,23 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = {
     { MP_ROM_QSTR(MP_QSTR_recv), MP_ROM_PTR(&socket_recv_obj) },
     { MP_ROM_QSTR(MP_QSTR_recvfrom), MP_ROM_PTR(&socket_recvfrom_obj) },
     { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socket_setsockopt_obj) },
+     { MP_ROM_QSTR(MP_QSTR_getsockopt), MP_ROM_PTR(&socket_getsockopt_obj) },
     { MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socket_settimeout_obj) },
     { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) },
     { MP_ROM_QSTR(MP_QSTR_makefile), MP_ROM_PTR(&socket_makefile_obj) },
     { MP_ROM_QSTR(MP_QSTR_fileno), MP_ROM_PTR(&socket_fileno_obj) },
     { MP_ROM_QSTR(MP_QSTR_getsocketsta), MP_ROM_PTR(&socket_getstate_obj) },
-#if defined (PLAT_ASR_1803s) || defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN)
+#if defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_EIGEN) \
+    || defined(PLAT_EIGEN_718) || defined(PLAT_RDA) || defined(PLAT_Unisoc_8910_R06)
     { MP_ROM_QSTR(MP_QSTR_getsendacksize), MP_ROM_PTR(&socket_getsendacksize_obj) },
 #endif
     { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) },
     { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
     { MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
     { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    { MP_ROM_QSTR(MP_QSTR_shutdown), MP_ROM_PTR(&socket_shutdown_obj) },
+#endif
 };
 STATIC MP_DEFINE_CONST_DICT(socket_locals_dict, socket_locals_dict_table);
 
@@ -1812,7 +2616,7 @@ STATIC mp_obj_t mod_socket_inet_pton(mp_obj_t family_in, mp_obj_t addr_in) {
     int family = mp_obj_get_int(family_in);
     byte binaddr[BINADDR_MAX_LEN];
     int r = inet_pton(family, mp_obj_str_get_str(addr_in), binaddr);
-       #if defined(PLAT_Qualcomm)|| defined(PLAT_EIGEN)
+       #if defined(PLAT_Qualcomm)|| defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
          RAISE_ERRNO(r, 14);
        #else
          RAISE_ERRNO(r, errno);
@@ -1840,7 +2644,7 @@ STATIC mp_obj_t mod_socket_inet_ntop(mp_obj_t family_in, mp_obj_t binaddr_in) {
     vstr_t vstr;
     vstr_init_len(&vstr, family == AF_INET ? INET_ADDRSTRLEN : INET6_ADDRSTRLEN);
     if (inet_ntop(family, bufinfo.buf, vstr.buf, vstr.len) == NULL) {
-       #if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN)
+       #if defined(PLAT_Qualcomm) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
         mp_raise_OSError(14);
        #else
                mp_raise_OSError(errno);
@@ -1855,7 +2659,62 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_socket_inet_ntop_obj, mod_socket_inet_ntop)
 
 STATIC mp_obj_t socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
     // TODO support additional args beyond the first two
+    (void)n_args;
+
+#if MICROPY_QPY_MODULE_WIFI
+    if (!wifi_flag)
+    {
+        const char *host_str = mp_obj_str_get_str(args[0]);
+        const int port = mp_obj_get_int(args[1]);
+
+        struct addrinfo *res = NULL;
+        mp_obj_t wifi_ret_list = mp_obj_new_list(0, NULL);
+
+        char sock_at[256];
+        memset(sock_at, 0, sizeof(sock_at));
+        sprintf(sock_at, "AT+CIPDOMAIN=\"%s\",2\r\n", host_str);
+
+        MP_THREAD_GIL_EXIT();
+        Helios_Mutex_Lock(wifi->mutex, HELIOS_WAIT_FOREVER);
+        MP_THREAD_GIL_ENTER();
+
+        int ret =  _wifi_send_atcmd(sock_at, strlen((const char *)sock_at));
+        Helios_Mutex_Unlock(wifi->mutex);
+        //mp_printf(&mp_plat_print, "[modsocket] getaddrinfo sock_at[%s]  ret = %d\r\n", sock_at, wifi_flag);
+
+        if (ret == 1)
+        {
+            char sock_recv[256];
+            memset(sock_recv, 0, sizeof(sock_recv));
+            strncpy(sock_recv, wifi->recvdata, wifi->recvlen);
+
+            if (strstr((const char *)sock_recv, "CIPDOMAIN"))
+            {
+                mp_obj_t wifi_addrinfo_objs[5] = {
+                    mp_obj_new_int(AF_INET),
+                    mp_obj_new_int(SOCK_DGRAM),
+                    mp_obj_new_int(0),
+                    mp_obj_new_str(host_str, strlen(host_str)),
+                    mp_const_none
+                };
+
+                char sock_ip[16];
+                memset(sock_ip, 0, sizeof(sock_ip));
+
+                sscanf(sock_recv,"%*[^\"]\"%[^\"]",sock_ip);
+                mp_obj_t inaddr_objs[2] = {
+                    mp_obj_new_str(sock_ip, strlen((const char *) sock_ip)),
+                    mp_obj_new_int(port)
+                };
+
+                wifi_addrinfo_objs[4] = mp_obj_new_tuple(2, inaddr_objs);
+                mp_obj_list_append(wifi_ret_list, mp_obj_new_tuple(5, wifi_addrinfo_objs));
+            }
+        }   
 
+        return wifi_ret_list;
+    }
+#endif
     struct addrinfo *res = NULL;
     _socket_getaddrinfo2(args[0], args[1], &res);
     mp_obj_t ret_list = mp_obj_new_list(0, NULL);
@@ -1872,13 +2731,14 @@ STATIC mp_obj_t socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
         if (resi->ai_family == AF_INET) {
             struct sockaddr_in *addr = (struct sockaddr_in *)resi->ai_addr;
             // This looks odd, but it's really just a u32_t
-        #if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+        #if defined (PLAT_Unisoc) || defined (PLAT_RDA) || defined (PLAT_Unisoc_8850) || defined (PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02)\
+            || defined(PLAT_EIGEN_718) || defined(PLAT_Unisoc_8910_R06)
             ip_addr_t ip4_addr = { .u_addr.ip4.addr = addr->sin_addr.s_addr };
-        #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1606)
+        #elif defined (PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
             ip_addr_t ip4_addr = { .addr = addr->sin_addr.s_addr };
         #endif
             char buf[16];
-#if defined (PLAT_Qualcomm) || defined (PLAT_ASR_1803s) || defined(PLAT_ASR_1606) || defined(PLAT_ECR6600)
+#if defined (PLAT_Qualcomm) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)  || defined(PLAT_ASR_1602) || defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
             //struct ipv4_info ip4_addr = { .addr = addr->sin_addr.s_addr };
             inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
 #else
@@ -1914,6 +2774,43 @@ STATIC mp_obj_t socket_getaddrinfo(size_t n_args, const mp_obj_t *args) {
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_getaddrinfo_obj, 2, 6, socket_getaddrinfo);
 
+#if defined (PLAT_Qualcomm)
+#if MICROPY_QPY_MODULE_QPING
+STATIC mp_obj_t socket_ping(size_t n_args, const mp_obj_t *args) {     
+
+       if (n_args == 0)
+       {
+               return mp_obj_new_int(1);
+       }
+
+    mp_obj_t *elem;
+    mp_obj_get_array_fixed_n(args[0], 2, &elem);
+    const char * servname = mp_obj_str_get_str(elem[0]);
+    int timeout = 1000;
+    int size = 64;
+
+    int timeout_set = mp_obj_get_int(args[1]);
+    if (timeout_set > 0)
+    {
+        timeout = timeout_set;
+    }
+
+    size = mp_obj_get_int(args[2]);
+
+    QPY_SOCKET_LOG("socket_ping: %s, %d, %d\r\n", servname, timeout, size);
+
+    MP_THREAD_GIL_EXIT();
+    int ret = lwip_ping(servname, timeout, size);
+    MP_THREAD_GIL_ENTER();
+
+    QPY_SOCKET_LOG("socket_ping: ret: %d\r\n", ret);
+
+    return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_ping_obj, 0, 3, socket_ping);
+#endif
+#endif
+
 STATIC mp_obj_t socket_initialize() {
     static int initialized = 0;
     if (!initialized) {
@@ -1930,6 +2827,11 @@ STATIC const mp_rom_map_elem_t mp_module_socket_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&socket_initialize_obj) },
     { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socket_type) },
     { MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&socket_getaddrinfo_obj) },
+#if defined (PLAT_Qualcomm)
+#if MICROPY_QPY_MODULE_QPING
+    { MP_ROM_QSTR(MP_QSTR_ping), MP_ROM_PTR(&socket_ping_obj) },
+#endif
+#endif
     { MP_ROM_QSTR(MP_QSTR_inet_pton), MP_ROM_PTR(&mod_socket_inet_pton_obj) },
     { MP_ROM_QSTR(MP_QSTR_inet_ntop), MP_ROM_PTR(&mod_socket_inet_ntop_obj) },
     { MP_ROM_QSTR(MP_QSTR_AF_INET), MP_ROM_INT(AF_INET) },
@@ -1944,7 +2846,16 @@ STATIC const mp_rom_map_elem_t mp_module_socket_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_IPPROTO_IP), MP_ROM_INT(IPPROTO_IP) },
     { MP_ROM_QSTR(MP_QSTR_SOL_SOCKET), MP_ROM_INT(SOL_SOCKET) },
     { MP_ROM_QSTR(MP_QSTR_SO_REUSEADDR), MP_ROM_INT(SO_REUSEADDR) },
+    { MP_ROM_QSTR(MP_QSTR_SO_ACCEPTCONN), MP_ROM_INT(SO_ACCEPTCONN) },
     { MP_ROM_QSTR(MP_QSTR_TCP_KEEPALIVE), MP_ROM_INT(TCP_KEEPALIVE) },
+#if defined (PLAT_Qualcomm)
+    { MP_ROM_QSTR(MP_QSTR_TCP_MAXSEG), MP_ROM_INT(TCP_MAXSEG) },
+#endif
+#if defined (PLAT_Unisoc)
+    { MP_ROM_QSTR(MP_QSTR_SO_KEEPALIVE), MP_ROM_INT(SO_KEEPALIVE) },
+    { MP_ROM_QSTR(MP_QSTR_TCP_KEEPIDLE), MP_ROM_INT(TCP_KEEPIDLE) },
+    { MP_ROM_QSTR(MP_QSTR_TCP_KEEPINTVL), MP_ROM_INT(10) },
+#endif
     { MP_ROM_QSTR(MP_QSTR_IP_ADD_MEMBERSHIP), MP_ROM_INT(IP_ADD_MEMBERSHIP) },
 };
 
index 76cedef..4c595bd 100644 (file)
@@ -41,6 +41,8 @@
 extern const mp_obj_type_t tp_xp2046_type;
 extern const mp_obj_type_t tp_GT9xx_type;
 extern const mp_obj_type_t tp_CST816_type;
+extern const mp_obj_type_t tp_FT6X36_type;
+extern const mp_obj_type_t tp_ST1615_type;
 
 
 
@@ -54,6 +56,12 @@ STATIC const mp_rom_map_elem_t tp_module_globals_table[] = {
 #endif
 #if MICROPY_QPY_TP_CST816
        { MP_ROM_QSTR(MP_QSTR_cst816), MP_ROM_PTR(&tp_CST816_type) },
+#endif
+#if MICROPY_QPY_TP_FT6X36
+       { MP_ROM_QSTR(MP_QSTR_ft6x36), MP_ROM_PTR(&tp_FT6X36_type) },
+#endif
+#if MICROPY_QPY_TP_ST1615
+       { MP_ROM_QSTR(MP_QSTR_st1615), MP_ROM_PTR(&tp_ST1615_type) },
 #endif
        //TODO add other deriver
 };
index e24ec41..b9ee6d6 100644 (file)
@@ -29,7 +29,7 @@
 #include "helios_dev.h"
 #include "extmod/vfs_efs.h"
 #include "extmod/vfs_temp.h"
-#include "extmod/vfs_fat_emmc.h"
+#include "extmod/vfs_fat_sdio.h"
 
 #if MICROPY_QPY_MODULE_UOS
 
@@ -118,15 +118,32 @@ STATIC mp_obj_t os_uname(void) {
 
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(os_uname_obj, os_uname);
 
+#include "quectel_version.h"
+STATIC mp_obj_t os_sdkver(void) {
+#if defined(PLAT_Qualcomm)
+    return mp_obj_new_str(mob_sw_rev, strlen(mob_sw_rev));
+#else
+    extern mp_obj_t queclib_dev_fw_version();
+    return queclib_dev_fw_version();
+#endif    
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(os_sdkver_obj, os_sdkver);
+
+
 #include "random.h"
 STATIC mp_obj_t os_urandom(mp_obj_t num) {
     mp_int_t n = mp_obj_get_int(num);
     vstr_t vstr;
     vstr_init_len(&vstr, n);
     uint32_t r = 0;
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40) 
+       int rev_time = mp_hal_ticks_us();
+    srand(rev_time);
+#endif
     for (int i = 0; i < n; i++) {
         if ((i & 3) == 0) {
-            r = rand(); // returns 32-bit hardware random number
+                       r = rand(); // returns 32-bit hardware random number
         }
         vstr.buf[i] = r;
         r >>= 8;
@@ -181,6 +198,7 @@ STATIC const mp_rom_map_elem_t os_module_globals_table[] = {
        { MP_ROM_QSTR(MP_QSTR_uname), MP_ROM_PTR(&os_uname_obj) },
        { MP_ROM_QSTR(MP_QSTR_uname2), MP_ROM_PTR(&os_uname2_obj) },
     { MP_ROM_QSTR(MP_QSTR_urandom), MP_ROM_PTR(&os_urandom_obj) },
+    { MP_ROM_QSTR(MP_QSTR_sdkver), MP_ROM_PTR(&os_sdkver_obj) },
     #if MICROPY_PY_OS_DUPTERM
     { MP_ROM_QSTR(MP_QSTR_dupterm), MP_ROM_PTR(&mp_uos_dupterm_obj) },
     { MP_ROM_QSTR(MP_QSTR_dupterm_notify), MP_ROM_PTR(&os_dupterm_notify_obj) },
@@ -210,12 +228,15 @@ STATIC const mp_rom_map_elem_t os_module_globals_table[] = {
        #if defined(PLAT_Qualcomm)
        { MP_ROM_QSTR(MP_QSTR_VfsEfs), MP_ROM_PTR(&mp_type_vfs_efs) },
        #endif
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
        { MP_ROM_QSTR(MP_QSTR_VfsTemp), MP_ROM_PTR(&mp_type_vfs_temp) },
+#endif
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || (defined(PLAT_Unisoc_8850_R02) && !defined(BOARD_EC800GCN_LD_XBND))
     { MP_ROM_QSTR(MP_QSTR_VfsSd), MP_ROM_PTR(&mp_type_vfs_temp) },
 #endif
-#if MICROPY_VFS_FAT_EMMC
-    { MP_ROM_QSTR(MP_QSTR_VfsEmmc), MP_ROM_PTR(&mp_type_vfs_emmc) },
+#if MICROPY_VFS_FAT_SDIO
+    { MP_ROM_QSTR(MP_QSTR_VfsEmmc), MP_ROM_PTR(&mp_type_vfs_sdio_emmc) },
+    { MP_ROM_QSTR(MP_QSTR_VfsSd), MP_ROM_PTR(&mp_type_vfs_sdio_sd) },
 #endif
     #endif
 };
index e861b8c..c0dec74 100644 (file)
@@ -23,7 +23,7 @@
 
 #if MICROPY_QPY_MODULE_UTIME
 
-#if !defined(PLAT_Qualcomm) && !defined(PLAT_EIGEN)  && !defined(PLAT_ECR6600)
+#if !defined(PLAT_Qualcomm) && !defined(PLAT_EIGEN)  && !defined(PLAT_ECR6600) && !defined(PLAT_EIGEN_718) && !defined(PLAT_aic8800m40)
 #include "sockets.h"
 #endif
 #include "helios_debug.h"
@@ -123,6 +123,102 @@ STATIC mp_obj_t time_localtime(size_t n_args, const mp_obj_t *args) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(time_localtime_obj, 0, 1, time_localtime);
 
+
+
+STATIC mp_obj_t time_localtime_ex(size_t n_args, const mp_obj_t *args) {
+    timeutils_struct_time_t tm;
+    int64_t seconds;
+    if (n_args == 0 || args[0] == mp_const_none) {
+        Helios_RTCTime rtc_tm = {0, 0, 0, 1, 1, 1970, 4};
+               Helios_RTC_GetLocalTime(&rtc_tm);
+               seconds = timeutils_seconds_since_2000(rtc_tm.tm_year, rtc_tm.tm_mon, rtc_tm.tm_mday, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
+               timeutils_seconds_since_2000_to_struct_time(seconds, &tm);
+    } 
+       else 
+       {
+           //modified by freddy @20211227 Fix the exception when c=utime.mktime(utime.localtime()) utime.localtime(c) is executed when no network is injected
+
+               //946684800 seconds is 2000/01/01 00:00:00
+        seconds = mp_obj_get_int_truncated(args[0]) - 946684800 + Helios_RTC_GetTimeZoneOffset()  * 3600 ; // Pawn - 2021-03-17 -Fixed bug:Return time error
+
+               // Pawn - 2020-12-10 -Fixed bug:Return time error
+               timeutils_seconds_since_2000_to_struct_time(seconds, &tm);
+               /*[Jayceon][2021/03/04]解决localtime()方法转换秒数为日期时,出现hour超过24的情��? --[begin]--*/
+               if (tm.tm_hour >= 24)
+               {
+                       tm.tm_mday += 1;
+                       tm.tm_hour = tm.tm_hour % 24;
+
+                       switch (tm.tm_mon)
+                       {
+                               case 1:
+                               case 3:
+                               case 5:
+                               case 7:
+                               case 8:
+                               case 10:
+                               case 12:
+                                       if (tm.tm_mday > 31)
+                                       {
+                                               tm.tm_mon += 1;
+                                               tm.tm_mday = tm.tm_mday % 31;
+                                       }
+                                       break;
+                               case 4:
+                               case 6:
+                               case 9:
+                               case 11:
+                                       if (tm.tm_mday > 30)
+                                       {
+                                               tm.tm_mon += 1;
+                                               tm.tm_mday = tm.tm_mday % 30;
+                                       }
+                                       break;
+                               case 2:
+                                       if (((tm.tm_year%4 == 0) && (tm.tm_year%100 != 0)) || (tm.tm_year%400 == 0))
+                                       {
+                                               if (tm.tm_mday > 29)
+                                               {
+                                                       tm.tm_mon += 1;
+                                                       tm.tm_mday = tm.tm_mday % 29;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if (tm.tm_mday > 28)
+                                               {
+                                                       tm.tm_mon += 1;
+                                                       tm.tm_mday = tm.tm_mday % 28;
+                                               }
+                                       }
+                                       break;
+                               default:
+                                       QPY_UTIME_LOG("the value(%d) of month is invalid.\n", tm.tm_mon);
+                                       break;
+                       }
+
+                       if (tm.tm_mon > 12)
+                       {
+                               tm.tm_year += 1;
+                               tm.tm_mon = tm.tm_mon % 12;
+                       }
+               }
+               /*[Jayceon][2021/03/04]解决localtime()方法转换秒数为日期时,出现hour超过24的情��? --[END]--*/
+    }
+    mp_obj_t tuple[8] = {
+        tuple[0] = mp_obj_new_int(tm.tm_year),
+        tuple[1] = mp_obj_new_int(tm.tm_mon),
+        tuple[2] = mp_obj_new_int(tm.tm_mday),
+        tuple[3] = mp_obj_new_int(tm.tm_hour),
+        tuple[4] = mp_obj_new_int(tm.tm_min),
+        tuple[5] = mp_obj_new_int(tm.tm_sec),
+        tuple[6] = mp_obj_new_int(tm.tm_wday),
+        tuple[7] = mp_obj_new_int(tm.tm_yday),
+    };
+    return mp_obj_new_tuple(8, tuple);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(time_localtime_ex_obj, 0, 1, time_localtime_ex);
+
 STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
     size_t len;
     mp_obj_t *elem;
@@ -153,6 +249,38 @@ STATIC mp_obj_t time_mktime(mp_obj_t tuple) {
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_mktime_obj, time_mktime);
 
+STATIC mp_obj_t time_mktime_ex(mp_obj_t tuple) {
+    size_t len;
+    mp_obj_t *elem;
+    mp_obj_get_array(tuple, &len, &elem);
+       Helios_RTCTime rtc_tm;
+       mp_uint_t time_unix;
+    // localtime generates a tuple of len 8. CPython uses 9, so we accept both.
+    if (len < 8 || len > 9) {
+        mp_raise_msg_varg(&mp_type_TypeError, MP_ERROR_TEXT("mktime needs a tuple of length 8 or 9 (%d given)"), len);
+    }
+       rtc_tm.tm_year = mp_obj_get_int(elem[0]);
+       rtc_tm.tm_mon = mp_obj_get_int(elem[1]);
+       rtc_tm.tm_mday = mp_obj_get_int(elem[2]);
+       rtc_tm.tm_hour = mp_obj_get_int(elem[3]);
+       rtc_tm.tm_min = mp_obj_get_int(elem[4]);
+       rtc_tm.tm_sec = mp_obj_get_int(elem[5]);
+
+       if (0 >= (rtc_tm.tm_mon -= 2)) {    /* 1..12 -> 11,12,1..10 */
+        rtc_tm.tm_mon += 12;      /* Puts Feb last since it has leap day */
+        rtc_tm.tm_year -= 1;
+    }
+       time_unix = (((
+               ( mp_uint_t ) (rtc_tm.tm_year/4 - rtc_tm.tm_year/100 + rtc_tm.tm_year/400
+               + 367*rtc_tm.tm_mon/12 + rtc_tm.tm_mday) + rtc_tm.tm_year*365 - 719499)*24
+               + rtc_tm.tm_hour)*60 + rtc_tm.tm_min)*60 + rtc_tm.tm_sec - Helios_RTC_GetTimeZoneOffset() * 3600;       
+
+       return mp_obj_new_int_from_uint(time_unix);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(time_mktime_ex_obj, time_mktime_ex);
+
+
+
 /*return rtc seconds since power on*/
 STATIC mp_obj_t time_time(void) 
 {
@@ -166,7 +294,8 @@ STATIC mp_obj_t time_time(void)
 }
 MP_DEFINE_CONST_FUN_OBJ_0(time_time_obj, time_time);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN)|| defined(PLAT_ASR_1606) \
+|| defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 STATIC mp_obj_t time_set_timezone(mp_obj_t tz)
 {
        int offset = mp_obj_get_int(tz);
@@ -227,7 +356,7 @@ STATIC mp_obj_t time_get_timezone(void)
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(time_get_timezone_obj, time_get_timezone);
 #endif
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 STATIC mp_obj_t helios_nitz_switch_py(size_t n_args,const mp_obj_t *args) 
 {   
     int ret = 0;  
@@ -249,6 +378,8 @@ STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) },
     { MP_ROM_QSTR(MP_QSTR_localtime), MP_ROM_PTR(&time_localtime_obj) },
     { MP_ROM_QSTR(MP_QSTR_mktime), MP_ROM_PTR(&time_mktime_obj) },
+       { MP_ROM_QSTR(MP_QSTR_localtime_ex), MP_ROM_PTR(&time_localtime_ex_obj) },
+       { MP_ROM_QSTR(MP_QSTR_mktime_ex), MP_ROM_PTR(&time_mktime_ex_obj) },
     { MP_ROM_QSTR(MP_QSTR_time), MP_ROM_PTR(&time_time_obj) },
     
     { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) },
@@ -262,11 +393,20 @@ STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj) },
        { MP_ROM_QSTR(MP_QSTR_setTimeZone), MP_ROM_PTR(&time_set_timezone_obj) },
        { MP_ROM_QSTR(MP_QSTR_getTimeZone), MP_ROM_PTR(&time_get_timezone_obj) },
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN)
        { MP_ROM_QSTR(MP_QSTR_nitzSwitch), MP_ROM_PTR(&helios_nitz_switch_py_obj) },
        { MP_ROM_QSTR(MP_QSTR_setTimeZoneEx), MP_ROM_PTR(&time_set_timezone_ex_obj) },
        { MP_ROM_QSTR(MP_QSTR_getTimeZoneEx), MP_ROM_PTR(&time_get_timezone_ex_obj) },
 #endif 
+
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       { MP_ROM_QSTR(MP_QSTR_setTimeZoneEx), MP_ROM_PTR(&time_set_timezone_ex_obj) },
+       { MP_ROM_QSTR(MP_QSTR_getTimeZoneEx), MP_ROM_PTR(&time_get_timezone_ex_obj) },
+#endif
+
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+       { MP_ROM_QSTR(MP_QSTR_nitzSwitch), MP_ROM_PTR(&helios_nitz_switch_py_obj) },
+#endif 
 };
 
 STATIC MP_DEFINE_CONST_DICT(time_module_globals, time_module_globals_table);
index 3808b50..8cdf53b 100644 (file)
@@ -48,9 +48,10 @@ WHEN         WHO                     WHAT,WHERE,WHY
 
 #define QPY_MODVOICECALL_LOG(msg, ...)      custom_log("VOICECALL", msg, ##__VA_ARGS__)
 
-#if !defined(PLAT_ASR_1803s)
+
 #define TIMER_RUNNING 0
 #define TIMER_STOP    1
+#define MAX_DTMF_SIZE 6
 
 static int timer_waittime = 0; //sec
 static int timer_handle = 0;
@@ -275,7 +276,8 @@ static void ql_voice_call_EventHandler(uint8_t sim_id, int32_t event_id, void *c
                     GC_STACKTOP_SET();
                     char phone_num[40] = {0};
                     memcpy(phone_num, vc_info->phone_num, strlen(vc_info->phone_num));
-                    mp_obj_t tuple[9] =
+                               #if MICROPY_QPY_MODULE_DSDS     
+                    mp_obj_t tuple[10] =
                     {
                         mp_obj_new_int(event_id),
                         mp_obj_new_int(vc_info->id),
@@ -285,9 +287,25 @@ static void ql_voice_call_EventHandler(uint8_t sim_id, int32_t event_id, void *c
                         mp_obj_new_int(vc_info->mpty),
                         mp_obj_new_str(vc_info->phone_num, strlen(vc_info->phone_num)),
                         mp_obj_new_int(vc_info->num_type),
-                        mp_obj_new_int(vc_info->release_direction),
+                                               mp_obj_new_int(vc_info->release_direction),
+                                               mp_obj_new_int(sim_id)
+                    };
+                               mp_sched_schedule_ex(g_voice_call_callback, mp_obj_new_tuple(10, tuple));
+                               #else
+                                       mp_obj_t tuple[9] =
+                    {
+                        mp_obj_new_int(event_id),
+                        mp_obj_new_int(vc_info->id),
+                        mp_obj_new_int(vc_info->dir),
+                        mp_obj_new_int(vc_info->status),
+                        mp_obj_new_int(vc_info->type),
+                        mp_obj_new_int(vc_info->mpty),
+                        mp_obj_new_str(vc_info->phone_num, strlen(vc_info->phone_num)),
+                        mp_obj_new_int(vc_info->num_type),
+                                               mp_obj_new_int(vc_info->release_direction)
                     };
                                mp_sched_schedule_ex(g_voice_call_callback, mp_obj_new_tuple(9, tuple));
+                               #endif
                                GC_STACKTOP_CLEAR();
                     MP_THREAD_GIL_EXIT();
                        }
@@ -301,25 +319,58 @@ static void ql_voice_call_EventHandler(uint8_t sim_id, int32_t event_id, void *c
 }
 
 //auto answer
-STATIC mp_obj_t qpy_voicecall_auto_answer(mp_obj_t mp_obj_seconds)
-{
-       int seconds = mp_obj_get_int(mp_obj_seconds);
 
-    if (seconds < 0 || seconds > 255)
+
+//STATIC mp_obj_t qpy_voicecall_auto_answer(mp_obj_t mp_obj_seconds)
+STATIC mp_obj_t qpy_voicecall_auto_answer(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+       int seconds = mp_obj_get_int(args[0]);
+       
+       if (seconds < 0 || seconds > 255)
     {
         mp_raise_ValueError("invalid value, seconds should be in [0-255].");
     }
+       
+       if (n_args == 2)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[1]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
     
-       int ret = Helios_VoiceCall_Auto_Answer(0, seconds);
-
+    MP_THREAD_GIL_EXIT();
+       int ret = Helios_VoiceCall_Auto_Answer(sim_id, seconds);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voice_auto_answer_obj, qpy_voicecall_auto_answer);
+//STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voice_auto_answer_obj, qpy_voicecall_auto_answer);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_auto_answer_obj, 1, 2, qpy_voicecall_auto_answer);
+
 
 //start call
-STATIC mp_obj_t qpy_voicecall_start(mp_obj_t mp_obj_phone_num)
+//STATIC mp_obj_t qpy_voicecall_start(mp_obj_t phone_num)
+STATIC mp_obj_t qpy_voicecall_start(size_t n_args, const mp_obj_t *args)
 {
-       char *phonenum = (char *)mp_obj_str_get_str(mp_obj_phone_num);
+       uint8_t sim_id = 0;
+       mp_buffer_info_t phonenum = {0};
+       mp_get_buffer_raise(args[0], &phonenum, MP_BUFFER_READ);
+
+       if (phonenum.len <= 0)
+       {
+               return mp_obj_new_int(-1);
+       }
+
+       if (n_args == 2)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[1]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
 
     if (is_reg_voicecall_callback_flag == 0) {
         Helios_VoiceCallInitStruct info = {0};
@@ -327,8 +378,9 @@ STATIC mp_obj_t qpy_voicecall_start(mp_obj_t mp_obj_phone_num)
         Helios_VoiceCall_Register(&info);
         is_reg_voicecall_callback_flag = 1;
     }
-    
-       int ret = Helios_VoiceCall_start(0, phonenum);
+    MP_THREAD_GIL_EXIT();
+       int ret = Helios_VoiceCall_start(sim_id, phonenum.buf);
+    MP_THREAD_GIL_ENTER();
     if (ret == 0) {
         if (timer_handle != 0) {
             QPY_MODVOICECALL_LOG("start timer[%d]!\n", timer_waittime);
@@ -342,57 +394,117 @@ STATIC mp_obj_t qpy_voicecall_start(mp_obj_t mp_obj_phone_num)
 
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voice_call_start_obj, qpy_voicecall_start);
+//STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voice_call_start_obj, qpy_voicecall_start);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_start_obj, 1, 2, qpy_voicecall_start);
+
 
 //answer call
-STATIC mp_obj_t qpy_voicecall_answer(void)
+//STATIC mp_obj_t qpy_voicecall_answer(void)
+STATIC mp_obj_t qpy_voicecall_answer(size_t n_args, const mp_obj_t *args)
 {
-       int ret = Helios_VoiceCall_Answer(0);
-
+       uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
+    MP_THREAD_GIL_EXIT();
+       int ret = Helios_VoiceCall_Answer(sim_id);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voice_call_answer_obj, qpy_voicecall_answer);
+//STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voice_call_answer_obj, qpy_voicecall_answer);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_answer_obj, 0, 1, qpy_voicecall_answer);
+
 
 //end call
-STATIC mp_obj_t qpy_voicecall_end(void)
+//STATIC mp_obj_t qpy_voicecall_end(void)
+STATIC mp_obj_t qpy_voicecall_end(size_t n_args, const mp_obj_t *args)
 {
+       uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
     MP_THREAD_GIL_EXIT();
-       int ret = Helios_VoiceCall_End(0);
+       int ret = Helios_VoiceCall_End(sim_id);
     MP_THREAD_GIL_ENTER();
-
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voice_call_end_obj, qpy_voicecall_end);
+//STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voice_call_end_obj, qpy_voicecall_end);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_end_obj, 0, 1, qpy_voicecall_end);
+
 
-STATIC mp_obj_t qpy_voicecall_start_dtmf(mp_obj_t mp_obj_dtmf, mp_obj_t mp_obj_duration)
+STATIC mp_obj_t qpy_voicecall_start_dtmf(size_t n_args, const mp_obj_t *args)
 {
-    int ret = 0;
-    char *dtmf = (char *)mp_obj_str_get_str(mp_obj_dtmf);
-    int duration = mp_obj_get_int(mp_obj_duration);
+    uint8_t sim_id = 0;
+    char *dtmf = (char *)mp_obj_str_get_str(args[0]);
+    int duration = mp_obj_get_int(args[1]);
 
     if (duration > 1000 || duration < 100)
     {
         mp_raise_ValueError("invalid value.duration shuould be in [100,1000]");
     }
-    
-    ret = Helios_VoiceCall_Start_Dtmf(0, dtmf, duration);
-    
+       if (n_args == 3)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[2]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       if (strlen(dtmf) > MAX_DTMF_SIZE)
+    {
+        mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("invalid value, the length of dtmf should be no more than [%d] bytes."), MAX_DTMF_SIZE);
+    }
+    MP_THREAD_GIL_EXIT();
+    int ret = Helios_VoiceCall_Start_Dtmf(sim_id, dtmf, duration);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_2(qpy_voice_call_start_dtmf_obj, qpy_voicecall_start_dtmf);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_start_dtmf_obj, 2, 3, qpy_voicecall_start_dtmf);
 
 //fw set
-STATIC mp_obj_t qpy_voicecall_fw_set(mp_obj_t mp_obj_reason, mp_obj_t mp_obj_fwmode, mp_obj_t mp_obj_phone_num)
+STATIC mp_obj_t qpy_voicecall_fw_set(size_t n_args, const mp_obj_t *args)
 {
-    int reason = mp_obj_get_int(mp_obj_reason);
-    int fwmode = mp_obj_get_int(mp_obj_fwmode);
-       char *phonenum = (char *)mp_obj_str_get_str(mp_obj_phone_num);
+       uint8_t sim_id = 0;
+    char *phonenum = NULL;
+    int reason = mp_obj_get_int(args[0]);
+    int fwmode = mp_obj_get_int(args[1]);
+    char return_str[128] ={0};
+    if (fwmode ==2){
+        phonenum = return_str;
+    }else {
+           phonenum = (char *)mp_obj_str_get_str(args[2]);
+    }
+       if (n_args == 4)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[3]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
        
-       int ret = Helios_VoiceCall_Set_Fw(0, reason, fwmode, phonenum);
-
+       MP_THREAD_GIL_EXIT();
+       int ret = Helios_VoiceCall_Set_Fw(sim_id, reason, fwmode, phonenum);
+    MP_THREAD_GIL_ENTER();
+    if (ret ==0 && fwmode ==2) {
+        return mp_obj_new_str(return_str, strlen(return_str));
+    }
        return mp_obj_new_int(ret);
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_voice_call_fw_set_obj, qpy_voicecall_fw_set);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_fw_set_obj, 3, 4, qpy_voicecall_fw_set);
+
 
 #if defined(PLAT_ASR) && defined(CONFIG_VIOCE_CALL)
 static c_callback_t *vc_dtmf_cb = NULL;
@@ -411,9 +523,9 @@ STATIC mp_obj_t qpy_voicecall_dtmf_detect_enable(mp_obj_t enable)
     int dtmfDet_enable = mp_obj_get_int(enable);
     if (dtmfDet_enable != 0 && dtmfDet_enable != 1)
         return mp_obj_new_int(-1);
-
+    MP_THREAD_GIL_EXIT();
     int ret = Helios_VoiceCall_Tone_Detect(dtmfDet_enable);
-
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_dtmf_detect_enable_obj, qpy_voicecall_dtmf_detect_enable);
@@ -431,6 +543,8 @@ STATIC mp_obj_t qpy_voicecall_dtmf_detect_set_cb(mp_obj_t handler)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_dtmf_detect_set_cb_obj, qpy_voicecall_dtmf_detect_set_cb);
 #endif
+
+#if MICROPY_QPY_MODULE_AUDIO
 STATIC mp_obj_t qpy_voicecall_set_channel(mp_obj_t device)
 {
        int channel = mp_obj_get_int(device);
@@ -444,8 +558,9 @@ STATIC mp_obj_t qpy_voicecall_set_channel(mp_obj_t device)
        {
                mp_raise_msg_varg(&mp_type_ValueError, "The current platform does not support device %d.", channel);
        }
-
+    MP_THREAD_GIL_EXIT();
        int ret = Helios_Audio_SetAudioChannle(channel);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_set_channel_obj, qpy_voicecall_set_channel);
@@ -461,7 +576,9 @@ STATIC mp_obj_t qpy_voicecall_set_volume(mp_obj_t volume)
        }
        
        Helios_AudPlayerType type = 2;
+    MP_THREAD_GIL_EXIT();
        int ret = Helios_Audio_SetVolume(type, vol);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_set_volume_obj, qpy_voicecall_set_volume);
@@ -470,39 +587,87 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_set_volume_obj, qpy_voicecall_set
 STATIC mp_obj_t qpy_voicecall_get_volume(void)
 {
        Helios_AudPlayerType type = 2;
+    MP_THREAD_GIL_EXIT();
        int vol = Helios_Audio_GetVolume(type);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(vol);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voicecall_get_volume_obj, qpy_voicecall_get_volume);
-
+#endif
 
 // #if defined(PLAT_ASR) || defined(PLAT_Unisoc)
+#if    defined(PLAT_Unisoc_8850_R02)
+#define MAX_FILENAME_LENTGH 64
+#else
 #define MAX_FILENAME_LENTGH 32
+#endif
 
 STATIC mp_obj_t qpy_voice_call_set_auto_record(size_t n_args, const mp_obj_t *args)
 {
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     int enable = mp_obj_get_int(args[0]);
     int record_type = mp_obj_get_int(args[1]);
     int record_mode = mp_obj_get_int(args[2]);
        char *filename = (char *)mp_obj_str_get_str(args[3]);
+       char fpath[MAX_FILENAME_LENTGH] = {0};
 
     if ((enable != 0) && (enable != 1))
         mp_raise_ValueError("invalid value.<enable> should be [0 or 1]");
     if (record_type < 0 || record_type > 1)
         mp_raise_ValueError("invalid value.<record_type> should be [0 or 1]");
-    if (record_mode < 0 || record_mode > 2)
-        mp_raise_ValueError("invalid value.<record_mode> should be [0 ~ 2]");
+    if (record_mode < 0 || record_mode > 3)
+        mp_raise_ValueError("invalid value.<record_mode> should be [0 ~ 3]");
     if (filename == NULL)
         mp_raise_ValueError("invalid value.<filename> must not be NULL");
     if (strlen(filename) >= MAX_FILENAME_LENTGH)
-        mp_raise_ValueError("invalid value.<filename length> should be less than 32");
+    {
+               mp_raise_msg_varg(&mp_type_ValueError, "invalid value.<filename length> should be less than %d.", MAX_FILENAME_LENTGH);
+    }
+
+       if (strncasecmp(filename, "U:/", 3) != 0)
+       {
+               if (strncasecmp(filename, "/usr/", 5) == 0)
+               {
+                       sprintf(fpath, "U:/%s", (filename + 5));
+               }
+               else if (strncasecmp(filename, "usr/", 4) == 0)
+               {
+                       sprintf(fpath, "U:/%s", (filename + 4));
+               }
+               else if (strncasecmp(filename, "SD:/", 4) == 0)
+               {
+                       strncpy(fpath, filename, strlen(filename));
+               }
+               else if (strncasecmp(filename, "SD1:/", 5) == 0)
+               {
+                       strncpy(fpath, filename, strlen(filename));
+               }
+        else if (strncasecmp(filename, "/ext/", 5) == 0)
+               {
+                       sprintf(fpath, "E:/%s", (filename + 5));
+               }
+               else if (strncasecmp(filename, "ext/", 4) == 0)
+               {
+                       sprintf(fpath, "E:/%s", (filename + 4));
+               }
+               else
+               {
+                       mp_raise_ValueError("Invalid path, case - insensitive is supported \"U:/\",\"SD:/\",\"SD1:/\",\"/ext/\",\"ext/\",\"/usr/\" and \"usr/\"");
+               }
+       }
+       else
+       {
+               strncpy(fpath, filename, strlen(filename));
+       }
+       //QPY_MODVOICECALL_LOG("fpath:%s\r\n", fpath);
     
     Helios_Voicecall_Record_Process_t param = {0};
     param.record_type = record_type;
     param.record_mode = record_mode;
-    strncpy(param.filename, filename, strlen(filename));
+    strncpy(param.filename, fpath, strlen(fpath));
+    MP_THREAD_GIL_EXIT();
        HELIOS_VC_ERROR_CODE ret = Helios_Voicecall_Set_Auto_Record(enable, &param);
+    MP_THREAD_GIL_ENTER();
        if (ret == HELIOS_VC_SUCCESS)
         return mp_obj_new_int(0);
     else if (ret == HELIOS_VC_FAILURE)
@@ -519,26 +684,67 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_set_auto_record_obj, 4
 
 STATIC mp_obj_t qpy_voice_call_start_record(mp_obj_t mp_obj_recordtype, mp_obj_t mp_obj_recordmode, mp_obj_t mp_obj_filename)
 {
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     int record_type = mp_obj_get_int(mp_obj_recordtype);
     int record_mode = mp_obj_get_int(mp_obj_recordmode);
        char *filename = (char *)mp_obj_str_get_str(mp_obj_filename);
+       char fpath[MAX_FILENAME_LENTGH] = {0};
 
     if (record_type < 0 || record_type > 1)
         mp_raise_ValueError("invalid value.<record_type> should be [0 or 1]");
-    if (record_mode < 0 || record_mode > 2)
-        mp_raise_ValueError("invalid value.<record_mode> should be [0 ~ 2]");
+    if (record_mode < 0 || record_mode > 3) //only ASR R06 support mode 3
+        mp_raise_ValueError("invalid value.<record_mode> should be [0 ~ 3]");
     if (filename == NULL)
         mp_raise_ValueError("invalid value.<filename> must not be NULL");
     if (strlen(filename) >= MAX_FILENAME_LENTGH)
-        mp_raise_ValueError("invalid value.<filename length> should be less than 32");
-    
+    {
+        mp_raise_msg_varg(&mp_type_ValueError, "invalid value.<filename length> should be less than %d.", MAX_FILENAME_LENTGH);
+    }
+
+       if (strncmp(filename, "U:/", 3) != 0)
+       {
+               if (strncmp(filename, "/usr/", 5) == 0)
+               {
+                       sprintf(fpath, "U:/%s", (filename + 5));
+               }
+               else if (strncmp(filename, "usr/", 4) == 0)
+               {
+                       sprintf(fpath, "U:/%s", (filename + 4));
+               }
+               else if (strncmp(filename, "SD:/", 4) == 0)
+               {
+                       strncpy(fpath, filename, strlen(filename));
+               }
+               else if (strncmp(filename, "SD1:/", 5) == 0)
+               {
+                       strncpy(fpath, filename, strlen(filename));
+               }
+        else if (strncmp(filename, "/ext/", 5) == 0)
+               {
+                       sprintf(fpath, "E:/%s", (filename + 5));
+               }
+               else if (strncmp(filename, "ext/", 4) == 0)
+               {
+                       sprintf(fpath, "E:/%s", (filename + 4));
+               }
+               else
+               {
+                       mp_raise_ValueError("invalid path, only support \"U:/\",\"/usr/\" and \"usr/\"");
+               }
+       }
+       else
+       {
+               strncpy(fpath, filename, strlen(filename));
+       }
+       
     Helios_Voicecall_Record_Process_t param = {0};
     param.record_type = record_type;
     param.record_mode = record_mode;
-    strncpy(param.filename, filename, strlen(filename));
-    
+    strncpy(param.filename, fpath, strlen(fpath));
+    MP_THREAD_GIL_EXIT();
        HELIOS_VC_ERROR_CODE ret = Helios_VoiceCall_Start_Record(&param);
+       
+    MP_THREAD_GIL_ENTER();
     if (ret == HELIOS_VC_SUCCESS)
         return mp_obj_new_int(0);
     else if (ret == HELIOS_VC_FAILURE)
@@ -553,10 +759,39 @@ STATIC mp_obj_t qpy_voice_call_start_record(mp_obj_t mp_obj_recordtype, mp_obj_t
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_voice_call_start_record_obj, qpy_voice_call_start_record);
 
+#if defined(PLAT_ASR_1606) //|| defined(PLAT_ASR_1609)
+STATIC mp_obj_t qpy_voice_record_config(mp_uint_t n_args, const mp_obj_t *args)
+{
+       int ret = 0;
+       unsigned char set_value;
+       if(n_args == 0)
+       {
+        MP_THREAD_GIL_EXIT();
+               ret = Helios_VoiceCall_Get_Record_Check_Flag();
+        MP_THREAD_GIL_ENTER();
+               return mp_obj_new_int(ret);
+       }
+       else if(n_args == 1)
+       {
+               set_value = (unsigned char)mp_obj_get_int(args[0]);
+        MP_THREAD_GIL_EXIT();
+               ret = Helios_VoiceCall_Set_Record_Check_Flag(set_value);
+        MP_THREAD_GIL_ENTER();
+               if(ret == 0){
+                       return mp_obj_new_int(0);
+               }
+       }
+       return mp_obj_new_int(-1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_record_config_obj, 0, 1, (mp_obj_t)qpy_voice_record_config);
+#endif
+
 STATIC mp_obj_t qpy_voice_call_stop_record()
 {  
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
+    MP_THREAD_GIL_EXIT();
        HELIOS_VC_ERROR_CODE ret = Helios_VoiceCall_Stop_Record();
+    MP_THREAD_GIL_ENTER();
        if (ret == HELIOS_VC_SUCCESS)
         return mp_obj_new_int(0);
     else if (ret == HELIOS_VC_FAILURE)
@@ -574,7 +809,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_voice_call_stop_record_obj, qpy_voice_call_
 
 static c_callback_t *g_record_callback = NULL;
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
 helios_ring_buf_t *VC_stream_ring_buf = NULL;
 #define RECORD_BUFFER_MAX   (uint)8*1024
 
@@ -650,7 +885,7 @@ static int helios_stream_record_cb(char *p_data, int len, HELIOS_VC_AUD_REC_STAT
 
 STATIC mp_obj_t qpy_voice_call_start_record_stream(mp_obj_t mp_obj_recordtype, mp_obj_t mp_obj_recordmode, mp_obj_t mp_obj_cb)
 {
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
     int record_type = mp_obj_get_int(mp_obj_recordtype);
     int record_mode = mp_obj_get_int(mp_obj_recordmode);
 
@@ -674,8 +909,9 @@ STATIC mp_obj_t qpy_voice_call_start_record_stream(mp_obj_t mp_obj_recordtype, m
            helios_rb_destroy(&VC_stream_ring_buf);
         VC_stream_ring_buf = helios_rb_create(RECORD_BUFFER_MAX);
     }
-    
+    MP_THREAD_GIL_EXIT();
        HELIOS_VC_ERROR_CODE ret = Helios_VoiceCall_Start_Record_Stream(&param, (helios_vc_cb_on_record)helios_stream_record_cb);
+    MP_THREAD_GIL_ENTER();
     if (ret == HELIOS_VC_SUCCESS)
         return mp_obj_new_int(0);
     else if (ret == HELIOS_VC_FAILURE)
@@ -692,7 +928,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(qpy_voice_call_start_record_stream_obj, qpy_voi
 
 STATIC mp_obj_t qpy_voice_call_record_stream_read(mp_obj_t read_buf, mp_obj_t len)
 {
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609)
        int read_actual_len = 0;
        //audio_record_obj_t *self = MP_OBJ_TO_PTR(self_in);
 
@@ -730,7 +966,7 @@ STATIC mp_obj_t qpy_voicecall_add_event_handler(mp_obj_t handler)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voicecall_add_event_handler_obj, qpy_voicecall_add_event_handler);
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #if defined(CONFIG_VIOCE_CALL)
 STATIC mp_obj_t qpy_module_voicecall_setRingType(mp_obj_t type)
 {
@@ -845,7 +1081,9 @@ STATIC mp_obj_t qpy_module_voicecall_set_waittime(mp_obj_t seconds)
             }
         }
         timer_waittime = wait_seconds;
-    } else {
+    }
+       else 
+       {
         if (timer_handle != 0)
        {
             if (timer_state == TIMER_RUNNING)
@@ -881,7 +1119,8 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_voicecall_set_waittime_obj, qpy_modu
 
 STATIC mp_obj_t qpy_module_voicecall_deinit(void)
 {
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+    MP_THREAD_GIL_EXIT();
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
     Helios_VoiceCall_Stop_Record();
 #endif
     Helios_VoiceCall_End(0);
@@ -893,29 +1132,35 @@ STATIC mp_obj_t qpy_module_voicecall_deinit(void)
        Helios_VoiceCallInitStruct info = {0};
        info.user_cb = NULL;
        Helios_VoiceCall_Register(&info);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_voicecall_deinit_obj, qpy_module_voicecall_deinit);
-#endif
 
-#if defined(PLAT_ASR_1803s)
+
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || MICROPY_QPY_MODULE_AUTOCANCEL
 STATIC mp_obj_t qpy_module_voicecall_setAutocancel(mp_obj_t enable)
 {
     int autocancel_flag = mp_obj_get_int(enable);
+    MP_THREAD_GIL_EXIT();
     Helios_VoiceCall_Set_Autocancel_Flag(autocancel_flag);
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_voicecall_setAutocancel_obj, qpy_module_voicecall_setAutocancel);
 
 STATIC mp_obj_t qpy_module_voicecall_getAutocancel(void)
 {
+    MP_THREAD_GIL_EXIT();
     int autocancel_flag = Helios_VoiceCall_Get_Autocancel_Flag();
+    MP_THREAD_GIL_ENTER();
        return mp_obj_new_int(autocancel_flag);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_voicecall_getAutocancel_obj, qpy_module_voicecall_getAutocancel);
 #endif
 
-#if defined(PLAT_ASR_1606)
+
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 STATIC mp_obj_t qpy_module_voicecall_mute(size_t n_args, const mp_obj_t *args)
 {
        int dir = mp_obj_get_int(args[0]);
@@ -943,12 +1188,84 @@ STATIC mp_obj_t qpy_module_voicecall_mute(size_t n_args, const mp_obj_t *args)
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_module_voicecall_mute_obj, 2, 3, qpy_module_voicecall_mute);
 #endif
 
+#if defined(MICROPY_QPY_MODULE_CALL_WAIT)
+STATIC mp_obj_t qpy_voice_call_set_call_wait(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+    int enable_opt = mp_obj_get_int(args[0]);
+       if ((enable_opt != 0) && (enable_opt != 1))
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, enable should be in [0,1]."));
+       }
+
+       if (n_args == 2)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[1]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
+    MP_THREAD_GIL_EXIT();
+    int ret = Helios_VoiceCall_Set_CallWait(sim_id, enable_opt);
+    MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(ret);
+}
+STATIC  MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_set_call_wait_obj, 1, 2, qpy_voice_call_set_call_wait);
+
+#if defined(MICROPY_QPY_MODULE_GET_CALL_WAIT)
+STATIC mp_obj_t qpy_voice_call_get_call_wait(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+       if (n_args == 1)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[0]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
+    MP_THREAD_GIL_EXIT();
+    int mode = Helios_VoiceCall_Get_CallWait(sim_id);
+    MP_THREAD_GIL_ENTER();
+    return mp_obj_new_int(mode);
 
+}
+STATIC  MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_get_call_wait_obj, 0, 1, qpy_voice_call_get_call_wait);
+#endif
+
+STATIC mp_obj_t qpy_voice_call_call_hold(size_t n_args, const mp_obj_t *args)
+{
+       uint8_t sim_id = 0;
+    int call_man_op = mp_obj_get_int(args[0]);
+       if ((call_man_op < 0) && (call_man_op > 3))
+       {
+               mp_raise_ValueError(MP_ERROR_TEXT("invalid value, callManOp should be in [0,3]."));
+       }
+
+       if (n_args == 2)
+       {
+               sim_id = (uint8_t)mp_obj_get_int(args[1]);
+               if ((sim_id != 0) && (sim_id != 1))
+               {
+                       mp_raise_ValueError("invalid value, simId should be 0 or 1.");
+               }
+       }
+       
+    MP_THREAD_GIL_EXIT();
+    int ret = Helios_VoiceCall_CallHold(sim_id, call_man_op);
+    MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(ret);
+}
+//STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_voice_call_call_hold_obj, qpy_voice_call_call_hold);
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(qpy_voice_call_call_hold_obj, 1, 2, qpy_voice_call_call_hold);
+
+#endif
 
 STATIC const mp_rom_map_elem_t mp_module_voicecall_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__),                MP_ROM_QSTR(MP_QSTR_voiceCall) },
-    
-#if !defined(PLAT_ASR_1803s)
     { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_voicecall_deinit_obj) },
        { MP_ROM_QSTR(MP_QSTR_setAutoAnswer),           MP_ROM_PTR(&qpy_voice_auto_answer_obj) },
     { MP_ROM_QSTR(MP_QSTR_callStart),               MP_ROM_PTR(&qpy_voice_call_start_obj) },
@@ -957,35 +1274,45 @@ STATIC const mp_rom_map_elem_t mp_module_voicecall_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR_startDtmf),               MP_ROM_PTR(&qpy_voice_call_start_dtmf_obj) },
     { MP_ROM_QSTR(MP_QSTR_setFw),                   MP_ROM_PTR(&qpy_voice_call_fw_set_obj) },
        { MP_ROM_QSTR(MP_QSTR_setCallback),             MP_ROM_PTR(&qpy_voicecall_add_event_handler_obj) },
+#if MICROPY_QPY_MODULE_AUDIO
        { MP_ROM_QSTR(MP_QSTR_setChannel),              MP_ROM_PTR(&qpy_voicecall_set_channel_obj) },
        { MP_ROM_QSTR(MP_QSTR_setVolume),                               MP_ROM_PTR(&qpy_voicecall_set_volume_obj) },
     { MP_ROM_QSTR(MP_QSTR_getVolume),                          MP_ROM_PTR(&qpy_voicecall_get_volume_obj) },
-// #if defined(PLAT_ASR) || defined(PLAT_Unisoc)
+#endif
+//#if MICROPY_QPY_AUDIO_RECORD
        { MP_ROM_QSTR(MP_QSTR_setAutoRecord),           MP_ROM_PTR(&qpy_voice_call_set_auto_record_obj) },
        { MP_ROM_QSTR(MP_QSTR_startRecord),             MP_ROM_PTR(&qpy_voice_call_start_record_obj) },
        { MP_ROM_QSTR(MP_QSTR_stopRecord),              MP_ROM_PTR(&qpy_voice_call_stop_record_obj) },
-// #endif
-// #if defined(PLAT_ASR)// || defined(PLAT_Unisoc)
        { MP_ROM_QSTR(MP_QSTR_startRecordStream),       MP_ROM_PTR(&qpy_voice_call_start_record_stream_obj) },
        { MP_ROM_QSTR(MP_QSTR_readRecordStream),       MP_ROM_PTR(&qpy_voice_call_record_stream_read_obj) },
-// #endif
+//#endif
 #if defined(PLAT_ASR) && defined(CONFIG_VIOCE_CALL)
     { MP_ROM_QSTR(MP_QSTR_dtmfDetEnable),          MP_ROM_PTR(&qpy_voicecall_dtmf_detect_enable_obj) },
     { MP_ROM_QSTR(MP_QSTR_dtmfSetCb),              MP_ROM_PTR(&qpy_voicecall_dtmf_detect_set_cb_obj) },
 #endif
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #if defined(CONFIG_VIOCE_CALL)
     { MP_ROM_QSTR(MP_QSTR_setRingType),          MP_ROM_PTR(&qpy_module_voicecall_setRingType_obj) },
 #endif
 #endif
     { MP_ROM_QSTR(MP_QSTR_setWaittime),          MP_ROM_PTR(&qpy_module_voicecall_set_waittime_obj) },
+
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || MICROPY_QPY_MODULE_AUTOCANCEL
+    { MP_ROM_QSTR(MP_QSTR_setAutoCancel),          MP_ROM_PTR(&qpy_module_voicecall_setAutocancel_obj) },
+    { MP_ROM_QSTR(MP_QSTR_getAutoCancelStatus),          MP_ROM_PTR(&qpy_module_voicecall_getAutocancel_obj) },
 #endif
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
        { MP_ROM_QSTR(MP_QSTR_mute),             MP_ROM_PTR(&qpy_module_voicecall_mute_obj) },
 #endif
-#if defined(PLAT_ASR_1803s)
-    { MP_ROM_QSTR(MP_QSTR_setAutoCancel),          MP_ROM_PTR(&qpy_module_voicecall_setAutocancel_obj) },
-    { MP_ROM_QSTR(MP_QSTR_getAutoCancelStatus),          MP_ROM_PTR(&qpy_module_voicecall_getAutocancel_obj) },
+#if defined(PLAT_ASR_1606)
+       { MP_ROM_QSTR(MP_QSTR_recordConfig), MP_ROM_PTR(&qpy_voice_record_config_obj) },
+#endif
+#if defined(MICROPY_QPY_MODULE_CALL_WAIT)
+#if defined(MICROPY_QPY_MODULE_GET_CALL_WAIT)
+    { MP_ROM_QSTR(MP_QSTR_getCallWait),             MP_ROM_PTR(&qpy_voice_call_get_call_wait_obj) },
+#endif
+    { MP_ROM_QSTR(MP_QSTR_setCallWait),             MP_ROM_PTR(&qpy_voice_call_set_call_wait_obj) },
+    { MP_ROM_QSTR(MP_QSTR_callHold),                MP_ROM_PTR(&qpy_voice_call_call_hold_obj) },
 #endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_voicecall_globals, mp_module_voicecall_globals_table);
index 0062d89..a6432a7 100644 (file)
@@ -155,7 +155,7 @@ STATIC mp_obj_t qpy_wifiscan_set_configuration(size_t n_args, const mp_obj_t *ar
        {
                mp_raise_ValueError("invalid value, priority should be in [0,1].");
        }
-#elif defined(PLAT_ASR_1606)
+#elif defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
        if ((info.timeout < 4) || (info.timeout > 255)) //s
        {
                mp_raise_ValueError("invalid value, timeout should be in [4,255].");
@@ -180,7 +180,7 @@ STATIC mp_obj_t qpy_wifiscan_set_configuration(size_t n_args, const mp_obj_t *ar
        {
                mp_raise_ValueError("invalid value, priority should be in [0,1].");
        }
-#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
     if ((info.timeout < 120) || (info.timeout > 5000)) //ms
        {
                mp_raise_ValueError("invalid value, timeout should be in [120,5000].");
index 2acd854..5cc0c68 100644 (file)
 
 #if MICROPY_QPY_NETWORK_WLAN
 
+#include "sockets.h"
 #include "helios_wlan.h"
 #include "helios_debug.h"
 
-#if 0
-#define WLAN_AP_INIT_CONFIG_DEFAULT() { \
-       .ssid = "quecpython", \
-       .password = "quecpython", \
-    .channel = 0, \
-    .authmode = HELIOS_WLAN_AUTH_WPA_WPA2_PSK, \
-    .max_connect = 10,\
-    .hidden_ssid = 0,\
-}
-#endif
-#define WLAN_AP_SSID_DEFAULT          "quecpython"
+#define WLAN_SSID_MIN_LEN           1
+#define WLAN_SSID_MAX_LEN           32
+#define WLAN_PASSWORD_MIN_LEN       8
+#define WLAN_PASSWORD_MAX_LEN       63
+
+#define STR(R)  #R
+#define WLAN_RAISE_LEN_ERROR(errorn, minVal, maxVal)                                                                \
+do{                                                                                                                 \
+    mp_raise_ValueError(MP_ERROR_TEXT("the length of "#errorn" must be between "STR(minVal)" to "STR(maxVal)""));   \
+} while (0)
+
+#define WLAN_STA_SSID_NV_FILE_NAME  "QDevStaSSID"
+#define WLAN_STA_PWD_NV_FILE_NAME   "QDevStaPWD"
+#define WLAN_AP_SSID_NV_FILE_NAME   "QDevAPSSID"
+#define WLAN_AP_PWD_NV_FILE_NAME    "QDevAPPWD"
+
+#define WLAN_AP_SSID_DEFAULT         "quecpython"
 #define WLAN_AP_PASSWORD_DEFAULT     "quecpython"
-#define WLAN_AP_CHANNEL_DEFAULT      3
-#define WLAN_AP_AUTHMODE_DEFAULT     HELIOS_WLAN_AUTH_WPA_WPA2_PSK
-#define WLAN_AP_MAX_CONNECT_DEFAULT  10
-#define WLAN_AP_HIDDEN_SSID_DEFAULT  0
+#define WLAN_AP_CHANNEL_DEFAULT      (3)
+#define WLAN_AP_AUTHMODE_DEFAULT     (HELIOS_WLAN_AUTH_WPA_WPA2_PSK)
+#define WLAN_AP_MAX_CONNECT_DEFAULT  (HELIOS_WIFI_MAX_CLIENTS)
+#define WLAN_AP_HIDDEN_SSID_DEFAULT  (0)
 
-static Helios_Wlan_Work_Mode_e g_wlan_mode = HELIOS_WLAN_UNKOWN;
+extern int Helios_NV_File_Exist(const char* file_name);
+extern int Helios_NV_File_Write(const char* file_name, void* write_buf, int write_size);
+extern int Helios_NV_File_Read(const char* file_name, void* read_buf, int read_size);
+extern int Helios_NV_File_Delete(const char* file_name);
 
 /* 定义wlan_obj_t结构体 */
-typedef struct _wlan_obj_t
-{
+typedef struct _wlan_obj_t {
     mp_obj_base_t base;   //定义的对象结构体要包含该成员
     Helios_Wlan_Init_config_t wlan_config;
+    c_callback_t wlan_event_callback;
 } wlan_obj_t;
 
-const mp_obj_type_t wlan_if_type;
-wlan_obj_t *single_wlan = NULL;
+const mp_obj_type_t wlan_netif_type;
+static wlan_obj_t* wlan_netif = NULL;
+
+#define check_mode(mode, raise)                                             \
+do{                                                                         \
+    if (mode < HELIOS_WLAN_MODE_NONE || mode >= HELIOS_WLAN_MODE_MAX) {     \
+        if (raise) {                                                        \
+            mp_raise_ValueError(MP_ERROR_TEXT("ERR_MODE_NOT_SOPPORT"));     \
+        } else {                                                            \
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);   \
+        }                                                                   \
+    }                                                                       \
+} while (0)
+
+#define check_ssid_length(length)                                           \
+do{                                                                         \
+    if (length < WLAN_SSID_MIN_LEN || length > WLAN_SSID_MAX_LEN) {         \
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);       \
+    }                                                                       \
+} while (0)
+
+#define check_station_password_length(length)                               \
+do{                                                                         \
+    if (length > WLAN_PASSWORD_MAX_LEN) {                                   \
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);       \
+    }                                                                       \
+} while (0)
+
+#define check_ap_password_length(authmode, length)                                  \
+do{                                                                                 \
+    switch (authmode) {                                                             \
+        case HELIOS_WLAN_AUTH_OPEN:                                                 \
+            if (length != 0) {                                                      \
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);       \
+            }                                                                       \
+            break;                                                                  \
+        case HELIOS_WLAN_AUTH_WEP:                                                  \
+            if (length != 5) {                                                      \
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);       \
+            }                                                                       \
+            break;                                                                  \
+        case HELIOS_WLAN_AUTH_WPA_PSK:                                              \
+        case HELIOS_WLAN_AUTH_WPA2_PSK:                                             \
+        case HELIOS_WLAN_AUTH_WPA_WPA2_PSK:                                         \
+            if (length < WLAN_PASSWORD_MIN_LEN || length > WLAN_PASSWORD_MAX_LEN) { \
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);       \
+            }                                                                       \
+            break;                                                                  \
+        case HELIOS_WLAN_AUTH_MAX:                                                  \
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);                \
+    }                                                                               \
+} while (0)
+
+#define load_nv(key, read_buf)                                              \
+do{                                                                         \
+    uint32_t read_len = 0;                                                  \
+    memset(read_buf, 0x0, sizeof(read_buf));                                \
+    read_len = Helios_NV_File_Read(key, (char*)read_buf, sizeof(read_buf)); \
+    if (read_len == 0) {                                                    \
+        helios_debug("nv [%s] has no value\r\n", key);                      \
+    } else {                                                                \
+        helios_debug("nv key:[%s], value:[%s]\r\n", key, read_buf);         \
+    }                                                                       \
+} while (0)
+
+#define set_nv(key, write_buf)                                              \
+do{                                                                         \
+    uint32_t read_len = 0;                                                  \
+    char read_buf[256];                                                     \
+    memset(read_buf, 0x0, sizeof(read_buf));                                \
+    read_len = Helios_NV_File_Read(key, (char*)read_buf, sizeof(read_buf)); \
+    if (read_len != 0) {                                                    \
+        helios_debug("nv key:[%s], value:[%s]\r\n", key, read_buf);         \
+        if(!strcmp(read_buf, (const char *)write_buf)){                     \
+            break;                                                          \
+        }                                                                   \
+    }                                                                       \
+    Helios_NV_File_Write(key, (char*)write_buf, sizeof(write_buf));         \
+} while (0)
 
-STATIC void check_if(mp_obj_t wlan_if, Helios_Wlan_Work_Mode_e if_no) {
-    wlan_obj_t *self = MP_OBJ_TO_PTR(wlan_if);
-    if (self->wlan_config.wifi_mode != if_no) {
-               mp_raise_ValueError(MP_ERROR_TEXT(if_no == HELIOS_WLAN_STATION ? "STA required" : "AP required"));
+static int iptostr(uint32_t ip, char* ip_str) {
+    sprintf(ip_str, "%d.%d.%d.%d",
+        (uint8_t)(ip >> 0),
+        (uint8_t)(ip >> 8),
+        (uint8_t)(ip >> 16),
+        (uint8_t)(ip >> 24)
+    );
+    return 0;
+}
+
+static int mactostr(uint8_t* mac, char* mac_str) {
+    char buf[20] = { 0 };
+    sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
+        mac[0],
+        mac[1],
+        mac[2],
+        mac[3],
+        mac[4],
+        mac[5]
+    );
+    strcpy(mac_str, buf);
+    return 0;
+}
+
+static int strtomac(char* p, size_t len, uint8_t* mac) {
+    uint8_t times = 0;
+    uint8_t counts = 0;
+    uint8_t bssid[6] = { 0 };
+    char* token = strtok((char*)p, ":");
+    while (token != NULL) {
+        uint8_t val = 0;
+        uint8_t len = strlen(token);
+        if (counts++ > 5) {
+            helios_debug("bssid is not a vaild value!\r\n");
+            return -1;
+        }
+        // helios_debug("**************%s %d*************\r\n", token, len);
+        if (len <= 2) {
+            for (uint8_t i = 0;i < len;i++) {
+                times = (len == 1 || i == 1) ? 1 : 16;
+                if (token[i] >= 48 && token[i] <= 57) {             //0-9
+                    val += (token[i] - 48) * times;
+                } else if (token[i] >= 65 && token[i] <= 70) {      //A-F
+                    val += (token[i] - 55) * times;
+                } else if (token[i] >= 97 && token[i] <= 102) {     //a-f
+                    val += (token[i] - 87) * times;
+                } else {
+                    helios_debug("bssid is not a vaild value!\r\n");
+                    return -1;
+                }
+            }
+        } else {
+            helios_debug("bssid is not a vaild value!\r\n");
+            return -1;
+        }
+        // helios_debug("****%02x****\r\n", val);
+        bssid[counts - 1] = val;
+        token = strtok(NULL, ":");
+    }
+    if (counts != 6) {
+        helios_debug("bssid is not a vaild value!\r\n");
+        return -1;
     }
+    memcpy(mac, bssid, 6);
+    return 0;
 }
 
-STATIC mp_obj_t wlan_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args)
-{
-    mp_arg_check_num(n_args, n_kw, 1, 1, false);   //检查参数个数
-    if( single_wlan == NULL ) {
-               single_wlan = m_new_obj_with_finaliser(wlan_obj_t);  //创建对象,分配空间
-               //memset(single_wlan, 0x00, sizeof(wlan_obj_t));
-       }
+STATIC int wlan_event_callback(Helios_Wlan_Event_t* event) {
+    if (wlan_netif != NULL && wlan_netif->wlan_event_callback.cb != mp_const_none &&
+        ((mp_sched_num_pending() < MICROPY_SCHEDULER_DEPTH))) {
+        GC_STACKTOP_SET();
+        mp_obj_t dict = mp_obj_new_dict(3);
+        mp_obj_dict_store(dict, mp_obj_new_str("type", 4), MP_OBJ_NEW_SMALL_INT(event->type));
+        mp_obj_dict_store(dict, mp_obj_new_str("id", 2), MP_OBJ_NEW_SMALL_INT(event->id));
+        mp_obj_t msg = mp_const_none;
+        switch (event->id) {
+            case HELIOS_WLAN_EVENT_RF_WAKEUP:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_RF_SLEEP:
+            {
+                break;
+            }
 
-       wlan_obj_t *self = single_wlan;
-       self->base.type = &wlan_if_type;         //定义对象的类型
-       int mode = mp_obj_get_int(args[0]);
-       if( mode < HELIOS_WLAN_STATION || mode >= HELIOS_WLAN_STATION_SOFTAP  ) {
-               mp_raise_ValueError(MP_ERROR_TEXT("WLAN MODE NOT SUPPORT"));
-       }
-       if( g_wlan_mode != HELIOS_WLAN_UNKOWN ) {
-               Helios_Wlan_Stop(g_wlan_mode);
-       }
-       self->wlan_config.wifi_mode = mode;
-       g_wlan_mode = mode;
-
-       if( mode == HELIOS_WLAN_STATION ) {
-               memset(&self->wlan_config.sta, 0x00, sizeof(self->wlan_config.sta));
-       } else {
-               memset(&self->wlan_config.ap, 0x00, sizeof(self->wlan_config.ap));
-               strcpy((char *)self->wlan_config.ap.ssid, WLAN_AP_SSID_DEFAULT);
-               strcpy(self->wlan_config.ap.password, WLAN_AP_PASSWORD_DEFAULT);
-               self->wlan_config.ap.channel = WLAN_AP_CHANNEL_DEFAULT;
-               self->wlan_config.ap.authmode = WLAN_AP_AUTHMODE_DEFAULT;
-               self->wlan_config.ap.max_connect = WLAN_AP_MAX_CONNECT_DEFAULT;
-               self->wlan_config.ap.hidden_ssid = WLAN_AP_HIDDEN_SSID_DEFAULT;
-       }
+            case HELIOS_WLAN_EVENT_SCAN_DONE:
+            {
+                uint16_t count = Helios_Wlan_Scan_Num();
+                helios_debug("scan ap list num = %d\n", count);
+                Helios_Wlan_Scan_Result_t ap_info;
+                msg = mp_obj_new_list(0, NULL);
+                for (uint16_t i = 0; i < count; i++) {
+                    Helios_Wlan_Scan_AP_Result(i, &ap_info);
+                    mp_obj_tuple_t* t = mp_obj_new_tuple(6, NULL);
+                    t->items[0] = mp_obj_new_str((char*)ap_info.ssid, ap_info.ssid[0] == 0 ? 0 : ap_info.ssid_len);
+                    char bssid_str[20] = { 0 };
+                    mactostr(ap_info.bssid, bssid_str);
+                    t->items[1] = mp_obj_new_str(bssid_str, strlen(bssid_str));
+                    t->items[2] = MP_OBJ_NEW_SMALL_INT(ap_info.channel);
+                    t->items[3] = MP_OBJ_NEW_SMALL_INT(ap_info.rssi);
+                    t->items[4] = MP_OBJ_NEW_SMALL_INT(ap_info.auth);
+                    t->items[5] = ap_info.ssid[0] == 0 ? mp_const_true : mp_const_false; // XXX hidden?
+                    mp_obj_list_append(msg, MP_OBJ_FROM_PTR(t));
+                }
+                break;
+            }
+            case HELIOS_WLAN_EVENT_SCAN_FAILED:
+            {
+                break;
+            }
+
+            case HELIOS_WLAN_EVENT_STA_START_CONN:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_CONN_SUCCEED:
+            {
+                msg = mp_obj_new_dict(7);
+                mp_obj_dict_store(msg, mp_obj_new_str("ssid", 4), mp_obj_new_str((char*)event->info.connected.ssid, strlen((char*)event->info.connected.ssid)));
+                mp_obj_dict_store(msg, mp_obj_new_str("password", 8), mp_obj_new_str((char*)event->info.connected.pwd, strlen((char*)event->info.connected.pwd)));
+                char mac_str[20] = { 0 };
+                mactostr(event->info.connected.bssid, mac_str);
+                mp_obj_dict_store(msg, mp_obj_new_str("bssid", 5), mp_obj_new_str(mac_str, strlen(mac_str)));
+                mp_obj_dict_store(msg, mp_obj_new_str("channel", 7), MP_OBJ_NEW_SMALL_INT(event->info.connected.channel));
+                mp_obj_dict_store(msg, mp_obj_new_str("rssi", 4), MP_OBJ_NEW_SMALL_INT(event->info.connected.rssi));
+                mp_obj_dict_store(msg, mp_obj_new_str("auth", 4), MP_OBJ_NEW_SMALL_INT(event->info.connected.auth));
+                mp_obj_dict_store(msg, mp_obj_new_str("cipher", 6), MP_OBJ_NEW_SMALL_INT(event->info.connected.cipher));
+                break;
+            }
+            case HELIOS_WLAN_EVENT_CONN_FAILED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_CONN_LOST:
+            {
+                msg = mp_obj_new_dict(3);
+                mp_obj_dict_store(msg, mp_obj_new_str("ssid", 4), mp_obj_new_str((char*)event->info.disconnected.ssid, event->info.disconnected.ssid_len));
+                char mac_str[20] = { 0 };
+                mactostr(event->info.disconnected.bssid, mac_str);
+                mp_obj_dict_store(msg, mp_obj_new_str("bssid", 5), mp_obj_new_str(mac_str, strlen(mac_str)));
+                mp_obj_dict_store(msg, mp_obj_new_str("reason", 6), MP_OBJ_NEW_SMALL_INT(event->info.disconnected.reason));
+                break;
+            }
+            case HELIOS_WLAN_EVENT_GOT_IP:
+            {
+                mp_obj_t tuple[5] = {
+                    mp_obj_new_str(event->info.got_ip.ip_info.ip, strlen(event->info.got_ip.ip_info.ip)),
+                    mp_obj_new_str(event->info.got_ip.ip_info.netmask, strlen(event->info.got_ip.ip_info.netmask)),
+                    mp_obj_new_str(event->info.got_ip.ip_info.gateway, strlen(event->info.got_ip.ip_info.gateway)),
+                    mp_obj_new_str(event->info.got_ip.ip_info.dns_server[0], strlen(event->info.got_ip.ip_info.dns_server[0])),
+                    mp_obj_new_str(event->info.got_ip.ip_info.dns_server[1], strlen(event->info.got_ip.ip_info.dns_server[1]))
+                };
+                msg = mp_obj_new_tuple(5, tuple);
+                break;
+            }
+            case HELIOS_WLAN_EVENT_LOST_IP:
+            {
+                break;
+            }
+
+            case HELIOS_WLAN_EVENT_AP_START_SUCCEED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_AP_START_FAILED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_STA_CONNECTED:
+            {
+                msg = mp_obj_new_dict(2);
+                char mac_str[20] = { 0 };
+                mactostr(event->info.sta_connected.mac, mac_str);
+                mp_obj_dict_store(msg, mp_obj_new_str("mac", 3), mp_obj_new_str(mac_str, strlen(mac_str)));
+                mp_obj_dict_store(msg, mp_obj_new_str("aid", 3), MP_OBJ_NEW_SMALL_INT(event->info.sta_connected.aid));
+                break;
+            }
+            case HELIOS_WLAN_EVENT_STA_DISCONNECTED:
+            {
+                msg = mp_obj_new_dict(3);
+                char mac_str[20] = { 0 };
+                mactostr(event->info.sta_disconnected.mac, mac_str);
+                mp_obj_dict_store(msg, mp_obj_new_str("ip", 2), mp_obj_new_str(event->info.sta_disconnected.ip, strlen(event->info.sta_disconnected.ip)));
+                mp_obj_dict_store(msg, mp_obj_new_str("mac", 3), mp_obj_new_str(mac_str, strlen(mac_str)));
+                mp_obj_dict_store(msg, mp_obj_new_str("aid", 3), MP_OBJ_NEW_SMALL_INT(event->info.sta_disconnected.aid));
+                break;
+            }
+            case HELIOS_WLAN_EVENT_STA_IP_ASSIGNED:
+            {
+                msg = mp_obj_new_dict(3);
+                char mac_str[20] = { 0 };
+                mactostr(event->info.sta_ipassigned.mac, mac_str);
+                mp_obj_dict_store(msg, mp_obj_new_str("ip", 2), mp_obj_new_str(event->info.sta_ipassigned.ip, strlen(event->info.sta_ipassigned.ip)));
+                mp_obj_dict_store(msg, mp_obj_new_str("mac", 3), mp_obj_new_str(mac_str, strlen(mac_str)));
+                mp_obj_dict_store(msg, mp_obj_new_str("aid", 3), MP_OBJ_NEW_SMALL_INT(event->info.sta_ipassigned.aid));
+                break;
+            }
+            case HELIOS_WLAN_EVENT_AP_STOP:
+            {
+                break;
+            }
+
+            case HELIOS_WLAN_EVENT_NETCFG_START_SUCCEED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_NETCFG_START_FAILED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_NETCFG_STOP_SUCCEED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_NETCFG_STOP_FAILED:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_NETCFG_STAT_CLIENT_CONNECT:
+            {
+                break;
+            }
+            case HELIOS_WLAN_EVENT_NETCFG_GOT_KEY:
+            {
+                mp_obj_t tuple[2] = {
+                    mp_obj_new_str((char*)event->info.netcfg_got_key.ssid, strlen((char*)event->info.netcfg_got_key.ssid)),
+                    mp_obj_new_str((char*)event->info.netcfg_got_key.password, strlen((char*)event->info.netcfg_got_key.password))
+                };
+                msg = mp_obj_new_tuple(2, tuple);
+                break;
+            }
+            default:
+                break;
+        }
+        mp_obj_dict_store(dict, mp_obj_new_str("msg", 3), msg);
+        mp_sched_schedule_ex(&wlan_netif->wlan_event_callback, dict);
+        GC_STACKTOP_CLEAR();
+    }
+    return 0;
+}
 
+STATIC mp_obj_t wlan_make_new(const mp_obj_type_t* type, size_t n_args, size_t n_kw, const mp_obj_t* args) {
+    mp_arg_check_num(n_args, n_kw, 1, 1, false);   //检查参数个数
+    if (wlan_netif == NULL) {
+        wlan_netif = m_new_obj_with_finaliser(wlan_obj_t);  //创建对象,分配空间
+        //memset(wlan_netif, 0x00, sizeof(wlan_obj_t));
+    } else {
+        mp_raise_ValueError(MP_ERROR_TEXT("ERR_WLAN_NETIF_IS_BUSY"));
+    }
+    wlan_obj_t* self = wlan_netif;
+    self->base.type = &wlan_netif_type;         //定义对象的类型
+    int mode = mp_obj_get_int(args[0]);
+    check_mode(mode, true);
+    self->wlan_config.wifi_mode = mode;
+    self->wlan_config.block = 1;
+    self->wlan_config.timeout = 20;
+    memset(&self->wlan_config.sta, 0x00, sizeof(self->wlan_config.sta));
+    memset(&self->wlan_config.ap, 0x00, sizeof(self->wlan_config.ap));
+    strcpy((char*)self->wlan_config.ap.ssid, WLAN_AP_SSID_DEFAULT);
+    strcpy(self->wlan_config.ap.password, WLAN_AP_PASSWORD_DEFAULT);
+    self->wlan_config.ap.channel = WLAN_AP_CHANNEL_DEFAULT;
+    self->wlan_config.ap.authmode = WLAN_AP_AUTHMODE_DEFAULT;
+    self->wlan_config.ap.max_connect = WLAN_AP_MAX_CONNECT_DEFAULT;
+    self->wlan_config.ap.hidden_ssid = WLAN_AP_HIDDEN_SSID_DEFAULT;
     return MP_OBJ_FROM_PTR(self);                 //返回对象的指针
 }
 
-STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t *args) {
-    wlan_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+STATIC mp_obj_t network_wlan_mode(size_t n_args, const mp_obj_t* args) {
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    if (n_args > 1) {
+        Helios_Wlan_Mode_e new_mode = mp_obj_get_int(args[1]);
+        check_mode(new_mode, false);
+        if (self->wlan_config.wifi_mode == new_mode) {
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_WIFI_BUSY);
+        }
+        Helios_Wlan_Error_e error = HELIOS_WLAN_ERROR_OK;
+        error = Helios_Wlan_Stop(self->wlan_config.wifi_mode);
+        if (error != HELIOS_WLAN_ERROR_OK) {
+            return MP_OBJ_NEW_SMALL_INT(error);
+        }
+        self->wlan_config.wifi_mode = new_mode;
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_OK);
+    } else {
+        return MP_OBJ_NEW_SMALL_INT(self->wlan_config.wifi_mode);
+    }
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_wlan_mode_obj, 1, 2, network_wlan_mode);
 
-       int ret = 1;
+STATIC mp_obj_t network_wlan_active(size_t n_args, const mp_obj_t* args) {
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    static bool has_been_active = false;
+    Helios_Wlan_Status_e status = 0;
     if (n_args > 1) {
+        Helios_Wlan_Error_e ret = HELIOS_WLAN_ERROR_MAX;
+        if (mp_obj_get_type(args[1]) != &mp_type_bool) {
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+        }
         bool active = mp_obj_is_true(args[1]);
-
-               if( active ) {
-                       ret = Helios_Wlan_Start(&(self->wlan_config));
-               } else {
-                       ret = Helios_Wlan_Stop(self->wlan_config.wifi_mode);
-               }
+        if (active) {
+            switch (self->wlan_config.wifi_mode) {
+                case HELIOS_WLAN_MODE_AP:
+                    status = Helios_Wlan_Get_Status(HELIOS_WLAN_SOFTAP_IF);
+                    check_ssid_length(strlen((char*)self->wlan_config.ap.ssid));
+                    check_ap_password_length(self->wlan_config.ap.authmode, strlen((char*)self->wlan_config.ap.password));
+                    break;
+                case HELIOS_WLAN_MODE_STA:
+                    status = Helios_Wlan_Get_Status(HELIOS_WLAN_STATION_IF);
+                    check_ssid_length(strlen((char*)self->wlan_config.sta.ssid));
+                    check_station_password_length(strlen((char*)self->wlan_config.sta.password));
+                    break;
+                case HELIOS_WLAN_MODE_AP_STA:
+                    check_ssid_length(strlen((char*)self->wlan_config.ap.ssid));
+                    check_ap_password_length(self->wlan_config.ap.authmode, strlen((char*)self->wlan_config.ap.password));
+                    check_ssid_length(strlen((char*)self->wlan_config.sta.ssid));
+                    check_station_password_length(strlen((char*)self->wlan_config.sta.password));
+                    status = Helios_Wlan_Get_Status(HELIOS_WLAN_SOFTAP_IF);
+                    if (status == HELIOS_WLAN_STATUS_AP_IDLE) {
+                        break;
+                    }
+                    status = Helios_Wlan_Get_Status(HELIOS_WLAN_STATION_IF);
+                    if (status == HELIOS_WLAN_STATUS_STA_IDLE) {
+                        break;
+                    }
+                    break;
+                default:
+                    break;
+            }
+            if(status == HELIOS_WLAN_STATUS_STA_IDLE || status == HELIOS_WLAN_STATUS_AP_IDLE){
+            ret = Helios_Wlan_Start(&(self->wlan_config));
+            if (ret == HELIOS_WLAN_ERROR_OK || ret == HELIOS_WLAN_ERROR_WOULDBLOCK) {
+                #if defined(PLAT_ECR6600)
+                    Helios_Active_Status();
+                #endif
+                switch (self->wlan_config.wifi_mode) {
+                    case HELIOS_WLAN_MODE_AP:
+                        set_nv(WLAN_AP_SSID_NV_FILE_NAME, self->wlan_config.ap.ssid);
+                        set_nv(WLAN_AP_PWD_NV_FILE_NAME, self->wlan_config.ap.password);
+                        break;
+                    case HELIOS_WLAN_MODE_STA:
+                        set_nv(WLAN_STA_SSID_NV_FILE_NAME, self->wlan_config.sta.ssid);
+                        set_nv(WLAN_STA_PWD_NV_FILE_NAME, self->wlan_config.sta.password);
+                        break;
+                    case HELIOS_WLAN_MODE_AP_STA:
+                        set_nv(WLAN_AP_SSID_NV_FILE_NAME, self->wlan_config.ap.ssid);
+                        set_nv(WLAN_AP_PWD_NV_FILE_NAME, self->wlan_config.ap.password);
+                        set_nv(WLAN_STA_SSID_NV_FILE_NAME, self->wlan_config.sta.ssid);
+                        set_nv(WLAN_STA_PWD_NV_FILE_NAME, self->wlan_config.sta.password);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        } else {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_OK);
+            }
+        } else {
+            if(active){
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_OK);
+            }   
+            ret = Helios_Wlan_Stop(self->wlan_config.wifi_mode);
+            #if defined(PLAT_ECR6600)
+                if(ret == HELIOS_WLAN_ERROR_OK){
+                    Helios_Active_Status();
+                }
+            #endif
+            if(has_been_active){
+                has_been_active = false;
+            }
+        }
+        return MP_OBJ_NEW_SMALL_INT(ret);
     } else {
-       Helios_Wlan_Status_e status = 0;
-               status = Helios_Wlan_isActive(self->wlan_config.wifi_mode);
-               if( (status != HELIOS_WLAN_AP_STATUS_STOP) && (status != HELIOS_WLAN_STA_STATUS_STOP) ) {
-                       ret = 0;
-               }
-       }
-
-    return mp_obj_new_bool( !ret );
+        int ret = 1;
+        switch (self->wlan_config.wifi_mode) {
+            case HELIOS_WLAN_MODE_NONE:
+                break;
+            case HELIOS_WLAN_MODE_AP:
+                status = Helios_Wlan_Get_Status(HELIOS_WLAN_SOFTAP_IF);
+                if (status != HELIOS_WLAN_STATUS_AP_IDLE) {
+                    ret = 0;
+                }
+                break;
+            case HELIOS_WLAN_MODE_STA:
+                status = Helios_Wlan_Get_Status(HELIOS_WLAN_STATION_IF);
+                if (status != HELIOS_WLAN_STATUS_STA_IDLE) {
+                    ret = 0;
+                }
+                break;
+            case HELIOS_WLAN_MODE_AP_STA:
+                status = Helios_Wlan_Get_Status(HELIOS_WLAN_SOFTAP_IF);
+                if (status == HELIOS_WLAN_STATUS_AP_IDLE) {
+                    break;
+                }
+                status = Helios_Wlan_Get_Status(HELIOS_WLAN_STATION_IF);
+                if (status == HELIOS_WLAN_STATUS_STA_IDLE) {
+                    break;
+                }
+                ret = 0;
+                break;
+            default:
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NOT_SUPPORT);
+        }
+        return mp_obj_new_bool(!ret);
+    }
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_wlan_active_obj, 1, 2, network_wlan_active);
 
-STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
-    enum { ARG_ssid, ARG_key, ARG_bssid };
-    static const mp_arg_t allowed_args[] = {
-        { MP_QSTR_, MP_ARG_OBJ, {.u_obj = mp_const_none} },
-        { MP_QSTR_, MP_ARG_OBJ, {.u_obj = mp_const_none} },
-        { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
-    };
-    // parse args
-    mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
-    mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
-
-       wlan_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
-       Helios_Wlan_Init_config_t *wifi_sta_config = &self->wlan_config;
-
-    // configure any parameters that are given
-    if (n_args > 1) {
-        size_t len;
-        const char *p;
-        if (args[ARG_ssid].u_obj != mp_const_none) {
-            p = mp_obj_str_get_data(args[ARG_ssid].u_obj, &len);
-            memcpy(wifi_sta_config->sta.ssid, p, MIN(len, sizeof(wifi_sta_config->sta.ssid)));
+STATIC mp_obj_t network_wlan_connect(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_STA && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+    }
+    memset(self->wlan_config.sta.ssid, 0x0, sizeof(self->wlan_config.sta.ssid));
+    memset(self->wlan_config.sta.password, 0x0, sizeof(self->wlan_config.sta.password));
+    self->wlan_config.timeout = 15;
+    if (kwargs->used != 0) {
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_ssid: {
+                        size_t len;
+                        const char* p = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_ssid_length(len);
+                        memset(self->wlan_config.sta.ssid, 0x0, sizeof(self->wlan_config.sta.ssid));
+                        memcpy(self->wlan_config.sta.ssid, p, MIN(len, sizeof(self->wlan_config.sta.ssid)));
+                        break;
+                    }
+                    case MP_QSTR_password: {
+                        size_t len;
+                        const char* p = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_station_password_length(len);
+                        memset(self->wlan_config.sta.password, 0x0, sizeof(self->wlan_config.sta.password));
+                        memcpy(self->wlan_config.sta.password, p, MIN(len, sizeof(self->wlan_config.sta.password)));
+                        break;
+                    }
+                    case MP_QSTR_bssid: {
+                        size_t len;
+                        char* p = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        if (strtomac(p, len, self->wlan_config.sta.bssid) != 0) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_timeout: {
+                        self->wlan_config.timeout = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    default:
+                        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                }
+            }
         }
-        if (args[ARG_key].u_obj != mp_const_none) {
-            p = mp_obj_str_get_data(args[ARG_key].u_obj, &len);
-            memcpy(wifi_sta_config->sta.password, p, MIN(len, sizeof(wifi_sta_config->sta.password)));
+    } else {
+        if (n_args > 1) {
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
         }
-        if (args[ARG_bssid].u_obj != mp_const_none) {
-            p = mp_obj_str_get_data(args[ARG_bssid].u_obj, &len);
-            if (len != sizeof(wifi_sta_config->sta.bssid)) {
-                mp_raise_ValueError(NULL);
-            }
-            //wifi_sta_config.sta.bssid_set = 1;
-            memcpy(wifi_sta_config->sta.bssid, p, sizeof(wifi_sta_config->sta.bssid));
+    }
+    if (self->wlan_config.sta.ssid[0] == 0) {
+        load_nv(WLAN_STA_SSID_NV_FILE_NAME, (self->wlan_config.sta.ssid));
+        load_nv(WLAN_STA_PWD_NV_FILE_NAME, (self->wlan_config.sta.password));
+        if (self->wlan_config.sta.ssid[0] == 0) {
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
         }
     }
-
     // connect to the WiFi AP
-    int ret = Helios_Wlan_Start(wifi_sta_config);
-       if( ret != 0 ) mp_raise_ValueError(MP_ERROR_TEXT("wifi connect op error"));;
-
-    return mp_const_none;
+    Helios_Wlan_Init_config_t wlan_config = { 0 };
+    memcpy(&wlan_config, &self->wlan_config, sizeof(Helios_Wlan_Init_config_t));
+    wlan_config.wifi_mode = HELIOS_WLAN_MODE_STA;
+    int ret = Helios_Wlan_Start(&wlan_config);
+    if (ret == HELIOS_WLAN_ERROR_OK || ret == HELIOS_WLAN_ERROR_WOULDBLOCK) {
+        switch (self->wlan_config.wifi_mode) {
+            case HELIOS_WLAN_MODE_AP:
+                set_nv(WLAN_AP_SSID_NV_FILE_NAME, self->wlan_config.ap.ssid);
+                set_nv(WLAN_AP_PWD_NV_FILE_NAME, self->wlan_config.ap.password);
+                break;
+            case HELIOS_WLAN_MODE_STA:
+                set_nv(WLAN_STA_SSID_NV_FILE_NAME, self->wlan_config.sta.ssid);
+                set_nv(WLAN_STA_PWD_NV_FILE_NAME, self->wlan_config.sta.password);
+                break;
+            case HELIOS_WLAN_MODE_AP_STA:
+                set_nv(WLAN_AP_SSID_NV_FILE_NAME, self->wlan_config.ap.ssid);
+                set_nv(WLAN_AP_PWD_NV_FILE_NAME, self->wlan_config.ap.password);
+                set_nv(WLAN_STA_SSID_NV_FILE_NAME, self->wlan_config.sta.ssid);
+                set_nv(WLAN_STA_PWD_NV_FILE_NAME, self->wlan_config.sta.password);
+                break;
+            default:
+                break;
+        }
+    }
+#if defined(PLAT_aic8800m40)
+       if(2000 == ret)
+       {
+               pyexec_frozen_module("auto_update_time.py");
+       }
+#endif
+    return MP_OBJ_NEW_SMALL_INT(ret);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_connect_obj, 1, network_wlan_connect);
 
-STATIC mp_obj_t network_wlan_disconnect(mp_obj_t self_in) {
-       wlan_obj_t *self = MP_OBJ_TO_PTR(self_in);
-    Helios_Wlan_Stop(self->wlan_config.wifi_mode);
-    return mp_const_none;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_disconnect_obj, network_wlan_disconnect);
-
-STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t *args) {
-    wlan_obj_t *self = MP_OBJ_TO_PTR(args[0]);
-
-       int ret = 0;
-    if (n_args == 1) {
-               Helios_Wlan_Status_e status = Helios_Wlan_isActive(self->wlan_config.wifi_mode);
-               if( status == HELIOS_WLAN_STATUS_ERROR ) return mp_const_none;
-                // Simply pass the error through from ESP-identifier
-        return MP_OBJ_NEW_SMALL_INT(status);
+STATIC mp_obj_t network_wlan_disconnect(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    Helios_Wlan_Mode_e mode = self->wlan_config.wifi_mode;
+    uint8_t mac[6] = { 0 };
+    uint8_t mac_null[6] = { 0 };
+    bool if_add_blacklist = 1;
+    if (kwargs->used != 0) {
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_interface: {
+                        switch (mp_obj_get_int(kwargs->table[i].value)) {
+                            case HELIOS_WLAN_SOFTAP_IF:
+                                if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                                    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+                                }
+                                mode = HELIOS_WLAN_MODE_AP;
+                                break;
+                            case HELIOS_WLAN_STATION_IF:
+                                if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_STA && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                                    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+                                }
+                                mode = HELIOS_WLAN_MODE_STA;
+                                break;
+                            default:
+                                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_mac: {
+                        if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+                        }
+                        size_t len;
+                        char* p = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        if (strtomac(p, len, mac) != 0) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        if (!memcmp(mac, mac_null, 6)) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_ip: {
+                        if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+                        }
+                        uint32_t ip = 0;
+                        size_t len;
+                        char* p = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        if (inet_pton(AF_INET, p, &ip) != 1) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        if (Helios_Wlan_AP_Get_Station_MAC(ip, mac) != HELIOS_WLAN_ERROR_OK) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_blacklist: {
+                        if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+                        }
+                        if_add_blacklist = mp_obj_is_true(kwargs->table[i].value);
+                        break;
+                    }
+                    default:
+                        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                }
+            }
+        }
     }
+    int ret = HELIOS_WLAN_ERROR_INTERNAL;
+    switch (mode) {
+        case HELIOS_WLAN_MODE_AP:
+        {
+            if (!memcmp(mac, mac_null, 6)) {
+                ret = Helios_Wlan_Stop(HELIOS_WLAN_MODE_AP);
+                break;
+            }
+            if(if_add_blacklist){
+                ret = Helios_Wlan_AP_Add_Station_to_Blacklist(mac);
+            }else{
+                ret = Helios_Wlan_AP_Remove_Station_from_Blacklist(mac);
+            }
+            break;
+        }
+        case HELIOS_WLAN_MODE_STA:
+        {
+            ret = Helios_Wlan_Stop(HELIOS_WLAN_MODE_STA);
+            break;
+        }
+        default:
+            ret = HELIOS_WLAN_ERROR_PARAM_INVALID;
+    }
+    return MP_OBJ_NEW_SMALL_INT(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_disconnect_obj, 1, network_wlan_disconnect);
 
+STATIC mp_obj_t network_wlan_status(size_t n_args, const mp_obj_t* args) {
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
     // one argument: return status based on query parameter
     switch ((uintptr_t)args[1]) {
-        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_stations): {
-            // return list of connected stations, only if in softap mode
-            check_if(args[0], HELIOS_WLAN_SOFTAP);
-            Helios_Wlan_Softap_Station_List_t station_list;
-                       int num = WLAN_AP_MAX_CONNECT_DEFAULT;
-            ret = Helios_Wlan_Softap_Get_Station_List(&station_list, (uint32_t *)&num);
-                       if( ret != 0 ) return mp_const_none;
-                       helios_debug("connected sta list num = %d\n", num);
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_stations_list): {
+            if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+            }
+            if (!Helios_Wlan_isActive(HELIOS_WLAN_SOFTAP_IF)) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_AP_UNSTART);
+            }
+            Helios_Wlan_Softap_Station_List_t station_list[WLAN_AP_MAX_CONNECT_DEFAULT] = { 0 };
+            int num = WLAN_AP_MAX_CONNECT_DEFAULT;
+            int ret = Helios_Wlan_Softap_Get_Station_List((Helios_Wlan_Softap_Station_List_t*)station_list, (uint32_t*)&num);
+            if (ret != HELIOS_WLAN_ERROR_OK) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);
+            }
+            // helios_debug("connected sta list num = %d\n", num);
             mp_obj_t list = mp_obj_new_list(0, NULL);
             for (int i = 0; i < num; ++i) {
-                mp_obj_tuple_t *t = mp_obj_new_tuple(1, NULL);
-                t->items[0] = mp_obj_new_bytes(station_list.mac, sizeof(station_list.mac));
-                mp_obj_list_append(list, t);
+                mp_obj_tuple_t* t = mp_obj_new_tuple(3, NULL);
+                /* aid */
+                uint8_t aid = 0;
+                Helios_Wlan_AP_Get_Station_AID(&aid, station_list[i].mac);
+                t->items[0] = MP_OBJ_NEW_SMALL_INT(aid);
+                /* ip */
+                uint32_t ip = 0;
+                Helios_Wlan_AP_Get_Station_IP(&ip, station_list[i].mac);
+                char ip_str[20] = { 0 };
+                iptostr(ip, ip_str);
+                t->items[1] = mp_obj_new_str(ip_str, strlen(ip_str));
+                /* mac */
+                char mac_str[20] = { 0 };
+                mactostr(station_list[i].mac, mac_str);
+                t->items[2] = mp_obj_new_str(mac_str, strlen(mac_str));
+                mp_obj_list_append(list, MP_OBJ_FROM_PTR(t));
+            }
+            return list;
+        }
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_ap_list): {
+            if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_STA && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+            }
+            if (!Helios_Wlan_isActive(HELIOS_WLAN_STATION_IF)) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_UNCONNECTED_AP);
             }
+            Helios_Wlan_Station_Status_t station_status;
+            memset(&station_status, 0x00, sizeof(station_status));
+            int ret = Helios_Wlan_Station_Get_AP_Info(&station_status);
+            if (ret != HELIOS_WLAN_ERROR_OK) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);
+            }
+            mp_obj_t list = mp_obj_new_list(0, NULL);
+            /* ssid */
+            mp_obj_t val = mp_obj_new_str((char*)station_status.ssid, strlen((char*)station_status.ssid));
+            mp_obj_list_append(list, val);
+            /* pwd */
+            val = mp_obj_new_str((char*)station_status.pwd, strlen((char*)station_status.pwd));
+            mp_obj_list_append(list, val);
+            /* mac */
+            char mac_str[20] = { 0 };
+            mactostr(station_status.bssid, mac_str);
+            val = mp_obj_new_str(mac_str, strlen(mac_str));
+            mp_obj_list_append(list, val);
+            /* rssi */
+            val = MP_OBJ_NEW_SMALL_INT(station_status.rssi);
+            mp_obj_list_append(list, val);
+            /* channel */
+            val = MP_OBJ_NEW_SMALL_INT(station_status.channel);
+            mp_obj_list_append(list, val);
+            /* auth */
+            val = MP_OBJ_NEW_SMALL_INT(station_status.auth);
+            mp_obj_list_append(list, val);
+            /* cipher */
+            val = MP_OBJ_NEW_SMALL_INT(station_status.cipher);
+            mp_obj_list_append(list, val);
             return list;
         }
-        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_rssi): {
-            // return signal of softap, only in station mode
-            check_if(args[0], HELIOS_WLAN_STATION);
-                       Helios_Wlan_Station_Status_t station_status;
-                       memset(&station_status, 0x00, sizeof(station_status));
-                       ret = Helios_Wlan_Station_Status(&station_status);
-                       if( ret != 0 ) return mp_const_none;
-            return MP_OBJ_NEW_SMALL_INT(station_status.rssi);
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_rf): {
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_STATUS_RF_ACTIVATED);
+        }
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_softap_if): {
+            Helios_Wlan_Status_e status = Helios_Wlan_Get_Status(HELIOS_WLAN_SOFTAP_IF);
+            if (status == HELIOS_WLAN_STATUS_MAX) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);
+            }
+            return MP_OBJ_NEW_SMALL_INT(status);
+        }
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_station_if): {
+            Helios_Wlan_Status_e status = Helios_Wlan_Get_Status(HELIOS_WLAN_STATION_IF);
+            if (status == HELIOS_WLAN_STATUS_MAX) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);
+            }
+            return MP_OBJ_NEW_SMALL_INT(status);
+        }
+        case (uintptr_t)MP_OBJ_NEW_QSTR(MP_QSTR_netcfg): {
+            return MP_OBJ_NEW_SMALL_INT(Helios_Wlan_Get_Netcfg_Status());
         }
         default:
-            mp_raise_ValueError(MP_ERROR_TEXT("unknown status param"));
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NOT_SUPPORT);
     }
-
-    return mp_const_none;
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_wlan_status_obj, 1, 2, network_wlan_status);
 
-STATIC mp_obj_t network_wlan_scan(mp_obj_t self_in) {
-    // check that STA mode is active
-    check_if(self_in, HELIOS_WLAN_STATION);
-
-    mp_obj_t list = mp_obj_new_list(0, NULL);
-    int ret = Helios_Wlan_Scan_Start();
-    if (ret == 0) {
-        uint16_t count = Helios_Wlan_Scan_Num();
-               helios_debug("scan ap list num = %d\n", count);
-               Helios_Wlan_Scan_Result_t ap_info;
-        for (uint16_t i = 0; i < count; i++) {
-               ret = Helios_Wlan_Scan_AP_Result(i, &ap_info);
-            mp_obj_tuple_t *t = mp_obj_new_tuple(6, NULL);
-            t->items[0] = mp_obj_new_bytes(ap_info.ssid, ap_info.ssid_len);
-            t->items[1] = mp_obj_new_bytes(ap_info.bssid, sizeof(ap_info.bssid));
-            t->items[2] = MP_OBJ_NEW_SMALL_INT(ap_info.channel);
-            t->items[3] = MP_OBJ_NEW_SMALL_INT(ap_info.rssi);
-            t->items[4] = MP_OBJ_NEW_SMALL_INT(ap_info.auth);
-            t->items[5] = mp_const_false; // XXX hidden?
-            mp_obj_list_append(list, MP_OBJ_FROM_PTR(t));
-        }
-    }
-    return list;
-}
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_scan_obj, network_wlan_scan);
-
-STATIC mp_obj_t network_wlan_isconnected(mp_obj_t self_in) {
-    wlan_obj_t *self = MP_OBJ_TO_PTR(self_in);
-    if (self->wlan_config.wifi_mode == HELIOS_WLAN_STATION) {
-               Helios_Wlan_Station_Status_t station_status;
-               memset(&station_status, 0x00, sizeof(station_status));
-               Helios_Wlan_Station_Status(&station_status);
-        return mp_obj_new_bool(station_status.state);
+STATIC mp_obj_t network_wlan_scan(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_STA && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+    }
+    mp_obj_t val = NULL;
+    Helios_Wlan_Scan_Config_t scan_config = { 0 };
+    scan_config.max_item = 0;
+    if (kwargs->used != 0) {
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_ssid: {
+                        size_t len;
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_ssid_length(len);
+                        len = MIN(len, sizeof(self->wlan_config.ap.ssid));
+                        scan_config.ssid = (uint8_t*)malloc(len + 1);
+                        memset(scan_config.ssid, 0x0, len + 1);
+                        memcpy(scan_config.ssid, s, len);
+                        break;
+                    }
+                    case MP_QSTR_bssid: {
+                        size_t len;
+                        char* s = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        uint8_t mac[6];
+                        if (strtomac(s, len, mac) != 0) {
+                            val = MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                            goto _exit;
+                        }
+                        scan_config.bssid = (uint8_t*)malloc(6);
+                        memset(scan_config.bssid, 0x0, 6);
+                        memcpy(scan_config.bssid, mac, 6);
+                        break;
+                    }
+                    case MP_QSTR_channel: {
+                        if (mp_obj_get_int(kwargs->table[i].value) < 1 || mp_obj_get_int(kwargs->table[i].value) > HELIOS_WIFI_MAX_CHANNEL) {
+                            val = MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                            goto _exit;
+                        }
+                        scan_config.channel = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_passive: {
+                        scan_config.passive = mp_obj_get_int(kwargs->table[i].value) != 0 ? 1 : 0;
+                        break;
+                    }
+                    case MP_QSTR_max_item: {
+                        scan_config.max_item = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_scan_time: {
+                        scan_config.scan_time = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+    val = mp_obj_new_list(0, NULL);
+    int ret = Helios_Wlan_Scan_Start(self->wlan_config.block, &scan_config);
+    if (ret == HELIOS_WLAN_ERROR_OK) {
+        if (self->wlan_config.block) {
+            uint16_t count = Helios_Wlan_Scan_Num();
+            helios_debug("scan ap list num = %d\n", count);
+            Helios_Wlan_Scan_Result_t ap_info;
+            for (uint16_t i = 0; i < count; i++) {
+                ret = Helios_Wlan_Scan_AP_Result(i, &ap_info);
+                if(ret != HELIOS_WLAN_ERROR_OK){
+                    val = MP_OBJ_NEW_SMALL_INT(ret);
+                    break;
+                }
+                mp_obj_tuple_t* t = mp_obj_new_tuple(6, NULL);
+                t->items[0] = mp_obj_new_str((char*)ap_info.ssid, ap_info.ssid[0] == 0 ? 0 : ap_info.ssid_len);
+                char bssid_str[20] = { 0 };
+                mactostr(ap_info.bssid, bssid_str);
+                t->items[1] = mp_obj_new_str(bssid_str, strlen(bssid_str));
+                t->items[2] = MP_OBJ_NEW_SMALL_INT(ap_info.channel);
+                t->items[3] = MP_OBJ_NEW_SMALL_INT(ap_info.rssi);
+                t->items[4] = MP_OBJ_NEW_SMALL_INT(ap_info.auth);
+                t->items[5] = ap_info.ssid[0] == 0 ? mp_const_true : mp_const_false; // XXX hidden?
+                mp_obj_list_append(val, MP_OBJ_FROM_PTR(t));
+            }
+        } else {
+            val = MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_WOULDBLOCK);
+        }
     } else {
-               Helios_Wlan_Softap_Station_List_t station_list;
-               int num = 0;
-        Helios_Wlan_Softap_Get_Station_List(&station_list, (uint32_t *)&num);
-        return mp_obj_new_bool(num != 0);
+        val = MP_OBJ_NEW_SMALL_INT(ret);
+    }
+_exit:
+    if (scan_config.ssid) {
+        free(scan_config.ssid);
+    }
+    if (scan_config.bssid) {
+        free(scan_config.bssid);
     }
+    return val;
 }
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(network_wlan_isconnected_obj, network_wlan_isconnected);
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_scan_obj, 1, network_wlan_scan);
 
-STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs) {
+STATIC mp_obj_t network_wlan_config(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
     if (n_args != 1 && kwargs->used != 0) {
         mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
     }
-
-    wlan_obj_t *self = MP_OBJ_TO_PTR(args[0]);
-
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    if(self->wlan_config.wifi_mode == HELIOS_WLAN_MODE_NONE)
+    {
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NOT_SUPPORT);
+    }
     if (kwargs->used != 0) {
-
+        Helios_Wlan_Softap_Config_t ap_config_cp = { 0 };
+        memcpy(ap_config_cp.password, self->wlan_config.ap.password, sizeof(ap_config_cp.password));
+        ap_config_cp.authmode = self->wlan_config.ap.authmode;
         for (size_t i = 0; i < kwargs->alloc; i++) {
             if (mp_map_slot_is_filled(kwargs, i)) {
-                int mode = -1;
-
                 switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
-                    case MP_QSTR_ssid: {
-                        mode = self->wlan_config.wifi_mode;
+                    case MP_QSTR_ap_ssid: {
+                        size_t len;
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_ssid_length(len);
+                        len = MIN(len, sizeof(self->wlan_config.ap.ssid));
+                        memset(self->wlan_config.ap.ssid, 0x0, sizeof(self->wlan_config.ap.ssid));
+                        memcpy(self->wlan_config.ap.ssid, s, len);
+                        break;
+                    }
+                    case MP_QSTR_sta_ssid: {
                         size_t len;
-                        const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
-                                               if( mode == HELIOS_WLAN_STATION ) {
-                                                       len = MIN(len, sizeof(self->wlan_config.sta.ssid));
-                                                       memcpy(self->wlan_config.sta.ssid, s, len);
-                                                       self->wlan_config.sta.ssid[len] = 0;
-                                               } else {
-                                                       len = MIN(len, sizeof(self->wlan_config.ap.ssid));
-                               memcpy(self->wlan_config.ap.ssid, s, len);
-                                                       self->wlan_config.ap.ssid[len] = 0;
-                                               }
-                        break;
-                    }
-                    case MP_QSTR_hidden: {
-                        mode = HELIOS_WLAN_SOFTAP;
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_ssid_length(len);
+                        len = MIN(len, sizeof(self->wlan_config.sta.ssid));
+                        memset(self->wlan_config.sta.ssid, 0x0, sizeof(self->wlan_config.sta.ssid));
+                        memcpy(self->wlan_config.sta.ssid, s, len);
+                        break;
+                    }
+                    case MP_QSTR_ap_hidden: {
+                        if (!mp_obj_is_bool(kwargs->table[i].value)) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
                         self->wlan_config.ap.hidden_ssid = mp_obj_is_true(kwargs->table[i].value);
                         break;
                     }
-                    case MP_QSTR_security: {
-                        mode = HELIOS_WLAN_SOFTAP;
-                        self->wlan_config.ap.authmode = mp_obj_get_int(kwargs->table[i].value);
+                    case MP_QSTR_ap_auth: {
+                        if (mp_obj_get_int(kwargs->table[i].value) >= HELIOS_WLAN_AUTH_MAX) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        int auth = mp_obj_get_int(kwargs->table[i].value);
+                        ap_config_cp.authmode = auth;
                         break;
                     }
-                    case MP_QSTR_key: {
-                        mode = self->wlan_config.wifi_mode;
+                    case MP_QSTR_ap_password: {
                         size_t len;
-                        const char *s = mp_obj_str_get_data(kwargs->table[i].value, &len);
-                                               if( mode == HELIOS_WLAN_STATION ) {
-                                                       len = MIN(len, sizeof(self->wlan_config.sta.password) - 1);
-                                                       memcpy(self->wlan_config.sta.password, s, len);
-                                                       self->wlan_config.sta.password[len] = 0;
-                                               } else {
-                                                       len = MIN(len, sizeof(self->wlan_config.ap.password) - 1);
-                               memcpy(self->wlan_config.ap.password, s, len);
-                               self->wlan_config.ap.password[len] = 0;
-                                               }
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        len = MIN(len, sizeof(self->wlan_config.ap.password) - 1);
+                        memset(ap_config_cp.password, 0x0, sizeof(self->wlan_config.ap.password));
+                        memcpy(ap_config_cp.password, s, len);
                         break;
                     }
-                    case MP_QSTR_channel: {
-                        mode = HELIOS_WLAN_SOFTAP;
+                    case MP_QSTR_sta_password: {
+                        size_t len;
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        check_station_password_length(len);
+                        len = MIN(len, sizeof(self->wlan_config.sta.password) - 1);
+                        memset(self->wlan_config.sta.password, 0x0, sizeof(self->wlan_config.sta.password));
+                        memcpy(self->wlan_config.sta.password, s, len);
+                        break;
+                    }
+                    case MP_QSTR_ap_channel: {
+                        if (mp_obj_get_int(kwargs->table[i].value) < 1 || mp_obj_get_int(kwargs->table[i].value) > HELIOS_WIFI_MAX_CHANNEL) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
                         self->wlan_config.ap.channel = mp_obj_get_int(kwargs->table[i].value);
                         break;
                     }
-                    case MP_QSTR_max_clients: {
-                        mode = HELIOS_WLAN_SOFTAP;
+                    case MP_QSTR_sta_channel: {
+                        if (mp_obj_get_int(kwargs->table[i].value) < 1 || mp_obj_get_int(kwargs->table[i].value) > HELIOS_WIFI_MAX_CHANNEL) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        self->wlan_config.sta.channel = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_ap_max_clients: {
+                        if (mp_obj_get_int(kwargs->table[i].value) < 1 || mp_obj_get_int(kwargs->table[i].value) > HELIOS_WIFI_MAX_CLIENTS) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
                         self->wlan_config.ap.max_connect = mp_obj_get_int(kwargs->table[i].value);
                         break;
                     }
+                    case MP_QSTR_ap_mac: {
+                        size_t len;
+                        char* s = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        uint8_t mac[6] = { 0 };
+                        if (strtomac(s, len, mac) != 0) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        Helios_Wlan_Set_MAC_Addr(HELIOS_WLAN_SOFTAP_IF, mac);
+                        break;
+                    }
+                    case MP_QSTR_sta_mac: {
+                        size_t len;
+                        char* s = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        uint8_t mac[6] = { 0 };
+                        if (strtomac(s, len, mac) != 0) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        Helios_Wlan_Set_MAC_Addr(HELIOS_WLAN_STATION_IF, mac);
+                        break;
+                    }
+                    case MP_QSTR_sta_bssid: {
+                        size_t len;
+                        char* s = (char*)mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        uint8_t bssid[6] = { 0 };
+                        if (strtomac(s, len, bssid) != 0) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        memcpy(self->wlan_config.sta.bssid, bssid, 6);
+                        break;
+                    }
+                    case MP_QSTR_timeout: {
+                        self->wlan_config.timeout = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_block: {
+                        if (mp_obj_get_type(kwargs->table[i].value) != &mp_type_bool) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        self->wlan_config.block = mp_obj_is_true(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_country: {
+                        size_t len;
+                        const char* s = mp_obj_str_get_data(kwargs->table[i].value, &len);
+                        int ret = Helios_Wlan_Set_Country_Code(s);
+                        if (ret != HELIOS_WLAN_ERROR_OK) {
+                            return MP_OBJ_NEW_SMALL_INT(ret);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_event_callback: {
+                        if (mp_sched_schedule_callback_register(&self->wlan_event_callback, kwargs->table[i].value) != true) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_INTERNAL);
+                        }
+                        Helios_Wlan_Set_Event_Callback((Helios_WlanEventCallback)wlan_event_callback);
+                        break;
+                    }
                     default:
                         goto unknown;
                 }
-
-                // We post-check interface requirements to save on code size
-                if (mode >= 0) {
-                    check_if(args[0], mode);
-                }
             }
         }
-
-        return mp_const_none;
+        size_t len = strlen(ap_config_cp.password);
+        check_ap_password_length(ap_config_cp.authmode, len);
+        memcpy(self->wlan_config.ap.password, ap_config_cp.password, sizeof(ap_config_cp.password));
+        self->wlan_config.ap.authmode = ap_config_cp.authmode;
+        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_OK);
     }
 
     // Get config
-
     if (n_args != 2) {
         mp_raise_TypeError(MP_ERROR_TEXT("can query only one param"));
     }
-
-    int mode = -1;
     mp_obj_t val = mp_const_none;
-
     switch (mp_obj_str_get_qstr(args[1])) {
-        case MP_QSTR_ssid:
-            switch (self->wlan_config.wifi_mode) {
-                case HELIOS_WLAN_STATION:
-                    val = mp_obj_new_str((char *)self->wlan_config.sta.ssid, strlen((char *)self->wlan_config.sta.ssid));
-                    break;
-                case HELIOS_WLAN_SOFTAP:
-                    val = mp_obj_new_str((char *)self->wlan_config.ap.ssid, strlen((char *)self->wlan_config.ap.ssid));
-                    break;
-                default:
-                    mode = HELIOS_WLAN_SOFTAP;
-            }
+        case MP_QSTR_ap_ssid:
+            val = mp_obj_new_str((char*)self->wlan_config.ap.ssid, strlen((char*)self->wlan_config.ap.ssid));
+            break;
+        case MP_QSTR_sta_ssid:
+            val = mp_obj_new_str((char*)self->wlan_config.sta.ssid, strlen((char*)self->wlan_config.sta.ssid));
             break;
-        case MP_QSTR_hidden:
-            mode = HELIOS_WLAN_SOFTAP;
+        case MP_QSTR_ap_hidden:
             val = mp_obj_new_bool(self->wlan_config.ap.hidden_ssid);
             break;
-        case MP_QSTR_security:
-            mode = HELIOS_WLAN_SOFTAP;
+        case MP_QSTR_ap_auth:
             val = MP_OBJ_NEW_SMALL_INT(self->wlan_config.ap.authmode);
             break;
-        case MP_QSTR_channel:
-            mode = HELIOS_WLAN_SOFTAP;
-            val = MP_OBJ_NEW_SMALL_INT(self->wlan_config.ap.channel);
+        case MP_QSTR_ap_password:
+            val = mp_obj_new_str((char*)self->wlan_config.ap.password, strlen((char*)self->wlan_config.ap.password));
+            break;
+        case MP_QSTR_sta_password:
+            val = mp_obj_new_str((char*)self->wlan_config.sta.password, strlen((char*)self->wlan_config.sta.password));
+            break;
+        case MP_QSTR_ap_channel: {
+            if (Helios_Wlan_isActive(HELIOS_WLAN_SOFTAP_IF) != 1) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+            }
+            val = MP_OBJ_NEW_SMALL_INT(Helios_Wlan_Get_Channel(HELIOS_WLAN_SOFTAP_IF));
+            break;
+        }
+        case MP_QSTR_sta_channel: {
+            if (Helios_Wlan_isActive(HELIOS_WLAN_STATION_IF) != 1) {
+                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+            }
+            val = MP_OBJ_NEW_SMALL_INT(Helios_Wlan_Get_Channel(HELIOS_WLAN_STATION_IF));
             break;
-        case MP_QSTR_max_clients: {
-                       mode = HELIOS_WLAN_SOFTAP;
+        }
+        case MP_QSTR_ap_max_clients: {
             val = MP_OBJ_NEW_SMALL_INT(self->wlan_config.ap.max_connect);
             break;
         }
+        case MP_QSTR_ap_mac: {
+            uint8_t mac[6] = { 0 };
+            char mac_str[20] = { 0 };
+            Helios_Wlan_Get_MAC_Addr(HELIOS_WLAN_SOFTAP_IF, mac);
+            mactostr(mac, mac_str);
+            val = mp_obj_new_str(mac_str, strlen(mac_str));
+            break;
+        }
+        case MP_QSTR_sta_mac: {
+            uint8_t mac[6] = { 0 };
+            char mac_str[20] = { 0 };
+            Helios_Wlan_Get_MAC_Addr(HELIOS_WLAN_STATION_IF, mac);
+            mactostr(mac, mac_str);
+            val = mp_obj_new_str(mac_str, strlen(mac_str));
+            break;
+        }
+        case MP_QSTR_sta_bssid: {
+            char mac_str[20] = { 0 };
+            mactostr(self->wlan_config.sta.bssid, mac_str);
+            val = mp_obj_new_str(mac_str, strlen(mac_str));
+            break;
+        }
+        case MP_QSTR_timeout: {
+            val = MP_OBJ_NEW_SMALL_INT(self->wlan_config.timeout);
+            break;
+        }
+        case MP_QSTR_block: {
+            val = mp_obj_new_bool(self->wlan_config.block);
+            break;
+        }
+        case MP_QSTR_country: {
+            char country_code[3] = { 0 };
+            int ret = Helios_Wlan_Get_Country_Code(country_code);
+            if (ret != HELIOS_WLAN_ERROR_OK) {
+                return MP_OBJ_NEW_SMALL_INT(ret);
+            }
+            val = mp_obj_new_str(country_code, strlen(country_code));
+            break;
+        }
         default:
             goto unknown;
     }
-
-    // We post-check interface requirements to save on code size
-    if (mode >= 0) {
-        check_if(args[0], mode);
-    }
-
     return val;
-
 unknown:
-    mp_raise_ValueError(MP_ERROR_TEXT("unknown config param"));
+    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NOT_SUPPORT);
 }
 MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_config_obj, 1, network_wlan_config);
 
-STATIC mp_obj_t network_wlan_ifconfig(size_t n_args, const mp_obj_t *args) {
-       wlan_obj_t *self = MP_OBJ_TO_PTR(args[0]);
-       Helios_Wlan_Ipconfig_t ipconfig = {0};
-       
-    if (n_args == 1) {
-               Helios_Wlan_IPConfig(self->wlan_config.wifi_mode, &ipconfig);
-        mp_obj_t tuple[6] = {
-            mp_obj_new_str(ipconfig.ip, strlen(ipconfig.ip)),
-            mp_obj_new_str(ipconfig.netmask, strlen(ipconfig.netmask)),
-            mp_obj_new_str(ipconfig.gateway, strlen(ipconfig.gateway)),
-            mp_obj_new_str(ipconfig.dns_server[0], strlen(ipconfig.dns_server[0])),
-            mp_obj_new_str(ipconfig.dns_server[1], strlen(ipconfig.dns_server[1])),
-        };
-        return mp_obj_new_tuple(5, tuple);
-    }
-
-    // set
-    mp_obj_t *items;
-       size_t read_len = 0;
-       mp_obj_get_array(args[1], &read_len, &items);
-       mp_buffer_info_t data = {0};
-       for(int i = 0; i < (int)read_len; i++ ) {
-               if ( !mp_obj_is_str(items[i]) ) return mp_const_none;
-               mp_get_buffer_raise(items[i], &data, MP_BUFFER_READ);
-               switch(i) {
-                       case 0:
-                               strcpy(ipconfig.ip, data.buf);
-                               break;
-                       case 1:
-                               strcpy(ipconfig.netmask, data.buf);
-                               break;
-                       case 2:
-                               strcpy(ipconfig.gateway, data.buf);
-                               break;
-                       case 3:
-                               strcpy(ipconfig.dns_server[0], data.buf);
-                               break;
-                       case 4:
-                               strcpy(ipconfig.dns_server[1], data.buf);
-                               break;
-                       default:
-                               mp_raise_ValueError(MP_ERROR_TEXT("invalid param"));
-                               break;
-               }
-       }
-       
-       Helios_Wlan_Set_IPConfig(self->wlan_config.wifi_mode, &ipconfig);
-    return mp_const_none;
-
+STATIC mp_obj_t network_wlan_ifconfig(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    Helios_Wlan_Ipconfig_t ipconfig = { 0 };
+    Helios_Wlan_Mode_e mode = self->wlan_config.wifi_mode;
+    if (kwargs->used != 0) {
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_interface: {
+                        switch (mp_obj_get_int(kwargs->table[i].value)) {
+                            case HELIOS_WLAN_SOFTAP_IF:
+                                if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                                    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_AP_IF);
+                                }
+                                mode = HELIOS_WLAN_MODE_AP;
+                                break;
+                            case HELIOS_WLAN_STATION_IF:
+                                if (self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_STA && self->wlan_config.wifi_mode != HELIOS_WLAN_MODE_AP_STA) {
+                                    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_NO_STA_IF);
+                                }
+                                mode = HELIOS_WLAN_MODE_STA;
+                                break;
+                            default:
+                                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        break;
+                    }
+                    case MP_QSTR_config: {
+                        mp_obj_t* items;
+                        size_t read_len = 0;
+                        mp_obj_get_array(kwargs->table[i].value, &read_len, &items);
+                        mp_buffer_info_t data = { 0 };
+                        strcpy(ipconfig.ip, "0.0.0.0");
+                        strcpy(ipconfig.netmask, "0.0.0.0");
+                        strcpy(ipconfig.gateway, "0.0.0.0");
+                        strcpy(ipconfig.dns_server[0], "8.8.8.8");
+                        strcpy(ipconfig.dns_server[1], "0.0.0.0");
+                        for (int i = 0; i < (int)read_len; i++) {
+                            if (!mp_obj_is_str(items[i])) {
+                                return mp_const_none;
+                            }
+                            mp_get_buffer_raise(items[i], &data, MP_BUFFER_READ);
+                            switch (i) {
+                                case 0:
+                                    strcpy(ipconfig.ip, data.buf);
+                                    break;
+                                case 1:
+                                    strcpy(ipconfig.netmask, data.buf);
+                                    break;
+                                case 2:
+                                    strcpy(ipconfig.gateway, data.buf);
+                                    break;
+                                case 3:
+                                    strcpy(ipconfig.dns_server[0], data.buf);
+                                    break;
+                                case 4:
+                                    strcpy(ipconfig.dns_server[1], data.buf);
+                                    break;
+                                default:
+                                    return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                            }
+                        }
+                        Helios_Wlan_Interface_e vif = HELIOS_WLAN_MAX_IF;
+                        switch (mode) {
+                            case HELIOS_WLAN_MODE_AP:
+                                vif = HELIOS_WLAN_SOFTAP_IF;
+                                break;
+                            case HELIOS_WLAN_MODE_STA:
+                                vif = HELIOS_WLAN_STATION_IF;
+                                break;
+                            default:
+                                return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        return MP_OBJ_NEW_SMALL_INT(Helios_Wlan_Set_IPConfig(vif, &ipconfig));
+                    }
+                    default:
+                        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                }
+            }
+        }
+    }
+    Helios_Wlan_Interface_e vif = HELIOS_WLAN_MAX_IF;
+    switch (mode) {
+        case HELIOS_WLAN_MODE_AP:
+            vif = HELIOS_WLAN_SOFTAP_IF;
+            break;
+        case HELIOS_WLAN_MODE_STA:
+            vif = HELIOS_WLAN_STATION_IF;
+            break;
+        default:
+            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+    }
+    Helios_Wlan_Get_IPConfig(vif, &ipconfig);
+    mp_obj_t tuple[5] = {
+        mp_obj_new_str(ipconfig.ip, strlen(ipconfig.ip)),
+        mp_obj_new_str(ipconfig.netmask, strlen(ipconfig.netmask)),
+        mp_obj_new_str(ipconfig.gateway, strlen(ipconfig.gateway)),
+        mp_obj_new_str(ipconfig.dns_server[0], strlen(ipconfig.dns_server[0])),
+        mp_obj_new_str(ipconfig.dns_server[1], strlen(ipconfig.dns_server[1])),
+    };
+    return mp_obj_new_tuple(5, tuple);
 }
-MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_wlan_ifconfig_obj, 1, 2, network_wlan_ifconfig);
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_ifconfig_obj, 1, network_wlan_ifconfig);
 
+STATIC mp_obj_t network_wlan_netcfg(size_t n_args, const mp_obj_t* args, mp_map_t* kwargs) {
+    if (n_args != 1 && kwargs->used != 0) {
+        mp_raise_TypeError(MP_ERROR_TEXT("either pos or kw args are allowed"));
+    }
+    wlan_obj_t* self = MP_OBJ_TO_PTR(args[0]);
+    Helios_Wlan_Netcfg_Config_t config = { 0 };
+    static Helios_Wlan_Netcfg_Type_e s_type = HELIOS_WLAN_NETCFG_TYPE_SMARTCONFIG;
+    config.enable = true;
+    config.block = self->wlan_config.block;
+    config.type = s_type;
+    config.timeout = 120;
+    if (kwargs->used != 0) {
+        for (size_t i = 0; i < kwargs->alloc; i++) {
+            if (mp_map_slot_is_filled(kwargs, i)) {
+                switch (mp_obj_str_get_qstr(kwargs->table[i].key)) {
+                    case MP_QSTR_enable: {
+                        if (mp_obj_get_type(kwargs->table[i].value) != &mp_type_bool) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        config.enable = mp_obj_is_true(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_type: {
+                        if (mp_obj_get_int(kwargs->table[i].value) < HELIOS_WLAN_NETCFG_TYPE_SMARTCONFIG || mp_obj_get_int(kwargs->table[i].value) >= HELIOS_WLAN_NETCFG_TYPE_MAX) {
+                            return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                        }
+                        config.type = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    case MP_QSTR_timeout: {
+                        config.timeout = mp_obj_get_int(kwargs->table[i].value);
+                        break;
+                    }
+                    default:
+                        return MP_OBJ_NEW_SMALL_INT(HELIOS_WLAN_ERROR_PARAM_INVALID);
+                }
+            }
+        }
+    }
+    int ret = HELIOS_WLAN_ERROR_MAX;
+    if (config.enable) {
+        Helios_Wlan_Netcfg_Result_t result = { 0 };
+        ret = Helios_Wlan_Netcfg_Start(config, &result);
+        if (ret == HELIOS_WLAN_ERROR_OK || ret == HELIOS_WLAN_ERROR_WOULDBLOCK) {
+            s_type = config.type;
+        }
+        if (config.block && ret == HELIOS_WLAN_ERROR_OK) {
+            mp_obj_tuple_t* t = mp_obj_new_tuple(2, NULL);
+            /* ssid */
+            t->items[0] = mp_obj_new_str((char*)result.ssid, strlen((char*)result.ssid));
+            /* password */
+            t->items[1] = mp_obj_new_str((char*)result.pwd, strlen((char*)result.pwd));
+            return t;
+        }
+    } else {
+        if (Helios_Wlan_Get_Netcfg_Status() != HELIOS_WLAN_STATUS_NETCFG_NOT_INTO && s_type != config.type) {
+            ret = HELIOS_WLAN_ERROR_PARAM_INVALID;
+        } else {
+            ret = Helios_Wlan_Netcfg_Stop(config);
+        }
+    }
+    return MP_OBJ_NEW_SMALL_INT(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(network_wlan_netcfg_obj, 1, network_wlan_netcfg);
 
 /*=============================================================================*/
 /* FUNCTION: qpy_module_wlan_deinit                                         */
 /*=============================================================================*/
 /*!@brief: deinit w5500 module
- *     
+ *
  *
  * @return:
  *     0       -       success
  */
-/*=============================================================================*/
-STATIC mp_obj_t qpy_module_wlan_delete(mp_obj_t self_in)
-{
-       wlan_obj_t *self = MP_OBJ_TO_PTR(self_in);
-       Helios_Wlan_Stop(self->wlan_config.wifi_mode);
-       single_wlan = NULL;
-       g_wlan_mode = HELIOS_WLAN_UNKOWN;
-       return mp_obj_new_int(0);
+ /*=============================================================================*/
+STATIC mp_obj_t qpy_module_wlan_delete(mp_obj_t self_in) {
+    wlan_obj_t* self = MP_OBJ_TO_PTR(self_in);
+    Helios_Wlan_Stop(self->wlan_config.wifi_mode);
+    self->wlan_event_callback.cb = mp_const_none;
+    wlan_netif = NULL;
+    return mp_obj_new_int(0);
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_module_wlan_delete_obj, qpy_module_wlan_delete);
 
 
-STATIC const mp_rom_map_elem_t wlan_if_locals_dict_table[] = {
-       { MP_OBJ_NEW_QSTR(MP_QSTR___name__),MP_ROM_QSTR(MP_QSTR_WLAN) },
-       { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&qpy_module_wlan_delete_obj) },
+STATIC const mp_rom_map_elem_t wlan_netif_locals_dict_table[] = {
+    { MP_OBJ_NEW_QSTR(MP_QSTR___name__),MP_ROM_QSTR(MP_QSTR_WLAN) },
+    { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&qpy_module_wlan_delete_obj) },
+    { MP_ROM_QSTR(MP_QSTR_mode), MP_ROM_PTR(&network_wlan_mode_obj) },
     { MP_ROM_QSTR(MP_QSTR_active), MP_ROM_PTR(&network_wlan_active_obj) },
     { MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&network_wlan_connect_obj) },
     { MP_ROM_QSTR(MP_QSTR_disconnect), MP_ROM_PTR(&network_wlan_disconnect_obj) },
     { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&network_wlan_status_obj) },
     { MP_ROM_QSTR(MP_QSTR_scan), MP_ROM_PTR(&network_wlan_scan_obj) },
-    { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&network_wlan_isconnected_obj) },
     { MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&network_wlan_config_obj) },
     { MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&network_wlan_ifconfig_obj) },
+    { MP_ROM_QSTR(MP_QSTR_netcfg), MP_ROM_PTR(&network_wlan_netcfg_obj) },
+
+    /***************************************** CONSTANTS ***********************************************/
+
+    { MP_ROM_QSTR(MP_QSTR_SOFTAP_IF), MP_ROM_INT(HELIOS_WLAN_SOFTAP_IF)},
+    { MP_ROM_QSTR(MP_QSTR_STATION_IF), MP_ROM_INT(HELIOS_WLAN_STATION_IF)},
+
+    { MP_ROM_QSTR(MP_QSTR_NETCFG_SMARTCONFIG), MP_ROM_INT(HELIOS_WLAN_NETCFG_TYPE_SMARTCONFIG)},
+    { MP_ROM_QSTR(MP_QSTR_NETCFG_WEBCONFIG), MP_ROM_INT(HELIOS_WLAN_NETCFG_TYPE_WEBCONFIG)},
+    { MP_ROM_QSTR(MP_QSTR_NETCFG_BLECONFIG), MP_ROM_INT(HELIOS_WLAN_NETCFG_TYPE_BLECONFIG)},
+
+    { MP_ROM_QSTR(MP_QSTR_AUTH_OPEN), MP_ROM_INT(HELIOS_WLAN_AUTH_OPEN) },
+    { MP_ROM_QSTR(MP_QSTR_AUTH_WEP), MP_ROM_INT(HELIOS_WLAN_AUTH_WEP) },
+    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA_PSK) },
+    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA2_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA2_PSK) },
+    { MP_ROM_QSTR(MP_QSTR_AUTH_WPA_WPA2_PSK), MP_ROM_INT(HELIOS_WLAN_AUTH_WPA_WPA2_PSK) },
 };
-STATIC MP_DEFINE_CONST_DICT(wlan_if_locals_dict, wlan_if_locals_dict_table);
+STATIC MP_DEFINE_CONST_DICT(wlan_netif_locals_dict, wlan_netif_locals_dict_table);
 
-const mp_obj_type_t wlan_if_type = {
-    .base={ &mp_type_type }, 
+const mp_obj_type_t wlan_netif_type = {
+    .base = { &mp_type_type },
     .name = MP_QSTR_WLAN,
     .make_new = wlan_make_new,
-    .locals_dict = (mp_obj_dict_t*)&wlan_if_locals_dict,
+    .locals_dict = (mp_obj_dict_t*)&wlan_netif_locals_dict,
 };
 
 #endif // MICROPY_PY_NETWORK_WLAN
index 94ccbbc..aa82c7e 100644 (file)
@@ -455,10 +455,7 @@ STATIC mp_obj_t wlan_5803w_active(size_t n_args, const mp_obj_t *args)
         bool active = mp_obj_is_true(args[1]);
         MP_THREAD_GIL_EXIT();
                if( active ) {
-                       ret += Helios_WLAN_5803W_AP_SetSSID(self->wlan_5803_config.ssid);
-                       ret += Helios_WLAN_5803W_AP_SetAuthConfig(self->wlan_5803_config.secmode, self->wlan_5803_config.encmode, self->wlan_5803_config.pass);
-                       ret += Helios_WLAN_5803W_AP_SetChannelConfig(self->wlan_5803_config.chan_mode, self->wlan_5803_config.channel, self->wlan_5803_config.b40acs);
-            ret += Helios_WLAN_5803W_SetMAC(self->wlan_5803_config.mac);
+            ret = Helios_WLAN_5803W_AP_SetAllCfg(&(self->wlan_5803_config));
                        if(ret != HELIOS_WLAN_5803W_OK) {
                            MP_THREAD_GIL_ENTER();
                                return mp_obj_new_int(HELIOS_WLAN_5803W_FAIL);
@@ -570,6 +567,16 @@ STATIC mp_obj_t wlan_5803w_status(size_t n_args, const mp_obj_t *args)
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(wlan_5803w_status_obj, 1, 2, wlan_5803w_status);
 
+STATIC mp_obj_t set_default_network_card(mp_obj_t self_in, mp_obj_t ip_str) {
+    wlan_5803_obj_t *self = (wlan_5803_obj_t *)MP_OBJ_TO_PTR(self_in);
+       char *m_ip_str = NULL;
+
+    m_ip_str = (char *)mp_obj_str_get_str(ip_str);
+       
+    return mp_obj_new_int(Helios_WLAN_5803W_SetDefaultNetworkCard(m_ip_str));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_default_network_card_obj, set_default_network_card);
+
 /*=============================================================================*/
 /* FUNCTION: qpy_module_asr5803w_deinit                                         */
 /*=============================================================================*/
@@ -596,6 +603,7 @@ STATIC const mp_rom_map_elem_t ASR5803W_locals_dict_table[] = {
        { MP_ROM_QSTR(MP_QSTR_active), MP_ROM_PTR(&wlan_5803w_active_obj) },
        { MP_ROM_QSTR(MP_QSTR_isconnected), MP_ROM_PTR(&wlan_5803w_isconnected_obj) },
        { MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&wlan_5803w_status_obj) },
+    { MP_ROM_QSTR(MP_QSTR_set_default_NIC), MP_ROM_PTR(&set_default_network_card_obj) },
 };
 STATIC MP_DEFINE_CONST_DICT(ASR5803W_locals_dict, ASR5803W_locals_dict_table);
 
index 12504b4..4066f3a 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 #include <stdint.h>
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include "quec_proj_config.h"
 #endif
 #include "mpconfigboard.h"
 #endif
 
 
-//#if defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_RDA) || defined(PLAT_Qualcomm) || defined(PLAT_ASR)
+#if !(defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)) || defined(PLAT_aic8800m40)
 #define MICROPY_PY_REPL_PASSWORD_PROTECT (1)
-//#endif
+#endif
 
        // options to control how MicroPython is built
 #define MICROPY_ENABLE_COMPILER                (1)
 #define MICROPY_ENABLE_GC                      (1)
 #define MICROPY_HELPER_REPL                    (1)
 #define MICROPY_ENABLE_DOC_STRING              (0)
-#define MICROPY_ERROR_REPORTING                        (MICROPY_ERROR_REPORTING_NORMAL)
 
+#if (defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
+#define MICROPY_ERROR_REPORTING                        (MICROPY_ERROR_REPORTING_TERSE)
+#else
+#define MICROPY_ERROR_REPORTING                        (MICROPY_ERROR_REPORTING_NORMAL)
+#endif
 
 #if MICROPY_ENABLE_GC
 #ifndef MICROPY_QPY_GC_HEAP_SIZE
 #define MP_QPY_TASK_STACK_SIZE      (32 * 1024)
 #elif defined(PLAT_EIGEN)
 #define MP_QPY_TASK_STACK_SIZE      (32 * 1024)
+#elif defined(PLAT_EIGEN_718)
+#define MP_QPY_TASK_STACK_SIZE      (32 * 1024)
 #elif defined(PLAT_ECR6600)
 #define MP_QPY_TASK_STACK_SIZE      (8 * 1024)
-#elif defined(PLAT_Unisoc_8850)
-       #if defined(BOARD_EC600GCN_LD) || defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_LD_HRXM) || defined(BOARD_EC600GCN_LD_YM)
+#elif defined(PLAT_aic8800m40)
+#define MP_QPY_TASK_STACK_SIZE      (10 * 1024)
+#elif defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
+       #if defined(BOARD_EC600GCN_LD) || defined(BOARD_EC800GCN_LD) || defined(BOARD_EC800GCN_LD_XBND) \
+       || defined(BOARD_EC800GCN_LD_HRXM) || defined(BOARD_EC600GCN_LD_YM) || defined(BOARD_EC800GCN_TT) \
+       || defined(BOARD_EG800GLA_LD)
                #define MP_QPY_TASK_STACK_SIZE      (16 * 1024)
        #else
                #define MP_QPY_TASK_STACK_SIZE      (64 * 1024)
 #endif
 #endif
 
+#if !(defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
 #define MICROPY_STACK_CHECK                                    (1)
+#endif
 #define MICROPY_PY_BUILTINS_BYTEARRAY          (1)
 #define MICROPY_PY_BUILTINS_DICT_FROMKEYS      (0)
 #define MICROPY_PY_BUILTINS_MEMORYVIEW                 (1)
 #define MICROPY_PY_IO_FILEIO                           (1)
 #define MICROPY_PY_BUILTINS_INPUT              (1)
 
-#if defined(PLAT_ASR_1803s) && MICROPY_QPY_MODULE_VFS_FAT_EMMC
+#if (defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)) && MICROPY_QPY_MODULE_VFS_FAT_SDIO
 
-#define MICROPY_VFS_FAT_EMMC                           (1)
+#define MICROPY_VFS_FAT_SDIO                           (1)
 
 #endif
 
 #define MICROPY_USE_INTERNAL_PRINTF            (0)
 #define MICROPY_REPL_AUTO_INDENT               (1)
        //baron 2020/04/17
+#if !(defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
 #define MICROPY_REPL_EMACS_WORDS_MOVE          (1)
 #define MICROPY_REPL_EMACS_KEYS                                (1)
 #define MICROPY_REPL_EMACS_EXTRA_WORDS_MOVE (1)
 #define MICROPY_REPL_PASSWORD_PROTECT       (1)  //mia.zhong @20220224
+#endif
 #define MICROPY_PY_BUILTINS_HELP            (1)
 
 //#define MICROPY_PY_BUILTINS_HELP_TEXT       quecpython_help_text
 
 
        //ext modules
-#define MICROPY_PY_UWEBSOCKET               (0)
+#define MICROPY_PY_UWEBSOCKET               (1)
 #define MICROPY_PY_UCTYPES                     (MICROPY_QPY_PY_UCTYPES)
 #define MICROPY_PY_UZLIB                       (MICROPY_QPY_PY_UZLIB)
 #define MICROPY_PY_UJSON                       (1)
 #if MICROPY_QPY_MODULE_UHASHLIB_ONLYMD5
 #define MICROPY_PY_UHASHLIB                            (1)
 #define MICROPY_PY_UHASHLIB_SHA256                     (0)
+#if MICROPY_QPY_MODULE_UHASHLIB_SHA1
+#define MICROPY_PY_UHASHLIB_SHA1                       (1)
+#define MICROPY_PY_UHASHLIB_ONLYSHA1           (1)
+#else
 #define MICROPY_PY_UHASHLIB_SHA1                       (0)
+#endif
+
 #define MICROPY_PY_UHASHLIB_MD5                        (1)
 #else
 #define MICROPY_PY_UHASHLIB                            (1)
 
 #if MICROPY_QPY_MODULE_UCRYPTOLIB
 #define MICROPY_PY_UCRYPTOLIB                          (1)
+#if !(defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
 #define MICROPY_PY_UCRYPTOLIB_CTR                      (1)
 #define MICROPY_PY_UCRYPTOLIB_CONSTS           (1)     
 #define MICROPY_PY_UCRYPTOLIB_GCM              (1)
 #define MICROPY_PY_UCRYPTOLIB_WRAP             (1)
 #endif
 
+#if MICROPY_QPY_UCRYPTOLIB_ECDSA
+#define MICROPY_PY_UCRYPTOLIB_ECDSA         (1)
+#endif
+
+#if MICROPY_QPY_UCRYPTOLIB_ECDH
+#define MICROPY_PY_UCRYPTOLIB_ECDH          (1)
+#endif
+
+#endif
+
 #endif
 
 #if !defined(PLAT_RDA)
 
 #define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1))
 #define MICROPY_ENABLE_FINALISER (1) // Pawn 2020/11/03
-#define MICROPY_ROM_TEXT_COMPRESSION    (0)
 
+#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+    || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
+#define MICROPY_ROM_TEXT_COMPRESSION    (1)
+#endif
 
 #define MICROPY_ENABLE_DEVICE_REPORT          (MICROPY_QPY_DEVICE_REPORT)
 
@@ -454,6 +493,13 @@ extern const struct _mp_obj_module_t mp_module_sms;
 #define MICROPY_PORT_BUILTIN_MODULES_SMS
 #endif
 
+#if MICROPY_QPY_MODULE_USSD
+extern const struct _mp_obj_module_t mp_module_ussd;
+#define MICROPY_PORT_BUILTIN_MODULES_USSD            { MP_OBJ_NEW_QSTR(MP_QSTR_ussd), (mp_obj_t)&mp_module_ussd},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_USSD
+#endif
+
 #if MICROPY_QPY_MODULE_SIM
 extern const struct _mp_obj_module_t mp_module_sim;
 #define MICROPY_PORT_BUILTIN_MODULES_SIM            { MP_OBJ_NEW_QSTR(MP_QSTR_sim), (mp_obj_t)&mp_module_sim},
@@ -518,6 +564,13 @@ extern const struct _mp_obj_type_t mp_G729_type;
 #define MICROPY_PORT_BUILTIN_MODULES_G729
 #endif
 
+#if MICROPY_QPY_MODULE_G722
+extern const struct _mp_obj_type_t mp_G722_type;
+#define MICROPY_PORT_BUILTIN_MODULES_G722           { MP_OBJ_NEW_QSTR(MP_QSTR_G722), (mp_obj_t)&mp_G722_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_G722
+#endif
+
 
 
 #if MICROPY_QPY_MODULE_QUECIOT
@@ -548,7 +601,14 @@ extern const struct _mp_obj_module_t mp_module_wifilocator;
 #define MICROPY_PORT_BUILTIN_MODULES_WIFILOCATOR
 #endif
 
-#if MICROPY_QPY_MODULE_ETHERNET
+#if MICROPY_QPY_MODULE_WIFI
+extern const struct _mp_obj_module_t mp_module_wifi;
+#define MICROPY_PORT_BUILTIN_MODULES_WIFI   { MP_OBJ_NEW_QSTR(MP_QSTR_wifi), (mp_obj_t)&mp_module_wifi },
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_WIFI
+#endif
+
+#if MICROPY_QPY_MODULE_ETHERNET || CONFIG_ETHERNET
 extern const struct _mp_obj_module_t mp_module_ethernet;
 #define MICROPY_PORT_BUILTIN_MODULES_ETHERNET       { MP_OBJ_NEW_QSTR(MP_QSTR_ethernet), (mp_obj_t)&mp_module_ethernet },
 #else
@@ -611,7 +671,7 @@ extern const struct _mp_obj_module_t module_SecureData;
 #define MICROPY_PORT_BUILTIN_MODULES_SECUREDATA
 #endif
 
-#if MICROPY_QPY_MODULE_SLIP
+#if MICROPY_QPY_MODULE_SLIP || CONFIG_SLIP
 extern const struct _mp_obj_module_t module_slip;
 #define MICROPY_PORT_BUILTIN_MODULES_SLIP           { MP_OBJ_NEW_QSTR(MP_QSTR_slip), (mp_obj_t)&module_slip},
 #else
@@ -700,7 +760,6 @@ extern const struct _mp_obj_type_t ALIPAY_type;
 #else
 #define MICROPY_PORT_BUILTIN_MODULES_ALIPAY
 #endif
-
 #if 1 //MICROPY_QPY_MODULE_Gsensor
 extern const struct _mp_obj_module_t mp_module_Gsensor;
 #define MICROPY_PORT_BUILTIN_MODULES_Gsensor           { MP_OBJ_NEW_QSTR(MP_QSTR_Gsensor), (mp_obj_t)&mp_module_Gsensor},
@@ -729,14 +788,16 @@ extern const struct _mp_obj_module_t mp_module_Hsensor;
 // #else
 // #define MICROPY_PORT_BUILTIN_MODULES_VideoCall
 // #endif
-#if CONFIG_juphoon
+#if CONFIG_juphoon || MICROPY_QPY_MODULE_JRTC
 extern const struct _mp_obj_module_t mp_module_jrtc;
 #define MICROPY_PORT_BUILTIN_MODULES_JRTC            { MP_OBJ_NEW_QSTR(MP_QSTR_jrtc), (mp_obj_t)&mp_module_jrtc},
 #else
 #define MICROPY_PORT_BUILTIN_MODULES_JRTC
 #endif
+
 extern const struct _mp_obj_module_t mp_module_code128;
 #define MICROPY_PORT_BUILTIN_MODULES_code128           { MP_OBJ_NEW_QSTR(MP_QSTR_code128), (mp_obj_t)&mp_module_code128 }, /* ע��`code128`ģ�� */ 
+
 #if MICROPY_QPY_MODULE_NETWORK
 extern const struct _mp_obj_module_t mp_module_network;
 #define MICROPY_PORT_BUILTIN_MODULES_NETWORK       { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&mp_module_network },
@@ -744,6 +805,64 @@ extern const struct _mp_obj_module_t mp_module_network;
 #define MICROPY_PORT_BUILTIN_MODULES_NETWORK
 #endif
 
+#if MICROPY_QPY_MODULE_ALIPAY_COLLECTION
+extern const struct _mp_obj_type_t ALIPAY_COLLECTION_type;
+#define MICROPY_PORT_BUILTIN_MODULES_ALIPAY_COLLECTION         { MP_OBJ_NEW_QSTR(MP_QSTR_ALIPAY_COLLECTION), (mp_obj_t)&ALIPAY_COLLECTION_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_ALIPAY_COLLECTION
+#endif
+
+#if MICROPY_QPY_MODULE_GPIO_ENCODER
+extern const struct _mp_obj_type_t encoder_type;
+#define MICROPY_PORT_BUILTIN_MODULES_GPIO_ENCODER              { MP_OBJ_NEW_QSTR(MP_QSTR_encoder), (mp_obj_t)&encoder_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_GPIO_ENCODER
+#endif
+
+#if MICROPY_QPY_MODULE_SIF
+extern const struct _mp_obj_module_t mp_module_modsif;
+#define MICROPY_PORT_BUILTIN_MODULES_SIF               { MP_OBJ_NEW_QSTR(MP_QSTR_sif), (mp_obj_t)&mp_module_modsif},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_SIF
+#endif
+
+
+
+#if MICROPY_QPY_MODULE_NFC
+extern const struct _mp_obj_module_t mp_module_nfc;
+#define MICROPY_PORT_BUILTIN_MODULES_NFC            { MP_OBJ_NEW_QSTR(MP_QSTR_nfc), (mp_obj_t)&mp_module_nfc},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_NFC
+#endif
+
+#if MICROPY_QPY_MODULE_STK
+extern const struct _mp_obj_module_t mp_module_stk;
+#define MICROPY_PORT_BUILTIN_MODULES_STK           { MP_OBJ_NEW_QSTR(MP_QSTR_stk), (mp_obj_t)&mp_module_stk},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_STK
+#endif
+
+#if MICROPY_QPY_MODULE_ALIPAY_SE
+extern const struct _mp_obj_type_t ALIPAY_SE_type;
+#define MICROPY_PORT_BUILTIN_MODULES_ALIPAY_SE         { MP_OBJ_NEW_QSTR(MP_QSTR_ALIPAY_SE), (mp_obj_t)&ALIPAY_SE_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_ALIPAY_SE
+#endif
+
+#if MICROPY_QPY_MODULE_VOIP
+extern const struct _mp_obj_type_t mp_voip_type;
+#define MICROPY_PORT_BUILTIN_MODULES_VOIP              { MP_OBJ_NEW_QSTR(MP_QSTR_voip), (mp_obj_t)&mp_voip_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_VOIP
+#endif
+
+#if MICROPY_QPY_MODULE_IPSEC
+extern const struct _mp_obj_type_t mp_ipsec_type;
+#define MICROPY_PORT_BUILTIN_MODULES_IPSEC             { MP_OBJ_NEW_QSTR(MP_QSTR_ipsec), (mp_obj_t)&mp_ipsec_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_IPSEC
+#endif
+
 //////////////////
 
 #define MICROPY_PORT_BUILTIN_MODULES \
@@ -761,6 +880,7 @@ extern const struct _mp_obj_module_t mp_module_network;
                MICROPY_PORT_BUILTIN_MODULES_UTILS \
                MICROPY_PORT_BUILTIN_MODULES_HMACSHA1 \
                MICROPY_PORT_BUILTIN_MODULES_SMS \
+               MICROPY_PORT_BUILTIN_MODULES_USSD \
                MICROPY_PORT_BUILTIN_MODULES_VOICECALL \
                MICROPY_PORT_BUILTIN_MODULES_SECUREDATA \
                MICROPY_PORT_BUILTIN_MODULES_SIM \
@@ -772,6 +892,7 @@ extern const struct _mp_obj_module_t mp_module_network;
                MICROPY_PORT_BUILTIN_MODULES_AUDIO \
                MICROPY_PORT_BUILTIN_MODULES_ETHERNET \
                MICROPY_PORT_BUILTIN_MODULES_WIFILOCATOR \
+               MICROPY_PORT_BUILTIN_MODULES_WIFI \
                MICROPY_PORT_BUILTIN_MODULES_FOTA \
                MICROPY_PORT_BUILTIN_MODULES_LVGL \
                MICROPY_PORT_BUILTIN_MODULES_QRCODE \
@@ -798,13 +919,24 @@ extern const struct _mp_obj_module_t mp_module_network;
                MICROPY_PORT_BUILTIN_MODULES_EXTGPIO_AW9523 \
                MICROPY_PORT_BUILTIN_MODULES_ALIPAY \
                MICROPY_PORT_BUILTIN_MODULES_G729 \
+               MICROPY_PORT_BUILTIN_MODULES_G722 \
                MICROPY_PORT_BUILTIN_MODULES_Gsensor \
                MICROPY_PORT_BUILTIN_MODULES_ENCODER \
                MICROPY_PORT_BUILTIN_MODULES_Hsensor \
                MICROPY_PORT_BUILTIN_MODULES_JRTC \
                MICROPY_PORT_BUILTIN_MODULES_code128\
                MICROPY_PORT_BUILTIN_MODULES_WEBSOCKET_MASK\
-               MICROPY_PORT_BUILTIN_MODULES_NETWORK
+               MICROPY_PORT_BUILTIN_MODULES_NETWORK \
+               MICROPY_PORT_BUILTIN_MODULES_ALIPAY_COLLECTION \
+               MICROPY_PORT_BUILTIN_MODULES_GPIO_ENCODER \
+               MICROPY_PORT_BUILTIN_MODULES_SIF\
+               MICROPY_PORT_BUILTIN_MODULES_NFC \
+               MICROPY_PORT_BUILTIN_MODULES_STK \
+               MICROPY_PORT_BUILTIN_MODULES_ALIPAY_SE \
+               MICROPY_PORT_BUILTIN_MODULES_VOIP \
+               MICROPY_PORT_BUILTIN_MODULES_IPSEC
+
+               
 
 // use vfs's functions for import stat and builtin open
 #define mp_import_stat mp_vfs_import_stat
index bd4bc72..3eef8c5 100644 (file)
 #include "helios_rtc.h"
 #include "stackctrl.h"
 #include "runtime.h"
+#if defined(PLAT_RDA)
+#include "helios_debug.h"
+#include "helios_fs.h"
+#endif
 
 STATIC uint8_t stdin_ringbuf_array[256];
 ringbuf_t stdin_ringbuf = {stdin_ringbuf_array, sizeof(stdin_ringbuf_array), 0, 0};
@@ -164,9 +168,47 @@ int mp_hal_stdin_rx_chr(void)
 void mp_hal_stdout_tx_strn(const char *str, size_t len)
 {
        if (!str|| !len) return;
-    if(MP_HAL_PORT_CHECK_OPEN) {
-       Helios_UART_Write(QPY_REPL_UART, (void *)str, len);
-    }
+
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)
+       extern int qpy_log_port;
+       extern unsigned char b_init;
+       if(b_init == 0)
+       {
+               if(Helios_NV_File_Exist(PYLOG_PORT_CFG_FILE) == 0)//file not exist
+           {
+                       //not cfg, repl port
+           }
+               else
+               {
+                       if(Helios_NV_File_Read(PYLOG_PORT_CFG_FILE, (void *)&qpy_log_port,sizeof(int)))
+                       {
+                               helios_debug("read PYLOG_PORT_CFG_FILE fail\n");
+                               qpy_log_port = 0;
+                       }
+                       else
+                       {
+                       
+                       }
+               }
+               b_init = 1;
+       }
+       if(qpy_log_port)
+       {
+               Helios_Debug_Trace((char*)str,len);
+       }
+       else
+       {
+               if(MP_HAL_PORT_CHECK_OPEN) 
+               {
+               Helios_UART_Write(QPY_REPL_UART, (void *)str, len);
+           }
+       }
+#else
+       if(MP_HAL_PORT_CHECK_OPEN) 
+       {
+               Helios_UART_Write(QPY_REPL_UART, (void *)str, len);
+       }
+#endif
 }
 
 uint32_t mp_hal_ticks_ms(void) 
index 161dfce..28c5cf4 100644 (file)
@@ -33,7 +33,7 @@
 #define                HAL_TICK1S      32.768
 #define QPY_REPL_UART   HELIOS_UART3
 #define HELIOS_UART_BAUD   HELIOS_UART_BAUD_115200
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 #define                HAL_TICK1S      3.25
 #define QPY_REPL_UART   HELIOS_UART3
 #define HELIOS_UART_BAUD   HELIOS_UART_BAUD_115200
 #define        HAL_TICK1S      0.5
 #define QPY_REPL_UART   HELIOS_UART2
 #define HELIOS_UART_BAUD   HELIOS_UART_BAUD_115200
+#elif defined(PLAT_aic8800m40)
+#define                HAL_TICK1S      32.768
+#define QPY_REPL_UART   HELIOS_UART1
+#define HELIOS_UART_BAUD   HELIOS_UART_BAUD_115200
 #else
 #define                HAL_TICK1S      32.768
 #define QPY_REPL_UART   HELIOS_UART3
index 82bc88c..906f9cd 100644 (file)
@@ -163,7 +163,11 @@ int mp_thread_create_ex(void *(*entry)(void *), void *arg, size_t *stack_size, i
     th->stack = Helios_Thread_GetStaskPtr(th->id);
 
        //stack_len must be 1/4 of ThreadAttr.stack_size 
-    th->stack_len = ThreadAttr.stack_size / sizeof(uint32_t);
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    th->stack_len = ThreadAttr.stack_size;
+#else
+       th->stack_len = ThreadAttr.stack_size / sizeof(uint32_t);
+#endif
     th->next = thread;
     thread = th;
 
@@ -189,8 +193,11 @@ void mp_new_thread_add(uint32_t th_id, uint32_t stack_size) {
     th->ready = 0;
     th->arg = NULL;
     th->stack = Helios_Thread_GetStaskPtr((Helios_Thread_t)th->id);
-       
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    th->stack_len = stack_size;
+#else
     th->stack_len = stack_size / sizeof(uint32_t);
+#endif
     th->next = thread;
     thread = th;
 }
index 9f642bf..d21aee2 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "helios_os.h"
 
-#if defined(PLAT_EIGEN) || defined(PLAT_ECR6600)
+#if defined(PLAT_EIGEN) || defined(PLAT_ECR6600) || defined(PLAT_EIGEN_718) || defined(PLAT_aic8800m40)
 #define MP_THREAD_MIN_STACK_SIZE                        (4 * 1024)
 #define MP_THREAD_DEFAULT_STACK_SIZE                    (2*MP_THREAD_MIN_STACK_SIZE)
 #else
index bdb9343..35ee66a 100644 (file)
 #include "helios_debug.h"
 
 
-#if !defined(PLAT_RDA)
+//#if !defined(PLAT_RDA)
 #if CONFIG_MBEDTLS
 #include "mbedtls_init.h"
 #endif
-#endif
+//#endif
 
 Helios_Thread_t ql_micropython_task_ref;
 
@@ -50,7 +50,8 @@ Helios_Thread_t ql_micropython_task_ref;
 #define MP_TASK_STACK_SIZE      (MP_QPY_TASK_STACK_SIZE)
 #define MP_TASK_STACK_LEN       (MP_TASK_STACK_SIZE/sizeof(uint32_t))
 
-#if (defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)) //support
+#if (defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Qualcomm) \
+    || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR_1602)) //support
 #define QPY_ASSERT_SUPPORT 1
 #endif
 
@@ -157,33 +158,6 @@ static int vm_softreset_flag = 0;
 #define SOFTRESET_FLAG_TRUE() (1 == vm_softreset_flag)
 #define SOFTRESET_FLAG_FALSE() (0 == vm_softreset_flag)
 #endif
-typedef enum
-{      
-       QL_LOG_BSP_MASK           = 0x0000000000000001,
-               
-       QL_LOG_OS_MASK            = 0x0000000000000002,
-       
-       QL_LOG_FS_MASK            = 0x0000000000000004,
-       
-       QL_LOG_TCPIP_MASK         = 0x0000000000000008,
-       
-       QL_LOG_MQTT_MASK          = 0x0000000000000010,
-       
-       QL_LOG_APP_MASK           = 0x0000000000000020,
-       
-}ql_log_module_mask;
-
-
-typedef enum
-{
-       QL_LOG_PORT_UART = 0x1,
-       QL_LOG_PORT_USB  = 0x2,
-}ql_log_port_mask;
-
-void ql_log_mask_set(unsigned        long long module_mask, unsigned long port_mask);
-
-
-
 void quecpython_task(void *arg)
 {
        Helios_Thread_t id = 0;
@@ -194,32 +168,36 @@ void quecpython_task(void *arg)
     extern void qpy_poc_register_task();
     qpy_poc_register_task();
     #endif
-
-    ql_log_mask_set((unsigned long long)QL_LOG_APP_MASK,(unsigned long)QL_LOG_PORT_USB);
-
-    
     //Added by Freddy @20210520 在线程sleep时,通过wait queue的方式超时代替实际的sleep,
     //当有callback执行时,给此queue发消息即可快速执行callback
     mp_mthread_sleep_deal_init();
 
-#if !defined(PLAT_RDA)
+//#if !defined(PLAT_RDA)
 #if CONFIG_MBEDTLS
     mbedtls_platform_setup(NULL);
 #endif
-#endif
+//#endif
 
        #if MICROPY_PY_THREAD
     id = Helios_Thread_GetID();
     ql_micropython_task_ref = id;
     stack_ptr = Helios_Thread_GetStaskPtr(id);
-       mp_thread_init(stack_ptr, MP_TASK_STACK_LEN);
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+    mp_thread_init(stack_ptr, MP_TASK_STACK_SIZE);   // unit: Word
+#else
+    mp_thread_init(stack_ptr, MP_TASK_STACK_LEN);
+#endif
        #endif
 
        if(mp_hal_stdio_init()) return;
 
 soft_reset:
        mp_stack_set_top((void *)&stack_dummy);
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)  // unit: Byte
+    mp_stack_set_limit(MP_TASK_STACK_SIZE * sizeof(uint32_t) - 1024);
+#else
     mp_stack_set_limit(MP_TASK_STACK_SIZE - 1024);
+#endif
     stack_top = (char*)&stack_dummy;
     #if MICROPY_ENABLE_GC
     gc_init(heap, heap + sizeof(heap));
@@ -238,8 +216,10 @@ soft_reset:
        pyexec_frozen_module("_boot_Qualcomm.py");
 #elif defined(BOARD_EC800ECN_LC_WDF)
     pyexec_frozen_module("_boot_WDF.py");//EIGEN WDF CUNSTOMER BOOT WITH SINGEL FILE SYSTEM
-#elif defined(PLAT_ECR6600)
+#elif defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
     pyexec_frozen_module("_boot_WIFI.py");
+#elif defined(BOARD_EC600GCN_LA_CDD)
+    pyexec_frozen_module("_boot_dsds.py");
 #else
     pyexec_frozen_module("_boot.py");
 #endif
@@ -357,6 +337,23 @@ int DEBUG_printf(const char *fmt, ...)
     va_end(ap);
     return ret;
 }
+#if defined(PLAT_aic8800m40)
+static Helios_Thread_t taskRef = 0;
+void ql_app_main()
+{
+    
 
+    Helios_ThreadAttr ThreadAttr = {
+            .name = "quecpython_task",
+            .stack_size = MP_TASK_STACK_SIZE,
+            .priority = 100,
+            .entry = quecpython_task,
+            .argv = NULL
+        };
+    taskRef = Helios_Thread_Create(&ThreadAttr);
+}
+#else
 application_init(quecpython_task, "quecpython_task", (MP_TASK_STACK_SIZE)/1024, 0);
 
+#endif
+
index c60ea7b..590280c 100644 (file)
@@ -37,7 +37,13 @@ uint32_t qpy_rng_get(void)
     char imei_str[30];
     memset(imei_str, 0, sizeof(imei_str));
     int64_t ticks_us = Helios_RTC_GetTicks();
-    Helios_Dev_GetIMEI(imei_str, sizeof(imei_str));
+    #if MICROPY_QPY_MODULE_DSDS
+    extern int _get_current_simid(void);
+       int cur_simid = _get_current_simid();
+    Helios_Dev_GetIMEI(imei_str, sizeof(imei_str),cur_simid);
+    #else
+    Helios_Dev_GetIMEI(imei_str, sizeof(imei_str),0);
+    #endif
     int64_t imei_dig = 0;
     for(unsigned int i = 0; i < strlen(imei_str); i++)
     {
index f472372..9f454ed 100644 (file)
  * limitations under the License.
  */
 
+#include "mphalport.h"
+#if MICROPY_QPY_MODULE_ESIM_IPA
+#include "sim_esim_ipa.c"
+#else
 #include "stdio.h"
 #include "stdlib.h"
 #include "obj.h"
 #include "runtime.h"
-#include "mphalport.h"
-
 #if MICROPY_QPY_MODULE_ESIM
-
 #include "helios_os.h"
 #include "helios_debug.h"
 #include "helios_esim.h"
@@ -220,6 +221,28 @@ exit:
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_report_notification_obj, qpy_esim_report_notification);
 
+#if MICROPY_QPY_MODULE_ESIM_SUPPORT_NTF_SEQNUM
+STATIC mp_obj_t qpy_esim_report_notification_by_seqnum(const mp_obj_t seqnum)
+{
+    int ret = -1;
+    mp_buffer_info_t qpy_iccid = {0};
+    int report_seqnum = mp_obj_get_int(seqnum);
+    QPY_MODLPA_LOG("[ESIM] report_seqnum is %d.\r\n", report_seqnum);
+    ret = _qpy_esim_mutex_init();
+    if (ret != 0)
+        goto exit;
+
+    MP_THREAD_GIL_EXIT();
+    Helios_Mutex_Lock(g_qpy_esim_mutex, HELIOS_WAIT_FOREVER);
+    ret = Helios_Esim_LPA_Report_Notifications_By_Seqnum(report_seqnum);
+    Helios_Mutex_Unlock(g_qpy_esim_mutex);
+    MP_THREAD_GIL_ENTER();
+exit:
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_report_notification_by_seqnum_obj, qpy_esim_report_notification_by_seqnum);
+#endif
+
 /*STATIC mp_obj_t qpy_esim_remove_notification(const mp_obj_t seqnum)
 {
     int ret = 0;
@@ -243,7 +266,7 @@ STATIC mp_obj_t qpy_esim_get_notification(void)
 
     MP_THREAD_GIL_EXIT();
     Helios_Mutex_Lock(g_qpy_esim_mutex, HELIOS_WAIT_FOREVER);
-    ret = Helios_Esim_LPA_Get_Notifications(&info);
+    ret = Helios_Esim_LPA_Get_Notifications(ESIM_NOTIFICATION_TYPE_DELETE, &info);
     Helios_Mutex_Unlock(g_qpy_esim_mutex);
     MP_THREAD_GIL_ENTER();
     if (ret == 0)
@@ -251,12 +274,16 @@ STATIC mp_obj_t qpy_esim_get_notification(void)
         int i = 0;
                for (i = 0; i <info.info_num; i++)
                {
-            mp_obj_t notification_info[2] = {
-                       mp_obj_new_int(info.info_list[i].seqnum),
-                       mp_obj_new_str(info.info_list[i].iccid, strlen(info.info_list[i].iccid))};
-
-               mp_obj_list_append(list_profile, mp_obj_new_tuple(2, notification_info));
-               }
+            // lxy modify 0925
+            mp_obj_t notification_info[3] =
+                {
+                    mp_obj_new_int(info.info_list[i].seqnum),
+                    mp_obj_new_str(info.info_list[i].iccid, strlen(info.info_list[i].iccid)),
+                    mp_obj_new_int(info.info_list[i].ntf_event)
+                };
+
+            mp_obj_list_append(list_profile, mp_obj_new_tuple(3, notification_info));       // lxy modify 0925
+        }
     }
 exit:
     {
@@ -269,6 +296,52 @@ exit:
     }
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_esim_get_notification_obj, qpy_esim_get_notification);
+
+// Ewan.liu add for ws in 24.10.10
+#if MICROPY_QPY_MODULE_ESIM_SUPPORT_NTF_SEQNUM
+STATIC mp_obj_t qpy_esim_get_notification_by_seqnum(const mp_obj_t seqnum)
+{
+    int ret = 0;
+    int qpy_seqnum = mp_obj_get_int(seqnum);
+    Helios_Esim_Notifications_Info_List info = {0};
+    mp_obj_t list_profile = mp_obj_new_list(0, NULL);
+
+    ret = _qpy_esim_mutex_init();
+    if (ret != 0)
+        goto exit;
+
+    MP_THREAD_GIL_EXIT();
+    Helios_Mutex_Lock(g_qpy_esim_mutex, HELIOS_WAIT_FOREVER);
+    ret = Helios_Esim_LPA_Get_Notifications(qpy_seqnum, &info);
+    Helios_Mutex_Unlock(g_qpy_esim_mutex);
+    MP_THREAD_GIL_ENTER();
+    if (ret == 0)
+    {
+        int i = 0;
+        for (i = 0; i < info.info_num; i++)
+        {
+            // lxy modify 0925
+            mp_obj_t notification_info[3] =
+                {
+                    mp_obj_new_int(info.info_list[i].seqnum),
+                    mp_obj_new_str(info.info_list[i].iccid, strlen(info.info_list[i].iccid)),
+                    mp_obj_new_int(info.info_list[i].ntf_event)};
+
+            mp_obj_list_append(list_profile, mp_obj_new_tuple(3, notification_info)); // lxy modify 0925
+        }
+    }
+exit:
+    {
+    mp_obj_t tuple[2] =
+        {
+            mp_obj_new_int(info.info_num),
+            list_profile,
+        };
+    return mp_obj_new_tuple(2, tuple);
+    }
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_get_notification_by_seqnum_obj, qpy_esim_get_notification_by_seqnum);
+#endif
 // =========================================
 
 static c_callback_t *g_esim_user_callback;
@@ -296,6 +369,7 @@ STATIC mp_obj_t qpy_esim_add_event_handler(mp_obj_t handler)
        
        return mp_obj_new_int(0);
 }
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_add_event_handler_obj, qpy_esim_add_event_handler);
 
 STATIC mp_obj_t qpy_module_esim_deinit(void)
 {
@@ -310,21 +384,87 @@ STATIC mp_obj_t qpy_module_esim_deinit(void)
        return mp_obj_new_int(0);
 }
 
-STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_add_event_handler_obj, qpy_esim_add_event_handler);
 STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_module_esim_deinit_obj, qpy_module_esim_deinit);
 
 
+#if MICROPY_QPY_MODULE_ESIM_LPA_SET_TIMEOUT
+
+STATIC mp_obj_t qpy_esim_set_cmd_timeout(const mp_obj_t second)
+{
+
+    int ret = 0;
+    int sec = (uint32_t)mp_obj_get_int(second);
+    if ( sec < 20 || sec > 120 ){
+        return mp_obj_new_int(-1);
+    }
+    MP_THREAD_GIL_EXIT();
+       ret = Helios_Esim_LPA_Set_Cmd_Timeout(sec);
+    MP_THREAD_GIL_ENTER();
+       return mp_obj_new_int(ret);
+}
+
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_set_cmd_timeout_obj, qpy_esim_set_cmd_timeout);
+
+#endif
+#if MICROPY_QPY_MODULE_ESIM_SUPPORT_APN
+STATIC mp_obj_t qpy_esim_get_apn(void)
+{
+       char apn[ESIM_APN_LEN+1] = {0};
+    int ret = -1;
+    
+    ret = _qpy_esim_mutex_init();
+    if (ret != 0)
+        goto exit;
+
+    MP_THREAD_GIL_EXIT();
+    Helios_Mutex_Lock(g_qpy_esim_mutex, HELIOS_WAIT_FOREVER);
+    ret = Helios_Esim_LPA_Get_Apn(apn,ESIM_APN_LEN);
+    Helios_Mutex_Unlock(g_qpy_esim_mutex);
+    MP_THREAD_GIL_ENTER();
+       if (ret != 0)
+       {
+               memset(apn, 0, sizeof(apn));
+       }
+exit:
+    return mp_obj_new_str(apn, strlen(apn));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_0(qpy_esim_get_apn_obj, qpy_esim_get_apn);
+
+STATIC mp_obj_t qpy_esim_set_apn(const mp_obj_t apn)
+{
+    int ret = 0;
+       mp_buffer_info_t apn_buf = {0};
+       mp_get_buffer_raise(apn, &apn_buf, MP_BUFFER_READ);
+       
+       ret = Helios_Esim_LPA_Set_Apn(apn_buf.buf, (int)apn_buf.len);
+       
+       return mp_obj_new_int(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(qpy_esim_set_apn_obj, qpy_esim_set_apn);
+#endif
+
 STATIC const mp_rom_map_elem_t mp_module_esim_globals_table[] = {
     { MP_ROM_QSTR(MP_QSTR___name__),           MP_ROM_QSTR(MP_QSTR_esim)                                },
     { MP_ROM_QSTR(MP_QSTR_getEid),                 MP_ROM_PTR(&qpy_esim_get_eid_obj)                },
        { MP_ROM_QSTR(MP_QSTR_getProfileInfo),  MP_ROM_PTR(&qpy_esim_get_profiles_info_obj)  },
        { MP_ROM_QSTR(MP_QSTR_profileHandle),   MP_ROM_PTR(&qpy_esim_profile_handle_obj)         },
        { MP_ROM_QSTR(MP_QSTR_profileOTA),              MP_ROM_PTR(&qpy_esim_profile_ota_obj)        },
+       { MP_ROM_QSTR(MP_QSTR_getProfileDelNotification),     MP_ROM_PTR(&qpy_esim_get_notification_obj)  },
        { MP_ROM_QSTR(MP_QSTR_reportProfileDelNotification),     MP_ROM_PTR(&qpy_esim_report_notification_obj)  },
        //{ MP_ROM_QSTR(MP_QSTR_removeNotification),     MP_ROM_PTR(&qpy_esim_remove_notification_obj)  },
-       { MP_ROM_QSTR(MP_QSTR_getProfileDelNotification),     MP_ROM_PTR(&qpy_esim_get_notification_obj)  },
+    #if MICROPY_QPY_MODULE_ESIM_SUPPORT_NTF_SEQNUM
+    { MP_ROM_QSTR(MP_QSTR_getProfileNotificationBySeqnum),     MP_ROM_PTR(&qpy_esim_get_notification_by_seqnum_obj)  },
+       { MP_ROM_QSTR(MP_QSTR_reportProfileNotificationBySeqnum),     MP_ROM_PTR(&qpy_esim_report_notification_by_seqnum_obj)  },
+    #endif
        { MP_ROM_QSTR(MP_QSTR_setCallback),     MP_ROM_PTR(&qpy_esim_add_event_handler_obj)  },
+    #if MICROPY_QPY_MODULE_ESIM_SUPPORT_APN
+    { MP_ROM_QSTR(MP_QSTR_get_apn),     MP_ROM_PTR(&qpy_esim_get_apn_obj)  },
+    { MP_ROM_QSTR(MP_QSTR_set_apn),     MP_ROM_PTR(&qpy_esim_set_apn_obj)  },
+    #endif
        { MP_ROM_QSTR(MP_QSTR___qpy_module_deinit__),   MP_ROM_PTR(&qpy_module_esim_deinit_obj) },
+    #if MICROPY_QPY_MODULE_ESIM_LPA_SET_TIMEOUT
+    { MP_ROM_QSTR(MP_QSTR_set_cmd_timeout),             MP_ROM_PTR(&qpy_esim_set_cmd_timeout_obj)},
+    #endif
 };
 STATIC MP_DEFINE_CONST_DICT(mp_module_esim_globals, mp_module_esim_globals_table);
 
@@ -333,7 +473,7 @@ const mp_obj_module_t mp_module_esim = {
     .base = { &mp_type_module },
     .globals = (mp_obj_dict_t *)&mp_module_esim_globals,
 };
-
+#endif
 #endif
 
 
index a5546b6..dd1d58f 100644 (file)
@@ -660,7 +660,7 @@ STATIC mp_obj_t mp_CST816_read_xy(mp_obj_t self_in)
        else {
                CST816_LOG("mp_CST816_read_xy error\n");
        }
-    return mp_const_none;
+    return mp_obj_new_int(-2);
 }
 
 STATIC mp_obj_t mp_CST816_suspend(mp_obj_t self_in)
index f6501b0..f9c0ecb 100644 (file)
@@ -257,7 +257,7 @@ uint8_t GT9xx_Scan(uint8_t mode)
                                tp_dev.x[i]=((uint16_t)buf[1]<<8)+buf[0];       //X坐标
                                        tp_dev.y[i]=((uint16_t)buf[3]<<8)+buf[2];       //Y坐标   
 
-                                       GT9xx_LOG("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]); //打印坐标数据到串口
+//                                     GT9xx_LOG("x[%d]:%d,y[%d]:%d\r\n",i,tp_dev.x[i],i,tp_dev.y[i]); //打印坐标数据到串口
                                }                       
                        } 
                        res=1;
@@ -290,13 +290,14 @@ uint8_t GT9xx_Scan(uint8_t mode)
                        tp_dev.sta&=0XE0;       //清除点有效标记 
                }        
        }       
-
+       
+       temp=0;
+       GT9xx_WR_Reg(GT_GSTID_REG,&temp,1);
+       
        if(0 != gt_mutex) {
                Helios_Mutex_Unlock(gt_mutex);
        }       
 
-       temp=0;
-       GT9xx_WR_Reg(GT_GSTID_REG,&temp,1);
        return res;
 
 }
@@ -470,35 +471,34 @@ STATIC mp_obj_t mp_GT9xx_init(mp_obj_t self_in)
 
        
        Helios_GPIOInitStruct gpio_struct = {0};
-       gpio_struct.dir = HELIOS_GPIO_INPUT;
+       gpio_struct.dir = HELIOS_GPIO_OUTPUT;
        gpio_struct.pull = HELIOS_PULL_UP;
        gpio_struct.value = HELIOS_LVL_HIGH;
 
        ret = Helios_GPIO_Init((Helios_GPIONum) self->irq, &gpio_struct);
        GT9xx_LOG("xpt irq=%d, irq ret: %d\n", self->irq, ret);
 
-       gpio_struct.dir = HELIOS_GPIO_OUTPUT;
+//     gpio_struct.dir = HELIOS_GPIO_OUTPUT;
        ret = Helios_GPIO_Init((Helios_GPIONum) self->reset, &gpio_struct);
        GT9xx_LOG("xpt irq=%d, irq ret: %d\n",self->reset, ret);
 
-       if(0 != Helios_I2C_Init((Helios_I2CEnum)self->i2c_no, (Helios_I2CMode)self->i2c_mode)) {
-               mp_raise_ValueError("i2c init fail");
-       }
 
-       Helios_GPIO_SetLevel((Helios_GPIONum) self->irq, HELIOS_LVL_LOW);
+#if defined(PLAT_aic8800m40)
+    ret = Helios_I2C_Init((Helios_I2CEnum)self->i2c_no, (Helios_I2CMode)self->i2c_mode,self->group);
+
+#else
+    ret = Helios_I2C_Init((Helios_I2CEnum)self->i2c_no, (Helios_I2CMode)self->i2c_mode);
+#endif
+    if(ret != 0)
+    {
+        mp_raise_ValueError(MP_ERROR_TEXT("i2c init fail"));
+    }
+       Helios_GPIO_SetLevel((Helios_GPIONum) self->reset, HELIOS_LVL_LOW);
        Helios_msleep(10);
-       Helios_GPIO_SetLevel((Helios_GPIONum) self->irq, HELIOS_LVL_HIGH);
+       Helios_GPIO_SetLevel((Helios_GPIONum) self->reset, HELIOS_LVL_HIGH);
        Helios_msleep(30);
 
 
-       gpio_struct.dir = HELIOS_GPIO_INPUT;
-       gpio_struct.pull = HELIOS_PULL_NONE;
-       gpio_struct.value = HELIOS_LVL_HIGH;
-       
-       ret = Helios_GPIO_Init((Helios_GPIONum) self->irq, &gpio_struct);
-       GT9xx_LOG("xpt irq=%d, irq ret: %d\n",self->irq, ret);
-
-       Helios_msleep(100);
                
     GT9xxInit = TRUE;
 
@@ -522,6 +522,21 @@ STATIC mp_obj_t mp_GT9xx_init(mp_obj_t self_in)
        temp1 = 0;
        GT9xx_WR_Reg(GT_GSTID_REG,&temp1,1);//汇顶IC在读取触摸状态后需要清标志 
 
+       Helios_GPIO_SetLevel((Helios_GPIONum) self->irq, HELIOS_LVL_LOW);
+
+       GT9xx_Scan(0);
+       
+       gpio_struct.dir = HELIOS_GPIO_INPUT;
+       gpio_struct.pull = HELIOS_PULL_NONE;
+       gpio_struct.value = HELIOS_LVL_HIGH;
+       
+       ret = Helios_GPIO_Init((Helios_GPIONum) self->irq, &gpio_struct);
+       GT9xx_LOG("xpt irq=%d, irq ret: %d\n",self->irq, ret);
+
+       Helios_msleep(100);
+
+       
+
 
        if(gt_mutex == 0) {
                gt_mutex = Helios_Mutex_Create();
@@ -589,7 +604,7 @@ static TP_STATE_E tp_get_silde_state(uint16_t x1, uint16_t y1, uint16_t x2, uint
        }
        if(x1 == x2 && y1 == y2)        //点击
        {
-               GT9xx_LOG("click !\n");
+//             GT9xx_LOG("click !\n");
                TP_STATE_PUSH(TP_CLICK);
        }
        GT9xx_LOG("no know !\n");
@@ -658,7 +673,7 @@ static bool GT9xx_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
 #ifdef TP_STATE_DETECTION
                get_silde_state(true,last_x,last_y);
 #endif
-               GT9xx_LOG("lvgl read x:%d y:%d\n", last_x, last_y);
+//             GT9xx_LOG("lvgl read x:%d y:%d\n", last_x, last_y);
        } else {
 #ifdef TP_STATE_DETECTION
                get_silde_state(false,last_x,last_y);
index 3b6d41b..6c2be17 100644 (file)
@@ -306,8 +306,11 @@ STATIC mp_obj_t mp_xpt2046_init(mp_obj_t self_in)
     xpt2046_obj_t *self = MP_OBJ_TO_PTR(self_in);
     mp_activate_xpt2046(self_in);
 
-
-    ret = Helios_SPI_Init((Helios_SPINum) self->spi_no, (Helios_SPIMode) self->spi_mode, (uint32_t) self->mhz);
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
+       ret = Helios_SPI_Init((Helios_SPINum) self->spi_no, (Helios_SPIMode) self->spi_mode, (uint32_t) self->mhz, 0);
+#else
+       ret = Helios_SPI_Init((Helios_SPINum) self->spi_no, (Helios_SPIMode) self->spi_mode, (uint32_t) self->mhz);
+#endif
        if(ret != 0) {
                mp_raise_ValueError("spi init fail");
        }
index 7282602..6993432 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+
+import uos
+name, platform = uos.uname()[1].split("=",1)
+
 import utime
-import net
-import dataCall
 import log
 import _thread
 import usocket as socket
 import ustruct as struct
 import osTimer
-import uos
+
+if platform != "FCM360W" and platform != "FCM362K":
+    import net
+    import dataCall
 
 log.basicConfig(level=log.INFO)
 mqtt_log = log.getLogger("MQTT")
-ALIYDEVREGISTER = False
-TOPICLIST = list()
-SERVERACK = set()  # PUBACK and SUBACK pids awaiting ACK response
-PING = False
-LOOPTASKID = None
+# bob.xian 2023/9/20 [FCM360W may be a bit unstable when using the log module, so print is temporarily used] begin
+if platform == "FCM360W":
+    mqtt_log.info = print
+    mqtt_log.warning = print
+# bob.xian 2023/9/20 [FCM360W may be a bit unstable when using the log module, so print is temporarily used] end
+
+#ALIYDEVREGISTER = False
+#TOPICLIST = list()
+#SERVERACK = set()  # PUBACK and SUBACK pids awaiting ACK response
+#PING = False
 
 class MQTTException(Exception):
     pass
@@ -45,7 +55,7 @@ class BaseMqtt(object):
     ARECONNECT = 1
     SEVCLOSE = 2
 
-    def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=0,
+    def __init__(self, client_id, server, port=0, user=None, password=None, keepalive=60,
                  ssl=False, ssl_params={}, reconn=True, version=4, pingmaxnum=0, manage=False, ipvtype=0):
         if port == 0:
             port = 8883 if ssl else 1883
@@ -87,6 +97,11 @@ class BaseMqtt(object):
         self.wait_flag = 0
         self.ipvtype = ipvtype
         self.manage = manage
+        self.looptask_id = None
+        self.PING = False
+        self.SERVERACK = set()  # PUBACK and SUBACK pids awaiting ACK response
+        self.TOPICLIST = list()
+        self.ALIYDEVREGISTER = False
         if keepalive != 0 and keepalive < 5:
             raise ValueError("inport parameter error : keepalive >= 5S")
 
@@ -149,6 +164,9 @@ class BaseMqtt(object):
             break
 
         if self.ipvtype == 1:
+            if platform == "FCM360W" or platform == "FCM362K":
+                print("Not Support!")
+                return
             self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, socket.TCP_CUSTOMIZE_PORT)
             call_state = dataCall.getInfo(1,1)
             if call_state == -1:
@@ -165,7 +183,7 @@ class BaseMqtt(object):
         self.sock.connect(self.addr)
         if self.ssl:
             import ussl
-            self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
+            self.sock = ussl.wrap_socket(self.sock, **self.ssl_params, server_hostname = self.server)
 
         if self.mqttversion == 3:
             protocol = b"MQIsdp"
@@ -230,20 +248,18 @@ class BaseMqtt(object):
         self.last_time = utime.ticks_ms() // 1000
         self.connSta = True
         self.clean_session = clean_session
-        global ALIYDEVREGISTER, PING
-        PING = False
+        self.PING = False
         self.pingnum = self.pingmaxnum
-        ALIYDEVREGISTER = self.sock
+        self.ALIYDEVREGISTER = self.sock
         return resp[2] & 1
 
     def disconnect(self):
         # Pawn.zhou 2021/1/12 for JIRA STASR3601-2523 begin
         try:
-            global PING
             self.timerFlag = False
             self.pingFlag = False
             self.connSta = False
-            PING = False
+            self.PING = False
             self.pingnum = self.pingmaxnum
             self.topic = []
             self.sock.write(b"\xe0\0")
@@ -278,11 +294,10 @@ class BaseMqtt(object):
         self.sock.close()
 
     def ping(self):
-        global PING
         # self.last_time = utime.mktime(utime.localtime())
         self.last_time = utime.ticks_ms() // 1000
         self.sock.write(b"\xc0\0")
-        PING = True
+        self.PING = True
 
     def publish(self, topic, msg, retain=False, qos=0):
         pkt = bytearray(b"\x30\0\0\0")
@@ -301,7 +316,7 @@ class BaseMqtt(object):
         self.sock.write(pkt, i + 1)
         self._send_str(topic)
         if qos > 0:
-            SERVERACK.add(pid)
+            self.SERVERACK.add(pid)
             struct.pack_into("!H", pkt, 0, pid)
             self.sock.write(pkt, 2)
         self.sock.write(msg)
@@ -333,7 +348,7 @@ class BaseMqtt(object):
             self.sock = sock
         pkt = bytearray(b"\x82\0\0\0")
         pid = next(self.__newpid)
-        SERVERACK.add(pid)
+        self.SERVERACK.add(pid)
         struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, pid)
         self.sock.write(pkt)
         self._send_str(topic)
@@ -358,9 +373,8 @@ class BaseMqtt(object):
     def subscribe(self, topic, qos=0, sock=None):
         assert self.cb is not None, "Subscribe callback is not set"
         if topic not in self.topic_list:
-            global TOPICLIST
             self.topic_list.append(topic)
-            TOPICLIST = self.topic_list
+            self.TOPICLIST = self.topic_list
         self.qos = qos
         self.__subscribe(topic, qos=qos, sock=sock)
 
@@ -402,8 +416,7 @@ class BaseMqtt(object):
             return None
 
         if res == b"\xd0":  # PINGRESP
-            global PING
-            PING = False
+            self.PING = False
             sz = self.sock.read(1)[0]
             assert sz == 0
             return res
@@ -415,8 +428,8 @@ class BaseMqtt(object):
                 return
             rcv_pid = self.sock.read(2)
             pid = rcv_pid[0] << 8 | rcv_pid[1]
-            if pid in SERVERACK:
-                SERVERACK.discard(pid)
+            if pid in self.SERVERACK:
+                self.SERVERACK.discard(pid)
                 return
             else:
                 return
@@ -425,8 +438,8 @@ class BaseMqtt(object):
         if (sub_ack & 0xf0) == 0x90:  # SUBSCRIBE:
             resp = self.sock.read(4)
             pid = resp[1] << 8 | resp[2]
-            if pid in SERVERACK:
-                SERVERACK.discard(pid)
+            if pid in self.SERVERACK:
+                self.SERVERACK.discard(pid)
             if resp[3] == 0x80:
                 mqtt_log.warning("subscribe topic ACK Fail")
                 return 0x80
@@ -450,8 +463,8 @@ class BaseMqtt(object):
         if op & 6 == 2:
             task_stacksize = _thread.stack_size()
             name,platform = uos.uname()[1].split("=",1)
-            if platform == "EC600E" or platform == "EC800E":
-                _thread.stack_size(1024)
+            if platform == "EC600E" or platform == "EC800E" or platform == "FCM360W" or platform == "FCM362K":
+                _thread.stack_size(2*1024)
             _thread.start_new_thread(self.publish_ack, (pid,))
             _thread.stack_size(task_stacksize)
         if op & 6 == 4:
@@ -473,7 +486,7 @@ class BaseMqtt(object):
 
     def _await_pid(self, pid):
         t = utime.ticks_ms()
-        while pid in SERVERACK:  # local copy
+        while pid in self.SERVERACK:  # local copy
             if self._timeout(t):
                 break  # Must repub or bail out
             utime.sleep_ms(500)
@@ -524,24 +537,24 @@ class MQTTClient(BaseMqtt):
 
     def sub_timer_task(self, arg):
         if not self.topic_list:
-            self.topic_list = TOPICLIST
+            self.topic_list = self.TOPICLIST
         for topic_re in self.topic_list:
-            super().subscribe(topic_re, qos=self.qos, sock=ALIYDEVREGISTER)
+            super().subscribe(topic_re, qos=self.qos, sock=self.ALIYDEVREGISTER)
 
     def error_register_cb(self, func):
         self.error_callback = func
 
     def base_reconnect(self):
-        global LOOPTASKID
         i = 0
         if self.mqttlock.locked():
             return
         self.mqttlock.acquire()
-        if LOOPTASKID is not None and PING != True:
+        if self.looptask_id is not None and self.PING != True:
             if self.mqttsendlock.locked():
                 self.mqttsendlock.release()
-            _thread.stop_thread(LOOPTASKID)
-            LOOPTASKID = None
+            if self.wait_flag == 0:
+                _thread.stop_thread(self.looptask_id)
+            self.looptask_id = None
         if self.reconn:
             if self.error_callback is not None:
                 e = "reconnect_start"
@@ -550,18 +563,26 @@ class MQTTClient(BaseMqtt):
             try:
                 if not self.timerFlag:
                     break
-                self.sock.close()
+                #felix.hou 2024.5.11 add ,close() may cause reconnecting to the mqtt server to fail
+                if platform == "FCM360W" or platform == "FCM362K":
+                    self.sock.shutdown()
+                    utime.sleep_ms(20)
+                    self.sock.close()
+                else:
+                    self.sock.close()
+                #felix.hou 2024.5.11 add ,close() may cause reconnecting to the mqtt server to fail
                 time_info = self.logTime()
                 mqtt_log.info(
                     "[%s] The network condition has been restored and an attempt will be made to reconnect" % time_info)
                 self.pingFlag = False
+                self.connSta = False
                 self.connect(self.clean_session)
                 mqtt_log.info("[%s] Reconnection successful!" % time_info)
                 if self.manage:
                     self.subtimer.start(3000, 0, self.sub_timer_task)
                 else:
                     if not self.topic_list:
-                        self.topic_list = TOPICLIST
+                        self.topic_list = self.TOPICLIST
                     for topic_re in self.topic_list:
                         super().subscribe(topic_re, self.qos)
                 time_info = self.logTime()
@@ -583,15 +604,16 @@ class MQTTClient(BaseMqtt):
                 mqtt_log.warning(
                     "[%s] The connection attempt failed [%s] and will be tried again after %d seconds." % (time_info, str(e), 5 + i))
                 utime.sleep(5 + i)
-                net_sta = net.getState()
-                if net_sta != -1 and ((net_sta[1][0] == 1) or (net_sta[1][0] == 5)):
-                    call_state = dataCall.getInfo(1, 0)
-                    if call_state == -1:
-                        mqtt_log.info("LTE datacall Fail.")
-                    elif call_state[2][0] != 1:
-                        mqtt_log.info("LTE datacall IPV4 Fail.")
-                else:
-                    mqtt_log.info("LTE Net unregistered.")
+                if platform != "FCM360W" and platform != "FCM362K":
+                    net_sta = net.getState()
+                    if net_sta != -1 and ((net_sta[1][0] == 1) or (net_sta[1][0] == 5)):
+                        call_state = dataCall.getInfo(1, 0)
+                        if call_state == -1:
+                            mqtt_log.info("LTE datacall Fail.")
+                        elif call_state[2][0] != 1:
+                            mqtt_log.info("LTE datacall IPV4 Fail.")
+                    else:
+                        mqtt_log.info("LTE Net unregistered.")
 
     def publish(self, topic, msg, retain=False, qos=0):
         while True:
@@ -634,7 +656,7 @@ class MQTTClient(BaseMqtt):
                 # Whether to use the built-in reconnect mechanism
                 time_info = self.logTime()
                 self.wait_flag = 0
-                if PING == True:
+                if self.ping == True:
                     mqtt_log.warning("[%s] wait msg, send ping timeout. Trying to reconnect" % time_info)
                 else:
                     mqtt_log.warning("[%s] wait msg OSError[%s] . Trying to reconnect" % (time_info, str(e)))
@@ -642,7 +664,6 @@ class MQTTClient(BaseMqtt):
                 self.base_reconnect()
 
     def connect(self, clean_session=True):
-        global LOOPTASKID
         try:
             super().connect(clean_session)
         except Exception as e:
@@ -656,23 +677,24 @@ class MQTTClient(BaseMqtt):
             elif str(e) == "110":
                 raise ValueError("MQTT Connect Error='{}' Timeout.Need Check Network".format(e))
             raise ValueError("MQTT Connect error='{}' FAIL".format(e))
-        if LOOPTASKID is None:
+        if self.looptask_id is None:
             if self.keepalive > 0 and not self.pingFlag:
                 # Pawn.zhou 2021/1/12 for JIRA STASR3601-2523 begin
                 task_stacksize = _thread.stack_size()
                 name,platform = uos.uname()[1].split("=",1)
                 if platform == "EC600E" or platform == "EC800E":
                     _thread.stack_size(8 * 1024)
+                elif platform == "FCM360W" or platform == "FCM362K":
+                    _thread.stack_size(2 * 1024)
                 else:
                     _thread.stack_size(16 * 1024)
-                LOOPTASKID = _thread.start_new_thread(self.__loop_forever, ())
+                self.looptask_id = _thread.start_new_thread(self.__loop_forever, ())
                 _thread.stack_size(task_stacksize)
                 self.pingFlag = True
                 # Pawn.zhou 2021/1/12 for JIRA STASR3601-2523 end
         return 0
 
     def __loop_forever(self):
-        global LOOPTASKID
         while True:
             if self.keepalive >= 5:
                 keepalive = self.keepalive - 3
@@ -680,7 +702,7 @@ class MQTTClient(BaseMqtt):
                 if not self.timerFlag:
                     if self.mqttsendlock is not None and self.mqttsendlock.locked():
                         self.mqttsendlock.release()
-                    LOOPTASKID = None
+                    self.looptask_id = None
                     break
                 # time = utime.mktime(utime.localtime())
                 time = utime.ticks_ms() // 1000
@@ -689,12 +711,12 @@ class MQTTClient(BaseMqtt):
                     if self.mqttlock.locked():
                         utime.sleep(5)
                         continue
-                    if PING == True:
+                    if self.PING == True:
                         mqtt_log.warning("[%s] Send ping timeout 2. Trying to reconnect" % time)
                         if not self.reconn:
                             if self.mqttsendlock is not None and self.mqttsendlock.locked():
                                 self.mqttsendlock.release()
-                            LOOPTASKID = None
+                            self.looptask_id = None
                             raise Exception("Send ping timeout.")
                         else:
                             if self.pingnum <= 0:
@@ -703,7 +725,7 @@ class MQTTClient(BaseMqtt):
                                 self.pingFlag = False
                                 if self.mqttsendlock is not None and self.mqttsendlock.locked():
                                     self.mqttsendlock.release()
-                                LOOPTASKID = None
+                                self.looptask_id = None
                                 break
                             else:
                                 mqtt_log.warning("[%s] Trying to resend ping(%d)" % (time, self.pingnum))
@@ -724,22 +746,22 @@ class MQTTClient(BaseMqtt):
                 if self.mqttsendlock is not None and self.mqttsendlock.locked():
                     self.mqttsendlock.release()
                 if not self.timerFlag:
-                    LOOPTASKID = None
+                    self.looptask_id = None
                     break
                 # Network normal, take the initiative to throw exception
                 if not self.reconn:
                     if self.error_callback is not None:
                         self.error_callback(str(e))
                         self.pingFlag = False
-                        LOOPTASKID = None
+                        self.looptask_id = None
                         break
                     else:
                         self.pingFlag = False
-                        LOOPTASKID = None
+                        self.looptask_id = None
                         break
                 # Whether to use the built-in reconnect mechanism
                 time_info = self.logTime()
-                if PING == True:
+                if self.PING == True:
                     mqtt_log.warning("[%s] Send ping timeout 3. Trying to reconnect" % time_info)
                 else:
                     mqtt_log.warning("[%s] Send ping, Network exception. Trying to reconnect" % time_info)
index 11f6660..a4c9f85 100644 (file)
 # @data: bytes
 
 import utime
-import uselect
+#import uselect
 import uctypes
 import usocket
 import ustruct
 import urandom
 import micropython
+import uos
+
 urandom.seed(utime.ticks_us())
 
 class Ping():
@@ -36,7 +38,6 @@ class Ping():
         self.quiet    = quiet
 
         # prepare packet
-        assert SIZE >= 16, "pkt size too small"
         self._PKT = b'Q'*SIZE
         self.PKT_DESC = {
             "type": uctypes.UINT8 | 0,
@@ -63,14 +64,8 @@ class Ping():
         sock.settimeout(TIMEOUT/1000)
         addresses = usocket.getaddrinfo(HOST, 1) # [0][-1] # list of ip addresses
         assert addresses, "Can not take the IP address of host"
-        self.CLIENT_IP = None
-        for addr in addresses:
-            try:
-                sock.connect(addr[-1])
-                self.CLIENT_IP = addr[-1][0]
-            except:
-                continue
-        assert self.CLIENT_IP, "Connection failed"
+        self.CLIENT_IP = addresses[0][-1]
+
         self.sock = sock
 
         # [ COUNTERS ]
@@ -103,8 +98,15 @@ class Ping():
         # Здесь нужно подвязаться на реальное время
         while self.seq_num <= self.seq_num + self.COUNT:
             if t >= self.INTERVAL:
-                pong = self.ping()
-                t = 0
+                try:
+                    pong = self.ping()
+                except Exception as e:
+                    print("ping OSError[%s]." % str(e))
+                    self.seqs.remove(self.seq_num-1)
+                    if len(self.seqs) == 0:
+                        break
+                    continue
+                t = self.INTERVAL
                 rtt = pong[1]
                 if rtt:
                     pongs.append(rtt)
@@ -115,7 +117,7 @@ class Ping():
             if finish:
                 break
 
-            utime.sleep_ms(1)
+            utime.sleep_ms(10)
             t += 1
 
         losses = round((self.transmitted - self.received) / self.transmitted) * 100
@@ -149,7 +151,7 @@ class Ping():
 
         try:
             # send packet
-            if sock.send(self._PKT) == self.SIZE:
+            if sock.sendto(self._PKT, self.CLIENT_IP) == self.SIZE:
                 self.transmitted += 1
             else:
                 self.seqs.remove(self.seq_num)
@@ -177,11 +179,9 @@ class Ping():
         except Exception as identifier:
             import uerrno as errno
             if identifier.args[0] == errno.EPIPE:
-                print("Client connection unexpectedly closed")
-                pass
+                raise ValueError("Client connection unexpectedly closed")
             elif identifier.args[0] == errno.EBADF:
-                print("Bad file descriptor.")
-                pass
+                raise ValueError("Bad file descriptor.")
             else:
                 raise identifier
         return (seq, t_elasped, ttl)
@@ -208,6 +208,65 @@ class Ping():
     def close(self):
         self.sock.close()
 
+
+def Quel_ping(HOST,COUNT=4,SIZE=64,quiet=False,TIMEOUT=5000):
+    addresses = usocket.getaddrinfo(HOST, 1)
+    assert addresses, "Can not take the IP address of host"
+    count = COUNT
+    pongs = []
+    min_rtt, max_rtt = None, None
+    rx = 0
+    losses = 0
+    for addr in addresses:
+        icmp_seq = 1
+        t_elasped = 0
+        clientIP = addr[-1][0]
+        not quiet and print("PING %s (%s): %s data bytes" % (HOST, clientIP, SIZE))
+        while True:
+            timestamp = utime.ticks_us()
+            ret = usocket.ping(addr[-1],TIMEOUT,SIZE)
+            if ret == 0:
+                t_elasped = (utime.ticks_us() - timestamp) / 1000
+                if t_elasped:
+                    pongs.append(t_elasped)
+                    if not min_rtt or t_elasped <= min_rtt: min_rtt = round(t_elasped, 3)
+                    if not max_rtt or t_elasped >= max_rtt: max_rtt = round(t_elasped, 3)
+                rx +=1
+                not quiet and print("72 bytes from %s: icmp_seq=%u, ttl=53, time=%f ms" % (clientIP, icmp_seq, t_elasped))
+            else:
+                losses +=1
+                print("PING %s (%s): FAIL time=%f ms " % (HOST, clientIP, (utime.ticks_us()-timestamp)/1000))
+                #break
+            count = count - 1
+            icmp_seq +=1
+            if count == 0:
+                avg_rtt = round(sum(pongs) / len(pongs), 3) if pongs else None
+                from ucollections import namedtuple
+                _result = namedtuple("result", ("tx", "rx", "losses", "min", "avg", "max"))
+                result = _result(COUNT, rx, round((losses/COUNT))*100, min_rtt, avg_rtt, max_rtt)
+                return result
+
 def ping(HOST, SOURCE=None, COUNT=4, INTERVAL=1000, SIZE=64, TIMEOUT=5000, quiet=False):
-    with Ping(HOST, SOURCE, COUNT, INTERVAL, SIZE, TIMEOUT, quiet) as p:
-        return p.start()        
\ No newline at end of file
+    assert SIZE >= 16, "PING set SIZE too small"
+
+    if SIZE > 1024:
+        print("PING %s: set SIZE %s FAIL, Continue with the default value: 64" % (HOST, SIZE))
+        SIZE = 64
+
+    if (COUNT > 65535) or (COUNT <= 0):
+        print("PING %s: set COUNT %s FAIL, Continue with the default value: 4" % (HOST, COUNT))
+        COUNT = 4
+
+    assert TIMEOUT > 0, "PING set TIMEOUT too small"
+
+    try:
+        res = usocket.ping()
+        if res == 1:
+            result = Quel_ping(HOST,COUNT,SIZE,quiet,TIMEOUT)
+            if quiet:
+                return result
+            else:
+                print(result)
+    except Exception as e:
+        with Ping(HOST, SOURCE, COUNT, INTERVAL, SIZE, TIMEOUT, quiet) as p:
+            return p.start()        
index a781f4d..3d73428 100644 (file)
@@ -7,28 +7,10 @@ import ure as re
 import ustruct as struct
 import urandom as random
 import usocket as socket
+import websocket
 from ucollections import namedtuple
-import websocket_mask
+
 LOGGER = log.getLogger(__name__)
-import usys
-# Opcodes
-OP_CONT = 0x0
-OP_TEXT = 0x1
-OP_BYTES = 0x2
-OP_CLOSE = 0x8
-OP_PING = 0x9
-OP_PONG = 0xa
-
-# Close codes
-CLOSE_OK = 1000
-CLOSE_GOING_AWAY = 1001
-CLOSE_PROTOCOL_ERROR = 1002
-CLOSE_DATA_NOT_SUPPORTED = 1003
-CLOSE_BAD_DATA = 1007
-CLOSE_POLICY_VIOLATION = 1008
-CLOSE_TOO_BIG = 1009
-CLOSE_MISSING_EXTN = 1010
-CLOSE_BAD_CONDITION = 1011
 
 URL_RE = re.compile(r'(wss|ws)://([A-Za-z0-9-\.]+)(?:\:([0-9]+))?(/.+)?')
 URI = namedtuple('URI', ('protocol', 'hostname', 'port', 'path'))
@@ -74,6 +56,7 @@ class Websocket(object):
 
     def __init__(self, sock, debug=False):
         self.sock = sock
+        self.ws = websocket.websocket(sock)
         self.open = True
         self.debug = debug
 
@@ -86,101 +69,13 @@ class Websocket(object):
     def settimeout(self, timeout):
         self.sock.settimeout(timeout)
 
-    def read_frame(self, max_size=None):
-        """
-        Read a frame from the socket.
-        See https://tools.ietf.org/html/rfc6455#section-5.2 for the details.
-        """
-
-        # Frame header
-        two_bytes = self.sock.read(2)
-
-        if not two_bytes:
-            raise NoDataException
-
-        byte1, byte2 = struct.unpack('!BB', two_bytes)
-
-        # Byte 1: FIN(1) _(1) _(1) _(1) OPCODE(4)
-        fin = bool(byte1 & 0x80)
-        opcode = byte1 & 0x0f
-
-        # Byte 2: MASK(1) LENGTH(7)
-        mask = bool(byte2 & (1 << 7))
-        length = byte2 & 0x7f
-
-        if length == 126:  # Magic number, length header is 2 bytes
-            length, = struct.unpack('!H', self.sock.read(2))
-        elif length == 127:  # Magic number, length header is 8 bytes
-            length, = struct.unpack('!Q', self.sock.read(8))
+    def read_frame(self, sz):
+        return self.ws.read(sz)
 
-        if mask:  # Mask is 4 bytes
-            mask_bits = self.sock.read(4)
+    def write_frame(self, data=b''):
+        return self.ws.write(data)
 
-        try:
-            data = self.sock.read(length)
-        except MemoryError:
-            # We can't receive this many bytes, close the socket
-            if self.debug: LOGGER.info("Frame of length %s too big. Closing", length)
-            self.close(code=CLOSE_TOO_BIG)
-            return True, OP_CLOSE, None
-
-        if mask:
-            data = bytes(b ^ mask_bits[i % 4]
-                         for i, b in enumerate(data))
-
-        return fin, opcode, data
-
-    def write_frame(self, opcode, data=b''):
-        """
-        Write a frame to the socket.
-        See https://tools.ietf.org/html/rfc6455#section-5.2 for the details.
-        """
-        fin = True
-        mask = self.is_client  # messages sent by client are masked
-
-        length = len(data)
-
-        # Frame header
-        # Byte 1: FIN(1) _(1) _(1) _(1) OPCODE(4)
-        byte1 = 0x80 if fin else 0
-        byte1 |= opcode
-
-        # Byte 2: MASK(1) LENGTH(7)
-        byte2 = 0x80 if mask else 0
-
-        if length < 126:  # 126 is magic value to use 2-byte length header
-            byte2 |= length
-            self.sock.write(struct.pack('!BB', byte1, byte2))
-
-        elif length < (1 << 16):  # Length fits in 2-bytes
-            byte2 |= 126  # Magic code
-            self.sock.write(struct.pack('!BBH', byte1, byte2, length))
-
-        elif length < (1 << 64):
-            byte2 |= 127  # Magic code
-            self.sock.write(struct.pack('!BBQ', byte1, byte2, length))
-
-        else:
-            raise ValueError()
-        #print("mask start len:{}".format(length))
-        if mask:  # Mask is 4 bytes
-            mask_bits = struct.pack('!I', random.getrandbits(32))
-            self.sock.write(mask_bits)
-            #tmp_data = data 
-            # data = bytes(b ^ mask_bits[i % 4]
-            #              for i, b in enumerate(data))
-            # print("old mask:{}".format(data))
-
-            data_array = bytearray(data)
-            mask_bits_array = bytearray(mask_bits)
-            websocket_mask.MASK(data_array,len(data_array),mask_bits_array)
-            #print("new mask:{}".format(data_array))
-            data=bytes(data_array)
-        #print("mask end")
-        self.sock.write(data)
-        #print("write end")
-
-    def recv(self):
+    def recv(self, max_size=16*1024):
         """
         Receive data from the websocket.
 
@@ -191,40 +86,22 @@ class Websocket(object):
         """
         assert self.open
 
-        while self.open:
-            try:
-                fin, opcode, data = self.read_frame()
-            except NoDataException:
-                return ''
-            except ValueError:
-                if self.debug: LOGGER.info("Failed to read frame. Socket dead.")
+        try:
+            data = self.read_frame(max_size)
+            if data == None:
+                data = ''
+            return data
+        except (ValueError, OSError) as e:
+            error_str = str(e)
+            print("Failed to read frame. Socket dead.", error_str)
+            if error_str.find("[Errno 110]")!= -1:
+                #print("ASR ASR:recv TIMEDOUT 正常")
+                pass
+            else:
                 self._close()
-                raise ConnectionClosed()
+                raise e
 
-            if not fin:
-                raise NotImplementedError()
 
-            if opcode == OP_TEXT:
-                return data.decode('utf-8')
-            elif opcode == OP_BYTES:
-                return data
-            elif opcode == OP_CLOSE:
-                self._close()
-                return "websocket close"
-            elif opcode == OP_PONG:
-                # Ignore this frame, keep waiting for a data frame
-                continue
-            elif opcode == OP_PING:
-                # We need to send a pong frame
-                if self.debug: LOGGER.info("Sending PONG")
-                self.write_frame(OP_PONG, data)
-                # And then wait to receive
-                continue
-            elif opcode == OP_CONT:
-                # This is a continuation of a previous frame
-                raise NotImplementedError(opcode)
-            else:
-                raise ValueError(opcode)
 
     def send(self, buf):
         """Send data to the websocket."""
@@ -232,28 +109,24 @@ class Websocket(object):
         assert self.open
 
         if isinstance(buf, str):
-            opcode = OP_TEXT
             buf = buf.encode('utf-8')
+            self.ws.ioctl(9, 1)
         elif isinstance(buf, bytes):
-            opcode = OP_BYTES
+            self.ws.ioctl(9, 2)
         else:
             raise TypeError()
+        
+        self.write_frame(buf)
 
-        self.write_frame(opcode, buf)
-
-    def ping(self):
-        self.write_frame(OP_PING,b'ping')
-
-    def close(self, code=CLOSE_OK, reason=''):
+    def close(self):
         """Close the websocket."""
         if not self.open:
             return
-        try:
-            buf = struct.pack('!H', code) + reason.encode('utf-8')
 
-            self.write_frame(OP_CLOSE, buf)
+        try:
+            self.ws.ioctl(4)
         except Exception as e:
-            usys.print_exception(e)    
+            if self.debug: LOGGER.info("websocekt close:%s"%(str(e)))
         self._close()
 
     def _close(self):
@@ -289,45 +162,40 @@ class Client(object):
                               uri.hostname, uri.port)
 
         sock = socket.socket()
-        sock.settimeout(6)
         addr = socket.getaddrinfo(uri.hostname, uri.port)
         sock.connect(addr[0][4])
-        
-        try:
-            if uri.protocol == 'wss':
-                import ussl
-                sock = ussl.wrap_socket(sock)
-
-            def send_header(header, *args):
-                if debug: LOGGER.info(str(header), *args)
-                sock.write(header % args + '\r\n')
-
-            # Sec-WebSocket-Key is 16 bytes of random base64 encoded
-            key = binascii.b2a_base64(bytes(random.getrandbits(8) for _ in range(16)))[:-1]
-            send_header(b'GET %s HTTP/1.1', uri.path or '/')
-            send_header(b'Host: %s:%s', uri.hostname, uri.port)
-            send_header(b'Connection: Upgrade')
-            send_header(b'Upgrade: websocket')
-            send_header(b'Sec-WebSocket-Key: %s', key)
-            send_header(b'Sec-WebSocket-Version: 13')
-            send_header(b'Origin: http://{hostname}:{port}'.format(
-                hostname=uri.hostname,
-                port=uri.port)
-            )
-            for k, v in headers.items():
-                send_header('{}:{}'.format(k, v).encode())
-            send_header(b'')
 
+        if uri.protocol == 'wss':
+            import ussl
+            sock = ussl.wrap_socket(sock)
+
+        def send_header(header, *args):
+            if debug: LOGGER.info(str(header), *args)
+            sock.write(header % args + '\r\n')
+
+        # Sec-WebSocket-Key is 16 bytes of random base64 encoded
+        key = binascii.b2a_base64(bytes(random.getrandbits(8) for _ in range(16)))[:-1]
+        send_header(b'GET %s HTTP/1.1', uri.path or '/')
+        send_header(b'Host: %s:%s', uri.hostname, uri.port)
+        send_header(b'Connection: Upgrade')
+        send_header(b'Upgrade: websocket')
+        send_header(b'Sec-WebSocket-Key: %s', key)
+        send_header(b'Sec-WebSocket-Version: 13')
+        send_header(b'Origin: http://{hostname}:{port}'.format(
+            hostname=uri.hostname,
+            port=uri.port)
+        )
+        for k, v in headers.items():
+            send_header('{}:{}'.format(k, v).encode())
+        send_header(b'')
+
+        header = sock.readline()[:-2]
+        assert header.startswith(b'HTTP/1.1 101 '), header
+
+        # We don't (currently) need these headers
+        # FIXME: should we check the return key?
+        while header:
+            if debug: LOGGER.info(str(header))
             header = sock.readline()[:-2]
-            assert header.startswith(b'HTTP/1.1 101 '), header
 
-            # We don't (currently) need these headers
-            # FIXME: should we check the return key?
-            while header:
-                if debug: LOGGER.info(str(header))
-                header = sock.readline()[:-2]
-        except Exception as e:
-            usys.print_exception(e) 
-            sock.close()
-            return 
         return WebsocketClient(sock, debug)
index d11e480..cf6d45c 100644 (file)
@@ -32,6 +32,10 @@ class wifilocator:
                     return -2
                 try:
                     cellinfo = __wifiLocator.getWifilocreq(self.wifitoken)
+                except Exception as e:
+                    print("Wifi locator Get the coordinate error:%s "%str(e))
+                    return -3
+                try:
                     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                     sockaddr = socket.getaddrinfo('www.queclocator.com', 80)[0][-1]
                     sock.connect(sockaddr)
@@ -43,6 +47,7 @@ class wifilocator:
                         l = l.split(None, 2)
                         status = int(l[1])
                     except:
+                        sock.close()
                         raise ValueError("Connect FAIL!")
                     reason = ""
                     if status == 200:
@@ -52,13 +57,16 @@ class wifilocator:
                             if not l or l == b"\r\n":
                                 break
                         data = sock.recv(1024)
+                        sock.close()
                         return __wifiLocator.encodeWifilocreq(data)
                     else:
+                        sock.close()
                         if len(l) > 2:
                             reason = l[2].rstrip()
                             raise ValueError("error info:===='{}'====".format(reason))
                 except Exception as e:
-                    print("Wifi locator Get the coordinate error:%s "%str(e))
+                    sock.close()
+                    print("Wifi locator failed to get location:%s "%str(e))
                     return -3
             else:
                 return -1
index e1d7e6d..97f159f 100644 (file)
 # -*- coding:utf-8 -*-
 
 
+import gc
 import uos
+import sys
 import ql_fs
-import utime as time
 import osTimer
-from machine import UART
+import utime as time
 from queue import Queue
+from machine import UART
+
+name, platform = uos.uname()[1].split("=",1)
+platform=platform.split("_",1)[0]
 
-SOH = b'\x01'
-STX = b'\x02'
-EOT = b'\x04'
-ACK = b'\x06'
-NAK = b'\x15'
-CAN = b'\x18'
-CRC = b'\x43'
+SOH = b"\x01"
+STX = b"\x02"
+EOT = b"\x04"
+ACK = b"\x06"
+NAK = b"\x15"
+CAN = b"\x18"
+CRC = b"\x43"
 
 USE_LENGTH_FIELD = 0b100000
 USE_DATE_FIELD = 0b010000
@@ -37,20 +42,54 @@ USE_SN_FIELD = 0b000100
 ALLOW_1K_BLOCK = 0b000010
 ALLOW_YMODEM_G = 0b000001
 
+DEBUG = False
+
+_MAIN_UART_ = UART(UART.UART2, 115200, 8, 0, 1, 0) if DEBUG else None
+
+
+def _print(data):
+    global DEBUG, _MAIN_UART_
+    if DEBUG:
+        _data = data if isinstance(data, bytes) else (data.encode() if isinstance(data, str) else str(data).encode())
+        _data += b"" if _data.endswith(b"\r\n") else b"\r\n"
+        _MAIN_UART_.write(_data)
+    else:
+        print(DEBUG)
 
-class Serial(object):
-    def __init__(self,
-                 uart,
-                 buadrate=57600,
-                 databits=8,
-                 parity=0,
-                 stopbits=1,
-                 flowctl=0):
 
+def check_file():
+    def wrapper(func):
+        def _wrapper(*args, **kwargs):
+            new_args = list()
+            new_args.append(args[0])
+            trans_file = args[1]
+            _files = []
+            for _file in trans_file:
+                source, target = _file.strip("[]").split(",")
+                _print("source: %s, target: %s" % (source, target))
+                if ql_fs.path_exists(source):
+                    file_info = {
+                        "filepath": source,
+                        "name": target.strip(" "),
+                        "length": ql_fs.path_getsize(source),
+                        "mtime": time.mktime(time.localtime()),
+                        "source": "rtos"
+                    }
+                    _files.append(file_info)
+                else:
+                    _print("File [{}] is not exists.".format(source))
+            new_args.append(_files)
+            return func(*tuple(new_args), **kwargs)
+        return _wrapper
+    return wrapper
+
+
+class Serial(object):
+    def __init__(self, uart, buadrate=57600, databits=8, parity=0, stopbits=1, flowctl=0):
         self._uart = UART(uart, buadrate, databits, parity, stopbits, flowctl)
+        self._uart.set_callback(self._uart_cb)
         self._queue = Queue(maxsize=1)
         self._timer = osTimer()
-        self._uart.set_callback(self._uart_cb)
 
     def _uart_cb(self, *args):
         if self._queue.size() == 0:
@@ -65,7 +104,7 @@ class Serial(object):
 
     def read(self, nbytes, timeout=0):
         if nbytes == 0:
-            return b''
+            return b""
         if self._uart.any() == 0 and timeout != 0:
             timer_started = False
             if timeout > 0:  # < 0 for wait forever
@@ -117,24 +156,34 @@ class Modem(object):
         0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
         0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
         0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
-    ] # TODO release mem
+    ]  # TODO release mem
+
+    def __init__(self, reader, writer, mode="ymodem1k", program="rzsz"):
+        # Args check.
+        assert mode == "ymodem1k", "Invalid mode specified: %s" % mode
+        assert program in ("rzsz", "rbsb", "pyam", "cyam", "kimp"), "Invalid program specified: %s" % program
 
-    def __init__(self, reader, writer, mode='ymodem1k'):
         self.reader = reader
         self.writer = writer
         self.mode = mode
-        self.program_features = USE_LENGTH_FIELD | USE_DATE_FIELD | USE_MODE_FIELD | ALLOW_1K_BLOCK
+        self.program_features = dict(
+            rzsz=USE_LENGTH_FIELD | USE_DATE_FIELD | USE_MODE_FIELD | ALLOW_1K_BLOCK,
+            rbsb=USE_LENGTH_FIELD | ALLOW_1K_BLOCK,
+            pyam=USE_LENGTH_FIELD | USE_DATE_FIELD | USE_SN_FIELD | ALLOW_1K_BLOCK | ALLOW_YMODEM_G,
+            cyam=ALLOW_1K_BLOCK,
+            kimp=ALLOW_1K_BLOCK,
+        )[program]
         self._recv_file_name = ""
         self._remaining_data_length = 0
         self._recv_file_mtime = 0
         self._recv_mode = 0
         self._recv_sn = 0
+        self.total_size = 0
 
     def abort(self, count=2):
-        for _ in range(count):
-            self.writer(CAN)
+        [self.writer(CAN) for _ in range(count)]
         self._delete_failed_file(self._recv_file_name)
-        return False
+        # return False
 
     def recv(self, crc_mode=1, retry=10, timeout=1000, delay=1, callback=None):
         """
@@ -170,6 +219,7 @@ class Modem(object):
                         if cancel:
                             self.writer(ACK)
                             stream.close()
+                            stream = None
                             if callable(callback):
                                 callback(self._recv_file_name, income_size)
                             self.recv()
@@ -195,6 +245,18 @@ class Modem(object):
                     pass
                 else:
                     data = self.reader(packet_size + 1 + crc_mode)
+                    if platform == "FCM360W" or platform == "FCM362K":
+                        retry_times = 10
+                        while len(data) < (packet_size + 1 + crc_mode):
+                            lost_data_len = packet_size + 1 + crc_mode - len(data)
+                            buf = self.reader(lost_data_len, timeout)
+                            data += buf
+                            if buf == b'':
+                                retry_times -= 1
+                            else:
+                                retry_times = 10
+                            if retry_times <= 0:
+                                break       
                     if data and len(data) == (packet_size + 1 + crc_mode):
                         valid, data = self._verify_recv_checksum(crc_mode, data)
                         # Write the original data to the target file
@@ -204,22 +266,27 @@ class Modem(object):
                             if self._remaining_data_length > 0:
                                 valid_length = min(valid_length, self._remaining_data_length)
                                 self._remaining_data_length -= valid_length
+                            gc.collect()
                             write_packet += data[:valid_length]
                             income_size += len(data)
-                            if len(write_packet) not in (0, 1024, 2048, 3072, 4096):
-                                try:
-                                    stream.write(write_packet)
-                                except Exception as e:
-                                    stream.close()
+                            if len(write_packet) not in (0, 1024, 2048, 3072):
+                                stream.write(write_packet)
                                 write_packet = b""
+                            else:
+                                if self._remaining_data_length == 0:
+                                    stream.write(write_packet)
+                                    write_packet = b""
                             self.writer(ACK)
                             time.sleep_ms(5)
                             sequence = (sequence + 1) % 0x100
                             char = self.reader(1, timeout)
+                            del(data)
                             continue
                         else:
+                            del(data)
                             pass
                     else:
+                        del(data)
                         pass
                 while True:
                     data = self.reader(1, timeout)
@@ -229,6 +296,7 @@ class Modem(object):
                 char = self.reader(1, timeout)
                 continue
         except Exception as e:
+            sys.print_exception(e)
             return False
 
     def _in_transfer_mode(self, crc_mode, retry, delay, timeout=1000, cancel=0, error_count=0):
@@ -253,6 +321,8 @@ class Modem(object):
                 return char
             elif char == STX:
                 return char
+            elif char == EOT:
+                return char
             elif char == CAN:
                 if cancel:
                     return None
@@ -288,6 +358,18 @@ class Modem(object):
                 pass
             else:
                 data = self.reader(packet_size + 1 + crc_mode)
+                if platform == "FCM360W" or platform == "FCM362K":
+                    retry_times = 10
+                    while len(data) < (packet_size + 1 + crc_mode):
+                        lost_data_len = packet_size + 1 + crc_mode - len(data)
+                        buf = self.reader(lost_data_len, timeout)
+                        data += buf
+                        if buf == b'':
+                            retry_times -= 1
+                        else:
+                            retry_times = 10
+                        if retry_times <= 0:
+                            break
                 if data and len(data) == (packet_size + 1 + crc_mode):
                     valid, data = self._verify_recv_checksum(crc_mode, data)
                     if valid:
@@ -295,6 +377,7 @@ class Modem(object):
                         if not len(data):
                             self.writer(ACK)
                             return None
+                        gc.collect()
                         self._recv_file_name = bytes.decode(data.split(b"\x00")[0], "utf-8")
                         self._check_path(self._recv_file_name)
                         try:
@@ -327,21 +410,21 @@ class Modem(object):
                 data = self.reader(1, timeout)
                 if data is None:
                     break
+                if platform == "FCM360W" or platform == "FCM362K":
+                    if data == b'':
+                        return None
             self.writer(NAK)
             char = self.reader(1, timeout)
             continue
 
     @staticmethod
     def _check_path(path):
-        if ql_fs.path_exists(ql_fs.path_dirname(path)):
-            return
-        else:
+        if not ql_fs.path_exists(ql_fs.path_dirname(path)):
             ql_fs.mkdirs(ql_fs.path_dirname(path))
-            return
 
     @staticmethod
-    def _delete_failed_file(path):
-        if ql_fs.path_exists(path):
+    def _delete_failed_file(path=""):
+        if path and ql_fs.path_exists(path):
             uos.remove(path)
 
     def _verify_complement(self, timeout=1000, sequence=0):
@@ -353,10 +436,7 @@ class Modem(object):
             seq2 = self.reader(1, timeout)
             if seq2 is not None:
                 seq2 = 0xff - ord(seq2)
-        if not (seq1 == seq2 == sequence):
-            return False
-        else:
-            return True
+        return (seq1 == seq2 == sequence)
 
     def _verify_recv_checksum(self, crc_mode, data):
         if crc_mode:
@@ -381,16 +461,236 @@ class Modem(object):
             crc = ((crc << 8) ^ self.crc_table[crc_tbl_idx]) & 0xffff
         return crc & 0xffff
 
-    def send(self):
-        pass  # TODO
+    @check_file()
+    def send(self, trans_file, retry=10, timeout=1000, callback=None):
+        packet_size = dict(
+            xmodem=128,
+            xmodem1k=1024,
+            ymodem=128,
+            # Not all but most programs support 1k length
+            ymodem1k=(128, 1024)[(self.program_features & ALLOW_1K_BLOCK) != 0],
+        )[self.mode]
+        if "BG95" in platform:
+            packet_size = 128
+        self.total_size = sum([i["length"] for i in trans_file])
+        success_count = 0
+        for i in trans_file:
+            _print("trans_file: %s" % str(i))
+            _print("[Sender]: Waiting the mode request and open file...")
+            stream = open(i["filepath"], "rb")
+            # wait C
+            crc_mode = self._wait_c(timeout=timeout, retry=retry)
+            if not crc_mode:
+                return False
+            # send file header SOH and wait ACK
+            _print("[Sender]: Preparing info block")
+            if not self.serial_trans(self._make_file_header_info(128, crc_mode, i), timeout, retry):
+                return False
+            # Data packets
+            _print("[Sender]: Waiting the mode request...")
+            # wait C
+            crc_mode = self._wait_c(timeout=timeout, retry=retry)
+            if not crc_mode:
+                return False
+            # send file body and wait ACK
+            sequence = 1
+            while True:
+                _print("[Sender]: start _make_file_body_info")
+                data, length = self._make_file_body_info(stream, packet_size, crc_mode, sequence)
+                _print("[Sender]: end _make_file_body_info")
+                if data:
+                    if not self.serial_trans(data, timeout, retry, success_count, sequence):
+                        return False
+                    else:
+                        success_count += length
+                        if callable(callback):
+                            callback(self.total_size, success_count, i["name"])
+                else:
+                    break
+                sequence = (sequence + 1) % 0x100
+            # send EOT and wait NAK
+            self.writer(EOT)
+            _print("[Sender]: EOT sent and awaiting NAK")
+            if not self._wait_nak_ack(NAK):
+                return False
+            # send EOT and wait ACK
+            self.writer(EOT)
+            _print("[Sender]: EOT sent and awaiting ACK")
+            if not self._wait_nak_ack(ACK):
+                return False
+            # send end frame and wait ACK
+            _print("[Sender]: Transmission finished (ACK)")
+            stream.close()
+        self._send_end_packet(128)
+        _print("[Sender]: Received %r" % self.reader(1))
+        time.sleep(1)
+        return True
+
+    def _wait_c(self, cancel=0, timeout=10 * 1000, retry=10):
+        error_count, crc_mode = 0, 0
+        while True:
+            # Blocking may occur here, the reader needs to have a timeout mechanism
+            char = self.reader(1, timeout)
+            if char:
+                if char == NAK:
+                    crc_mode = 0
+                    _print("[Sender]: Received checksum request (NAK)")
+                    return crc_mode
+                elif char == CRC:
+                    crc_mode = 1
+                    _print("[Sender]: Received CRC request (C/CRC)")
+                    return crc_mode
+                elif char == CAN:
+                    if cancel:
+                        _print("[Sender]: Transmission cancelled (CAN)")
+                        return False
+                    else:
+                        cancel = 1
+                        _print("[Sender]: Ready for transmission cancellation (CAN)")
+                elif char == EOT:
+                    _print("[Sender]: Transmission cancelled (EOT)")
+                    return False
+                else:
+                    _print("[Sender]: Error, expected NAK, CRC, EOT or CAN but got %r" % char)
+            else:
+                _print("[Sender]: No valid data was read")
+            error_count += 1
+            if error_count > retry:
+                _print("[Sender]: Error, error_count reached {}, aborting...".format(retry))
+                self.abort()
+                return False
+
+    def _make_file_header_info(self, packet_size, crc_mode, info=None):
+        _print("_make_file_header_info")
+        # Required field: Name
+        header = self._make_send_header(packet_size, 0)
+        _print("1 target name %s" % info["name"])
+        data = info["name"].encode("utf-8")
+        _print("2 target name %s" % data)
+        # Optional field: Length
+        if self.program_features & USE_LENGTH_FIELD:
+            data += bytes(1)
+            data += str(info["length"]).encode("utf-8")
+        if self.program_features & USE_DATE_FIELD:
+            mtime = oct(int(info["mtime"]))
+            if mtime.startswith("0o"):
+                data += (" " + mtime[2:]).encode("utf-8")
+            else:
+                data += (" " + mtime[1:]).encode("utf-8")
+        # Optional field: Mode
+        if self.program_features & USE_MODE_FIELD:
+            if info["source"] == "Unix":
+                data += (" " + oct(0x8000)).encode("utf-8")
+            else:
+                data += " 0".encode("utf-8")
+        # Optional field: Serial Number
+        if self.program_features & USE_MODE_FIELD:
+            data += " 0".encode("utf-8")
+        data += (b"\x00" * ((packet_size - len(data)) if packet_size > len(data) else 0))
+        checksum = self._make_send_checksum(crc_mode, data)
+        return (header + data + checksum)
+
+    @staticmethod
+    def _make_send_header(packet_size, sequence):
+        _print("_make_send_header")
+        assert packet_size in (128, 1024), packet_size
+        _bytes = []
+        if packet_size == 128:
+            _bytes.append(ord(SOH))
+        elif packet_size == 1024:
+            _bytes.append(ord(STX))
+        _bytes.extend([sequence, 0xff - sequence])
+        return bytearray(_bytes)
+
+    def _make_send_checksum(self, crc_mode, data):
+        _print("_make_send_checksum")
+        _bytes = []
+        if crc_mode:
+            crc = self._calc_crc(data)
+            _bytes.extend([crc >> 8, crc & 0xff])
+        else:
+            crc = self._calc_checksum(data)
+            _bytes.append(crc)
+        return bytearray(_bytes)
+
+    def serial_trans(self, info, timeout=1000, retry=10, success_count=1, sequence=None):
+        error_count = 0
+        # Blocking may occur here, the writer needs to have a timeout mechanism
+        _print("[Sender]: data: {}".format(info))
+        self.writer(info)
+        _print("[Sender]: Block {} (Seq {}) sent".format(success_count, str(sequence)))
+        while True:
+            char = self.reader(1, timeout)
+            _print("[Sender]: reader resp char {}".format(char))
+            if char == ACK:
+                return True
+            elif char == NAK:   # 鎺ユ敹绔啓鏂囦欢寮傚父鐩存帴涓柇
+                return False
+            else:
+                _print("[Sender]: error, expected ACK but got {} for block {}".format(char, str(sequence)))
+                error_count += 1
+                time.sleep_ms(timeout)
+                if error_count > retry:
+                    _print("[Sender]: Error, NAK received {} times, aborting...".format(error_count))
+                    self.abort()
+                    return False
+
+    def _make_file_body_info(self, stream, packet_size, crc_mode, sequence):
+        data = stream.read(packet_size)
+        if not data:
+            _print("[Sender]: Reached EOF")
+            return False, 0
+        length = len(data)
+        header = self._make_send_header(packet_size, sequence)
+        data += (b"\x1a" * ((packet_size - length) if packet_size > length else 0))
+        checksum = self._make_send_checksum(crc_mode, data)
+        return header + data + checksum, length
+
+    def _wait_nak_ack(self, flags, timeout=10000, retry=10):
+        error_count = 0
+        while True:
+            char = self.reader(1, timeout)
+            if char == flags:
+                _print("[Sender]: Received %r" % flags)
+                return True
+            else:
+                _print("[Sender]: Error, expected %r but got %r" % (flags, char))
+                error_count += 1
+                if error_count > retry:
+                    _print("[Sender]: Warning, EOT was not %r, aborting transfer..." % flags)
+                    self.abort()
+                    return False
+
+    def _send_end_packet(self, packet_size, crc_mode=1):
+        header = self._make_send_header(packet_size, 0)
+        data = packet_size * b"\x00"
+        checksum = self._make_send_checksum(crc_mode, data)
+        _print(header + data + checksum)
+        self.writer(header + data + checksum)
 
 
 def enter_ymodem(callback=None):
-    serial_io = Serial(UART.REPL_UART)
+    if platform == "FCM360W" or platform == "FCM362K":
+        serial_io = Serial(UART.REPL_UART, buadrate=115200)
+    else:
+        serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
     receiver = Modem(serial_io.read, serial_io.write)
     receiver.recv(callback=callback)
     serial_io.close()
 
 
-if __name__ == '__main__':
+def send_file(trans_file):
+    if platform == "FCM360W" or platform == "FCM362K":
+        serial_io = Serial(UART.REPL_UART, buadrate=115200)
+    else:
+        serial_io = Serial(UART.REPL_UART if hasattr(UART, "REPL_UART") else UART.UART3)
+    sender = Modem(serial_io.read, serial_io.write)
+    try:
+        sender.send(trans_file)
+    except Exception as e:
+        _print(str(e))
+    serial_io.close()
+
+
+if __name__ == "__main__":
     enter_ymodem()
index 5dd65b7..65b9b99 100644 (file)
@@ -120,7 +120,7 @@ extern const mp_obj_module_t mp_module_ussl;
 extern const mp_obj_module_t mp_module_utimeq;
 extern const mp_obj_module_t mp_module_machine;
 extern const mp_obj_module_t mp_module_lwip;
-extern const mp_obj_module_t mp_module_uwebsocket;
+extern const mp_obj_module_t mp_module_websocket;
 extern const mp_obj_module_t mp_module_webrepl;
 extern const mp_obj_module_t mp_module_framebuf;
 extern const mp_obj_module_t mp_module_btree;
index c63da19..fcb316b 100644 (file)
@@ -82,11 +82,10 @@ STATIC void *realloc_ext(void *ptr, size_t n_bytes, bool allow_move) {
 }
 
 #endif // MICROPY_ENABLE_GC
-#include "helios_debug.h"
+
 void *m_malloc(size_t num_bytes) {
     void *ptr = malloc(num_bytes);
     if (ptr == NULL && num_bytes != 0) {
-        _ql_app_log("m_malloc fail, num_bytes:%d gc_is_locked:%d", num_bytes, gc_is_locked());
         m_malloc_fail(num_bytes);
     }
     #if MICROPY_MEM_STATS
@@ -142,7 +141,6 @@ void *m_realloc(void *ptr, size_t new_num_bytes)
 {
     void *new_ptr = realloc(ptr, new_num_bytes);
     if (new_ptr == NULL && new_num_bytes != 0) {
-        _ql_app_log("m_realloc fail");
         m_malloc_fail(new_num_bytes);
     }
     #if MICROPY_MEM_STATS
index 6dc2b84..2cd24b6 100644 (file)
@@ -284,17 +284,10 @@ STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const
 
     INIT_CODESTATE(code_state, self, n_state, n_args, n_kw, args);
 
-    // extern void helios_mem_check(void);
-    // extern uint32_t mp_python_thread_get_stacksize(void);
-
-    // uint32 temp_mp_stack = mp_python_thread_get_stacksize() * 4;
-    // if(temp_mp_stack == 13376) helios_mem_check();
     // execute the byte code with the correct globals context
-
     mp_globals_set(self->globals);
     mp_vm_return_kind_t vm_return_kind = mp_execute_bytecode(code_state, MP_OBJ_NULL);
     mp_globals_set(code_state->old_globals);
-    // if(temp_mp_stack == 13376) helios_mem_check();
 
     #if MICROPY_DEBUG_VM_STACK_OVERFLOW
     if (vm_return_kind == MP_VM_RETURN_NORMAL) {
index 32555ad..eab5e9e 100644 (file)
@@ -140,8 +140,10 @@ mp_obj_t mp_obj_new_module(qstr module_name) {
 STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {
     { MP_ROM_QSTR(MP_QSTR___main__), MP_ROM_PTR(&mp_module___main__) },
     { MP_ROM_QSTR(MP_QSTR_builtins), MP_ROM_PTR(&mp_module_builtins) },
+    #if !(defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_CC_EXT_TTS) || defined(BOARD_EC800MCN_CC_TTS) \
+        || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS))
     { MP_ROM_QSTR(MP_QSTR_micropython), MP_ROM_PTR(&mp_module_micropython) },
-
+    #endif
     #if MICROPY_PY_IO
     { MP_ROM_QSTR(MP_QSTR_uio), MP_ROM_PTR(&mp_module_io) },
     #endif
@@ -220,7 +222,7 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = {
     { MP_ROM_QSTR(MP_QSTR_lwip), MP_ROM_PTR(&mp_module_lwip) },
     #endif
     #if MICROPY_PY_UWEBSOCKET
-    { MP_ROM_QSTR(MP_QSTR_uwebsocket), MP_ROM_PTR(&mp_module_uwebsocket) },
+    { MP_ROM_QSTR(MP_QSTR_websocket), MP_ROM_PTR(&mp_module_websocket) },
     #endif
     #if MICROPY_PY_WEBREPL
     { MP_ROM_QSTR(MP_QSTR__webrepl), MP_ROM_PTR(&mp_module_webrepl) },
index ec1ef8f..d112cf1 100644 (file)
 
 #include <string.h>
 #include <assert.h>
-
+#include <stdio.h>
 #include "py/unicode.h"
 #include "py/objstr.h"
 #include "py/objlist.h"
 #include "py/runtime.h"
 #include "py/stackctrl.h"
 
+#if MICROPY_QPY_UTF8_GB2312_SWITCH
+#include "gb2312.h"
+#endif
+// #include "helios_debug.h"
+// #define MOD_DATACALL_LOG(msg, ...)      custom_log(unicode, msg, ##__VA_ARGS__)
+
 #if MICROPY_PY_BUILTINS_STR_OP_MODULO
 STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_t *args, mp_obj_t dict);
 #endif
@@ -42,6 +48,127 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_
 STATIC mp_obj_t mp_obj_new_bytes_iterator(mp_obj_t str, mp_obj_iter_buf_t *iter_buf);
 STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in);
 
+#if MICROPY_QPY_UNICODE_ESCAPE_SWITCH
+static void encode_un_to_utf8(uint32_t codePoint, char* out) {
+    if (codePoint <= 0x7F) {
+        out[0] = (char)codePoint;
+        out[1] = '\0';
+    } else if (codePoint <= 0x7FF) {
+        out[0] = 0xC0 | ((codePoint >> 6) & 0x1F);
+        out[1] = 0x80 | (codePoint & 0x3F);
+        out[2] = '\0';
+    } else if (codePoint <= 0xFFFF) {
+        out[0] = 0xE0 | ((codePoint >> 12) & 0xF);
+        out[1] = 0x80 | ((codePoint >> 6) & 0x3F);
+        out[2] = 0x80 | (codePoint & 0x3F);
+        out[3] = '\0';
+    } else {
+        out[0] = 0xF0 | ((codePoint >> 18) & 0x7);
+        out[1] = 0x80 | ((codePoint >> 12) & 0x3F);
+        out[2] = 0x80 | ((codePoint >> 6) & 0x3F);
+        out[3] = 0x80 | (codePoint & 0x3F);
+        out[4] = '\0';
+    }
+}
+
+static char* decodeUnicodeEscape(const char* input) {
+    // str.decode("unicode-escape")
+    if (input == NULL) {
+        return NULL; 
+    }
+    size_t len = strlen(input); 
+    size_t escapeCount = 0; 
+    for (size_t i = 0; input[i] != '\0'; ++i) {
+        if (input[i] == '\\' && input[i + 1] == 'u') {
+            escapeCount++;
+            len += 4;
+        }
+    }
+    char* output = malloc(len * sizeof(char));
+    if (output == NULL) {
+        return NULL;
+    }
+    size_t outPos = 0;
+    for (size_t inPos = 0; input[inPos] != '\0'; ++inPos) {
+        if (input[inPos] == '\\' && input[inPos + 1] == 'u') {
+            uint32_t codePoint;
+            if (sscanf(input + inPos + 2, "%4x", &codePoint) != 1 || codePoint > 0x10FFFF) {
+                inPos += 5;
+                continue;
+            }
+            char utf8Str[5]; 
+            int utf8Len = 0;
+            encode_un_to_utf8(codePoint, utf8Str);
+            for (size_t i = 0; utf8Str[i] != '\0'; ++i) {
+                output[outPos++] = utf8Str[i];
+            }
+            inPos += 5;
+        } else {
+            output[outPos++] = input[inPos];
+        }
+    }
+    output[outPos] = '\0';
+    return output;
+}
+
+static char* encodeUnicodeEscape(const char* input) {
+    // str.encode("unicode-escape") 
+    if (input == NULL)  return NULL; 
+    size_t len = strlen(input); 
+    size_t escapedLen = len; 
+    for (size_t i = 0; input[i] != '\0'; ++i) {
+        if (input[i] >= 128) escapedLen += 2;
+    }
+    char* output = malloc(escapedLen+1);
+    if (output == NULL) return NULL;
+    
+    size_t outPos = 0;
+    for (size_t inPos = 0; inPos < len;++inPos) {
+        unsigned char c = input[inPos];
+        // MOD_DATACALL_LOG("dadsdsasas %x;outPos:%d;inPos:%d;len:%d;escapedLen:%d\r\n",c,outPos,inPos,len,escapedLen);
+        output[outPos] = '\0';
+        // MOD_DATACALL_LOG("dadsdsasas %s\r\n",output);
+        if ((c & 0x80) == 0) {
+            output[outPos++] = c;
+        } 
+        else 
+        {
+            int byteCount = 0;
+            uint32_t codepoint = 0;
+            if ((c >> 5) == 0b110) {
+                byteCount = 2;
+                codepoint = c & 0b00011111;
+            } else if ((c >> 4) == 0b1110) {
+                byteCount = 3;
+                codepoint = c & 0b00001111;
+            } else if ((c >> 3) == 0b11110) {
+                byteCount = 4;
+                codepoint = c & 0b00000111;
+            } else {
+                continue;
+            }
+            if (inPos + byteCount - 1 >= len || (input[inPos + 1] >> 6) != 0b10) {
+                continue;
+            }
+            for (int i = 1; i < byteCount; ++i) {
+                codepoint = (codepoint << 6) | (input[inPos + i] & 0b00111111);
+            }
+            inPos += byteCount - 1;
+
+            int result = snprintf(output + outPos, 7, "\\u%04x", codepoint);
+            // MOD_DATACALL_LOG("dadsdsasas %x;output[outPos]:%c;output[outPos+5]:%c,outPos:%d;inPos:%d;result:%d\r\n",c,output[outPos],output[outPos+5],outPos,inPos,result);
+            if (result < 0) {
+                free(output); 
+                return NULL;
+            }
+            outPos += 6;
+        }
+    }
+    output[outPos] = '\0';
+    // MOD_DATACALL_LOG("dadsdsasas %s\r\n",output);
+    return output;
+}
+#endif
 /******************************************************************************/
 /* str                                                                        */
 
@@ -1910,6 +2037,61 @@ STATIC mp_obj_t bytes_decode(size_t n_args, const mp_obj_t *args) {
         args = new_args;
         n_args++;
     }
+    #if MICROPY_QPY_UTF8_GB2312_SWITCH ||MICROPY_QPY_UNICODE_ESCAPE_SWITCH
+    else if(n_args == 2) {
+        mp_buffer_info_t encoding = {0};
+           mp_get_buffer_raise(args[1], &encoding, MP_BUFFER_READ);
+        #if MICROPY_QPY_UTF8_GB2312_SWITCH
+        if (encoding.len == 6) {
+            char buf[7] = {0};
+            memcpy(buf, encoding.buf, encoding.len);
+            for (size_t i = 0; i < encoding.len; i++) {   
+                if (buf[i] >= 'A' && buf[i] <= 'Z') {  
+                    buf[i] = tolower((unsigned char)buf[i]);  
+                }  
+            } 
+            if (strncmp(buf, "gb2312",6) == 0) {  
+                mp_buffer_info_t bufinfo = {0};
+                mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+                char *utf8Data = malloc(bufinfo.len * 2 * sizeof(char));  
+                if (utf8Data == NULL) {  
+                    mp_raise_TypeError(MP_ERROR_TEXT("malloc error"));
+                }
+                memset(utf8Data, 0, bufinfo.len * 2 * sizeof(char));
+                size_t utf8DataLen = gb2312_to_utf8((uint8_t *)bufinfo.buf, bufinfo.len, (uint8_t *)utf8Data, bufinfo.len * 2 * sizeof(char));
+                new_args[0] = mp_obj_new_str(utf8Data, strlen(utf8Data));
+                new_args[1] = MP_OBJ_NEW_QSTR(MP_QSTR_utf_hyphen_8);
+                args = new_args;
+                free(utf8Data);
+            }
+        }
+        #endif
+        #if MICROPY_QPY_UNICODE_ESCAPE_SWITCH
+        if (encoding.len == 14) {
+            char buf[15] = {0};
+            memcpy(buf, encoding.buf, encoding.len);
+            for (size_t i = 0; i < encoding.len; i++) {   
+                if (buf[i] >= 'A' && buf[i] <= 'Z') {  
+                    buf[i] = tolower((unsigned char)buf[i]);  
+                }  
+            } 
+            if ((strncmp(buf, "unicode-escape",14) == 0)|| ((strncmp(buf, "unicode_escape",14) == 0))) {  
+                mp_buffer_info_t bufinfo = {0};
+                mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+                // mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("malloc error %s,%s"),bufinfo.buf,buf);
+                char *utf8Data = decodeUnicodeEscape((char *)bufinfo.buf);
+                if (utf8Data == NULL) {  
+                    mp_raise_TypeError(MP_ERROR_TEXT("malloc error"));
+                }
+                new_args[0] = mp_obj_new_str(utf8Data, strlen(utf8Data));
+                new_args[1] = MP_OBJ_NEW_QSTR(MP_QSTR_utf_hyphen_8);
+                args = new_args;
+                free(utf8Data);
+            }
+        }
+        #endif
+    }
+    #endif
     return mp_obj_str_make_new(&mp_type_str, n_args, 0, args);
 }
 MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bytes_decode_obj, 1, 3, bytes_decode);
@@ -1923,6 +2105,62 @@ STATIC mp_obj_t str_encode(size_t n_args, const mp_obj_t *args) {
         args = new_args;
         n_args++;
     }
+    #if MICROPY_QPY_UTF8_GB2312_SWITCH ||MICROPY_QPY_UNICODE_ESCAPE_SWITCH
+    else if(n_args == 2) {
+        mp_buffer_info_t encoding = {0};
+           mp_get_buffer_raise(args[1], &encoding, MP_BUFFER_READ);
+        #if MICROPY_QPY_UTF8_GB2312_SWITCH
+        if (encoding.len == 6) {
+            char buf[7] = {0};
+            memcpy(buf, encoding.buf, encoding.len);
+            for (size_t i = 0; i < encoding.len; i++) {   
+                if (buf[i] >= 'A' && buf[i] <= 'Z') {  
+                    buf[i] = tolower((unsigned char)buf[i]);  
+                }  
+            } 
+            if (strncmp(buf, "gb2312",6) == 0) { 
+                mp_buffer_info_t bufinfo = {0};
+                mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+                char *gb2312Data = malloc((bufinfo.len + 1)* sizeof(char));  
+                if (gb2312Data == NULL) {  
+                mp_raise_TypeError(MP_ERROR_TEXT("malloc error"));
+                }
+                memset(gb2312Data, 0, (bufinfo.len + 1) * sizeof(char));
+                size_t gb2312DataLen = utf8_to_gb2312((uint8_t *)bufinfo.buf, bufinfo.len, (uint8_t *)gb2312Data, bufinfo.len * sizeof(char));
+                new_args[0] = mp_obj_new_str(gb2312Data, strlen(gb2312Data));
+                new_args[1] = MP_OBJ_NEW_QSTR(MP_QSTR_utf_hyphen_8);
+                args = new_args;
+                free(gb2312Data);
+            }
+        }
+        #endif
+        #if MICROPY_QPY_UNICODE_ESCAPE_SWITCH
+        if (encoding.len == 14) {
+            char buf[15] = {0};
+            memcpy(buf, encoding.buf, encoding.len);
+            for (size_t i = 0; i < encoding.len; i++) {   
+                if (buf[i] >= 'A' && buf[i] <= 'Z') {  
+                    buf[i] = tolower((unsigned char)buf[i]);  
+                }  
+            } 
+            if  ((strncmp(buf, "unicode-escape",14) == 0)||((strncmp(buf, "unicode_escape",14) == 0))) { 
+                mp_buffer_info_t bufinfo = {0};
+                mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ);
+                // mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("malloc error %s,%s"),bufinfo.buf,buf);
+                char *unicodeData = encodeUnicodeEscape((char *)bufinfo.buf);  
+                if (unicodeData == NULL) {
+                    mp_raise_TypeError(MP_ERROR_TEXT("malloc error"));
+                }
+                new_args[0] = mp_obj_new_str(unicodeData, strlen(unicodeData));
+                // MOD_DATACALL_LOG("dadsdsasas %s\r\n",unicodeData);
+                new_args[1] = MP_OBJ_NEW_QSTR(MP_QSTR_utf_hyphen_8);
+                args = new_args;
+                free(unicodeData);
+            }
+        }
+        #endif
+    }
+    #endif
     return bytes_make_new(NULL, n_args, 0, args);
 }
 MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_encode_obj, 1, 3, str_encode);
index 02f685c..be1c4d6 100644 (file)
@@ -1423,7 +1423,7 @@ mp_obj_t mp_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level) {
     return mp_builtin___import__(5, args);
 }
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 #pragma GCC push_options
 #pragma GCC optimize ("O0")
 #endif
@@ -1474,7 +1474,7 @@ mp_obj_t mp_import_from(mp_obj_t module, qstr name) {
     #endif
 }
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 #pragma GCC pop_options
 #endif
 
index e18e509..aa9e943 100644 (file)
@@ -200,7 +200,7 @@ bool mp_sched_schedule_ex(c_callback_t *callback, mp_obj_t arg)
                int ret = qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_LOAD_BOUNDMETH, loadboundmet_msg);
                if(ret != 0)
                {
-                qpy_callback_para_node_delete(loadboundmet_msg);
+                   qpy_callback_para_node_delete(loadboundmet_msg);
                    free(loadboundmet_msg);
                }
                return true;
index 827c590..3c9b73c 100644 (file)
@@ -209,7 +209,7 @@ STATIC mp_obj_t stream_read_generic(size_t n_args, const mp_obj_t *args, byte fl
 #endif
        )
     {
-        if (error == 107)//socket recv FIN (ENOTCONN)
+        if ((error == 107) || (error == 104))//socket recv FIN (ENOTCONN)
         {
             vstr.len = out_sz;
             return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
@@ -217,7 +217,7 @@ STATIC mp_obj_t stream_read_generic(size_t n_args, const mp_obj_t *args, byte fl
 
         if (out_sz > 0)
         {
-            if (error == 11)//socket non-blocking Try again (MP_EWOULDBLOCK)
+            if ((error == 11) || (error == 110))//socket non-blocking Try again (MP_EWOULDBLOCK)
             {
                 vstr.len = out_sz;
                 return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
@@ -336,7 +336,7 @@ STATIC mp_obj_t stream_readall(mp_obj_t self_in) {
     char *p = vstr.buf;
     mp_uint_t current_read = DEFAULT_BUFFER_SIZE;
     while (true) {
-        int error;
+        int error = 0;
         mp_uint_t out_sz = stream_p->read(self_in, p, current_read, &error);
         if (out_sz == MP_STREAM_ERROR) {
             if (mp_is_nonblocking_error(error)) {
@@ -353,6 +353,20 @@ STATIC mp_obj_t stream_readall(mp_obj_t self_in) {
         if (out_sz == 0) {
             break;
         }
+#if MICROPY_QPY_MODULE_USOCKET
+        if (mp_obj_is_socket(self_in)
+#if MICROPY_PY_USSL
+        || mp_obj_is_ussl_socket(self_in)
+#endif
+        )
+        {
+            if (out_sz >= 1)
+            {
+                vstr.len = out_sz;
+                return mp_obj_new_str_from_vstr(STREAM_CONTENT_TYPE(stream_p), &vstr);
+            }
+        }
+#endif
         total_size += out_sz;
         if (out_sz < current_read) {
             current_read -= out_sz;
@@ -401,7 +415,7 @@ STATIC mp_obj_t stream_unbuffered_readline(size_t n_args, const mp_obj_t *args)
                     goto done;
                 }
 
-                if (vstr.len > 1)
+                if (vstr.len >= 1)
                 {
                     if ((error == 11) || (error == 110))//MP_ETIMEDOUT || socket non-blocking Try again (MP_EWOULDBLOCK)
                     {
index 090fa1b..b977f66 100644 (file)
@@ -15,7 +15,9 @@
 
 NAME = AT
 
-GLOBAL_INCS = .
+GLOBAL_INCS = .  \
+               ../debug \
+               ../os
 
-$(NAME)_SRCS = 
+$(NAME)_SRCS = helios_atcmd_async.c
 
index 6d14866..a71ad68 100644 (file)
@@ -44,17 +44,34 @@ extern "C" {
 #define HELIOS_MAX_AT_TIME_OUT 600
 
 typedef enum HELIOS_AT_RESP_STATUS_ENUM{
-       HELIOS_AT_RESP_OK = 0,
-       HELIOS_AT_RESP_ERROR,
-       HELIOS_AT_RESP_CME_ERROR,
-       HELIOS_AT_RESP_CMS_ERROR,
-       HELIOS_AT_RESP_INVALID_PARAM,
-       HELIOS_AT_RESP_TIME_OUT,
-       HELIOS_AT_RESP_SYS_ERROR,
+       HELIOS_AT_RESP_OK = 0,   //成功
+       HELIOS_AT_RESP_ERROR,    //AT指令未识别
+       HELIOS_AT_RESP_CME_ERROR,   //
+       HELIOS_AT_RESP_CMS_ERROR,   //短信错误
+       HELIOS_AT_RESP_INVALID_PARAM,  //参数错误
+       HELIOS_AT_RESP_TIME_OUT,   //超时
+       HELIOS_AT_RESP_SYS_ERROR,  //系统错误
 }HELIOS_AT_RESP_STATUS_E;
 
 int Helios_Atcmd_Get_Para_Value_Str(char *result,int line_index,int para_index, char *para_value,int para_value_len);
 
+
+/**
+ * @brief:
+ *      发送AT指令
+ *
+ * @param:
+ *      sim_id       [in]    - SIM卡ID,0或1,无双卡功能的模组填0
+ *      cmd          [in]    - 需要发送的AT指令,字符串类型,结尾必须包含'\r\n'
+ *             resp             [out]   - AT指令返回结果会保存在该数组,字符串类型
+ *             resp_len     [in]    - 接收AT指令返回结果的数组最大长度
+ *             include_str  [in]    - 期望指令返回的结果中所包含的字符串,字符串类型,具体如下:
+ *                                                        空字符串 - 获取AT指令返回的所有数据(不包含‘OK’等结果性的字符数据)放入resp参数中
+ *                                                        非空字符串 - 筛选包含该字符串的数据放入resp参数中
+ *             time_out     [in]    - 超时时间,单位/秒
+ * @return:
+ *      成功返回0,失败返回非0值
+ */
 HELIOS_AT_RESP_STATUS_E Helios_Atcmd_Send_Sync(uint8_t sim_id,char *cmd,char *resp,int resp_len,char *include_str,int time_out);
 
 /*-----------------------------------------------------------------------*/
index 3af7182..22e4024 100644 (file)
@@ -112,7 +112,11 @@ typedef enum{
     HELIOS_BT_AVRCP_CONNECTION_STATE_DISCONNECTED_IND=59,                                              //bt avrcp disconnect callback
     HELIOS_BT_AVRCP_VOLUME_CHANGE_IND=60,
     HELIOS_BT_SPP_CONNECT_IND=61,
-    HELIOS_BT_SPP_DISCONNECT_IND=62,     
+    HELIOS_BT_SPP_DISCONNECT_IND=62,    
+#if defined(PLAT_Unisoc_8910_R05)
+    HELIOS_BLE_GATT_SMP_COMPLETE_IND=63,                    //all:BLE smp complete
+    HELIOS_BLE_GATT_SMP_USER_CONFIRM_IND=64,                //all:BLE SMP confirm user passkey
+#endif
 }Helios_BtBleEventIdType;
 
 
@@ -363,13 +367,8 @@ typedef enum
 
 typedef enum 
 {
-    HELIOS_BLE_CONN_NONE                 = 0,
-    HELIOS_BLE_CONN_ACTIVE               = 1,
-    HELIOS_BLE_CONN_CLOSED               = 2,
-    HELIOS_BLE_CONN_PENDING              = 3,
-    HELIOS_BLE_CONN_RELEASEPENDING       = 4,
-    HELIOS_BLE_CONN_PENDINGHOLDALLACLS   = 5,
-    HELIOS_BLE_CONN_REQPENDING           = 6,
+    HELIOS_BLE_CONN_DISCONNECTED = 0,      //ble is disconnected
+    HELIOS_BLE_CONN_CONNECTED,             //ble is connected
 }Helios_BleConnectionStatus;
 
 
@@ -428,11 +427,86 @@ typedef struct
        Helios_BT_Callback ble_user_cb;
 }Helios_BleInitStruct;
 
+#if defined(PLAT_Unisoc_8910_R05)
+typedef enum
+{
+    HELIOS_BLE_SMP_DISPLAY_ONLY = 0,                    //只有显示能力,可以显示PIN码
+    HELIOS_BLE_SMP_DISPLAY_YESNO,                       //只有显示能力,只能显示Yes/No,不能显示PIN码
+    HELIOS_BLE_SMP_KEYBOARD_ONLY,                       //只有输入能力,可以输入PIN码
+    HELIOS_BLE_SMP_NOINPUT_NOOUTPUT,                    //没有输入输出能力
+    HELIOS_BLE_SMP_KEYBOARD_DISPLAY,                    //有输入输出能力,既可以显示PIN码,又可以输入PIN码
+} Helios_BleSmpIoCapability;
+
+/*
+*认证请求参数auth_req
+*bit0   绑定。0配对后不绑定,1配对后绑定。
+*bit2   MITM。0,不启用MIM。1启用MITM。
+*Bit3   SC标志。0使用legacy paring,1使用 Secure Connections pairing。
+*/
+typedef struct
+{
+    Helios_BleSmpIoCapability io_cap;                      //IO能力
+    unsigned char auth_req;                                 //认证请求参数,一般取值为9,即绑定,以及使用Secure Connections pairing
+    unsigned int passkey;                                   //配对显示的PIN码
+    unsigned int timeout;                                   //配对超时时间
+} Helios_BleSmpCfg;
+
+typedef enum
+{
+    HELIOS_BLE_SMP_PAIR_FAIL = 0,                       //配对失败
+    HELIOS_BLE_SMP_LEGACY_JUST_WORK,                    //legecy paring:使用just work,不需要输入PIN码
+    HELIOS_BLE_SMP_LEGACY_PASSKEY_OUTPUT,               //legecy paring:使用passkey entry,显示PIN码,不需要输入PIN码
+    HELIOS_BLE_SMP_LEGACY_PASSKEY_INPUT,                //legecy paring:使用passkey entry,需要输入PIN码
+    HELIOS_BLE_SMP_LEGACY_OOB,                          //legecy paring:使用OOB。不支持
+    HELIOS_BLE_SMP_SECURE_JUST_WORK,                    //secure connection paring:使用just work,不需要输入PIN码
+    HELIOS_BLE_SMP_SECURE_NUMBER_COMPARISON,            //secure connection paring:使用number compairison,显示PIN码,不需要输入PIN码
+    HELIOS_BLE_SMP_SECURE_PASSKEY_OUTPUT,               //secure connection paring:使用passkey entry,显示PIN码,不需要输入PIN码
+    HELIOS_BLE_SMP_SECURE_PASSKEY_INPUT,                //secure connection paring:使用passkey。需要输入PIN码
+    HELIOS_BLE_SMP_SECURE_OOB,                          //secure connection paring:使用OOB。不支持
+} Helios_BleSmpPairMode;
+
+typedef struct
+{
+    unsigned int cid;                           //建立连接得到的连接ID
+    Helios_BleSmpPairMode pair_mode;           //配对模式
+    unsigned int pin;                           //PIN码
+} Helios_BleSmpUserInfo;
+
+typedef enum
+{
+    HELIOS_BLE_SMP_PAIR_CANCELED = 0,                   //取消配对
+    HELIOS_BLE_SMP_PAIR_CONFIRM_WHIHOUT_PIN,            //确认配对,不携带PIN码
+    HELIOS_BLE_SMP_PAIR_CONFIRM_WHIH_PIN,               //确认配对,携带PIN码
+} Helios_BleSmpPairOperate;
+
+typedef struct
+{
+    Helios_BleSmpPairOperate pair_op;          //建立连接得到的连接ID
+    unsigned int pin;                           //PIN码
+} Helios_BleSmpUserConfirm;
 
+#define HELIOS_BLE_MAX_PAIRED_DEVICE_COUNT                    10 //最大10个,不能修改。展锐NV就只保存了10个
+#define HELIOS_BLE_SMP_IRK_LEN                                16
+typedef struct
+{
+    Helios_BtBleAddr addr;
+    unsigned char irk[HELIOS_BLE_SMP_IRK_LEN];
+} Helios_BleSmpDevInfo;
+
+typedef struct
+{
+       uint16_t start_handle;
+       uint16_t end_handle;
+       uint16_t uuid_s;
+       uint8_t  uuid_l[HELIOS_BLE_LONG_UUID_SIZE];
+}Helios_BleHandleUUIDInfo;
+
+#endif
  
 /********************************************************************/
 //以下接口为BT和BLE公用API
 /********************************************************************/
+#if !defined(PLAT_aic8800m40)
 //开启BT/BLE
 int Helios_BTBLE_Start(void);
 //停止BT/BLE
@@ -447,6 +521,16 @@ int Helios_BTBLE_GetLocalName(Helios_BtBleLocalName *local_name);
 int Helios_BTBLE_SetScanReportFilter(uint8_t act);
 //è\8e·å\8f\96广æ\92­æ\95°æ\8d®ç\9a\84è¿\87滤ç­\96ç\95?
 int Helios_BTBLE_GetScanReportFilter(uint8_t *act);
+#else
+ //开启BLE GATT
+int Helios_BLE_GattStart(void);
+ //关闭BLE GATT
+int Helios_BLE_GattStop(void);
+//获取BLE状态
+int Helios_BLE_GetStatus(Helios_BtBle_Status *status);
+ //设置BLE GATT 名字
+int Helios_BLE_GattSetLocalName(Helios_BtBleLocalName *local_name);
+#endif
 
 
 /********************************************************************/
@@ -539,6 +623,25 @@ int Helios_BLE_GattWriteChara(uint16_t conn_id, uint16_t handle, Helios_BleChara
 //GATT client å\86\99å\85¥ç\89¹å¾\81å\80?è\93\9dç\89\99é\93¾è·¯å±\82ä¸\8dé\9c\80è¦\81ç¡®è®?
 int Helios_BLE_GattWriteCharaNoRsp(uint16_t conn_id, uint16_t handle, Helios_BleGeneralData *info);
 
+#if defined(PLAT_Unisoc_8910_R05)
+//Set the configuration parameters used in the BLE SMP pairing process
+int Helios_BLE_SmpSetConfig(Helios_BleSmpCfg smp_cfg);
+//Get the configuration parameters used in the BLE SMP pairing process
+int Helios_BLE_SmpGetConfig(Helios_BleSmpCfg* smp_cfg);
+//Start the BLE SMP pairing process
+//SMP pairing is initiated by the client, and the server can notify the client to initiate the SMP pairing request
+int Helios_BLE_SmpStartPair(uint16_t conn_id);
+//The user performs the corresponding operation according to the value of smp pair mode
+int Helios_BLE_SmpUserConfirm(Helios_BleSmpUserConfirm user_confirm, uint16_t conn_id);
+//Obtain device information for BLE SMP pairing
+int Helios_BLE_SmpGetPairedDevInfo(unsigned char paired_num, unsigned char *real_paired_num, Helios_BleSmpDevInfo *dev_list);
+//Removes BLE SMP pairing information for the specified device
+int Helios_BLE_SmpRemovePairedDev(Helios_BtBleAddr *dev);
+//Remove BLE SMP pairing information for all devices
+int Helios_BLE_SmpCleanPairedDev(void);
+
+#endif
+
 /****************************** Classic BT API**************************************/
 int Helios_BT_Init(Helios_BtInitStruct *info);
 int Helios_BT_Release(void);
@@ -584,6 +687,7 @@ int Helios_BT_SPP_Init(void);
 int Helios_BT_SPP_Release(void);
 
 /****************************** BT HFP API**************************************/
+#if !defined(PLAT_aic8800m40)
 //BT HFPå\88\9då§\8bå\8c?
 int Helios_BT_HFP_Init(void);
 //BT HFP释放资源
@@ -639,8 +743,7 @@ int Helios_BT_AVRCP_GetVol(uint8_t *vol);
 int Helios_BT_AVRCP_GetPlayStatus(uint8_t *status);
 //è\8e·å\8f\96AVRCPå\8d\8fè®®è\8e·å\8f\96主æ\9cºè¿\9eæ\8e¥ç\8a¶æ\80?
 int Helios_BT_AVRCP_GetConnectStatus(uint8_t *status);
-
-
+#endif
 
 #ifdef __cplusplus
 } /*"C" */
index b53a4fb..7136fb4 100644 (file)
@@ -26,13 +26,20 @@ void Helios_Debug_Enable(void);
 void Helios_Debug_Disable(void);
 int Helios_Debug_Output(const char *fmt, ...);
 void Helios_Assert(const char      *cond, const char *file, int line, const char* fmt, ...);
-void _ql_app_log(const char* fmt, ...);
+#if defined(PLAT_RDA)
+int Helios_Debug_Trace(char * data,unsigned int len);
+#endif
 
 #if CONFIG_POC_SLPOC
 void Helios_USB_Log_Enable(void);
 #endif
 
-#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC)
+#if defined(PLAT_Unisoc_8850_R02)
+int Helios_Debug_PCM_Data_Dump_Log_Set(uint8_t enable);
+#endif
+
+#if defined(BOARD_EC600MCN_CC_EXT) || defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
+    || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS)
 #define helios_debug(fmt, ...)
 #define custom_log(tag, fmt, ...)
 #else
index 5016dac..7965964 100644 (file)
@@ -32,16 +32,21 @@ typedef enum
     HELIOS_DEV_MODEM_FUN_TURN_OFF_FULL_SECONDARY_RX
 } Helios_DevModemFunction;
 
-int Helios_Dev_GetIMEI(void *buffer, size_t len);
-int Helios_Dev_GetSN(void *buffer, size_t len);
 int Helios_Dev_GetQpyVersion(char *buffer, size_t len);
 int Helios_Dev_GetModel(void *buffer, size_t len);
 int Helios_Dev_GetProductName(void *buffer, size_t len);
 int Helios_Dev_GetPID(void *buffer, size_t len);
 int Helios_Dev_GetFwVersion(void *buffer, size_t len);
-int Helios_Dev_SetModemFunction(Helios_DevModemFunction modem_fun, bool reset);
-int Helios_Dev_GetModemFunction(Helios_DevModemFunction *modem_fun_ptr);
-#if defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+int Helios_Dev_GetIMEI(void *buffer, size_t len, uint8_t sim_id);
+int Helios_Dev_GetSN(void *buffer, size_t len, uint8_t sim_id);
+int Helios_Dev_SetModemFunction(Helios_DevModemFunction modem_fun, bool reset, uint8_t sim_id);
+int Helios_Dev_GetModemFunction(Helios_DevModemFunction *modem_fun_ptr, uint8_t sim_id);
+
+#if defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
+int Helios_Dev_GetMAC(void *buffer, size_t len);
+#endif
+
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 int Helios_Dev_IncreaseCoreVoltage(void);
 #endif
 
index 2503594..8ea3903 100644 (file)
@@ -35,20 +35,200 @@ WHEN               WHO                     WHAT,WHERE,WHY
 #ifndef _HELIOS_ESIM_H
 #define _HELIOS_ESIM_H
 
+#include "mphalport.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
+
+#define ESIM_LPA_PROFILE_LIST_MAX_NUM 10
+#if MICROPY_QPY_MODULE_ESIM_IPA
+
+typedef void (*Helios_esim_cb_t)(uint8_t sim_id, unsigned int ind_flag,int result , void *contextPtr);
+
+#define  ESIM_LPA_DATA_MAX                      128
+
+typedef enum {
+    HELIOS_ESIM_MODE_LPA = 0X00,
+    HELIOS_ESIM_MODE_IPA = 0X01,
+    HELIOS_ESIM_MODE_INVALID = 0XFF
+}Helios_Esim_Mode;
+
+typedef enum
+{
+    HELIOS_ESIM_NOTIFICATION_TYPE_ALL = 0,
+    HELIOS_ESIM_NOTIFICATION_TYPE_ENABLE,
+    HELIOS_ESIM_NOTIFICATION_TYPE_DISABLE,
+    HELIOS_ESIM_NOTIFICATION_TYPE_DELETE,
+    HELIOS_ESIM_NOTIFICATION_TYPE_INSTALL
+} Helios_Esim_Notification_Type;
+
+typedef enum {
+    HELIOS_ESIM_GET_PROFILE_INFO = 0, 
+    HELIOS_ESIM_LIST_PROFILE_INFO    
+}Helios_esim_profile_list_opt;
+
+typedef enum {
+    HELIOS_ESIM_ENABLE_PROFILE = 0,
+    HELIOS_ESIM_DISABLE_PROFILE,
+    HELIOS_ESIM_DELETE_PROFILE,
+
+    HELIOS_ESIM_PROFILE_TAG_MAX_NUM
+} HELIOS_ESIM_PROFILE_TAG;
+typedef enum
+{
+    HELIOS_ESIM_LPA_OTA_DOWN_PROFILE = 0,
+    HELIOS_ESIM_LPA_UART_DOWN_PROFILE
+} Helios_esim_lpa_profile_down_opt;
+
+typedef enum
+{
+    HELIOS_ESIM_LPA_AT_INVALID_RSP = 0,
+    HELIOS_ESIM_LPA_AT_PROFILE_RSP,
+    HELIOS_ESIM_LPA_AT_PROFILE_LIST_RSP,
+    HELIOS_ESIM_LPA_AT_NICKNAME_RSP,
+    HELIOS_ESIM_LPA_AT_GET_EID_RSP,
+    HELIOS_ESIM_LPA_AT_SET_APN_RSP,
+    HELIOS_ESIM_LPA_AT_NOTIFICATION_LIST_RSP,
+    HELIOS_ESIM_LPA_AT_NOTIFICATION_OPT_RSP,
+    HELIOS_ESIM_LPA_AT_DOWN_OPT_RSP,
+    HELIOS_ESIM_LPA_PROFILE_TRANS_RSP,
+    HELIOS_ESIM_LPA_PROFILE_INSTALL_RSP,
+    HELIOS_ESIM_LPA_VERSION_RSP,
+    HELIOS_ESIM_SDK_COMPILE_RSP,
+    HELIOS_ESIM_IPA_VERSION_RSP,
+    HELIOS_ESIM_IPA_POLL_SET_RSP,
+    HELIOS_ESIM_IPA_EIM_LIST_RSP,
+    HELIOS_ESIM_IPA_EIM_ADD_RSP,
+    HELIOS_ESIM_IPA_EIM_OPT_RSP,
+    HELIOS_ESIM_IPA_TIMER_CFG_GET_RSP,
+    HELIOS_ESIM_IPA_FALLBACK_RSP,
+    HELIOS_ESIM_IPA_FALLBACK_RETURN_RSP,
+    HELIOS_ESIM_LPA_AT_GET_APN_RSP,
+} Helios_esim_cmd;
+
+typedef enum
+{
+    HELIOS_ESIM_AT_NOTIFICATION_GET_OPT = 0,
+    HELIOS_ESIM_AT_NOTIFICATION_DELETE_OPT,
+    HELIOS_ESIM_AT_NOTIFICATION_REPORT_OPT
+}Helios_esim_notification_opt;
+
+typedef enum
+{
+    HELIOS_ESIM_EIM_UPDATE = 0,
+    HELIOS_ESIM_EIM_DELETE,
+    HELIOS_ESIM_EIM_ADD
+} Helios_esim_eim_opt;
+
+typedef struct {
+       char iccid[ESIM_LPA_DATA_MAX+1];
+       uint8_t status;
+       char nickname[ESIM_LPA_DATA_MAX+1];
+       char provider[ESIM_LPA_DATA_MAX+1];
+} ESIM_Profile_List;
+
+typedef struct {
+    int32_t profile_num;
+    ESIM_Profile_List profile_list[ESIM_LPA_PROFILE_LIST_MAX_NUM];
+} Helios_Esim_Profilelistinfo_Struct;
+
+
+
+typedef struct {
+       uint32_t type;
+    uint32_t seq_num;
+       char iccid[ESIM_LPA_DATA_MAX+1];
+} Esim_LPA_Notification_list;
+
+typedef struct{
+    uint8_t list_num;
+    Esim_LPA_Notification_list notyfication_list[ESIM_LPA_PROFILE_LIST_MAX_NUM];
+}Helios_Esim_LPA_Notification_list;
+
+typedef struct {
+    Helios_esim_lpa_profile_down_opt down_type;
+    uint32_t   playload_len;
+    uint8_t    *playload_info;
+    uint32_t    data_len;
+    uint8_t     data[ESIM_LPA_DATA_MAX+1];
+}Helios_Esim_uart_download_resp;
+
+
+typedef enum {
+    HELIOS_EIMIDTYPEOID = 1,
+    HELIOS_EIMIDTYPEFQDN,
+    HELIOS_EIMIDTYPEPROPRIETARY
+}Helios_eim_id_type;
+
+typedef struct {
+       bool        status;
+    Helios_eim_id_type eim_type;
+       char eim_id_info[ESIM_LPA_DATA_MAX+1];
+    char eim_fqdn_info[ESIM_LPA_DATA_MAX+1];
+} Esim_IPA_Eim_list;
+
+typedef struct{
+    int32_t element_num;
+    Esim_IPA_Eim_list notyfication_list[ESIM_LPA_PROFILE_LIST_MAX_NUM];
+}Helios_Esim_Eim_list;
+
+typedef struct {
+    uint32_t    ipa_poll_interval;
+    uint32_t    rollback_interval;
+    #if 0
+    bool        auto_sync_flag;
+    bool        regular_sync_flag;
+    uint32_t    regular_interval;
+    #endif
+}Helios_esim_ipa_cfg_resp;
+
+
+typedef struct {
+    uint32_t data_len;
+    char *data;
+}Helios_data_array;
+
+typedef struct {
+    Helios_esim_notification_opt opt;              
+    uint32_t                apdu_result_code; 
+    uint32_t                result;           
+    Helios_data_array      rsp_info;           
+}Helios_esim_notification_resp;
+
+int Helios_Esim_init(Helios_Esim_Mode mode);
+int Helios_Esim_deinit();
+int Helios_Esim_Get_Eid(void);
+int Helios_Esim_Add_Event_Handler(Helios_esim_cb_t handlerPtr);
+int Helios_Esim_Get_Profiles_Info(Helios_esim_profile_list_opt listmode);
+int Helios_Esim_LPA_Profile_Handle(HELIOS_ESIM_PROFILE_TAG profile_tag, uint8_t *iccid);
+int Helios_Esim_LPA_Set_Nickname(uint8_t *iccid,uint8_t *nickname);
+int Helios_Esim_LPA_Get_Version(void);
+int Helios_Esim_LPA_Get_CompileTime(void);
+int Helios_Esim_LPA_Profile_Ota(Helios_esim_lpa_profile_down_opt download_mode,uint8_t *activationCode, uint8_t *confirmationCode);
+int Helios_Esim_LPA_Profile_Trans(uint32_t total_len,bool state,uint8_t seq,uint32_t data_len,uint8_t *data);
+int Helios_Esim_LPA_Get_Notification_List(Helios_Esim_Notification_Type type);
+int Helios_Esim_LPA_Notification_hdlr(Helios_esim_notification_opt opt_mode,uint32_t seq_num);
+int Helios_Esim_IPA_Poll_Interval_Set(int sec);
+int Helios_Esim_IPA_Eim_List(void);
+int Helios_Esim_IPA_Eim_Info_Opt(uint8_t *eim_id,uint8_t *eim_domain,Helios_esim_eim_opt mode);
+int Helios_Esim_IPA_Timer_Cfg_Get(void);
+int Helios_Esim_IPA_Fallback(void);
+int Helios_Esim_IPA_Fallback_Return(void);
+int Helios_Esim_LPA_Get_Apn(void);
+int Helios_Esim_LPA_Set_Apn(uint8_t *apn);
+#else
 /*-----------------------------------------------------------------------*/
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
+#if MICROPY_QPY_MODULE_ESIM
 
 #define HELIOS_ESIM_LPA_OTA_SUCCESS 0
 #define HELIOS_ESIM_LPA_OTA_FAILED  1
 
 typedef void (*Helios_esim_cb_t)(uint8_t sim_id, unsigned int ind_flag, void *contextPtr);
 
-#define ESIM_LPA_PROFILE_LIST_MAX_NUM 10
 #define ESIM_LPA_EUICCID_MAX_LEN      32
 #define ESIM_ICCID_MAX_LEN            20
 #define ESIM_NICKNAME_MAX_LEN         64
@@ -113,6 +293,12 @@ int Helios_Esim_LPA_Remove_Notifications(uint32_t seqnum);
 
 int Helios_Esim_LPA_Get_Notifications(Helios_Esim_Notifications_Info_List *info);
 
+#if MICROPY_QPY_MODULE_ESIM_LPA_SET_TIMEOUT
+int Helios_Esim_LPA_Set_Cmd_Timeout(int timeout);
+#endif
+
+#endif
+#endif
 /*-----------------------------------------------------------------------*/
 #ifdef __cplusplus
 }
index c432c72..6cbc83d 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <stddef.h>
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)//forrest.liu@20220611 add for http header set by python
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)//forrest.liu@20220611 add for http header set by python
 struct header
 {
        char *key;
@@ -34,5 +34,6 @@ int Helios_Fota_PackageFlush(int hdl);
 int Helios_Fota_PackageVerify(int hdl);
 int Helios_Fota_firmware_download(char * address1, char * address2, void(*cb)(int sta, int progress));
 void Helios_Fota_Deinit(int hdl);
+int Helios_Fota_Set_PublicKey(unsigned char* key, int key_len);
 
 #endif
index d874121..71e97da 100644 (file)
@@ -59,15 +59,16 @@ int Helios_fgetc(HeliosFILE *file);
 char *Helios_fgets(char *str, int n, HeliosFILE *file);
 int Helios_fscanf(HeliosFILE *file, const char *format, ...);
 void Helios_lfs_register(void *p);
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 int Helios_lfs_mount(const char *base_path, void *p, const char* flashName);
+int Helios_lfs_mount_threadsafe(const char *base_path, void* p, const char* flashName, void* vfs_lfs_mutex);
 #else
 int Helios_lfs_mount(const char *base_path, void *p);
 #endif
 int Helios_sd_mount(void);
 int Helios_sd_set_det(size_t gpio_num,Helios_sd_det_mode mode);
 int Helios_sd_set_callback(Helios_SD_Callback sd_callback_fnc);
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(BOARD_BG95M6) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 void Helios_set_nor_flash_spi(unsigned char port_number,unsigned char clk);
 #endif
 
@@ -80,8 +81,9 @@ int Helios_EXTFS_Init(int port, int clk);
 void* Helios_vfs_get_vfsobj_by_PYPath(const char *python_path);
 
 // add by elian.wang
-#ifdef PLAT_ASR_1803s
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 
+#define ASR_SDIO_SD_VOLUME                     "C:"
 HeliosFILE *Helios_fat_fopen(const char *fname, const char *mode);
 int Helios_fat_fclose(HeliosFILE *file);
 int Helios_fat_remove(const char *fname);
@@ -101,7 +103,22 @@ int Helios_fat_dirread(void* f_dir, void* f_fileinfo);
 int Helios_fat_format(const char* fs_path);
 int Helios_fat_dirclose(void* f_dir);
 
+typedef enum Helios_sdio_device_type
+{
+    HELIOS_SDIO_SDCARD,
+    HELIOS_SDIO_EMMC
+} Helios_sdio_device_type_e;
+
+int Helios_fat_device_type_switch(Helios_sdio_device_type_e sdio_device_type);
 #endif
 
+#if defined(PLAT_RDA) || defined(PLAT_ASR_1606)
+extern int Helios_NV_File_Exist(const char *file_name);
+extern int Helios_NV_File_Write(const char   *file_name,      void *write_buf,int write_size);
+extern int Helios_NV_File_Read(const char   *file_name,      void *read_buf,int read_size);
+extern int Helios_NV_File_Delete(const char   *file_name);
+
+#define PYLOG_PORT_CFG_FILE "pylog_cfg"
+#endif
 
 #endif
index 97a9a60..0cbb8b2 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 #include "helios_debug.h"
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8850) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) \
+   || defined(PLAT_Unisoc) \
+   || defined(PLAT_ASR_1606) \
+   || defined(PLAT_ASR_1609) \
+   || defined(PLAT_EIGEN) \
+   || defined(PLAT_EIGEN_718) \
+   || defined(PLAT_Unisoc_8850) \
+   || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) \
+   || defined(PLAT_Unisoc_8910_R05) \
+   || defined(PLAT_ASR_1602) \
+   || defined(PLAT_Unisoc_8850_R02) \
+   || defined(PLAT_Unisoc_8910_R06)
 
 
 #define FS_MAP_MAX 8
@@ -40,21 +50,8 @@ void Helios_lfs_Map_printf() {
        }
 
 }
-//fs map check hook start
-// void Helios_fs_map_check(void)
-// {
-//     // HELIOS_FS_LOG("FS MAP CHECK!!\r\n");
-//     int index = 0;
-//     for(index = 0; index < 3; index++)
-//     {
-//             if(strcmp(fs_map[index].pythonPath, "/ext") == 0 && strcmp(fs_map[index].Letter, "E:") != 0)
-//             {
-//                     assert(0);
-//             }
-//     }
-// }
-
-//fs map check hook end
+
+
 int Helios_lfs_register_map(const char *flashName, const char* Letter, const char *python_path, void* vfs_self) {
        int index = 0;
        
@@ -79,18 +76,9 @@ int Helios_lfs_register_map(const char *flashName, const char* Letter, const cha
                        strncpy(fs_map[index].pythonPath, python_path, strlen(python_path));
                        fs_map[index].vfs_self = vfs_self;
                        Helios_lfs_Map_printf();
-                       //fs map check hook start
-                       if(!strcmp(Letter, "E:"))
-                       {
-                               // extern void Helios_fs_map_check_hook_register(void* hook);
-                               // Helios_fs_map_check_hook_register(Helios_fs_map_check);
-                               HELIOS_FS_LOG("FS MAP CHECK HOOK REGISTER!\r\n");
-                       }
-                       //fs map check hook end
                        return 0;
                }
        }
-
        return -1;
 }
 
index 9537e90..4c52b13 100644 (file)
@@ -73,5 +73,10 @@ int Helios_GNSS_enableGST(uint8_t opt);
 int Helios_GNSS_SetGnssLtePriority(Helios_GNSS_LTE_Priority priority);
 int Helios_GNSS_GetGnssLtePriority(Helios_GNSS_LTE_Priority *priority);
 #endif
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc) \
+ || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR)
+int Helios_GNSS_Configuration_Set(uint8_t config_type, uint8_t config_value);
+int Helios_GNSS_Configuration_Get(uint8_t config_type);
+#endif
 
 #endif
index 2511fab..21cdc02 100644 (file)
@@ -153,6 +153,8 @@ typedef enum
     HELIOS_AUDIO_FORMAT_AAC,    ///< AAC
     HELIOS_AUDIO_FORMAT_M4A,    ///< M4A
     HELIOS_AUDIO_FORMAT_TS,     ///< TS
+    HELIOS_AUDIO_FORMAT_FLV,
+    HELIOS_AUDIO_FORMAT_RTMP,
 
        HELIOS_AUDIO_FORMAT_MAX
 } Helios_AudStreamFormat;
@@ -222,7 +224,6 @@ typedef enum
 
 } Helios_Stream_Jump_Dir;
 
-#if defined (PLAT_ASR)
 typedef enum
 {
                HELIOS_VC_HANDSET = 0,  
@@ -243,7 +244,6 @@ typedef enum
        
                QL_PROFILE_ID_ENUM_16_BIT = 0x7FFF //16bit enum compiling enforcement    
 } HELIOS_PROFILE_ID;
-#endif
 
 
 typedef enum
@@ -271,10 +271,17 @@ typedef enum
        Helios_PCM_CODEC_SAMPLE_48000 = 48000,
 }Helios_pcm_codec_sample;
 
+typedef enum
+{
+       HELIOS_AUD_VOICECALL_NB = 0,    //not volte mode
+       HELIOS_AUD_VOICECALL_WB = 5             //volte mode
+}Helios_AUD_CALLMODE_E;
+
 typedef struct
 {
        Helios_pcm_bclk pcmbclk;
        Helios_pcm_codec_sample sample;
+    char is_i2s;
 }Helios_ExternalCodecPcm_config;
 
 typedef struct
@@ -337,8 +344,42 @@ typedef enum
     HELIOS_HEADSET_PLUGSTATUS_IN  = 1,
 }HELIOS_HEADSET_PLUGSTATUS_E;
 
+typedef enum
+{
+       HELIOS_AUD_SPKPA_TYPE_NONE = -1, //audio not init done
+
+    HELIOS_AUD_SPKPA_TYPE_CLASSAB,
+    HELIOS_AUD_SPKPA_TYPE_CLASSD,
+    
+    HELIOS_AUD_SPKPA_TYPE_MAX
+} Helios_Audio_Speakerpa_Type;
+
+typedef enum
+{
+       HELIOS_AUD_START_FIRST_DEC_THEN_PA = 0,   //open codec first and then pa 
+    HELIOS_AUD_START_FIRST_PA_THEN_DEC = 1,   //open pa first and then codec
+    HELIOS_AUD_START_MODE_MAX
+} HELIOS_AUDIO_START_MODE_E;
+
+typedef enum
+{
+       HELIOS_AUD_END_FIRST_DEC_THEN_PA = 0,   //close codec first and then pa 
+    HELIOS_AUD_END_FIRST_PA_THEN_DEC = 1,   //close pa first and then codec
+    HELIOS_AUD_END_MODE_MAX
+} HELIOS_AUDIO_END_MODE_E;
+
+typedef enum
+{
+       Helios_PCM_CODEC_AboutToOpen = 0,
+       Helios_PCM_CODEC_Opened,
+       Helios_PCM_CODEC_AboutToClose,
+       Helios_PCM_CODEC_Closed,
+}Helios_pcm_codec_event;
+
+
 
 typedef void (*Helios_headset_callback)(HELIOS_HEADSET_CBTYPE_E cb_type, uint32_t param);
+typedef void(*helios_pcm_codec_cb_t)(Helios_pcm_codec_event event);
 
 // only for EC600U end
 
@@ -626,16 +667,23 @@ int Helios_TTS_SetSpeed(int value);
 int Helios_TTS_GetSpeed(void);
 int Helios_TTS_SetVolume(int value);
 int Helios_TTS_GetVolume(void);
+#if defined (PLAT_Unisoc)
+int Helios_TTS_SetDigits(int value);
+int Helios_TTS_GetDigits(void);
+#endif
 int Helios_Audio_SetToneVolume(Helios_AudHALSPKLevel vol);
 int Helios_Audio_SetPa(int gpio_num);
 int Helios_Audio_SetPaCallback(Helios_AudOutputType type, helios_audio_pa_cb_t cb);
+int Helios_Set_Audio_Pa_Type(Helios_Audio_Speakerpa_Type pa_type);
+Helios_Audio_Speakerpa_Type Helios_Get_Audio_Pa_Type(void);
+
 
 int Helios_Audio_SetDigGainTable(Helios_AudPlayerType type, signed short *gain);
 
 
 int audio_channel_check(int channel);
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 
 Helios_JumpInfoStruct Helios_Audio_Stream_Jump(int second,Helios_Stream_Jump_Dir drection);
 
@@ -647,20 +695,22 @@ long unsigned int Helios_Audio_Stream_Seek(uint32_t second);
 
 int Helios_Audio_SetDSPGainTable(uint32_t profile_id, int16_t* gain);
 
+int Helios_aud_set_calib_real_time(int real_time);
 #endif
 
-#if defined (PLAT_ASR)
 int Helios_Audio_SetDSPGainTable(uint32_t profile_id, int16_t* gain);
 int Helios_Audio_SetCodecGainTable(uint32_t profile_id, int32_t level, uint32_t* data);
 uint32_t Helios_get_current_profileID();
-#endif
+
 
 #if defined(BOARD_EC600MCN_LA) || defined(BOARD_EC600MCN_LA_POC_XBND)|| defined(BOARD_EC600MCN_LA_POC_QS) \
     || defined(BOARD_EC600MCN_LA_VOLTE) || defined(BOARD_EC600MCN_LA_HJT) || defined(BOARD_EC600MCN_LC) \
     || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LF) || defined(BOARD_EC600MCN_LE_POC_XBND) \
-       || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
+       || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) || defined(BOARD_EC600MCN_LF_SPISD)\
        || defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_LE_VOLTE) \
-       || defined(BOARD_EC600MCN_CC_EXT)|| defined(BOARD_EC600MCN_LF_SLPOC)
+       || defined(BOARD_EC600MCN_CC_EXT)|| defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
+    || defined(BOARD_EC800MCN_CC_TTS) || defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC600KCN_CC_TTS) \
+       || defined(BOARD_EC600MEU_LA_POC_XBND) || defined(BOARD_EC600MLA_LA_POC_XBND)
 
 int Helios_Audio_Play_Tone(int f1, int f2);
 #else
@@ -684,15 +734,16 @@ void Helios_pcm_play_stop_skip_pa(void);
  */
 void Helios_Audio_Codec_Switch(Helios_Codec_type type, Helios_ExternalCodecPcm_config *config);
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 void Helios_Audio_PCM_para_set(int samplerate, int channels);
+
 #endif
 
-#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined (PLAT_ASR) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 int helios_audio_getInitState(void);
 #endif
 
-#if defined (PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 int Helios_mp3_Clear_Cache();
 
 int Helios_mp3_get_cache_size();
@@ -752,7 +803,7 @@ typedef enum {
     YDWL_TTS_EVT_INIT         = 0,
     YDWL_TTS_EVT_DEINIT,
     YDWL_TTS_EVT_PLAY_START,
-    YDWL_TTS_EVT_COMPOSITE_OVER,      //语音合成完成,但播放未完成
+    YDWL_TTS_EVT_COMPOSITE_OVER,      //语音合成完成,但播放未完�?
     YDWL_TTS_EVT_PLAY_STOP,           //not used
     YDWL_TTS_EVT_PLAY_FINISH,         //TTS语音播放完成
     YDWL_TTS_EVT_PLAY_FAILED,         //not used
@@ -765,7 +816,75 @@ typedef void (*ydwl_tts_cb_type)(int id, YDWL_TTS_ENVENT_E status);
 void Helios_ydwl_tts_init(ydwl_tts_cb_type usr_cb);
 void Helios_ydwl_tts_play(const char* string, unsigned int len);
 #endif
+
 int Helios_mute_voicecall(Helios_Mute_VoiceCall direction, unsigned char mute, unsigned char time);
+
+void Helios_set_audio_read_delay(int time);
+
+int Helios_aud_set_icmic_gain(Helios_AUD_CALLMODE_E mode, Helios_AudOutputType type, int ana_gain, int adc_gain);
+
+
+int Helios_PCM_Codec_Event_Callback_Register(helios_pcm_codec_cb_t cb);
+
+int Helios_Audio_Iic_Write(unsigned char dev_addr, unsigned short reg_addr, unsigned char size, unsigned short val);
+
+int Helios_Audio_Iic_Read(unsigned char dev_addr, unsigned short reg_addr, unsigned char size, void *p_val);
+
+typedef enum
+{
+       HELIOS_PCM_NONE = 0,
+       HELIOS_PCM_LOCAL,
+       HELIOS_PCM_VOICE_CALL,
+       HELIOS_PCM_POC,
+
+       HELIOS_PCM_MAX,
+}Heliso_PCM_Path;
+
+typedef enum
+{
+       HELIOS_POC_TYPE_MIN = -1,
+
+       HELIOS_POC_TYPE_HALF_DUPLEX,
+       HELIOS_POC_TYPE_FULL_DUPLEX,
+
+       HELIOS_POC_TYPE_MAX,
+}Helios_PCM_POC_Type;
+
+
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+int Helios_set_pcm_type(char type, char poc_mode);
+int Helios_start_poc_mode(int mode);
+int Helios_stop_poc_mode(void);
+#endif
+
+
+#if defined (PLAT_ASR_1606)
+ /* QDAI config structure */
+typedef struct {
+       char io;
+       char mode;
+       char fsync;
+    char clock;
+       char format;
+       char sample;
+       char num_slots;
+       char slot_mapping;
+}Helios_QdaiStruct;
+int Helios_customer_set_qdai_cfg(Helios_QdaiStruct qdai);
+
+int Helios_Audio_Set_Denoise(unsigned char set);
+
+int Helios_Audio_Get_Denoise(unsigned char *flag);
+
+int Helios_Audio_Check_Denoise_Licenses_Verify(unsigned char *flag);
+
+int Helios_Audio_Get_Denoise_Lib_Version(unsigned char *version);
+
+int Helios_PCM_Get_Write_Frame_Count(void* handle);
+
+int Helios_PCM_Reset_Write_Buffer(void* handle);
+#endif
+
 #ifdef __cplusplus
 } /*"C" */
 #endif
index 3eb5b53..440e4fc 100644 (file)
@@ -87,6 +87,60 @@ typedef enum
 #endif
 
 
+#define HANDLER_FUN_0_N(N)     HANDLER_FUN_0_n(N)
+#define HANDLER_FUN_0_n(n)     HANDLER_FUN_0_##n
+#define HANDLER_FUN_0_0                                                        HANDLER_FUN(0)
+#define HANDLER_FUN_0_1                HANDLER_FUN_0_0         HANDLER_FUN(1)
+#define HANDLER_FUN_0_2                HANDLER_FUN_0_1         HANDLER_FUN(2)
+#define HANDLER_FUN_0_3                HANDLER_FUN_0_2         HANDLER_FUN(3)
+#define HANDLER_FUN_0_4                HANDLER_FUN_0_3         HANDLER_FUN(4)
+#define HANDLER_FUN_0_5                HANDLER_FUN_0_4         HANDLER_FUN(5)
+#define HANDLER_FUN_0_6                HANDLER_FUN_0_5         HANDLER_FUN(6)
+#define HANDLER_FUN_0_7                HANDLER_FUN_0_6         HANDLER_FUN(7)
+#define HANDLER_FUN_0_8                HANDLER_FUN_0_7         HANDLER_FUN(8)
+#define HANDLER_FUN_0_9                HANDLER_FUN_0_8         HANDLER_FUN(9)
+#define HANDLER_FUN_0_10       HANDLER_FUN_0_9         HANDLER_FUN(10)
+#define HANDLER_FUN_0_11       HANDLER_FUN_0_10        HANDLER_FUN(11)
+#define HANDLER_FUN_0_12       HANDLER_FUN_0_11        HANDLER_FUN(12)
+#define HANDLER_FUN_0_13       HANDLER_FUN_0_12        HANDLER_FUN(13)
+#define HANDLER_FUN_0_14       HANDLER_FUN_0_13        HANDLER_FUN(14)
+#define HANDLER_FUN_0_15       HANDLER_FUN_0_14        HANDLER_FUN(15)
+#define HANDLER_FUN_0_16       HANDLER_FUN_0_15        HANDLER_FUN(16)
+#define HANDLER_FUN_0_17       HANDLER_FUN_0_16        HANDLER_FUN(17)
+#define HANDLER_FUN_0_18       HANDLER_FUN_0_17        HANDLER_FUN(18)
+#define HANDLER_FUN_0_19       HANDLER_FUN_0_18        HANDLER_FUN(19)
+#define HANDLER_FUN_0_20       HANDLER_FUN_0_19        HANDLER_FUN(20)
+#define HANDLER_FUN_0_21       HANDLER_FUN_0_20        HANDLER_FUN(21)
+#define HANDLER_FUN_0_22       HANDLER_FUN_0_21        HANDLER_FUN(22)
+#define HANDLER_FUN_0_23       HANDLER_FUN_0_22        HANDLER_FUN(23)
+#define HANDLER_FUN_0_24       HANDLER_FUN_0_23        HANDLER_FUN(24)
+#define HANDLER_FUN_0_25       HANDLER_FUN_0_24        HANDLER_FUN(25)
+#define HANDLER_FUN_0_26       HANDLER_FUN_0_25        HANDLER_FUN(26)
+#define HANDLER_FUN_0_27       HANDLER_FUN_0_26        HANDLER_FUN(27)
+#define HANDLER_FUN_0_28       HANDLER_FUN_0_27        HANDLER_FUN(28)
+#define HANDLER_FUN_0_29       HANDLER_FUN_0_28        HANDLER_FUN(29)
+#define HANDLER_FUN_0_30       HANDLER_FUN_0_29        HANDLER_FUN(30)
+#define HANDLER_FUN_0_31       HANDLER_FUN_0_30        HANDLER_FUN(31)
+#define HANDLER_FUN_0_32       HANDLER_FUN_0_31        HANDLER_FUN(32)
+#define HANDLER_FUN_0_33       HANDLER_FUN_0_32        HANDLER_FUN(33)
+#define HANDLER_FUN_0_34       HANDLER_FUN_0_33        HANDLER_FUN(34)
+#define HANDLER_FUN_0_35       HANDLER_FUN_0_34        HANDLER_FUN(35)
+#define HANDLER_FUN_0_36       HANDLER_FUN_0_35        HANDLER_FUN(36)
+#define HANDLER_FUN_0_37       HANDLER_FUN_0_36        HANDLER_FUN(37)
+#define HANDLER_FUN_0_38       HANDLER_FUN_0_37        HANDLER_FUN(38)
+#define HANDLER_FUN_0_39       HANDLER_FUN_0_38        HANDLER_FUN(39)
+#define HANDLER_FUN_0_40       HANDLER_FUN_0_39        HANDLER_FUN(40)
+#define HANDLER_FUN_0_41       HANDLER_FUN_0_40        HANDLER_FUN(41)
+#define HANDLER_FUN_0_42       HANDLER_FUN_0_41        HANDLER_FUN(42)
+#define HANDLER_FUN_0_43       HANDLER_FUN_0_42        HANDLER_FUN(43)
+#define HANDLER_FUN_0_44       HANDLER_FUN_0_43        HANDLER_FUN(44)
+#define HANDLER_FUN_0_45       HANDLER_FUN_0_44        HANDLER_FUN(45)
+#define HANDLER_FUN_0_46       HANDLER_FUN_0_45        HANDLER_FUN(46)
+#define HANDLER_FUN_0_47       HANDLER_FUN_0_46        HANDLER_FUN(47)
+#define HANDLER_FUN_0_48       HANDLER_FUN_0_47        HANDLER_FUN(48)
+#define HANDLER_FUN_0_49       HANDLER_FUN_0_48        HANDLER_FUN(49)
+#define HANDLER_FUN_0_50       HANDLER_FUN_0_49        HANDLER_FUN(50)
+
 
 /**
  * The PY layer and the Adapter layer interface transform 
index 87fc091..f58b73e 100644 (file)
@@ -72,6 +72,15 @@ typedef enum
     HELIOS_PULL_DOWN
 }Helios_PullMode;
 #endif
+
+
+typedef enum
+{
+    HELIOS_GPIO_BLINK_OFF,
+    HELIOS_GPIO_BLINK_ON
+}Helios_GPIOBlinkSwitch;
+       
+
 /**
  * The PY layer and the Adapter layer interface transform 
  */
@@ -168,7 +177,7 @@ int Helios_GPIO_SetDirection(Helios_GPIONum gpio_num, Helios_GPIODir direction);
  */
 int Helios_GPIO_GetDirection(Helios_GPIONum gpio_num);
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 int Helios_pin_cfg_init();
 #endif
     
index d32327b..d0ef9c3 100644 (file)
@@ -68,6 +68,7 @@ typedef enum
 {
     HELIOS_STANDARD_MODE = 0,  //Standard mode (100K)
     HELIOS_FAST_MODE = 1,      //Fast mode (400K)
+    HELIOS_ENHANCED_FAST_MODE = 2,      //Enhanced Fast mode (1M)
 } Helios_I2CMode;
 
 
@@ -81,8 +82,11 @@ typedef enum
  * @return:
  *      i2c init Result, 0 for success,-1 for failure
  */
+#if defined(PLAT_aic8800m40)
+int Helios_I2C_Init(Helios_I2CEnum i2c_no, Helios_I2CMode Mode,unsigned char group);
+#else
 int Helios_I2C_Init(Helios_I2CEnum i2c_no, Helios_I2CMode Mode);
-
+#endif
 /**
  * @brief:
  *      i2c deinit
index ad76caf..a522307 100644 (file)
@@ -32,7 +32,8 @@ WHEN          WHO                     WHAT,WHERE,WHY
 ----------  ---------   ---------------------------------------------------
 2021/10/26  Burols.wang        Create.
 **************************************************************************/
-#if defined(PLAT_ASR)  || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR)  || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06) \
+       || defined(PLAT_Unisoc_8850_R02)
 #ifndef __HELIOS_KEYPAD_H__
 #define __HELIOS_KEYPAD_H__
 
index d542805..b75d763 100644 (file)
@@ -40,6 +40,51 @@ WHEN         WHO                     WHAT,WHERE,WHY
 extern "C" {
 #endif
 
+#if defined (PLAT_ECR6600)
+typedef enum {
+  HELIOS_LPM_MODE_MODEM_SLEEP,  /*close rf and clock partly*/
+  HELIOS_LPM_MODE_LIGHT_SLEEP,  /*close cpu rf and clock,when weaked up system can quickly resume*/
+  HELIOS_LPM_MODE_DEEP_SLEEP,   /*close cpu rf and clock,when weaked up system will reset*/
+  HELIOS_LPM_MODE_SLEEP_MAX,    /*max status,should't in this status */
+}Helios_LPM_Mode;
+
+/**
+ * @brief:
+ *      config lpm
+ * @sideeffect:
+ *
+ * @param:
+ *      \sleep_mode                    [in]    - sleep mode
+ *      \listen_interval       [in]    - the psm listen interval
+ * @return:
+ *       config lpm result, 0 for success,-1 for failure
+ */
+int Helios_LPM_Config(Helios_LPM_Mode sleep_mode, unsigned char listen_interval);
+#endif
+
+#if defined (PLAT_aic8800m40)
+typedef enum {
+  HELIOS_LPM_MODE_ACTICVE, 
+  HELIOS_LPM_MODE_LIGHT_SLEEP, 
+  HELIOS_LPM_MODE_DEEP_SLEEP,  
+  HELIOS_LPM_MODE_HIBERNATE,
+  HELIOS_LPM_MODE_SLEEP_MAX,
+}Helios_LPM_Mode;
+
+/**
+ * @brief:
+ *      config lpm
+ * @sideeffect:
+ *
+ * @param:
+ *      \sleep_mode                    [in]    - sleep mode
+ *      \listen_interval       [in]    - the psm listen interval
+ * @return:
+ *       config lpm result, 0 for success,-1 for failure
+ */
+int Helios_LPM_Config(Helios_LPM_Mode sleep_mode, unsigned char listen_interval);
+#endif
+
 
 /**
  * @brief:
@@ -155,7 +200,15 @@ int Helios_LPM_Sleep_Register_cb(void * cb);
 
 #endif
 
-#if defined(PLAT_RDA) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_RDA) \
+|| defined(PLAT_Unisoc_8850) \
+|| defined(PLAT_Unisoc_8850_R02) \
+|| defined(PLAT_Unisoc) \
+|| defined(PLAT_EIGEN) \
+|| defined(PLAT_Unisoc_8910_R05)\
+|| defined(PLAT_Unisoc_8910_R06)\
+|| defined(PLAT_Qualcomm)\
+|| defined(PLAT_EIGEN_718)
 typedef struct {
   int8_t  mode;
   int8_t  tau_uint;
@@ -225,11 +278,11 @@ int Helios_LPM_set_eDrx(Helios_edrx_info edrx_info);
 #endif
 #endif
 
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 void Helios_LPM_fast_extint(unsigned char value);
 #endif
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(BOARD_BC32RA) || defined(PLAT_EIGEN_718)
 /**
  * @brief:
  *      Force into hibernate sleep instead of be controled by T3412
index cb9162f..cca1ad9 100644 (file)
@@ -111,24 +111,25 @@ extern "C" {
 
 
 #if defined(PLAT_Qualcomm)
-#if defined(BOARD_BG95M1) || defined(BOARD_BG95M2) || defined(BOARD_BG95M3) \
- || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M3_LX)
-#define PLAT_GPIO_NUM 21
+#if defined(BOARD_BG95M1) || defined(BOARD_BG95M2) || defined(BOARD_BG95M3) || defined(BOARD_BG95M6) \
+ || defined(BOARD_BG95M8) || defined(BOARD_BG95M9) || defined(BOARD_BG95M3_LX) || defined(BOARD_BG95M8_SANX)
+#define PLAT_GPIO_NUM 30
 #elif defined(BOARD_BG77)
-#define PLAT_GPIO_NUM 34
+#define PLAT_GPIO_NUM 43
 #elif defined(BOARD_BG600LM3)
-#define PLAT_GPIO_NUM 16
+#define PLAT_GPIO_NUM 25
 #else
 #error "Please confirm the Qualcomm platform"
 #endif
 #elif defined(PLAT_ASR)
 #if defined(BOARD_EC800NCN_LA)
 #define PLAT_GPIO_NUM 37
-#elif defined(BOARD_EG915NEU_AC) || defined(BOARD_EG915NEU_AG)
+#elif defined(BOARD_EG915NEU_AC) || defined(BOARD_EG915NEU_AG) || defined(BOARD_EG915NEA_AC) || defined(BOARD_EG915NEA_AC_SANX)\
+   || defined(BOARD_EG915NEU_AP)
 #define PLAT_GPIO_NUM 41
 #elif defined(BOARD_EC100YCN_AA)
 #define PLAT_GPIO_NUM 20
-#elif defined(BOARD_EG912NEN_AA)
+#elif defined(BOARD_EG912NEN_AA) || defined(BOARD_EG912NEN_AA_SANX)
 #define PLAT_GPIO_NUM 40
 #elif defined(BOARD_EC200NCN_AA) || defined(BOARD_EC200NCN_AC) || defined(BOARD_EC200NCN_LA)
 #define PLAT_GPIO_NUM 46
@@ -137,9 +138,14 @@ extern "C" {
 #endif
 
 #elif defined(PLAT_RDA)
+#if defined(BOARD_BC32RA) || defined(BOARD_BC92RB)
+#define PLAT_GPIO_NUM 11
+#else
 #define PLAT_GPIO_NUM 18
+#endif
+
 
-#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #if (defined(BOARD_EC600UCN_LB_TTS)    \
        || defined(BOARD_EC600UCN_LB)   \
        || defined(BOARD_EC600UCN_LC)   \
@@ -157,8 +163,17 @@ extern "C" {
        || defined(BOARD_EC600UCN_LB_BT) \
        || defined(BOARD_EC600UCN_LB_YDWL) \
        || defined(BOARD_EC600UEC_AC) \
+       || defined(BOARD_EC600UEC_DC) \
+       || defined(BOARD_EC600UEC_AD) \
        || defined(BOARD_EC600UEC_AC_WS) \
-       || defined(BOARD_EC600UEC_AC_VOLTE))
+       || defined(BOARD_EC600UEC_AD_WS) \
+       || defined(BOARD_EC600UEC_AC_VOLTE)) \
+       || defined(BOARD_EC600ULA_AC) \
+       || defined(BOARD_EC600ULA_AC_WS) \
+       || defined(BOARD_EC600UEU_AC_VOLTE) \
+       || defined(BOARD_EC600UEU_AC_WS) \
+       || defined(BOARD_EC600UEC_DC_WS) \
+       || defined(BOARD_EC600UEU_DC)
 #define PLAT_GPIO_NUM 47
 #elif (defined(BOARD_EC200UCN_AA) \
        || defined(BOARD_EC200UCN_LA) \
@@ -168,49 +183,84 @@ extern "C" {
        || defined(BOARD_EC200UCN_LB_BT) \
        || defined(BOARD_EC200UCN_LB_EXTFS8M) \
        || defined(BOARD_EC200UEU_AB) \
+       || defined(BOARD_EC200UEU_AB_VOLTE) \
        || defined(BOARD_EC200UEU_AB_SANX) \
        || defined(BOARD_EC200UEU_AA) \
+       || defined(BOARD_EC200UEU_AA_CAM) \
+       || defined(BOARD_EC200UEU_AA_BTLVGL) \
        || defined(BOARD_EC200UEU_AA_QIOT) \
        || defined(BOARD_EC200UEU_AA_EXTFS) \
        || defined(BOARD_EC200UEU_AA_MSDL) \
        || defined(BOARD_EC200UCN_AA_QIOT) \
+       || defined(BOARD_EC200UCN_AA_VOBT) \
        || defined(BOARD_EC200UCN_AA_BT) \
        || defined(BOARD_EC200UCN_AA_EXTFS8M) \
        || defined(BOARD_EC200UAU_AB) \
        || defined(BOARD_EC200UAU_AB_VOLTE) \
-       || defined(BOARD_EC200UAU_AA))
+       || defined(BOARD_EC200UAU_AA)) \
+       || defined(BOARD_EC200UCN_AB) \
+       || defined(BOARD_EC200UCN_AB_VOBT) \
+       || defined(BOARD_EC200UCN_AD)
 #define PLAT_GPIO_NUM 47
-#elif defined(BOARD_EG915UEU_AB) || defined(BOARD_EG915UEU_AB_HYT) || defined(BOARD_EG915ULA_AB)
+#elif defined(BOARD_EG915UEU_AB) \
+       || defined(BOARD_EG915UEU_AB_HYT) \
+       || defined(BOARD_EG915ULA_AB) \
+       || defined(BOARD_EG915ULA_AC) \
+       || defined(BOARD_EG915ULA_AD) \
+       || defined(BOARD_EG915ULA_AD_CUG) \
+       || defined(BOARD_EG915UCN_AC) \
+       || defined(BOARD_EG915UEC_AC) \
+       || defined(BOARD_EG915UEU_AC) \
+       || defined(BOARD_EG915ULA_AC_USBUP) \
+       || defined(BOARD_EG915UCN_AC_USBUP) \
+       || defined(BOARD_EG915UEU_AC_USBUP) \
+       || defined(BOARD_EG915UEC_AC_USBUP)
 #define PLAT_GPIO_NUM 41
-#elif defined(BOARD_EG912UGL_AA) || defined(BOARD_EG912UGL_AA_YL)
+#elif defined(BOARD_EG912UGL_AA) || defined(BOARD_EG912UGL_AC_CFF) || defined(BOARD_EG912UGL_AC)
+#define PLAT_GPIO_NUM 41
+#elif defined(BOARD_EC200UEU_DC)
+#define PLAT_GPIO_NUM 47
+#elif defined(BOARD_EG915ULA_DC) || defined(BOARD_EG915ULA_DC_CUG)
 #define PLAT_GPIO_NUM 41
 #else
 #error "Please confirm the unisoc platform"
 #endif
 
-#elif defined(PLAT_Unisoc_8850)
+#elif defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
 #if defined(BOARD_EC800GCN_GA) \
        || defined(BOARD_EC800GCN_GA_MS) \
        || defined(BOARD_EC800GCN_LD) \
+       || defined(BOARD_EC800GCN_LD_XBND) \
        || defined(BOARD_EC800GCN_LD_HRXM) \
        || defined(BOARD_EC800GCN_LB) \
-       || defined(BOARD_EC800GCN_GA_VOLTE) 
+       || defined(BOARD_EC800GCN_TT)\
+       || defined(BOARD_EC800GCN_GA_VOLTE) \
+       || defined(BOARD_EG800GLA_LD)
 #define PLAT_GPIO_NUM 50
-#elif defined(BOARD_EC600GCN_LD) || defined(BOARD_EC600GCN_LA) || defined(BOARD_EC600GCN_LD_YM)
+#elif defined(BOARD_EC600GCN_LD) \
+       || defined(BOARD_EC600GCN_LA) \
+       || defined(BOARD_EC600GCN_LA_CDD) \
+       || defined(BOARD_EC600GCN_LD_YM) \
+       || defined(BOARD_EC600GCN_MD_HK)
+#define PLAT_GPIO_NUM 48
+#elif defined(BOARD_EG700GCN_LC)
 #define PLAT_GPIO_NUM 46
 #else
 #error "Please confirm the unisoc_8850 platform"
 #endif
 
-#elif defined(PLAT_ASR_1803s)
+#elif defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #define PLAT_GPIO_NUM 47
 #elif defined(PLAT_ASR_1606)
 #if defined(BOARD_EC600MCN_LA) || defined(BOARD_EC600MCN_LA_POC_XBND)|| defined(BOARD_EC600MCN_LA_POC_QS) \
     || defined(BOARD_EC600MCN_LA_VOLTE) || defined(BOARD_EC600MCN_LA_HJT) || defined(BOARD_EC600MCN_LC) \
     || defined(BOARD_EC600MCN_LE) || defined(BOARD_EC600MCN_LF) || defined(BOARD_EC600MCN_LE_POC_XBND) \
-       || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) \
+       || defined(BOARD_EC600MCN_LA_POC_ZZD) || defined(BOARD_EC600MCN_LE_POC_ZZD) || defined(BOARD_EC600MCN_LF_SPISD)\
        || defined(BOARD_EC600MCN_LE_POC_QS) || defined(BOARD_EC600MCN_CC) || defined(BOARD_EC600MCN_LE_VOLTE) \
-       || defined(BOARD_EC600MCN_CC_EXT) ||  defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS)
+       || defined(BOARD_EC600MCN_CC_EXT) ||  defined(BOARD_EC600MCN_LF_SLPOC) || defined(BOARD_EC600MCN_CC_EXT_TTS) \
+       || defined(BOARD_EC600MCN_LE_ALIPAY) || defined(BOARD_EC600MCN_LE_BTZ) || defined(BOARD_EC600MEU_LA) \
+       || defined(BOARD_EC600MEU_LA_POC_XBND) || defined(BOARD_EC600MCN_LF_QS) || defined(BOARD_EC600MLA_LA_POC_XBND) \
+       || defined(BOARD_EC600MEU_LA_POC_QS) || defined(BOARD_EC600MLA_LA_POC_QS)
 #define PLAT_GPIO_NUM 45
 #elif defined(BOARD_EC800MCN_LA) || defined(BOARD_EC800MCN_GA)  || defined(BOARD_EC800MCN_LE) \
     || defined(BOARD_EC800MCN_LA_VOLTE) || defined(BOARD_EC800MCN_GC) || defined(BOARD_EC800MCN_LC) \
@@ -218,8 +268,29 @@ extern "C" {
     || defined(BOARD_EC800MCN_GA_MS) || defined(BOARD_EC800MCN_GA_VOLTE) || defined(BOARD_EC800MCN_LA_POC_XBND) \
     || defined(BOARD_EC800MCN_LE_POC_XBND) || defined(BOARD_EC800MCN_GA_ALIPAY) || defined(BOARD_EG810MCN_GA) \
     || defined(BOARD_EC800MCN_CC) || defined(BOARD_EC800MCN_LE_VOLTE) || defined(BOARD_EC800MCN_GA_SPISD) \
-    || defined(BOARD_EG810MCN_GA_VOLTE) || defined(BOARD_EG810MCN_GA_ALIPAY)|| defined(BOARD_EG810MCN_GA_VOLTE)|| defined(BOARD_EC800MCN_GA_VOEXT) || defined(BOARD_EG810MCN_GA_VOEXT)
-#define PLAT_GPIO_NUM 44
+    || defined(BOARD_EG810MCN_GA_ALIPAY) || defined(BOARD_EC800MCN_GA_VOEXT) || defined(BOARD_EG810MCN_GA_VOEXT) \
+    || defined(BOARD_EC800MCN_LE_VOLVGL) || defined(BOARD_EG810MCN_GA_VOLTE) || defined(BOARD_EC800MCN_CC_TTS) \
+       || defined(BOARD_EC800MCN_GB) || defined(BOARD_EG810MCN_GB) || defined(BOARD_EG810MCN_GB_VOEXT) \
+       || defined(BOARD_EC800MCN_LF_CCG) || defined(BOARD_EG810MCN_LA) || defined(BOARD_EG810MEU_LA) \
+       || defined(BOARD_EG810MCN_LA_VOLTE) || defined(BOARD_EG810MEU_LA_VOEXT) || defined(BOARD_EG810MCN_LA_VOEXT)\
+       || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EC800MCN_GB_VOEXT) || defined(BOARD_EG810MEU_LA_VOLVGL) \
+       ||defined(BOARD_EG810MCN_GB_ALIPAY) || defined(BOARD_EC800MCN_LE_VOEXT)
+#define PLAT_GPIO_NUM 47
+#else
+#error "Please confirm the board"
+#endif
+#elif defined(PLAT_ASR_1602)
+#if defined(BOARD_EC600KCN_CC_TTS) || defined(BOARD_EC600KCN_LC)
+#define PLAT_GPIO_NUM 39
+#elif defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC800KCN_LC) || defined(BOARD_EC800KCN_CC) || defined(BOARD_EG800KCN_GC) || defined(BOARD_EG800KEU_CC)\
+|| defined(BOARD_EC800KCN_LC_SMS)
+#define PLAT_GPIO_NUM 47
+#else
+#error "Please confirm the board"
+#endif
+#elif defined(PLAT_ASR_1609)
+#if defined(BOARD_EG800PCN_LA) || defined(BOARD_EG800PCN_LA_ALIPAY)
+#define PLAT_GPIO_NUM 50
 #else
 #error "Please confirm the board"
 #endif
@@ -239,6 +310,16 @@ extern "C" {
 
 #endif
 
+#elif defined(PLAT_EIGEN_718)
+#if defined(BOARD_EC800ZCN_LD)
+#define PLAT_GPIO_NUM 41
+#else
+#error "Please confirm the eigen 718 platform"
+#endif
+
+#elif defined(PLAT_aic8800m40)
+#define PLAT_GPIO_NUM 38 //TODO
+
 #else
 #error "Please confirm the platform"
 #endif
index 2fd69a3..66fd63d 100644 (file)
@@ -49,6 +49,59 @@ typedef struct
 }Helios_PowerInitStruct;
 
 
+typedef enum
+{
+       HELIOS_CAM_VDD_CLOSED = -2,
+    HELIOS_CAM_VDD_UNUSED = -1,
+       HELIOS_CAM_VDD_1V20 = 0x0,
+    HELIOS_CAM_VDD_1V25,
+    HELIOS_CAM_VDD_1V30,
+    HELIOS_CAM_VDD_1V50,
+    HELIOS_CAM_VDD_1V70, 
+    HELIOS_CAM_VDD_1V80, 
+    HELIOS_CAM_VDD_1V85,
+    HELIOS_CAM_VDD_1V90, 
+    HELIOS_CAM_VDD_2V50, 
+    HELIOS_CAM_VDD_2V60,
+    HELIOS_CAM_VDD_2V70,
+    HELIOS_CAM_VDD_2V75,
+    HELIOS_CAM_VDD_2V80, 
+    HELIOS_CAM_VDD_2V85,
+    HELIOS_CAM_VDD_2V90, 
+    HELIOS_CAM_VDD_3V00,
+    HELIOS_CAM_VDD_3V10, 
+    HELIOS_CAM_VDD_3V30, 
+    HELIOS_CAM_VDD_MAX = HELIOS_CAM_VDD_3V30  
+} Helios_cameraVDD_t;
+
+//for unisoc 8910s
+typedef enum
+{
+    POWER_LEVEL_3200MV = 3200,
+    POWER_LEVEL_3100MV = 3100,
+    POWER_LEVEL_3000MV = 3000,
+    POWER_LEVEL_2900MV = 2900,
+    POWER_LEVEL_2800MV = 2800,
+    POWER_LEVEL_2700MV = 2700,
+    POWER_LEVEL_2600MV = 2600,
+    POWER_LEVEL_2500MV = 2500,
+    POWER_LEVEL_2400MV = 2400,
+    POWER_LEVEL_2300MV = 2300,
+    POWER_LEVEL_2200MV = 2200,
+    POWER_LEVEL_2100MV = 2100,
+    POWER_LEVEL_2000MV = 2000,
+    POWER_LEVEL_1900MV = 1900,
+    POWER_LEVEL_1800MV = 1800,
+    POWER_LEVEL_1700MV = 1700,
+    POWER_LEVEL_1600MV = 1600,
+    POWER_LEVEL_1500MV = 1500,
+    POWER_LEVEL_1400MV = 1400,
+    POWER_LEVEL_1300MV = 1300,
+    POWER_LEVEL_1200MV = 1200,
+    POWER_LEVEL_1100MV = 1100,
+    POWER_LEVEL_UNUSED
+} Helios_powerLevel_t;
+
 /**
  * @brief:
  *      register power on/off callback
@@ -62,7 +115,9 @@ int Helios_Power_Init(Helios_PowerInitStruct *info);
 
 int Helios_Power_DeInit();
 
-
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+int Helios_Power_Init_ex(Helios_PowerInitStruct *info, uint8_t mode);
+#endif
 
 /**
  * @brief:
@@ -128,7 +183,13 @@ int Helios_Power_GetDownReason(void);
  */
 int Helios_Power_GetBatteryVol(void);
 
+
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06) || defined(PLAT_ASR_1606) \
+        || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602) || defined(PLAT_ASR) 
+int Helios_Power_CAM_VDD_output(uint8_t on_off, Helios_cameraVDD_t level,unsigned char lp_enabled);
+#else
 void Helios_Power_CAM_VDD_output(uint8_t on_off);
+#endif
 
 #if defined(PLAT_EIGEN)
 /**
@@ -143,6 +204,11 @@ void Helios_Power_CAM_VDD_output(uint8_t on_off);
 int Helios_Pwrkey_poweron_debounce_time_set(uint32_t time_ms);
 #endif
 
+void Helios_camera_poweron(void);
+void Helios_camera_poweroff(void);
+unsigned char Helios_Get_Pwrkey_Status(void);
+int Helios_Set_Power_Level(unsigned char id,Helios_powerLevel_t level);
+
 #ifdef __cplusplus
 } /*"C" */
 #endif
index ba9e92e..96be487 100644 (file)
@@ -55,25 +55,44 @@ extern "C" {
 #define PLAT_PWMn_DEF(n) BOOST_PP_REPEAT_1(n,PWM_DEF)
 
 //PLAT_PWM_NUMMAX = PLAT_PWM_NUM - 1
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 #define PLAT_PWM_NUMMAX 3
-#elif defined(PLAT_ASR_1803s)
+#elif defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #define PLAT_PWM_NUMMAX 2
-#elif defined(PLAT_Unisoc_8850)
+#elif defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02)
 #if defined(BOARD_EC800GCN_GA) \
        || defined(BOARD_EC800GCN_GA_MS) \
        || defined(BOARD_EC800GCN_LD) \
+    || defined(BOARD_EC800GCN_LD_XBND) \
        || defined(BOARD_EC800GCN_LD_HRXM) \
        || defined(BOARD_EC800GCN_LB) \
-       || defined(BOARD_EC800GCN_GA_VOLTE)
+    || defined(BOARD_EC800GCN_TT) \
+       || defined(BOARD_EC800GCN_GA_VOLTE) \
+    || defined(BOARD_EG800GLA_LD)
 #define PLAT_PWM_NUMMAX 28
-#elif defined(BOARD_EC600GCN_LD) || defined(BOARD_EC600GCN_LA) || defined(BOARD_EC600GCN_LD_YM)
+#elif defined(BOARD_EC600GCN_LD) \
+       || defined(BOARD_EC600GCN_LA) \
+       || defined(BOARD_EC600GCN_LA_CDD) \
+       || defined(BOARD_EC600GCN_LD_YM) \
+       || defined(BOARD_EG700GCN_LC)
 #define PLAT_PWM_NUMMAX 3
 #else
 #error "Please confirm the unisoc_8850 platform"
 #endif
 #elif defined(PLAT_EIGEN)
 #define PLAT_PWM_NUMMAX 16
+#elif defined(PLAT_Qualcomm)
+#define PLAT_PWM_NUMMAX 2
+#elif defined(PLAT_ECR6600)
+#define PLAT_PWM_NUMMAX 5
+
+#elif defined(PLAT_ASR_1602)
+#if defined(BOARD_EC600KCN_CC_TTS) || defined(BOARD_EC600KCN_LC)
+#define PLAT_GPIO_NUM 3
+#elif defined(BOARD_EC800KCN_CC_TTS) || defined(BOARD_EC800KCN_LC) || defined(BOARD_EG800KCN_GC) || defined(BOARD_EC800KCN_LC_SMS)
+#define PLAT_GPIO_NUM 1
+#endif
+
 #else
 #define PLAT_PWM_NUMMAX 3
 // #error "Please confirm the platform"
@@ -190,6 +209,9 @@ int Helios_PWM_Start(Helios_PwnNum pwm_num, double frequency, float duty);
 int Helios_PWM_Stop(Helios_PwnNum pwm_num);
 
 
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
+int Helios_PWM_En_Sleep(Helios_PwnNum pwm_num,int pwm_en_sleep);
+#endif
 
 #ifdef __cplusplus
 } /*"C" */
index a31e6de..3a02136 100644 (file)
@@ -107,16 +107,21 @@ uint64_t Helios_Get_CurrentDateTime_Second(void);
 int64_t Helios_RTC_TicksToMs(void);
 int64_t Helios_RTC_TicksToUs(void);
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_EIGEN) || defined(PLAT_ASR_1606) \
+|| defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 void Helios_RTC_SetTimeZoneOffset(float offset);
 float Helios_RTC_GetTimeZoneOffset(void);
-int Helios_NITZ_Switch(bool isEnable);
-int Helios_NITZ_Setval_get(void);
 #else
 void Helios_RTC_SetTimeZoneOffset(int offset);
 int Helios_RTC_GetTimeZoneOffset(void);
 #endif
 
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc) || defined(PLAT_EIGEN) \
+|| defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
+int Helios_NITZ_Switch(bool isEnable);
+int Helios_NITZ_Setval_get(void);
+#endif
+
 int Helios_RTC_NtpSetTime(Helios_RTCTime *tm, int flag);
 int Helios_RTC_GetLocalTime(Helios_RTCTime *tm);
 
index 355b802..83404ad 100644 (file)
@@ -86,8 +86,11 @@ typedef struct {
  * @return:
  *      spi init Result, 0 for success,-1 for failure
  */
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) ||defined(PLAT_ASR_1602)
+int Helios_SPI_Init(Helios_SPINum spi_port, Helios_SPIMode spimode, uint32_t spiclk,unsigned char group);
+#else
 int Helios_SPI_Init(Helios_SPINum spi_port, Helios_SPIMode spimode, uint32_t spiclk);
-
+#endif
 /**
  * @brief:
  *      spi deinit
@@ -149,7 +152,7 @@ int Helios_SPI_Write(Helios_SPINum spi_port, void *buf, size_t len);
 int Helios_SPI_Read(Helios_SPINum spi_port, void *buf, size_t len);
 
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 
 typedef void (*helios_spi_callback_t)( Helios_SPINum port,unsigned int dma_done_event);
 
@@ -159,7 +162,7 @@ int Helios_SPI_Init_Dma(Helios_SPINum spi_port, Helios_SPIMode spimode, uint32_t
 
 #endif
 
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 
 typedef void (*helios_spi_callback_t)( Helios_SPINum port,unsigned int dma_done_event);
 
@@ -169,7 +172,7 @@ int Helios_SPI_Init_Dma(Helios_SPINum spi_port, Helios_SPIMode spimode, uint32_t
 
 #endif
 
-#if defined (PLAT_ASR) || defined(PLAT_ASR_1606)//add  1603spi  fifo  20230228;1606spi  fifo  20230511
+#if defined (PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)//add  1603spi  fifo  20230228;1606spi  fifo  20230511
 int Helios_SPI_Transfer_Pio(Helios_SPINum spi_port,void *inbuf,size_t inlen,void *outbuf, size_t outlen);
 int Helios_SPI_Read_Fifo(Helios_SPINum spi_port, void *buf, size_t len); 
 int Helios_SPI_Write_Fifo(Helios_SPINum spi_port, void *buf, size_t len); 
index 909cef0..478220a 100644 (file)
@@ -112,7 +112,7 @@ typedef enum
        HELIOS_UART_PARITY_NONE = 0,
        HELIOS_UART_PARITY_EVEN = 1,
        HELIOS_UART_PARITY_ODD = 2,
-#if defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
        HELIOS_UART_PARITY_MARK = 3,
        HELIOS_UART_PARITY_SPACE = 4,
 #endif
@@ -256,9 +256,26 @@ int Helios_UART_Any(Helios_UARTNum port);
 
 int Helios_UART_SetCtl_485(Helios_UARTNum port,size_t gpio_in,Helios_UART_Direc direc);
 
-#if defined(PLAT_ASR_1803s)
+int Helios_UART_SetBlockMode_485(char set);
+
+
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 int Helios_Uart_Disable_Rx(Helios_UARTNum port,uint8_t set_value);     
 #endif
+
+/**
+ * @brief:
+ *     check if uart is sending
+ *
+ * @param:
+ *             \port       [in] uart port
+ * @return:
+ *     0, not sending.
+ *     1, is sending.
+ *    -1, port not support
+ */
+int Helios_UART_IsSending(Helios_UARTNum port);
+
 #ifdef __cplusplus
 } /*"C" */
 #endif
index b166a08..e7adaac 100644 (file)
@@ -84,5 +84,6 @@ int Helios_Slip_Netif_NICSetDNS(char *pri_str, char *sec_str);
 *****************************************************************/
 int Helios_Slip_Config(int flow);
 
+int Helios_Slip_Set_Default_NIC(uint32_t ip);
 
 #endif
index 30565ee..607f999 100644 (file)
@@ -92,7 +92,7 @@ int Helios_USB_GetStatus(void);
 extern int Helios_USB_nv_set_double_cdc(unsigned char cfg);
 #endif
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc)
 /**
  * @brief:
  *      Write NV to Disable USB Discription for SANX
@@ -118,7 +118,9 @@ int Helios_USB_function_disable(int flag);
  *      0 for not set,1 for usb disable
  */
 int Helios_USB_function_state(void);
+
 #endif
+
 #ifdef __cplusplus
 } /*"C" */
 #endif
index da7a9c0..efc02df 100644 (file)
@@ -66,7 +66,7 @@ int Helios_USBNET_GetType(Helios_USBNET_Type_e *type);
 
 int Helios_USBNET_GetStatus(uint8_t *status);
 
-#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850)
+#if defined(PLAT_Unisoc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
        int Helios_USBNET_GetNat(uint8_t sim_id, uint8_t profile_id);
 
        int Helios_USBNET_SetNat(uint8_t sim_id, uint8_t profile_id, uint8_t nat);
index 7fd45d1..d912a2a 100644 (file)
@@ -4,7 +4,7 @@
 #include <stdint.h>
 #include <stddef.h>
 #include "obj.h"
-
+#include "helios_extint.h"
 /**
  * GPIO interrupt debounce
  */
@@ -13,9 +13,9 @@
  */
 typedef enum
 {
-    HELIOS_WAKE_PULL_DOWN = 0,
-    HELIOS_WAKE_PULL_NONE,
-    HELIOS_WAKE_PULL_UP
+    HELIOS_WAKE_PULL_NONE = 0,
+    HELIOS_WAKE_PULL_UP,
+    HELIOS_WAKE_PULL_DOWN
 }Helios_WAKE_PullMode;
 
 typedef enum
@@ -29,9 +29,19 @@ typedef enum
     HELIOS_WAKEUP_MAX,
 }Helios_Wakeup_ID;
 
+#if defined(PLAT_EIGEN_718)
+typedef struct 
+{      
+       Helios_WAKE_PullMode pull_mode;
+       Helios_EdgeMode edge_mode;
+}Helios_Wakeup_cfg_t;
+#endif
 typedef void (*Helios_WakeupPad_Callback)(uint8_t level);
-
+#if !defined(PLAT_EIGEN_718)
 int Helios_Wakeup_Config(Helios_Wakeup_ID wakeup_id,unsigned char wakeup_pull);
+#else
+int Helios_Wakeup_Config(Helios_Wakeup_ID wakeup_id,Helios_Wakeup_cfg_t *cfg);
+#endif
 int Helios_Wakeup_Get_Pin_Value(Helios_Wakeup_ID wakeup_id);
 int Helios_Wakeup_Disable(Helios_Wakeup_ID wakeup_id);
 int Helios_Wakeup_Enable(Helios_Wakeup_ID wakeup_id);
index 1434099..1deb0f5 100644 (file)
@@ -168,6 +168,8 @@ extern "C" {
 #define NETIF_FLAG_EX_NORMAL_PDP   0x8000U
 /* source flag: LTE PDP type is IMS config */
 #define NETIF_FLAG_EX_IMS_PDP      0x10000U
+/* source flag: LTE PDP type is pass-through config */
+#define NETIF_FLAG_EX_PASS_PDP     0x20000U
 
 
 /** Function prototype for netif->bypass functions. This function is saved as 'bypass'
@@ -263,6 +265,8 @@ struct netif {
   ip6_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];
   /** Array of IPv6 dns addresses for this netif.*/
   ip6_addr_t dns6_server [2];
+  /** IPv6 backup addr for pass through pdp, restore the old linklocal addr now. */
+  ip6_addr_t ip6_addr_backup;
   /** The state of each IPv6 address (Tentative, Preferred, etc).
    * @see ip6_addr.h */
   u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];
@@ -341,7 +345,7 @@ struct netif {
 
   /** maximum transfer unit (in bytes) */
   u16_t mtu;
-  u16_t mtu_aligned; /*only for aligned bytes using*/
+  u16_t mtu6; /*only for aligned bytes using*/
 
   /** flags (see NETIF_FLAG_ above) */
   u32_t flags;
@@ -470,7 +474,9 @@ struct netif *netif_find_by_name(char *name);
 struct netif *netif_find_by_hostname(char *hostname);
 struct netif *netif_find_by_num(int num);
 struct netif *netif_find_by_ipaddr(u32_t addr);
+struct netif *netif_find_by_ipaddr_ex(u32_t addr, int simid);
 struct netif *netif_find_by_ip6addr(ip6_addr_t *addr);
+struct netif *netif_find_by_ip6prefix(ip6_addr_t *addr);
 struct netif *netif_find_by_cid(char cid);
 struct netif *netif_get_by_cid(char cid);
 struct netif *netif_find_by_pcid(char cid);
@@ -478,26 +484,31 @@ struct netif *netif_find_by_scid(char cid);
 struct netif *netif_find_by_cid_dsim(char simid, char cid);
 struct netif *netif_find_by_pcid_dsim(char simid, char cid);
 struct netif *netif_find_by_scid_dsim(char simid, char cid);
+#if 0
 err_t netif_init_done(struct netif * netif);
 err_t netif_ready(struct netif * netif);
+#endif
 void netif_set_default(struct netif *netif);
 void netif_set_default_ip6(struct netif *netif);
+void netif_set_default_nw(struct netif *netif);
+void netif_set_default_nw6(struct netif *netif);
 void netif_set_default_nw_ppp(struct netif *netif);
 void netif_remove_default(struct netif *netif);
 void netif_remove_default_ip6(struct netif *netif);
 void netif_remove_default_nw_ppp(struct netif *netif);
+struct netif* netif_get_usb_if(void);
+struct netif* netif_get_uap_if(void);
+struct netif* netif_get_ppp_if(void);
 struct netif* netif_get_default_nw(void);
 struct netif* netif_get_default_nw_ip6(void);
 struct netif* netif_get_default_nw_ppp (void);
-u8_t netif_check_nw_default(struct netif *inp);
-u8_t netif_check_nw_default_ip6(struct netif *inp);
-u8_t netif_check_nw_if(struct netif *inp);
 u8_t netif_check_nw_status(void);
 u8_t netif_check_nw_status_ip6(void);
 u8_t netif_get_default_nw_status(void);
 u8_t netif_get_default_nw_status_ip6(void);
 void netif_set_default_nw_status(u8_t flag);
 void netif_set_default_nw_status_ip6(u8_t flag);
+void netif_set_mac(struct netif *netif, char* mac_addr);
 void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr);
 void netif_set_netmask(struct netif *netif, ip_addr_t *netmask);
 void netif_set_gw(struct netif *netif, ip_addr_t *gw);
@@ -506,6 +517,8 @@ void netif_set_dns2(struct netif* netif, ip_addr_t *addr);
 void netif_set_dns(struct netif* netif, ip_addr_t *addr1, ip_addr_t *addr2);
 void netif_set_up(struct netif *netif);
 void netif_set_down(struct netif *netif);
+void netif_set_lan(struct netif *netif);
+void netif_set_wan(struct netif *netif);
 err_t netif_add_nat(struct netif * netif);
 err_t netif_remove_nat(struct netif * netif);
 err_t netif_get_status(struct netif * netif); //can use macro netif_is_up to replace
@@ -515,29 +528,60 @@ err_t netif_set_bypass(char simid, char cid, netif_bypass_fn bypass);
 err_t netif_remove_bypass(char simid, char cid);
 err_t netif_share_nw_exist(struct netif *inp);
 err_t netif_nw_check_by_ipaddr(u32_t addr, s32_t type);
-err_t netif_local_if_exist(void);
+u8_t netif_local_if_exist(void);
+u8_t netif_bridge_if_exist(void);
+u8_t netif_special_if_check(struct netif *netif);
+void netif_set_client_mode(struct netif *netif);
+void netif_set_host_mode(struct netif *netif);
+void netif_set_hdhcp_mode(struct netif *netif);
+
+int netif_usb_get_status(void);
+err_t netif_usb_set_status(u8_t status);
+int netif_uap_get_status(void);
+err_t netif_uap_set_status(u8_t status);
+int netif_ppp_get_status(void);
+err_t netif_ppp_set_status(u8_t status);
+err_t netif_tune_input(struct pbuf *p, struct netif *inp);
 
 /** Ask if an interface is up */
 #define netif_is_init_done(netif)            (((netif)->flags & NETIF_FLAG_INIT_DONE) ? 1 : 0)
 #define netif_is_up(netif)                   (((netif)->flags & NETIF_FLAG_UP) ? 1 : 0)
+#define netif_is_ready(netif)                ((netif_is_init_done(netif) && netif_is_up(netif)) ? ERR_OK : ERR_IF)
+#define netif_ready(netif)                    netif_is_ready(netif)
+#define netif_init_done(netif)               (netif_is_init_done(netif) ? ERR_OK : ERR_IF)
+
+/** Three kind of if, external, internal, iftune*/
 #define netif_is_external(netif)             (((netif)->flags & NETIF_FLAG_EXTER) ? 1 : 0)
 #define netif_is_internal(netif)             (((netif)->flags & NETIF_FLAG_INTER) ? 1 : 0)
+#define netif_is_iftune(netif)               (((netif)->flags & NETIF_FLAG_IF_TUNE ) ? 1 : 0)
+
 #define netif_is_nat_cfg(netif)              (((netif)->flags & NETIF_FLAG_NAT_CONFIG) ? 1 : 0)
 #define netif_is_IF_USB(netif)               (((netif)->flags & NETIF_FLAG_IF_USB) ? 1 : 0)
 #define netif_is_IF_UAP(netif)               (((netif)->flags & NETIF_FLAG_IF_UAP) ? 1 : 0)
 #define netif_is_IF_PPP(netif)               (((netif)->flags & NETIF_FLAG_IF_PPP ) ? 1 : 0)
 #define netif_is_IF_PDN(netif)               (((netif)->flags & NETIF_FLAG_IF_PDN ) ? 1 : 0)
+#define netif_is_IF_TUNE(netif)              (((netif)->flags & NETIF_FLAG_IF_TUNE ) ? 1 : 0)
+#define netif_is_IF_LOOP(netif)              (((netif)->flags & NETIF_FLAG_IF_LOOP ) ? 1 : 0)
+#define netif_is_ip4_set(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_IPV4_CFG) ? 1 : 0)
+#define netif_is_ip6_set(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_IPV6_CFG) ? 1 : 0)
 #define netif_is_ip4_cfg(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_IPV4_CFG) ? 1 : 0)
-#define netif_is_ip6_cfg(netif)              (((netif)->flagsEx & (NETIF_FLAG_EX_RA_DONE | NETIF_FLAG_EX_DHCP6_PD)) ? 1 : 0)
+#define netif_is_ip6_cfg(netif)              (((netif)->flagsEx & (NETIF_FLAG_EX_RA_DONE \
+                                                                 | NETIF_FLAG_EX_DHCP6_PD \
+                                                                 | NETIF_FLAG_EX_IPV6_OTA \
+                                                                 | NETIF_FLAG_EX_IPV6_IFCONFIG \
+                                                                 )) ? 1 : 0)
 #define netif_is_epsid_cfg(netif)            (((netif)->flagsEx & NETIF_FLAG_EX_EPSID_CFG) ? 1 : 0)
 #define netif_is_normal_pdp(netif)           (((netif)->flagsEx & NETIF_FLAG_EX_NORMAL_PDP) ? 1 : 0)
 #define netif_is_ppp_pdp(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_PPP_PDP) ? 1 : 0)
 #define netif_is_mbim_pdp(netif)             (((netif)->flagsEx & NETIF_FLAG_EX_MBIM_PDP) ? 1 : 0)
 #define netif_is_app_pdp(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_APP_PDP) ? 1 : 0)
+#define netif_is_ims_pdp(netif)              (((netif)->flagsEx & NETIF_FLAG_EX_IMS_PDP) ? 1 : 0)
+#define netif_is_pass_pdp(netif)             (((netif)->flagsEx & NETIF_FLAG_EX_PASS_PDP ) ? 1 : 0)
 #define netif_is_default_pdp(netif)          (((netif)->flagsEx & NETIF_FLAG_EX_DEFAULT_PDP ) ? 1 : 0)
 
-#define netif_clear_DHCP_done_flag(netif)    ((netif)->flags &= ~NETIF_FLAG_DHCP_DONE)
-#define netif_set_DHCP_done_flag(netif)      ((netif)->flags |= NETIF_FLAG_DHCP_DONE)
+#define netif_is_dhcp_done(netif)            (((netif)->flags & NETIF_FLAG_DHCP_DONE ) ? 1 : 0)
+#define netif_clear_dhcp_done_flag(netif)    ((netif)->flags &= ~NETIF_FLAG_DHCP_DONE)
+#define netif_set_dhcp_done_flag(netif)      ((netif)->flags |= NETIF_FLAG_DHCP_DONE)
 #define netif_clear_exter_flag(netif)        ((netif)->flags &= ~NETIF_FLAG_EXTER)
 #define netif_set_exter_flag(netif)          ((netif)->flags |= NETIF_FLAG_EXTER)
 #define netif_clear_inter_flag(netif)        ((netif)->flags &= ~NETIF_FLAG_INTER)
@@ -549,10 +593,10 @@ err_t netif_local_if_exist(void);
 #define netif_set_ip4_cfg_eflag(netif)       ((netif)->flagsEx |= NETIF_FLAG_EX_IPV4_CFG)
 
 #define netif_get_mac(netif)                 ((netif)->hwaddr)
-#define netif_get_ipaddr(netif)              ((const ip_addr_t*)&((netif)->ip_addr))
+#define netif_get_ipaddr(netif)              (&((netif)->ip_addr))
 #define netif_get_ipaddr_u32(netif)          ((netif)->ip_addr.addr)
-#define netif_get_gateway(netif)             ((const ip_addr_t*)&((netif)->gw))
-#define netif_get_netmask(netif)             ((const ip_addr_t*)&((netif)->netmask))
+#define netif_get_gateway(netif)             (&((netif)->gw))
+#define netif_get_netmask(netif)             (&((netif)->netmask))
 #define netif_get_dns_server_n(netif, n)     (&((netif)->dns_server[n])) /*becareful: n < 2*/
 #define netif_get_dns_server1(netif)         (&((netif)->dns_server[0]))
 #define netif_get_dns_server2(netif)         (&((netif)->dns_server[1]))
@@ -566,6 +610,8 @@ err_t netif_local_if_exist(void);
 #define netif_get_ip6_proto(netif)           ((netif)->ip6_proto)
 #define netif_set_mtu(netif, value)          ((netif)->mtu = (value))
 #define netif_get_mtu(netif)                 ((netif)->mtu)
+#define netif_set_mtu6(netif, value)         ((netif)->mtu6 = (value))
+#define netif_get_mtu6(netif)                ((netif)->mtu6)
 
 #define netif_inc_ifinpkts(netif)            ((netif)->if_in_pkts++)
 #define netif_inc_ifoutpkts(netif)           ((netif)->if_out_pkts++)
@@ -608,11 +654,21 @@ void netif_poll_all(void);
 #endif /* ENABLE_LOOPBACK */
 
 #if LWIP_IPV6
+#define netif_clear_ip6addr_ota_flag(netif)         ((netif)->flagsEx &= ~NETIF_FLAG_EX_IPV6_OTA)
+#define netif_set_ip6addr_ota_flag(netif)           ((netif)->flagsEx |= NETIF_FLAG_EX_IPV6_OTA)
+#define netif_is_ip6addr_ota_done(netif)            (((netif)->flagsEx & NETIF_FLAG_EX_IPV6_OTA) ? 1 : 0)
+#define netif_clear_ip6addr_ifconfig(netif)         ((netif)->flagsEx &= ~NETIF_FLAG_EX_IPV6_IFCONFIG)
+#define netif_set_ip6addr_ifconfig(netif)           ((netif)->flagsEx |= NETIF_FLAG_EX_IPV6_IFCONFIG)
+#define netif_is_ip6addr_ifconfig(netif)            (((netif)->flagsEx & NETIF_FLAG_EX_IPV6_IFCONFIG) ? 1 : 0)
 #define netif_is_ra_done(netif)                        (((netif)->flagsEx & NETIF_FLAG_EX_RA_DONE) ? 1 : 0)
 #define netif_is_nd6_dns_done(netif)                   (((netif)->flagsEx & NETIF_FLAG_EX_ND6_DNS) ? 1 : 0)
 #define netif_is_dhcp6_dns_done(netif)                 (((netif)->flagsEx & NETIF_FLAG_EX_DHCP6_DNS) ? 1 : 0)
 #define netif_is_dhcp6_pd_done(netif)                  (((netif)->flagsEx & NETIF_FLAG_EX_DHCP6_PD) ? 1 : 0)
+#define netif_get_backup_ip6addr(netif)                (&((netif)->ip6_addr_backup))
+#define netif_get_local_ip6addr(netif)                 (&((netif)->ip6_addr[0]))
 #define netif_get_global_ip6addr(netif)                (&((netif)->ip6_addr[1]))
+#define netif_get_site_ip6addr(netif)                      (&((netif)->ip6_addr[2]))
+#define netif_get_ip6_gateway(netif)                (&((netif)->ip6_gw))
 #define netif_get_dns6_server_n(netif, n)              (&((netif)->dns6_server[n])) /*becareful: n < 2*/
 #define netif_get_dns6_server1(netif)                  (&((netif)->dns6_server[0]))
 #define netif_get_dns6_server2(netif)                  (&((netif)->dns6_server[1]))
@@ -623,9 +679,46 @@ void netif_poll_all(void);
 s8_t netif_matches_ip6_addr(struct netif * netif, ip6_addr_t * ip6addr);
 void netif_create_ip6_linklocal_address(struct netif * netif, u8_t from_mac_48bit);
 void netif_set_dns_ipv6(struct netif* netif, ip6_addr_t *addr1, ip6_addr_t *addr2);
+void netif_set_ip6_global(struct netif *netif, ip6_addr_t * ip6addr, u32_t set_pos);
+void netif_set_ip6_global_prefix(struct netif *netif, u32_t addr1, u32_t addr2, u32_t set_pos);
+void netif_set_ip6_linklocal(struct netif * netif, u32_t addr1, u32_t addr2);
+struct netif * netif_nw_route_mifi(struct pbuf * p, u32_t ip_src);
+struct netif * netif_nw_route_dongle(struct pbuf * p, u32_t ip_src);
+struct netif * netif_nw6_route_dongle(struct pbuf * p, ip6_addr_t *ip6_src);
+struct netif * netif_nw_router_check(struct netif *inp, ip_addr_t *dest);
+struct netif * netif_nw6_router_check(struct netif *inp, ip6_addr_t *dest);
 
 #endif /* LWIP_IPV6 */
 
+static inline int netif_check_nw_if(struct netif *inp)
+{
+    if (inp 
+        && netif_is_external(inp)
+        && !netif_is_pass_pdp(inp)) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+static inline int netif_check_nw_default(struct netif *inp)
+{
+    if (inp && (inp == netif_default)) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+static inline int netif_check_nw_default_ip6(struct netif *inp)
+{
+    if (inp && (inp == netif_default_ip6)) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
 #if LWIP_NETIF_HWADDRHINT
 #define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))
 #else /* LWIP_NETIF_HWADDRHINT */
index 3654daa..7c20806 100644 (file)
@@ -35,6 +35,7 @@
 /* arch.h might define NULL already */
 #include "arch.h"
 #include "opt.h"
+#include <stddef.h>
 
 #ifdef __cplusplus
 extern "C" {
index 9177beb..931637c 100644 (file)
@@ -139,7 +139,7 @@ int lwip_getaddrinfo_r(const char *nodename,
        const struct addrinfo *hints,
        struct addrinfo **res);
 
-#if CONFIG_POC_SLPOC
+#if CONFIG_POC_SLPOC || BOARD_EC600MCN_LF_QS
 int getaddrinfo_with_pcid(const char *nodename,
                                            const char *servname,
                                            const struct addrinfo *hints,
@@ -156,7 +156,7 @@ void lwip_freeaddrinfo(struct addrinfo *ai);
 #define gethostbyname(name) lwip_gethostbyname(name)
 #define gethostbyname_with_pcid(name, pcid) lwip_gethostbyname_with_pcid(name, pcid)
 
-#if CONFIG_POC_SLPOC
+#if CONFIG_POC_SLPOC || BOARD_EC600MCN_LF_QS
 
 #define lwip_freeaddrinfo(addrinfo) freeaddrinfo(addrinfo)
 #define lwip_getaddrinfo_with_pcid(nodname, servname, hints, res, pcid) getaddrinfo_with_pcid(nodname, servname, hints, res, pcid)
index 921e70c..6c06821 100644 (file)
@@ -398,7 +398,7 @@ struct timeval
 #endif /* LWIP_TIMEVAL_PRIVATE */
 
 void lwip_socket_init(void);
-#if CONFIG_POC_SLPOC
+#if CONFIG_POC_SLPOC || BOARD_EC600MCN_LF_QS
 
 int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
 int bind(int s, const struct sockaddr *name, socklen_t namelen);
@@ -468,7 +468,7 @@ int readn(int fd, void *buf, size_t count);
 int writen(int fd, const void *buf, size_t count);
 int readline(int fd, void *buf, size_t maxline);
 
-#if CONFIG_POC_SLPOC
+#if CONFIG_POC_SLPOC || BOARD_EC600MCN_LF_QS
 
 #define lwip_accept(a,b,c)         accept(a,b,c)
 #define lwip_bind(a,b,c)           bind(a,b,c)
index 2c7ed24..18993c8 100644 (file)
@@ -229,6 +229,7 @@ struct netif {
   u8_t cid;   /** primary cid, denote for netif pdp*/
   u8_t sid;
   u8_t epsid; /** epsid, denote for all pdp context for lte using*/
+  void * tft_info; /*record tft info for this epsid*/
 
   u8_t ip_proto; /*denote this netif which ipv4 protocol using*/
   u8_t ip6_proto; /*denote this netif which ipv6 protocol using*/
index 89ea222..d22c742 100644 (file)
@@ -82,6 +82,56 @@ void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len);
 #endif /* SLIP_RX_FROM_ISR */
 int slipif_netif_set_default(u32_t ip);
 
+/*****************************************************************
+* Function: slip_add_routers
+*
+* Description:
+*      add router to slip, this is only work in slip network card
+* 
+* Parameters:
+*  ip             [in]  set dest ip transfer to slip network card directly
+*  netmask        [in]  work with ip
+*
+* Return:
+*      0                       ok
+*      -1                      error
+*
+*****************************************************************/
+int slipif_router_add(char *ip, char *netmask);
+
+/*****************************************************************
+* Function: slipif_router_delete
+*
+* Description:
+*      delete router to slip, this is only work in slip network card
+* 
+* Parameters:
+*  ip             [in]  set dest ip transfer to slip network card directly
+*  netmask        [in]  work with ip
+*
+* Return:
+*      0                       ok
+*      -1                      error
+*
+*****************************************************************/
+int slipif_router_delete(char *ip, char *netmask);
+
+/*****************************************************************
+* Function: slipif_destroy
+*
+* Description:
+*      destroy slip netif
+* 
+* Parameters:
+*  netif          [in]  slip netif 
+*
+* Return:
+*      
+*      
+*
+*****************************************************************/
+void slipif_destroy(struct netif *netif);
+
 #ifdef __cplusplus
 }
 #endif
index f61fb0a..880bf5c 100644 (file)
@@ -164,6 +164,7 @@ uint16_t lwip_htons(uint16_t n);
 uint16_t lwip_ntohs(uint16_t n);
 uint32_t lwip_htonl(uint32_t n);
 uint32_t lwip_ntohl(uint32_t n);
+int lwip_ping(const char *servname, int timeout, int size);
 int lwip_getaddrinfo_with_pcid(const char *nodename,
     const char *servname,
     const struct addrinfo *hints,
index 50ede69..5681cee 100644 (file)
@@ -575,6 +575,7 @@ int lwip_ioctl(int s, long cmd, void *argp);
 int lwip_fcntl(int s, int cmd, int val);
 struct rfackseqlist* lwip_getsockrfackseqlist(int s);
 int lwip_getTcpState(int s);
+int lwip_getAckedSize(int s);
 
 u16_t ql_get_soc_errno(void);
 
index a499c92..c109c5e 100644 (file)
@@ -132,6 +132,7 @@ typedef enum{
 #define NETIF_LINK_MODE_NAT_LWIP_LAN 4
 #define NETIF_LINK_MODE_NAT_PPP_LAN 5
 #define NETIF_LINK_MODE_NAT_NETDEV_LAN 6
+#define NETIF_LINK_MODE_NAT_NETDEV_LAN_W5500 7
 #endif
 #if IP_NAT_INTERNAL_FORWARD
 #define NAT_CID 0x0f
@@ -268,6 +269,13 @@ struct netif_hint {
 #define LWIP_NETIF_USE_HINTS              0
 #endif /* LWIP_NETIF_HWADDRHINT */
 
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_NETIF
+#define LWIP_NETIF_IPV4_ADDR 0
+#define LWIP_NETIF_IPV6_ADDR 1
+#define LWIP_NETIF_IP_TYPE_MAX 2
+#define LWIP_NETIF_DNS_MAX 2
+#endif
+
 /** Generic data structure used for all lwIP network interfaces.
  *  The following fields should be filled in by the initialization
  *  function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
@@ -286,7 +294,7 @@ struct netif {
   ip_addr_t ip_addr;
   ip_addr_t netmask;
   ip_addr_t gw;
-  ip_addr_t dns_server [2];
+  //ip_addr_t dns_server [2];
 #endif /* LWIP_IPV4 */
 #if LWIP_IPV6
   /** Array of IPv6 addresses for this netif. */
@@ -423,6 +431,9 @@ struct netif {
 
   uint32_t u32RndisULSize;
   uint32_t u32RndisDLSize;
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_NETIF
+  ip_addr_t dns_server[LWIP_NETIF_IP_TYPE_MAX][LWIP_NETIF_DNS_MAX];
+#endif
 };
 #if IP_NAT_INTERNAL_FORWARD
 struct lan_netif {
@@ -616,6 +627,8 @@ err_t netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t
 
 u8_t netif_name_to_index(const char *name);
 char * netif_index_to_name(u8_t idx, char *name);
+struct netif *netif_find_by_ipaddr(u32_t addr);
+
 struct netif* netif_get_by_index(u8_t idx);
 struct netif* netif_get_by_cid(u8_t sim_cid);
 #if IP_NAT
index e958836..d49a52f 100644 (file)
@@ -577,6 +577,8 @@ int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptse
 int lwip_ioctl(int s, long cmd, void *argp);
 int lwip_fcntl(int s, int cmd, int val);
 struct netif* lwip_getDefaultNetif();
+#define netif_get_default_nw()    lwip_getDefaultNetif()
+
 #ifdef CONFIG_QUEC_PROJECT_FEATURE_SOCKET
 int lwip_get_error(int s);
 #endif
index 48d6b53..bab5721 100644 (file)
@@ -173,9 +173,14 @@ extern "C" {
 #define  ENOMEDIUM      123  /* No medium found */
 #define  EMEDIUMTYPE    124  /* Wrong medium type */
 
+#if 0
 #ifndef errno
 extern int errno;
 #endif
+#else
+extern uint16_t lwip_get_socket_errno(void);
+#define errno lwip_get_socket_errno()
+#endif
 
 #else /* LWIP_PROVIDE_ERRNO */
 
index d2beaf8..46ca513 100644 (file)
@@ -668,6 +668,7 @@ struct netif* lwip_getDefaultNetif();
 #define QL_TCPIP_DEFRTO                 3
 
 uint16_t lwip_get_soc_errno(void);
+uint16_t lwip_get_socket_errno(void);
 
 int lwip_get_error(int s);
 int quecl_get_lwip_tcp_rto_init();
index 957780c..49092d2 100644 (file)
@@ -62,7 +62,7 @@
  *
  * Comment to disable the use of assembly code.
  */
-#if !defined (MBEDTLS_WITH_HELIOS)
+#if !defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_HAVE_ASM
 #endif
 
  *
  * Comment if your system does not support time functions
  */
+#if !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_HAVE_TIME
+#endif
 
 /**
  * \def MBEDTLS_HAVE_TIME_DATE
  * mbedtls_platform_gmtime_r() at compile-time by using the macro
  * MBEDTLS_PLATFORM_GMTIME_R_ALT.
  */
+#if !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_HAVE_TIME_DATE
+#endif
 
 /**
  * \def MBEDTLS_PLATFORM_MEMORY
  * Uncomment to prevent default assignment of standard functions in the
  * platform layer.
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
 #endif
 
  * Uncomment a macro to enable alternate implementation of specific base
  * platform function
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_PLATFORM_EXIT_ALT
 #define MBEDTLS_PLATFORM_FPRINTF_ALT
 #define MBEDTLS_PLATFORM_PRINTF_ALT
  *
  * Uncomment this macro to disable the built-in platform entropy functions.
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_NO_PLATFORM_ENTROPY
 #endif
 
  * Comment this macro to disable storing the peer's certificate
  * after the handshake.
  */
-#if !defined (MBEDTLS_WITH_HELIOS)
+#if !defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
 #endif
 
  *
  * Uncomment this to allow your own alternate threading implementation.
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_THREADING_ALT
 #endif
 
  *
  * This modules adds support for the AES-NI instructions on x86-64
  */
-#if !defined (MBEDTLS_WITH_HELIOS)
+#if !defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_AESNI_C
 #endif
 
  *
  * Uncomment to enable the HAVEGE random generator.
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_HAVEGE_C
 #endif
 
  *
  * This modules adds support for the VIA PadLock on x86.
  */
-#if !defined (MBEDTLS_WITH_HELIOS)
+#if !defined (MBEDTLS_WITH_HELIOS) &&  !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #define MBEDTLS_PADLOCK_C
 #endif
 
  *
  * Enable this layer to allow use of mutexes within mbed TLS
  */
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) || defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
 #define MBEDTLS_THREADING_C
 #endif
 
index eb65649..cda3708 100644 (file)
@@ -166,6 +166,9 @@ int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
                               void (*free_func)( void * ) );
 #endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */
 #else /* !MBEDTLS_PLATFORM_MEMORY */
+#if defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
+#include "stdlib.h"
+#endif
 #define mbedtls_free       free
 #define mbedtls_calloc     calloc
 #endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */
@@ -392,7 +395,7 @@ typedef struct mbedtls_platform_context
 mbedtls_platform_context;
 
 #else
-#if !defined (MBEDTLS_WITH_HELIOS)
+#if !defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #include "platform_alt.h"
 #else
 typedef struct mbedtls_platform_context
index c6a2c4c..1b25420 100644 (file)
@@ -729,8 +729,8 @@ int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE
 
     if( fout != NULL )
     {
-        if( fwrite( (void *)p, 1, plen, fout ) != (int)plen ||
-            fwrite( s, 1, slen, fout ) != (int)slen )
+        if( (int)fwrite( (void *)p, 1, plen, fout ) != (int)plen ||
+            (int)fwrite( s, 1, slen, fout ) != (int)slen )
             return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
     }
     else
index 6724b28..28dfeab 100644 (file)
@@ -479,6 +479,18 @@ int mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx )
 #include "../port/helios/inc/fs_alt.h"
 #endif
 
+//add from modrsa
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+//end add
+
 int mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path )
 {
     int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;
index 50d4cbe..899b979 100644 (file)
@@ -36,7 +36,7 @@
 
 #if !defined(unix) && !defined(__unix__) && !defined(__unix) && \
     !defined(__APPLE__) && !defined(_WIN32) && !defined(__QNXNTO__) && \
-    !defined(__HAIKU__) && !defined(MBEDTLS_WITH_HELIOS)
+    !defined(__HAIKU__) && !defined(MBEDTLS_WITH_HELIOS) && !defined(PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 #error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h"
 #endif
 
@@ -83,7 +83,7 @@ static int wsa_init_done = 0;
 
 #else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */
 
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 
 #include "helios_datacall.h"
 
@@ -92,13 +92,16 @@ static int wsa_init_done = 0;
 #else
 #include "sockets.h"
 
-#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05)
+#if defined (PLAT_Unisoc) || defined(PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include "socket.h"
 #endif
 
 #include "netdb.h"
 #endif
 
+#elif defined (PLAT_ECR6600) || defined (PLAT_aic8800m40)
+#include "sockets.h"
+#include "netdb.h"
 #else
 
 #include <sys/types.h>
@@ -183,7 +186,7 @@ int mbedtls_net_connect( mbedtls_net_context *ctx,
 {
     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     struct addrinfo hints, *addr_list, *cur;
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
        struct sockaddr_in      * ip4_addr;
        struct sockaddr_in6 * ip6_addr;
 #endif
@@ -197,7 +200,7 @@ int mbedtls_net_connect( mbedtls_net_context *ctx,
     hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
     hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
 
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
        if( getaddrinfo_with_pcid( host, NULL, &hints, &addr_list, cid ) != 0 )
 #else
     if( getaddrinfo( host, port, &hints, &addr_list ) != 0 )
@@ -220,7 +223,7 @@ int mbedtls_net_connect( mbedtls_net_context *ctx,
             continue;
         }
 
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
                Helios_DataCallInfoStruct data_call_info;
                memset(&data_call_info, 0x00, sizeof(Helios_DataCallInfoStruct));
                union {
@@ -294,7 +297,7 @@ int mbedtls_net_bind( mbedtls_net_context *ctx,
     hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
     if( bind_ip == NULL )
         hints.ai_flags = AI_PASSIVE;
-#if defined (MBEDTLS_WITH_HELIOS)
+#if defined (MBEDTLS_WITH_HELIOS) && !defined (PLAT_aic8800m40)
        if( getaddrinfo_with_pcid( bind_ip, port, &hints, &addr_list, cid ) != 0 )
 #else
     if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 )
index 7e0bb51..2ad6d22 100644 (file)
@@ -110,7 +110,7 @@ int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n )
         return( MBEDTLS_ERR_PK_ALLOC_FAILED );
     }
 
-    if( fread( *buf, 1, *n, f ) != (int)*n )
+    if( (int)fread( *buf, 1, *n, f ) != (int)*n )
     {
         fclose( f );
 
index 1280dbf..acb6c69 100644 (file)
@@ -227,7 +227,7 @@ static int platform_fprintf_uninit( FILE *stream, const char *format, ... )
 #endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */
 
 #if defined (MBEDTLS_WITH_HELIOS)
-#if !defined(PLAT_EIGEN)
+#if !defined(PLAT_EIGEN) && !defined (PLAT_ECR6600) && !defined (PLAT_aic8800m40)
 int (*mbedtls_fprintf)( HeliosFILE *, const char *, ... ) = Helios_fprintf;
 #else
 int (*mbedtls_fprintf)( FILE *, const char *, ... ) =
index 5e55c4a..fdcbefd 100644 (file)
@@ -20,7 +20,7 @@ int mbedtls_platform_setup( mbedtls_platform_context *ctx )
 
        mbedtls_platform_set_exit(mbedtls_port_threading_exit);
 
-#if !defined(PLAT_EIGEN)
+#if !defined(PLAT_EIGEN) && !defined(PLAT_ECR6600) && !defined(PLAT_aic8800m40)
        mbedtls_platform_set_fprintf(fprintf);
 #endif
 
index 2f40773..f360a88 100644 (file)
@@ -3,22 +3,23 @@
 #include "helios_os.h"
 #include <time.h>
 #include <stdint.h>
-#if defined (PLAT_Qualcomm) ||  defined (PLAT_RDA) 
+#if defined (PLAT_Qualcomm) ||  defined (PLAT_RDA) || defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
 #include "helios_rtc.h"
 #endif
 
-#if defined (PLAT_Unisoc_8850)
+#if defined (PLAT_Unisoc_8850) || defined(PLAT_Unisoc_8850_R02) || defined(PLAT_Unisoc_8910_R06)
 #include "sockets.h"
 #endif
 
-#if defined (PLAT_ASR) || defined (PLAT_Qualcomm) || defined (PLAT_ASR_1803s)  || defined(PLAT_ASR_1606) || defined(PLAT_RDA) 
+#if defined (PLAT_ASR) || defined (PLAT_Qualcomm) || defined (PLAT_ASR_1803s) || defined (PLAT_ASR_1803sc)  || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \
+    || defined(PLAT_RDA) || defined(PLAT_ASR_1602) || defined(PLAT_ECR6600) || defined(PLAT_aic8800m40)
 struct timeval { 
        int tv_sec; 
        int tv_usec;
 };
 #endif
 
-#if !(defined (PLAT_Qualcomm) || defined(PLAT_RDA))
+#if !(defined (PLAT_Qualcomm) || defined(PLAT_RDA) || defined(PLAT_ECR6600) || defined(PLAT_aic8800m40))
 extern int gettimeofday(struct timeval *tv, void *tz);
 #endif
 
@@ -61,6 +62,16 @@ time_t time(time_t *t)
     return (time_t)Helios_Get_CurrentDateTime_Second();
 }
 
+#elif defined (PLAT_ECR6600) || defined(PLAT_aic8800m40)
+
+void gettimeofday(struct timeval *tv, void *tz)
+{
+       (void)tz;
+       unsigned long system_uptime = Helios_RTC_GetTicks();
+       tv->tv_sec = system_uptime/1000;
+       tv->tv_usec = (system_uptime%1000)*1000;
+}
+
 #endif
 
 unsigned long mbedtls_timing_hardclock( void )
index 0c31f3b..d807ee6 100644 (file)
@@ -45,7 +45,7 @@ extern "C" {
 #include <stdbool.h>
 #if defined(PLAT_Qualcomm)
 #include "helios_socket.h"
-#elif defined(PLAT_EIGEN)
+#elif defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 #include "lwip/inet.h"
 #include "lwip/sockets.h"
 #else
@@ -59,7 +59,11 @@ extern "C" {
 #define HELIOS_USR_LEN_MAX 36
 #define HELIOS_PWD_LEN_MAX 36
 #else
+#if defined(PLAT_Qualcomm)
+#define HELIOS_APN_LEN_MAX 63
+#else
 #define HELIOS_APN_LEN_MAX 64
+#endif
 #define HELIOS_USR_LEN_MAX 64
 #define HELIOS_PWD_LEN_MAX 64
 #endif
@@ -293,24 +297,44 @@ int Helios_DataCall_RecordApn(uint8_t sim_id, Helios_DataCallRecordAPNStruct *in
 uint32_t Helios_DataCall_GetProfileIdxMin(void);
 uint32_t Helios_DataCall_GetProfileIdxMax(void);
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s)|| defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)|| defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) \
+    || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
 int Helios_DataCall_GetApn(int paracount, uint8_t sim_id, void *apn, ...);
 #endif
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 int Helios_DataCall_SetDnsServer(int32_t profile_idx, uint8_t sim_id, char *new_pri, char *new_sec);
 #endif
 
-//#if defined(PLAT_Qualcomm) || defined(PLAT_ASR_1803s) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
-//#if !defined (PLAT_Unisoc_8850)
+#if MICROPY_QPY_MODULE_DSDS
+int Helios_DataCall_SetPDPContext(uint8_t sim_id,uint8_t profile_idx, Helios_DataCallStartStruct *info);
+int Helios_DataCall_GetPDPContext(uint8_t sim_id,uint8_t profile_idx, Helios_DataCallStartStruct *info);
+#else
 int Helios_DataCall_SetPDPContext(uint8_t profile_idx, Helios_DataCallStartStruct *info);
 int Helios_DataCall_GetPDPContext(uint8_t profile_idx, Helios_DataCallStartStruct *info);
-//#endif
+#endif
 
-#ifdef PLAT_ASR_1803s
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 void Helios_DataCall_GetDataSpeed(uint32_t *rx, uint32_t *tx);
 #endif
 
+#ifdef PLAT_ASR
+int Helios_DataCall_SetIsUseAttachApn(int attach_flag);
+int Helios_DataCall_GetIsUseAttachApn(void);
+#endif
+
+//#if MICROPY_QPY_MODULE_WANINFO
+typedef struct
+{
+    int used_MBytes_sim;
+    int used_Bytes_sim;
+    int recv_MBytes_sim;
+    int recv_Bytes_sim;
+}Helios_DataCallSimUsed;
+
+int Helios_DataCall_GetSimUsed(uint8_t sim_id, Helios_DataCallSimUsed *info);
+//#endif
+
 /*-----------------------------------------------------------------------*/
 #ifdef __cplusplus
 }
index 7b06ee9..ab0985d 100644 (file)
@@ -59,6 +59,13 @@ typedef enum {
        Helios_Lwm2m_Config_Case_apnretry                       = 12,
        Helios_Lwm2m_Config_Case_dataformat             = 13,
        Helios_Lwm2m_Config_Case_waitafterbs            = 14,
+
+       #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+       Helios_Lwm2m_Config_Case_epname                         = 15,   
+       #endif  
+       
+       Helios_Lwm2m_Config_Case_Max                            ,
+       
 }Helios_Config_Type;
 
 typedef enum {
@@ -77,6 +84,7 @@ typedef enum {
        Helios_Lwm2m_ErrorCode_Config_Type_Error                = -12,
        Helios_Lwm2m_ErrorCode_Config_NO_FUNC_Error     = -13,
        Helios_Lwm2m_ErrorCode_Config_Get_AtStr_Error   = -14,
+       Helios_Lwm2m_ErrorCode_Config_Not_Support       = -15,
 }Helios_Lwm2m_Error_Code;
 
 typedef enum {
@@ -108,6 +116,9 @@ typedef struct {
 
 typedef  struct {
        int32_t                 iEpmode;
+       #if MICROPY_QPY_MODULE_LWM2M_SUPPORT_EPNAME
+       char                    strEpname[64];
+       #endif
 }Helios_Config_EpMode_t;
 
 typedef  struct {
@@ -194,6 +205,13 @@ Helios_Lwm2m_Error_Code helios_lwm2m_unregister();
 Helios_Lwm2m_Error_Code helios_lwm2m_free();
 Helios_Lwm2m_Error_Code helios_lwm2m_get_stat(int *lwstat);
 Helios_Lwm2m_Error_Code helios_lwm2m_register_callcb(lwm2m_call_cb_t callcb);
+#if MICROPY_QPY_MODULE_LWM2M_ACK
+Helios_Lwm2m_Error_Code helios_lwm2m_enable_ack_support(uint32_t is_eable);
+Helios_Lwm2m_Error_Code helios_lwm2m_ack_messageid(uint32_t messageid,uint32_t type);
+#endif
+#if MICROPY_QPY_MODULE_LWM2M_SUPPORT_CHANGE
+Helios_Lwm2m_Error_Code Helios_lwm2m_change_value (const char * uri,int uri_len,const char *value,int value_len);
+#endif
 /* >>>>must have application interface  --end */
 
 
index 46bf20d..73b6b2d 100644 (file)
@@ -58,6 +58,7 @@ extern "C" {
 #define        HELIOS_NW_VOICE_REG_STATUS_IND  2
 #define HELIOS_NW_NITZ_TIME_UPDATE_IND 3
 #define HELIOS_NW_SIGNAL_QUALITY_IND   4
+#define HELIOS_NW_JAMMING_DETECT_IND   5
 
 
 typedef void (*network_cb_t)(uint8_t sim_id, int32_t event_id, void *ctx);
@@ -111,7 +112,7 @@ typedef struct
        int32_t rssi;
        int32_t pci;
     int32_t rsrq;
-#if defined(PLAT_RDA) || defined(PLAT_ASR) || defined(PLAT_EIGEN)
+#if defined(PLAT_RDA) || defined(PLAT_ASR) || defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
     int32_t sinr; //mia.zhong @20220209
 #endif
 }Helios_LTEInfoStruct;
@@ -170,7 +171,7 @@ typedef struct
        int32_t rsrp;
        int32_t rsrq;
        int32_t cqi;
-#if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR)
+#if !defined (PLAT_RDA) //defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR)
     int32_t sinr;
 #endif
 }Helios_LTESignalStrengthStruct;
@@ -257,7 +258,7 @@ typedef struct
        uint64_t band_hign;
 }Helios_NwBandStruct;
 
-#elif defined(PLAT_ASR)
+#elif defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
 #define   HELIOS_BAND_GSM_MAXVALUE      0x0fff
 
 #define   HELIOS_BAND_GSM_900           0x01 //B8
@@ -349,7 +350,7 @@ typedef enum {
 }Helios_NW_Preferred_Network_Type_e;
 
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 typedef enum
 {
     HELIOS_NW_WORKMODE_NORMAL = 0,
@@ -403,6 +404,17 @@ typedef struct
        char lte_cell_info[HELIOS_NW_MAX_BLACK_CELL_NUM][HELIOS_CELL_INFO_MAX];
 }Helios_NwBackCellInfo;
 
+typedef struct
+{
+       int32_t gsm_minch;
+       int32_t gsm_sinr;
+       int32_t gsm_rssi;
+       int32_t lte_rsrp;
+       int32_t lte_rsrq;
+       int32_t lte_rssi;
+       int32_t shake_period;
+}Helios_NwJamDetConfigStruct;
+
 /**
  * @brief: net module initialize
  * @sideeffect:
@@ -543,13 +555,17 @@ int Helios_Nw_GetBlackCellCfg(int* blackcellCfg,int* blackcellCfg_num);
 int Helios_Nw_SetBlackCellCfg(int blackcellCfg,int blackcellCfg_num);
 int Helios_Nw_DeleteAllBlackCell(void);
 
+int Helios_Nw_SetDrxtm(uint8_t simid, uint16_t drx_timer_value_set);
+int Helios_Nw_GetDrxtm(uint8_t simid, uint16_t *drx_timer_value_get);
+int Helios_Nw_ImsIsRegister(uint8_t nSim);
 
-#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_Unisoc_8910_R05)
+#if defined(PLAT_ASR) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_Qualcomm) \
+    || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
 int Helios_Nw_SetApn(char *apn, uint8_t simid);
 
 int Helios_Nw_GetApn(char *apn, uint8_t simid);
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 /*****************************************************************
 * Function: Helios_Nw_SetWorkMode
 *
@@ -588,7 +604,7 @@ int Helios_Nw_SetTxPower(HELIOS_NW_TXPOWER_TYPE type,int32_t value,HELIOS_NW_TXP
 #endif
 
 
-#if defined(PLAT_Qualcomm) || defined(PLAT_ASR)
+#if defined(PLAT_Qualcomm) || defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
 /**
  * @brief: set configuration information of network band
  * @sideeffect:
@@ -614,9 +630,18 @@ int Helios_Nw_SetBand(uint8_t sim_id, Helios_NwBandStruct *info);
 int Helios_Nw_GetBand(uint8_t sim_id, Helios_NwBandStruct *info);
 #endif
 
-#if defined(PLAT_ASR)
+#if defined(PLAT_ASR) || MICROPY_QPY_MODULE_NET_BAND
 int Helios_Nw_Band_Restore(uint8_t sim_id);
 #endif
+
+#if MICROPY_QPY_MODULE_JAMDET
+int Helios_Nw_SetJamdetSwitch(uint8_t simid, uint8_t opt);
+int Helios_Nw_GetJamdetSwitch(uint8_t simid, uint8_t *opt);
+int Helios_Nw_SetJamdetConfiguration(uint8_t simid, Helios_NwJamDetConfigStruct *pcfg);
+int Helios_Nw_GetJamdetConfiguration(uint8_t simid, Helios_NwJamDetConfigStruct *pcfg);
+int Helios_Nw_GetJamdetStatus(uint8_t simid, uint8_t *status);
+#endif
+
 /*-----------------------------------------------------------------------*/
 #ifdef __cplusplus
 }
index 94f94e3..c3060f7 100644 (file)
@@ -48,7 +48,7 @@ extern "C" {
 #define HELIOS_SIM_IMSI_LEN       16
 #define HELIOS_SIM_PHONENUM_LEN   24
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 #define HELIOS_SIM_PIN_LEN_MAX   8
 #else
 #define HELIOS_SIM_PIN_LEN_MAX   15
@@ -128,6 +128,14 @@ typedef struct
        char new_pin[HELIOS_SIM_PIN_LEN_MAX+1];
 }Helios_SIMChangePinInfoStruct;
 
+typedef struct
+{
+       uint8_t pin_remain_attempts;
+       uint8_t puk_remain_attempts;
+       uint8_t pin2_remain_attempts;
+       uint8_t puk2_remain_attempts;
+}Helios_SIMRemainPinAttempts;
+
 //mia.zhong @20211008
 #if defined (PLAT_ASR)
 typedef struct
@@ -250,7 +258,7 @@ int Helios_SIM_GetPhoneNumber(uint8_t sim_id, void *phone_num, size_t len);
 */
 int Helios_SIM_GetCardStatus(uint8_t sim_id, Helios_SIM_Status_e *status);
 
-#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR) || (defined (PLAT_ASR_1606) && MICROPY_QPY_MODULE_PHB)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR) || (( defined(PLAT_Unisoc_8850_R02) ||defined (PLAT_ASR_1606) || defined (PLAT_ASR_1609) || defined(PLAT_ASR_1602)) && MICROPY_QPY_MODULE_PHB)
 /**
  * @brief: check phonebook is ready or not
  * @sideeffect:
@@ -348,14 +356,23 @@ int Helios_SIM_PINUnlock(uint8_t sim_id, Helios_SIMUnlockPinInfoStruct *info);
 */
 int Helios_SIM_PINChange(uint8_t sim_id, Helios_SIMChangePinInfoStruct *info);
 
+#if MICROPY_QPY_MODULE_PIN_REMATTEMPTS
+int Helios_SIM_PINRemainAttempts(uint8_t sim_id, Helios_SIMRemainPinAttempts *info);
+#endif
+
 //mia.zhong @20211008
 #if defined(PLAT_ASR)
 int Helios_SIM_GenericAccess(uint8_t sim_id, Helios_SIMGenericAccesStruct *info);
 #endif
 
-#if defined(PLAT_ASR_1606) || defined(PLAT_EIGEN) || defined(PLAT_Unisoc) //|| defined(PLAT_ASR) 
 int Helios_SIM_SwitchCard(uint8_t sim_id, void *cb);
 int Helios_SIM_GetCurrentSimid(uint8_t *sim_id);
+#if defined(BOARD_EC800MCN_LE_VOLVGL) || defined(BOARD_EC800MCN_LE_CPE) || defined(BOARD_EG810MEU_LA_VOLVGL)
+int Helios_SIM_GetInsertStatus(uint8_t sim_id, uint8_t *status);
+#endif
+
+#if defined (PLAT_EIGEN_718)
+int Helios_SIM_GetCurrentSimid(uint8_t *sim_id);
 #endif
 
 /*-----------------------------------------------------------------------*/
index 780c4c0..e1b9663 100644 (file)
@@ -44,9 +44,9 @@ extern "C" {
 #include <stdint.h>
 #include <string.h>
 
-#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR) || defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc)
 #define HELIOS_MAX_SMS_DATA_LEN   140 * 6 //支持6条正常短信长度
-#elif (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc_8910_R05)
+#elif defined(PLAT_Unisoc) || defined(PLAT_Qualcomm) || defined(PLAT_Unisoc_8910_R05) || defined(PLAT_Unisoc_8910_R06)
 #define HELIOS_MAX_SMS_DATA_LEN   140 * 4 //支持4条正常短信长度
 #else
 #define HELIOS_MAX_SMS_DATA_LEN   140
@@ -116,8 +116,8 @@ typedef struct
     int  body_len;
 }Helios_SMSStatusInfo;
 
-//#if defined(PLAT_ASR_1803s) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_ASR) || defined(PLAT_EIGEN)
-#if !defined(PLAT_Unisoc_8850) && !defined(PLAT_RDA)
+//#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || (defined(PLAT_Unisoc) && !defined(BOARD_EG915UEU_AB)) || defined(PLAT_Qualcomm) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR) || defined(PLAT_EIGEN)
+#if !defined(PLAT_Unisoc_8850) && !defined(PLAT_RDA) && !defined(PLAT_Unisoc_8850_R02)
 typedef enum {
   HELIOS_SMS_DEL_MODE_DEFAULT = 0,
   HELIOS_SMS_DEL_INDEX = 0,       /* Delete only one message indicated by the index */
@@ -315,7 +315,7 @@ int Helios_SMS_GetPDUMsgLength(void *pdu_msg);
 int Helios_SMS_GetMsgIndex(uint8_t sim_id);
 
 
-#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR) || defined(PLAT_ASR_1606)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || defined(PLAT_ASR) || defined(PLAT_ASR_1606) || defined(PLAT_ASR_1609) || defined(PLAT_ASR_1602)
 int Helios_SMS_GetMsgStatus(uint8_t *smsready);
 #endif
 
index 8c7859d..e89068f 100644 (file)
@@ -228,7 +228,11 @@ typedef enum{
 //mia.zhong @20210831
 typedef struct
 {
+#if    defined(PLAT_Unisoc_8850_R02)
+       char filename[64];
+#else
     char filename[32];
+#endif
     HELIOS_VC_REC_TYPE record_type;
     HELIOS_VC_REC_MODE record_mode;
 }Helios_Voicecall_Record_Process_t;
@@ -306,6 +310,11 @@ int Helios_VoiceCall_Start_Dtmf(uint8_t nSim, char *dtmf, uint16_t duration);
 
 int Helios_VoiceCall_Set_Fw(uint8_t nSim, int reason, int fwmode, char* phone_num);
 
+int Helios_VoiceCall_Set_CallWait(uint8_t nSim, int enable);
+
+int Helios_VoiceCall_Get_CallWait(uint8_t nSim);
+
+int Helios_VoiceCall_CallHold(uint8_t nSim, int n);
 //mia.zhong @20220322 DTMF识别
 #if defined(PLAT_ASR) && defined(CONFIG_VIOCE_CALL)
 int Helios_VoiceCall_Tone_Detect(uint8_t enable);
@@ -332,11 +341,17 @@ HELIOS_VC_ERROR_CODE Helios_VoiceCall_Set_Ringtone_type(HELIOS_AUD_RING_TYPE_E t
 #endif
 #endif
 
-#if defined(PLAT_ASR_1803s)
+#if defined(PLAT_ASR_1803s) || defined(PLAT_ASR_1803sc) || MICROPY_QPY_MODULE_AUTOCANCEL
 int Helios_VoiceCall_Set_Autocancel_Flag(uint8_t enable);
 
 uint8_t Helios_VoiceCall_Get_Autocancel_Flag(void);
 
+#endif
+
+#if defined(PLAT_ASR_1606)
+HELIOS_VC_ERROR_CODE Helios_VoiceCall_Set_Record_Check_Flag(unsigned char set);
+
+unsigned char Helios_VoiceCall_Get_Record_Check_Flag(void);
 #endif
 /*-----------------------------------------------------------------------*/
 #ifdef __cplusplus
index 01e5c45..e4f59a0 100644 (file)
@@ -45,6 +45,7 @@ typedef struct
 typedef int Helios_Thread_t;
 typedef int Helios_Sem_t;
 typedef int Helios_Mutex_t;
+typedef int Helios_ReMutex_t;
 typedef int Helios_MsgQ_t;
 typedef int Helios_OSTimer_t;
 
@@ -52,6 +53,7 @@ Helios_Thread_t Helios_Thread_Create(Helios_ThreadAttr *attr);
 void Helios_Thread_Delete(Helios_Thread_t thread);
 void Helios_Thread_Exit(void);
 void *Helios_Thread_GetStaskPtr(Helios_Thread_t thread);
+char *Helios_Thread_GetName(void);
 Helios_Thread_t Helios_Thread_GetID(void);
 void Helios_Thread_SetSpecific(void *spec);
 void *Helios_Thread_GetSpecific(void);
@@ -65,9 +67,14 @@ Helios_Mutex_t Helios_Mutex_Create(void);
 int Helios_Mutex_Lock(Helios_Mutex_t mutex, uint32_t wait);
 void Helios_Mutex_Unlock(Helios_Mutex_t mutex);
 void Helios_Mutex_Delete(Helios_Mutex_t mutex);
+Helios_ReMutex_t Helios_ReMutex_Create(void);
+int Helios_ReMutex_Lock(Helios_ReMutex_t mutex_r, uint32_t wait);
+void Helios_ReMutex_Unlock(Helios_ReMutex_t mutex_r);
+void Helios_ReMutex_Delete(Helios_ReMutex_t mutex_r);
 Helios_MsgQ_t Helios_MsgQ_Create(uint32_t msg_count, size_t msg_size);
 int Helios_MsgQ_Put(Helios_MsgQ_t mq, const void *msg, size_t msg_size, uint32_t wait);
 int Helios_MsgQ_Get(Helios_MsgQ_t mq, void *msg, size_t msg_size, uint32_t wait);
+int Helios_MsgQ_Get_Cnt(Helios_MsgQ_t mq, uint32_t *count);
 void Helios_MsgQ_Delete(Helios_MsgQ_t mq);
 Helios_OSTimer_t Helios_OSTimer_Create(void);
 int Helios_OSTimer_Start(Helios_OSTimer_t timer, Helios_OSTimerAttr *attr);
@@ -96,6 +103,8 @@ int Helios_Flag_Release(Helios_OSFlag_t flagRef, uint32_t mask,  Helios_flag_op_
 int Helios_Flag_Clear(Helios_OSFlag_t flagRef, uint32_t flag);
 int Helios_Flag_delete( Helios_OSFlag_t flagRef);
 
-
+#if defined(PLAT_ASR_1606) || defined(PLAT_Unisoc) || defined(PLAT_ASR_1602) || defined(PLAT_Unisoc_8910_R06)
+void Helios_delay_us(unsigned long uSec);
+#endif
 #endif
 
index 8d383eb..d6a2165 100644 (file)
@@ -17,5 +17,5 @@ NAME = OS
 
 GLOBAL_INCS = .
 
-$(NAME)_SRCS = 
+$(NAME)_SRCS = helios_os.c
 
index c6420f0..fc1a4f8 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 
-#if !defined(PLAT_ASR) && !defined(PLAT_EIGEN) && !defined(PLAT_ECR6600)
+#if !defined(PLAT_ASR) && !defined(PLAT_EIGEN) && !defined(PLAT_ECR6600) && !defined(PLAT_EIGEN_718)
 
 #include "helios_debug.h"
 #include "helios_os.h"
index 91e5c0c..5d47d44 100644 (file)
@@ -23,7 +23,7 @@
 typedef void (*app_entry_t)(void *argv);
 
 
-#if defined(PLAT_EIGEN)
+#if defined(PLAT_EIGEN) || defined(PLAT_EIGEN_718)
 
 typedef struct
 {
index f01e2b9..d4d1c4e 100644 (file)
@@ -40,7 +40,7 @@ $(NAME)_COMPONENTS += system/mbedtls
 endif
 endif
 
-ifeq ($(strip $(PLAT)),$(filter $(PLAT),Unisoc Unisoc_8910_R05 Unisoc_8850 ASR_1606 ASR Qualcomm))
+ifeq ($(strip $(PLAT)),$(filter $(PLAT),Unisoc Unisoc_8910_R05 Unisoc_8910_R06 Unisoc_8850 Unisoc_8850_R02 ASR_1606 ASR Qualcomm ASR_1609 ASR_1602))
 $(NAME)_COMPONENTS += system/gnss \
 
 endif
diff --git a/2.sdk/project/7PIN/audio/IMEIhao.mp3 b/2.sdk/project/7PIN/audio/IMEIhao.mp3
new file mode 100644 (file)
index 0000000..a3d5ab1
Binary files /dev/null and b/2.sdk/project/7PIN/audio/IMEIhao.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/Low_power_warning.mp3 b/2.sdk/project/7PIN/audio/Low_power_warning.mp3
new file mode 100644 (file)
index 0000000..8308a76
Binary files /dev/null and b/2.sdk/project/7PIN/audio/Low_power_warning.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_CHARGE_FULL.mp3 b/2.sdk/project/7PIN/audio/R_CHARGE_FULL.mp3
new file mode 100644 (file)
index 0000000..3a77791
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_CHARGE_FULL.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_CHARGE_IN.mp3 b/2.sdk/project/7PIN/audio/R_CHARGE_IN.mp3
new file mode 100644 (file)
index 0000000..f728271
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_CHARGE_IN.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_CHARGE_OUT.mp3 b/2.sdk/project/7PIN/audio/R_CHARGE_OUT.mp3
new file mode 100644 (file)
index 0000000..cb7349d
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_CHARGE_OUT.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_0.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_0.mp3
new file mode 100644 (file)
index 0000000..ef1e1e6
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_0.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_1.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_1.mp3
new file mode 100644 (file)
index 0000000..b11b6c9
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_1.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_2.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_2.mp3
new file mode 100644 (file)
index 0000000..33b9586
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_2.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_3.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_3.mp3
new file mode 100644 (file)
index 0000000..238cce3
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_3.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_4.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_4.mp3
new file mode 100644 (file)
index 0000000..fc24035
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_4.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_5.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_5.mp3
new file mode 100644 (file)
index 0000000..f7121cd
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_5.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_6.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_6.mp3
new file mode 100644 (file)
index 0000000..a25d723
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_6.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_7.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_7.mp3
new file mode 100644 (file)
index 0000000..6db018c
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_7.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_8.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_8.mp3
new file mode 100644 (file)
index 0000000..010b21e
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_8.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_9.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_9.mp3
new file mode 100644 (file)
index 0000000..daee9a2
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_9.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_A.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_A.mp3
new file mode 100644 (file)
index 0000000..9e3b496
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_A.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_B.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_B.mp3
new file mode 100644 (file)
index 0000000..afb6dcd
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_B.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_C.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_C.mp3
new file mode 100644 (file)
index 0000000..8f8e258
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_C.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_D.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_D.mp3
new file mode 100644 (file)
index 0000000..d6fbbc4
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_D.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_E.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_E.mp3
new file mode 100644 (file)
index 0000000..95939c5
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_E.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_F.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_F.mp3
new file mode 100644 (file)
index 0000000..2325b44
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_F.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_G.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_G.mp3
new file mode 100644 (file)
index 0000000..94ff84f
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_G.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_H.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_H.mp3
new file mode 100644 (file)
index 0000000..72b95a8
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_H.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_I.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_I.mp3
new file mode 100644 (file)
index 0000000..e33c235
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_I.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_J.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_J.mp3
new file mode 100644 (file)
index 0000000..f40ce36
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_J.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_K.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_K.mp3
new file mode 100644 (file)
index 0000000..7b6e8f5
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_K.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_L.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_L.mp3
new file mode 100644 (file)
index 0000000..9ba631b
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_L.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_M.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_M.mp3
new file mode 100644 (file)
index 0000000..63a1d50
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_M.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_N.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_N.mp3
new file mode 100644 (file)
index 0000000..5dd67d3
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_N.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_O.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_O.mp3
new file mode 100644 (file)
index 0000000..773b044
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_O.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_P.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_P.mp3
new file mode 100644 (file)
index 0000000..116774a
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_P.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_Q.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_Q.mp3
new file mode 100644 (file)
index 0000000..c4567c1
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_Q.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_R.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_R.mp3
new file mode 100644 (file)
index 0000000..3b4b93e
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_R.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_S.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_S.mp3
new file mode 100644 (file)
index 0000000..d5ab4bd
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_S.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_T.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_T.mp3
new file mode 100644 (file)
index 0000000..02a7d01
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_T.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_U.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_U.mp3
new file mode 100644 (file)
index 0000000..d08163b
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_U.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_V.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_V.mp3
new file mode 100644 (file)
index 0000000..72b78db
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_V.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_W.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_W.mp3
new file mode 100644 (file)
index 0000000..13fbd53
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_W.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_X.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_X.mp3
new file mode 100644 (file)
index 0000000..e58fd7b
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_X.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_Y.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_Y.mp3
new file mode 100644 (file)
index 0000000..4d6ba45
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_Y.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/R_READ_TIME_Z.mp3 b/2.sdk/project/7PIN/audio/R_READ_TIME_Z.mp3
new file mode 100644 (file)
index 0000000..f5a10c2
Binary files /dev/null and b/2.sdk/project/7PIN/audio/R_READ_TIME_Z.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/jianquancuowu.mp3 b/2.sdk/project/7PIN/audio/jianquancuowu.mp3
new file mode 100644 (file)
index 0000000..2b37679
Binary files /dev/null and b/2.sdk/project/7PIN/audio/jianquancuowu.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/key_prompt.mp3 b/2.sdk/project/7PIN/audio/key_prompt.mp3
new file mode 100644 (file)
index 0000000..2baf48b
Binary files /dev/null and b/2.sdk/project/7PIN/audio/key_prompt.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/liuliangtishi.mp3 b/2.sdk/project/7PIN/audio/liuliangtishi.mp3
new file mode 100644 (file)
index 0000000..0e28be6
Binary files /dev/null and b/2.sdk/project/7PIN/audio/liuliangtishi.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/shouhou.mp3 b/2.sdk/project/7PIN/audio/shouhou.mp3
new file mode 100644 (file)
index 0000000..9b72f65
Binary files /dev/null and b/2.sdk/project/7PIN/audio/shouhou.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/xinhaoruo1.mp3 b/2.sdk/project/7PIN/audio/xinhaoruo1.mp3
new file mode 100644 (file)
index 0000000..2c49711
Binary files /dev/null and b/2.sdk/project/7PIN/audio/xinhaoruo1.mp3 differ
diff --git a/2.sdk/project/7PIN/audio/zhengzaiguanji.mp3 b/2.sdk/project/7PIN/audio/zhengzaiguanji.mp3
new file mode 100644 (file)
index 0000000..0f59a86
Binary files /dev/null and b/2.sdk/project/7PIN/audio/zhengzaiguanji.mp3 differ
diff --git a/2.sdk/project/7PIN/list.json b/2.sdk/project/7PIN/list.json
new file mode 100644 (file)
index 0000000..f6215c0
--- /dev/null
@@ -0,0 +1 @@
+['IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C', 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/merge_bin.py b/2.sdk/project/7PIN/merge_bin.py
new file mode 100644 (file)
index 0000000..c12eb7a
--- /dev/null
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+@FileName : merge_bin.py
+@Author   : zhen.guo
+@Email    : zhen.guo@quectel.com
+@Date     : 2022-08-05 09:58:14
+"""
+import os
+output_list = []
+# 文件名--》下标
+def text_to_hash(filename: str) -> str:
+    output_list.append(filename.split("\\")[-1][:-4])
+    print(str(len(output_list)-1) + filename[-4:])
+    return str(len(output_list)-1) + filename[-4:]
+
+
+def merge_bin(res='res.bin', *args):
+    # 入参文件夹和文件处理
+    file_list = []
+    for i in args:
+        if os.path.isdir(i):
+            for j in os.walk(i):
+                for x in j[2]:
+                    file_list.append(j[0] + x)
+        else:
+            file_list.append(i)
+    f = open(res, 'wb')
+    fileheader = bytes("montage", 'utf-8') + bytes(1) + bytes.fromhex('%08X' % len(file_list))[::-1]
+    filebyte, bytesize, filebody = b'', 0, b''
+    for i in file_list:
+        print(i)
+        filename_byte = bytes(text_to_hash(i), 'utf-8')
+        filebyte += (filename_byte + bytes(128-len(filename_byte)) + bytes.fromhex('%08X' % (len(file_list)*136 + 12 + bytesize))[::-1] + bytes.fromhex('%08X' % os.path.getsize(i))[::-1])
+        bytesize += os.path.getsize(i)
+        filebody += open(i, 'rb').read()
+    f.write(fileheader + filebyte + filebody)
+    f.close()
+    print(output_list)
+    with open('list.json', 'w') as f:
+        f.write(str(output_list))
+    print("----MERGE SUCCESS----")
+    return output_list
+
+output_list = merge_bin(".\\usr\\static\\audio.bin", ".\\audio\\")
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/new.bat b/2.sdk/project/7PIN/new.bat
new file mode 100644 (file)
index 0000000..bd2d9ea
--- /dev/null
@@ -0,0 +1,39 @@
+@echo off
+
+md images
+del images /q
+@GOTO :STEP1
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c ext -b 4096 -r 4096 -p 4096 -s 1048576 -i .\images\ext_fs.bin
+if errorlevel 1 (
+    echo "ext_fs.binÉú³Éʧ°Ü !!!!!!!!!!!!!!! "
+    goto exit
+)
+if errorlevel 0 (
+    echo "ext_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
+)
+:STEP1
+
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 1376256 -i .\images\customer_fs.bin
+if errorlevel 1 (
+    echo "customer_fs.binÉú³Éʧ°Ü Çë¼ì²éusrĿ¼ÊÇ·ñ´óÓÚ316K!!!!!!!!!!!!!!!"
+    goto exit
+)
+if errorlevel 0 (
+    echo "customer_fs.binÉú³É³É¹¦ !!!!!!!!!!!!!!! "
+)
+
+%copy font\ext_font.bin images\ext_font.bin%
+
+..\..\Helios_SDK\tools\common\win32\7z\7z a sdk\system\platform\ASR_1606\boards\EG810MCN_GA_VOLTE\images\firmware_base_release_pack.zip .\images\
+if errorlevel 0 (
+    echo imagesѹËõ³É¹¦!!!!!!!!!!!!!!
+)
+if errorlevel 1 (
+    echo imagesѹËõʧ°Ü!!!!!!!!!!!!!!!!!!
+    goto exit
+)
+xcopy  sdk\ ..\..\Helios_SDK\ /e/h/y
+cd ..\..\Helios_SDK
+helios make services/microPython @EG810MCN_GA_VOLTE EG810MCN_GA_VOLTE
+cd ..
+:exit
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/EventMesh.py
new file mode 100644 (file)
index 0000000..912b3d0
--- /dev/null
@@ -0,0 +1,133 @@
+import _thread
+import usys
+import versions
+import ql_fs
+
+model = "D15"
+project = "D15"
+platform = "D15"#格物平台 不用的话选择空
+
+# project = "D10"
+# model = "D10"
+# platform = "D10"#格物平台 不用的话选择空
+#platform = "gewu"#格物平台 不用的话选择空 如果需要联通入库的需求就要打开 不需要就得写空通过变量区分
+
+# platform = "D15"#格物平台 不用的话选择空
+
+# model = "G10W_DT_YBX_"
+
+softversion = "{}_{}".format(project,versions.Version)
+builTime = "{}".format(versions.Build_Time)
+
+class EventStore(object):
+    def __init__(self):
+        self.map = dict()
+        self.log = None
+        self.__filters = []
+
+    def add_filter(self, flt):
+        self.__filters.append(flt)
+
+    def append(self, event, cb):
+        self.map[event] = cb
+
+    def fire_async(self, event, msg,thread_size):
+        if event in self.map:
+            #print("fire_async:thread_size:{}".format(thread_size))
+            if thread_size != None:
+                _thread.stack_size(thread_size)
+                #print("fire_async:thread_size:{}".format(thread_size))
+            _thread.start_new_thread(self.map[event], (event, msg))
+            if thread_size != None:
+                _thread.stack_size(8*1024)
+            if self.log:
+                self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
+
+    def fire_sync(self, event, msg):
+        res = None
+        try:
+            if event in self.map:
+                res = self.map[event](event, msg)
+        except Exception as e:
+            usys.print_exception(e)
+            if self.log:
+                self.log.info("ERROR executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        if event not in self.__filters:
+            if self.log:
+                self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
+        return res
+
+
+event_store = EventStore()
+
+
+def subscribe(event, cb):
+    """
+    subscribe event and cb
+    """
+    return event_store.append(event, cb)
+
+
+def publish(event, msg=None):
+    """
+    publish event and msg
+    """
+    return publish_sync(event, msg)
+
+
+def publish_async(event, msg=None,thread_size = None):
+    """
+    异步发送
+    """
+    return event_store.fire_async(event, msg,thread_size)
+
+
+def publish_sync(event, msg=None):
+    """
+    同步发送
+    """
+    return event_store.fire_sync(event, msg)
+
+
+def set_log(log_adapter):
+    event_store.log = log_adapter
+
+
+def add_filter(flt):
+    event_store.add_filter(flt)
+
+def callback_wrapper(callback):#按键回调
+    def wrapped_callback(*args, **kwargs):
+        try:
+            return callback(*args, **kwargs)
+        except Exception as e:
+            # 在这里处理异常,例如打印错误信息,保存到日志文件,等等。
+            print('Exception in callback:', e)
+            # 如果需要,你可以在这里重新抛出异常
+            # raise
+    return wrapped_callback
+
+
+import utime
+import uos
+debug_Log = 1
+def debug_log(*data):
+    if debug_Log != 0 :
+        print(data)
+Txt_Log = 0
+def txt_log(data):
+    if Txt_Log != 0 :
+        print(data)
+        try:
+            check_file = ql_fs.path_exists("usr/log.txt")
+
+            if check_file == True:
+                f_stat = uos.stat("usr/log.txt")
+                if f_stat[6] > 50*1024:
+                    uos.remove("usr/log.txt") 
+        except Exception as e:
+            usys.print_exception(e)
+        with open("/usr/log.txt","a",encoding="utf-8") as fd:
+            d_time = utime.localtime()
+            data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5])
+            fd.write(data_tmp+data+"\n")
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/Makefile
new file mode 100644 (file)
index 0000000..2596118
--- /dev/null
@@ -0,0 +1,1175 @@
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#env
+TOP := ../../..
+ROOT := $(TOP)/../..
+
+KCONFIG_CONFIG_DIR := ../../../../..
+include $(KCONFIG_CONFIG_DIR)/config/$(KCONFIG_CONFIG)
+
+ifeq ("$(origin V)", "command line")
+BUILD_VERBOSE=$(V)
+endif
+ifndef BUILD_VERBOSE
+BUILD_VERBOSE = 0
+endif
+# ifeq ($(BUILD_VERBOSE),0)
+# Q = @
+# else
+# Q =
+# endif
+
+BUILD ?= build
+FROZEN_MPY_DIR ?= .
+
+RM = rm
+ECHO = echo
+CP = cp
+MKDIR = mkdir
+SED = sed
+CAT = cat
+TOUCH = touch
+
+MAKE_MANIFEST = $(PYTHON) $(TOP)/tools/makemanifest.py
+MAKE_FROZEN = $(PYTHON) $(TOP)/tools/make-frozen.py
+#because E-safeNet, mpy-cross could not read the py file, rename as notepad++
+ifeq ($(strip $(HOST)),linux)
+MPY_CROSS = $(TOP)/ports/quectel/tools/mpy-cross
+else
+MPY_CROSS = $(TOP)/ports/quectel/tools/notepad++.exe
+endif
+MPY_TOOL = $(PYTHON) $(TOP)/tools/mpy-tool.py
+
+QSTR_DEFS = source/qstrdefsport.h
+#py
+PY_SRC ?= $(TOP)/py
+HEADER_BUILD = $(TOP)/genhdr
+PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
+ifneq ($(QSTR_AUTOGEN_DISABLE),1)
+QSTR_DEFS_COLLECTED = $(HEADER_BUILD)/qstrdefs.collected.h
+endif
+QSTR_GLOBAL_DEPENDENCIES += $(PY_SRC)/mpconfig.h source/mpconfigport.h
+CSUPEROPT = -O3
+ifeq ($(strip $(PLAT)),ECR6600)
+MPY_CROSS_FLAGS += -march=xtensa
+else
+MPY_CROSS_FLAGS += -march=armv7m
+endif
+# Enable building 32-bit code on 64-bit host.
+ifeq ($(MICROPY_FORCE_32BIT),1)
+CC += -m32
+CXX += -m32
+LD += -m32
+endif
+
+# External modules written in C.
+ifneq ($(USER_C_MODULES),)
+# pre-define USERMOD variables as expanded so that variables are immediate
+# expanded as they're added to them
+SRC_USERMOD :=
+C_FLAGS_USERMOD :=
+LD_FLAGS_USERMOD :=
+$(foreach module, $(wildcard $(USER_C_MODULES)/*/micropython.mk), \
+    $(eval USERMOD_DIR = $(patsubst %/,%,$(dir $(module))))\
+    $(info Including User C Module from $(USERMOD_DIR))\
+       $(eval include $(module))\
+)
+
+SRC_MOD += $(patsubst $(USER_C_MODULES)/%.c,%.c,$(SRC_USERMOD))
+C_FLAGS_MOD += $(C_FLAGS_USERMOD)
+LD_FLAGS_MOD += $(LD_FLAGS_USERMOD)
+endif
+
+# py object files
+PY_CORE_O_BASENAME = $(addprefix py/,\
+       mpstate.o \
+       nlr.o \
+       nlrx86.o \
+       nlrx64.o \
+       nlrthumb.o \
+       nlrpowerpc.o \
+       nlrxtensa.o \
+       nlrsetjmp.o \
+       malloc.o \
+       gc.o \
+       pystack.o \
+       qstr.o \
+       vstr.o \
+       mpprint.o \
+       unicode.o \
+       mpz.o \
+       reader.o \
+       lexer.o \
+       parse.o \
+       scope.o \
+       compile.o \
+       emitcommon.o \
+       emitbc.o \
+       asmbase.o \
+       asmx64.o \
+       emitnx64.o \
+       asmx86.o \
+       emitnx86.o \
+       asmthumb.o \
+       emitnthumb.o \
+       emitinlinethumb.o \
+       asmarm.o \
+       emitnarm.o \
+       asmxtensa.o \
+       emitnxtensa.o \
+       emitinlinextensa.o \
+       emitnxtensawin.o \
+       formatfloat.o \
+       parsenumbase.o \
+       parsenum.o \
+       emitglue.o \
+       persistentcode.o \
+       runtime.o \
+       runtime_utils.o \
+       scheduler.o \
+       nativeglue.o \
+       pairheap.o \
+       ringbuf.o \
+       stackctrl.o \
+       argcheck.o \
+       warning.o \
+       profile.o \
+       map.o \
+       obj.o \
+       objarray.o \
+       objattrtuple.o \
+       objbool.o \
+       objboundmeth.o \
+       objcell.o \
+       objclosure.o \
+       objcomplex.o \
+       objdeque.o \
+       objdict.o \
+       objenumerate.o \
+       objexcept.o \
+       objfilter.o \
+       objfloat.o \
+       objfun.o \
+       objgenerator.o \
+       objgetitemiter.o \
+       objint.o \
+       objint_longlong.o \
+       objint_mpz.o \
+       objlist.o \
+       objmap.o \
+       objmodule.o \
+       objobject.o \
+       objpolyiter.o \
+       objproperty.o \
+       objnone.o \
+       objnamedtuple.o \
+       objrange.o \
+       objreversed.o \
+       objset.o \
+       objsingleton.o \
+       objslice.o \
+       objstr.o \
+       objstrunicode.o \
+       objstringio.o \
+       objtuple.o \
+       objtype.o \
+       objzip.o \
+       opmethods.o \
+       sequence.o \
+       stream.o \
+       binary.o \
+       builtinimport.o \
+       builtinevex.o \
+       builtinhelp.o \
+       modarray.o \
+       modbuiltins.o \
+       modcollections.o \
+       modgc.o \
+       modio.o \
+       modmath.o \
+       modcmath.o \
+       modmicropython.o \
+       modstruct.o \
+       modsys.o \
+       moduerrno.o \
+       modthread.o \
+       vm.o \
+       bc.o \
+       showbc.o \
+       repl.o \
+       smallint.o \
+       frozenmod.o \
+       )
+
+PY_EXTMOD_O_BASENAME = \
+       extmod/moductypes.o \
+       extmod/modujson.o \
+       extmod/modure.o \
+       extmod/moduzlib.o \
+       extmod/moduheapq.o \
+       extmod/modutimeq.o \
+       extmod/modubinascii.o \
+       extmod/virtpin.o \
+       extmod/machine_mem.o \
+       extmod/machine_pinbase.o \
+       extmod/machine_signal.o \
+       extmod/machine_pulse.o \
+       extmod/machine_i2c.o \
+       extmod/machine_spi.o \
+       extmod/modbluetooth.o \
+       extmod/modurandom.o \
+       extmod/moduselect.o \
+       extmod/moduasyncio.o \
+       extmod/moduwebsocket.o \
+       extmod/modwebrepl.o \
+       extmod/modframebuf.o \
+       extmod/vfs.o \
+       extmod/vfs_blockdev.o \
+       extmod/vfs_reader.o \
+       extmod/vfs_posix.o \
+       extmod/vfs_posix_file.o \
+       extmod/vfs_fat.o \
+       extmod/vfs_fat_file.o \
+       extmod/vfs_lfs.o \
+       extmod/utime_mphal.o \
+       extmod/uos_dupterm.o \
+       extmod/modussl_mbedtls.o \
+       extmod/moduhashlib.o \
+       extmod/moducryptolib.o \
+       lib/embed/abort_.o \
+       lib/utils/printf.o \
+       lib/utils/sys_stdio_mphal.o
+
+ifeq ($(strip $(PLAT)),Qualcomm)
+PY_EXTMOD_O_BASENAME += \
+       extmod/vfs_efs.o \
+       extmod/vfs_efs_file.o
+endif
+
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05))
+PY_EXTMOD_O_BASENAME += \
+       extmod/vfs_temp.o \
+       extmod/vfs_temp_file.o
+endif
+
+# Sources that may contain qstrings
+SRC_QSTR_IGNORE = py/nlr%
+SRC_QSTR += $(SRC_MOD) $(filter-out $(SRC_QSTR_IGNORE),$(PY_CORE_O_BASENAME:.o=.c)) $(PY_EXTMOD_O_BASENAME:.o=.c)
+SRC_QSTR += \
+                       source/modalipay.c \
+                       source/audio_audio.c \
+                       source/audio_queue.c \
+                       source/audio_record.c \
+                       source/audio_tts.c \
+                       source/audiocodec_rt5616.c \
+                       source/callbackdeal.c \
+                       source/camera_capture.c \
+                       source/camera_preview.c \
+                       source/camera_scandecode.c \
+                       source/devreport.c \
+                       source/machine_extint.c \
+                       source/machine_hw_spi.c \
+                       source/machine_iic.c \
+                       source/machine_iic_simulation.c \
+                       source/machine_keypad.c \
+                       source/machine_lcd.c \
+                       source/machine_nandflash.c \
+                       source/machine_pin.c \
+                       source/machine_rtc.c \
+                       source/machine_timer.c \
+                       source/machine_uart.c \
+                       source/machine_wdt.c \
+                       source/misc_adc.c \
+                       source/misc_power.c \
+                       source/misc_powerkey.c \
+                       source/misc_pwm.c \
+                       source/misc_temperature.c \
+                       source/misc_usb.c \
+                       source/misc_usbnet.c \
+                       source/modatcmd.c \
+                       source/modaudio.c \
+                       source/modaudiocodec.c \
+                       source/modble.c \
+                       source/modbt.c \
+                       source/modcamera.c \
+                       source/modcelllocator.c \
+                       source/modcelllocator_qpy.c \
+                       source/locator.c \
+                       source/modcsd.c \
+                       source/moddatacall.c \
+                       source/moddev.c \
+                       source/modethernet.c \
+                       source/modethernet_dm9051.c \
+                       source/modethernet_w5500.c \
+                       source/modethernet_ch395.c \
+                       source/modexample.c \
+                       source/modfota.c \
+                       source/modgnss.c \
+                       source/modlpm.c \
+                       source/modlvgl.c \
+                       source/modlwm2m.c \
+                       source/modmachine.c \
+                       source/modmisc.c \
+                       source/modnb.c \
+                       source/modnet.c \
+                       source/modostimer.c \
+                       source/modpoc.c \
+                       source/modqrcode.c \
+                       source/modrtmp.c \
+                       source/modsecuredata.c \
+                       source/modsensor.c \
+                       source/modsha1.c \
+                       source/modsim.c \
+                       source/modslipif.c \
+                       source/modsms.c \
+                       source/modsocket.c \
+                       source/modtp.c \
+                       source/moduos.c \
+                       source/modutils.c \
+                       source/modutime.c \
+                       source/modvoicecall.c \
+                       source/modwifilocator.c \
+                       source/modwifiscan.c \
+                       source/nb_aep.c \
+                       source/nb_oc.c \
+                       source/nb_onenet.c \
+                       source/quecpython.c \
+                       source/sensor_sn95500.c \
+                       source/sensor_icckey.c \
+                       source/sensor_gnss.c \
+                       source/tp_gt9xx.c \
+                       source/tp_xpt2046.c \
+                       source/tp_cst816.c \
+                       source/modGsensor.c \
+                       source/modGsensor_SC7A20.c \
+                       source/modHsensor.c \
+                       source/modHsensor_GH3018.c \
+                       source/modVideoCall.c \
+                       source/modVideoCall_juphoon.c \
+                       source/modHsensor_HX3918.c \
+                       source/modrsa.c \
+                       source/utils_crc32.c \
+                       source/http_parser.c \
+                       source/modwebserver.c \
+                       source/modethernet_yt8512h.c \
+                       source/sim_esim.c \
+                       source/modG711.c \
+                       source/modG729.c \
+                       source/modcan_mcp2515.c \
+                       source/modextuart_wk2114.c \
+                       source/modextgpio_aw9523.c \
+                       source/machine_key.c \
+                       source/lpm_wakeup.c \
+                       source/sensor_handmic_key.c     \
+                       source/modnetwork.c     \
+                       source/modwlan_ASR5803.c \
+                       source/machine_soft_spi.c \
+                       source/code128_p.c \
+                       source/modwlan.c\
+                       source/modwlan.c \
+                       source/modmask.c \
+                       source/machine_one_wire.c
+
+
+ifeq ($(strip $(PLAT)),RDA)
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot-BC25old.c
+else
+SRC_QSTR += $(ROOT)/components/quecsdk/cloud/python/modquecIot.c
+endif
+
+ifeq ($(CONFIG_USQLITE), y)
+SRC_QSTR += lib/usqlite/usqlite_connection.c \
+                       lib/usqlite/usqlite_cursor.c \
+                       lib/usqlite/usqlite_row.c \
+                       lib/usqlite/usqlite_file.c \
+                       lib/usqlite/usqlite_mem.c \
+                       lib/usqlite/usqlite_vfs.c \
+                       lib/usqlite/usqlite_utils.c \
+                       lib/usqlite/usqlite.c \
+                       lib/usqlite/usqlite_module.c
+
+INC += -Ilib/usqlite
+endif
+
+$(BUILD)/%.pp: %.c
+       @$(ECHO) "PreProcess $<"
+       $(Q)$(CPP) $(C_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
+
+# Anything that depends on FORCE will be considered out-of-date
+FORCE:
+.PHONY: FORCE
+
+$(HEADER_BUILD):
+       $(MKDIR) -p $@
+
+#$(HEADER_BUILD)/mpversion.h: FORCE | $(HEADER_BUILD)
+#      $(Q)$(PYTHON) $(PY_SRC)/makeversionhdr.py $@
+# mpconfigport.mk is optional, but changes to it may drastically change
+# overall config, so they need to be caught
+MPCONFIGPORT_MK = $(wildcard mpconfigport.mk)
+
+# qstr data
+# Adding an order only dependency on $(HEADER_BUILD) causes $(HEADER_BUILD) to get
+# created before we run the script to generate the .h
+# Note: we need to protect the qstr names from the preprocessor, so we wrap
+# the lines in "" and then unwrap after the preprocessor is finished.
+# See more information about this process in docs/develop/qstr.rst.
+$(HEADER_BUILD)/qstrdefs.generated.h: $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) $(PY_SRC)/makeqstrdata.py source/mpconfigport.h $(MPCONFIGPORT_MK) $(PY_SRC)/mpconfig.h | $(HEADER_BUILD)
+       @$(ECHO) "GEN $@"
+       $(Q)$(CAT) $(PY_QSTR_DEFS) $(QSTR_DEFS) $(QSTR_DEFS_COLLECTED) | $(SED) 's/^Q(.*)/"&"/' | $(CPP) $(C_FLAGS) - | $(SED) 's/^\"\(Q(.*)\)\"/\1/' > $(HEADER_BUILD)/qstrdefs.preprocessed.h
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@
+
+# Compressed error strings.
+$(HEADER_BUILD)/compressed.split: $(HEADER_BUILD)/qstr.i.last
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split compress $< $(HEADER_BUILD)/compress _
+       $(Q)$(TOUCH) $@
+       
+$(HEADER_BUILD)/compressed.collected: $(HEADER_BUILD)/compressed.split
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py $(CAT) compress _ $(HEADER_BUILD)/compress $@
+       
+$(HEADER_BUILD)/compressed.data.h: $(HEADER_BUILD)/compressed.collected
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makecompresseddata.py $< > $@
+       
+# build a list of registered modules for py/objmodule.c.
+$(HEADER_BUILD)/moduledefs.h: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(HEADER_BUILD)
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makemoduledefs.py --vpath="., $(TOP), $(USER_C_MODULES)" $(SRC_QSTR) > $@
+
+SRC_QSTR += $(HEADER_BUILD)/moduledefs.h
+
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/config
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
+
+ifeq ($(strip $(PLAT)),Qualcomm)
+INC += -I$(COMPILER_PATH)/armv7m-none-eabi/libc/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/inc/azure_c_shared_utility
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/c-utility/pal/generic
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/iothub_client/inc/internal
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/serializer/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/azure_api/umqtt/inc/azure_umqtt_c
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/qapi
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include/threadx_api
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/at
+INC += -I$(ROOT)/system/esim
+endif
+
+INC += -I.
+INC += -I$(HEADER_BUILD)
+INC += -I$(TOP)
+INC += -I$(TOP)/py
+INC += -I$(TOP)/extmod
+INC += -I$(TOP)/lib/utils
+INC += -I$(TOP)/lib/mp-readline
+INC += -I$(TOP)/lib/littlefs
+INC += -I$(TOP)/lib/netutils
+INC += -I$(TOP)/lib/timeutils
+INC += -I$(TOP)/ports/quectel/core
+INC += -I$(TOP)/ports/quectel/core/source
+INC += -I$(TOP)/ports/quectel/core/py
+INC += -I$(ROOT)/peripheral
+INC += -I$(ROOT)/system/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/platform/$(strip $(PLAT))/boards/$(strip $(BOARD))/include
+INC += -I$(ROOT)/system/debug
+INC += -I$(ROOT)/system/dev
+INC += -I$(ROOT)/system/fs
+INC += -I$(ROOT)/system/hal
+INC += -I$(ROOT)/system/gnss
+INC += -I$(ROOT)/system/network
+INC += -I$(ROOT)/system/at
+INC += -I$(ROOT)/system/aliiot
+
+ifeq ($(strip $(PLAT)),ASR_1803s)
+INC += -I$(ROOT)/system/csd
+INC += -I$(ROOT)/system/esim
+endif
+ifeq ($(strip $(PLAT)),ASR_1606)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
+INC += -I$(ROOT)/system/at
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc_8910_R05)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
+endif
+
+ifeq ($(strip $(PLAT)),EIGEN)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/posix/sys
+endif
+
+ifeq ($(strip $(PLAT)),Unisoc_8850)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif/ppp/polarssl
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/posix/sys
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/compat/stdc
+endif
+
+ifeq ($(strip $(PLAT)),RDA)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include/arch
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/apps
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/priv
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/lwip/prot
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/netif
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/arpa
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/net
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/netinet
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/src/include/posix/sys
+endif
+
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),ASR ASR_1803s))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+INC += -I$(ROOT)/system/at
+endif
+
+ifeq ($(strip $(PLAT)),ECR6600)
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))
+INC += -I$(ROOT)/system/lwip/$(strip $(PLAT))/include
+endif
+
+ifeq (y, $(CONFIG_MBEDTLS))
+INC += -I$(ROOT)/system/mbedtls
+INC += -I$(ROOT)/system/mbedtls/include
+INC += -I$(ROOT)/system/mbedtls/include/mbedtls
+INC += -I$(ROOT)/system/mbedtls/library
+INC += -I$(ROOT)/system/mbedtls/port/helios/inc
+endif
+INC += -I$(ROOT)/system/network
+INC += -I$(ROOT)/system/os
+INC += -I$(ROOT)/system/startup
+INC += -I$(ROOT)/system/fota
+INC += -I$(ROOT)/system/bt
+INC += -I$(ROOT)/system/at
+ifeq (y, $(CONFIG_LVGL))
+INC += -I$(TOP)/lib/lvgl
+INC += -I$(TOP)/lib/lvgl/src
+INC += -I$(TOP)/lib/lvgl/src/core
+INC += -I$(TOP)/lib/lvgl/src/draw
+INC += -I$(TOP)/lib/lvgl/src/extra
+INC += -I$(TOP)/lib/lvgl/src/font
+INC += -I$(TOP)/lib/lvgl/src/gpu
+INC += -I$(TOP)/lib/lvgl/src/hal
+INC += -I$(TOP)/lib/lvgl/src/misc
+INC += -I$(TOP)/lib/lvgl/src/widgts
+endif
+INC += -I$(ROOT)/driver
+INC += -I$(ROOT)/driver/lcd
+ifeq (y, $(CONFIG_QRCODE))
+INC += -I$(ROOT)/components/qrcode
+endif
+ifeq (y, $(CONFIG_QUECTHING))
+INC += -I$(ROOT)/components/quecsdk/cloud
+INC += -I$(ROOT)/components/quecsdk/driverLayer
+INC += -I$(ROOT)/components/quecsdk/thirdLib/mqtt
+INC += -I$(ROOT)/components/quecsdk/thirdLib/cJSON
+INC += -I$(ROOT)/components/quecsdk/kernel
+endif
+ifeq ($(CONFIG_SPINAND), y)
+INC += -I$(ROOT)/components/fs/include
+INC += -I$(ROOT)/components/fs/yaffs/src/direct
+INC += -I$(ROOT)/components/fs/yaffs/src/port
+INC += -I$(ROOT)/components/fs/yaffs/src
+INC += -I$(ROOT)/components/fs/yaffs
+endif
+ifeq ($(CONFIG_RTMP), y)
+INC += -I$(ROOT)/components/rtmpdump/librtmp/inc
+INC += -I$(ROOT)/components/rtmpdump/libz/inc
+endif
+INC += -I$(ROOT)/utilities
+ifeq ($(CONFIG_JPEG), y)
+INC += -I$(ROOT)/components/jpeg/jpeg-9c
+INC += -I$(ROOT)/components/jpeg
+endif
+ifeq ($(CONFIG_HX3918), y)
+INC += -I$(ROOT)/components/HX3918
+endif
+ifeq ($(CONFIG_GH301x), y)
+INC += -I$(ROOT)/components/GH301x
+endif
+ifeq ($(CONFIG_SC7A20), y)
+INC += -I$(ROOT)/components/SC7A20
+endif
+ifeq ($(CONFIG_juphoon), y)
+INC += -I$(ROOT)/components/juphoon
+endif
+ifeq ($(CONFIG_POC_BND), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/bnd/inc
+endif
+ifeq ($(CONFIG_POC_BND_XIN), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/bnd_xin/inc
+endif
+ifeq ($(CONFIG_POC_SL), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/sl/inc
+endif
+ifeq ($(CONFIG_POC_QS), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/qs/inc
+endif
+#Stephen.Gao add 2022/11/23
+ifeq ($(CONFIG_POC_ZZD), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/zzd/inc
+endif
+#Stephen.Gao add 2023/01/06
+ifeq ($(CONFIG_POC_YDWL), y)
+INC += -I$(ROOT)/components/poc
+INC += -I$(ROOT)/components/poc/ydwl/inc
+endif
+
+ifeq ($(CONFIG_POC_SLPOC), y)
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/slpoc/src
+INC += -I$(ROOT)/components/poc/slpoc/inc
+SRC_QSTR += $(ROOT)/components/poc/slpoc/src/modpoc_slpoc.c
+endif
+
+ifeq ($(CONFIG_POC_RDA_BND), y)
+INC += -I$(ROOT)/components/poc  -I$(ROOT)/components/poc/rda_bnd/src
+INC += -I$(ROOT)/components/poc/rda_bnd/inc
+SRC_QSTR += $(ROOT)/components/poc/rda_bnd/src/modpocrda.c
+endif
+
+
+ifeq (y,$(CONFIG_DECODE_ZBAR))
+INC += -I$(ROOT)/components/decode/ZBar/zbar
+INC += -I$(ROOT)/components/decode/ZBar/include
+INC += -I$(ROOT)/components/decode/ZBar/zbar/decoder
+INC += -I$(ROOT)/components/decode/ZBar/zbar/qrcode
+endif
+ifeq (y,$(CONFIG_DECODE_QUECTEL))
+INC += -I$(ROOT)/components/decode/quectel/inc
+endif
+
+ifeq (y,$(CONFIG_DECODE_QINGYA))
+ifneq ($(strip $(PLAT)),ASR)
+ifneq ($(strip $(PLAT)),ASR_1606)
+INC += -I$(ROOT)/components/decode/qingya
+endif
+endif
+endif
+
+ifeq ($(CONFIG_SPI_SDCARD), y)
+INC += -I$(ROOT)/components/fs/fatfs/include
+endif
+
+ifeq ($(CONFIG_AUDIO_G711_COMPRESS), y)
+INC += -I$(ROOT)/components/audio/G711
+endif
+ifeq ($(strip $(PLAT)),EIGEN)
+INC += -I$(ROOT)/components/audio
+endif
+
+ifeq ($(CONFIG_GMSSL), y)
+INC += -I$(ROOT)/components/GMSSL/include
+INC += -I$(ROOT)/components/GMSSL/include/gmssl
+endif
+
+ifeq ($(CONFIG_AUDIO_G729_COMPRESS), y)
+INC += -I$(ROOT)/components/audio/G729
+INC += -I$(ROOT)/components/audio/G729/src
+INC += -I$(ROOT)/components/audio/G729/include
+endif
+
+# compiler settings
+CWARN = -Wall -Werror
+CWARN += -Wpointer-arith -Wuninitialized
+C_FLAGS = $(INC) $(CWARN) -std=gnu99 $(C_FLAGS_MOD) $(COPT) $(C_FLAGS_EXTRA)
+C_FLAGS += -fdata-sections -ffunction-sections -fno-asynchronous-unwind-tables --include=../../../../../../config/autoconf.h
+
+LD_FLAGS_ARCH = -Wl,-Map=$@.map,--cref -Wl,--gc-sections
+LD_FLAGS = $(LD_FLAGS_MOD) $(LD_FLAGS_ARCH) -lm $(LD_FLAGS_EXTRA)
+
+D_FLAGS += $(foreach dflag, $(DFLAGS), -D$(dflag))
+D_FLAGS += -DMP_CONFIGFILE="\"ports/quectel/core/source/mpconfigport.h\"" \
+                 -DMICROPY_MPTHREADPORT_H="\"ports/quectel/core/source/mpthreadport.h\"" \
+                 -DMICROPY_MPHALPORT_H="\"ports/quectel/core/source/mphalport.h\""
+
+vpath %.S . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.o: %.S
+       @$(ECHO) "CC $<"
+       $(Q)$(CC) $(C_FLAGS) $(D_FLAGS) -c -o $@ $<
+
+vpath %.s . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.o: %.s
+       @$(ECHO) "AS $<"
+       $(Q)$(AS) -o $@ $<
+QSTR_GEN_EXTRA_C_FLAGS += -DNO_QSTR
+vpath %.c . $(TOP) $(USER_C_MODULES)
+$(BUILD)/%.pp: %.c
+       @$(ECHO) "PreProcess $<"
+       $(Q)$(CPP) $(C_FLAGS) $(D_FLAGS) -Wp,-C,-dD,-dI -o $@ $<
+
+#$(OBJ): | $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/mpversion.h
+
+
+$(HEADER_BUILD)/qstr.i.last: $(SRC_QSTR) $(QSTR_GLOBAL_DEPENDENCIES) | $(QSTR_GLOBAL_REQUIREMENTS)
+       @$(ECHO) "GEN $@"
+       @rm -f $@ $@.dep
+       @for src in $(if $(filter $?,$(QSTR_GLOBAL_DEPENDENCIES)),$^,$(if $?,$?,$^)); \
+       do \
+               echo $$src >> $@.dep; \
+       done
+       @while read -r src; \
+               do \
+                       echo processing on $$src ...; \
+                       $(CPP) $(QSTR_GEN_EXTRA_C_FLAGS) $(C_FLAGS) $(D_FLAGS) $$src >> $@; \
+       done < $@.dep
+
+$(HEADER_BUILD)/qstr.split: $(HEADER_BUILD)/qstr.i.last
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py split qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
+       $(Q)$(TOUCH) $@
+
+$(QSTR_DEFS_COLLECTED): $(HEADER_BUILD)/qstr.split
+       @$(ECHO) "GEN $@"
+       $(Q)$(PYTHON) $(PY_SRC)/makeqstrdefs.py cat qstr $(HEADER_BUILD)/qstr.i.last $(HEADER_BUILD)/qstr $(QSTR_DEFS_COLLECTED)
+
+
+$(BUILD)/%.mpy: $(FROZEN_MPY_DIR)/%.py
+       @$(ECHO) "MPY $<"
+       $(Q)$(MKDIR) -p $(dir $@)
+       $(Q)$(MPY_CROSS) -o $@ -s $(<:$(FROZEN_MPY_DIR)/%=%) $(MPY_CROSS_FLAGS) $<
+
+ifeq ($(strip $(PLAT)),RDA)
+frozen_mpy_list =      $(BUILD)/_boot_RDA.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),BC25B8PA_LBS))
+       frozen_mpy_list +=      $(BUILD)/cellLocator.mpy 
+endif
+
+else ifeq ($(strip $(PLAT)),ASR_1803s)
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else ifeq ($(strip $(PLAT)),Qualcomm)
+frozen_mpy_list =      $(BUILD)/_boot_Qualcomm.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else ifeq ($(strip $(PLAT)),ASR_1606)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC EC800MCN_CC EC600MCN_CC_EXT EC600MCN_LF_SLPOC))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ymodem.mpy
+
+else ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600MCN_CC_EXT_TTS))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/ymodem.mpy
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       $(BUILD)/common.mpy \
+                                       $(BUILD)/constants.mpy \
+                                       $(BUILD)/EventMesh.mpy \
+                                       $(BUILD)/mgr.mpy \
+                                       $(BUILD)/protocol.mpy \
+                                       $(BUILD)/ui.mpy \
+                                       $(BUILD)/main_init.mpy \
+                                       $(BUILD)/versions.mpy \
+                                       $(BUILD)/motor.mpy \
+                                       $(BUILD)/ai_VC.mpy \
+
+endif
+
+else ifeq ($(strip $(PLAT)),Unisoc_8850)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600GCN_LD EC600GCN_LD_YM EC800GCN_LD EC800GCN_LD_HRXM))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+endif
+
+else ifeq ($(strip $(PLAT)),EIGEN)
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC800ECN_LC_WDF))
+frozen_mpy_list =      $(BUILD)/_boot_WDF.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/ymodem.mpy \
+
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/cellLocator.mpy \
+                                       $(BUILD)/ymodem.mpy \
+                                       
+endif
+
+else ifeq ($(strip $(PLAT)),ECR6600)
+frozen_mpy_list =      $(BUILD)/_boot_WIFI.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+
+else
+ifeq ($(strip $(BOARD)),$(filter $(strip $(BOARD)),EC600UEU_AB_POC))
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ymodem.mpy 
+else
+frozen_mpy_list =      $(BUILD)/_boot.mpy \
+                                       $(BUILD)/umqtt.mpy \
+                                       $(BUILD)/ntptime.mpy \
+                                       $(BUILD)/request.mpy \
+                                       $(BUILD)/log.mpy \
+                                       $(BUILD)/aLiYun.mpy \
+                                       $(BUILD)/hmac.mpy \
+                                       $(BUILD)/hashlib.mpy \
+                                       $(BUILD)/base64.mpy \
+                                       $(BUILD)/TenCentYun.mpy \
+                                       $(BUILD)/file_sha256.mpy \
+                                       $(BUILD)/checksum.mpy \
+                                       $(BUILD)/checkNet.mpy \
+                                       $(BUILD)/dataCall.mpy \
+                                       $(BUILD)/ql_fs.mpy \
+                                       $(BUILD)/app_fota_mount.mpy \
+                                       $(BUILD)/app_fota_download.mpy\
+                                       $(BUILD)/app_fota_updater.mpy \
+                                       $(BUILD)/app_fota.mpy \
+                                       $(BUILD)/backup_restore.mpy \
+                                       $(BUILD)/file_crc32.mpy \
+                                       $(BUILD)/system.mpy \
+                                       $(BUILD)/gnss.mpy \
+                                       $(BUILD)/unzip.mpy \
+                                       $(BUILD)/queue.mpy \
+                                       $(BUILD)/sys_bus.mpy \
+                                       $(BUILD)/event_message.mpy \
+                                       $(BUILD)/hls.mpy \
+                                       $(BUILD)/wifilocator.mpy \
+                                       $(BUILD)/bak_util.mpy \
+                                       $(BUILD)/ftplib.mpy \
+                                       $(BUILD)/ftplibtls.mpy \
+                                       $(BUILD)/uwebsocket.mpy \
+                                       $(BUILD)/uping.mpy \
+                                       $(BUILD)/ymodem.mpy 
+endif
+endif
+
+$(BUILD)/_frozen_mpy.c: $(frozen_mpy_list) $(HEADER_BUILD)/qstrdefs.generated.h
+       @$(ECHO) "MISC freezing bytecode"
+       $(Q)$(MPY_TOOL) -f -q $(HEADER_BUILD)/qstrdefs.preprocessed.h $(frozen_mpy_list) > $@
+
+$(BUILD):
+       $(Q)echo creating directory: $@
+       -$(Q)$(MKDIR) $@
+
+all:$(BUILD) $(HEADER_BUILD)/qstrdefs.generated.h $(HEADER_BUILD)/moduledefs.h  $(HEADER_BUILD)/compressed.data.h $(BUILD)/_frozen_mpy.c
+
+clean:
+       @echo ----- cleaning microPython private target
+       @rm -rf $(HEADER_BUILD)
+       @rm -rf $(BUILD)
+       @echo ----- done.
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/TTS音频生成.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/TTS音频生成.py
new file mode 100644 (file)
index 0000000..31747de
--- /dev/null
@@ -0,0 +1,124 @@
+
+import utime
+import audio
+from machine import Pin
+import osTimer
+import _thread
+from queue import Queue
+import uwebsocket
+import usys
+import EventMesh
+import constants
+import ujson
+
+
+import gc
+AI_audio_queue = Queue(100)
+aud = audio.Audio(0)
+aud.set_pa(Pin.GPIO29)
+
+def AI_client_tts_recv(cli,fd):
+
+    while True:
+        try:
+            # 死循环接收数据
+            
+            recv_data = cli.recv()
+            if not recv_data:
+                # 服务器关闭连接或客户端关闭连接
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                break
+            try:
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
+                if isinstance(recv_data, str):
+                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
+                    if recv_data.find('\"event\":\"EndSynthesis\"') != -1:
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
+                        cli.close()
+                        fd.close()
+                else:
+                    fd.write(recv_data)
+                    AI_audio_queue.put([recv_data,""])
+                #utime.sleep_ms(1000)
+            except Exception as e:
+                usys.print_exception(e)
+                
+        except Exception as e:
+                usys.print_exception(e)
+                break
+
+def websocket_connect_tts(fd_neme,tts_str):
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
+    fd=open(fd_neme,'w')
+    try:
+       
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:80/tts/long-text-stream', debug=False)
+    except Exception as e: #网络连接异常
+        usys.print_exception(e)
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))
+        
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
+    # 线程接收数据
+
+    #_thread.stack_size(20*1024)
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
+    #_thread.stack_size(8*1024)
+    #AI_client_tts_send()
+#def AI_client_tts_send(data_str):
+    data_str = "该设备的流量可能已用完,请及时充值,您的卡号为:"
+    data_l = {}
+    data_l ={
+        "header": {
+            "event": "LongTextStream",
+            "trace_id": "5864123541"
+        },
+        "payload": {
+            "voice":"xiaoyun",#"xiaoyun",
+            "format":"mp3",
+            "sample_rate":8000,
+            "volume":100,
+            "speech_rate":2,
+            "text":"%s"%(tts_str)
+        }
+    }
+    json_data = ujson.dumps(data_l)
+    AI_client_tts.send(json_data)
+# 音频队列        
+def AI_audio_queue_thread():
+    while True:
+        try:
+            if AI_audio_queue.empty() :
+                # if count_t%200 == 0:
+                #     print("AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #print("AI_audio_queue_thread")
+
+                data = AI_audio_queue.get()
+                
+                #AI_client_tts_data_len=len(data)
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
+                if len(data[0]) > 1:
+                    try:
+
+                        tmp= aud.playStream(3, data[0])#播放音频流
+
+                        print("出:{}!!!".format(len(data[0])))
+                        mem = gc.mem_free()
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                    except Exception as e:
+                        print("AI_audio_queue_thread:ERROR:")
+                        usys.print_exception(e)
+
+                    utime.sleep_ms(2)
+        except Exception as e:
+            print("AI_audio_queue_thread:ERROR:")
+            usys.print_exception(e)
+
+websocket_connect_tts("/usr/jianquancuowu.mp3","AI功能异常,请联系客服查询,设备号为:")
+# for i in range(10):
+#     websocket_connect_tts("/usr/static/R_READ_TIME_{}.mp3".format(i),"{}".format(i))
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC.py
new file mode 100644 (file)
index 0000000..f9eba84
--- /dev/null
@@ -0,0 +1,3336 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+import dataCall
+import constants
+import versions
+
+dev_type = "G10"
+#dev_type = "7PIN"
+
+class AI_led(Abstract):
+    def __init__(self):
+        if dev_type == "G10":
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        else:
+            self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+            self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+            self.led_blue = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪
+        self.led_flicker_flag = 0
+        self.led_flicker_on_off_flag = 0
+        self.led_flicker_timer = osTimer()
+        
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+
+    def flicker_led_red(self,event,msg):
+        self.led_flicker_flag = 1
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_blue(self,event,msg):
+        self.led_flicker_flag = 2
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_green(self,event,msg):
+        self.led_flicker_flag = 3
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_all(self,event,msg):
+        self.led_flicker_flag = 4
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def led_flicker_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def led_flicker_timer_cb_(self):
+        if self.led_flicker_flag == 0:
+            self.led_flicker_timer.stop()
+            return
+        if self.led_flicker_on_off_flag == 0:
+            self.led_red.write(0)
+            self.led_blue.write(0)
+            self.led_green.write(0)
+            self.led_flicker_on_off_flag = 1
+        else:
+            self.led_flicker_on_off_flag = 0
+            if self.led_flicker_flag == 1:
+                self.led_blue.write(0)
+                self.led_green.write(0)
+                self.led_red.write(1)
+            elif self.led_flicker_flag == 2:
+                self.led_red.write(0)
+                self.led_green.write(0)
+                self.led_blue.write(1)
+            elif self.led_flicker_flag == 3:
+                self.led_red.write(0)
+                self.led_blue.write(0)
+                self.led_green.write(1)
+            elif self.led_flicker_flag == 4:
+                self.led_blue.write(1)
+                self.led_green.write(1)
+                self.led_red.write(1)
+
+    def open_led_red(self,event,msg):
+        #print("open_led_red")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_green(self,event,msg):
+        #print("open_led_green")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_red_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_red_green(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(1)
+        self.led_blue.write(0)
+
+    def open_led_all(self,event,msg):
+        #print("open_led_all")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        #print("close_led")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+
+audio_buf = ['IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'R_CHARGE_FULL', 'R_CHARGE_IN', 
+             'R_CHARGE_OUT', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5',
+               'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_A', 'R_READ_TIME_B', 'R_READ_TIME_C',
+                 'R_READ_TIME_D', 'R_READ_TIME_E', 'R_READ_TIME_F', 'R_READ_TIME_G', 'R_READ_TIME_H', 'R_READ_TIME_I', 
+                 'R_READ_TIME_J', 'R_READ_TIME_K', 'R_READ_TIME_L', 'R_READ_TIME_M', 'R_READ_TIME_N', 'R_READ_TIME_O', 'R_READ_TIME_P', 
+                 'R_READ_TIME_Q', 'R_READ_TIME_R', 'R_READ_TIME_S', 'R_READ_TIME_T', 'R_READ_TIME_U', 'R_READ_TIME_V', 'R_READ_TIME_W', 
+                 'R_READ_TIME_X', 'R_READ_TIME_Y', 'R_READ_TIME_Z', 'shouhou', 'xinhaoruo1', 'zhengzaiguanji']
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.is_wdt = 1 #是否开启看门狗
+
+        self.VBATT_tab = {"charge_full":4300,"100" :4250 ,  "90":3994 , "80":3883, "60": 3707, "40":3604, "20":3537,  "10":3486,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        if self.is_wdt == 1:
+            self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+        count = 0
+        while True:
+            count += 1
+            if count > 20 :
+                break
+            data = dataCall.getInfo(1, 0)
+            print("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            print("等待网络 {}...".format(count))
+            utime.sleep_ms(500)
+        self.KeyAI_timer = osTimer()
+        if dev_type == "G10":
+            self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        else:
+            self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+            #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+            self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        
+        self.pwk_key.enable() 
+        print("AI_dev:1")
+        self.btnInfo_queue = Queue(100)
+        self.btnInfo_queue_count = 0
+        _thread.stack_size(16*1024)
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        print("AI_dev:2")
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        print("AI_dev:AI_dev_timer")
+        self.aud = audio.Audio(0)
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+        self.check_rest_timer_count = 0
+        print("AI_dev:end")
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                #EventMesh.publish("flicker_led_red")#充电闪灯
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                EventMesh.publish("open_led_red")#充电红灯常亮
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                EventMesh.publish("close_led")
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            self.btnInfo_queue_count-=1
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        #print("publish_AI_btnInfo 1")
+        self.btnInfo_queue.put(msg)
+        self.btnInfo_queue_count+=1
+        if self.btnInfo_queue_count > 80:
+            self.btnInfo_queue_count =0
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)
+            # _thread.stack_size(10*1024)
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            # _thread.stack_size(8*1024)
+            # self.btnInfo_queue.clear()
+            # self.btnInfo_queue = Queue(100)
+            EventMesh.publish("VC_error") #播放报错
+            utime.sleep_ms(1000)
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+            Power.powerRestart()
+            EventMesh.publish("set_storage_config",["powerRestart",1])
+        #print("publish_AI_btnInfo 2")
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+    # def pwk_key_timer_cb_(self) :
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+                        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+                        EventMesh.publish("open_led_red")
+                        utime.sleep_ms(2000)
+                        Power.powerDown()
+                        #print("AI_key_release")
+                        EventMesh.publish("pwk_key_long_press")
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                if self.pwk_key_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    self.aud.aud_tone_play(10,200)#播放按键音
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+    # def KeyAI_timer_cb_(self):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        self.check_rest_timer_count = 0
+        print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_Long_Press(self):
+        self.check_rest_timer_count = 0
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        self.check_rest_timer_count = 0
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    
+    def wdt_timer_cb(self, *args, **kwargs):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        #print("AI_dev_timer_cb")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+        if VC_satrt_flag == None:
+            VC_satrt_flag = 0
+        Vbatt = Power.getVbatt()
+        if self.usb_status == 1 and VC_satrt_flag == 0:
+            EventMesh.publish("open_led_red")#充电红灯常亮
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满
+            EventMesh.publish("open_led_green")
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+                self.usb_charge_flag = 1
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab["20"]and VC_satrt_flag == 0:#低电报警
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+                self.usb_charge_flag = 1
+        self.check_rest_timer_count += 1
+        if self.check_rest_timer_count >= 8640:#24小时没按键,则关机
+            self.pwk_key_Long_Press()
+        
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab["90"]:
+            return 100
+        if Vbatt>self.VBATT_tab["80"]:
+            return 90
+        if Vbatt>self.VBATT_tab["60"]:
+            return 80
+        if Vbatt>self.VBATT_tab["40"]:
+            return 60
+        if Vbatt>self.VBATT_tab["20"]:
+            return 40
+        if Vbatt>self.VBATT_tab["10"]:
+            return 20
+        if Vbatt<=self.VBATT_tab["10"]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+        
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        print("paly_iccid_imei:ICCID:{}".format(iccid))
+        if iccid != -1 and len(iccid) > 5:
+            iccid = iccid.upper()
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+        str_data += '{}.mp3+'.format(audio_buf.index("shouhou"))#可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值:
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        imei = imei.upper()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        print("device_res_author __init__ start !!!!!!!!!!!!!!!!!")
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        self.ntptime_flag = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        EventMesh.subscribe("dev_active", self.dev_active)
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)
+        #EventMesh.publish_async("dev_NTP",thread_size = 8192)
+
+        # count = 0
+        # while True:
+        #     if self.ntptime_flag == 1:
+        #         break
+        #     utime.sleep_ms(1)
+        #     count+=1
+        #     if count>600:
+        #         break
+        # EventMesh.publish_async("dev_active",thread_size = 8192)
+        # EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+
+        self.dev_NTP()#获取时间
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        print("device_res_author __init__ end !!!!!!!!!!!!!!!!!")
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self, event=None, msg=None):
+        response = None
+        try:
+            print("dev_NTP1")
+            url = "http://dmp.raisound.com/bz-api/dev/time"
+            response = request.get(url,timeout=5)
+            data = response.json()
+            print("dev_NTP:{}".format(data))
+            if data:
+                try:
+                    timeSecond = data["data"]["timestamp"]//1000
+                    
+                    next_alarm_time = utime.localtime(timeSecond)
+                    print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                    machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+                    self.ntptime_flag  = 1
+                except Exception as e:
+                        usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if response != None:
+            response.close() 
+        print("dev_NTP end")
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        try:
+            if self.dev_token == None:
+                if self.ntptime_flag == 0:
+                    self.ntptime_flag  = 1
+                    EventMesh.publish_async("dev_NTP",thread_size = 8192)
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+                print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+                EventMesh.publish_async("dev_active",thread_size = 8192)
+                EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+                # self.dev_active() #设备激活
+                # self.dev_sign_in() #设备登入
+                self.dev_res_timerCount+=1
+                if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                    self.dev_res_timerCount=0
+                    self.dev_res_timer.stop()
+        except Exception as e:
+            usys.print_exception(e)
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        try:
+            #print("ud_token_timer_!!!!")
+            self.ud_token_timer_Count+=1
+            if self.ud_token_timer_Count >= 2000: #定时30*2000s时更新token
+                self.ud_token_timer_Count = 0
+                EventMesh.publish_async("update_dev_token",thread_size = 8192)
+        except Exception as e:
+            usys.print_exception(e)    
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_active 1\r\n")
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            try:
+                date_tmp = utime.localtime() #获取当前时间
+                print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+                timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+                deviceId = self.deviceId #"876226002022574" #以imei号
+                pid = self.pid
+                key = self.key
+                sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+                print("sign_data:{}\r\n".format(sign_data))
+                sha256_hex = self.get_hmac_sha256(key,sign_data)
+                print("sha256_hex:{}\r\n".format(sha256_hex))
+
+                data = {
+                    "deviceId":"{}".format(deviceId), #设备名
+                    "pid":pid, #产品PID
+                    "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                    "timeStamp":timeStamp, #要以ms的形式
+                    "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+                }
+                print(ujson.dumps(data))
+                headers_T ={"Content-Type":"application/json"}
+                url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+                data =ujson.dumps(data)
+                response = None
+                response_result = 0
+                try:
+                    response = request.put(url,data=data,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    usys.print_exception(e)   
+                    print("put error!!!!!\r\n")
+                    response_result = 0
+                
+                IV = "" #偏移量
+                PASSWORD= "" #服务器返回后的加密内容 密码
+                if response_result == 1: #访问成功ip
+                    if response.status_code == 200:
+                        print("headers:{}".format(response.headers))
+                        content = response.content
+                        c = next(content)
+                        # "api.xcloudtech.com"
+                        # d_server_port = 9000
+                        data =  ujson.loads(c)
+                        # data = response.json()
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True:
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "nonce" in data_tmp: #偏移量
+                                            IV = data_tmp["nonce"]
+                                        if "password" in data_tmp:
+                                            PASSWORD = data_tmp["password"]
+                                            # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                                if data["code"] == 20001:#鉴权成功
+                                    pass
+                                elif data["code"] > 50000:#时间错误
+                                    self.res_error_count+=1
+                                    if self.res_error_count>=3:
+                                        self.res_error_count = 0
+                                        #EventMesh.publish("paly_device_res_error")
+                                    if data["code"] == 50003:#时间错误
+                                        self.ntptime_flag  = 0
+                        if PASSWORD != None and IV != None:
+                            if len(PASSWORD) != 0 and len(IV) != 0:
+                                password = PASSWORD
+                                iv = IV
+                                #解密 之后保存本地下一次登入做使用
+                                decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                                print("decrypt_data {}".format(decrypt_data))
+                                EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])    
+                    print("IV:{}\r\n PASS:{}".format(IV,PASSWORD))
+                if response != None:
+                    response.close()  
+            except Exception as e:
+                usys.print_exception(e)   
+            print("dev_active end\r\n")
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self, event=None, msg=None):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        print("dev_sign_in 1")
+        token = ""
+        try:
+            token = self.dev_token
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+            #print("token:{}\r\n".format(token))
+            if token == None:
+                token = ""
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0:#没有密码
+                return
+            if token == None or token == "":
+                if 1: #返回结果成功
+                    #获取本地保存的密码
+                    decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                    # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                    print("decrypt_data {}".format(decrypt_data))
+                    #随机生成16个字符串 设备生成做加密使用
+                    random_string = self.generate_random_string(16) #随机的16个字符串
+                    enc_iv = random_string #加密的IV偏移量
+                    #设备端进行密码加密
+                    encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                    print("encrypt_data {}".format(encrypt_data))
+
+                    #登入数据
+                    deviceId = self.deviceId
+                    sign_in_data = {
+                        "deviceId":"{}".format(deviceId), #设备ID
+                        "password":"{}".format(encrypt_data), #加密的数据
+                        "nonce":"{}".format(random_string) #随机的16个字符串
+                    }
+                    print(ujson.dumps(sign_in_data))
+                    sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                    headers_T ={"Content-Type":"application/json"}
+                    response_result = 0
+                    response = 0
+                    try:
+                        response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T,timeout=5)
+                        response_result = 1
+                    except Exception as e:
+                        usys.print_exception(e)   
+                        print("post error!!!!!\r\n")
+                        response_result = 0
+                    # {'msg': '', 'code': 20001, 'success': True, 
+                    # 'data': {'deviceId': '876226002022574', 
+                    # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                    # }
+                    
+                    #self.dev_token = ""
+                    if response_result == 1:
+                        if response.status_code == 200:
+                            content = response.content
+                            c = next(content)
+                            data =  ujson.loads(c)
+                            print("data-{}".format(data))
+                            if data != None:
+                                if "success" in data:
+                                    if data['success'] == True: #登入成功
+                                        if "data" in data:
+                                            data_tmp = data["data"]
+                                            if "token" in data_tmp: #token
+                                                self.dev_token = data_tmp["token"]
+                                    if data["code"] == 50003:#时间错误
+                                        self.ntptime_flag  = 0
+                    print("token:{}\r\n".format(self.dev_token))
+                    if response != None:
+                        response.close()
+                    pass
+        except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+        print("dev_sign_in end")
+    #获取新的令牌 更新token
+    def update_dev_token(self, event=None, msg=None):
+        print("update_dev_token")
+        try:
+            dev_pass = ""
+            dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+            
+            if dev_pass == None:
+                dev_pass = ""
+            if len(dev_pass) == 0: #没有密码走激活
+                print("no dev_pass:{}\r\n".format(dev_pass))
+                EventMesh.publish("dev_active")
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) == 0: #没有token走登入
+                print("no dev_token:{}\r\n".format(token))
+                #self.dev_sign_in()
+                EventMesh.publish("dev_sign_in")
+            dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+            token = self.dev_token
+            if token == None:
+                token = ""
+            if len(token) != 0:
+                response_result=0
+                response = None
+                headers_T = {"bz-dt":"{}".format(token)}
+                try:
+                    response = request.get(dev_tokenip,headers = headers_T,timeout=5)
+                    response_result = 1
+                except Exception as e:
+                    print("get error!!!!!\r\n")
+                    response_result = 0
+                if response_result == 1:
+                    if response.status_code == 200:
+                        try:
+                            headers_data = response.headers
+                            # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                            if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                                bz_dt = headers_data["bz-dt"] 
+                                self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                                print("update_dev_token:{}".format(self.dev_token))
+                        except Exception as e:
+                            print("headers_data!!!!! error\r\n")
+                if response != None:
+                    response.close()
+        except Exception as e:
+            usys.print_exception(e)   
+        print("update_dev_token end")
+        
+#OTA升级
+class OTA():
+    def __init__(self):
+        #EventMesh.subscribe("min_sys_ota",self.min_sys_ota)
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+    #小系统升级,返回0,没有升级;返回,1有升级,正在执行升级;返回2,电压不够
+    def min_sys_ota(self,event=None,msg=None):
+        print("min_sys_ota")
+        signal = net.csqQueryPoll()
+        if signal == -1 or sim.getStatus()  != 1:#网络不正常
+            print("min_sys_ota 无 SIM卡!!!!!!!!\r\n")
+            return 0
+        # return 0
+        response = None
+        ret_str =0
+        self.downloadFileVoURL1= ""
+        self.downloadFileVoURL2= ""
+        try:
+            sourceVersion = versions.Build_Time
+            sourceVersion = "7PIN-"+sourceVersion[:10]+"-"+sourceVersion[11:-3]
+            #url = "http://iot.api.thisiot.com/ota/task?deviceId=860132060348836&sourceVersion=2024-12-20-15:35-1"
+            url = "http://dmp.raisound.com/bz-api/ota/task?deviceId={}&sourceVersion={}".format(modem.getDevImei(),sourceVersion)
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("min_sys_ota1:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20007:#有新版本
+                            if "fileList"in data["data"]:
+                                if len(data["data"]["fileList"]) == 2:
+                                    for fileList in data["data"]["fileList"]:
+                                        if fileList["fileName"] == "dfota_2.bin":
+                                            self.downloadFileVoURL2 = fileList["url"]
+                                        elif fileList["fileName"] == "dfota_1.bin":
+                                            self.downloadFileVoURL1 = fileList["url"]
+                            
+                        if data["code"] == 20006:#已是最新版本
+                            ret_str = 0
+                                    
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("min_sys_ota get error")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+        
+        print("min_sys_ota:downloadFileVoURL1:{},\ndownloadFileVoURL2:{}".format(self.downloadFileVoURL1,self.downloadFileVoURL2))
+        print("min_sys_ota end") 
+        if self.downloadFileVoURL2!="" and self.downloadFileVoURL1!="":
+            battery = EventMesh.publish("get_battery")
+            if battery>=40:
+                self.ota_timer = osTimer()
+                self.ota_timer.start(8000, 0, self.ota_timer_cb)
+                ret_str =  1  
+            else:
+                ret_str =  2
+        return ret_str
+    
+    def ota_timer_cb(self, *args, **kwargs):
+        import fota
+        fota_obj = fota() 
+        fota_obj.httpDownload(url1=self.downloadFileVoURL1,url2=self.downloadFileVoURL2)
+    #ota升级结果返回,开机时调用一次即可
+    def ota_result(self,event=None,msg=None):
+        response = None
+        try:
+            currentVersion = versions.Build_Time
+            currentVersion = "7PIN-"+currentVersion[:10]+"-"+currentVersion[11:-3]
+            url = "http://dmp.raisound.com/bz-api/ota/result?deviceId={}&currentVersion={}".format(modem.getDevImei(),currentVersion)
+            print(url)
+            response = request.post(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("ota_result:{}".format(data))
+            else:
+                print("ota_result  error!!!!")
+                for i in response.text:
+                    print(i)
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+    #ICCID上传
+    def pots_ICCID(self,event=None,msg=None):
+        response = None
+        try:
+            iccid = sim.getIccid()
+            if iccid != -1 and len(iccid) > 5:
+                print("pots_ICCID:{}".format(iccid))
+                #Headers = {'Transfer-Encodong':'chunked'}
+                #http://dmp.raisound.com/bz-api/dev/iccid?deviceId=866610001099679&iccid=89860002192307889057
+                url = "http://dmp.raisound.com/bz-api/dev/iccid?deviceId={}&iccid={}".format(modem.getDevImei(),iccid)
+                print(url)
+                response = request.post(url,timeout=5)
+                if response.status_code == 200:
+                    data = response.json()
+                    print("pots_ICCID:{}".format(data))
+                else:
+                    print("pots_ICCID  error!!!!")
+                    for i in response.text:
+                        print(i)
+                response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+#阿里VC状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechIng=3#正在说
+VC_State_SpeechEnd=4#说结束
+VC_State_RequestToRespond=5 #TTS请求或者chat请求
+VC_State_Thinking=6#想(chat)
+VC_State_Responding=7#音频播放
+VC_State_TTSStart=8
+VC_State_TTSData=9
+VC_State_TTSFinish=10
+VC_State_TTSEnd=11
+VC_State_TTSError=12
+VC_State_DialogError=13
+VC_State_End=14
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_VC_num = 3
+AI_client_asr_num = 4
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        try:
+            self.http_get_config()#获取/更新配置参数
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_30S_timer = osTimer()
+        self.VC_30S_timer.start(30000, 1, self.VC_30S_timer_cb)
+        self.get_config_timer_count = 0
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.play_data_save_flag = 0 #是否保存tts数据到文件
+        self.record_fd = None
+        self.play_fd = None
+        self.is_VC_ACK = 0 #是否开启ack应答模式
+        self.ai_OTA = OTA()
+        
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#
+        if self.VC_mode == None :
+            self.VC_mode = 0
+        
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.server_ip = EventMesh.publish("get_storage_config","server_ip")#
+        if self.server_ip == None:
+            if self.VC_server == 1:# 
+                
+                self.server_ip="118.145.158.207:22082"
+            elif self.VC_server == 2:# 
+                self.server_ip="118.145.158.207:22082"
+            else:
+                self.server_ip="sevenpin.qipai.com.cn"
+        #开机提示音
+        self.power_on_tone = EventMesh.publish("get_storage_config","power_on_tone")#
+        if self.power_on_tone == None:
+            if dev_type == "G10":
+                self.power_on_tone = "已开机,您好!我是北科瑞讯智能 AI bot_name"
+            else:
+                self.power_on_tone = "您好!我是柒牌男装AI生活好帮手-bot_name, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?" 
+                #"已开机,这是升级测试前软件,可说查询版本来确认当前版本号,可说OTA升级来触发在线升级"#
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置
+        if self.VC_TTS_voice_type == None or ("男" in self.VC_TTS_voice_type) == False:
+            if dev_type == "G10":
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"小瑞",
+                                            "voice":"ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"小瑞",
+                                            "voice":"zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            else:
+                #女,男,童,粤,川,个性声
+                self.VC_TTS_voice_type = {   
+                                            "女":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"huoshan::zh_female_wanwanxiaohe_moon_bigtts" ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "男":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_male_wennuanahu_moon_bigtts"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "童":{
+                                            "bot_name":"柒乐乐",
+                                            "voice":"huoshan::ICL_zh_female_huoponvhai_tob"  ,
+                                            "lang":"zh-cn"
+                                            },
+                                            "粤":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_female_wanqudashu_moon_bigtts" ,
+                                            "lang":"zh-hk" 
+                                            },
+                                            "四川":{
+                                            "bot_name":"柒妹妹",
+                                            "voice":"huoshan::zh_female_daimengchuanmei_moon_bigtts",
+                                            "lang":"&lang=zh-cn-sc"  
+                                            },
+                                            "个性":{
+                                            "bot_name":"柒先生",
+                                            "voice":"huoshan::zh_male_sunwukong_mars_bigtts" ,
+                                            "lang":"zh-cn" 
+                                            }
+                                           
+                                        }
+            
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+            
+            #EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+
+        try:
+            self.VC_TTS_voice_key = EventMesh.publish("get_storage_config","VC_TTS_voice_key")#音色配置
+            if self.VC_TTS_voice_key == None :
+                self.VC_TTS_voice_key = "男"
+            if self.VC_TTS_voice_key in self.VC_TTS_voice_type:
+                pass
+            else:
+                self.VC_TTS_voice_key = list(self.VC_TTS_voice_type.keys())[0]
+            print("音色配置:{}:{}\r\n\r\n".format(self.VC_TTS_voice_key,self.VC_TTS_voice_type[self.VC_TTS_voice_key]))
+            self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        except Exception as e:
+            usys.print_exception(e)
+
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_audio_queue_thread_lock = 0
+        self.AI_VC_send_data_queue_thread_id = 0
+        self.AI_VC_send_data_queue_thread_lock = 0
+        self.AI_ASR_send_data_queue_thread_id = 0
+        self.AI_ASR_send_data_queue_thread_lock = 0
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_ASR_send_data_queue = Queue(200)
+        self.AI_VC_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_send_buf_len = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_text_repet_count = 0
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            
+        self.VC_state = VC_State_None #阿里ai VC状态
+        self.VC_dialog_id = ""#
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_VC = None
+        self.AI_client_VC_recv_id = 0
+        self.AI_client_VC_recv_lock = 0
+        self.AI_client_VC_isconnect =0
+        self.AI_client_VC_debug =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR VC状态
+        self.key_state = 0
+
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_recv_lock = 0
+        self.AI_client_asr_isconnect =0
+        self.AI_ASR_timer =  osTimer()
+        self.AI_ASR_timer_count = 0
+        self.AI_client_asr_debug =0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.VC_Thinking_timerout = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.VC_record_thread_lock = 0
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        self.VC_satrt_flag = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)
+        EventMesh.subscribe("VC_error", self.VC_error)
+        
+        EventMesh.publish("close_led")
+
+        self.bot_name = "柒先生"
+        try:
+            if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+            else:
+                print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            if self.ai_OTA.min_sys_ota()==1:
+            #if 0:    
+                self.AI_TTS_str = "检测到有新版本需要升级啦!升级时可千万别断电或乱按哦,升级完成后设备会自动重启,重启就代表升级成功"
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            # if self.ai_OTA.min_sys_ota()==2:
+            #     self.AI_TTS_str = "检测到有新版本需要升级啦!电量低于40%,无法保证升级正常执行,请充满电后重启设备再次升级!"
+            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+            else:
+                try:
+                    self.ai_OTA.ota_result()
+                    self.ai_OTA.pots_ICCID()
+                except Exception as e:
+                    usys.print_exception(e)
+                #开机提示语,如果联网失败,直接提示信号弱
+                
+                #"voice":{"女":"柒妹妹-huoshan::zh_female_wanwanxiaohe_moon_bigtts","男":"柒先生-huoshan::zh_male_wennuanahu_moon_bigtts","童":"柒乐乐huoshan::ICL_zh_female_huoponvhai_tob","广东":"柒先生-huoshan::zh_female_wanqudashu_moon_bigtts","四川":"柒妹妹-huoshan::zh_female_daimengchuanmei_moon_bigtts","个性":"柒先生-zh_male_sunwukong_mars_bigtts"}
+                #EventMesh.publish("get_storage_config",["powerRestart",1])
+                powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#=1非正常重启
+                if powerRestart == None:
+                    powerRestart = 0
+                if powerRestart == 1:
+                    EventMesh.publish("set_storage_config",["powerRestart",0])
+                    
+                else:
+                    
+                    self.AI_TTS_str = self.power_on_tone.replace("bot_name", self.bot_name)
+                    print("开机提示:{}".format(self.AI_TTS_str))
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                
+                
+
+        except Exception as e:
+            usys.print_exception(e)
+
+        
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def get_VC_satrt_flag(self, event, msg):
+        return self.VC_satrt_flag
+
+
+    def VC_30S_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_30S_timer_cb_}) 
+
+    def VC_30S_timer_cb_(self):    
+        self.get_config_timer_count += 1
+        if self.get_config_timer_count >= 2*60*2:#2小时更新配置参数
+            self.get_config_timer_count = 0
+            try:
+                self.http_get_config()#获取/更新配置参数
+            except Exception as e:
+                usys.print_exception(e)
+    #获取配置参数
+    def http_get_config(self, event=None, msg=None):
+        print("http_get_config")
+
+        response = None
+        #http://180.184.206.142/bz-api/dev/config?deviceId=xxx
+        try:
+            url = "http://dmp.raisound.com/bz-api/dev/config/{}".format(modem.getDevImei())
+            print(url)
+            response = request.get(url,timeout=5)
+            if response.status_code == 200:
+                data = response.json()
+                print("http_get_config:{}".format(data))
+                
+                if data:
+                    try:
+                        if data["code"] == 20000:#有配置
+                            if data["data"] :
+                                if "version" in data["data"]:
+                                    config_version = EventMesh.publish("get_storage_config","config_version")#音量配置
+                                    if config_version != data["data"]["version"]:
+                                        config_version = data["data"]["version"]
+                                        EventMesh.publish("set_storage_config",["config_version",config_version])
+                                        if "VC_TTS_voice_type" in data["data"]:
+                                            self.VC_TTS_voice_type = data["data"]["VC_TTS_voice_type"]
+                                            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+                                            print("配置VC_TTS_voice_type成功")
+                                        if "server_ip" in data["data"]:
+                                            self.server_ip = data["data"]["server_ip"]
+                                            EventMesh.publish("set_storage_config",["server_ip",self.server_ip])
+                                            print("配置server_ip成功")
+                                        if "power_on_tone" in data["data"]:
+                                            self.power_on_tone = data["data"]["power_on_tone"]
+                                            EventMesh.publish("set_storage_config",["power_on_tone",self.power_on_tone])
+                                            print("配置power_on_tone成功")
+
+                    except Exception as e:
+                            usys.print_exception(e)
+            else:
+                print("status_code:{}".format(response.status_code))
+                print("http_get_config:error!!!!!!!!!!")
+            response.close()
+        except Exception as e:
+            usys.print_exception(e)
+            if response != None:
+                response.close()
+
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.get_config_timer_count = 0
+        self.key_state = 1
+        #self.aud.aud_tone_play(10,200)#播放按键音
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.VC_state = VC_State_None
+        # if self.VC_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        #if self.VC_record_state_flag >1:#如果在录音,就先停止录音
+        self.VC_Speech_End()
+
+        self.VC_Speech_Start()    
+        self.AI_VC_start() 
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        self.key_state = 0
+        if self.AI_key_long_press_flag == 1 :#有长按
+            #self.AI_client_VC_end_speech()
+            EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_mode == 1 :#长按单次问答模式
+                if self.AI_ASR_str_tmp != "":
+                    print("AI_key_release:asr_str:{}".format(self.AI_ASR_str))  
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+            
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                # try:
+                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                # except Exception as e:
+                #     usys.print_exception(e)
+                # EventMesh.publish("publish_AI_btnInfo",{"func":self.key_prompt})  #提示请您按住中间的按钮开始讲话,讲完松开即可   
+                self.AI_TTS_str = "请您按住中间的按钮开始讲话,讲完松开即可 "
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+
+                
+                #self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def key_prompt(self):
+        EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+        #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+    def VC_error(self, event, msg):#错误播报
+        self.websocket_error()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+#****************************************ASR连接**********************************************************************
+    def websocket_connect_asr(self):
+        print("websocket_connect_asr:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,self.AI_client_asr_debug))
+        self.AI_ASR_text_repet_count = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        self.AI_ASR_text_tmp = ""
+        if self.AI_client_asr_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            req_str = ""
+            platform = "platform=huoshan"
+            lang = "lang=zh-cn"#普通话测试环境
+            try:
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]
+                else:
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            req_str = "asr/ws?is_auth=0{}{}".format(platform,lang)
+            print("req_str:{}".format(req_str))
+            token = EventMesh.publish("get_dev_token")
+            print("token:{}".format(token))
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
+            print("websocket_connect_asr URL:{}".format(url))
+            self.AI_client_asr = uwebsocket.Client.connect(url, debug=True)#
+
+            
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            
+            print("websocket_connect_asr error!!!\r\n")
+            #self.connect_timerout_popup(2)  
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                self.websocket_error()
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            
+            return
+        if self.AI_client_asr == None:
+            EventMesh.publish_async("update_dev_token",thread_size = 8192)#获取token
+            return 
+        self.AI_client_asr_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_asr.settimeout(6)
+        #开启发送线程
+        if self.AI_ASR_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_ASR_send_data_queue_thread_id = _thread.start_new_thread(self.AI_ASR_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_ASR_send_data_queue_thread_id :{} ".format(self.AI_ASR_send_data_queue_thread_id))
+        print("websocket_connect_asr 222!!!\r\n")
+        self.AI_client_asr_recv_thread_close()#关闭读线程
+        # 创建线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
+        _thread.stack_size(8*1024)
+        self.AI_client_asr_isconnect = 1
+        self.AI_ASR_timer.start(1000, 1, self.AI_ASR_timer_cb)
+        self.AI_client_asr_start_requset()#开始请求
+        print("websocket_connect_asr:OK!!!!!!!!!!!!!!!!!!!!!")
+
+    def websocket_deconnect_asr(self):
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+        print("websocket_deconnect_asr!!!!!!!")
+        self.AI_ASR_text_repet_count = 0
+        self.AI_ASR_text_tmp = ""
+        self.AI_ASR_timer.stop()
+        #self.AI_ASR_send_data_queue_thread_close()#关闭发送线程
+        self.AI_client_asr_recv_thread_close()#关闭读线程
+        if self.AI_client_asr_isconnect == 1 or self.AI_client_asr!= None:
+            self.AI_client_asr_isconnect = 0
+            count = 500
+            while True:#等待发完数据
+                count-=1
+                if count <=0 or self.AI_ASR_send_data_queue_thread_lock == 0:
+                    break
+                print("等待发送完成:{}".format(count))
+                if self.AI_ASR_send_data_queue.empty()!=True:
+                    self.AI_ASR_send_data_queue.clear()
+                utime.sleep_ms(1)
+            
+            try:
+                self.AI_client_asr_StopTranscription_requset()#发送停止ASR
+                self.AI_client_asr.close()
+
+                #self.AI_client_asr = None
+            except Exception as e:
+                usys.print_exception(e)
+                utime.sleep_ms(200)#再尝试关闭一次
+                try:
+                    self.AI_client_asr.close()
+                    #self.AI_client_asr = None
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_asr_debug-=1
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+
+    #websocket发送数据    
+    def AI_client_asr_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("ASR ASR AI_client_asr_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     pass
+        #     #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
+        self.AI_ASR_send_data_queue.put([AI_client_asr_num,data_str]) 
+
+    def AI_client_asr_ping(self):
+        pass
+        if self.AI_client_asr_isconnect == 1:
+            #self.AI_client_asr.write_frame(0x09,b'ping ping')
+            self.AI_client_asr_send("ping")
+    
+    def AI_ASR_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) 
+
+    def AI_ASR_timer_cb_(self):    
+        if self.AI_ASR_check_timeout > 0:
+            print("AI_ASR_check_timeout:{}".format(self.AI_ASR_check_timeout))
+            self.AI_ASR_check_timeout-=1
+            if self.AI_ASR_check_timeout <=0:
+                self.AI_ASR_check_timeout = 0
+                self.AI_ASR_error_timeout = 3#发送停止后3秒后没正式结果就提示
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_asr_StopTranscription_requset})
+                
+        if self.AI_ASR_error_timeout>0:
+            self.AI_ASR_error_timeout-=1
+            print("AI_ASR_error_timeout:{}".format(self.AI_ASR_error_timeout))  
+            if self.AI_ASR_error_timeout <= 0:
+                self.AI_ASR_error_timeout = 0
+                if self.AI_ASR_str == "":
+                        self.AI_TTS_str = "没有识别到您说话,请重试" 
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+
+        pass
+    #关闭ASR数据发送线程
+    def AI_ASR_send_data_queue_thread_close(self):
+        if self.AI_ASR_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1     
+                if self.AI_ASR_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_ASR_send_data_queue_thread_lock = 2
+                    print("AI_ASR_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_ASR_send_data_queue_thread_lock = 0
+            print("AI_ASR_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_ASR_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_ASR_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_ASR_send_data_queue_thread(self):
+        print("AI_ASR_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_ASR_send_data_queue_thread_lock == 2:
+                print("AI_ASR_send_data_queue_thread:该退出了")
+                break
+            if self.AI_ASR_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_ASR_send_data_queue_thread_lock = 0  
+                count_t+=1
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_ASR_send_data_queue_thread:get")
+                
+                self.AI_ASR_send_data_queue_thread_lock = 1
+                data = self.AI_ASR_send_data_queue.get()
+                #print("AI_ASR_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        # 发送数据
+                        if data[0] == AI_client_asr_num:
+                            self.AI_ASR_send_buf_len -= len(data[1])
+                            self.asr_pingping_timerout = 0
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+                                self.AI_client_asr.send(data[1])
+                                if isinstance(data[1], str):#是字符串
+                                    print("ASR ASR: send_data:{}".format(data[1]))
+                                # else:
+                                #     print("ASR ASR: send_data!:{}".format(len(data[1])))
+                            else:
+                                if isinstance(data[1], str):#是字符串
+                                    print("ASR ASR: send_data error!!!:{}".format(data[1]))
+                                else:
+                                    print("ASR ASR: send_data error!!!:{}".format(len(data[1])))
+
+                    except Exception as e:
+                        usys.print_exception(e)
+                        if data[0] == AI_client_asr_num: 
+                            if self.AI_client_asr_isconnect != 0:
+                                print("ASR发送数据错误,退出")
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR发送出错了,请重试"}) 
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
+                    utime.sleep_ms(1)
+        self.AI_ASR_send_data_queue_thread_lock = 0    
+
+    #ASR关闭读线程
+    def AI_client_asr_recv_thread_close(self):
+        if self.AI_client_asr_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_asr_recv_lock == 1:
+                    self.AI_client_asr_recv_lock = 2
+                if self.AI_client_asr_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_asr_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_asr_recv_lock = 0
+            print("AI_client_asr_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_asr_recv_id = 0
+
+    #Ai VC websocket返回数据       
+    def AI_client_asr_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_asr_recv_lock = 0
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_asr_recv_lock == 2:#要关闭线程了
+                    print("AI_client_asr_recv 该退出了")
+                    break
+                self.AI_client_asr_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("ASR 服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("ASR ASR :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR连接断开了,请重试"}) 
+                    break
+                try:
+                    if isinstance(recv_data, str):
+                        jsload_data =  ujson.loads(recv_data)
+                        print("ASR ASR recv_data: {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            print("ASR返回非20000000状态码,退出")
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
+                            break
+                        if jsload_data["event"] != None:
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
+                                self.VC_record_state_flag = 2
+                                self.VC_state =  VC_State_SpeechStart
+                                EventMesh.publish("open_led_blue")
+                                pass
+
+                            elif jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed
+                                # if self.VC_record_state_flag == 2:
+                                #     
+                                
+                                self.AI_ASR_timer_count = 0
+                                if jsload_data["result"]["result"]:
+                                    #self.AI_listen_text = str(jsload_data["result"]["result"])
+                                    text= str(jsload_data["result"]["result"])
+                                    print("ASR recv self.VC_state :{}".format(self.VC_state))
+                                    if self.VC_state >= VC_State_TTSStart:#开始播音后不响应asr结果
+                                        print("asr continue")
+                                        continue
+                                    EventMesh.publish("open_led_blue")
+                                    
+                                    if jsload_data["result"]["is_end"] == True:  #asr结束
+                                        self.AI_ASR_check_timeout = 0
+                                        self.AI_ASR_error_timeout = 0
+                                        self.AI_ASR_text_repet_count = 0
+                                        self.AI_ASR_text_tmp = ""
+                                        self.VC_state =  VC_State_SpeechEnd
+                                        self.VC_record_state_flag = 4
+                                        ret= self.check_text(text)
+                                        if ret == 0:#配置指令
+                                            
+                                            if self.AI_VC_send_data_queue.empty()!=True:
+                                                self.AI_VC_send_data_queue.clear()
+                                            if self.AI_ASR_send_data_queue.empty()!=True:
+                                                self.AI_ASR_send_data_queue.clear()
+                                            self.AI_ASR_send_buf_len = 0
+                                            EventMesh.publish("open_led_all")
+                                            try:
+                                                
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                                                #print("AI_client_asr_recv VC_Speech_End") 
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                            except Exception as e:
+                                                usys.print_exception(e)
+                                            continue
+                                        elif ret == 1:#不处理
+                                            pass
+                                        else:#正常asr
+                                            if self.VC_mode == 0 :#连续问答模式
+                                                self.AI_ASR_str = text#
+                                                if self.AI_ASR_flag == 0:#d第一次识别,没有打断
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                else:#第二次识别,打断了
+                                                    self.AI_ASR_str = self.AI_ASR_str_tmp+text
+                                                    print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                                    self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
+                                                self.AI_ASR_flag  = 1
+                                                print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
+                                                #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                            elif self.VC_mode == 1:#单对话模式
+                                                self.AI_ASR_str += text#
+                                                self.AI_ASR_str_tmp = self.AI_ASR_str
+                                                if self.key_state == 0:#按键已经弹起
+                                                    self.AI_ASR_str_tmp =""
+                                                    print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
+                                                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
+                                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                            
+                                    elif jsload_data["result"]["is_end"] == False:
+                                        
+                                        self.VC_state =  VC_State_SpeechIng
+                                        if self.AI_ASR_text_tmp != "" and self.AI_ASR_text_tmp  == text:
+                                            pass
+                                            # self.AI_ASR_text_repet_count+=1
+                                            # if self.AI_ASR_text_repet_count>=40:#重复30次下发一样结果,就报错
+                                            #     print("asr 错误,无正式结果:{}".format(text))
+                                            #     #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                                            #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"}) 
+                                        else:
+                                            self.AI_ASR_check_timeout = 5 #5秒没更新结果,强制stop
+                                            self.AI_ASR_text_repet_count = 0
+                                        if self.VC_mode == 0 :#连续问答模式
+                                            self.AI_ASR_text_tmp = text
+                                            self.VC_record_state_flag = 3
+                                            if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
+                                                self.AI_ASR_flag = 2
+                                                print("asr 打断,关闭VC连接")
+                                                self.AI_ASR_str = ""
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC})#关闭vc连接
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_VC})#连接服务器
+                                                # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_start_requset})#请求
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                                EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_blue"})#
+                                        elif self.VC_mode ==1:#单对话模式
+                                            self.AI_ASR_str_tmp =""
+                        
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    error_str = str(e)
+                    print("ASR ASR:e:{}".format(error_str))
+                    usys.print_exception(e)
+                    if error_str.find("[Errno 110]")!= -1:
+                        #print("ASR ASR:recv TIMEDOUT 正常")
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        print("{}".format(cli))
+                        #self.websocket_error()
+                        print("ASR读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"ASR出错了,请重试"})#
+                        break
+        self.AI_client_asr_isconnect = 0
+        self.AI_client_asr_recv_id = 0 
+        self.AI_client_asr_recv_lock = 0
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    #ASR开始会话
+    def AI_client_asr_start_requset(self):
+        
+        json_data = \
+        { 
+            "header":{
+                "event":"StartTranscription",
+                "trace_id":self.get_trace_id()
+                },
+            "payload":{
+                "format":"pcm",
+                "sample_rate":self.VC_record_samplerate,
+                }
+            
+        }
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["format"]='amr'
+            pass
+        
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    #ASR终止
+    def AI_client_asr_StopTranscription_requset(self):   
+        print("AI_client_asr_StopTranscription_requset!!!!!")
+        json_data = \
+        {
+            "header":{
+                "event":"StopTranscription",
+                "trace_id":self.get_trace_id()
+                }
+        }
+
+        #self.AI_client_asr_send(ujson.dumps(json_data))
+        if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+            self.AI_client_asr.send(ujson.dumps(json_data))
+                
+     #开始录音
+    def VC_Speech_Start(self):
+        try:
+            #self.VC_state =  VC_State_SpeechStart
+            print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+            if self.AI_ASR_flag  != 0:
+                return
+            if self.VC_record_state_flag  == 0:
+                
+                self.websocket_connect_asr()   
+                self.VC_record_thread_close()#关闭录音线程
+                _thread.stack_size(self.Audio_buf_size+8*1024)
+                self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+                _thread.stack_size(8*1024)
+                print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+                try:
+                    if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                        try :
+                            self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                        except Exception as e:
+                                usys.print_exception(e)
+                    elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                        print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                        self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                        # if self.record_pcm != None:
+                        #     try:
+                        #         self.record_pcm.stream_stop()
+                        #         self.record_pcm.close()
+                        #         self.record_pcm = None
+                        #     except Exception as e:
+                        #         usys.print_exception(e)
+                        # if self.record_pcm == None:        
+                        #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                        #     print("audio.Audio.PCM:ret:{}".format(ret))
+                        #     ret = self.record_pcm.stream_read_start()
+                        #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                except Exception as e:
+                    usys.print_exception(e) 
+                    
+                self.VC_record_state_flag = 1
+        except Exception as e:
+            self.websocket_error()
+            self.VC_record_state_flag = 1
+            self.VC_Speech_End()#关闭录音
+            usys.print_exception(e)
+
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_ASR_str_tmp = ""
+            self.AI_ASR_str = ""
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+              
+            if self.VC_record_state_flag == 0:
+                return
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.VC_record_thread_close()#关闭录音线程
+        if self.AI_record_tmp_queue.empty() != True:
+            self.AI_record_tmp_queue.clear()
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)  
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #关闭录音线程   
+    def VC_record_thread_close(self): 
+        if self.VC_record_thread_id != 0:
+            count =50
+            while True:
+                count -= 1
+                if self.VC_record_thread_lock == 1:
+                    self.VC_record_thread_lock = 2
+                if self.VC_record_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    print("VC_record_thread_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.VC_record_thread_lock = 0
+            print("VC_record_thread_thread_close")
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.VC_record_thread_id = 0
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_VC_send(h_data_b)
+        
+        while True:
+            try:
+                if self.VC_record_thread_lock == 2:
+                    break
+                self.VC_record_thread_lock = 1
+                # 死循环接收数据
+                #if self.VC_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    if self.record_fd != None:
+                        self.record_fd.write(read_buf)
+                        print("write record:{}".format(len(read_buf)))
+                    # if self.VC_record_state_flag >= 2:
+                    #     self.AI_client_asr_send(read_buf)
+                    
+                    if self.VC_record_state_flag <=1 :#没发送前先存起来
+                        self.AI_record_tmp_queue.put(read_buf)
+                    else:
+                        while True:
+                            if self.AI_record_tmp_queue.empty() == True:
+                                break
+                            else:
+                                self.AI_client_asr_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                        self.AI_client_asr_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    #count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_VC_end_speech()
+                #     break
+                # count+=1
+                # if count %10 == 0:
+                #     print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_VC_send_data_queue_thread_id)))
+                
+                # if self.VC_state >=  VC_State_SpeechEnd:
+                #     break
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+            self.VC_record_thread_lock = 0
+            utime.sleep_ms(60)
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+        self.VC_record_thread_lock = 0
+###################################################### VC ###################################################################################
+    def websocket_connect_VC(self):
+        print("websocket_connect_VC:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_VC_isconnect,self.AI_client_VC_debug))
+        if self.AI_client_VC_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            
+            req_str = ""
+            ack = ""
+            if self.is_VC_ACK == 1:
+                ack = "ack=1"
+            lang = "lang=zh-cn"#普通话测试环境
+            try:
+                if "loang" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    lang = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["lang"]
+                else:
+                    print("not lang!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            if dev_type == "G10":
+                #platform = "platform=huoshan&is_bot=1"
+                platform = "&platform=raisound"
+
+            else:
+                platform ="platform=huoshan"# "platform=raisound"
+                
+            #女,男,童,粤,川
+            self.bot_name = "柒先生"
+            try:
+                if "bot_name" in self.VC_TTS_voice_type[self.VC_TTS_voice_key]:
+                    self.bot_name = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["bot_name"]
+                else:
+                    print("not bot_name!!!!!!!!!!!!!!!!!!!!!!")
+            except Exception as e:
+                usys.print_exception(e)
+            
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_VC = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            token = EventMesh.publish("get_dev_token")
+            print("token:{}".format(token))
+            req_str = "voice-chat/ws?is_auth=0&{}&{}".format(platform,lang)
+            url = 'ws://{}/{}&dt={}'.format(self.server_ip,req_str,token)
+            print("VC VC:url{}".format(url))
+            self.AI_client_VC = uwebsocket.Client.connect(url, debug=True)
+            # if self.VC_server == 1:# 
+            #     #柒牌服务器地址sevenpin.qipai.com.cn
+            #     #北科服务器118.145.158.207:22082
+            #     self.AI_client_VC = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws', debug=False)#测试环境
+            # elif self.VC_server == 2:# 
+            #     token = EventMesh.publish("get_dev_token")
+            #     print("token:{}".format(token))
+            #     req_str = "/voice-chat/ws?is_auth=0&{}&{}".format(platform,lang)
+            #     url = 'ws://118.145.158.207:22082{}&dt={}'.format(req_str,token)
+            #     print("VC VC:url{}".format(url))
+            #     self.AI_client_VC = uwebsocket.Client.connect(url, debug=True)
+                
+            # else:
+            #     req_str = "is_auth=0&{}&{}".format(platform,lang)
+            #     print("req_str2:{}".format(req_str))
+            #     token = EventMesh.publish("get_dev_token")
+            #     print("token:{}".format(token))
+            #     url = 'ws://sevenpin.qipai.com.cn/voice-chat/ws?{}&dt={}'.format(req_str,token)
+            #     print("VC VC:url{}".format(url))
+            #     if token != None:
+            #         self.AI_client_VC = uwebsocket.Client.connect(url, debug=False)
+            #     else:
+            #         self.websocket_error()
+            #         return
+            print("websocket_connect_VC:OK!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_VC error!!!\r\n")
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                print("websocket_connect_VC:str_error:{}".format(str_error))
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                print("[Errno 22] EINVAL!!!\r\n")
+                self.websocket_error()
+                EventMesh.publish("set_storage_config",["powerRestart",1])#调试临时关闭
+                utime.sleep_ms(1000)
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+                Power.powerRestart()
+                
+            self.websocket_error()
+            return
+        #print("AI_client_VC:{}".format(self.AI_client_VC))
+        if self.AI_client_VC == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        self.AI_client_VC_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_VC.settimeout(6)
+        #self.AI_VC_send_data_queue_thread_close()#关闭发送线程
+        if self.AI_VC_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        # 线程接收数据
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_VC_recv_id = _thread.start_new_thread(self.AI_client_VC_recv, (self.AI_client_VC,))
+        _thread.stack_size(8*1024)
+        self.AI_client_VC_isconnect = 1
+        print("websocket_connect_VC end")
+
+    def websocket_error(self,TTS_str=None):
+        print("websocket_error1!!!!")
+        self.Close()
+        print("websocket_error1.1!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        if TTS_str == None:
+            self.websocket_error_count+=1
+            # if self.websocket_error_count <=3:
+            #     EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            if self.websocket_error_count <10 :
+                EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+            elif self.websocket_error_count >=10:
+                EventMesh.publish("paly_iccid_imei")    
+            # else:
+            #     EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+            #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+            if self.websocket_error_count <3 :
+                utime.sleep_ms(3000)
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        else:
+            print("websocket_error:tts:{}".format(TTS_str))
+            self.AI_TTS_str = TTS_str
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+        print("websocket_error2")
+       
+        
+        print("websocket_error4")
+        
+
+    def websocket_deconnect_VC(self):
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+        print("websocket_deconnect_VC!!!!!!!")
+        self.AI_client_VC_recv_thread_close()#关闭读线程
+        self.AI_client_VC_recv_id = 0
+        if self.AI_client_VC_isconnect == 1 or self.AI_client_VC!=None:
+            self.AI_client_VC_isconnect = 0
+            count = 500
+            while True:#等待发完数据
+                count-=1
+                if count <=0 or self.AI_VC_send_data_queue_thread_lock == 0:
+                    break
+                utime.sleep_ms(1)
+            
+            try:
+                self.AI_client_VC.close()
+                self.AI_client_VC_debug -=1
+                self.AI_client_VC=None
+            except Exception as e:
+                usys.print_exception(e)
+                try :
+                    self.AI_client_VC.close()
+                    self.AI_client_VC_debug -=1
+                    self.AI_client_VC=None
+                except Exception as e:
+                    usys.print_exception(e)
+        print("websocket_deconnect_VC {}!!!!!!!".format(self.AI_client_VC_isconnect))
+    #websocket发送ping
+    def AI_client_VC_ping(self):
+        pass
+        if self.AI_client_VC_isconnect == 1:
+            #self.AI_client_VC.write_frame(0x09,b'ping ping')
+            self.AI_client_VC_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_VC_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("AI_client_VC_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     print("AI_client_VC_send:len{}".format(len(data_str)))
+        self.AI_VC_send_data_queue.put([AI_client_VC_num,data_str]) 
+     #关闭数据发送线程
+    def AI_VC_send_data_queue_thread_close(self):
+        if self.AI_VC_send_data_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_VC_send_data_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_VC_send_data_queue_thread_lock = 2
+                    print("AI_VC_send_data_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+                    if self.AI_VC_send_data_queue.empty()!=True:
+                        self.AI_VC_send_data_queue.clear()
+            self.AI_VC_send_data_queue_thread_lock = 0
+            print("AI_VC_send_data_queue_thread_close")
+            try:
+                _thread.stop_thread(self.AI_VC_send_data_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_VC_send_data_queue_thread_id = 0
+    #发送数据队列
+    def AI_VC_send_data_queue_thread(self):
+        print("AI_VC_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_VC_send_data_queue_thread_lock == 2:
+                print("AI_VC_send_data_queue_thread,该退出了")
+                break  
+            if self.AI_VC_send_data_queue.empty() :#不能去掉,去掉会卡死
+                self.AI_VC_send_data_queue_thread_lock = 0  
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_VC_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_VC_send_data_queue_thread:get")
+                
+                self.AI_VC_send_data_queue_thread_lock = 1
+                data = self.AI_VC_send_data_queue.get()
+                
+                
+                #print("AI_VC_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_VC_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_VC_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_VC_recv_id)))
+                        if data[0] == AI_client_VC_num:
+                            self.VC_pingping_timerout = 0
+                            if isinstance(data[1], str):#是字符串
+                                print("VC VC: send_data:{}".format(data[1]))
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+                                self.AI_client_VC.send(data[1])
+                            #print("VC: send_data end")
+    
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_VC_num:
+                            #self.websocket_error()
+                            pass
+
+                            
+                            try:
+                                if self.AI_client_VC_isconnect != 0:
+                                    print("VC发送数据错误,退出")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC发送出错了,请重试"}) 
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+
+                    utime.sleep_ms(1)
+        self.AI_VC_send_data_queue_thread_lock = 0              
+    #VC关闭读线程
+    def AI_client_VC_recv_thread_close(self):
+        if self.AI_client_VC_recv_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_client_VC_recv_lock == 1:
+                    self.AI_client_VC_recv_lock = 2
+                if self.AI_client_VC_recv_lock == 0 or count <=0:
+                    break
+                else:
+                    print("AI_client_VC_recv_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_client_VC_recv_lock = 0
+            print("AI_client_VC_recv_thread_close")
+            try:
+                _thread.stop_thread(self.AI_client_VC_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_VC_recv_id = 0
+    #Ai VC websocket返回数据       
+    def AI_client_VC_recv(self,cli):
+        count = 0
+
+        while True:
+            try:
+                # 死循环接收数据
+                self.AI_client_VC_recv_lock = 0
+                if self.is_VC_ACK == 1:
+                    self.AI_client_VC_Read()
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_Read})
+                count+=1
+                if self.VC_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>5):
+                    count = 0
+                    utime.sleep_ms(1)
+                if self.VC_state < VC_State_TTSStart:
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                if self.AI_client_VC_recv_lock == 2:
+                    print("AI_client_VC_recv 该退出了")
+                    break
+                self.AI_client_VC_recv_lock = 1
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if recv_data == "websocket close":
+                    # 服务器关闭连接
+                    print("VC 服务器关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_VC_isconnect = 0
+                    #self.websocket_deconnect_VC()
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    break
+                elif recv_data == "":#客户端关闭连接
+                    print("VC VC :客户端关闭连接")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC连接断开了,请重试"}) 
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_VC_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            print("VC VC :服务器返回非20000000状态码,退出")
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                            break
+                        if jsload_data["event"] == "Started" :#会话开始
+                            payload = jsload_data["payload"]
+                            self.VC_dialog_id = payload["dialog_id"] 
+                            self.VC_task_id = jsload_data["task_id"] 
+                            print("VC:Started!!!!!!!!\r\n")
+                        elif jsload_data["event"]  == "SpeechContent" :#asr转译
+                            print("VC:SpeechContent!!!!!!!!\r\n")
+                            payload = jsload_data["payload"]
+                            
+                            
+                            if(payload['finished'] == True):#asr结束
+                                self.VC_state =  VC_State_SpeechEnd
+                                #self.VC_Speech_End()#停止录音
+                                text = payload["text"]
+                                if self.check_text(text) == 0:
+                                    if self.AI_VC_send_data_queue.empty()!=True:
+                                        self.AI_VC_send_data_queue.clear()
+                                    if self.AI_ASR_send_data_queue.empty()!=True:
+                                        self.AI_ASR_send_data_queue.clear()
+                                    self.AI_ASR_send_buf_len = 0
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_VC}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) 
+                                        
+                                        # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                
+                                pass
+                            else:
+                                pass
+
+                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                            self.VC_state =  VC_State_SpeechEnd
+                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      
+                            pass
+                            
+                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.play_flag = 0
+                            self.VC_state = VC_State_TTSStart
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时关闭
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            self.VC_Thinking_timerout = 0#关闭超时重试
+                            # self.VC_Play_Start()
+                            EventMesh.publish("open_led_green")#绿色
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                            if self.play_data_save_flag == 1:
+                                try:
+                                    uos.remove('/usr/play_data.pcm')
+                                except Exception as e:
+                                    usys.print_exception(e)
+                                self.play_fd = open('/usr/play_data.pcm','w')
+                            
+                            pass
+                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            #if self.VC_state == VC_State_TTSStart:
+                            print("RespondingEnded!!!!!!" )
+                            self.VC_state = VC_State_TTSEnd
+                            self.LocalRespondingEnded_timerout = 10 #最长倒数10秒发送音频结束或者终止对话
+                            if self.VC_mode == 0 :#连续问答模式
+                                #EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})#调试临时打开
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#开始录音
+                            if self.play_data_save_flag == 1:
+                                if self.play_fd !=None:
+                                    self.play_fd.close()
+                            #self.tts_fd.close()
+                            #pass
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                            payload = jsload_data["payload"]
+                            if payload["state"] == "Listening":#可以说了
+                                self.VC_state = VC_State_Listening
+                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                                    self.AI_client_VC_RequestToRespond()
+                                else:
+                                    #self.VC_Speech_Start()#开启线程获取录音数据
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#
+                                    #self.AI_client_VC_send_speech()#开始上传语音
+                                
+                                #EventMesh.publish("open_led_red")
+                            if payload["state"] == "Thinking":#思考
+                                self.VC_state = VC_State_Thinking
+                                if self.VC_Thinking_timerout == 0:
+                                    self.VC_Thinking_timerout = 15#倒计时15秒,如果没有音频数据返回就重试
+                                EventMesh.publish("open_led_red_green")#黄色
+                            if payload["state"] == "Responding":#开始音频播放
+                                #self.VC_state = VC_State_Responding#
+                                pass
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                            #self.VC_state =  VC_State_Responding
+                            #self.AI_client_VC_send_speech()#开始上传语音
+                            pass
+                    else:#下发音频数据
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
+                        
+                        print("下发音频数据1:{}".format(len(recv_data)))
+                        
+                        if self.play_data_save_flag == 1:
+                            if self.play_fd !=None:
+                                self.play_fd.write(recv_data)
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        if self.VC_state >= VC_State_TTSStart:
+                            #self.put_record_data([recv_data,""])
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                        utime.sleep_ms(1)
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    
+                    error_str = str(e)
+                    #print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        #print("VC VC:recv TIMEDOUT 正常")
+                        pass
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        print("VC VC :读数据报错,退出")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"VC出错了,请重试"}) 
+                        
+                        break
+        self.AI_client_VC_isconnect = 0
+        self.AI_client_VC_recv_id = 0 
+        self.AI_client_VC_recv_lock = 0
+        print("AI_client_VC_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("声音") != -1 and text.find("改") != -1:
+                    try:
+                        for key in self.VC_TTS_voice_type:
+                            if  text.find(key) != -1 :
+                                self.VC_TTS_voice_key = key
+                                EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                                self.AI_TTS_str = "更改成功" 
+                                return 0
+                    except Exception as e:
+                        usys.print_exception(e)    
+                    if  text.find("男") != -1 :
+                        if "男" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "男"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("女") != -1 :
+                        if "女" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "女"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("同声") != -1 or text.find("童") != -1 :
+                        if "童" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "童"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("粤") != -1 or text.find("越野") != -1 :
+                        if "粤" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "粤"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("四川") != -1 :
+                        if "四川" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "四川"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    if text.find("个性") != -1 :
+                        if "个性" in self.VC_TTS_voice_type:
+                            self.VC_TTS_voice_key = "个性"
+                            EventMesh.publish("set_storage_config",["VC_TTS_voice_key",self.VC_TTS_voice_key])
+                            # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                            self.AI_TTS_str = "更改成功" 
+                            return 0
+                    self.AI_TTS_str = "更改失败,没找到对应声音" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_mode",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1:
+                    if  text.find("加") != -1 :
+                        self.VC_TTS_volume += 10
+                        if self.VC_TTS_volume > 100:
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                            self.AI_TTS_str = "音量已最大" 
+                            self.VC_TTS_volume = 100
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                            
+                        return 0
+                    if text.find("减") != -1:
+                        self.VC_TTS_volume -= 10
+                        if self.VC_TTS_volume < 0:
+                            self.VC_TTS_volume = 0
+                            #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                            #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                            self.AI_TTS_str = "音量已最小"
+                        else:
+                            self.aud.setVolume(self.VC_TTS_volume //10)
+                            EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                            #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                            #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                            self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        return 0
+                
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("查询") != -1:
+
+                    if text.find("信号") != -1 :
+                        signal = net.csqQueryPoll()
+                        
+                        self.AI_TTS_str = "当前信号{}".format(signal)
+                        return 0
+                    if text.find("电量") != -1 :
+                        battery = EventMesh.publish("get_battery")
+                        print("电量查询:{}".format(battery))
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                        return 0
+                    if text.find("电压") != -1 :
+                        Vbatt = Power.getVbatt()
+                        #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                        #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                        self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                        return 0
+
+                    if text.find("卡号") != -1 :
+                        iccid = sim.getIccid()
+                        if iccid != -1 and len(iccid) > 5:
+                            print("iccid{}".format(iccid))
+                            self.AI_TTS_str = "当前卡号为:{}".format(iccid)
+                        else:
+                            self.AI_TTS_str = "卡号查询失败"
+                        return 0
+                    if text.find("设备号") != -1 :
+                        imei = modem.getDevImei()
+                        if imei != -1 and len(imei) > 5:
+                            print("IMEI:{}".format(imei))
+                            self.AI_TTS_str = "当前设备号为:{}".format(imei)
+                        else:
+                            self.AI_TTS_str = "设备号查询失败"
+                        return 0
+                    if text.find("版本") != -1 :
+                        sourceVersion = versions.Build_Time
+                        self.AI_TTS_str ="7PIN-"+sourceVersion
+                        return 0
+                if text.find("升级") != -1 and (text.find("OTA") != -1 or text.find("ota") != -1):
+                    
+                    if self.ai_OTA.min_sys_ota()==1:
+                        self.AI_TTS_str = "有新版本,准备开始升级,升级过程会多次重启设备,请保证流量充足及电量充足"
+                    else:
+                        self.AI_TTS_str = "当前已是最新版本"
+                    return 0
+                
+                if len(text)<12 and (text.find("再见") != -1 or text.find("拜拜") != -1):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    #self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+   
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) 
+
+    def _1S_timer_cb_(self):    
+    
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 30:#20秒没数据就close
+            
+            if self.VC_state >= VC_State_SpeechIng:
+                print("接口无响应,超时退出")
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error,"data":"接口超时了。请重试"}) 
+            else:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        if self.LocalRespondingEnded_timerout>0  :#
+            self.LocalRespondingEnded_timerout -= 1
+            print("LocalRespondingEnded_timerout:{}".format(self.LocalRespondingEnded_timerout))
+            if self.LocalRespondingEnded_timerout <= 0 or (self.play_pcm != None and self.play_pcm.stream_is_empty() == 1) :#超时或者音频播放完,
+                self.LocalRespondingEnded_timerout = 0
+                if self.VC_mode == 1 :#长按单次问答模式
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                else:
+                    #通知服务器播放结束
+                    self.AI_client_VC_LocalRespondingEnded()
+        self.VC_pingping_timerout+=1
+        if self.VC_pingping_timerout>5:
+            self.VC_pingping_timerout=0
+            self.AI_client_VC_ping()
+        self.asr_pingping_timerout += 1
+        if self.asr_pingping_timerout>5:
+            self.asr_pingping_timerout=0
+            self.AI_client_asr_ping()    
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))
+            self.VC_Thinking_timerout -=1
+            if self.VC_Thinking_timerout == 0:
+                self.VC_Thinking_timerout = 100
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")
+                self.VC_state = VC_State_None
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                pass
+        
+    #VC开始
+    def AI_VC_start(self):
+        print("AI_VC_start1")
+        self.VC_satrt_flag = 1
+        if self.VC_Thinking_timerout < 100:
+            self.VC_Thinking_timerout = 0
+        EventMesh.publish("open_led_all")
+        self.VC_Play_End()#关闭音频播放
+        print("AI_VC_start2")
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+
+        if self.record_data_save_flag == 1:
+            try:
+                uos.remove('/usr/record_data.pcm')
+            except Exception as e:
+                usys.print_exception(e)
+            self.record_fd = open('/usr/record_data.pcm','w')
+        #
+        if self.AI_client_VC_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_VC()#连接服务器
+            self.AI_client_VC_start_requset()
+            #utime.sleep_ms(50)
+        else:
+            print("self.VC_state :{}".format(self.VC_state ))
+            if self.VC_state > VC_State_SpeechStart:
+                #客户端打断对话
+                print("打断对话")
+                # self.websocket_deconnect_VC()
+                # self.websocket_connect_VC()#连接服务器
+                # self.AI_client_VC_start_requset()
+                self.AI_client_VC_RequestToSpeak()
+            elif self.VC_state == VC_State_Listening:
+                #直接chat
+                print("直接chat")
+                self.AI_client_VC_RequestToRespond()
+                return 
+            else:
+                print("异常状态")
+                #self.AI_client_VC_RequestToSpeak()
+                self.websocket_deconnect_VC()
+                self.websocket_connect_VC()#连接服务器
+                self.AI_client_VC_start_requset()
+        if self.AI_client_VC_isconnect == 0:
+            return
+        print("AI_VC_start3")
+         
+        self.VC_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()
+        #     pass
+        print("AI_VC_start4")
+        
+        #开始线程
+        
+        # if self.AI_VC_send_data_queue_thread_id == 0:    
+        #     _thread.stack_size(self.Audio_buf_size+8*1024)
+        #     self.AI_VC_send_data_queue_thread_id = _thread.start_new_thread(self.AI_VC_send_data_queue_thread, ())
+        #     _thread.stack_size(8*1024)
+        #     print("AI_VC_start :AI_VC_send_data_queue_thread_id :{} ".format(self.AI_VC_send_data_queue_thread_id))
+        
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        print("AI_VC_start5")
+    #开始会话
+    def AI_client_VC_start_requset(self):
+        voice="huoshan::zh_male_wennuanahu_moon_bigtts"
+        try:
+            voice = self.VC_TTS_voice_type[self.VC_TTS_voice_key]["voice"]
+        except Exception as e:
+            usys.print_exception(e)    
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Start"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "device_id":modem.getDevImei(),
+                "user_agent":"python",
+                "in_format":"pcm",
+                "out_format":"mp3",
+                "in_sample_rate":self.VC_record_samplerate,
+                "sample_rate":self.VC_play_samplerate,
+                "space_time": 10,
+                "volume": str(self.VC_TTS_volume),
+                "voice":voice,#self.VC_TTS_voice_type[str(self.VC_TTS_voice_key)],
+                "voice_detection":"enabled",
+                "simple_response":True,
+                "custom_variables":{
+                    "bot_name":"{}".format(self.bot_name)
+                    }
+                },
+            
+        }
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["in_format"]='amr'
+            pass
+        if self.VC_mode == 1:
+            json_data["payload"]["voice_detection"]='disable'
+        self.VC_state = VC_State_None
+        self.AI_client_VC_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_VC_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id
+            }
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.VC_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_VC_end_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"StopSpeech"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+
+
+    #通知服务器开始播放
+    def AI_client_VC_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_VC_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_VC_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_VC_send(ujson.dumps(json_data))
+        self.VC_state = VC_State_End
+    #客户端打断对话
+    def AI_client_VC_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_VC_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS或者chat事件
+    def AI_client_VC_RequestToRespond(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if self.VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(self.AI_TTS_str,self.AI_ASR_str))
+        self.VC_state = VC_State_RequestToRespond
+        if self.AI_TTS_str != "":
+            json_data["payload"]["text"] = self.AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+            self.AI_TTS_str = ""
+        elif self.AI_ASR_str != "":
+            json_data["payload"]["text"] = self.AI_ASR_str
+            json_data["payload"]["type"] = "prompt"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)})
+            #self.AI_ASR_str = ""
+        # utime.sleep_ms(1)
+    #给服务器回应ack
+    def AI_client_VC_Read(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Read"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_VC_Read!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        #for i in range(6): 
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_VC_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        if self.AI_client_VC != None and self.AI_client_VC_isconnect == 1:
+            self.AI_client_VC.send(ujson.dumps(json_data))
+      
+    ############################################
+    #关闭音频播放线程
+    def AI_audio_queue_thread_close(self):
+        print("AI_audio_queue_thread_close1!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_audio_queue_thread_id != 0:
+            count =500
+            while True:
+                count -= 1
+                if self.AI_audio_queue_thread_lock == 0 or count <=0:
+                    break
+                else:
+                    self.AI_audio_queue_thread_lock = 2
+                    print("AI_audio_queue_thread going:{}...".format(count))
+                    utime.sleep_ms(1)
+            self.AI_audio_queue_thread_lock = 0
+            print("AI_audio_queue_thread_close2!!!!!!!!!!!!!!!!!")
+            try:
+                _thread.stop_thread(self.AI_audio_queue_thread_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_id = 0
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                if self.AI_audio_queue_thread_lock == 2:
+                        print("AI_audio_queue_thread 该退出了")
+                        break
+                #
+                count+=1
+                if count%500 == 1:
+                    print("AI_audio_queue_thread on")
+                utime.sleep_ms(1)
+                #print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    self.AI_audio_queue_thread_lock = 0
+                    
+                    
+                else:
+                    
+                    
+                    self.AI_audio_queue_thread_lock = 1
+                    data = self.AI_audio_queue.get()
+                    
+                    
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_VC_LocalRespondingStarted!!!")
+                        self.AI_client_VC_LocalRespondingStarted()#通知服务器开始播放
+                    #self.AI_client_tts_data_len=len(data)
+                    #print("audio_queue:len:{}".format(len(data[0])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+                                
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        #print("play_pcm.stream_write !!!")
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        #print("play_pcm.stream_write:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.VC_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_VC_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        self.AI_audio_queue_thread_lock = 0
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(3000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+        EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+
+    def Close(self):
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.AI_ASR_check_timeout = 0
+        self.AI_ASR_error_timeout = 0
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("close_led")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        #必须先销毁线程,不然线程会容易报错
+        try:
+            self.AI_ASR_send_data_queue_thread_close()#销毁ASR发送线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_audio_queue_thread_close()#销毁音频线程
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.AI_VC_send_data_queue_thread_close()#销毁数据发送线程
+        except Exception as e: 
+            usys.print_exception(e)
+        
+        self.VC_Speech_End()
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        
+        self.AI_ASR_timer.stop()
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+        if self.play_data_save_flag == 1:
+            if self.play_fd !=None:
+                self.play_fd.close()
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+        if self.AI_ASR_send_data_queue.empty()!=True:
+            self.AI_ASR_send_data_queue.clear()
+        self.AI_ASR_send_buf_len = 0
+
+    def VC_init2(self):
+        self.VC_init()
+        
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_VC()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+        if self.AI_VC_send_data_queue.empty()!=True:
+            self.AI_VC_send_data_queue.clear()
+        if self.AI_ASR_send_data_queue.empty()!=True:
+            self.AI_ASR_send_data_queue.clear()
+        self.AI_ASR_send_buf_len = 0
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+    def VC_init(self):
+        
+        print("VC_init:AI_VC_send_data_queue:size:{}".format(self.AI_VC_send_data_queue.size()))
+        
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_7PIN.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_7PIN.py
new file mode 100644 (file)
index 0000000..45d91bc
--- /dev/null
@@ -0,0 +1,1967 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+class AI_led(Abstract):
+    def __init__(self):
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        self.led_white = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_white",self.open_led_white)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+    def open_led_red(self,event,msg):
+        #self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_white(self,event,msg):
+        self.led_red.write(0)
+        #self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_white.write(1)
+
+    def open_led_green(self,event,msg):
+        self.led_red.write(0)
+        self.led_white.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_all(self,event,msg):
+        #self.led_red.write(0)
+        self.led_white.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']
+
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        self.KeyAI_timer = osTimer()
+        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        self.pwk_key.enable() 
+        self.btnInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        
+        self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(10000, 1, self.wdt_timer_cb)
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        self.aud = audio.Audio(0)
+        
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            self.aud.stop()
+            #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+            EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            self.aud.stop()
+            EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+            #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        self.btnInfo_queue.put(msg)
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                if self.pwk_key_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        #print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        #print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        #print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_Long_Press(self):
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        self.wdt.feed()
+        Vbatt = Power.getVbatt()
+        if self.usb_charge_flag == 0 and self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]:#充电充满
+            EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+            #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+            self.usb_charge_flag = 1
+        if self.usb_charge_flag == 0 and self.usb_status == 0 and Vbatt<self.VBATT_tab[10]:#低电报警
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+            self.usb_charge_flag = 1
+        pass
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab[90]:
+            return 100
+        if Vbatt>self.VBATT_tab[80]:
+            return 90
+        if Vbatt>self.VBATT_tab[60]:
+            return 80
+        if Vbatt>self.VBATT_tab[40]:
+            return 60
+        if Vbatt>self.VBATT_tab[20]:
+            return 40
+        if Vbatt>self.VBATT_tab[10]:
+            return 20
+        if Vbatt<=self.VBATT_tab[10]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        if len(iccid) > 5:
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        self.ntptime_flag = 0
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self):
+        url = "http://dmp.raisound.com/bz-api/dev/time"
+        response = request.get(url)
+        data = response.json()
+        print("dev_NTP:{}".format(data))
+        if data:
+            try:
+                timeSecond = data["data"]["timestamp"]//1000
+                
+                next_alarm_time = utime.localtime(timeSecond)
+                print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+            except Exception as e:
+                    usys.print_exception(e)
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        if self.dev_token == None:
+            if self.ntptime_flag == 0:
+                self.ntptime_flag  = 1
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+            self.dev_active() #设备激活
+            self.dev_sign_in() #设备登入
+            self.dev_res_timerCount+=1
+            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                self.dev_res_timerCount=0
+                self.dev_res_timer.stop()
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        #print("ud_token_timer_!!!!")
+        self.ud_token_timer_Count+=1
+        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token
+            self.ud_token_timer_Count = 0
+            EventMesh.publish("update_dev_token")
+            
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            date_tmp = utime.localtime() #获取当前时间
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+            deviceId = self.deviceId #"876226002022574" #以imei号
+            pid = self.pid
+            key = self.key
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+            print("sign_data:{}\r\n".format(sign_data))
+            sha256_hex = self.get_hmac_sha256(key,sign_data)
+            print("sha256_hex:{}\r\n".format(sha256_hex))
+
+            data = {
+                "deviceId":"{}".format(deviceId), #设备名
+                "pid":pid, #产品PID
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                "timeStamp":timeStamp, #要以ms的形式
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+            }
+            print(ujson.dumps(data))
+            headers_T ={"Content-Type":"application/json"}
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+            data =ujson.dumps(data)
+            response = 0
+            response_result = 0
+            try:
+                response = request.put(url,data=data,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("put error!!!!!\r\n")
+                response_result = 0
+            
+            IV = "" #偏移量
+            PASSWORD= "" #服务器返回后的加密内容 密码
+            if response_result == 1: #访问成功ip
+                if response.status_code == 200:
+                    print("headers:{}".format(response.headers))
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    data =  ujson.loads(c)
+                    # data = response.json()
+                    print("data-{}".format(data))
+                    if data != None:
+                        if "success" in data:
+                            if data['success'] == True:
+                                if "data" in data:
+                                    data_tmp = data["data"]
+                                    if "nonce" in data_tmp: #偏移量
+                                        IV = data_tmp["nonce"]
+                                    if "password" in data_tmp:
+                                        PASSWORD = data_tmp["password"]
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                            if data["code"] == 20001:#鉴权成功
+                                pass
+                            elif data["code"] > 50000:#时间错误
+                                self.res_error_count+=1
+                                if self.res_error_count>=3:
+                                    self.res_error_count = 0
+                                    #EventMesh.publish("paly_device_res_error")
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                    if PASSWORD != None and IV != None:
+                        if len(PASSWORD) != 0 and len(IV) != 0:
+                            password = PASSWORD
+                            iv = IV
+                            #解密 之后保存本地下一次登入做使用
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                            print("decrypt_data {}".format(decrypt_data))
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])
+                    
+                        
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        token = ""
+        token = self.dev_token
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+        #print("token:{}\r\n".format(token))
+        if token == None:
+            token = ""
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0:#没有密码
+            return
+        if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)
+                    response_result = 1
+                except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(token))
+                pass
+    #获取新的令牌 更新token
+    def update_dev_token(self, event, msg):
+        print("update_dev_token")
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0: #没有密码走激活
+            print("no dev_pass:{}\r\n".format(dev_pass))
+            self.dev_active()
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) == 0: #没有token走登入
+            print("no dev_token:{}\r\n".format(token))
+            self.dev_sign_in()
+
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) != 0:
+            response_result=0
+            response = 0
+            headers_T = {"bz-dt":"{}".format(token)}
+            try:
+                response = request.get(dev_tokenip,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("get error!!!!!\r\n")
+                response_result = 0
+            if response_result == 1:
+                if response.status_code == 200:
+                    try:
+                        headers_data = response.headers
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                            bz_dt = headers_data["bz-dt"] 
+                            self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                            print("update_dev_token:{}".format(self.dev_token))
+                    except Exception as e:
+                        print("headers_data!!!!! error\r\n")
+        
+        pass
+
+
+
+
+#阿里voice_chat状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechEnd=3#说结束
+VC_State_Thinking=4#想(chat)
+VC_State_Responding=5#音频播放
+VC_State_TTSStart=6
+VC_State_TTSData=7
+VC_State_TTSFinish=8
+VC_State_TTSEnd=9
+VC_State_TTSError=10
+VC_State_DialogError=11
+VC_State_End=12
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_voice_chat_num = 3
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置
+        if self.VC_mode == None :
+            self.VC_mode = 0
+
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        #女,男,童,粤,川
+        self.VC_TTS_voice_type = {0:"huoshan::zh_female_xinlingjitang_moon_bigtts",1:"huoshan::zh_male_wennuanahu_moon_bigtts",2:"huoshan::ICL_zh_female_huoponvhai_tob",
+                                  3:"aliyun::longjiaxin",4:"huoshan::zh_female_daimengchuanmei_moon_bigtts"}
+        #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置
+        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):
+            self.VC_TTS_voice_num = 0
+         
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_send_data_queue_thread_id = 0
+
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        self.AI_TTS_str = ""
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_send_data_queue_thread_id == 0:    
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
+        self.VC_dialog_id = ""
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_voice_chat = None
+        self.AI_client_voice_chat_recv_id = 0
+        self.AI_client_voice_chat_isconnect =0
+
+        self.AI_client_ASR = None
+        self.AI_client_ASR_recv_id = 0
+        self.AI_client_ASR_isconnect =0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.pingping_timerout = 0
+        
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_voice_chat_count = 0
+        self.play_data_len = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        
+        EventMesh.publish("close_led")
+        #开机提示语,如果联网失败,直接提示信号弱
+        #女,男,童,粤,川
+        self.bot_name = "柒先生"
+        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
+            self.bot_name = "柒妹妹"
+        elif self.VC_TTS_voice_num == 1:
+            self.bot_name = "柒先生"
+        elif self.VC_TTS_voice_num == 2:
+            self.bot_name = "柒思思"
+        self.AI_TTS_str = "您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press voiceCall")
+        self.aud.aud_tone_play(16,200)#播放按键音
+        # import voiceCall
+        # voiceCall.callStart("10086")
+        # return 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        if self.AI_key_long_press_flag == 1 :#有长按
+            self.AI_client_voice_chat_end_speech()
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+                self.AI_send_data_queue.clear()
+                try:
+                    self.websocket_deconnect_voice_chat()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+#**********************************ASR连接**********************************************************
+    def websocket_connect_ASR(self):
+        print("websocket_connect_ASR:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_ASR_isconnect))
+        if self.AI_client_ASR_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error_ASR()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_ASR = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1 or self.VC_server == 2:# 
+                self.AI_client_ASR = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws', debug=False)#测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_ASR = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=False)
+                else:
+                    self.websocket_error_ASR()
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_ASR error!!!\r\n")
+            #self.connect_timerout_popup(2)
+            
+            
+        if self.AI_client_ASR == None:
+            EventMesh.publish("update_dev_token")#获取token
+            return
+        
+        # 线程接收数据
+        if self.AI_client_ASR_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_ASR_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_ASR_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_ASR_recv_id = _thread.start_new_thread(self.AI_client_ASR_recv, (self.AI_client_ASR,))
+        _thread.stack_size(8*1024)
+        self.AI_client_ASR_isconnect = 1
+    def websocket_error_ASR(self):
+        print("websocket_error_ASR!!!!")
+        print("websocket_error_ASR!!!!")
+        EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+        self.AI_send_data_queue.clear()
+        self.AI_audio_queue.clear()
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        try:
+            self.websocket_deconnect_ASR()
+        except Exception as e:
+                usys.print_exception(e)
+
+    def websocket_deconnect_ASR(self):
+        print("websocket_deconnect_ASR {}!!!!!!!".format(self.AI_client_ASR_isconnect))
+        print("websocket_deconnect_ASR!!!!!!!")
+        if self.AI_client_ASR_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_ASR_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_ASR_recv_id = 0
+        if self.AI_client_ASR_isconnect == 1:
+            self.AI_client_ASR_isconnect = 0
+            self.AI_client_ASR.close()
+        print("websocket_deconnect_ASR {}!!!!!!!".format(self.AI_client_ASR_isconnect))
+        #Ai ASR websocket返回数据       
+    def AI_client_ASR_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("AI_client_ASR_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_ASR_isconnect = 0
+                    #self.websocket_deconnect_ASR()
+                    break
+                try:
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("ASR:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        
+                    
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error_ASR()
+                    
+                    break
+        self.AI_client_ASR_isconnect = 0
+        self.AI_client_ASR_recv_id = 0 
+    
+#****************************************VC连接**********************************************************************
+    def websocket_connect_voice_chat(self):
+        print("websocket_connect_voice_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        if self.AI_client_voice_chat_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error_voice_chat()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-hk', debug=False)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn-sc', debug=False)#四川话测试环境
+                else :
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)
+                else:
+                    self.websocket_error_voice_chat()
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)
+            self.websocket_error_voice_chat()
+            return
+        if self.AI_client_voice_chat == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error_voice_chat()
+            return
+        
+        # 线程接收数据
+        if self.AI_client_voice_chat_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_voice_chat_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))
+        _thread.stack_size(8*1024)
+        self.AI_client_voice_chat_isconnect = 1
+    def websocket_error_voice_chat(self):
+        print("websocket_error_voice_chat!!!!")
+        print("websocket_error_voice_chat!!!!")
+        print("websocket_error_voice_chat!!!!")
+        print("websocket_error_voice_chat!!!!")
+        self.websocket_error_voice_chat_count+=1
+        if self.websocket_error_voice_chat_count <=3:
+            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+        elif self.websocket_error_voice_chat_count <10 :
+            EventMesh.publish("audio_montage_play",["xinhaoruo2.mp3"])
+        elif self.websocket_error_voice_chat_count >=10:
+            EventMesh.publish("paly_iccid_imei")    
+        else:
+            EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+        self.AI_send_data_queue.clear()
+        self.AI_audio_queue.clear()
+        self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+                usys.print_exception(e)
+
+    def websocket_deconnect_voice_chat(self):
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        print("websocket_deconnect_voice_chat!!!!!!!")
+        if self.AI_client_voice_chat_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_voice_chat_recv_id = 0
+        if self.AI_client_voice_chat_isconnect == 1:
+            self.AI_client_voice_chat_isconnect = 0
+            self.AI_client_voice_chat.close()
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+    #websocket发送ping
+    def AI_client_voice_chat_ping(self):
+        pass
+        if self.AI_client_voice_chat_isconnect == 1:
+            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')
+            self.AI_client_voice_chat_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_voice_chat_send(self,data_str):
+        if isinstance(data_str, str):#是字符串
+            print("AI_client_voice_chat_send:{}".format(data_str))
+            pass
+        # else:
+        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) 
+    
+    #Ai VC websocket返回数据       
+    def AI_client_voice_chat_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("AI_client_voice_chat_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_deconnect_voice_chat()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error_voice_chat}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                    break
+                try:
+                    self.websocket_error_voice_chat_count = 0
+                    print("AI_client_voice_chat_recv 1")
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            self.websocket_error_voice_chat()
+                            break
+                        if jsload_data["event"] == "Started" :#会话开始
+                            payload = jsload_data["payload"]
+                            self.VC_dialog_id = payload["dialog_id"] 
+                            self.VC_task_id = jsload_data["task_id"] 
+                            print("VC:Started!!!!!!!!\r\n")
+                        if jsload_data["event"]  == "SpeechContent" :#asr转译
+                            print("VC:SpeechContent!!!!!!!!\r\n")
+                            payload = jsload_data["payload"]
+                            
+                            
+                            if(payload['finished'] == True):#asr结束
+                                self.voice_chat_state =  VC_State_SpeechEnd
+                                self.VC_Speech_End()#停止录音
+                                text = payload["text"]
+                                if self.check_text(text) == 0:
+                                    print("check_text ok:{}".format(text))
+                                    self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                
+                                pass
+                            else:
+                                self.AI_listen_end = 0
+
+                        if jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                            self.voice_chat_state =  VC_State_SpeechEnd
+                        if jsload_data["event"]  == "RespondingContent" :#chat回答      
+                            
+                            payload = jsload_data["payload"]
+                            self.AI_label_str=str(payload['text'])#chat文本
+                            self.AI_client_chat_play_str=str(payload['text'])
+                            self.AI_client_tts_str_sen = str(payload['text'])
+
+                            if(payload['finished'] == True):#chat回答 结束,开始tts
+                                pass
+                            #utime.sleep_ms(5)
+                            
+                        if jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.play_flag = 0
+                            self.voice_chat_state = VC_State_TTSStart
+                            self.VC_Play_Start()
+                            self.play_data_len = 0
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                            pass
+                        if jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            if self.voice_chat_state == VC_State_TTSStart:
+                                self.voice_chat_state = VC_State_TTSEnd
+                            #self.tts_fd.close()
+                            pass
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                            payload = jsload_data["payload"]
+                            if payload["state"] == "Listening":
+                                self.voice_chat_state = VC_State_Listening
+                                if self.AI_TTS_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                                    self.AI_client_voice_chat_RequestToRespond(self.AI_TTS_str)
+                                    self.AI_TTS_str = ""
+                                else:
+                                    self.AI_client_voice_chat_send_speech()#开始上传语音
+                                EventMesh.publish("open_led_red")
+                            if payload["state"] == "Thinking":#准备开始TTS
+                                self.voice_chat_state = VC_State_Thinking
+                                
+                                self.AI_label_str = ""
+                                EventMesh.publish("open_led_all")
+                            if payload["state"] == "Responding":
+                                self.voice_chat_state = VC_State_Responding
+                                EventMesh.publish("open_led_green")
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                            #self.voice_chat_state =  VC_State_Responding
+                            #self.AI_client_voice_chat_send_speech()#开始上传语音
+                            pass
+                    else:#下发音频数据
+                        self.play_data_len += len(recv_data)
+                        print("下发音频数据1:{} all:{}".format(len(recv_data),self.play_data_len))
+                        if self.voice_chat_state >= VC_State_TTSStart:
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                    print("AI_client_voice_chat_recv 2")
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error_voice_chat()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error_voice_chat}) 
+                    break
+        self.AI_client_voice_chat_isconnect = 0
+        self.AI_client_voice_chat_recv_id = 0 
+        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        ret=self.AI_audio_queue.put(data)
+        print("下发音频数据2:{}".format(len(data[0])))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("更改声音") != -1:
+                    self.VC_TTS_voice_num += 1
+                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):
+                        self.VC_TTS_voice_num = 0
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功"    
+                    return 0
+                if text.find("声音改为") != -1 and (text.find("男声") != -1 or text.find("男生") != -1 ):
+                    self.VC_TTS_voice_num = 1
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("女声") != -1 or text.find("女生") != -1 ):
+                    self.VC_TTS_voice_num = 0
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("同声") != -1 or text.find("童声") != -1 ):
+                    self.VC_TTS_voice_num = 2
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("粤语") != -1 or text.find("越野") != -1 ):
+                    self.VC_TTS_voice_num = 3
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and text.find("四川话") != -1 :
+                    self.VC_TTS_voice_num = 4
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1 and text.find("加大") != -1 :
+                    self.VC_TTS_volume += 10
+                    if self.VC_TTS_volume > 100:
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                        self.AI_TTS_str = "音量已最大" 
+                        self.VC_TTS_volume = 100
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        
+                    return 0
+                if text.find("音量") != -1 and text.find("减小") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已最小"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                    return 0
+                if text.find("电量") != -1 and text.find("查询") != -1:
+                    battery = EventMesh.publish("get_battery")
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                    return 0
+                if text.find("电压") != -1 and text.find("查询") != -1:
+                    Vbatt = Power.getVbatt()
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                    return 0
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return -1
+                if text.find("信号") != -1 and text.find("查询") != -1:
+                    signal = net.csqQueryPoll()
+                    
+                    self.AI_TTS_str = "当前信号{}".format(signal)
+                    return 0
+                
+                if text.find("再见") != -1 or text.find("拜拜") != -1:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id
+    
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    #self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+    #开始录音
+    def VC_Speech_Start(self):
+        #self.voice_chat_state =  VC_State_SpeechStart
+        print("VC_Speech_Start VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))  
+        if self.VC_record_state_flag  == 0:
+            if self.VC_record_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.VC_record_thread_id)
+                except Exception as e:
+                        usys.print_exception(e)
+                self.VC_record_thread_id = 0
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+            _thread.stack_size(8*1024)
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                try :
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                except Exception as e:
+                        usys.print_exception(e)
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+                # if self.record_pcm == None:        
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                #     print("audio.Audio.PCM:ret:{}".format(ret))
+                #     ret = self.record_pcm.stream_read_start()
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+            self.VC_record_state_flag = 1
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.voice_chat_state =  VC_State_SpeechEnd
+        if self.VC_record_thread_id != 0:
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.VC_record_thread_id = 0
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_voice_chat_send(h_data_b)
+        while True:
+            try:
+                # 死循环接收数据
+                #if self.voice_chat_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    # if self.record_pcm ==None:
+                    #     break
+                    # Record_len = self.record_pcm.stream_read(Record_read_buf, self.Audio_buf_size)
+                    # if Record_len <= 0:
+                    #     try:
+                    #         if self.record_pcm != None:
+                    #             try:
+                    #                 self.record_pcm.stream_stop()
+                    #                 self.record_pcm.close()
+                    #                 self.record_pcm = None
+                    #             except Exception as e:
+                    #                 usys.print_exception(e)
+                    #         if self.record_pcm == None:        
+                    #             ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                    #             print("audio.Audio.PCM:ret:{}".format(ret))
+                    #             ret = self.record_pcm.stream_read_start()
+                    #             print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                    #     except Exception as e:
+                    #         usys.print_exception(e)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(1000)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    #fd.write(read_buf)
+                    #record_data_queue.put(read_buf)
+                    
+                    if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
+                        self.AI_record_tmp_queue.put(read_buf)
+                    else:
+                        while True:
+                            if self.AI_record_tmp_queue.empty() == True:
+                                break
+                            else:
+                                self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                        self.AI_client_voice_chat_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_voice_chat_end_speech()
+                #     break
+                utime.sleep_ms(40)
+                if self.voice_chat_state >=  VC_State_SpeechEnd:
+                    break
+            except Exception as e:
+                    usys.print_exception(e)
+                    break
+        # while True:
+        #     if record_data_queue.empty()!=True:
+        #         self.AI_client_voice_chat_send(record_data_queue.get())   
+        #     else:
+        #         break
+        #self.AI_client_voice_chat_end_speech()
+        #fd.close()
+
+        #if self.AI_TYPE == AI_TYPE_voice_chat:
+        
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 30:#20秒没数据就close
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        #self.LocalRespondingEnded_timerout+=1
+        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束
+            self.LocalRespondingEnded_timerout += 1
+        if self.LocalRespondingEnded_timerout >= 3:
+            self.LocalRespondingEnded_timerout = 0
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+            else:
+                #通知服务器播放结束
+                self.AI_client_voice_chat_LocalRespondingEnded()
+        self.pingping_timerout+=1
+        if self.pingping_timerout>5:
+            self.pingping_timerout=0
+            self.AI_client_voice_chat_ping()
+        
+    #VC开始
+    def AI_VC_start(self):
+        
+        self.VC_Play_End()#关闭音频播放
+        #self.VC_init()#关闭一些资源
+        if self.VC_mode == 1:
+            if self.AI_TTS_str == "":
+                self.VC_init2()#关闭一些资源
+        
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+        
+        #utime.sleep_ms(50)
+        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_voice_chat()#连接服务器
+            self.AI_client_voice_chat_start_requset()
+        else:
+            print("self.voice_chat_state :{}".format(self.voice_chat_state ))
+            if self.voice_chat_state > VC_State_SpeechStart:
+                #客户端打断对话
+                self.AI_client_voice_chat_RequestToSpeak()
+            else:#本身处于录音状态
+                return
+
+        self.voice_chat_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始录音
+            self.VC_Speech_Start()
+        #self.websocket_connect_voice_chat()#连接服务器
+        #self.AI_client_voice_chat_start_requset()
+        
+        
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.pingping_timerout = 0
+        
+        
+    #开始会话
+    def AI_client_voice_chat_start_requset(self):
+        
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Start"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "device_id":modem.getDevImei(),
+                "user_agent":"python",
+                "in_format":"pcm",
+                "out_format":"mp3",
+                "in_sample_rate":self.VC_record_samplerate,
+                "sample_rate":self.VC_play_samplerate,
+                "space_time": 100,
+                "volume": str(self.VC_TTS_volume),
+                "voice":self.VC_TTS_voice_type[self.VC_TTS_voice_num],
+                "voice_detection":"enabled",
+                "simple_response":True,
+                "custom_variables":{
+                "bot_name":"{}".format(self.bot_name)
+                },
+            
+            }
+        }
+
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["in_format"]='amr'
+            pass
+        if self.VC_mode == 1:
+            json_data["payload"]["voice_detection"]='disable'
+        self.voice_chat_state = VC_State_None
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_voice_chat_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id
+            }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.voice_chat_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_voice_chat_end_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"StopSpeech"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_End()#停止线程录音
+
+    #通知服务器开始播放
+    def AI_client_voice_chat_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_voice_chat_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.voice_chat_state = VC_State_End
+    #客户端打断对话
+    def AI_client_voice_chat_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS事件
+    def AI_client_voice_chat_RequestToRespond(self,text):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":text
+                }
+        }
+        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #发送数据队列
+    def AI_send_data_queue_thread(self):
+        print("AI_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_send_data_queue.empty() :
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_send_data_queue_thread:get")
+                data = self.AI_send_data_queue.get()
+                #print("AI_send_data_queue_thread:get2")
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))
+                        if data[0] == AI_client_voice_chat_num:
+                            # if self.AI_client_voice_chat_isconnect == 0:
+                            #     try:
+                            #         self.websocket_connect_voice_chat() 
+                            #     except Exception as e: #网络连接异常
+                            #         usys.print_exception(e)
+                            self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
+                                self.AI_client_voice_chat.send(data[1])
+                                #print("VC: send_data len:{}".format(len(data[1])))
+                            #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_voice_chat_num:
+                            #self.websocket_error_voice_chat()
+                            pass
+                            #self.websocket_deconnect_voice_chat()
+                            self.AI_client_voice_chat_isconnect = 0
+                            try:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error_voice_chat}) 
+                                EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1000)})
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e) 
+                         
+    ############################################
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                # if self.AI_send_data_queue_thread_id == 0:
+                #     break
+                # print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    utime.sleep_ms(5)
+                    count+=1
+                    if count%1000 == 1:
+                        print("AI_audio_queue_thread on")
+                else:
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_voice_chat_LocalRespondingStarted!!!")
+                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放
+                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+                                # if tmp != 0:
+                                #     print("playStream:WAV:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                #     # #播放失败的时候填充WAV头
+                                #     data_len = len(data[0])
+                                #     data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                #     h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                #             ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                #             ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                #             ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                #     h_data_b = bytes(h_data)
+                                #     file_len = data_len+len(h_data_b)+4+4
+                                #     file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                #     h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                #     #self.aud.playStream(2, h_data_b)#播放音频流
+                                #     tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                #     print("playStream2:WAV:tmp:{} !!!!!!!!!!!!".format(tmp))
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        print("play_pcm.stream_write:{}".format(ret))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            print("出:{}!!!".format(len(data[0])))
+                            mem = gc.mem_free()
+                            print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_voice_chat_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(1000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+    def Close(self):
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        self.VC_init()
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        try:
+        #销毁线程
+            if self.AI_audio_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_audio_queue_thread_id = 0
+            if self.AI_send_data_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_send_data_queue_thread_id = 0
+            
+
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+    def VC_init2(self):
+        self.VC_init()
+
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+
+    def VC_init(self):
+        
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+        self.AI_TTS_str = ""
+        print("VC_init2")
+        self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        EventMesh.publish("close_led")
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_G15.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_G15.py
new file mode 100644 (file)
index 0000000..40ecbb8
--- /dev/null
@@ -0,0 +1,2500 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+class AI_led(Abstract):
+    def __init__(self):
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        self.led_blue = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 1)
+        #=1 红灯闪,=2白灯闪,=3绿灯闪,=4全部灯闪
+        self.led_flicker_flag = 0
+        self.led_flicker_on_off_flag = 0
+        self.led_flicker_timer = osTimer()
+        
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_blue",self.open_led_blue)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("open_led_red_blue",self.open_led_red_blue)
+        EventMesh.subscribe("open_led_red_green",self.open_led_red_green)
+        EventMesh.subscribe("flicker_led_red",self.flicker_led_red)
+        EventMesh.subscribe("flicker_led_blue",self.flicker_led_blue)
+        EventMesh.subscribe("flicker_led_green",self.flicker_led_green)
+        EventMesh.subscribe("flicker_led_all",self.flicker_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+
+    def flicker_led_red(self,event,msg):
+        self.led_flicker_flag = 1
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_blue(self,event,msg):
+        self.led_flicker_flag = 2
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_green(self,event,msg):
+        self.led_flicker_flag = 3
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def flicker_led_all(self,event,msg):
+        self.led_flicker_flag = 4
+        self.led_flicker_timer.start(1500, 1, self.led_flicker_timer_cb)
+
+    def led_flicker_timer_cb_(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def led_flicker_timer_cb_(self):
+        if self.led_flicker_flag == 0:
+            self.led_flicker_timer.stop()
+            return
+        if self.led_flicker_on_off_flag == 0:
+            self.led_red.write(0)
+            self.led_blue.write(0)
+            self.led_green.write(0)
+            self.led_flicker_on_off_flag = 1
+        else:
+            self.led_flicker_on_off_flag = 0
+            if self.led_flicker_flag == 1:
+                self.led_blue.write(0)
+                self.led_green.write(0)
+                self.led_red.write(1)
+            elif self.led_flicker_flag == 2:
+                self.led_red.write(0)
+                self.led_green.write(0)
+                self.led_blue.write(1)
+            elif self.led_flicker_flag == 3:
+                self.led_red.write(0)
+                self.led_blue.write(0)
+                self.led_green.write(1)
+            elif self.led_flicker_flag == 4:
+                self.led_blue.write(1)
+                self.led_green.write(1)
+                self.led_red.write(1)
+
+    def open_led_red(self,event,msg):
+        #print("open_led_red")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_green(self,event,msg):
+        #print("open_led_green")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_red_blue(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(0)
+        self.led_blue.write(1)
+
+    def open_led_red_green(self,event,msg):
+        #print("open_led_blue")
+        self.led_flicker_flag = 0
+        self.led_red.write(1)
+        #self.led_blue.write(0)
+        self.led_green.write(1)
+        self.led_blue.write(0)
+
+    def open_led_all(self,event,msg):
+        #print("open_led_all")
+        self.led_flicker_flag = 0
+        #self.led_red.write(0)
+        self.led_blue.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        #print("close_led")
+        self.led_flicker_flag = 0
+        self.led_red.write(0)
+        self.led_blue.write(0)
+        self.led_green.write(0)
+
+audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']
+
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.is_wdt = 1 #是否开启看门狗
+        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        self.KeyAI_timer = osTimer()
+        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI = ExtInt(ExtInt.GPIO20,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        #self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        #self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        self.pwk_key.enable() 
+        self.btnInfo_queue = Queue(100)
+        self.btnInfo_queue_count = 0
+        _thread.stack_size(10*1024)
+        self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        if self.is_wdt == 1:
+            self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(5000, 1, self.wdt_timer_cb)
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        self.aud = audio.Audio(0)
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                #EventMesh.publish("flicker_led_red")#充电闪灯
+                #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                EventMesh.publish("open_led_red")#充电红灯常亮
+                EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+            if VC_satrt_flag == None:
+                VC_satrt_flag = 0
+            if VC_satrt_flag == 0:
+                self.aud.stop()
+                EventMesh.publish("close_led")
+                EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+                #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            self.btnInfo_queue_count-=1
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        self.btnInfo_queue.put(msg)
+        self.btnInfo_queue_count+=1
+        if self.btnInfo_queue_count > 80:
+            self.btnInfo_queue_count =0
+            print("事件处理线程队列出问题,重启!!!!!!!!!!!!!!")
+            print("线程:{} 队列:{}".format(_thread.threadIsRunning(self.btnInfo_queue_thread_id),self.btnInfo_queue.size()))
+            # if _thread.threadIsRunning(self.btnInfo_queue_thread_id):
+            #     _thread.stop_thread(self.btnInfo_queue_thread_id)
+            # _thread.stack_size(10*1024)
+            # self.btnInfo_queue_thread_id = _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            # _thread.stack_size(8*1024)
+            # self.btnInfo_queue.clear()
+            # self.btnInfo_queue = Queue(100)
+            EventMesh.publish("VC_error") #播放报错
+            utime.sleep_ms(1000)
+            Power.powerRestart()
+            EventMesh.publish("set_storage_config",["powerRestart",1])
+            
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_timer_cb_})
+    # def pwk_key_timer_cb_(self) :
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                if self.pwk_key_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    self.aud.aud_tone_play(10,200)#播放按键音
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+    #     EventMesh.publish("publish_AI_btnInfo",{"func":self.KeyAI_timer_cb_})
+    # def KeyAI_timer_cb_(self):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_Long_Press(self):
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    
+    def wdt_timer_cb(self, *args, **kwargs):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        print("AI_dev_timer_cb")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        if self.is_wdt == 1:
+            self.wdt.feed()
+        VC_satrt_flag = EventMesh.publish("get_VC_satrt_flag")#获取vc是否在运行
+        if VC_satrt_flag == None:
+            VC_satrt_flag = 0
+        Vbatt = Power.getVbatt()
+        if self.usb_status == 1 and VC_satrt_flag == 0:
+            EventMesh.publish("open_led_red")#充电红灯常亮
+        if  self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]and VC_satrt_flag == 0:#充电充满
+            EventMesh.publish("open_led_green")
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+                #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+                self.usb_charge_flag = 1
+        if  self.usb_status == 0 and Vbatt<self.VBATT_tab[20]and VC_satrt_flag == 0:#低电报警
+            EventMesh.publish("flicker_led_red")
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            if self.usb_charge_flag == 0 :
+                EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+                self.usb_charge_flag = 1
+        
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab[90]:
+            return 100
+        if Vbatt>self.VBATT_tab[80]:
+            return 90
+        if Vbatt>self.VBATT_tab[60]:
+            return 80
+        if Vbatt>self.VBATT_tab[40]:
+            return 60
+        if Vbatt>self.VBATT_tab[20]:
+            return 40
+        if Vbatt>self.VBATT_tab[10]:
+            return 20
+        if Vbatt<=self.VBATT_tab[10]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        if iccid != -1 and len(iccid) > 5:
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        self.ntptime_flag = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        EventMesh.subscribe("dev_active", self.dev_active)
+        EventMesh.subscribe("dev_sign_in", self.dev_sign_in)
+        EventMesh.subscribe("dev_NTP", self.dev_NTP)
+        EventMesh.publish_async("dev_NTP",thread_size = 8192)
+        count = 0
+        while True:
+            if self.ntptime_flag == 1:
+                break
+            utime.sleep_ms(1)
+            count+=1
+            if count>600:
+                break
+        EventMesh.publish_async("dev_active",thread_size = 8192)
+        EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+        # self.dev_active() #设备激活
+        # self.dev_sign_in() #设备登入
+        
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self, event, msg):
+        url = "http://dmp.raisound.com/bz-api/dev/time"
+        response = request.get(url)
+        data = response.json()
+        print("dev_NTP:{}".format(data))
+        if data:
+            try:
+                timeSecond = data["data"]["timestamp"]//1000
+                
+                next_alarm_time = utime.localtime(timeSecond)
+                print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+                self.ntptime_flag  = 1
+            except Exception as e:
+                    usys.print_exception(e)
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        if self.dev_token == None:
+            if self.ntptime_flag == 0:
+                self.ntptime_flag  = 1
+                EventMesh.publish_async("dev_NTP",thread_size = 8192)
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+            EventMesh.publish_async("dev_active",thread_size = 8192)
+            EventMesh.publish_async("dev_sign_in",thread_size = 8192)
+            # self.dev_active() #设备激活
+            # self.dev_sign_in() #设备登入
+            self.dev_res_timerCount+=1
+            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                self.dev_res_timerCount=0
+                self.dev_res_timer.stop()
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        #print("ud_token_timer_!!!!")
+        self.ud_token_timer_Count+=1
+        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token
+            self.ud_token_timer_Count = 0
+            EventMesh.publish_async("update_dev_token",thread_size = 8192)
+            
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self, event, msg):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            date_tmp = utime.localtime() #获取当前时间
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+            deviceId = self.deviceId #"876226002022574" #以imei号
+            pid = self.pid
+            key = self.key
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+            print("sign_data:{}\r\n".format(sign_data))
+            sha256_hex = self.get_hmac_sha256(key,sign_data)
+            print("sha256_hex:{}\r\n".format(sha256_hex))
+
+            data = {
+                "deviceId":"{}".format(deviceId), #设备名
+                "pid":pid, #产品PID
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                "timeStamp":timeStamp, #要以ms的形式
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+            }
+            print(ujson.dumps(data))
+            headers_T ={"Content-Type":"application/json"}
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+            data =ujson.dumps(data)
+            response = 0
+            response_result = 0
+            try:
+                response = request.put(url,data=data,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("put error!!!!!\r\n")
+                response_result = 0
+            
+            IV = "" #偏移量
+            PASSWORD= "" #服务器返回后的加密内容 密码
+            if response_result == 1: #访问成功ip
+                if response.status_code == 200:
+                    print("headers:{}".format(response.headers))
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    data =  ujson.loads(c)
+                    # data = response.json()
+                    print("data-{}".format(data))
+                    if data != None:
+                        if "success" in data:
+                            if data['success'] == True:
+                                if "data" in data:
+                                    data_tmp = data["data"]
+                                    if "nonce" in data_tmp: #偏移量
+                                        IV = data_tmp["nonce"]
+                                    if "password" in data_tmp:
+                                        PASSWORD = data_tmp["password"]
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                            if data["code"] == 20001:#鉴权成功
+                                pass
+                            elif data["code"] > 50000:#时间错误
+                                self.res_error_count+=1
+                                if self.res_error_count>=3:
+                                    self.res_error_count = 0
+                                    EventMesh.publish("paly_device_res_error")
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                    if PASSWORD != None and IV != None:
+                        if len(PASSWORD) != 0 and len(IV) != 0:
+                            password = PASSWORD
+                            iv = IV
+                            #解密 之后保存本地下一次登入做使用
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                            print("decrypt_data {}".format(decrypt_data))
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])
+                    
+                        
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self, event, msg):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        token = ""
+        token = self.dev_token
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+        #print("token:{}\r\n".format(token))
+        if token == None:
+            token = ""
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0:#没有密码
+            return
+        if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)
+                    response_result = 1
+                except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(token))
+                pass
+    #获取新的令牌 更新token
+    def update_dev_token(self, event, msg):
+        print("update_dev_token")
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0: #没有密码走激活
+            print("no dev_pass:{}\r\n".format(dev_pass))
+            EventMesh.publish("dev_active")
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) == 0: #没有token走登入
+            print("no dev_token:{}\r\n".format(token))
+            #self.dev_sign_in()
+            EventMesh.publish("dev_sign_in")
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) != 0:
+            response_result=0
+            response = 0
+            headers_T = {"bz-dt":"{}".format(token)}
+            try:
+                response = request.get(dev_tokenip,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("get error!!!!!\r\n")
+                response_result = 0
+            if response_result == 1:
+                if response.status_code == 200:
+                    try:
+                        headers_data = response.headers
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                            bz_dt = headers_data["bz-dt"] 
+                            self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                            print("update_dev_token:{}".format(self.dev_token))
+                    except Exception as e:
+                        print("headers_data!!!!! error\r\n")
+        
+        pass
+
+
+
+
+#阿里voice_chat状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechEnd=3#说结束
+VC_State_Thinking=4#想(chat)
+VC_State_Responding=5#音频播放
+VC_State_TTSStart=6
+VC_State_TTSData=7
+VC_State_TTSFinish=8
+VC_State_TTSEnd=9
+VC_State_TTSError=10
+VC_State_DialogError=11
+VC_State_End=12
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_voice_chat_num = 3
+AI_client_asr_num = 4
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.play_data_save_flag = 0 #是否保存tts数据到文件
+        self.record_fd = None
+        self.play_fd = None
+        self.is_VC_ACK = 0 #是否开启ack应答模式
+        
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置
+        if self.VC_mode == None :
+            self.VC_mode = 0
+
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        self.VC_TTS_voice_type = EventMesh.publish("get_storage_config","VC_TTS_voice_type")#音色配置
+        if self.VC_TTS_voice_type == None:
+            #女,男,童,粤,川
+            self.VC_TTS_voice_type = {"0":"huoshan::zh_female_wanwanxiaohe_moon_bigtts","1":"huoshan::zh_male_wennuanahu_moon_bigtts","2":"huoshan::ICL_zh_female_huoponvhai_tob",
+                                    "3":"aliyun::longjiaxin","4":"huoshan::zh_female_daimengchuanmei_moon_bigtts"}
+            # self.VC_TTS_voice_type = {0:"zh_female_xinlingjitang_moon_bigtts",1:"zh_male_wennuanahu_moon_bigtts",2:"ICL_zh_female_huoponvhai_tob",
+            #                           3:"aliyun::longjiaxin",4:"zh_female_daimengchuanmei_moon_bigtts"}
+            #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+            EventMesh.publish("set_storage_config",["VC_TTS_voice_type",self.VC_TTS_voice_type])
+
+        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置
+        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):
+            self.VC_TTS_voice_num = 1
+         
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_send_data_queue_thread_id = 0
+
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_send_data_queue_thread_id == 0:    
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
+        self.VC_dialog_id = ""
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_voice_chat = None
+        self.AI_client_voice_chat_recv_id = 0
+        self.AI_client_voice_chat_isconnect =0
+        self.AI_client_voice_chat_debug =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR voice_chat状态
+        self.VC_asr_dialog_id = ""
+        self.VC_asr_message_id=None
+        self.VC_asr_task_id =None
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_isconnect =0
+        self.AI_ASR_timer =  osTimer()
+        self.AI_ASR_timer_count = 0
+        self.AI_client_asr_debug =0
+        self.VC_Thinking_timerout = 0
+        self.asr_satrt_flag = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        self.VC_satrt_flag = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        EventMesh.subscribe("get_VC_satrt_flag", self.get_VC_satrt_flag)
+        EventMesh.subscribe("VC_error", self.VC_error)
+
+        EventMesh.publish("close_led")
+        #开机提示语,如果联网失败,直接提示信号弱
+        #女,男,童,粤,川
+        self.bot_name = "柒先生"
+        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
+            self.bot_name = "柒妹妹"
+        elif self.VC_TTS_voice_num == 1:
+            self.bot_name = "柒先生"
+        elif self.VC_TTS_voice_num == 2:
+            self.bot_name = "柒乐乐"
+        #EventMesh.publish("get_storage_config",["powerRestart",1])
+        powerRestart =  EventMesh.publish("get_storage_config","powerRestart")#音量配置
+        if powerRestart == None:
+            powerRestart = 0
+        if powerRestart == 1:
+            EventMesh.publish("get_storage_config",["powerRestart",0])
+            
+        else:
+            self.AI_TTS_str = "已开机,您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def get_VC_satrt_flag(self, event, msg):
+        return self.VC_satrt_flag
+    
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        #self.aud.aud_tone_play(10,200)#播放按键音
+        self.asr_satrt_flag = 1#
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        # if self.voice_chat_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        if self.VC_record_state_flag >1:#如果在录音,就先停止录音
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})  
+            
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        if self.AI_key_long_press_flag == 1 :#有长按
+            self.AI_client_voice_chat_end_speech()
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                try:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                except Exception as e:
+                    usys.print_exception(e)
+                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+
+                
+                #self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def VC_error(self, event, msg):#错误播报
+        self.websocket_error()
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+#****************************************ASR连接**********************************************************************
+    def websocket_connect_asr(self):
+        print("websocket_connect_asr:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,self.AI_client_asr_debug))
+        if self.AI_client_asr_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws', debug=True)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=huoshao&lang=zh-cn', debug=True)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=huoshan&lang=zh-hk', debug=True)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=huoshan&lang=zh-cn-sc', debug=True)#四川话测试环境
+                else :
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=huoshan&lang=zh-cn', debug=True)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=True)
+                else:
+                    pass
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)  
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                self.websocket_error()
+                utime.sleep_ms(1000)
+                Power.powerRestart()
+                EventMesh.publish("set_storage_config",["powerRestart",1])
+            self.websocket_error()
+            
+            return
+        if self.AI_client_asr == None:
+            EventMesh.publish_async("update_dev_token",thread_size = 8192)#获取token
+            return 
+        self.AI_client_asr_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_asr.settimeout(6)
+        # 线程接收数据
+        if self.AI_client_asr_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_asr_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
+        _thread.stack_size(8*1024)
+        self.AI_client_asr_isconnect = 1
+        print("websocket_connect_asr:OK!!!!!!!!!!!!!!!!!!!!!")
+
+    def websocket_deconnect_asr(self):
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+        print("websocket_deconnect_asr!!!!!!!")
+        if self.AI_client_asr_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_asr_recv_id = 0
+        if self.AI_client_asr_isconnect == 1 or self.AI_client_asr!= None:
+            self.AI_client_asr_isconnect = 0
+            self.AI_client_asr.close()
+            self.AI_client_asr = None
+            self.AI_client_asr_debug-=1
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+
+    #websocket发送数据    
+    def AI_client_asr_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("ASR ASR AI_client_asr_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     pass
+        #     #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_asr_num,data_str]) 
+    def AI_client_asr_ping(self):
+        pass
+        if self.AI_client_asr_isconnect == 1:
+            #self.AI_client_asr.write_frame(0x09,b'ping ping')
+            self.AI_client_asr_send("ping")
+
+    def AI_ASR_timer_cb(self, *args): #
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_ASR_timer_cb_}) 
+
+    def AI_ASR_timer_cb_(self):    
+        if self.VC_record_state_flag == 3:
+            self.AI_ASR_timer_count+=1
+            if self.AI_ASR_timer_count >=10 :#10*500ms终止asr
+                print("AI_ASR_timer_count timerout!!!!!")
+                #self.AI_client_asr_StopTranscription_requset()
+
+                self.AI_ASR_timer.stop()
+        else:
+            self.AI_ASR_timer.stop()
+    #Ai VC websocket返回数据       
+    def AI_client_asr_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("AI_client_asr_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_deconnect_voice_chat()
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    # #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                    break
+                try:
+                    if isinstance(recv_data, str):
+                        jsload_data =  ujson.loads(recv_data)
+                        print("ASR ASR recv_data: {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                            break
+                        if jsload_data["event"] != None:
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
+                                self.VC_record_state_flag = 2
+                                
+                                EventMesh.publish("open_led_blue")
+                                pass
+                        if jsload_data["event"] == "Changed" or jsload_data["event"] == "SentenceEnd" : #开始录音Changed
+                            if self.VC_record_state_flag == 2:
+                                self.AI_ASR_timer.start(500, 1, self.AI_ASR_timer_cb)
+                            
+                            self.AI_ASR_timer_count = 0
+                            if jsload_data["result"]["result"]:
+                                #self.AI_listen_text = str(jsload_data["result"]["result"])
+                                text= str(jsload_data["result"]["result"])
+                                print("ASR recv self.voice_chat_state :{}".format(self.voice_chat_state))
+                                if self.voice_chat_state >= VC_State_TTSStart:#开始播音后不响应asr结果
+                                    print("asr continue")
+                                    continue
+                                EventMesh.publish("open_led_blue")
+                                if jsload_data["result"]["is_end"] == True:  #asr结束
+                                    self.VC_record_state_flag = 4
+                                    ret= self.check_text(text)
+                                    if ret == 0:#配置指令
+                                        #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                        if self.AI_send_data_queue.empty()!=True:
+                                            self.AI_send_data_queue.clear()
+                                        EventMesh.publish("open_led_all")
+                                        try:
+                                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) 
+                                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                                            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                        except Exception as e:
+                                            usys.print_exception(e)
+                                        continue
+                                    elif ret == 1:#不处理
+                                        pass
+                                    else:#正常asr
+                                        self.AI_ASR_str = text#
+                                        if self.AI_ASR_flag == 0:#d第一次识别,没有打断
+                                            self.AI_ASR_str_tmp = self.AI_ASR_str
+                                            self.AI_ASR_flag  = 1
+                                        else:#第二次识别,打断了
+                                            self.AI_ASR_str = self.AI_ASR_str_tmp+text
+                                            print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                            self.AI_ASR_str_tmp = self.AI_ASR_str
+                                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat})#关闭vc连接
+                                        self.AI_ASR_str+="\r\n\r\n"
+                                        print("asr recv :asr_str:{}".format(self.AI_ASR_str))  
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,"data":(500)}) #等一秒
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                        
+                                elif jsload_data["result"]["is_end"] == False:
+                                    self.VC_record_state_flag = 3
+                                    if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
+                                        self.AI_ASR_flag = 2
+                                        print("asr 打断,关闭VC连接")
+                                        self.AI_ASR_str = ""
+                                        # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat})#关闭vc连接
+                                        # EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_voice_chat})#连接服务器
+                                        # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_start_requset})#请求
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_blue"})#
+                                    pass
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    error_str = str(e)
+                    print("ASR ASR:e;{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        print("ASR ASR:recv TIMEDOUT 正常")
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                        break
+        self.AI_client_asr_isconnect = 0
+        self.AI_client_asr_recv_id = 0 
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    #ASR开始会话
+    def AI_client_asr_start_requset(self):
+        
+        json_data = \
+        { 
+            "header":{
+                "event":"StartTranscription",
+                "trace_id":self.get_trace_id()
+                },
+            "payload":{
+                "format":"pcm",
+                "sample_rate":self.VC_record_samplerate,
+                "voice_detection":"enabled",
+                }
+            
+        }
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["format"]='amr'
+            pass
+        # if self.VC_mode == 1:
+        #json_data["payload"]["voice_detection"]='disable'
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    #ASR终止
+    def AI_client_asr_StopTranscription_requset(self):   
+        json_data = \
+        {
+            "header":{
+                "event":"StopTranscription",
+                "trace_id":self.get_trace_id()
+                }
+        }
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    
+     #开始录音
+    def VC_Speech_Start(self):
+        #self.voice_chat_state =  VC_State_SpeechStart
+        print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+        if self.AI_ASR_flag  != 0:
+            return
+        if self.VC_record_state_flag  == 0:
+            self.websocket_connect_asr()
+            self.AI_client_asr_start_requset()#开始请求
+            if self.VC_record_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.VC_record_thread_id)
+                except Exception as e:
+                        usys.print_exception(e)
+                self.VC_record_thread_id = 0
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+            _thread.stack_size(8*1024)
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                try :
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                except Exception as e:
+                        usys.print_exception(e)
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+                # if self.record_pcm == None:        
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                #     print("audio.Audio.PCM:ret:{}".format(ret))
+                #     ret = self.record_pcm.stream_read_start()
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+            self.VC_record_state_flag = 1
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_ASR_str_tmp = ""
+            self.AI_ASR_str = ""
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+            #self.websocket_deconnect_asr()
+            if self.VC_record_state_flag == 0:
+                return
+            #self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if self.VC_record_thread_id != 0:
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.VC_record_thread_id = 0
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_voice_chat_send(h_data_b)
+        
+        count = 0
+        while True:
+            try:
+                
+                # 死循环接收数据
+                #if self.voice_chat_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    if self.record_fd != None:
+                        self.record_fd.write(read_buf)
+                        print("write record:{}".format(len(read_buf)))
+                    if self.VC_record_state_flag >= 2:
+                        self.AI_client_asr_send(read_buf)
+                    
+                    # if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
+                    #     self.AI_record_tmp_queue.put(read_buf)
+                    # else:
+                    #     while True:
+                    #         if self.AI_record_tmp_queue.empty() == True:
+                    #             break
+                    #         else:
+                    #             self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                    #     self.AI_client_voice_chat_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_voice_chat_end_speech()
+                #     break
+                utime.sleep_ms(40)
+                # if self.voice_chat_state >=  VC_State_SpeechEnd:
+                #     break
+                count+=1
+                if count %10 == 0:
+                    print("VC_record_thread on line {} asr recv :{} send:{}".format(self.VC_record_state_flag,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_send_data_queue_thread_id)))
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+###################################################### VC ###################################################################################
+    def websocket_connect_voice_chat(self):
+        print("websocket_connect_voice_chat:{} e:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect,self.AI_client_voice_chat_debug))
+        if self.AI_client_voice_chat_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            #女,男,童,粤,川
+            self.bot_name = "柒先生"
+            if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
+                self.bot_name = "柒妹妹"
+            elif self.VC_TTS_voice_num == 1:
+                self.bot_name = "柒先生"
+            elif self.VC_TTS_voice_num == 2:
+                self.bot_name = "柒乐乐"
+            req_str = ""
+            ack = ""
+            if self.is_VC_ACK == 1:
+                ack = "&ack=1"
+            lang = "&lang=zh-cn"#普通话测试环境
+            if self.VC_TTS_voice_num <= 2:
+                lang = "&lang=zh-cn"#普通话测试环境
+            elif self.VC_TTS_voice_num == 3:
+                lang = "&lang=zh-hk"#粤语测试环境
+            elif self.VC_TTS_voice_num == 4:
+                lang = "&lang=zh-cn-sc"#四川话测试环境
+            #platform = "&platform=huoshan&is_bot=1"
+            platform = "&platform=raisound"
+            req_str = "is_auth=0{}{}{}".format(platform,ack,lang)
+            print("req_str:{}".format(req_str))
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?{}'.format(req_str), debug=False)
+                
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)
+                else:
+                    self.websocket_error()
+                    return
+            print("websocket_connect_voice_chat:OK!!!!!!!!!!!!!!!!!!!!!")
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            str_error = str(e)
+            if str_error.find("[Errno 22] EINVAL")!= -1: 
+                print("websocket_connect_voice_chat:str_error:{}".format(str_error))
+                self.websocket_error()
+                utime.sleep_ms(1000)
+                Power.powerRestart()
+                EventMesh.publish("set_storage_config",["powerRestart",1])
+            self.websocket_error()
+            return
+        print("AI_client_voice_chat:{}".format(self.AI_client_voice_chat))
+        if self.AI_client_voice_chat == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        self.AI_client_voice_chat_debug+=1
+        utime.sleep_ms(10)
+        self.AI_client_voice_chat.settimeout(6)
+        # 线程接收数据
+        if self.AI_client_voice_chat_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_voice_chat_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))
+        _thread.stack_size(8*1024)
+        self.AI_client_voice_chat_isconnect = 1
+        print("websocket_connect_voice_chat end")
+    def websocket_error(self):
+        
+
+        print("websocket_error1!!!!")
+        self.Close()
+        print("websocket_error1.1!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        self.VC_Speech_End()
+        self.websocket_error_count+=1
+        if self.websocket_error_count <=3:
+            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+        elif self.websocket_error_count <10 :
+            EventMesh.publish("audio_montage_play",["xinhaoruo2.mp3"])
+        elif self.websocket_error_count >=10:
+            EventMesh.publish("paly_iccid_imei")    
+        else:
+            EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+        
+        print("websocket_error2")
+        #self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        
+        print("websocket_error4")
+        if self.websocket_error_count <3 :
+            utime.sleep_ms(3000)
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start})
+
+    def websocket_deconnect_voice_chat(self):
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        print("websocket_deconnect_voice_chat!!!!!!!")
+        if self.AI_client_voice_chat_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_voice_chat_recv_id = 0
+        if self.AI_client_voice_chat_isconnect == 1 or self.AI_client_voice_chat!=None:
+            self.AI_client_voice_chat_isconnect = 0
+            self.AI_client_voice_chat.close()
+            self.AI_client_voice_chat_debug -=1
+            self.AI_client_voice_chat=None
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+    #websocket发送ping
+    def AI_client_voice_chat_ping(self):
+        pass
+        if self.AI_client_voice_chat_isconnect == 1:
+            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')
+            self.AI_client_voice_chat_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_voice_chat_send(self,data_str):
+        # if isinstance(data_str, str):#是字符串
+        #     print("AI_client_voice_chat_send:{}".format(data_str))
+        #     pass
+        # else:
+        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) 
+    
+    #Ai VC websocket返回数据       
+    def AI_client_voice_chat_recv(self,cli):
+        count = 0
+
+        while True:
+            try:
+                # 死循环接收数据
+                if self.is_VC_ACK == 1:
+                    self.AI_client_voice_chat_Read()
+                #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_Read})
+                count+=1
+                if self.voice_chat_state >= VC_State_TTSStart and (self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>3):
+                    count = 0
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                            break
+                        if jsload_data["event"] == "Started" :#会话开始
+                            payload = jsload_data["payload"]
+                            self.VC_dialog_id = payload["dialog_id"] 
+                            self.VC_task_id = jsload_data["task_id"] 
+                            print("VC:Started!!!!!!!!\r\n")
+                        elif jsload_data["event"]  == "SpeechContent" :#asr转译
+                            print("VC:SpeechContent!!!!!!!!\r\n")
+                            payload = jsload_data["payload"]
+                            
+                            
+                            if(payload['finished'] == True):#asr结束
+                                self.voice_chat_state =  VC_State_SpeechEnd
+                                #self.VC_Speech_End()#停止录音
+                                text = payload["text"]
+                                if self.check_text(text) == 0:
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                    
+                                    #EventMesh.publish("open_led_all")
+
+                                    if self.AI_send_data_queue.empty()!=True:
+                                            self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                
+                                pass
+                            else:
+                                pass
+
+                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                            self.voice_chat_state =  VC_State_SpeechEnd
+                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      
+                            pass
+                            
+                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.play_flag = 0
+                            self.voice_chat_state = VC_State_TTSStart
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+                            self.VC_Thinking_timerout = 0#关闭超时重试
+                            # self.VC_Speech_End()#停止录音
+                            # self.VC_Play_Start()
+                            EventMesh.publish("open_led_green")#绿色
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                            if self.play_data_save_flag == 1:
+                                try:
+                                    uos.remove('/usr/play_data.pcm')
+                                except Exception as e:
+                                    usys.print_exception(e)
+                                self.play_fd = open('/usr/play_data.pcm','w')
+                            
+                            pass
+                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            #if self.voice_chat_state == VC_State_TTSStart:
+                            print("RespondingEnded!!!!!!" )
+                            self.voice_chat_state = VC_State_TTSEnd
+                            if self.asr_satrt_flag == 0 :
+                                self.asr_satrt_flag =1
+                            if self.play_data_save_flag == 1:
+                                if self.play_fd !=None:
+                                    self.play_fd.close()
+                            #self.tts_fd.close()
+                            #pass
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                            payload = jsload_data["payload"]
+                            if payload["state"] == "Listening":#可以说了
+                                self.voice_chat_state = VC_State_Listening
+                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                                    self.AI_client_voice_chat_RequestToRespond()
+                                else:
+                                    #self.VC_Speech_Start()#开启线程获取录音数据
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_Start})#
+                                    #self.AI_client_voice_chat_send_speech()#开始上传语音
+                                
+                                #EventMesh.publish("open_led_red")
+                            if payload["state"] == "Thinking":#思考
+                                self.voice_chat_state = VC_State_Thinking
+                                if self.VC_Thinking_timerout == 0:
+                                    self.VC_Thinking_timerout = 15#倒计时15秒,如果没有音频数据返回就重试
+                                EventMesh.publish("open_led_red_green")#黄色
+                            if payload["state"] == "Responding":#开始音频播放
+                                #self.voice_chat_state = VC_State_Responding#
+                                pass
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                            #self.voice_chat_state =  VC_State_Responding
+                            #self.AI_client_voice_chat_send_speech()#开始上传语音
+                            pass
+                    else:#下发音频数据
+                        #self.AI_ASR_str = ""#下发音频后清掉asr结果
+                        print("下发音频数据1:{}".format(len(recv_data)))
+                        if self.play_data_save_flag == 1:
+                            if self.play_fd !=None:
+                                self.play_fd.write(recv_data)
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        if self.voice_chat_state >= VC_State_TTSStart:
+                            self.put_record_data([recv_data,""])
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    
+                    error_str = str(e)
+                    print("VC VC:e:{}".format(error_str))
+                    if error_str.find("[Errno 110] ETIMEDOUT")!= -1:
+                        print("VC VC:recv TIMEDOUT 正常")
+                    else:
+                        usys.print_exception(e)
+                        #self.websocket_error()
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                        break
+        self.AI_client_voice_chat_isconnect = 0
+        self.AI_client_voice_chat_recv_id = 0 
+        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("更改声音") != -1:
+                    self.VC_TTS_voice_num += 1
+                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):
+                        self.VC_TTS_voice_num = 0
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功"    
+                    return 0
+                if text.find("声音") != -1 and text.find("改") != -1 and (text.find("男声") != -1 or text.find("男") != -1 ):
+                    self.VC_TTS_voice_num = 1
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音") != -1 and text.find("改") != -1 and  (text.find("女声") != -1 or text.find("女") != -1 ):
+                    self.VC_TTS_voice_num = 0
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音") != -1 and text.find("改") != -1 and  (text.find("同声") != -1 or text.find("童") != -1 ):
+                    self.VC_TTS_voice_num = 2
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音") != -1 and text.find("改") != -1 and  (text.find("粤") != -1 or text.find("越野") != -1 ):
+                    self.VC_TTS_voice_num = 3
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音") != -1 and text.find("改") != -1 and text.find("四川话") != -1 :
+                    self.VC_TTS_voice_num = 4
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1 and text.find("加") != -1 :
+                    self.VC_TTS_volume += 10
+                    if self.VC_TTS_volume > 100:
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                        self.AI_TTS_str = "音量已最大" 
+                        self.VC_TTS_volume = 100
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        
+                    return 0
+                if text.find("音量") != -1 and text.find("减") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已最小"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                    return 0
+                if text.find("电量") != -1 and text.find("查询") != -1:
+                    battery = EventMesh.publish("get_battery")
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                    return 0
+                if text.find("电压") != -1 and text.find("查询") != -1:
+                    Vbatt = Power.getVbatt()
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                    return 0
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("信号") != -1 and text.find("查询") != -1:
+                    signal = net.csqQueryPoll()
+                    
+                    self.AI_TTS_str = "当前信号{}".format(signal)
+                    return 0
+                
+                if len(text)<12 and (text.find("再见") != -1 or text.find("拜拜") != -1):
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    #self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+   
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self._1S_timer_cb_}) 
+
+    def _1S_timer_cb_(self):    
+    
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 30:#20秒没数据就close
+            
+            if self.voice_chat_state >= VC_State_Thinking:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+            else:
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        #self.LocalRespondingEnded_timerout+=1
+        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束
+            self.LocalRespondingEnded_timerout += 1
+        if self.LocalRespondingEnded_timerout >= 4:
+            self.LocalRespondingEnded_timerout = 0
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+            else:
+                #通知服务器播放结束
+                self.AI_client_voice_chat_LocalRespondingEnded()
+        self.VC_pingping_timerout+=1
+        if self.VC_pingping_timerout>5:
+            self.VC_pingping_timerout=0
+            self.AI_client_voice_chat_ping()
+        self.asr_pingping_timerout += 1
+        if self.asr_pingping_timerout>5:
+            self.asr_pingping_timerout=0
+            self.AI_client_asr_ping()    
+        if self.VC_Thinking_timerout > 0 and self.VC_Thinking_timerout < 100:#VC Thinking超时后重新开始
+            print("VC_Thinking_timerout:{}!!!!!!!!!!!!!!!!!!!!!".format(self.VC_Thinking_timerout))
+            self.VC_Thinking_timerout -=1
+            if self.VC_Thinking_timerout == 0:
+                self.VC_Thinking_timerout = 100
+                print("Thinking重试,重试!!!!!!!!!!!!!!!!!!!!!")
+                self.voice_chat_state = VC_State_None
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                pass
+        
+    #VC开始
+    def AI_VC_start(self):
+        print("AI_VC_start1")
+        self.VC_satrt_flag = 1
+        if self.VC_Thinking_timerout < 100:
+            self.VC_Thinking_timerout = 0
+        EventMesh.publish("open_led_all")
+        self.VC_Play_End()#关闭音频播放
+        print("AI_VC_start2")
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+        
+        
+        if self.record_data_save_flag == 1:
+            try:
+                uos.remove('/usr/record_data.pcm')
+            except Exception as e:
+                usys.print_exception(e)
+            self.record_fd = open('/usr/record_data.pcm','w')
+        #
+        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_voice_chat()#连接服务器
+            self.AI_client_voice_chat_start_requset()
+            #utime.sleep_ms(50)
+        else:
+            print("self.voice_chat_state :{}".format(self.voice_chat_state ))
+            if self.voice_chat_state > VC_State_SpeechStart:
+                #客户端打断对话
+                print("打断对话")
+                # self.websocket_deconnect_voice_chat()
+                # self.websocket_connect_voice_chat()#连接服务器
+                # self.AI_client_voice_chat_start_requset()
+                self.AI_client_voice_chat_RequestToSpeak()
+            elif self.voice_chat_state == VC_State_Listening:
+                #直接chat
+                print("直接chat")
+                self.AI_client_voice_chat_RequestToRespond()
+            else:
+                print("异常状态")
+                #self.AI_client_voice_chat_RequestToSpeak()
+                self.websocket_deconnect_voice_chat()
+                self.websocket_connect_voice_chat()#连接服务器
+                self.AI_client_voice_chat_start_requset()
+        if self.AI_client_voice_chat_isconnect == 0:
+            return
+        print("AI_VC_start3")
+        self.voice_chat_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            self.websocket_connect_asr()
+            if self.AI_client_asr_isconnect == 0:
+                return
+            #开始asr录音
+            self.VC_Speech_Start()
+            pass
+        print("AI_VC_start4")
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.VC_pingping_timerout = 0
+        self.asr_pingping_timerout = 0
+        print("AI_VC_start5")
+    #开始会话
+    def AI_client_voice_chat_start_requset(self):
+        
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Start"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "device_id":modem.getDevImei(),
+                "user_agent":"python",
+                "in_format":"pcm",
+                "out_format":"mp3",
+                "in_sample_rate":self.VC_record_samplerate,
+                "sample_rate":self.VC_play_samplerate,
+                "space_time": 150,
+                "volume": str(self.VC_TTS_volume),
+                "voice":self.VC_TTS_voice_type[str(self.VC_TTS_voice_num)],
+                "voice_detection":"enabled",
+                "simple_response":True,
+                "custom_variables":{
+                    "bot_name":"{}".format(self.bot_name)
+                    }
+                },
+            
+        }
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["in_format"]='amr'
+            pass
+        if self.VC_mode == 1:
+            json_data["payload"]["voice_detection"]='disable'
+        self.voice_chat_state = VC_State_None
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_voice_chat_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id
+            }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.voice_chat_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_voice_chat_end_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"StopSpeech"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Speech_End})
+        #self.VC_Speech_End()#停止线程录音
+
+    #通知服务器开始播放
+    def AI_client_voice_chat_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_voice_chat_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.voice_chat_state = VC_State_End
+    #客户端打断对话
+    def AI_client_voice_chat_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS或者chat事件
+    def AI_client_voice_chat_RequestToRespond(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_TTS_str != "":
+            json_data["payload"]["text"] = self.AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+            self.AI_TTS_str = ""
+        elif self.AI_ASR_str != "":
+            json_data["payload"]["text"] = self.AI_ASR_str
+            json_data["payload"]["type"] = "prompt"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)})
+            #self.AI_ASR_str = ""
+        # utime.sleep_ms(1)
+    #给服务器回应ack
+    def AI_client_voice_chat_Read(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Read"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_voice_chat_Read!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        
+        #for i in range(6): 
+            #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
+            self.AI_client_voice_chat.send(ujson.dumps(json_data))
+    #发送数据队列
+    def AI_send_data_queue_thread(self):
+        print("AI_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_send_data_queue.empty() :#不能去掉,去掉会卡死
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_send_data_queue_thread:get")
+                data = self.AI_send_data_queue.get()
+                #print("AI_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_voice_chat_recv_id)))
+                        if data[0] == AI_client_voice_chat_num:
+                            self.VC_pingping_timerout = 0
+                            if isinstance(data[1], str):#是字符串
+                                print("VC VC: send_data:{}".format(data[1]))
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
+                                self.AI_client_voice_chat.send(data[1])
+                            #print("VC: send_data end")
+
+                        if data[0] == AI_client_asr_num:
+                            self.asr_pingping_timerout = 0
+                            if isinstance(data[1], str):#是字符串
+                                print("ASR ASR: send_data:{}".format(data[1]))
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+                                self.AI_client_asr.send(data[1])
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_voice_chat_num:
+                            #self.websocket_error()
+                            pass
+                            #self.websocket_deconnect_voice_chat()
+                            self.AI_client_voice_chat_isconnect = 0
+                            try:
+                                EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                                #self.websocket_deconnect_voice_chat()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+                        if data[0] == AI_client_asr_num: 
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                            #EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
+                         
+    ############################################
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                # if self.AI_send_data_queue_thread_id == 0:
+                #     break
+                # print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    utime.sleep_ms(1)
+                    count+=1
+                    if count%5000 == 1:
+                        print("AI_audio_queue_thread on")
+                else:
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_voice_chat_LocalRespondingStarted!!!")
+                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放
+                    #self.AI_client_tts_data_len=len(data)
+                    print("audio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+                                
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        print("play_pcm.stream_write !!!")
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        print("play_pcm.stream_write:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_voice_chat_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(1000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+    def Close(self):
+        self.VC_Thinking_timerout = 0
+        self.VC_satrt_flag = 0
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("close_led")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        self.VC_Speech_End()
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+        #销毁线程
+            if self.AI_audio_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_audio_queue_thread_id = 0
+            if self.AI_send_data_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_send_data_queue_thread_id = 0
+            
+
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)
+        self.AI_ASR_timer.stop()
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+        if self.play_data_save_flag == 1:
+            if self.play_fd !=None:
+                self.play_fd.close()
+        
+    def VC_init2(self):
+        self.VC_init()
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+
+
+    def VC_init(self):
+        
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_t.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ai_VC_t.py
new file mode 100644 (file)
index 0000000..8f1e8ea
--- /dev/null
@@ -0,0 +1,740 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+class AI_led(Abstract):
+    def __init__(self):
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_white",self.open_led_white)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("close_led",self.close_led)
+
+    def open_led_red(self,event,msg):
+        #self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_white(self,event,msg):
+        self.led_red.write(0)
+        #self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_white.write(1)
+
+    def open_led_green(self,event,msg):
+        self.led_red.write(0)
+        self.led_white.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def close_led(self,event,msg):
+        self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        self.KeyAI_timer = osTimer()
+        self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.GPIO26_status = 0
+        self.GPIO26_timer_count = 0
+        self.GPIO26_long_press = 0
+        self.GPIO26_press = 0
+        self.GPIO26_timer = osTimer()
+        self.pwk_key26 = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        self.pwk_key26.enable() 
+        self.btnInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        #self.wdt = WDT(30) #开启看门狗
+        self.wdt_timer = osTimer()
+        self.wdt_timer.start(10000, 1, self.wdt_timer_cb)
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        self.btnInfo_queue.put(msg)
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.GPIO26_status = int(args[1])
+            if self.GPIO26_status == 0:
+                self.GPIO26_status = 1
+            else:
+                self.GPIO26_status = 0
+                pass
+            if self.GPIO26_status == 0:#按下
+                if self.GPIO26_press == 0 :
+                    self.pwk_key26.disable()
+                    self.GPIO26_press = 1
+                    self.GPIO26_long_press = 0
+                    self.GPIO26_timer.start(100, 1, self.GPIO26_timer_cb)
+                    self.GPIO26_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    
+        except Exception as e: 
+            usys.print_exception(e)
+    def GPIO26_timer_cb(self, *args, **kwargs):
+        try:
+            self.GPIO26_status = self.extint_AI.read_level()
+            self.GPIO26_timer_count +=1
+            if self.GPIO26_timer_count >= 10*3: #长按3s 
+                if self.GPIO26_long_press == 0:
+                        self.GPIO26_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.GPIO26_status == 1:#松开
+                #print("GPIO26_timer_cb:{}".format(self.GPIO26_timer_count))
+                if self.GPIO26_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key26.enable()
+                    self.GPIO26_timer.stop()
+                    self.GPIO26_timer_count = 0
+                    self.GPIO26_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*3: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        #print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        #print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+    def AI_key_release(self):
+        #print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_release(self):
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+    def wdt_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.wdt_feed})  
+    def wdt_feed(self):
+        #self.wdt.feed()
+
+        pass
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+
+#阿里voice_chat状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechEnd=3#说结束
+VC_State_Thinking=4#想(chat)
+VC_State_Responding=5#音频播放
+VC_State_TTSStart=6
+VC_State_TTSData=7
+VC_State_TTSFinish=8
+VC_State_TTSEnd=9
+VC_State_TTSError=10
+VC_State_DialogError=11
+VC_State_End=12
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_voice_chat_num = 3
+class AI_VC(Abstract):
+    # AI
+    def __init__(self):
+        self.AI_audio_queue_thread_id = 0
+        self.AI_send_data_queue_thread_id = 0
+
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_send_data_queue_thread_id == 0:    
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
+        self.VC_dialog_id = None
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_voice_chat = None
+        self.AI_client_voice_chat_recv_id = 0
+        self.AI_client_voice_chat_isconnect =0
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.pingping_timerout = 0
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')#开机音频
+        self.test_timer = osTimer()
+        self.test_timer.start(6000, 1, self.test_timer_cb)
+    def test_timer_cb(self, *args, **kwargs):
+        self.aud.play(1,0,'U:/test.mp3')#开机音频
+        print("test_timer_cb")
+        
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_Play_Start})
+    
+
+    
+   
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.VC_init()
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.pingping_timerout = 0
+        size = 4*1024
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    with open("/usr/test.pcm", "rb")as f:   
+                        while 1:
+                            b = f.read(size)   # read
+                            if not b:
+                                break
+                            #aud.playStream(format, b)
+                            #ret = self.play_pcm.stream_write(b,len(b))
+                            #ret= self.aud.playStream(1, data[0])#播放音频流
+                            #print("play_pcm.stream_write:{}".format(ret))
+                            ret=self.AI_audio_queue.put([b,""])
+                            utime.sleep_ms(100)
+                    print("self.record_pcm.stream_write_start")
+
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+    #开始录音
+    def VC_Speech_Start(self):
+        #self.voice_chat_state =  VC_State_SpeechStart
+        
+        if self.VC_record_state_flag  == 0:
+            if self.VC_record_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.VC_record_thread_id)
+                except Exception as e:
+                        usys.print_exception(e)
+                self.VC_record_thread_id = 0
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+            _thread.stack_size(8*1024)
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                try :
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                except Exception as e:
+                        usys.print_exception(e)
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+                # if self.record_pcm == None:        
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                #     print("audio.Audio.PCM:ret:{}".format(ret))
+                #     ret = self.record_pcm.stream_read_start()
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+            self.VC_record_state_flag = 1
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.rec_fd.close()
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}\r\n".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}\r\n".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        self.voice_chat_state =  VC_State_SpeechEnd
+        if self.VC_record_thread_id != 0:
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.VC_record_thread_id = 0
+        self.VC_record_state_flag = 0
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        try:
+            uos.remove('/usr/test.pcm')
+        except Exception as e:
+            usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        self.rec_fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_voice_chat_send(h_data_b)
+        while True:
+            try:
+                # 死循环接收数据
+
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(1000)
+
+                #Record_len = 1024*2
+                print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    self.rec_fd.write(read_buf)
+                    #record_data_queue.put(read_buf)
+                    
+                    if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
+                        self.AI_record_tmp_queue.put(read_buf)
+                    else:
+                        while True:
+                            if self.AI_record_tmp_queue.empty() == True:
+                                break
+                            else:
+                                self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                        self.AI_client_voice_chat_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    count+=len(read_buf)
+
+                utime.sleep_ms(40)
+
+            except Exception as e:
+                    usys.print_exception(e)
+                    break
+        self.rec_fd.close()
+        
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+
+    #VC开始
+    def AI_VC_start(self):
+        self.VC_init()#关闭一些资源
+        #self.Close()#关闭一些资源
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+        self.aud.play(1,0,'U:/tts_tesr.mp3')#开机音频
+        #self.websocket_connect_voice_chat()#连接服务器
+        #self.AI_client_voice_chat_start_requset()
+        self.close_timerout = 0
+        self.voice_chat_state = VC_State_None
+        #开始录音
+        self.VC_Speech_Start()
+        
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.pingping_timerout = 0
+        
+        
+   
+    #发送数据队列
+    def AI_send_data_queue_thread(self):
+        print("AI_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_send_data_queue.empty() :
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_send_data_queue_thread:get")
+                data = self.AI_send_data_queue.get()
+                #print("AI_send_data_queue_thread:get2")
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))
+                        if data[0] == AI_client_voice_chat_num:
+                            # if self.AI_client_voice_chat_isconnect == 0:
+                            #     try:
+                            #         self.websocket_connect_voice_chat() 
+                            #     except Exception as e: #网络连接异常
+                            #         usys.print_exception(e)
+                            self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_voice_chat != None:
+                                self.AI_client_voice_chat.send(data[1])
+                            #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_voice_chat_num:
+                            self.websocket_error_voice_chat()
+                            #self.websocket_deconnect_voice_chat()
+                            # self.AI_client_voice_chat_isconnect = 0
+                            # try:
+                            #     self.websocket_connect_voice_chat()
+                            # except Exception as e: #网络连接异常
+                            #     usys.print_exception(e) 
+                         
+    ############################################
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        while True:
+            try:
+                # if self.AI_send_data_queue_thread_id == 0:
+                #     break
+                # print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    utime.sleep_ms(5)
+                else:
+                    data = self.AI_audio_queue.get()
+
+                    #self.AI_client_tts_data_len=len(data)
+                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+ 
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        print("play_pcm.stream_write:{}".format(ret))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+
+                            
+                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
+                            mem = gc.mem_free()
+                            print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        #print("AI_audio_queue_thread:exit")
+
+    def Close(self):
+        print("ai_VC Close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        print("ai_VC Close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        print("ai_VC Close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        print("ai_VC Close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+        #销毁线程
+            if self.AI_audio_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_audio_queue_thread_id = 0
+            if self.AI_send_data_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_send_data_queue_thread_id = 0
+            
+
+        except Exception as e:
+            usys.print_exception(e)
+
+        self.VC_init()
+        self._1S_timer.stop()
+
+    def VC_init(self):
+        
+
+        self.VC_Speech_End()
+        self.VC_Play_End()
+
+        self.AI_send_data_queue.clear()
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
+        self.AI_audio_queue.clear()
+        EventMesh.publish("close_led")
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_gain.nvm b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_gain.nvm
new file mode 100644 (file)
index 0000000..fe06d81
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_gain.nvm differ
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_ve.nvm b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_ve.nvm
new file mode 100644 (file)
index 0000000..a33dd45
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/audio_ve.nvm differ
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
new file mode 100644 (file)
index 0000000..9bbf5e9
--- /dev/null
@@ -0,0 +1,3000 @@
+from common import Abstract
+import machine
+import osTimer
+from misc import PowerKey
+import EventMesh
+from machine import Pin
+from machine import ExtInt
+import constants
+import utime
+import audio
+import ql_fs
+import ujson
+import voiceCall
+from misc import Power
+from led import red_green_light,green_light_fast,led_mode,open_led_red,close_led_red,open_led_green,open_led_white,close_led_green,close_led_white
+from machine import RTC
+from queue import Queue
+import _thread
+import usys
+import sms
+from Gsensor import SC7A20
+if EventMesh.model == "D10" :
+    audio_buf = ['audio_find_haixiu', 'R_ALARM_NEW', 'R_BLOOD_SUGAR', 'R_CALL_mp3', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_CUR_BATTERY_LEVEL', 'R_DRINK_ALARM', 'R_FALL_ALARM', 'R_HOME_ALARM', 'R_HSENSOR_RESULT_FAILE', 'R_HSENSOR_RESULT_HR_TITLE', 'R_HSENSOR_RESULT_OK', 'R_HSENSOR_SPO2_TITLE', 'R_HSENSOR_TEMP_TITLE', 'R_MEDICINE_ALARM', 'R_NO_SET_SOS_DIAL', 'R_NO_SET_VIDOE', 'R_NO_SIM', 'R_POWER_OFF_1', 'R_READ_STEP_0', 'R_READ_STEP_1', 'R_READ_STEP_2', 'R_READ_STEP_3', 'R_READ_STEP_4', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_MIN', 'R_READ_TIME_ZHENG', 'R_RESET_ALARM', 'R_RESET_END_ALARM', 'R_SIM_CONNECT', 'R_SIM_FAILE', 'R_SLEEP_ALARM', 'R_SOS_ALERT', 'R_TSENSOR_RESULT_VALUE_DOT', 'R_UNREAD_WECHAT', 'R_VIDEO_ANSWER', 'R_VIDEO_ANSWERING', 'R_VIDEO_CALL_CONNECT', 'R_VIDEO_CALL_ENDING', 'R_VIDEO_CALL_IN', 'R_VIDEO_VOICE_IN', 'R_VIDEO_WAITING', 'R_WAKEUP_ALARM', 'R_WECHAT_RECV']
+
+
+    class intervManager(Abstract):
+        def __init__(self):
+            self.timer = osTimer()
+
+            self.pwk_timer1 = osTimer()
+            self.pwk_timer2 = osTimer()
+            self.timer1 = osTimer()
+            self.sos_timer2 = osTimer()
+            self.sos_timer1 = osTimer()
+
+            self.sos_sendtime = osTimer()
+
+            self.fall_timer1 = osTimer()
+            self.fall_timer2 = osTimer()
+
+            self.alarm_timer1 = osTimer()
+
+            self.find_timer1 = osTimer()
+            self.fall_flag = 0
+
+            self.factory_timer = osTimer()
+            
+            self.restart_timer = osTimer()
+
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            self.play_count = 0
+            self.count = 0
+
+            self.get_hr_state  = 0
+            self.get_spo2_state = 0
+            self.timeSec = 0
+            self.timeTempSec = 0
+
+            self.hr_value = 0
+            self.spo2_value = 0
+            self.temp_value = 0
+
+            self.usbState = 0
+
+            self.setp_old = 0
+            self.step_tmp = ""
+            self.step_num = 0
+            self.power_off = 0
+            self.call_state = 0
+
+            self.find_state = 0
+            self.FIND_timer_count = 0
+
+            self.old_hour = 0
+            self.alarm_state = 0
+            self.alarm_timer_count = 0
+            self.old_min = 0
+            self.interInfo_queue = Queue()
+            _thread.stack_size(10*1024+64)
+            _thread.start_new_thread(self.interInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
+            
+
+            self.audio_event_queue = Queue()
+            _thread.stack_size(10*1024+128)
+            _thread.start_new_thread(self.audio_event_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
+
+            self.record_test = audio.Record()
+            self.record_test.gain_set(4,12)
+
+            self.timeSecond = 0
+            self.wechat_show = 0
+            self.sort_new = {}
+            self.time_min = 0
+            self.press_btn = 0
+            self.countdown_old = 0
+            self.set_unread_wechat = 0
+            self.updateTime = 0
+            
+            self.power_on_flag = 0
+
+            self.MXA_MSG = 1
+            self.wechat_recode_list = {"num":0}
+            self.wechat_num = 0
+            self.read_data = {}
+            self.volum_size = 8 
+            self.phone_num = ''
+            self.sos_phone_num = ''
+            self.msg_tmp = ""
+            self.time_count = 0
+            self.alarm_count = 0
+            self.audio_int = 0
+
+            self.hr_auto = 0
+
+            self.temp_auto = 0
+            
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")
+            if check_txt == True :
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
+                    self.wechat_recode_list = ujson.load(fd)
+                    if not self.wechat_recode_list:
+                        self.wechat_recode_list = {"num":0}
+                        self.wechat_num = 0
+            else:
+                self.wechat_recode_list = {"num":0}
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    ujson.dump(self.wechat_recode_list,fd)         
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
+
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
+
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
+
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
+
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
+
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值
+
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
+
+
+            EventMesh.subscribe("set_usb", self.set_usb)#
+            EventMesh.subscribe("get_usb", self.get_usb)#
+
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
+
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
+            EventMesh.subscribe("get_call_state", self.get_call_state)#
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
+
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
+
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
+
+
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊状态
+            EventMesh.subscribe("set_wechat_state", self.set_wechat_state)#设置微聊状态
+
+
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
+
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
+
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
+
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
+
+
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
+
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
+
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
+
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
+
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
+
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
+
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
+
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
+
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
+
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
+
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
+
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
+
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
+
+        
+
+        def interInfo_queue_thread(self):
+            while True:
+                data = self.interInfo_queue.get()
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+        def publish_message_event_interInfo(self,event,msg):
+            self.interInfo_queue.put(msg)
+
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})  
+
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
+        
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
+
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
+
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
+
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
+        
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
+        
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
+        
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  
+
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  
+
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  
+
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
+
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
+
+
+        def reset_alarm_event(self,args,msg):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def reset_alarm_event_cb(self,args):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def reset_end_alarm_event(self,args,msg):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def reset_end_alarm_event_cb(self,args):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def sleep_alarm_event(self,args,msg):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def sleep_alarm_event_cb(self,args):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def home_alarm_event(self,args,msg):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def home_alarm_event_cb(self,args):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def wakeup_alarm_event(self,args,msg):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def wakeup_alarm_event_cb(self,args):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def medicine_alarm_event(self,args,msg):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def medicine_alarm_event_cb(self,args):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def drink_alarm_event(self,args,msg):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            
+
+
+        def drink_alarm_event_cb(self,args):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0:
+                self.alarm_count += 1# 1 2 
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+            
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0:
+                EventMesh.publish("close_timer_all")#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                self.time_count = 0
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.fall_flag = 1
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def falldown_alarm_cb(self,*args):
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and wechat_state == 0:
+                self.time_count+=1
+                if self.time_count >= 5:
+                    self.time_count = 0
+                    self.fall_timer1.stop()
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.time_count = 0
+                self.fall_timer1.stop()
+        
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
+            if self.fall_flag == 1:#跌倒标志
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.sos_timer1.stop()
+                self.sos_timer2.stop()
+                if self.call_state != 0:
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+
+        
+
+        def send_find_watch(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0: 
+                EventMesh.publish("close_timer_all")#
+                self.find_state = 1
+                self.FIND_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_find_watch(self, event, msg): 
+            if self.find_state == 1:
+                self.find_state = 0
+                self.FIND_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #播放声音 
+                self.alarm_timer1.stop()
+
+        def FIND_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                if self.find_state == 1:
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.FIND_timer_count += 1
+                    if self.FIND_timer_count > 10: #120秒30s
+                        EventMesh.publish("STOP_FIND_WATCH")
+            else:
+                self.FIND_timer_count = 0
+                self.alarm_timer1.stop()
+                
+        
+        def stop_FIND(self) :
+            self.alarm_timer1.stop()
+
+        def send_alarm_ring(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                EventMesh.publish("close_timer_all")#
+                self.alarm_state = 1
+                self.alarm_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
+            if self.alarm_state == 1:
+                self.alarm_state = 0
+                self.alarm_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #停止播放
+                self.alarm_timer1.stop()
+
+        def Alarm_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0:
+                if self.alarm_state == 1:
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.alarm_timer_count += 1
+                    if self.alarm_timer_count > 15: #120秒30s
+                        EventMesh.publish("STOP_ALARM_RING")
+            else:
+                self.alarm_timer_count = 0
+                self.alarm_timer1.stop()
+
+        def get_fall_down_state(self,event,msg):
+            return self.fall_flag
+
+        def sos_short_press(self,args,msg):
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃
+            EventMesh.publish("play_cur_time_event")#播报当前时间
+            #播报当前时间
+
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
+            wechat_state = EventMesh.publish("get_wechat_state")
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0: 
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+
+
+        def audio_event_queue_thread(self):
+            while True:
+                data = self.audio_event_queue.get()
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_audio(self,event,msg):
+            self.audio_event_queue.put(msg)
+
+        def play_audio_file(self, *args, **kwargs):#播放音频文件
+            # EventMesh.debug_log("args",args)
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
+            data = args[1]
+            self.play_audio_file_do(data)
+
+        def play_audio_file_do(self,data):#msg 拼接的路径文件
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断
+            
+
+
+
+
+        def powe_resatrt_down_fun(self, *args):#重启设备
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def power_down_fun(self, *args):
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerDown()
+
+
+
+        def close_audio_play(self, event, msg): #msg
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+
+
+
+        def close_timer_all(self, event, msg): 
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+            
+            
+            self.timer.stop()
+            self.sos_timer2.stop()
+            self.sos_timer1.stop()
+            self.fall_flag = 0
+            self.fall_timer1.stop()
+            self.alarm_timer1.stop()
+        
+
+        def answer_call_event(self, event, msg): #
+            if self.call_state == 2:
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+                EventMesh.publish("close_timer_all")#
+                voiceCall.callAnswer()
+
+        def set_call_state(self, event, msg): #
+            self.call_state = msg
+
+        def dialin_call_event(self, event, msg):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            self.timer.start(6000, 1, self.publish_call_event_cb)
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def call_timer_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            if self.call_state != 2:
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.phone_num = ''
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    self.phone_num = str(msg)
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.timer1.start(2000, 0, self.time_out_phone)
+                    
+        
+        def time_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.phone_num)
+
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.sos_phone_num = ''
+            # EventMesh.debug_log("sos_out_call_center_cb",msg)
+            if self.call_state == 0:
+            
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    sos_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 16
+                    sos_state = sos_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",sos_state)
+
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
+                    EventMesh.publish("close_timer_all")#
+                    self.sos_phone_num = msg
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)
+                    
+                    
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
+            sos_flag = EventMesh.publish("get_sos_flag")
+            if sos_flag == 1:
+                if self.call_state == 0:
+                    EventMesh.publish("set_sos_info_call") 
+                    
+        def sos_call_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.sos_phone_num)
+        
+
+        def call_test_event(self, event, msg):
+            voiceCall.callStart(str("10086"))
+
+        def get_call_state(self, event, msg):
+            return self.call_state
+        
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
+                self.call_state = 0
+                voiceCall.callEnd()
+        
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 1 or flag == 3:#电话呼叫中
+                self.call_state = 0
+                voiceCall.callEnd()
+                
+
+
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                step = EventMesh.publish("get_old_step_value")
+                EventMesh.debug_log("step",step)
+                self.setp_old = step
+                if step <= 10:#
+                    if step == 10:#十步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:# 9步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 100:#十 90
+                    if step == 100:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\
+                            audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)
+                        shi_value = int(step_tmp[0])#十
+                        ge_value = int(step_tmp[1])#个
+                        if shi_value > 1:#大于19步
+                            if ge_value == 0:#9十步 70十步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:#9十2步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#十9步
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                            audio_buf.index("R_READ_STEP_4"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 1000:
+                    if step == 1000:#1千步
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)#500
+                        bai_value = int(step_tmp[0])#百
+                        shi_value = int(step_tmp[1])#十
+                        ge_value = int(step_tmp[2])#个
+                        #101 110 1
+                        if shi_value > 0:#110
+                            if ge_value == 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value == 0 and ge_value == 0:#500 600
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                pass
+                            else:
+
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                elif step <= 10000:#千
+                    if step == 10000:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        one_thousand = step//1000 #千
+                        one_hundred = step%1000 #百
+                        baishu = step%100 #十
+                        shishu = step%10 #个
+                        step_tmp = str(step)
+                        qian = int(step_tmp[0])#千
+                        bai_value = int(step_tmp[1])#百
+                        shi_value = int(step_tmp[2])#十
+                        ge_value = int(step_tmp[3])#个
+                        if bai_value <= 0:
+                            if shi_value <= 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1020 1040
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1021 
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value <= 0:#1109
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                    audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1117
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        pass
+                elif step <= 100000:#万
+                            if step == 100000:#10万步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                step_tmp = str(step)
+                                wang = int(step_tmp[0])#万
+                                qian = int(step_tmp[1])#千
+                                bai_value = int(step_tmp[2])#百
+                                shi_value = int(step_tmp[3])#十
+                                ge_value = int(step_tmp[4])#个
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
+                                    if shi_value <= 0:#11109
+                                        if ge_value == 0:#11100
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11108
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                    else:
+                                        if ge_value == 0:#11110
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11116
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008
+                                    if shi_value > 0:
+                                        if ge_value == 0:#11010
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11016
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:   
+                                        if ge_value == 0:#11000
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11004
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                
+                                elif wang > 0:#1
+                                    if bai_value > 0:#百
+                                        if shi_value > 0:#10110
+                                            if ge_value == 0:#10150
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#10108
+                                            if ge_value == 0:#10100
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10108
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if shi_value > 0:
+                                            if ge_value == 0:#10090
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10098
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state") 
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None:
+                    if get_hr_state != 0:
+                        
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        if get_hr_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间
+
+                        EventMesh.debug_log("stop debug8")
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    if get_spo2_state != 0:
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        if get_spo2_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    if get_bp_state != 0:
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        if get_bp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop bp debug1")
+                    if get_bg_state != 0:
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        if get_bg_state == 1:#手动开灯关闭灯
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop BG  debug14")
+                    if get_temp_state != 0:
+                        
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                        if get_temp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_temp_measure_time",0)#
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.debug_log("stop temp  debug14")
+            if msg == 1:
+                self.usbState = msg
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.debug_log("charge R_CHARGE_IN")
+                
+                
+            elif msg == 2:
+                self.usbState = msg
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.debug_log("charge R_CHARGE_OUT")
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+            elif msg == 3:
+                self.usbState = msg
+                EventMesh.debug_log("charge full")
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                # if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                #     EventMesh.publish("close_timer_all")#
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+        def get_usb(self, event, msg):
+            return self.usbState
+        
+
+
+        def app_factory(self,event,msg):
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
+            ret = 0
+            ret = ql_fs.path_exists("/usr/static/storage_file")#
+            if ret == True:
+                ql_fs.rmdirs("/usr/static/storage_file")
+                ql_fs.mkdirs("/usr/static/storage_file")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+        
+            self.factory_timer.start(6*1000,0,self.factory_cb)
+            pass
+        def factory_cb(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def app_restart(self,event,msg):#远程发短信重启
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)
+            pass
+        def app_restart_cb(self,*argc):
+            Power.powerRestart()
+
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
+            EventMesh.publish("close_timer_all")#
+            if msg == 1:
+                EventMesh.publish("close_hr_sop2")#
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
+                
+            elif msg == 2:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",0])
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
+                EventMesh.publish("close_hr_sop2")#
+                # EventMesh.debug_log("power_off_audio_cb")
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+            elif msg == 3:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
+            elif msg == 4:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                ret = 0
+                ret = ql_fs.path_exists("/usr/static/storage_file")#
+                if ret == True:
+                    ql_fs.rmdirs("/usr/static/storage_file")
+                    ql_fs.mkdirs("/usr/static/storage_file")
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+                self.aud.stopPlayStream()
+                self.timer.start(6*1000,0,self.fun)
+            elif msg == 5:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",1])
+                
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
+
+        def fun(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+            
+
+        def power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 1
+        def clear_power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 0
+        
+        def power_on_audio_cb(self, msg):
+            self.power_on_flag = 1
+            # EventMesh.debug_log("power_on_audio_cb")
+            power_state = EventMesh.publish("get_storage_config","power_state")
+            if power_state == None:
+                power_state = 0
+            # print("power_state",power_state)
+            if power_state <= 0:
+                self.aud.stop()
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功
+            # EventMesh.publish("set_led_time_arg",[1000,200,10,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+            self.power_on_flag = 0
+            self.pwk_timer2.start(5000,0,self.power_on_cb)
+
+        def get_power_on_state(self, event, msg):
+            return self.power_on_flag
+        
+        def power_off_audio_cb(self, msg):
+            # EventMesh.debug_log("power_off_audio_cb")
+            self.aud.stop()
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+        
+        def power_off_no_audio_cb(self, msg):
+            EventMesh.debug_log("power_off_no_audio_cb")
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+
+        def set_power_off_cb(self, msg):
+            self.power_off = 1
+
+        def get_power_off_state(self, event, msg):
+            return self.power_off
+
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            if get_hr_state != None and get_spo2_state != None and get_temp_state != None and get_bg_state != None and get_bp_state != None:
+                if get_hr_state != 0:
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop hr")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+                if get_spo2_state != 0 :
+                    EventMesh.debug_log("stop spo2")
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                if get_temp_state != 0:
+                    EventMesh.debug_log("stop temp")
+                    EventMesh.publish("set_temp_state",0)
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
+                if  get_bg_state != 0:
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bg")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+                if  get_bp_state != 0:
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bp")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != 1:#不是手动测试直接打断
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("set_spo2_state",0)
+                    EventMesh.publish("set_bg_state",0)
+                    EventMesh.publish("set_bp_state",0)
+                    
+                    EventMesh.publish("set_hr_state",1)
+                    EventMesh.publish("clear_manual_hr_flag")
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试
+            elif msg == 2:
+                if get_hr_state == 0:
+                    if get_spo2_state != 1:
+                        EventMesh.debug_log("set_manual_measure_mode",msg)
+                        EventMesh.publish("set_spo2_state",1)
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                        EventMesh.publish("set_hr_blood_led",1)
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试
+            elif msg == 3:
+                if get_temp_state != 1:
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("clear_manual_temp_flag")
+                    EventMesh.publish("set_temp_state",1)
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试
+            pass
+
+
+        def set_start_measure_time(self, event, msg): #手动测试 1心
+            self.hr_auto = msg
+            pass
+
+        def get_start_measure_time(self, event, msg): #手动测试 
+
+            return  self.hr_auto
+        
+        def set_start_temp_measure_time(self, event, msg): #
+            self.temp_auto = msg
+            pass
+
+        def get_start_temp_measure_time(self, event, msg): #
+            return self.temp_auto
+
+        def mearsure_cb(self, event, msg):
+            if msg == 1:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            elif msg == 2:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 3:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 4:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            
+            
+            
+        def play_temp_value(self, event, msg): #播放体温数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg > 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.temp_value = msg
+                        # self.timer.start(2*1000,1,self.play_temp_fun)
+                        self.play_temp_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_temp_fun(self,argc): #播放体温数值
+            data = self.temp_value
+            if data > 42:
+                data = 42
+            data_tmp = str(data)
+            if data_tmp.find(".") != -1:
+                temp_shi = int(data_tmp.split('.')[0])//10
+                temp_ge = int(data_tmp.split('.')[0])%10
+                dot_ge = int(data_tmp.split('.')[1][:1])
+                if temp_ge > 0:#37.0
+                    if dot_ge > 0:#37.5
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:#37.0
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:#30.0 30.6
+                    if dot_ge > 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+            else:
+                temp_shi = int(data_tmp)//10
+                temp_ge = int(data_tmp)%10
+
+                if temp_ge > 0:#45
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            
+
+        def play_hr_value(self, event, msg): #播放心率数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 50:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        self.hr_value = msg
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_hr_fun)
+                        self.play_hr_fun(0)
+                    else:
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+        
+
+        def play_hr_fun(self,argc):#播放心率测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.hr_value
+                if data > 220:
+                    data = 220
+                if data < 100:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else: 
+                    shi = (data%100)//10 #210
+                    ge = (data%100)%10
+                    #210 234
+                    if shi > 0:
+                        if ge == 0:#210 230 120
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        if ge == 0:#200 100 209 108
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"))
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_sugar_value(self, event, msg): #播放血糖数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg != 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_sugar_fun(msg)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_sugar_fun(self,argc):#播放血糖测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = str(argc)
+                data_shi = 0
+                data_ge = 0
+                if data.find(".") != -1:
+                    data_shi = int(data.split(".")[0])
+                    data_ge = int(data.split(".")[1])
+                else:
+                    data_shi = int(data)
+                    data_ge = 0
+
+                if data_shi != 0 and data_ge != 0:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            else:
+                EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+
+
+        def play_spo2_value(self, event, msg): #播放血样数值
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 85:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.spo2_value = msg
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_spo2_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_spo2_fun(self,argc):#播放血氧测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.spo2_value
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data % 10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                # EventMesh.publish("stop_led_timer")#设置参数
+                mode = 0
+                signal = EventMesh.publish("get_sim_Status")
+                if signal != None:
+                    if signal == 1:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            mode = 2
+                        else:
+                            mode = 1
+                    else:#未插卡
+                        mode = 3
+                if mode == 1:#白色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_WHITE,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 2:#蓝灯色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 3:#红灯闪烁
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                pass
+            
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
+            flag = EventMesh.publish("get_call_state")
+            if flag == 0:
+            
+                signal = EventMesh.publish("screen_get_sig")
+                if signal != None:
+                    if signal >= 0 and signal <= 31:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            sos_number = EventMesh.publish("get_dial_sos_number")
+                            if sos_number != None:
+                                if len(sos_number) != 0:
+                                    EventMesh.publish("close_timer_all")#
+                                    EventMesh.publish("set_sos_flag",1)
+                                        
+                                else:#未设置sos紧急求助号码
+                                    EventMesh.publish("close_timer_all")#
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    pass
+                        else:
+                            EventMesh.publish("close_timer_all")#
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:#未插卡
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def play_cur_time_event(self, event, msg): #播放当前时间
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                
+                data = RTC().datetime()
+                hour = data[4]
+                min = data[5]
+                # EventMesh.debug_log("hour",hour,min)
+                self.old_hour = hour
+                self.old_min = min
+                if self.old_hour == 0:
+                    if self.old_min <= 9:#00:09
+                        if self.old_min == 0:#0点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#0点09分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                    else:
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:#0点2十8分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                elif self.old_hour <= 9:#8:09 9:20 9:45
+                    if self.old_min <= 9:#9点09分
+                        if self.old_min <= 0:
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#9点2十4分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+                else:#12:0
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
+                        self.play_count+=1
+                        hour_shi = self.old_hour//10
+                        hour_ge = self.old_hour%10
+                        if self.old_hour == 10:#十点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        elif self.old_hour == 20:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if hour_shi <= 1:#十3点整
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_hour == 10:#10:09 10:10
+                            if self.old_min <= 9:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if self.old_min % 10 == 0:#十点2十分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#十点2十1分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\
+                                    ,audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if self.old_hour < 20:#19:00
+                                if self.old_min <= 9:#19:09 
+                                    if self.old_min == 0:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        pass
+                                    else:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
+                                        ,audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    
+                                else:#19:18 19:40 19:56
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:#十9点2十1分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                hour_shi = self.old_hour//10
+                                hour_ge = self.old_hour%10
+
+                                min_shi = self.old_min//10
+                                min_ge = self.old_min%10
+
+                                #20:08 20:18  20:20
+                                if hour_ge == 0:
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                    else:
+                                        if min_ge == 0:#2十点2十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十点2十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                else:#21:08 21:18
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if min_ge == 0:#2十3点3十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十3点3十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_timer_cb_1(self,*agrs):
+            return
+
+        def play_center_phone(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
+            if flag == 0 and self.fall_flag == 0:
+                EventMesh.publish("close_timer_all")#
+            
+                center_dial = EventMesh.publish("get_storage_config","center_dial")
+                if center_dial != None:
+                    if len(center_dial) > 0:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        voiceCall.callStart(str(center_dial))
+                        
+                    
+                else:#未设置号码
+                    # EventMesh.debug_log("play_center_phone")
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+        def center_phone_cb(self,*argc): #msg
+            pass
+
+
+
+
+        def play_imei_event(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                EventMesh.debug_log(imei)
+                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def get_unread_wechat_state(self,event, msg): 
+
+            return self.set_unread_wechat
+        
+        def set_unread_wechat_state(self, event, msg): 
+            self.set_unread_wechat = msg
+
+        def get_wechat_data(self,event, msg): 
+
+            return [self.MXA_MSG ,self.wechat_recode_list]
+        
+        def set_wechat_data(self, event, msg): 
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
+            self.MXA_MSG = msg[0]
+            self.wechat_recode_list = msg[1]
+            self.wechat_num = self.wechat_recode_list["num"]
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.wechat_recode_list,fd)
+                #写编号
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
+        
+
+        def get_wechat_time(self, event, msg):
+            return  [self.press_btn,self.timeSecond]
+
+        def start_wechat_record(self, event, msg): #开始录音相关配置
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                    if self.press_btn == 0:
+                        self.press_btn = 1
+                        audio_state = EventMesh.publish("get_audio_state")
+                        if audio_state == 1:
+                            self.aud.stop()
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
+                    
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.timeSecond = time_tmp#保存按下的时间长s
+                        self.aud.setVolume(11)#设置音量最大
+                        
+                        EventMesh.debug_log("talking1.0")
+                        # if self.wechat_num >= self.MXA_MSG:
+                        #     self.wechat_num = 0 
+                        # self.wechat_num += 1
+                        # self.wechat_show = self.wechat_num
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
+                
+            else:
+                self.timeSecond = 0
+                self.press_btn = 0
+        def get_wechat_state(self, event, msg):
+            return self.press_btn
+        def set_wechat_state(self, event, msg):
+            self.press_btn = msg
+
+        def send_wechat_record(self, event, msg): #发送录音文件
+            if self.press_btn == 1:
+                self.press_btn = 0
+                self.record_test.stop() #停止錄音
+                EventMesh.publish("stop_led_timer")#关闭灯
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                self.countdown_old = 0
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+
+                self.countdown_old = msg
+                if self.countdown_old >= 15:
+                    self.countdown_old = 15
+                if self.countdown_old <= 0:
+                    #录音时间太短
+                    return
+                else:
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
+                    # self.wechat_recode_list["num"] = self.wechat_show
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
+                    if check_txt == True :
+                        path = "/usr/static/storage_file/wechat.amr"
+                        with open(path,"rb") as fd:
+                            buf = bytearray(ql_fs.path_getsize(path))
+                            fd.readinto(buf)
+                            senddata = [self.countdown_old,buf]
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
+                    # if check_txt == True :
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
+                    #     with open(path,"rb") as fd:
+                    #         buf = bytearray(ql_fs.path_getsize(path))
+                    #         fd.readinto(buf)
+                    #         senddata = [self.countdown_old,buf]
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+            else:
+                self.press_btn = 0
+
+
+
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
+                        if num != 0:
+                            last_num = str("%02d"%(num))
+                            last_tmp = self.wechat_recode_list[last_num]
+                            last_read = int(last_tmp.split(":")[1])
+                            if last_read == 1:#如果最后一条没有读则读最新的一条
+                                self.wechat_recode_list[last_num] = "read:0"
+                                self.wechat_recode_list["num"] = num 
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                    ujson.dump(self.wechat_recode_list,fd)
+                            else:
+                                sotr_new = {}
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                    key = sotr_new[i+1]
+                                    num_id = int(key)
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
+                                    if key in self.wechat_recode_list:#
+                                        str_tmp = self.wechat_recode_list[key]
+                                        read = int(str_tmp.split(":")[1])
+                                        if read != 0:#未读是按一下播放下一条同时删除
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
+                                            if check_amr == True:
+                                                self.wechat_recode_list[key] = "read:0"
+                                                self.wechat_recode_list["num"] = num 
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+                                                play_state = 1
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                                    ujson.dump(self.wechat_recode_list,fd)
+                                                break
+                                            else:
+                                                continue
+                                        else:
+                                            continue
+                                    else:
+                                        continue
+                            #EventMesh.debug_log("play_state:{}".format(play_state))
+                            # if play_state == 0:#
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
+                            if check_amr == True:
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+
+
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        if num != 0:
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                key = "%02d"%(i+1)
+                                if key in self.wechat_recode_list:#
+                                    str_tmp = self.wechat_recode_list[key]
+                                    read = int(str_tmp.split(":")[1])
+                                    if read == 1:#未读是按一下播放下一条同时删除
+                                        play_state = 1
+                                    else:
+                                        continue
+                                else:
+                                    continue
+                            if play_state == 1:#设置未读语音状态
+                                EventMesh.publish("set_unread_wechat_state",1)
+                            else:
+                                EventMesh.publish("set_unread_wechat_state",0)
+                                self.updateTime = 0
+
+                state = EventMesh.publish("get_unread_wechat_state")#
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if state != None:
+                    if state == 1:
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                        if self.updateTime == 0:
+                            self.updateTime = time_tmp
+                        if self.updateTime != 0:
+                            if time_tmp - self.updateTime >= 10*60:
+                                self.updateTime = time_tmp
+                                #播放音频文件
+                                EventMesh.publish("close_timer_all")
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        self.updateTime = 0
+            
+
+
+
+    class BtnDevice(Abstract):
+
+        def __init__(self, tp=None):
+            self.pk = PowerKey()
+            self.__pwk_timer = osTimer()
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            # self.keypad = machine.KeyPad(1, 2)
+            self.__PowerDownTimeOut = 3000
+            self.__tp = tp
+            self.pwk_press = 0
+            self.pwk_count = 0
+            self.GPIO26_status = 1#默认是低电平
+            self.powerKey_status = 0
+            self.sosKey = 0
+            self.wechatKey = 0
+            self.sosKey_status = 1#默认是低电平
+            self.WeChatKey_status = 1#默认是低电平
+
+            self.wechatKey_timer = osTimer()
+            self.wechatKey_count = 0
+            self.wechatKey_press = 0 
+
+            self.sosKey_timer = osTimer()
+            self.sosKey_count = 0
+            self.sosKey_press = 0 
+            self.sosKey_long_press = 0
+
+            self.wechatKey_press_count = 0
+
+            self.timeSeconOld = 0
+            self.wechat_state = 0 #按下录音时的状态
+
+            
+            self.sosKey_press_count = 0
+
+
+            self.pwkey_timer = osTimer()
+            self.pwKey_press_count = 0
+            self.pwkey_count = 0
+            self.pwkey_press = 0
+            self.led_state = 0
+            self.hsensorTest_timer = osTimer()
+            self.factoryTest_timer = osTimer()
+            self.factoryTest_count = 0
+            self.factory_timesec = 0
+            self.factoryTest_led_count = 0
+            self.factoryTest_flag = 0
+            self.btnInfo_queue = Queue()
+            _thread.stack_size(10*1024+192)
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)
+
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
+
+        def btnInfo_queue_thread(self):
+            while True:
+                data = self.btnInfo_queue.get()
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_btnInfo(self,event,msg):
+            self.btnInfo_queue.put(msg)
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+            
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  
+
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
+
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
+
+    
+
+        def post_processor_after_instantiation(self):
+            # self.keypad.init()
+            # self.keypad.set_callback(self.key_callback)
+        
+            self.pk.powerKeyEventRegister(self.powerKey_callback)
+            
+            self.extint = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+            self.extint.enable()
+
+            self.sosKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)
+            self.sosKey.enable()
+
+            self.wechatKey = ExtInt(ExtInt.GPIO20, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
+            self.wechatKey.enable()
+
+            key19 = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PU, 0)
+
+        def pwk_extint_cb(self,args):#侧边按键
+            # self.GPIO26_status = self.extint.read_level()
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0 or flag == 2:
+                    return
+            self.GPIO26_status = int(args[1])
+            if self.GPIO26_status == 0:
+                self.GPIO26_status = 1
+            else:
+                self.GPIO26_status = 0
+                pass
+            self.WeChatKey_status = self.wechatKey.read_level()
+            if self.sosKey_status != 0 and self.WeChatKey_status != 0:
+                if self.GPIO26_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.pwkey_press == 0 :
+                        self.aud.stop()  #播放声音 
+                        # self.wechatKey_timeout_cb(0)
+                        # self.sosKey_timeout_cb(0)
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        
+                        self.sosKey_press_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count = 0
+
+                        self.pwkey_press = 1
+                        self.pwkey_count = 0
+                        self.led_state = 0
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def pwKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            self.GPIO26_status = self.extint.read_level()
+            if self.pwkey_press == 1 :
+                self.pwkey_count += 1
+                if self.pwkey_count > 5:
+                    if self.led_state == 0:
+                        self.led_state = 1
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    if self.pwkey_count >= 10*10:
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.pwKey_press_count = 0
+                        self.led_state = 0
+                        # if EventMesh.publish("get_sim_Status") != 1:
+                        #     EventMesh.publish("open_power_on", 2)#
+                        # else:
+                        EventMesh.publish("open_power_on", 3)#
+                        return
+                    
+                    if self.pwkey_count >= 3*10 :
+                        if EventMesh.publish("get_sim_Status") != 1:
+                            EventMesh.debug_log("长3秒关机")
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            self.pwkey_timer.stop()
+                            self.pwkey_count = 0
+                            self.pwkey_press = 0
+                            self.pwKey_press_count = 0
+                            self.led_state = 0
+                            EventMesh.publish("open_power_on", 2)#
+                            return
+                            
+                    
+                if self.GPIO26_status == 1:#松开
+                    if self.pwkey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("self.GPIO26_status == 1")
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count+=1
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断
+
+        def  hsensorTest_timer_cb(self,e):
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
+        
+            c_data = self.Hsensor.get_test_data()#校准数据和工厂数据
+            # text_data = "   佩戴状态\n红外:{}活体:{}佩戴:{}\n{},{} \n{},{} \n{},{}\n校准数据:{},{},{},{}\n漏光数据:{},{},{}".format(
+            #                                             c_data[3],c_data[4],w_data,c_data[5],c_data[6],c_data[7],c_data[8],c_data[9],c_data[10],
+            #                                                 c_data[11],c_data[12],c_data[13],c_data[14],c_data[0],c_data[1],c_data[2],)
+                
+            if(self.hsensorTest_timer_count != 0):
+                    self.hsensorTest_timer_count -= 1
+                    if self.hsensorTest_timer_count%5 == 0:
+                        EventMesh.debug_log("c_data:{} {} {} {}".format(c_data[11],c_data[12],c_data[13],c_data[14]))
+                        if c_data[11] != 0 and c_data[13] != 0: #校准成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            self.Hsensor.close() 
+                            self.Hsensor.init()
+                            self.hsensorTest_timer.stop()
+                            return
+                    if self.hsensorTest_timer_count == 0:#50秒超时,失败
+                        self.Hsensor.close() 
+                        self.Hsensor.init(); 
+                        self.hsensorTest_timer.stop()
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
+        
+        def pwKey_timeout_cb(self, data):#侧边按键
+            boot_count = EventMesh.publish("get_boot_time_count")
+            try :
+                if boot_count < 50 :#开机50秒内按键次数大于10就校准
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.pwKey_press_count >= 6:
+                        self.Hsensor =  EventMesh.publish("get_Hsensor")
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) 
+                        EventMesh.debug_log("打开校准模式")
+                        self.Hsensor.set_sar(1)
+                        self.Hsensor.open_test(255) #打开校准模式
+                        utime.sleep_ms(500)
+                        self.Hsensor.open_heart()
+                        self.hsensorTest_timer_count = 50
+                        self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb)
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_HSENSOR_SPO2_TITLE"),)
+                        EventMesh.publish("play_audio_file",[str_data,1])
+                        self.pwKey_press_count = 0
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            if self.pwKey_press_count >= 1:
+                self.pwKey_press_count = 0
+
+                # flag = EventMesh.publish("get_call_state") 
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
+                #     EventMesh.publish("stop_led_timer")#设置参数
+                #     if flag == 1:#如果是sos电话拨出去
+                #         sos_flag = EventMesh.publish("get_sos_flag")
+                #         if sos_flag == 1:
+                #             EventMesh.publish("set_sos_flag",0)
+                #             EventMesh.publish("set_sos_num",0)
+                #             EventMesh.publish("set_hangup_mode",0)
+                #     EventMesh.publish("close_hr_sop2")#
+                #     flag = EventMesh.publish("get_call_state") 
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音
+                #         EventMesh.publish("set_sim_mode")#
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+                
+                # EventMesh.debug_log("pwKey_timeout_cb:self.pwKey_press_count >= 1")
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+
+                    if flag == 1:#如果是sos电话拨出去
+                        sos_flag = EventMesh.publish("get_sos_flag")
+                        if sos_flag == 1:
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                            EventMesh.publish("set_hangup_mode",0)
+                    EventMesh.publish("close_hr_sop2")#
+                    flag = EventMesh.publish("get_call_state") 
+                    if flag != 1:
+                        EventMesh.publish("set_sim_mode")#
+            
+            self.pwKey_press_count = 0
+
+        def sosKey_extint_cb(self,args):
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if power_off != None and open_power != None:
+                if power_off == 1 or open_power == 0:
+                    return
+            # self.sosKey_status = self.sosKey.read_level()
+            self.sosKey_status = int(args[1])
+            if self.sosKey_status == 0:
+                self.sosKey_status = 1
+            else:
+                self.sosKey_status = 0
+                pass
+            # wechat_state = EventMesh.publish("get_wechat_state")
+            # EventMesh.debug_log('### key22_extint_cb  {} {} self.GPIO22_status:{} {} {}'.format(wechat_state,args,self.WeChatKey_status,self.GPIO26_status,self.sosKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0:
+                if self.sosKey_status == 0:#按下
+                    EventMesh.publish("close_falldown_alarm_event")#sos短按事件
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.sosKey_press == 0 :
+                        self.led_state = 0
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.wechatKey_press_count = 0
+                        self.wechat_state = 0
+                        self.wechatKey_count = 0
+                        self.pwKey_press_count = 0
+                        
+                        self.pwkey_press = 0
+                        self.wechatKey_press = 0
+                        
+                        self.sosKey_long_press = 0
+                        self.sosKey_count = 0
+                        self.sosKey_press = 1
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def sosKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            self.sosKey_status = self.sosKey.read_level()
+            if self.sosKey_press == 1 :
+                # if self.sosKey_count <= 2:
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    # else:
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                self.sosKey_count += 1
+                if self.sosKey_count >= 10*3: #长按3s sos拨号
+                    if self.sosKey_long_press == 0:
+                        self.sosKey_long_press = 1
+                        flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0 or flag == 2:
+                                return
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                        return
+                    if self.sosKey_status == 1:#松开
+                        self.sosKey_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_timer.stop()
+                        return
+
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
+                if self.sosKey_status == 1:#松开
+                    if self.sosKey_count >= 1: #防抖100ms
+                        self.sosKey_timer.stop()
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count+=1
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
+        
+        def close_factory_test(self):#关闭老化测试
+            if self.factoryTest_flag == 1:
+                self.factoryTest_flag = 0
+                close_led_white()
+                close_led_red()
+                close_led_green()
+                self.factoryTest_led_count = 0
+                self.factoryTest_count = 0
+                self.aud.stopPlayStream()
+                self.factoryTest_timer.stop()
+
+        def factoryTest_timer_cb(self,e):
+            # self.factoryTest_count+=1
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+
+            if time_tmp - self.factory_timesec > 60*60*2:#老化测试2小时自动退出
+                # self.factoryTest_count = 0
+                self.close_factory_test()
+                return
+            #播放音频 
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+            if EventMesh.publish("get_audio_state") == 0:
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+            #led灯常亮
+            self.factoryTest_led_count+=1
+            if self.factoryTest_led_count == 1:#1  4 7  10 
+                open_led_red()
+                close_led_green()
+                close_led_white()
+            elif self.factoryTest_led_count == 2:
+                open_led_green()
+                close_led_red()
+                close_led_white()
+            elif self.factoryTest_led_count == 3: #3  6 9 12 
+                open_led_white()
+                close_led_red()
+                close_led_green()
+            if self.factoryTest_led_count >= 3+1:
+                self.factoryTest_led_count = 0
+            
+            
+
+
+            pass
+        def sosKey_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            factory_count = EventMesh.publish("get_factory_test_time")
+            print("factory_count:%d",factory_count)
+            try :
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.sosKey_press_count >= 15:
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.factory_timesec = time_tmp
+                        self.sosKey_press_count = 0
+                        self.factoryTest_led_count = 0
+                        self.factoryTest_flag = 1
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+
+            # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if self.sosKey_press_count > 1:#短按十次解绑app
+                if fall_down != None:
+                    if fall_down != 0 or flag == 2:
+                        self.sosKey_press_count = 0
+                        return
+            if self.sosKey_press_count == 10:#
+                self.sosKey_press_count = 0
+                pass
+            elif self.sosKey_press_count == 6:#
+                self.sosKey_press_count = 0
+                self.close_factory_test()
+                pass
+            elif self.sosKey_press_count == 5:#功能暂时屏蔽
+                self.sosKey_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                pass
+            elif self.sosKey_press_count == 4:#拨打app快捷号码
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_center_phone")#拨打快捷号码
+                # EventMesh.publish("call_phonebook_num",3)
+                pass
+            elif self.sosKey_press_count == 3:#测试心率
+                self.sosKey_press_count = 0
+                
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",1)#
+                pass
+            elif self.sosKey_press_count == 2:#播报当前步数
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_cur_step_event")#
+                pass
+            elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                self.sosKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("sos_short_press")#sos短按事件
+                
+                pass
+            self.sosKey_press_count = 0
+
+
+        def wechatKey_extint_cb(self,args):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            # self.WeChatKey_status = self.wechatKey.read_level()
+            self.WeChatKey_status = int(args[1])
+            if self.WeChatKey_status == 0:
+                self.WeChatKey_status = 1
+            else:
+                self.WeChatKey_status = 0
+                pass
+            
+            # EventMesh.debug_log('### wechatKey_extint_cb  {} {} self.WeChatKey_status:{} {} {}'.format(wechat_state,args,self.sosKey_status,self.GPIO26_status,self.WeChatKey_status)) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.sosKey_status != 0 and self.GPIO26_status != 0:
+                if self.WeChatKey_status == 0:#按下
+                    if self.wechatKey_press == 0:
+                        # self.pwKey_timeout_cb(0)
+                        # self.sosKey_timeout_cb(0)
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.sosKey_press_count = 0
+                        self.sosKey_long_press = 0
+                        self.pwKey_press_count = 0
+                        self.sosKey_press = 0
+                        self.pwkey_press = 0
+                        self.wechatKey_press = 1
+                        self.led_state = 0
+                        self.wechatKey_count = 0
+                        self.wechat_state = 0
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
+                else:
+                    # EventMesh.debug_log('### wechatKey_extint_cb end')
+                    EventMesh.publish("close_wechat_btn_timer")
+
+
+        def close_wechat_btn_timer(self,event,*argc):
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+            wechat_time = 0
+            time_tmp = 0
+            time_sec = 0
+
+            if tmp != None:
+                if tmp[0] == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    
+                    date_tmp = utime.localtime()
+                    time_tmp = utime.mktime(date_tmp)
+                    time_sec = tmp[1]
+                    wechat_time = time_tmp - time_sec
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
+                    if wechat_time >= 15:
+                        wechat_time = 15
+                    if wechat_time <= 0:
+                        wechat_time = 0
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+        
+
+        def wechatKey_press_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            # print("100ms self.WeChatKey_status",self.WeChatKey_status)
+            wechat_time = 0
+            tmp = None
+            time_sec = 0
+            time_tmp = 0
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.wechatKey_press == 1 :#是否按下
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+                self.wechatKey_count += 1
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音
+                    flag = EventMesh.publish("get_call_state") 
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if flag != None:
+                        if flag == 0 and fall_down == 0:
+                            if self.WeChatKey_status == 0:
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                                    if self.wechat_state == 0:#按下超过s开始录音
+                                        EventMesh.publish("start_wechat_record")#开始录音
+                                        self.wechat_state = 1
+                                else:
+                                    self.wechat_state = 0
+                                    self.wechatKey_timer.stop()
+                                    self.wechatKey_count = 0
+                                    self.wechatKey_press = 0
+                                    self.wechatKey_press_count=0
+                                    EventMesh.publish("set_sim_mode")#播報imei号
+                                    return
+
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音
+                                if self.wechat_state == 1:
+                                    if tmp != None:
+                                        if tmp[0] != 0:
+                                            time_sec = tmp[1]
+                                            if time_tmp - time_sec >= 15:
+                                                wechat_time = time_tmp - time_sec
+                                                if wechat_time >= 15:
+                                                    wechat_time = 15
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                                
+                                                self.wechatKey_timer.stop()
+                                                self.wechatKey_count = 0
+                                                self.wechatKey_press = 0
+                                                self.wechat_state = 0
+                                                self.wechatKey_press_count=0
+                                                return
+                            else:
+                                if self.WeChatKey_status == 1:
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊
+                                        if tmp != None:
+                                            if tmp[0] != 0:
+                                                time_sec = tmp[1]
+                                                wechat_time = time_tmp - time_sec
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)
+                                            if wechat_time >= 15:
+                                                wechat_time = 15
+                                        
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                        self.wechatKey_timer.stop()
+
+                                        self.wechatKey_count = 0
+                                        self.wechatKey_press = 0
+                                        self.wechat_state = 0
+                                        self.wechatKey_press_count=0
+                                        return
+                        else:
+                            self.wechatKey_timer.stop()
+                            self.wechatKey_count = 0
+                            self.wechat_state = 0
+                            self.wechatKey_press = 0
+                            self.wechatKey_press_count=0
+                            return
+                if self.WeChatKey_status == 1:#松开
+                    if self.wechatKey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
+                        self.wechatKey_timer.stop()
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count+=1
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
+
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
+
+        def wechatKey_timeout_cb(self,data):#微聊键
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if self.wechatKey_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag == 2:
+                        self.wechatKey_press_count = 0
+                        return
+            # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+            if self.wechatKey_press_count == 10:#短按十次解绑app
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("open_power_on", 4)#恢复出厂
+                pass
+            elif self.wechatKey_press_count == 6:#短按六次播报imei号
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("play_imei_event")#播報imei号
+                pass
+            elif self.wechatKey_press_count == 4:#拨打通讯录号码三
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("call_phonebook_num",3)
+                pass
+            elif self.wechatKey_press_count == 3:#拨打通讯录号码二
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("call_phonebook_num",2)
+                pass
+            elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.wechatKey_press_count = 0
+                EventMesh.publish("call_phonebook_num",1)
+            # EventMesh.publish("interup_call_event")#
+                pass
+            elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                self.wechatKey_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                call_state = EventMesh.publish("get_call_state") 
+                if call_state == 0:
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None:
+                        if fall_down != 0:
+                            EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                            return
+                else:
+                    if call_state == 2:#电话拨进需要接听
+                        EventMesh.publish("answer_call_event")#接听电话
+                        return
+                EventMesh.publish("play_wechat_last_amr")
+                # pass
+            self.wechatKey_press_count = 0
+
+
+        def pwk_press_cb(self, *args):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.pwk_press == 1 :
+                
+                self.pwk_count += 1
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
+                if self.GPIO26_status == 1:#松开
+                    if self.pwk_count >= 1: #防抖100ms
+                        self.__pwk_timer.stop()
+                        self.pwk_count = 0
+                        self.pwk_press = 0
+                        EventMesh.debug_log("self.GPIO22_status")
+
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
+                    self.__pwk_timer.stop()
+                    self.pwk_count = 0
+                    self.pwk_press = 0
+                    EventMesh.debug_log("btn8_long_press")
+
+        def __ui_callback(self, para):
+        # EventMesh.debug_log("para = {}".format(para))
+            if para == 0:
+                EventMesh.publish("done_left_to_right")
+                #EventMesh.debug_log("<-")
+            elif para == 1:
+                EventMesh.publish("done_right_to_left")
+                #EventMesh.debug_log("->")
+            elif para == 2:
+                EventMesh.publish("done_bottom_to_top")
+                #EventMesh.debug_log("^")
+            elif para == 3:
+                EventMesh.publish("done_top_to_bottom")
+                #EventMesh.debug_log("V")
+            elif para == 4:
+                EventMesh.publish("done_return")
+                #EventMesh.debug_log("return")
+            elif para == 5:
+                EventMesh.publish("done_click")
+                #EventMesh.debug_log("CLICK")
+            elif para == 6:
+                EventMesh.publish("done_press")
+                #EventMesh.debug_log("press")
+            elif (para == 6):
+                EventMesh.publish("done_error")
+                #EventMesh.debug_log("error")
+
+        def key_callback(self, l_list):
+            EventMesh.debug_log("key_callback:",str(l_list))
+            if l_list[0] == 1:
+                # 马达震动预留
+                pass
+            if (l_list[1] == 3) and (l_list[2] == 0):
+                if l_list[0] == 1:
+                    #self.pwk_press = 0
+                    EventMesh.publish("btn1_press")
+                else:
+                    pass
+                    # EventMesh.publish("btn1_press")
+
+
+
+
+        def powerKey_callback(self, status):
+            EventMesh.debug_log('==pwr:', status)# 0 1 0
+            self.powerKey_status = status
+            if self.pwk_press == 1: #按按钮时不处理
+                return
+        
+            
+                
+
+        def power_key_press_cb(self, *args):
+            pass
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
+                # EventMesh.publish("open_power_on", 2)#
+
+
+        def start(self):
+            self.post_processor_after_instantiation()
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/btn_device_ec800m_d15.py
new file mode 100644 (file)
index 0000000..3f31f1c
--- /dev/null
@@ -0,0 +1,4012 @@
+from common import Abstract
+import machine
+import osTimer
+from misc import PowerKey
+import EventMesh
+from machine import Pin
+from machine import ExtInt
+import constants
+import utime
+import audio
+import ql_fs
+import ujson
+import voiceCall
+from misc import Power
+
+from machine import RTC
+from queue import Queue
+import _thread
+import usys
+import sms
+
+NEW_ENABLE = 0 #1代表旧的按键功能定义 0代表新的按键功能定义
+if EventMesh.model == "D15" :
+    from led_d15 import red_green_light,green_light_fast,led_mode,open_led_red,open_led_white,close_led_red,open_led_green,close_led_green,close_led_white
+
+    motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
+
+    audio_buf = ['audio_find_haixiu', 'R_ALARM_NEW', 'R_BLOOD_SUGAR', 'R_CALL_mp3', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_CUR_BATTERY_LEVEL', 'R_DRINK_ALARM', 'R_FALL_ALARM', 'R_HOME_ALARM', 'R_HSENSOR_RESULT_FAILE', 'R_HSENSOR_RESULT_HR_TITLE', 'R_HSENSOR_RESULT_OK', 'R_HSENSOR_SPO2_TITLE', 'R_HSENSOR_TEMP_TITLE', 'R_MEDICINE_ALARM', 'R_NO_SET_SOS_DIAL', 'R_NO_SET_VIDOE', 'R_NO_SIM', 'R_POWER_OFF_1', 'R_READ_STEP_0', 'R_READ_STEP_1', 'R_READ_STEP_2', 'R_READ_STEP_3', 'R_READ_STEP_4', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_READ_TIME_MIN', 'R_READ_TIME_ZHENG', 'R_RESET_ALARM', 'R_RESET_END_ALARM', 'R_SIM_CONNECT', 'R_SIM_FAILE', 'R_SLEEP_ALARM', 'R_SOS_ALERT', 'R_TSENSOR_RESULT_VALUE_DOT', 'R_UNREAD_WECHAT', 'R_VIDEO_ANSWER', 'R_VIDEO_ANSWERING', 'R_VIDEO_CALL_CONNECT', 'R_VIDEO_CALL_ENDING', 'R_VIDEO_CALL_IN', 'R_VIDEO_VOICE_IN', 'R_VIDEO_WAITING', 'R_WAKEUP_ALARM', 'R_WECHAT_RECV']
+
+
+    class call:
+        CALL_OUT = 1
+        CALL_IN = 2
+        ON_CALL = 3
+
+
+    class intervManager(Abstract):
+        def __init__(self):
+            self.timer = osTimer()
+
+            self.pwk_timer1 = osTimer()
+            self.pwk_timer2 = osTimer()
+            self.timer1 = osTimer()
+            self.sos_timer2 = osTimer()
+            self.sos_timer1 = osTimer()
+
+            self.sos_sendtime = osTimer()
+
+            self.fall_timer1 = osTimer()
+            self.fall_timer2 = osTimer()
+
+            self.alarm_timer1 = osTimer()
+
+            self.find_timer1 = osTimer()
+            self.fall_flag = 0
+
+            self.factory_timer = osTimer()
+            
+            self.restart_timer = osTimer()
+
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            self.play_count = 0
+            self.count = 0
+
+            self.get_hr_state  = 0
+            self.get_spo2_state = 0
+            self.timeSec = 0
+            self.timeTempSec = 0
+
+            self.hr_value = 0
+            self.spo2_value = 0
+            self.temp_value = 0
+
+            self.usbState = 0
+
+            self.setp_old = 0
+            self.step_tmp = ""
+            self.step_num = 0
+            self.power_off = 0
+            self.call_state = 0
+
+            self.find_state = 0
+            self.FIND_timer_count = 0
+
+            self.old_hour = 0
+            self.alarm_state = 0
+            self.alarm_timer_count = 0
+            self.old_min = 0
+            self.interInfo_queue = Queue()
+            _thread.stack_size(10*1024+64)
+            _thread.start_new_thread(self.interInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_interInfo",self.publish_message_event_interInfo)
+            
+
+            self.audio_event_queue = Queue()
+            _thread.stack_size(10*1024+128)
+            _thread.start_new_thread(self.audio_event_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_audio",self.publish_message_event_audio)
+
+            self.record_test = audio.Record()
+            self.record_test.gain_set(4,12)
+
+            self.timeSecond = 0
+            self.wechat_show = 0
+            self.sort_new = {}
+            self.time_min = 0
+            self.press_btn = 0
+            self.countdown_old = 0
+            self.set_unread_wechat = 0
+            self.updateTime = 0
+            
+            self.power_on_flag = 0
+
+            self.MXA_MSG = 1
+            self.wechat_recode_list = {"num":0}
+            self.wechat_num = 0
+            self.read_data = {}
+            self.volum_size = 8 
+            self.phone_num = ''
+            self.sos_phone_num = ''
+            self.msg_tmp = ""
+            self.time_count = 0
+            self.alarm_count = 0
+            self.audio_int = 0
+
+            self.hr_auto = 0
+
+            self.temp_auto = 0
+
+            self.video_count = 0
+
+            self.sos_state = 0
+
+            self.video_call_state = 0#视频通话拨进来还是拨出去的状态 1代表是正在拨进或者拨出去
+
+            self.video_call_in_mode = 0 #0是语音 1是视频通话
+            
+            check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")
+            if check_txt == True :
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
+                    self.wechat_recode_list = ujson.load(fd)
+                    if not self.wechat_recode_list:
+                        self.wechat_recode_list = {"num":0}
+                        self.wechat_num = 0
+            else:
+                self.wechat_recode_list = {"num":0}
+                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    ujson.dump(self.wechat_recode_list,fd)         
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("open_power_on", self.open_power_on)#开机关机
+
+            EventMesh.subscribe("play_imei_event", self.play_imei_event)#播報imei号
+            EventMesh.subscribe("play_center_phone", self.play_center_phone)#拨打快捷号码
+            EventMesh.subscribe("play_cur_time_event", self.play_cur_time_event)#播放当前时间
+
+            EventMesh.subscribe("OPEN_FIND_WATCH", self.send_find_watch)#查找设备
+            EventMesh.subscribe("STOP_FIND_WATCH", self.stop_find_watch)#是否需要关闭查找设备
+            EventMesh.subscribe("close_timer_all", self.close_timer_all)#关闭相关定时器
+
+            EventMesh.subscribe("dial_sos_phone", self.dial_sos_phone)#长按3s拨打sos求助号码
+
+            EventMesh.subscribe("set_sim_mode", self.set_sim_mode)#sim检测
+
+            EventMesh.subscribe("close_hr_sop2", self.close_hr_sop2)#关闭健康测试
+            EventMesh.subscribe("set_manual_measure_mode", self.set_manual_measure_mode)#设置测试模式
+            EventMesh.subscribe("set_start_measure_time", self.set_start_measure_time)#设置开始测量的时间戳时间
+            EventMesh.subscribe("get_start_measure_time", self.get_start_measure_time)#获取开始测量的时间戳时间
+            EventMesh.subscribe("set_start_temp_measure_time", self.set_start_temp_measure_time)#设置体温开始测量的时间戳时间
+            EventMesh.subscribe("get_start_temp_measure_time", self.get_start_temp_measure_time)#获取体温开始测量的时间戳时间
+            EventMesh.subscribe("play_hr_value", self.play_hr_value)#播放心率数值
+            EventMesh.subscribe("play_spo2_value", self.play_spo2_value)#播放心率数值
+            EventMesh.subscribe("play_temp_value", self.play_temp_value)#播放体温数值
+
+            EventMesh.subscribe("play_sugar_value", self.play_sugar_value)#播放血糖数值
+
+            EventMesh.subscribe("play_battery_level_value", self.play_battery_level_value)
+
+
+            EventMesh.subscribe("set_usb", self.set_usb)#
+            EventMesh.subscribe("get_usb", self.get_usb)#
+
+            EventMesh.subscribe("play_cur_step_event", self.play_cur_step_event)#
+
+            EventMesh.subscribe("set_call_state", self.set_call_state)#1是 拨出去呼叫中 2是播进来 3 是正在通话中 0是无效
+            EventMesh.subscribe("get_call_state", self.get_call_state)#
+            EventMesh.subscribe("interup_call_event", self.interup_call_event)#
+            EventMesh.subscribe("answer_call_event", self.answer_call_event)#接听电话
+            EventMesh.subscribe("dialin_call_event", self.dialin_call_event)#电话拨进响铃
+            EventMesh.subscribe("dialing_out_event", self.dialing_out_event)#电话呼叫中
+            EventMesh.subscribe("call_test_event", self.call_test_event)#电话拨进响铃测试
+
+            EventMesh.subscribe("dial_out_call_center_cb", self.dial_out_call_center_cb)#电话拨出去
+            EventMesh.subscribe("sos_out_call_center_cb", self.sos_out_call_center_cb)#sos拨打
+
+            EventMesh.subscribe("close_audio_play", self.close_audio_play)#关闭音频
+
+            #视频通话
+            EventMesh.subscribe("video_call_in_event", self.video_call_in_event)#视频通话拨进中
+            EventMesh.subscribe("video_call_out_cb", self.video_call_out_cb)#视频通话拨进中
+            EventMesh.subscribe("video_waite_timer_cb", self.video_waite_timer_cb)#对方正在接听中
+
+            EventMesh.subscribe("video_answer_timer_cb", self.video_answer_timer_cb)#对方已接听
+            EventMesh.subscribe("video_answer_mode_timer_cb", self.video_answer_mode_timer_cb)#对方已接听
+
+            EventMesh.subscribe("dev_video_end_timer_cb", self.dev_video_end_timer_cb)#对方未接通挂断了
+
+            
+
+            EventMesh.subscribe("get_video_in_out_state", self.get_video_in_out_state)#获取拨进还是拨出的状态
+            EventMesh.subscribe("set_video_in_out_state", self.set_video_in_out_state)#清除标识
+            
+            
+            
+
+            EventMesh.subscribe("start_wechat_record", self.start_wechat_record)#手表开始录音
+            EventMesh.subscribe("send_wechat_record", self.send_wechat_record)#发送微聊语音文件to app
+            EventMesh.subscribe("play_wechat_last_amr", self.play_wechat_last_amr)#播放微聊语音最后一条语音文件
+            EventMesh.subscribe("get_wechat_data", self.get_wechat_data)
+            EventMesh.subscribe("set_wechat_data", self.set_wechat_data)
+            EventMesh.subscribe("play_unread_wechat_infor", self.play_unread_wechat_infor)#按键播放最近一条微聊语音
+            EventMesh.subscribe("set_unread_wechat_state", self.set_unread_wechat_state)#设置未读标识
+            EventMesh.subscribe("get_unread_wechat_state", self.get_unread_wechat_state)#获取未读标志
+            EventMesh.subscribe("get_wechat_time", self.get_wechat_time)#获取微聊时间戳
+            EventMesh.subscribe("get_wechat_state", self.get_wechat_state)#获取微聊时间戳
+
+
+            EventMesh.subscribe("get_power_on_state", self.get_power_on_state)#获取开机标识
+            EventMesh.subscribe("get_power_off_state", self.get_power_off_state)#获取关机标识
+
+            EventMesh.subscribe("play_audio_file", self.play_audio_file)#获取播放音频文件
+
+            EventMesh.subscribe("OPEN_ALARM_RING", self.send_alarm_ring)#闹钟到点响铃
+            EventMesh.subscribe("STOP_ALARM_RING", self.stop_alarm_ring)#是否需要关闭闹钟
+
+            EventMesh.subscribe("recv_wechat_audio", self.recv_wechat_audio)#
+
+
+            EventMesh.subscribe("sos_short_press", self.sos_short_press)#sos短按事件
+
+            EventMesh.subscribe("falldown_alarm_event", self.falldown_alarm_event)#跌倒报警
+
+            EventMesh.subscribe("close_falldown_alarm_event", self.close_falldown_alarm_event)#关闭跌倒报警
+
+            EventMesh.subscribe("drink_alarm_event", self.drink_alarm_event)#该喝水了
+
+            EventMesh.subscribe("medicine_alarm_event", self.medicine_alarm_event)#该吃药了
+
+            EventMesh.subscribe("wakeup_alarm_event", self.wakeup_alarm_event)#该起床了
+
+            EventMesh.subscribe("home_alarm_event", self.home_alarm_event)#该回家了
+
+            EventMesh.subscribe("sleep_alarm_event", self.sleep_alarm_event)#该睡觉了
+
+            EventMesh.subscribe("reset_alarm_event", self.reset_alarm_event)#该休息了
+
+            EventMesh.subscribe("reset_end_alarm_event", self.reset_end_alarm_event)#休息结束了
+
+            EventMesh.subscribe("get_fall_down_state", self.get_fall_down_state)#跌倒报警标识
+
+            EventMesh.subscribe("app_factory", self.app_factory)#app恢复出厂
+
+            EventMesh.subscribe("app_restart", self.app_restart)#远程重启
+
+            EventMesh.subscribe("get_sos_state_out", self.get_sos_state_out)#正在拨打sos电话
+
+            EventMesh.subscribe("set_sos_state_out", self.set_sos_state_out)#清除在拨打sos电话
+
+        def interInfo_queue_thread(self):
+            while True:
+                data = self.interInfo_queue.get()
+                #EventMesh.debug_log("interInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("interInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+        def publish_message_event_interInfo(self,event,msg):
+            self.interInfo_queue.put(msg)
+
+        def publish_call_event_cb(self, *args, **kwargs):#拨打电话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.call_timer_cb,"data":0})
+
+        def publish_video_in_event_cb(self, *args, **kwargs):#视频通话拨入
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_in_timer_cb,"data":0})  
+
+        def publish_video_out_event_cb(self, *args, **kwargs):#拨打视频通话
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.video_out_timer_cb,"data":0})  
+
+        def publish_resatrt_down_event_cb(self, *args, **kwargs):#重启设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.powe_resatrt_down_fun,"data":0})  
+        
+        def publish_power_down_event_cb(self, *args, **kwargs):#关机
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.power_down_fun,"data":0})  
+
+        def publish_find_watch_event_cb(self, *args, **kwargs):#查找设备
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.FIND_timer_cb,"data":0})  
+
+        def publish_alarm_ring_event_cb(self, *args, **kwargs):#闹钟响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.Alarm_timer_cb,"data":0})  
+
+        def publish_reset_alarm_ring_event_cb(self, *args, **kwargs):#休息响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_alarm_event_cb,"data":0})  
+        
+        def publish_reset_end_alarm_ring_event_cb(self, *args, **kwargs):#休息结束响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.reset_end_alarm_event_cb,"data":0})  
+        
+        def publish_sleep_alarm_ring_event_cb(self, *args, **kwargs):#睡觉响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.sleep_alarm_event_cb,"data":0})  
+        
+        def publish_home_ring_event_cb(self, *args, **kwargs):#回家响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.home_alarm_event_cb,"data":0})  
+
+        def publish_wakeup_ring_event_cb(self, *args, **kwargs):#起床响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.wakeup_alarm_event_cb,"data":0})  
+
+        def publish_medicine_ring_event_cb(self, *args, **kwargs):#吃药响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.medicine_alarm_event_cb,"data":0})  
+
+        def publish_drink_ring_event_cb(self, *args, **kwargs):#喝水响铃
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.drink_alarm_event_cb,"data":0})  
+
+        def publish_fall_done_ring_event_cb(self, *args, **kwargs):#跌倒提醒
+            EventMesh.publish("publish_message_event_interInfo",{"func":self.falldown_alarm_cb,"data":0})  
+
+
+        def reset_alarm_event(self,args,msg):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_reset_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def reset_alarm_event_cb(self,args):#该休息了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def reset_end_alarm_event(self,args,msg):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.reset_end_alarm_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def reset_end_alarm_event_cb(self,args):#休息结束了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_RESET_END_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def sleep_alarm_event(self,args,msg):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_sleep_alarm_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        def sleep_alarm_event_cb(self,args):#该睡觉了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SLEEP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def home_alarm_event(self,args,msg):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_home_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def home_alarm_event_cb(self,args):#该回家了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HOME_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+        
+        def wakeup_alarm_event(self,args,msg):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_wakeup_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def wakeup_alarm_event_cb(self,args):#该起床了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WAKEUP_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+
+        def medicine_alarm_event(self,args,msg):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_medicine_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def medicine_alarm_event_cb(self,args):#该吃药了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_MEDICINE_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+
+        def drink_alarm_event(self,args,msg):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count = 0
+                self.alarm_timer1.start(2000, 1, self.publish_drink_ring_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            
+
+
+        def drink_alarm_event_cb(self,args):#该喝水了
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                self.alarm_count += 1# 1 2 
+                if self.alarm_count >= 3:
+                    self.alarm_count = 0
+                    self.alarm_timer1.stop()
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_DRINK_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.alarm_count = 0
+                self.alarm_timer1.stop()
+            
+        def falldown_alarm_event(self,args,msg):#跌倒报警启动中提示
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                self.time_count = 0
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.fall_flag = 1
+                self.fall_timer1.start(4000, 1, self.publish_fall_done_ring_event_cb)
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def falldown_alarm_cb(self,*args):
+            wechat_state = EventMesh.publish("get_wechat_state")
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.call_state == 0 and wechat_state == 0 and video_state == 0:
+                self.time_count+=1
+                if self.time_count >= 5:
+                    self.time_count = 0
+                    self.fall_timer1.stop()
+                    EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                    return
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_FALL_ALARM"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                self.time_count = 0
+                self.fall_timer1.stop()
+        
+        def close_falldown_alarm_event(self,event,msg):#跌倒挂断挂断
+            if self.fall_flag == 1:#跌倒标志
+                self.fall_flag = 0
+                self.fall_timer1.stop()
+                self.sos_timer1.stop()
+                self.sos_timer2.stop()
+                if self.call_state != 0:
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+
+        
+
+        def send_find_watch(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
+                EventMesh.publish("close_timer_all")#
+                self.find_state = 1
+                self.FIND_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_find_watch_event_cb)
+                EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_motor_time",[1,2,8*3,8,4])#设置马达参数
+
+        def stop_find_watch(self, event, msg): 
+            if self.find_state == 1:
+                self.find_state = 0
+                self.FIND_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #播放声音 
+                self.alarm_timer1.stop()
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器
+
+        def FIND_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                if self.find_state == 1:
+                    # EventMesh.debug_log("self.FIND_timer_count:{}".format(self.FIND_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("audio_find_haixiu"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    #EventMesh.publish("set_motor_time",[1,2,8*2,8,4])#设置马达参数
+                    self.FIND_timer_count += 1
+                    if self.FIND_timer_count > 10: #120秒30s
+                        EventMesh.publish("STOP_FIND_WATCH")
+            else:
+                self.FIND_timer_count = 0
+                self.alarm_timer1.stop()
+                
+        
+        def stop_FIND(self) :
+            self.alarm_timer1.stop()
+
+        def send_alarm_ring(self, event, msg): #发送查找设备指令
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0 :
+                EventMesh.publish("close_timer_all")#
+                self.alarm_state = 1
+                self.alarm_timer_count = 0
+                self.alarm_timer1.start(3000,1,self.publish_alarm_ring_event_cb)
+                # EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,33000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def stop_alarm_ring(self, event, msg): #停止闹钟响铃
+            if self.alarm_state == 1:
+                self.alarm_state = 0
+                self.alarm_timer_count = 0
+                # EventMesh.publish("stop_led_timer")#设置参数
+                self.aud.stopPlayStream()  #停止播放
+                self.alarm_timer1.stop()
+
+        def Alarm_timer_cb(self, data):
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0:
+                if self.alarm_state == 1:
+                    # EventMesh.debug_log("self.alarm_timer_count:{}".format(self.alarm_timer_count))
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    self.alarm_timer_count += 1
+                    if self.alarm_timer_count > 15: #120秒30s
+                        EventMesh.publish("STOP_ALARM_RING")
+            else:
+                self.alarm_timer_count = 0
+                self.alarm_timer1.stop()
+
+        def get_fall_down_state(self,event,msg):
+            return self.fall_flag
+
+        def sos_short_press(self,args,msg):
+            EventMesh.publish("interup_call_event")#如果在电话中强制挂断电话
+            EventMesh.publish("close_audio_play")#强制关闭音频文件播放
+            EventMesh.publish("STOP_FIND_WATCH")#停止查找设备
+            EventMesh.publish("STOP_ALARM_RING")#停止闹钟响铃
+            if NEW_ENABLE == 0:#新的按键功能定义
+                video_state = EventMesh.publish("get_video_state")
+                if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                    EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                    return
+            EventMesh.publish("play_cur_time_event")#播报当前时间
+            #播报当前时间
+
+        def recv_wechat_audio(self,event,str_data):#接收微聊语音播放
+            wechat_state = EventMesh.publish("get_wechat_state")
+            video_state = EventMesh.publish("get_video_state")
+            if self.call_state == 0 and self.fall_flag == 0 and wechat_state == 0 and self.fall_flag == 0 and video_state == 0: 
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_WECHAT_RECV"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+
+
+
+        def audio_event_queue_thread(self):
+            while True:
+                data = self.audio_event_queue.get()
+                #EventMesh.debug_log("audio_event_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("audio_event_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_audio(self,event,msg):
+            self.audio_event_queue.put(msg)
+
+        def play_audio_file(self, *args, **kwargs):#播放音频文件
+            # EventMesh.debug_log("args",args)
+            # EventMesh.publish("publish_message_event_audio",{"func":self.play_audio_file_do,"data":args[1]})  
+            data = args[1]
+            self.play_audio_file_do(data)
+
+        def play_audio_file_do(self,data):#msg 拼接的路径文件
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("play_audio_file",data[0],data[1],open_power,power_off)#路径 str_data[1] 是否需要被打断
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+            self.aud.montage_play('U:/static/audio.bin',1,data[1],data[0])
+            # EventMesh.debug_log("play_audio_file end",data[0],data[1])#路径 str_data[1] 是否需要被打断
+            
+
+
+
+
+        def powe_resatrt_down_fun(self, *args):#重启设备
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+
+        def power_down_fun(self, *args):
+            EventMesh.publish("close_led_pin")
+            self.aud.stopPlayStream()
+            Power.powerDown()
+
+
+
+        def close_audio_play(self, event, msg): #msg
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.aud.stopPlayStream()
+
+
+
+        def close_timer_all(self, event, msg): 
+            # EventMesh.debug_log("close_timer_all!!!!!!!!!!!!!!!!!!!")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+                
+            self.aud.stopPlayStream()
+            self.timer.stop()
+            self.sos_timer2.stop()
+            self.sos_timer1.stop()
+            self.fall_flag = 0
+            self.fall_timer1.stop()
+            self.alarm_timer1.stop()
+        
+
+        def answer_call_event(self, event, msg): #
+            if self.call_state == 2:
+                sos_flag = EventMesh.publish("get_sos_flag")
+                if sos_flag == 1:
+                    self.call_state = 0
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_flag",0)
+                    EventMesh.publish("set_sos_num",0)
+                    EventMesh.publish("set_hangup_mode",0)
+                EventMesh.publish("close_timer_all")#
+                voiceCall.callAnswer()
+
+        def set_call_state(self, event, msg): #
+            self.call_state = msg
+
+
+        def video_call_in_event(self, event, msg):#视频通话拨入
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#測量成功
+            self.video_call_state = 1
+            self.video_count=0
+            self.video_call_in_mode = msg
+            EventMesh.publish("clear_video_timer_state")
+            EventMesh.publish("set_app_dev_end_state")
+            print("voice in!!!",msg,self.video_call_in_mode)
+            if self.video_call_in_mode == 0:
+                
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            else:
+                self.timer.start(2000, 1, self.publish_video_in_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+        def video_in_timer_cb(self,data):
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            
+            video_state = EventMesh.publish("get_video_state")
+            # print("video_state",video_state)
+            
+            self.video_count+=1
+            if self.video_count >= 30 or video_state == 0:#一分钟挂断视频通话
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+                self.video_call_state = 0
+                self.video_count=0
+                self.timer.stop()
+                return
+            if video_state != 6 or self.video_call_state == 0:#视频电话呼入
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            if self.video_call_in_mode == 0:
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_VOICE_IN"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            else:
+                EventMesh.publish("set_led_time_arg",[1,2,10*2,led_mode.FLASH_LIGHT_RED,10,5,led_mode.VIDEO_MEASURE_MODE])#
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_IN"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_call_out_cb(self, event, msg):#视频通话拨出
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#
+            EventMesh.publish("clear_video_timer_state")
+            EventMesh.publish("set_app_dev_end_state")
+            if msg != None:
+                self.video_count = 0
+                self.video_call_state = 1
+                self.timer.start(2000, 1, self.publish_video_out_event_cb)
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            else:
+                self.video_call_state = 0
+                self.video_count=0
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_VIDOE"))
+                EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                pass
+        
+        def video_out_timer_cb(self,data):
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1 :
+                    return
+            video_state = EventMesh.publish("get_video_state")#加入中
+            # print("video_out_timer_cb video_state",video_state)
+            
+            self.video_count+=1
+            if self.video_count >= 30 or video_state == 0:#40s挂断视频通话 对方无响应
+                self.timer.stop()
+                EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+                self.video_call_state = 0
+                self.video_count = 0
+                
+                return
+            if video_state == 4 or self.video_call_state == 0:#视频电话呼出 如果接通了就不需要了
+                self.video_call_state = 0
+                self.video_count=0
+                print("video calling")
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            
+
+            # EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_waite_timer_cb(self,event,msg):#等待对方接听音频
+            print("video_waite_timer_cb 1")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1 or self.video_call_state == 0:
+                    return
+            play_state = EventMesh.publish("get_audio_state")
+            if play_state == 0:
+                print("video_waite_timer_cb 2")
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        
+        def video_answer_timer_cb(self,event,msg):#对方已接听可正常通话了
+            print("video_answer_timer_cb 1")
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1  or self.video_call_state == 0 :
+                    return
+            print("video_answer_timer_cb 2")
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def video_answer_mode_timer_cb(self,event,msg):#1:#正在等待对方接听中,请稍候   2:#对方已接听可正常通话 3:#正在接听中
+            # print("video_answer_mode_timer_cb 1",msg)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            if open_power != None and power_off != None:
+                if open_power == 0 or power_off == 1:
+                    return
+            # print("video_answer_mode_timer_cb 2",msg)
+            if msg == 1:#正在等待对方接听中,请稍候
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_WAITING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+            elif msg == 2:#已接通
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWER"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 3:#正在连接中...
+                if EventMesh.publish("get_audio_state") == 0:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_ANSWERING"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 4:#对方已挂断...
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_ENDING"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                pass
+            elif msg == 5:#对方已挂断或网络不好
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_VIDEO_CALL_CONNECT"))#播放音频
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+
+        def dev_video_end_timer_cb(self,event,msg):#网络不好或者对方未接通挂断了
+            self.video_call_state = 0
+            self.video_count = 0
+            print("dev_video_end_timer_cb")
+            EventMesh.publish("stop_led_timer")#设置参数
+            EventMesh.publish("close_timer_all")#
+           
+        
+        def get_video_in_out_state(self,event,msg):
+            return self.video_call_state
+        
+        def set_video_in_out_state(self,event,msg):
+            self.video_call_state = msg
+        
+
+
+        def dialin_call_event(self, event, msg):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:#视频电话呼入
+                self.call_state = 0
+                voiceCall.callEnd()
+                return
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_wechat_btn_timer")#
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            self.timer.start(6000, 1, self.publish_call_event_cb)
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+            # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_motor_time",[1,2,10*3,10,5])#设置马达参数
+
+        def call_timer_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:#视频电话呼入
+                self.call_state = 0
+                voiceCall.callEnd()
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            if self.call_state != 2:
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                return
+            EventMesh.publish("set_led_time_arg",[1,2,10*10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CALL_mp3"))
+            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+        
+        def dial_out_call_center_cb(self, event, msg):#电话拨出去
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            # EventMesh.debug_log("dial_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.phone_num = ''
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    self.phone_num = str(msg)
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.timer1.start(2000, 0, self.time_out_phone)
+
+        
+
+
+                    
+        
+        def time_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.phone_num)
+
+        def sos_out_call_center_cb(self, event, msg):#sos电话呼叫中
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            self.sos_phone_num = ''
+            EventMesh.debug_log("sos_out_call_center_cb",msg)
+            if self.call_state == 0:
+                self.sos_state = 0
+                EventMesh.publish("close_timer_all")#
+                if msg == None:
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件
+                    # EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    sos_state =  EventMesh.publish("get_dev_state")
+                    self.sos_state = 1
+                    tmp = 1 << 16
+                    sos_state = sos_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",sos_state)
+
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
+                    EventMesh.publish("close_timer_all")#
+                    self.sos_phone_num = msg
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                    EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件
+                    self.sos_timer1.start(2000, 0, self.sos_call_out_phone)
+                    self.sos_timer2.start(30000, 0, self.sos_time_out_phone)
+                    
+                    
+        def sos_time_out_phone(self, msg):#30s超时未打通或者信号不好则重新拨打
+            self.sos_state = 0
+            sos_flag = EventMesh.publish("get_sos_flag")
+            if sos_flag == 1:
+                if self.call_state == 0:
+                    EventMesh.publish("set_sos_state_out")
+                    EventMesh.publish("set_sos_info_call") 
+                    
+        def sos_call_out_phone(self, msg):#电话拨出去
+            voiceCall.callStart(self.sos_phone_num)
+        
+        def get_sos_state_out(self, event, msg):#正在拨打sos电话
+            return self.sos_state
+        
+        def set_sos_state_out(self, event, msg):#清除在拨打sos电话
+            self.sos_state = 0
+
+        def call_test_event(self, event, msg):
+            voiceCall.callStart(str("10086"))
+
+        def get_call_state(self, event, msg):
+            return self.call_state
+        
+        def interup_call_event(self, event, msg):#侧边金属按钮挂断来电
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 2 or flag == 3:#电话通话中 或者呼叫中挂断中断
+                self.call_state = 0
+                voiceCall.callEnd()
+        
+        def dialing_out_event(self, event, msg):#侧边金属按键挂断电话呼叫中
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 1 or flag == 3:#电话呼叫中 或者在正在通话中
+                self.call_state = 0
+                voiceCall.callEnd()
+                
+
+
+        def play_cur_step_event(self, event, msg): #msg 1 播放当前步数
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != 0:
+                return
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                if self.fall_flag == 0:
+                    EventMesh.publish("close_timer_all")#
+                step = EventMesh.publish("get_old_step_value")
+                EventMesh.debug_log("step",step)
+                self.setp_old = step
+                if step <= 10:#
+                    if step == 10:#十步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:# 9步
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(step)),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 100:#十 90
+                    if step == 100:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),audio_buf.index("R_READ_STEP_2"),\
+                            audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)
+                        shi_value = int(step_tmp[0])#十
+                        ge_value = int(step_tmp[1])#个
+                        if shi_value > 1:#大于19步
+                            if ge_value == 0:#9十步 70十步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:#9十2步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#十9步
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                            audio_buf.index("R_READ_STEP_4"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                elif step <= 1000:
+                    if step == 1000:#1千步
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        step_tmp = str(step)#500
+                        bai_value = int(step_tmp[0])#百
+                        shi_value = int(step_tmp[1])#十
+                        ge_value = int(step_tmp[2])#个
+                        #101 110 1
+                        if shi_value > 0:#110
+                            if ge_value == 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value == 0 and ge_value == 0:#500 600
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                pass
+                            else:
+
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                elif step <= 10000:#千
+                    if step == 10000:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_1"),\
+                        audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        one_thousand = step//1000 #千
+                        one_hundred = step%1000 #百
+                        baishu = step%100 #十
+                        shishu = step%10 #个
+                        step_tmp = str(step)
+                        qian = int(step_tmp[0])#千
+                        bai_value = int(step_tmp[1])#百
+                        shi_value = int(step_tmp[2])#十
+                        ge_value = int(step_tmp[3])#个
+                        if bai_value <= 0:
+                            if shi_value <= 0:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1020 1040
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1021 
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            if shi_value <= 0:#1109
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                    audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if ge_value == 0:#1110
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#1117
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                    audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),
+                                    audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        pass
+                elif step <= 100000:#万
+                            if step == 100000:#10万步
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3"),\
+                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_STEP_4"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                step_tmp = str(step)
+                                wang = int(step_tmp[0])#万
+                                qian = int(step_tmp[1])#千
+                                bai_value = int(step_tmp[2])#百
+                                shi_value = int(step_tmp[3])#十
+                                ge_value = int(step_tmp[4])#个
+                                if wang > 0 and qian > 0 and bai_value > 0:#11109 11111
+                                    if shi_value <= 0:#11109
+                                        if ge_value == 0:#11100
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11108
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                    else:
+                                        if ge_value == 0:#11110
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11116
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                elif wang > 0 and qian > 0:#11000 11010 11012 11008
+                                    if shi_value > 0:
+                                        if ge_value == 0:#11010
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11016
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                            audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:   
+                                        if ge_value == 0:#11000
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#11004
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_{}".format(qian)),\
+                                            audio_buf.index("R_READ_STEP_1"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                
+                                elif wang > 0:#1
+                                    if bai_value > 0:#百
+                                        if shi_value > 0:#10110
+                                            if ge_value == 0:#10150
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),audio_buf.index("R_READ_STEP_3"),\
+                                                audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#10108
+                                            if ge_value == 0:#10100
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10108
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(bai_value)),\
+                                                audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                                audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if shi_value > 0:
+                                            if ge_value == 0:#10090
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            else:#10098
+                                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                                audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(shi_value)),\
+                                                audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),audio_buf.index("R_READ_STEP_4"))
+                                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(wang)),\
+                                            audio_buf.index("R_READ_STEP_0"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge_value)),\
+                                            audio_buf.index("R_READ_STEP_4"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+        def set_usb(self, event, msg): #msg 1 正在充电 2充电已移出 3 充电已满 0
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if power_off != None:
+                if power_off == 1:
+                    return
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None and get_temp_state != None:
+                    if get_hr_state != 0:
+                        
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        if get_hr_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_measure_time",0)#设置开始测量的时间戳时间
+
+                        EventMesh.debug_log("stop debug8")
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    if get_spo2_state != 0:
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        if get_spo2_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    if get_bp_state != 0:
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        if get_bp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop bp debug1")
+                    if get_bg_state != 0:
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        if get_bg_state == 1:#手动开灯关闭灯
+                            EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop BG  debug14")
+                    if get_temp_state != 0:
+                        
+                        EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                        if get_temp_state == 1:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_start_temp_measure_time",0)#
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.debug_log("stop temp  debug14")
+            if msg == 1:
+                self.usbState = msg
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_IN"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.debug_log("charge R_CHARGE_IN")
+                
+                
+            elif msg == 2 or msg == 0:
+                self.usbState = msg
+                EventMesh.publish("stop_led_timer")#设置参数
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,4,led_mode.CHARGE_OUT_MODE])#測量成功
+                EventMesh.debug_log("charge R_CHARGE_OUT")
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                    EventMesh.publish("close_timer_all")#
+                    self.aud.stop()
+                    self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+                    # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_OUT"))
+                    # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+            elif msg == 3:
+                self.usbState = msg
+                EventMesh.debug_log("charge full")
+                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                EventMesh.publish("set_led_time_arg",str_buf)#
+                # if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                #     EventMesh.publish("close_timer_all")#
+                #     str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_CHARGE_FULL"))
+                #     EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                
+
+
+        def get_usb(self, event, msg):
+            return self.usbState
+        
+
+
+        def app_factory(self,event,msg):
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'factory# send ok', 'UCS2')
+            ret = 0
+            ret = ql_fs.path_exists("/usr/static/storage_file")#
+            if ret == True:
+                ql_fs.rmdirs("/usr/static/storage_file")
+                ql_fs.mkdirs("/usr/static/storage_file")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+        
+            self.factory_timer.start(6*1000,0,self.factory_cb)
+            pass
+        def factory_cb(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+
+        def app_restart(self,event,msg):#远程发短信重启
+            if msg != None:
+                number = str(msg)
+                sms.sendPduMsg(number, 'reset# send ok', 'UCS2')
+            self.restart_timer.start(3*1000,0,self.app_restart_cb)
+            pass
+        def app_restart_cb(self,*argc):
+            Power.powerRestart()
+
+        def open_power_on(self, event, msg): #msg 1 开机 2 关机 3 重启  4恢复出厂设置 5静音关机
+            EventMesh.publish("close_timer_all")#
+            if msg == 1:
+                EventMesh.publish("close_hr_sop2")#
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                self.pwk_timer1.start(1000,0,self.power_on_audio_cb)
+                
+                print("open_power_on!!!!!!!\n\n\n\n")
+            elif msg == 2:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data5",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data6",[1,step3,step4,step5])
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",0])
+                # self.pwk_timer1.start(3000,0,self.power_off_audio_cb)
+                EventMesh.publish("close_hr_sop2")#
+                # EventMesh.debug_log("power_off_audio_cb")
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+            elif msg == 3:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                self.aud.stop()
+                self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+                # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+                # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                self.timer.start(8000,0,self.publish_resatrt_down_event_cb)
+                #EventMesh.publish("set_led_time_arg",[3000,4000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE])#
+            elif msg == 4:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("stop_led_timer")#设置参数
+                self.power_off = 1
+                ret = 0
+                ret = ql_fs.path_exists("/usr/static/storage_file")#
+                if ret == True:
+                    ql_fs.rmdirs("/usr/static/storage_file")
+                    ql_fs.mkdirs("/usr/static/storage_file")
+                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:
+                    EventMesh.publish(constants.PROTOCOL.DLT_SEND)
+                self.aud.stopPlayStream()
+                self.timer.start(6*1000,0,self.fun)
+            elif msg == 5:
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 0:#电话呼叫中
+                    self.call_state = 0
+                    voiceCall.callEnd()
+                step = EventMesh.publish("get_old_step_value")
+                # step1 = SC7A20().get_step()
+                # step1 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step2 = EventMesh.publish("get_storage_config","old_step")
+                self.read_data = EventMesh.publish("get_storage_data")
+                # EventMesh.publish("set_test_data7",[1,step,step1,step2])
+                if step != 0:
+                    EventMesh.publish("set_storage_config",["old_step",step])
+
+                # step3 = EventMesh.publish("get_old_step_value")
+                # step4 = SC7A20().get_step()
+                # step4 = EventMesh.publish(constants.EVENT.GET_STEP)
+                # step5 = EventMesh.publish("get_storage_config","old_step")
+                # EventMesh.publish("set_test_data8",[1,step3,step4,step5])
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                EventMesh.publish("set_storage_config",["old_time",time_tmp])#关机保存一个是时间
+                EventMesh.publish("set_storage_config",["power_state",1])
+                
+                EventMesh.publish("close_hr_sop2")#
+                EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+                self.power_off = 1
+                self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+                # self.pwk_timer1.start(3000,0,self.power_off_no_audio_cb)#不需要关机铃声
+
+
+
+        def fun(self,*argc):
+            self.aud.stopPlayStream()
+            Power.powerRestart()
+            
+
+        def power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 1
+        def clear_power_on_cb(self, msg): #msg 开机标识
+            self.power_on_flag = 0
+        
+        def power_on_audio_cb(self, msg):
+            self.power_on_flag = 1
+            # EventMesh.debug_log("power_on_audio_cb")
+            power_state = EventMesh.publish("get_storage_config","power_state")
+            #EventMesh.publish("set_motor_time",[1,2,10*2,10,5])#设置马达参数
+            if power_state == None:
+                power_state = 0
+            # print("power_state",power_state)
+            if power_state <= 0:
+                self.aud.stop()
+                self.aud.play(1,1,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_GREEN,6,3,led_mode.OTHER_MEASURE_MODE])#測量成功
+            # EventMesh.publish("set_led_time_arg",[1000,200,10,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+            self.power_on_flag = 0
+            self.pwk_timer2.start(5000,0,self.power_on_cb)
+
+        def get_power_on_state(self, event, msg):
+            return self.power_on_flag
+        
+        def power_off_audio_cb(self, msg):
+            # EventMesh.debug_log("power_off_audio_cb")
+            self.aud.stop()
+            self.aud.play(1,0,'U:/static/R_POWER_OFF_1.mp3')
+            # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_POWER_OFF_1"))
+            # EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+        
+        def power_off_no_audio_cb(self, msg):
+            EventMesh.debug_log("power_off_no_audio_cb")
+            EventMesh.publish("set_led_time_arg",[1,2,6*8,led_mode.FLASH_LIGHT_RED,6,3,led_mode.POWER_OFF_MODE])#
+            self.power_off = 1
+            self.pwk_timer2.start(6000,0,self.publish_power_down_event_cb)
+
+        def set_power_off_cb(self, msg):
+            self.power_off = 1
+
+        def get_power_off_state(self, event, msg):
+            return self.power_off
+
+        def close_hr_sop2(self, event, msg): #msg 关闭心率血氧体温测试
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            if get_hr_state != None and get_spo2_state != None and get_temp_state != None and get_bg_state != None and get_bp_state != None:
+                if get_hr_state != 0:
+                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop hr")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+                if get_spo2_state != 0 :
+                    EventMesh.debug_log("stop spo2")
+                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                if get_temp_state != 0:
+                    EventMesh.debug_log("stop temp")
+                    EventMesh.publish("set_temp_state",0)
+                    EventMesh.publish(constants.EVENT.STOP_TEMP)#手动体温测试
+                if  get_bg_state != 0:
+                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bg")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+                if  get_bp_state != 0:
+                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                    EventMesh.debug_log("sstop bp")
+                    EventMesh.publish(constants.EVENT.STOP_HEART) 
+
+        def set_manual_measure_mode(self, event, msg): #手动测试 1心率 2 血氧 3 体温
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_state = EventMesh.publish("get_temp_state")
+            if msg == 1:
+                if get_hr_state != 1:#不是手动测试直接打断
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("set_spo2_state",0)
+                    EventMesh.publish("set_bg_state",0)
+                    EventMesh.publish("set_bp_state",0)
+                    
+                    EventMesh.publish("set_hr_state",1)
+                    EventMesh.publish("clear_manual_hr_flag")
+                    EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) #停止测试血氧
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_HEART) #手动心率测试
+            elif msg == 2:
+                if get_hr_state == 0:
+                    if get_spo2_state != 1:
+                        EventMesh.debug_log("set_manual_measure_mode",msg)
+                        EventMesh.publish("set_spo2_state",1)
+                        EventMesh.publish("set_start_measure_time",1)#设置开始测量的时间戳时间
+                        EventMesh.publish("set_hr_blood_led",1)
+                        EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) #手动血氧测试
+            elif msg == 3:
+                if get_temp_state != 1:
+                    EventMesh.debug_log("set_manual_measure_mode",msg)
+                    EventMesh.publish("clear_manual_temp_flag")
+                    EventMesh.publish("set_temp_state",1)
+                    EventMesh.publish("set_start_temp_measure_time",1)#设置开始测量的时间戳时间
+                    EventMesh.publish("set_hr_blood_led",1)
+                    EventMesh.publish(constants.EVENT.START_TEMP)#手动体温测试
+            pass
+
+
+        def set_start_measure_time(self, event, msg): #手动测试 1心
+            self.hr_auto = msg
+            pass
+
+        def get_start_measure_time(self, event, msg): #手动测试 
+
+            return  self.hr_auto
+        
+        def set_start_temp_measure_time(self, event, msg): #
+            self.temp_auto = msg
+            pass
+
+        def get_start_temp_measure_time(self, event, msg): #
+            return self.temp_auto
+
+        def mearsure_cb(self, event, msg):
+            if msg == 1:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            elif msg == 2:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 3:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            elif msg == 4:
+                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data) 
+            
+            
+            
+        def play_temp_value(self, event, msg): #播放体温数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg > 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.temp_value = msg
+                        # self.timer.start(2*1000,1,self.play_temp_fun)
+                        self.play_temp_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_temp_fun(self,argc): #播放体温数值
+            data = self.temp_value
+            if data > 42:
+                data = 42
+            data_tmp = str(data)
+            if data_tmp.find(".") != -1:
+                temp_shi = int(data_tmp.split('.')[0])//10
+                temp_ge = int(data_tmp.split('.')[0])%10
+                dot_ge = int(data_tmp.split('.')[1][:1])
+                if temp_ge > 0:#37.0
+                    if dot_ge > 0:#37.5
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),\
+                        audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:#37.0
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:#30.0 30.6
+                    if dot_ge > 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(dot_ge)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+            else:
+                temp_shi = int(data_tmp)//10
+                temp_ge = int(data_tmp)%10
+
+                if temp_ge > 0:#45
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(temp_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_TEMP_TITLE"),audio_buf.index("R_READ_TIME_{}".format(temp_shi)),\
+                    audio_buf.index("R_READ_STEP_3"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            
+
+        def play_hr_value(self, event, msg): #播放心率数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 50:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        self.hr_value = msg
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_hr_fun)
+                        self.play_hr_fun(0)
+                    else:
+                        str_data ='mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_hr_fun(self,argc):#播放心率测试值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.hr_value
+                if data > 220:
+                    data = 220
+                if data < 100:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else: 
+                    shi = (data%100)//10 #210
+                    ge = (data%100)%10
+                    #210 234
+                    if shi > 0:
+                        if ge == 0:#210 230 120
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_{}".format(shi)),audio_buf.index("R_READ_STEP_3"),\
+                            audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        if ge == 0:#200 100 209 108
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"))
+                            EventMesh.publish("play_audio_file",str_data)#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_HR_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//100)),\
+                            audio_buf.index("R_READ_STEP_2"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(ge)))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_battery_level_value(self, event, msg): #播放当前电量
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                battery = EventMesh.publish("screen_get_battery")
+                print("cur level",battery)
+                level = 100
+                if battery == None:
+                    level = 100
+                else:
+                    level = battery[1]
+                
+                data = level
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_1"),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    return
+                if data > 10:
+                    if data%10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data == 10:
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else :
+                        str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_CUR_BATTERY_LEVEL"),audio_buf.index("R_READ_TIME_{}".format(data)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+
+
+        def play_sugar_value(self, event, msg): #播放血糖数值
+            video_state = EventMesh.publish("get_video_state")
+            flag = EventMesh.publish("get_call_state") 
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg != 0:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_sugar_fun(msg)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_sugar_fun(self,argc):#播放血糖测试值
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = str(argc)
+                data_shi = 0
+                data_ge = 0
+                if data.find(".") != -1:
+                    data_shi = int(data.split(".")[0])
+                    data_ge = int(data.split(".")[1])
+                else:
+                    data_shi = int(data)
+                    data_ge = 0
+
+                if data_shi != 0 and data_ge != 0:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_BLOOD_SUGAR"),audio_buf.index("R_READ_TIME_{}".format(data_shi)),\
+                    audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(data_ge)))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+            else:
+                EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+
+
+        def play_spo2_value(self, event, msg): #播放血样数值
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if msg != None:
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    EventMesh.publish("close_timer_all")#
+                    if msg >= 85:
+                        # str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_OK"))
+                        # EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",2)#测量成功
+                        self.spo2_value = msg
+                        # self.timer.start(2*1000,1,self.play_spo2_fun)
+                        self.play_spo2_fun(0)
+                    else:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_HSENSOR_RESULT_FAILE"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        EventMesh.publish("set_hr_blood_led",3)#测量异常
+                else:
+                    EventMesh.publish("set_hr_blood_led",3)#测量异常
+
+        def play_spo2_fun(self,argc):#播放血氧测试值
+            flag = EventMesh.publish("get_call_state") 
+            
+            if flag == 0 and self.fall_flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                data = self.spo2_value
+                if data > 100:
+                    data = 100
+                if data == 100:
+                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                    audio_buf.index("R_READ_STEP_2"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                else:
+                    if data % 10 == 0:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        pass
+                    else:
+                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_HSENSOR_SPO2_TITLE"),audio_buf.index("R_READ_TIME_{}".format(data//10)),\
+                        audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(data%10)))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def set_sim_mode(self, event, msg): #mode 1 蓝灯闪烁 可识别卡 但未联网 2 可绑定appsim正常 3 手表不识别卡或者未插卡
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0 :#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                # EventMesh.publish("stop_led_timer")#设置参数
+                mode = 0
+                signal = EventMesh.publish("get_sim_Status")
+                if signal != None:
+                    if signal == 1:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            mode = 2
+                        else:
+                            mode = 1
+                    else:#未插卡
+                        mode = 3
+                if mode == 1:#白色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_WHITE,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 2:#蓝灯色灯
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_GREEN,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_CONNECT"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+                elif mode == 3:#红灯闪烁
+                    EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                pass
+            
+        def dial_sos_phone(self, event, msg): #拨打紧急求助电话
+            flag = EventMesh.publish("get_call_state")
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and video_state == 0:
+            
+                signal = EventMesh.publish("screen_get_sig")
+                if signal != None:
+                    if signal >= 0 and signal <= 31:#有卡 
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                            sos_number = EventMesh.publish("get_dial_sos_number")
+                            if sos_number != None:
+                                if len(sos_number) != 0:
+                                    EventMesh.publish("close_timer_all")#
+                                    EventMesh.publish("set_sos_flag",1)
+                                        
+                                else:#未设置sos紧急求助号码
+                                    EventMesh.publish("close_timer_all")#
+                                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    pass
+                        else:
+                            EventMesh.publish("close_timer_all")#
+                            EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_WHITE,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SIM_FAILE"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:#未插卡
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,2,10,led_mode.FLASH_LIGHT_RED,10,5,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SIM"))
+                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+        
+        def play_cur_time_event(self, event, msg): #播放当前时间
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                
+                data = RTC().datetime()
+                hour = data[4]
+                min = data[5]
+                # EventMesh.debug_log("hour",hour,min)
+                self.old_hour = hour
+                self.old_min = min
+                if self.old_hour == 0:
+                    if self.old_min <= 9:#00:09
+                        if self.old_min == 0:#0点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#0点09分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                    else:
+                        if self.old_min % 10 == 0:#0点2十分 0点3十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:#0点2十8分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_0")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+
+                elif self.old_hour <= 9:#8:09 9:20 9:45
+                    if self.old_min <= 9:#9点09分
+                        if self.old_min <= 0:
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            pass
+                        else:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min))\
+                            ,audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_min % 10 == 0:#9点2十分 9点4十分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        else:#9点2十4分
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(self.old_hour))\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min //10))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+                else:#12:0
+                    if self.old_min == 0:#12:00 13:00 15:00 20 10 11 12 13 14 15
+                        self.play_count+=1
+                        hour_shi = self.old_hour//10
+                        hour_ge = self.old_hour%10
+                        if self.old_hour == 10:#十点整
+                            str_data = 'mp3files={}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        elif self.old_hour == 20:
+                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if hour_shi <= 1:#十3点整
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                    else:
+                        if self.old_hour == 10:#10:09 10:10
+                            if self.old_min <= 9:
+                                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                ,audio_buf.index("R_READ_TIME_{}".format(self.old_min)),audio_buf.index("R_READ_TIME_MIN"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                            else:
+                                if self.old_min % 10 == 0:#十点2十分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                else:#十点2十1分
+                                    str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                    ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(self.old_min//10))\
+                                    ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(self.old_min%10))\
+                                    ,audio_buf.index("R_READ_TIME_MIN"))
+                                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                        else:
+                            if self.old_hour < 20:#19:00
+                                if self.old_min <= 9:#19:09 
+                                    if self.old_min == 0:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        pass
+                                    else:
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_0"),audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10))\
+                                        ,audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    
+                                else:#19:18 19:40 19:56
+                                    if self.old_min % 10 == 0:#十9点2十分 十9点3十分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:#十9点2十1分
+                                        str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_hour % 10)),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min // 10)),audio_buf.index("R_READ_STEP_3")\
+                                        ,audio_buf.index("R_READ_TIME_{}".format(self.old_min % 10)),audio_buf.index("R_READ_TIME_MIN"))
+                                        EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                            else:
+                                hour_shi = self.old_hour//10
+                                hour_ge = self.old_hour%10
+
+                                min_shi = self.old_min//10
+                                min_ge = self.old_min%10
+
+                                #20:08 20:18  20:20
+                                if hour_ge == 0:
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                    else:
+                                        if min_ge == 0:#2十点2十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十点2十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                                else:#21:08 21:18
+                                    if self.old_min <= 9:
+                                        if self.old_min == 0:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                            pass
+                                        else:
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_0")\
+                                            ,audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                    else:
+                                        if min_ge == 0:#2十3点3十分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                                        else:#2十3点3十1分
+                                            str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(hour_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(hour_ge))\
+                                            ,audio_buf.index("R_TSENSOR_RESULT_VALUE_DOT"),audio_buf.index("R_READ_TIME_{}".format(min_shi))\
+                                            ,audio_buf.index("R_READ_STEP_3"),audio_buf.index("R_READ_TIME_{}".format(min_ge)),audio_buf.index("R_READ_TIME_MIN"))
+                                            EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+
+        def play_timer_cb_1(self,*agrs):
+            return
+
+        def play_center_phone(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许设备再次拨出
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+            
+                center_dial = EventMesh.publish("get_storage_config","center_dial")
+                if center_dial != None:
+                    if len(center_dial) > 0:
+                        str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_SOS_ALERT"))
+                        EventMesh.publish("play_audio_file",[str_data,0])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                        voiceCall.callStart(str(center_dial))
+                        
+                    
+                else:#未设置号码
+                    # EventMesh.debug_log("play_center_phone")
+                    str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_NO_SET_SOS_DIAL"))
+                    EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    pass
+        def center_phone_cb(self,*argc): #msg
+            pass
+
+
+
+
+        def play_imei_event(self, event, msg): #msg
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                EventMesh.publish("close_timer_all")#
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                EventMesh.debug_log(imei)
+                str_data = 'mp3files={}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+
+                str_data = 'mp3files=R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3+R_READ_TIME_5.mp3+R_READ_TIME_6.mp3+R_READ_TIME_7.mp3+R_READ_TIME_8.mp3+R_READ_TIME_9.mp3+R_READ_TIME_0.mp3+R_READ_TIME_1.mp3+R_READ_TIME_1.mp3+R_READ_TIME_2.mp3+R_READ_TIME_3.mp3+R_READ_TIME_4.mp3'
+                
+        def get_unread_wechat_state(self,event, msg): 
+
+            return self.set_unread_wechat
+        
+        def set_unread_wechat_state(self, event, msg): 
+            self.set_unread_wechat = msg
+
+        def get_wechat_data(self,event, msg): 
+
+            return [self.MXA_MSG ,self.wechat_recode_list]
+        
+        def set_wechat_data(self, event, msg): 
+            # EventMesh.debug_log("set_wechat_data1 ",msg,self.wechat_num)
+            self.MXA_MSG = msg[0]
+            self.wechat_recode_list = msg[1]
+            self.wechat_num = self.wechat_recode_list["num"]
+            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+                ujson.dump(self.wechat_recode_list,fd)
+                #写编号
+            # EventMesh.debug_log("set_wechat_data2:{} ".format(self.wechat_num))
+        
+
+        def get_wechat_time(self, event, msg):
+            return  [self.press_btn,self.timeSecond]
+
+        def start_wechat_record(self, event, msg): #开始录音相关配置
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                flag = EventMesh.publish("get_call_state") 
+                video_state = EventMesh.publish("get_video_state")
+                if flag == 0 and self.fall_flag == 0 and video_state == 0:
+                    if self.press_btn == 0:
+                        self.press_btn = 1
+                        audio_state = EventMesh.publish("get_audio_state")
+                        if audio_state == 1:
+                            self.aud.stop()
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("set_led_time_arg",[1,1,160,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.WECHAT_LED_MODE])#測量成功
+                    
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.timeSecond = time_tmp#保存按下的时间长s
+                        self.aud.setVolume(11)#设置音量最大
+                        
+                        EventMesh.debug_log("talking1.0")
+                        # if self.wechat_num >= self.MXA_MSG:
+                        #     self.wechat_num = 0 
+                        # self.wechat_num += 1
+                        # self.wechat_show = self.wechat_num
+                        # self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_show),16) 
+                        self.record_test.start("/usr/static/storage_file/wechat.amr",16) 
+                
+            else:
+                self.timeSecond = 0
+                self.press_btn = 0
+        def get_wechat_state(self, event, msg):
+            return self.press_btn
+
+        def send_wechat_record(self, event, msg): #发送录音文件
+            if self.press_btn == 1:
+                self.press_btn = 0
+                self.record_test.stop() #停止錄音
+                EventMesh.publish("stop_led_timer")#关闭灯
+                EventMesh.publish("set_led_time_arg",[1,1,0,led_mode.FLASH_LIGHT_GREEN,4,2,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[0,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.OPEN_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                self.countdown_old = 0
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+
+                self.countdown_old = msg
+                if self.countdown_old >= 15:
+                    self.countdown_old = 15
+                if self.countdown_old <= 0:
+                    #录音时间太短
+                    return
+                else:
+                    # self.wechat_recode_list["%02d"%(self.wechat_show)] = "read:0"
+                    # self.wechat_recode_list["num"] = self.wechat_show
+                    EventMesh.debug_log("self.wechat_recode_list :{}".format(self.wechat_recode_list))
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat.amr")
+                    if check_txt == True :
+                        path = "/usr/static/storage_file/wechat.amr"
+                        with open(path,"rb") as fd:
+                            buf = bytearray(ql_fs.path_getsize(path))
+                            fd.readinto(buf)
+                            senddata = [self.countdown_old,buf]
+                            EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+
+                    # with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                    #     ujson.dump(self.wechat_recode_list,fd)
+                    # EventMesh.debug_log("send wechat data!!!!!!!!!!!!!!!!!!!!!")
+
+                    # check_txt = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(self.wechat_show))
+                    # if check_txt == True :
+                    #     path = "/usr/static/storage_file/{}.amr".format(self.wechat_show)
+                    #     with open(path,"rb") as fd:
+                    #         buf = bytearray(ql_fs.path_getsize(path))
+                    #         fd.readinto(buf)
+                    #         senddata = [self.countdown_old,buf]
+                    #         EventMesh.publish(constants.PROTOCOL.TKS_SEND,senddata)
+            else:
+                self.press_btn = 0
+
+        def play_wechat_last_amr(self, event, msg):#播放微聊最后一条语音文件
+            flag = EventMesh.publish("get_call_state") 
+            if flag == 0:#电话通话中 或者呼叫中挂断中断
+                EventMesh.publish("close_timer_all")#
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        #EventMesh.debug_log("self.wechat_recode_list1:{}".format(self.wechat_recode_list))
+                        if num != 0:
+                            last_num = str("%02d"%(num))
+                            last_tmp = self.wechat_recode_list[last_num]
+                            last_read = int(last_tmp.split(":")[1])
+                            if last_read == 1:#如果最后一条没有读则读最新的一条
+                                self.wechat_recode_list[last_num] = "read:0"
+                                self.wechat_recode_list["num"] = num 
+                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                    ujson.dump(self.wechat_recode_list,fd)
+                            else:
+                                sotr_new = {}
+                                sotr_new = sorted(self.wechat_recode_list.keys(), reverse=True)#降序排序
+                                # EventMesh.debug_log("sotr_new:{}".format(sotr_new))
+                                for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                    key = sotr_new[i+1]
+                                    num_id = int(key)
+                                    #EventMesh.debug_log("key:{} num_id:{}".format(key,num_id))
+                                    if key in self.wechat_recode_list:#
+                                        str_tmp = self.wechat_recode_list[key]
+                                        read = int(str_tmp.split(":")[1])
+                                        if read != 0:#未读是按一下播放下一条同时删除
+                                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num_id))#还要检测这个文件是否存在
+                                            if check_amr == True:
+                                                self.wechat_recode_list[key] = "read:0"
+                                                self.wechat_recode_list["num"] = num 
+                                                EventMesh.debug_log("self.wechat_recode_list2:{} num_id:{} num:{}".format(self.wechat_recode_list,num_id,num))
+                                                # self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+                                                play_state = 1
+                                                with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
+                                                    ujson.dump(self.wechat_recode_list,fd)
+                                                break
+                                            else:
+                                                continue
+                                        else:
+                                            continue
+                                    else:
+                                        continue
+                            #EventMesh.debug_log("play_state:{}".format(play_state))
+                            # if play_state == 0:#
+                            check_amr = ql_fs.path_exists("/usr/static/storage_file/{}.amr".format(num))#还要检测这个文件是否存在
+                            if check_amr == True:
+                                self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(num))  #文件名前面要加上路径
+
+        def play_unread_wechat_infor(self,event,msg):#未读微聊语音
+            flag = EventMesh.publish("get_call_state") 
+            video_state = EventMesh.publish("get_video_state")
+            if flag == 0 and self.press_btn == 0 and self.fall_flag == 0 and video_state == 0:#电话通话中 或者呼叫中挂断中断
+            
+                if self.wechat_recode_list != None:
+                    num = 0
+                    play_state = 0
+                    if len(self.wechat_recode_list) > 1:
+                        num = int(self.wechat_recode_list["num"])
+                        if num != 0:
+                            for i in range(len(self.wechat_recode_list)-1):#1 01 02 
+                                key = "%02d"%(i+1)
+                                if key in self.wechat_recode_list:#
+                                    str_tmp = self.wechat_recode_list[key]
+                                    read = int(str_tmp.split(":")[1])
+                                    if read == 1:#未读是按一下播放下一条同时删除
+                                        play_state = 1
+                                    else:
+                                        continue
+                                else:
+                                    continue
+                            if play_state == 1:#设置未读语音状态
+                                EventMesh.publish("set_unread_wechat_state",1)
+                            else:
+                                EventMesh.publish("set_unread_wechat_state",0)
+                                self.updateTime = 0
+
+                state = EventMesh.publish("get_unread_wechat_state")#
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if state != None:
+                    if state == 1:
+                        EventMesh.publish("set_led_time_arg",[1,2,8,led_mode.FLASH_LIGHT_GREEN,8,4,led_mode.OTHER_MEASURE_MODE])#測量成功
+                        # EventMesh.publish("set_led_time_arg",[1000,400,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                        if self.updateTime == 0:
+                            self.updateTime = time_tmp
+                        if self.updateTime != 0:
+                            if time_tmp - self.updateTime >= 10*60:
+                                self.updateTime = time_tmp
+                                #播放音频文件
+                                EventMesh.publish("close_timer_all")
+                                str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_UNREAD_WECHAT"))
+                                EventMesh.publish("play_audio_file",[str_data,1])#获取播放音频文件('U:/static/audio.bin',1,1,str_data)
+                    else:
+                        self.updateTime = 0
+            
+
+
+
+    class BtnDevice(Abstract):
+
+        def __init__(self, tp=None):
+            self.pk = PowerKey()
+            self.__pwk_timer = osTimer()
+            self.aud = audio.Audio(0)
+            self.aud.set_pa(Pin.GPIO29)
+            self.aud.setVolume(11)
+            # self.keypad = machine.KeyPad(4, 4)
+            self.__PowerDownTimeOut = 3000
+            self.__tp = tp
+            self.pwk_press = 0
+            self.pwk_count = 0
+
+            self.powerKey_status = 0
+            self.sosKey = 0
+            self.wechatKey = 0
+            self.sosKey_status = 1#默认是低电平
+            self.WeChatKey_status = 1#默认是低电平
+
+            self.wechatKey_timer = osTimer()
+            self.wechatKey_count = 0
+            self.wechatKey_press = 0 
+
+            self.sosKey_timer = osTimer()
+            self.sosKey_count = 0
+            self.sosKey_press = 0 
+            self.sosKey_long_press = 0
+
+            self.wechatKey_press_count = 0
+
+            self.timeSeconOld = 0
+            self.wechat_state = 0 #按下录音时的状态
+
+            
+            self.sosKey_press_count = 0
+
+
+           
+
+            self.extint_22 = 0
+            self.GPIO22_status = 1
+
+            self.extint_17 = 0
+            self.KeyCall2_status = 1
+
+            self.extint_7 = 1
+            self.extint_8 = 1
+
+            self.extint_19= 0
+            self.KeyCall1_status = 1
+
+            self.Keycall1_timer = osTimer()
+            self.Keycall1_count = 0
+            self.Keycall1_press = 0 
+            self.Keycall1_press_count = 0
+            self.Keycall1_long_press = 0
+
+            self.Keycall2_timer = osTimer()
+            self.Keycall2_count = 0
+            self.Keycall2_press = 0 
+            self.Keycall2_press_count = 0
+            self.Keycall2_long_press = 0
+
+            
+
+            self.pwkey_timer = osTimer()
+            self.pwk_key = 0
+            self.GPIO26_status = 1
+            self.pwKey_press_count = 0
+            self.pwkey_count = 0
+            self.pwkey_press = 0
+            self.led_state = 0
+            self.hsensorTest_timer = osTimer()
+            self.factoryTest_timer = osTimer()
+            self.factoryTest_count = 0
+            self.factoryTest_led_count = 0
+            self.factoryTest_flag = 0
+            self.factory_timesec = 0
+            self.btnInfo_queue = Queue()
+            _thread.stack_size(10*1024+192)
+            _thread.start_new_thread(self.btnInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            
+            EventMesh.subscribe("publish_message_event_btnInfo",self.publish_message_event_btnInfo)
+
+            EventMesh.subscribe("close_wechat_btn_timer", self.close_wechat_btn_timer)#来电强制关闭微聊语音
+
+        def btnInfo_queue_thread(self):
+            while True:
+                data = self.btnInfo_queue.get()
+                #EventMesh.debug_log("Info_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_btnInfo(self,event,msg):
+            self.btnInfo_queue.put(msg)
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+            
+        def publish_wechat_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_press_cb,"data":0})  
+
+        def publish_soskey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_press_cb,"data":0})  
+
+        def publish_call1key_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_press_cb,"data":0})  
+        
+        def publish_call2key_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_press_cb,"data":0})  
+
+        def publish_pwkKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_press_cb,"data":0})  
+
+    
+
+        def post_processor_after_instantiation(self):
+            # self.keypad.init()
+            # self.keypad.set_callback(self.key_callback)
+        
+            self.pk.powerKeyEventRegister(self.powerKey_callback)
+            
+            self.pwk_key26 = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+            self.pwk_key26.enable() 
+
+            self.sosKey = ExtInt(ExtInt.GPIO6,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.sosKey_extint_cb)#S0S键
+            self.sosKey.enable()
+
+            self.extint_19 = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key19_extint_cb)
+            self.extint_19.enable()
+
+            self.extint_17 = ExtInt(ExtInt.GPIO7,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.key17_extint_cb)
+            self.extint_17.enable()
+
+            self.wechatKey = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.wechatKey_extint_cb)
+            self.wechatKey.enable()
+
+        def key17_extint_cb(self,args):#call 1
+            print("call 1!!!!!!!")
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            if open_power != None and open_power_off != None and dev_app_mode != None:
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            
+            self.KeyCall1_status = int(args[1]) 
+            # EventMesh.debug_log('key17_extint_cb :{}'.format(args))
+            if self.KeyCall1_status == 0:
+                self.KeyCall1_status = 1
+            else:
+                self.KeyCall1_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.KeyCall1_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall2_status = self.extint_19.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+            # EventMesh.debug_log('key17_extint_cb',args,self.KeyCall2_status,self.WeChatKey_status,self.GPIO26_status,self.KeyCall1_status,self.sosKey_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall2_status != 0 and self.sosKey_status != 0:
+                if self.KeyCall1_status == 0:#按下
+                    if NEW_ENABLE == 0:#新的按键功能定义
+                        video_state = EventMesh.publish("get_video_state")
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                                if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                                    EventMesh.publish("video_answer_cb")
+                                else:
+                                    pass
+                                    # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                                    # self.Keycall1_press_count=0
+                                    # self.wechatKey_timer.stop()
+                                    # self.pwkey_timer.stop()
+                                    # self.sosKey_timer.stop()
+                                    # self.Keycall2_timer.stop()
+                                    # self.Keycall1_timer.stop()
+                            
+                                return
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.Keycall1_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0 #电源键
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_press_count=0#sos键
+                        self.sosKey_long_press = 0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0#微聊键
+                        self.wechat_state = 0
+
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count = 0#call 2键
+                        self.Keycall2_long_press = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 1
+                        self.Keycall1_long_press = 0
+                        EventMesh.publish("AI_key_press")
+                        self.Keycall1_timer.start(100, 1, self.publish_call1key_btn_event_cb)
+
+        def call1Key_press_cb(self, data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.Keycall1_timer.stop()
+                    self.Keycall1_count = 0
+                    self.Keycall1_press = 0
+                    self.Keycall1_press_count+=1
+                    self.Keycall1_long_press = 0
+                    return
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            self.KeyCall1_status = self.extint_17.read_level()
+            if self.Keycall1_press == 1 :
+                self.Keycall1_count += 1
+                if self.Keycall1_count >= 10*3: #长按3s 
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None:
+                        if fall_down != 0 or flag == 2:
+                            self.Keycall1_count = 0
+                            self.Keycall1_press = 0
+                            self.Keycall1_press_count = 0
+                            self.Keycall1_long_press = 0
+                            self.Keycall1_timer.stop()
+                            return
+                    if self.Keycall1_long_press == 0:
+                        self.Keycall1_long_press = 1
+                        
+                        flag = EventMesh.publish("get_call_state")#获取通话状态
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0 or flag == 2:
+                                return
+                       
+                        return
+
+                    if self.KeyCall1_status == 1:
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0
+                        self.Keycall1_press_count = 0
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_timer.stop()
+                        return
+                    
+
+                if self.KeyCall1_status == 1:#松开
+                    if self.Keycall1_count >= 1: #防抖100ms
+                        
+                        self.Keycall1_timer.stop()
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0
+                        self.Keycall1_press_count+=1
+                        self.Keycall1_timer.start(500, 0, self.publish_call1Key_timeout_cb_do)#松手超时1s判断
+                    
+
+        def publish_call1Key_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call1Key_timeout_cb,"data":0}) 
+        
+        def call1Key_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    self.Keycall1_timer.stop()
+                    self.Keycall1_count = 0
+                    self.Keycall1_press = 0
+                    self.Keycall1_press_count=0
+                    self.Keycall1_long_press = 0
+                    return
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            print("call2Key_timeout_cb",self.Keycall2_press_count,flag)
+            if self.Keycall1_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
+                        self.Keycall1_press_count = 0
+                        return
+            if self.Keycall1_press_count == 3:#心率血压测试
+                self.Keycall1_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",1)#
+            elif self.Keycall1_press_count == 1:#
+                self.Keycall1_press_count = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                # print("video_state call",video_state)
+                # if video_state != 0:
+                #     if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                #         EventMesh.publish("video_answer_cb")
+                #     return
+                call_state = EventMesh.publish("get_call_state") 
+                if call_state == 2:#电话拨进需要接听
+                    EventMesh.publish("answer_call_event")#接听电话
+                    return
+                EventMesh.publish("play_cur_step_event")##播放当前步数
+            
+
+            self.Keycall1_press_count = 0
+
+
+        def key19_extint_cb(self,args):#call 2
+            #print("key19_extint_cb call 2")
+            # EventMesh.txt_log('key19_extint_cb :{}'.format(args))
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            if open_power != None and power_off != None and dev_app_mode != None:
+                if open_power == 0 or power_off == 1 or (dev_app_mode == 1 and get_video_state != 0): 
+                    return
+                
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            self.KeyCall2_status = int(args[1])
+            if self.KeyCall2_status == 0:
+                self.KeyCall2_status = 1
+            else:
+                self.KeyCall2_status = 0
+                pass
+            
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.KeyCall2_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_17.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+            # EventMesh.debug_log('self.KeyCall1_status :{}',args,self.KeyCall1_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0:
+                if self.KeyCall2_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.Keycall2_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count=0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0
+                        self.wechat_state = 0
+            
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_press_count = 0
+                        self.Keycall1_long_press = 0
+
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 1
+                        self.Keycall2_long_press = 0
+                        EventMesh.publish("AI_key_press")
+                        print("key19_extint_cb AI_key_press")
+                        self.Keycall2_timer.start(100, 1, self.publish_call2key_btn_event_cb)
+
+        def call2Key_press_cb(self, data):
+
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.Keycall2_timer.stop()
+                    self.Keycall2_count = 0
+                    self.Keycall2_press = 0
+                    self.Keycall2_press_count =0
+                    self.Keycall2_long_press = 0
+                    return
+            self.KeyCall2_status = self.extint_19.read_level()
+            if self.Keycall2_press == 1 :
+                self.Keycall2_count += 1
+                if self.Keycall2_count >= 10*3: #长按3s 
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if fall_down != None and video_state != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:
+                            self.Keycall2_count = 0
+                            self.Keycall2_press = 0
+                            self.Keycall2_press_count = 0
+                            self.Keycall2_long_press = 0
+                            self.Keycall2_timer.stop()
+                            return
+                    if self.Keycall2_long_press == 0:
+                        self.Keycall2_long_press = 1
+                        EventMesh.publish("AI_key_long_press")
+                        # EventMesh.publish("stop_led_timer")#设置参数
+                        # EventMesh.publish("call_phonebook_num",2)
+                        return
+                    if self.KeyCall2_status == 1:#松开
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+                        self.Keycall2_timer.stop()
+                        EventMesh.publish("AI_key_release")
+                        return
+                    
+
+                if self.KeyCall2_status == 1:#松开
+                    if self.Keycall2_count >= 1: #防抖100ms
+                        EventMesh.publish("AI_key_release")
+                        self.Keycall2_timer.stop()
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0
+                        self.Keycall2_press_count+=1
+                        #self.Keycall2_timer.start(500, 0, self.publish_call2Key_timeout_cb_do)#松手超时1s判断
+
+        def publish_call2Key_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.call2Key_timeout_cb,"data":0}) 
+        
+        def call2Key_timeout_cb(self, data):#
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    self.Keycall2_timer.stop()
+                    self.Keycall2_count = 0
+                    self.Keycall2_press = 0
+                    self.Keycall2_press_count=0
+                    return
+            flag = EventMesh.publish("get_call_state")#获取通话状态 
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
+            # print("call1Key_timeout_cb",self.Keycall1_press_count,flag)
+            if self.Keycall2_press_count > 1:#
+                if fall_down != None:
+                    if fall_down != 0 or flag != 0 or video_state != 0:#在打电话或者跌倒报警提醒中不允许按键触发
+                        self.Keycall2_press_count = 0
+                        return
+            
+            if self.Keycall2_press_count == 3:#测试体温
+                self.Keycall2_press_count = 0
+                call_state = EventMesh.publish("get_call_state")
+                battery = EventMesh.publish("screen_get_battery")
+                if call_state == None:
+                    call_state = 0
+                if call_state == 0: 
+                    if battery != None:
+                        if battery[0] != "1":#在充电得时候
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("set_manual_measure_mode",3)#测量体温
+            elif self.Keycall2_press_count == 1:#
+                self.Keycall2_press_count = 0
+                video_state = EventMesh.publish("get_video_state") 
+                # print("video_state ",video_state)
+                if video_state != 0:
+                    if video_state == 6:#6 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                        EventMesh.publish("video_answer_cb")
+                    return
+                EventMesh.publish("stop_led_timer")#设置参数
+                call_state = EventMesh.publish("get_call_state") 
+                
+                
+                if call_state == 2:#电话拨进需要接听
+                    EventMesh.publish("answer_call_event")#接听电话
+                    return
+                EventMesh.publish("play_battery_level_value")#播放当前电量
+                
+            self.Keycall2_press_count = 0
+
+
+
+        def pwk_extint_cb(self,args):#侧边按键
+            # EventMesh.txt_log('pwk_extint_cb :{}'.format(args))
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            if open_power != None and open_power_off != None and dev_app_mode != None:
+                if open_power == 0 or open_power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            
+            flag = EventMesh.publish("get_call_state")#获取通话状态
+            fall_down = EventMesh.publish("get_fall_down_state")#获取跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0 or flag == 2:
+                    return
+            self.GPIO26_status = int(args[1])
+            if self.GPIO26_status == 0:
+                self.GPIO26_status = 1
+            else:
+                self.GPIO26_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.GPIO26_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state == 6:#6是app打手表需要接通
+                            print("pwk_extint_cb")
+                            # EventMesh.publish("video_answer_cb")
+                        else:
+                            pass
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                        return
+                    
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.sosKey_status = self.sosKey.read_level()
+
+            if self.WeChatKey_status != 0 and self.KeyCall1_status != 0 and self.sosKey_status != 0 and self.KeyCall2_status != 0:
+                if self.GPIO26_status == 0:#按下
+                    EventMesh.publish("close_wechat_btn_timer")
+                    if self.pwkey_press == 0 :
+                        self.aud.stop()  #播放声音 
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_press_count=0
+                        self.sosKey_long_press = 0
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechatKey_press_count=0
+                        self.wechat_state = 0
+                       
+
+                        self.pwkey_press = 1
+                        self.pwkey_count = 0
+                        self.led_state = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+
+                        self.pwkey_timer.start(100, 1, self.publish_pwkKey_btn_event_cb)
+                        # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+
+
+
+        def pwKey_press_cb(self, data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None and video_state != None:
+                if open_power == 0 or open_power_off == 1 or video_state != 0:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            self.GPIO26_status = self.pwk_key26.read_level()
+
+            if self.pwkey_press == 1 :
+                self.pwkey_count += 1
+                if self.pwkey_count > 5:
+                    if self.led_state == 0:
+                        self.led_state = 1
+                        EventMesh.publish("set_led_time_arg",[1,1,330,led_mode.LONG_LIGHT_GREEN,2,1,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    if self.pwkey_count >= 10*10:
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.pwKey_press_count = 0
+                        self.led_state = 0
+                        # if EventMesh.publish("get_sim_Status") != 1:
+                        #     EventMesh.publish("open_power_on", 2)#
+                        # else:
+                        EventMesh.publish("open_power_on", 3)#
+                        return
+                    
+                    if self.pwkey_count >= 3*10 :
+                        if EventMesh.publish("get_sim_Status") != 1:
+                            EventMesh.debug_log("长3秒关机")
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            self.pwkey_timer.stop()
+                            self.pwkey_count = 0
+                            self.pwkey_press = 0
+                            self.pwKey_press_count = 0
+                            self.led_state = 0
+                            EventMesh.publish("open_power_on", 2)#
+                            return
+                            
+                    
+                if self.GPIO26_status == 1:#松开
+                    if self.pwkey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("self.GPIO26_status == 1")
+                        self.pwkey_timer.stop()
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count+=1
+                        self.pwkey_timer.start(500, 0, self.publish_pwKey_timeout_cb_do)#松手超时1s判断
+
+        def  hsensorTest_timer_cb(self,e):
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            w_data = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            #EventMesh.debug_log("FactoryModeHsensorTest{}".format(data))
+        
+              
+        def publish_pwKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.pwKey_timeout_cb,"data":0})  
+        
+        def pwKey_timeout_cb(self, data):#侧边按键
+            boot_count = EventMesh.publish("get_boot_time_count")
+
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None and video_state != None:
+                if open_power == 0 or open_power_off == 1 or video_state != 0:
+                    self.pwkey_timer.stop()
+                    self.pwkey_count = 0
+                    self.pwkey_press = 0
+                    self.led_state = 0
+                    self.pwKey_press_count=0
+                    return
+
+            if self.pwKey_press_count >= 1:
+                self.pwKey_press_count = 0
+                # flag = EventMesh.publish("get_call_state") 
+                # if flag != 2:#如果是电话拨出去或者不在打电话中都可以执行
+                #     EventMesh.publish("stop_led_timer")#设置参数
+                #     if flag == 1:#如果是sos电话拨出去
+                #         sos_flag = EventMesh.publish("get_sos_flag")
+                #         if sos_flag == 1:
+                #             EventMesh.publish("set_sos_flag",0)
+                #             EventMesh.publish("set_sos_num",0)
+                #             EventMesh.publish("set_hangup_mode",0)
+                #     EventMesh.publish("close_hr_sop2")#
+                #     flag = EventMesh.publish("get_call_state") 
+                #     # if flag == 0 or flag == 2:#在拨出去或者通话中就不播报入网成功的语音
+                #     if flag != 1:#在拨出去或者通话中就不播报入网成功的语音
+                #         EventMesh.publish("set_sim_mode")#
+                #     EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+                
+                flag = EventMesh.publish("get_call_state") 
+                if flag != 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("dialing_out_event")#电话呼叫中voiceCall.callEnd()
+
+                    if flag == 1:#如果是sos电话拨出去
+                        sos_flag = EventMesh.publish("get_sos_flag")
+                        if sos_flag == 1:
+                            EventMesh.publish("set_sos_state_out")
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                            EventMesh.publish("set_hangup_mode",0)
+                    EventMesh.publish("close_hr_sop2")#
+                    flag = EventMesh.publish("get_call_state") 
+                    if flag != 1:
+                        EventMesh.publish("set_sim_mode")#
+            
+            self.pwKey_press_count = 0
+
+        def sosKey_extint_cb(self,args):
+            
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if power_off != None and open_power != None:
+                if power_off == 1 or open_power == 0:
+                    return
+            self.sosKey_status = int(args[1])
+            if self.sosKey_status == 0:
+                self.sosKey_status = 1
+            else:
+                self.sosKey_status = 0
+                pass
+            get_video = EventMesh.publish("get_video_in_out_state")
+
+            self.WeChatKey_status = self.wechatKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+
+            # EventMesh.debug_log('sosKey_extint_cb ',args,self.sosKey_status,self.WeChatKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            if self.WeChatKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
+                if self.sosKey_status == 0:#按下
+                    if NEW_ENABLE == 0:#新的按键功能定义
+                        video_state = EventMesh.publish("get_video_state")
+                        if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                            if video_state == 6 or get_video == 0:
+                                EventMesh.debug_log("sosKey_extint_cb",get_video,video_state)
+                                EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                                self.sosKey_press_count=0
+                                self.wechatKey_timer.stop()
+                                self.pwkey_timer.stop()
+                                self.sosKey_timer.stop()
+                                self.Keycall2_timer.stop()
+                                self.Keycall1_timer.stop()
+                                return
+                    EventMesh.publish("close_falldown_alarm_event")#关闭跌倒报警提醒事件
+                    EventMesh.publish("close_wechat_btn_timer")
+
+                    if self.sosKey_press == 0 :
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        
+                        self.pwkey_count = 0
+                        self.pwkey_press = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0 #电源键
+
+
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count=0#微聊键
+
+
+                        self.sosKey_press = 1
+                        self.sosKey_long_press = 0
+                        self.sosKey_count = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_long_press = 0
+                        self.Keycall2_press_count = 0
+
+                        self.sosKey_timer.start(100, 1, self.publish_soskey_btn_event_cb)
+                        # self.sosKey_timer.start(100, 1, self.sosKey_press_cb)
+            # EventMesh.debug_log("key22_extint_cb:self.key22_timer.start!!!!\n")
+
+        def sosKey_press_cb(self, data):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            self.sosKey_status = self.sosKey.read_level()
+            if self.sosKey_press == 1 :
+                # if self.sosKey_count <= 2:
+                    # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                    # else:
+                    #     EventMesh.publish("set_led_time_arg",[1000,200,1,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#设置参数
+                self.sosKey_count += 1
+                if self.sosKey_count >= 10*3: #长按3s sos拨号
+                    flag = EventMesh.publish("get_call_state")#获取通话状态
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    video_state = EventMesh.publish("get_video_state")#获取视频通话状态
+                    if fall_down != None and video_state != None:
+                        if fall_down != 0 or flag == 2 or video_state != 0:
+                            self.sosKey_count = 0
+                            self.sosKey_long_press = 0
+                            self.sosKey_press = 0
+                            self.sosKey_timer.stop()
+                            return
+                    if self.sosKey_long_press == 0:
+                        self.sosKey_long_press = 1
+                       
+                        EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                        return
+                    if self.sosKey_status == 1:#松开
+                        self.sosKey_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_timer.stop()
+                        return
+
+                # EventMesh.debug_log("self.sosKey_count {}",self.sosKey_count)
+                if self.sosKey_status == 1:#松开
+                    if self.sosKey_count >= 1: #防抖100ms
+                        self.sosKey_timer.stop()
+                        self.sosKey_count = 0
+                        self.sosKey_press = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press_count+=1
+                        self.sosKey_timer.start(500, 0, self.publish_sosKey_timeout_cb_do)#松手超时1s判断
+        def publish_sosKey_timeout_cb_do(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.sosKey_timeout_cb,"data":0})  
+        # 1、长按3秒以上,进行SOS拔号;
+        # 2、短按挂断来电或挂断视频通话,平时短按一下语音报时;
+        # 3、短按三下,发起视频通话(默认第一个)
+        # 4、短按六次,播报IMEI号
+        # 5、短按十次,解绑APP,同时恢复出厂设置
+        def close_factory_test(self):#关闭老化测试
+            if self.factoryTest_flag == 1:
+                self.factoryTest_flag = 0
+                close_led_white()
+                close_led_red()
+                close_led_green()
+                self.factoryTest_led_count = 0
+                self.aud.stopPlayStream()
+                self.factoryTest_timer.stop()
+                EventMesh.publish("close_motor_infor")
+
+        def factoryTest_timer_cb(self,e):
+            # self.factoryTest_count+=1
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # print("time_tmp - self.factory_timesec :%d time_tmp:%d self.factory_timesec %d\r\n",time_tmp - self.factory_timesec,time_tmp,self.factory_timesec)
+            if time_tmp - self.factory_timesec > 60*60*2:
+            # if self.factoryTest_count > 60*60*2:#老化测试2小时自动退出
+            #     self.factoryTest_count = 0
+                self.close_factory_test()
+                return
+            #播放音频 
+            str_data = 'mp3files={}.mp3'.format(audio_buf.index("R_ALARM_NEW"))
+            if EventMesh.publish("get_audio_state") == 0:
+                self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+            #led灯常亮
+            self.factoryTest_led_count+=1
+            if self.factoryTest_led_count == 1:#1  4 7  10 
+                open_led_red()
+                close_led_green()
+                close_led_white()
+            elif self.factoryTest_led_count == 2:
+                open_led_green()
+                close_led_red()
+                close_led_white()
+            elif self.factoryTest_led_count == 3: #3  6 9 12 
+                open_led_white()
+                close_led_red()
+                close_led_green()
+            if self.factoryTest_led_count >= 3+1:
+                self.factoryTest_led_count = 0
+
+            EventMesh.publish("set_motor_time",[1,2,10*1,10,5])#设置马达参数
+
+        def sosKey_timeout_cb(self, data):#
+            # print("sosKey_timeout_cb",self.sosKey_press_count)
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.sosKey_timer.stop()
+                    self.sosKey_count = 0
+                    self.sosKey_press = 0
+                    self.sosKey_long_press = 0
+                    self.sosKey_press_count = 0
+                    return
+            factory_count = EventMesh.publish("get_factory_test_time")
+            print("factory_count:%d",factory_count)
+            try :
+                if factory_count <= 30 :#开机30秒内按键次数大于15进入测试模式
+                    #EventMesh.debug_log("boot_count:{}".format(boot_count))
+                    if self.sosKey_press_count >= 15:
+                        self.factoryTest_timer.start(1000,1,self.factoryTest_timer_cb)
+                        self.sosKey_press_count = 0
+                        self.factoryTest_led_count = 0
+                        self.factoryTest_flag = 1
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)
+                        self.factory_timesec = time_tmp
+                        return
+
+            except Exception as e:
+                usys.print_exception(e)
+
+            if NEW_ENABLE == 1:#旧的按键定义
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+                flag = EventMesh.publish("get_call_state")#获取通话状态
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.sosKey_press_count > 1:#
+                    if fall_down != None:
+                        if fall_down != 0 or flag != 0:
+                            self.sosKey_press_count = 0
+                            return
+                if self.sosKey_press_count == 10:#
+                    self.sosKey_press_count = 0
+                    pass
+                elif self.sosKey_press_count == 6:#
+                    self.sosKey_press_count = 0
+                    self.close_factory_test()
+                    pass
+                elif self.sosKey_press_count == 5:#功能暂时屏蔽
+                    self.sosKey_press_count = 0
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0: 
+                        if battery != None:
+                            if battery[0] != "1":#在充电得时候
+                                EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                    pass
+                elif self.sosKey_press_count == 4:#拨打app快捷号码
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_center_phone")#拨打快捷号码
+                    # EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.sosKey_press_count == 3:#测试心率
+                    self.sosKey_press_count = 0
+                    
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0: 
+                        if battery != None:
+                            if battery[0] != "1":#在充电得时候
+                                EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish("set_manual_measure_mode",1)#
+                    pass
+                elif self.sosKey_press_count == 2:#播报当前步数
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_cur_step_event")#
+                    pass
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_test_event")
+                    EventMesh.publish("sos_short_press")#sos短按事件
+                    
+                    pass
+                self.sosKey_press_count = 0
+            else:
+                # EventMesh.debug_log("sosKey_press_count!!!!!!!!!!!!!! ",self.sosKey_press_count)
+                flag = EventMesh.publish("get_call_state")#获取通话状态
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                video_state = EventMesh.publish("get_video_state")#获取视频通话状态
+                
+                
+                if self.sosKey_press_count > 1:#短按十次解绑app
+                    if fall_down != None and video_state != None and flag != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:#获取视频通话状态:
+                            self.sosKey_press_count = 0
+                            return
+                if self.sosKey_press_count == 10:#
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.sosKey_press_count == 6:#播报IMEI号
+                    self.sosKey_press_count = 0
+                    self.close_factory_test()
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_imei_event")#播報imei号
+                    pass
+                elif self.sosKey_press_count == 5:#
+                    self.sosKey_press_count = 0
+                    # call_state = EventMesh.publish("get_call_state")
+                    # battery = EventMesh.publish("screen_get_battery")
+                    # if call_state == None:
+                    #     call_state = 0
+                    # if call_state == 0: 
+                    #     if battery != None:
+                    #         if battery[0] != "1":#在充电得时候
+                    #             EventMesh.publish("stop_led_timer")#设置参数
+                    #             EventMesh.publish("set_manual_measure_mode",3)#测量体温
+                    # pass
+                elif self.sosKey_press_count == 4:#
+                    self.sosKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("play_center_phone")#拨打快捷号码
+                    # EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.sosKey_press_count == 3:#视频通话
+                    self.sosKey_press_count = 0
+                    call_state = EventMesh.publish("get_call_state")
+                    battery = EventMesh.publish("screen_get_battery")
+                    if call_state == None:
+                        call_state = 0
+                    if call_state == 0:
+                        flag = EventMesh.publish("get_call_state") 
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        usb_state = EventMesh.publish("get_usb")#
+                        video_state = EventMesh.publish("get_video_state")
+                        if flag != 0  or fall_down != 0:
+                            return
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish("call_viode_book_num")
+                    pass
+                elif self.sosKey_press_count == 2:#播报当前步数
+                    self.sosKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("play_cur_step_event")#
+                    pass
+                elif self.sosKey_press_count == 1:#挂断来电 短语音播报
+                    self.sosKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_test_event")
+                    EventMesh.publish("sos_short_press")#sos短按事件
+                    
+                    pass
+                self.sosKey_press_count = 0
+
+
+        def wechatKey_extint_cb(self,args):
+            power_off = EventMesh.publish("get_power_off_state")#获取关机标识
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            dev_app_mode = EventMesh.publish("get_dev_app_mode")
+            video_state = EventMesh.publish("get_video_state")#获取视频通话状态 5在通话状态不允许按键输入
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+
+            if open_power != None and power_off != None and dev_app_mode != None:
+                if open_power == 0 or power_off == 1 or  (dev_app_mode == 1 and get_video_state != 0):
+                    return
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            if fall_down != None:
+                if fall_down != 0:
+                    return
+            # EventMesh.txt_log('wechatKey_extint_cb :{}'.format(args))
+            self.WeChatKey_status = int(args[1])
+            if self.WeChatKey_status == 0:
+                self.WeChatKey_status = 1
+            else:
+                self.WeChatKey_status = 0
+                pass
+            if NEW_ENABLE == 0:#新的按键功能定义
+                if self.WeChatKey_status == 0:
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            return
+                    
+            self.sosKey_status = self.sosKey.read_level()
+            self.GPIO26_status = self.pwk_key26.read_level()
+            self.KeyCall1_status = self.extint_19.read_level()
+            self.KeyCall2_status = self.extint_17.read_level()
+            # EventMesh.debug_log('wechatKey_extint_cb ',args,self.WeChatKey_status,self.sosKey_status,self.KeyCall1_status,self.KeyCall2_status,self.GPIO26_status) # args[0]:gpio号 args[1]:上升沿或下降沿
+            # if self.sosKey_status != 0 and self.GPIO26_status != 0:
+            if self.sosKey_status != 0 and self.GPIO26_status != 0 and self.KeyCall1_status != 0 and self.KeyCall2_status != 0:
+                if self.WeChatKey_status == 0:#按下
+                    video_state = EventMesh.publish("get_video_state")
+                    if video_state != 0:#视频通话打入或者接听后允许挂断视频通话
+                        if video_state != 6:#6是app打手表需要接通
+                            # EventMesh.publish("video_dev_reject_cb",2)#挂断视频通话
+                            # self.wechatKey_press_count = 0
+                            # self.wechatKey_timer.stop()
+                            # self.pwkey_timer.stop()
+                            # self.sosKey_timer.stop()
+                            # self.Keycall2_timer.stop()
+                            # self.Keycall1_timer.stop()
+                            return
+                    if self.wechatKey_press == 0:
+                        self.wechatKey_timer.stop()
+                        self.pwkey_timer.stop()
+                        self.sosKey_timer.stop()
+                        self.Keycall2_timer.stop()
+                        self.Keycall1_timer.stop()
+
+                        self.sosKey_press_count = 0
+                        self.sosKey_long_press = 0
+                        self.sosKey_press = 0
+                        self.sosKey_count = 0
+
+                        self.pwkey_press = 0
+                        self.pwkey_count = 0
+                        self.led_state = 0
+                        self.pwKey_press_count=0
+
+                        self.wechatKey_press = 1
+                        self.led_state = 0
+                        self.wechatKey_count = 0
+                        self.wechat_state = 0
+
+                        self.Keycall1_count = 0
+                        self.Keycall1_press = 0 
+                        self.Keycall1_long_press = 0
+                        self.Keycall1_press_count = 0
+                        
+                        self.Keycall2_count = 0
+                        self.Keycall2_press = 0 
+                        self.Keycall2_press_count = 0
+                        self.Keycall2_long_press = 0
+
+                        self.wechatKey_timer.start(100, 1, self.publish_wechat_btn_event_cb)
+                else:
+                    EventMesh.publish("close_wechat_btn_timer")
+
+        def close_wechat_btn_timer(self,event,*argc):
+            tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+            wechat_time = 0
+            time_tmp = 0
+            time_sec = 0
+
+            if tmp != None:
+                if tmp[0] == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechatKey_press_count=0
+                    self.wechat_state = 0
+                    date_tmp = utime.localtime()
+                    time_tmp = utime.mktime(date_tmp)
+                    time_sec = tmp[1]
+                    wechat_time = time_tmp - time_sec
+                    # EventMesh.debug_log("close_btn_timer",time_tmp,time_sec,wechat_time)
+                    if wechat_time >= 15:
+                        wechat_time = 15
+                    if wechat_time <= 0:
+                        wechat_time = 0
+                    EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+        
+
+        def wechatKey_press_cb(self,data):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1 :
+                    
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            self.WeChatKey_status = self.wechatKey.read_level()
+            wechat_time = 0
+            tmp = None
+            time_sec = 0
+            time_tmp = 0
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.wechatKey_press == 1 :#是否按下
+                tmp = EventMesh.publish("get_wechat_time")#获取微聊时间戳
+                self.wechatKey_count += 1
+                if self.wechatKey_count >= 15: #长按1s进入微聊录音
+                    flag = EventMesh.publish("get_call_state") 
+                    fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                    if flag != None:
+                        if flag == 0 and fall_down == 0 and video_state == 0:
+                            if self.WeChatKey_status == 0:
+                                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网不需要录音
+                                    if self.wechat_state == 0:#按下超过s开始录音
+                                        EventMesh.publish("start_wechat_record")#开始录音
+                                        self.wechat_state = 1
+                                else:
+                                    self.wechat_state = 0
+                                    self.wechatKey_timer.stop()
+                                    self.wechatKey_count = 0
+                                    self.wechatKey_press = 0
+                                    self.wechatKey_press_count=0
+                                    EventMesh.publish("set_sim_mode")#播報imei号
+                                    return
+
+                            if self.WeChatKey_status == 0:#未松手超过15s啧停止录音
+                                if self.wechat_state == 1:
+                                    if tmp != None:
+                                        if tmp[0] != 0:
+                                            time_sec = tmp[1]
+                                            if time_tmp - time_sec >= 15:
+                                                wechat_time = time_tmp - time_sec
+                                                if wechat_time >= 15:
+                                                    wechat_time = 15
+                                                EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                                
+                                                self.wechatKey_timer.stop()
+                                                self.wechatKey_count = 0
+                                                self.wechatKey_press = 0
+                                                self.wechat_state = 0
+                                                self.wechatKey_press_count=0
+                                                return
+                            else:
+                                if self.WeChatKey_status == 1:
+                                    if self.wechat_state == 1:#如果按下时长超过1s且小于长按的时间也认为是录微聊
+                                        if tmp != None:
+                                            if tmp[0] != 0:
+                                                time_sec = tmp[1]
+                                                wechat_time = time_tmp - time_sec
+                                            # EventMesh.debug_log("WECHAT TIEM",time_tmp,time_sec,wechat_time)
+                                            if wechat_time >= 15:
+                                                wechat_time = 15
+                                        
+                                        
+                                        EventMesh.publish("send_wechat_record",wechat_time)#发送录音文件内容
+                                        self.wechatKey_timer.stop()
+                                        self.wechat_state = 0
+                                        self.wechatKey_count = 0
+                                        self.wechatKey_press = 0
+                                        self.wechatKey_press_count=0
+                                        return
+                        else:
+                            self.wechatKey_timer.stop()
+                            self.wechatKey_count = 0
+                            self.wechat_state = 0
+                            self.wechatKey_press = 0
+                            self.wechatKey_press_count = 0
+                            return
+
+                if self.WeChatKey_status == 1:#松开
+                    if self.wechatKey_count >= 1: #防抖100ms
+                        # EventMesh.debug_log("WeChat time!!!!!!!!!!!!!!")
+                        self.wechatKey_timer.stop()
+                        self.wechatKey_count = 0
+                        self.wechatKey_press = 0
+                        self.wechat_state = 0
+                        self.wechatKey_press_count+=1
+                        self.wechatKey_timer.start(500, 0, self.publish_wechatKey_btn_event_cb)#松手超时1s判断
+
+        def publish_wechatKey_btn_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_btnInfo",{"func":self.wechatKey_timeout_cb,"data":0})  
+
+        # 1、短按一下,播放最后收到的语音或接听电话,接听视频通话;短按一下,开始语音播报能否速度快一点,现在慢了体验感有点差
+        # 2、长按1.5秒后开始录音,松开按键后,发送录音至APP;
+        # 3、短按三次,拨打通信录号码三
+        # 4、短按四次,拨打通信录号码四
+        # 5、短按五次,拨打通信录号码五
+        # 6、短按六次,拨打通信录号码六
+        # 7、短按七次,拨打通信录号码七
+        # 8、短按八次,拨打通信录号码八
+    
+        def wechatKey_timeout_cb(self,data):#微聊键
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            video_state = EventMesh.publish("get_video_state")
+            if open_power != None and open_power_off != None:
+                if open_power == 0 or open_power_off == 1:
+                    self.wechatKey_timer.stop()
+                    self.wechatKey_count = 0
+                    self.wechatKey_press = 0
+                    self.wechat_state = 0
+                    self.wechatKey_press_count=0
+                    return
+            
+            if NEW_ENABLE == 1: #旧的按键定义微聊键
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.wechatKey_press_count > 1:#
+                    if fall_down != None:
+                        if fall_down != 0 or flag == 2:
+                            self.wechatKey_press_count = 0
+                            return
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+                if self.wechatKey_press_count == 10:#短按十次解绑app
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.wechatKey_press_count == 6:#短按六次播报imei号
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("play_imei_event")#播報imei号
+                    pass
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码三
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码二
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",2)
+                    pass
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",1)
+                    # EventMesh.publish("interup_call_event")#
+                    pass
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    call_state = EventMesh.publish("get_call_state") 
+                    if call_state == 0:
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0:
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                                return
+                    else:
+                        if call_state == 2:#电话拨进需要接听
+                            EventMesh.publish("answer_call_event")#接听电话
+                            return
+                    EventMesh.publish("play_wechat_last_amr")
+                    # pass
+                self.wechatKey_press_count = 0
+            else:
+                flag = EventMesh.publish("get_call_state")#在通话或者电话拨进 或者拨出不允许寻找设备
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if self.wechatKey_press_count > 1:#
+                    if fall_down != None and flag != None and video_state != None:
+                        if fall_down != 0 or flag != 0 or video_state != 0:
+                            self.wechatKey_press_count = 0
+                            return
+                # EventMesh.debug_log("wechatKey_timeout_cb!!!!!!!!!!!!!! ",self.wechatKey_press_count)
+                if self.wechatKey_press_count == 10:#短按十次解绑app
+                    self.wechatKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("open_power_on", 4)#恢复出厂
+                    pass
+                elif self.wechatKey_press_count == 8:#拨打通讯录号码八
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",8)
+                    pass
+                elif self.wechatKey_press_count == 7:#拨打通讯录号码七
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",7)
+                    pass
+                elif self.wechatKey_press_count == 6:#拨打通讯录号码六
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",6)
+                    pass
+                elif self.wechatKey_press_count == 5:#拨打通讯录号码五
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",5)
+                    pass
+                elif self.wechatKey_press_count == 4:#拨打通讯录号码四
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",4)
+                    pass
+                elif self.wechatKey_press_count == 3:#拨打通讯录号码三
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("call_phonebook_num",3)
+                    pass
+                elif self.wechatKey_press_count == 2:#拨打通讯录号码一
+                    self.wechatKey_press_count = 0
+                    # EventMesh.publish("stop_led_timer")#设置参数
+                    # EventMesh.publish("call_phonebook_num",1)
+                    # EventMesh.publish("interup_call_event")#
+                    pass
+                elif self.wechatKey_press_count == 1:#播放最后收到的语音
+                    self.wechatKey_press_count = 0
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    video_state = EventMesh.publish("get_video_state") 
+                    # print("video_state call",video_state)
+                    if video_state != 0:
+                        if video_state == 6:#2 是app拨打手表 1 是手表打app 3 是正在视频通话中 0 关闭只有第一次视频通话打入才允许接听 接通之后不允许接听了
+                            EventMesh.publish("video_answer_cb")
+                        return
+                    call_state = EventMesh.publish("get_call_state") 
+                    if call_state == 0:
+                        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                        if fall_down != None:
+                            if fall_down != 0:
+                                EventMesh.publish_async("dial_sos_phone")#拨打sos号码
+                                return
+                    else:
+                        if call_state == 2:#电话拨进需要接听
+                            EventMesh.publish("answer_call_event")#接听电话
+                            return
+                    EventMesh.publish("play_wechat_last_amr")
+                    # pass
+                self.wechatKey_press_count = 0
+            
+    
+
+
+        def pwk_press_cb(self, *args):
+            '''KEY2:联动屏幕右下角或返回键长按关机'''
+            if self.pwk_press == 1 :
+                
+                self.pwk_count += 1
+                EventMesh.debug_log("self.pwk_count {}",self.pwk_count)
+                if self.GPIO26_status == 1:#松开
+                    if self.pwk_count >= 1: #防抖100ms
+                        self.__pwk_timer.stop()
+                        self.pwk_count = 0
+                        self.pwk_press = 0
+                        EventMesh.debug_log("self.pwk_press_cb")
+
+                if self.pwk_count > (self.__PowerDownTimeOut//100): #长按
+                    self.__pwk_timer.stop()
+                    self.pwk_count = 0
+                    self.pwk_press = 0
+                    EventMesh.debug_log("btn8_long_press")
+
+        def __ui_callback(self, para):
+        # EventMesh.debug_log("para = {}".format(para))
+            if para == 0:
+                EventMesh.publish("done_left_to_right")
+                #EventMesh.debug_log("<-")
+            elif para == 1:
+                EventMesh.publish("done_right_to_left")
+                #EventMesh.debug_log("->")
+            elif para == 2:
+                EventMesh.publish("done_bottom_to_top")
+                #EventMesh.debug_log("^")
+            elif para == 3:
+                EventMesh.publish("done_top_to_bottom")
+                #EventMesh.debug_log("V")
+            elif para == 4:
+                EventMesh.publish("done_return")
+                #EventMesh.debug_log("return")
+            elif para == 5:
+                EventMesh.publish("done_click")
+                #EventMesh.debug_log("CLICK")
+            elif para == 6:
+                EventMesh.publish("done_press")
+                #EventMesh.debug_log("press")
+            elif (para == 6):
+                EventMesh.publish("done_error")
+                #EventMesh.debug_log("error")
+
+        def key_callback(self, l_list):
+            EventMesh.debug_log("key_callback:",str(l_list))
+            if l_list[0] == 1:
+                # 马达震动预留
+                pass
+            if (l_list[1] == 3) and (l_list[2] == 0):
+                if l_list[0] == 1:
+                    #self.pwk_press = 0
+                    EventMesh.publish("btn1_press")
+                else:
+                    pass
+                    # EventMesh.publish("btn1_press")
+
+
+
+
+        def powerKey_callback(self, status):
+            EventMesh.debug_log('==pwr:', status)# 0 1 0
+            self.powerKey_status = status
+            if self.pwk_press == 1: #按按钮时不处理
+                return
+        
+            
+                
+
+        def power_key_press_cb(self, *args):
+            pass
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未插卡的情况下强制关机
+                # EventMesh.publish("open_power_on", 2)#
+
+
+        def start(self):
+            self.post_processor_after_instantiation()
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/config.json b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/config.json
new file mode 100644 (file)
index 0000000..334b3b6
--- /dev/null
@@ -0,0 +1,12 @@
+{
+  "old_time": 0,
+  "flip_sw": 0,
+  "VC_TTS_voice_type": {
+    "3": "aliyun::longjiaxin",
+    "2": "huoshan::zh_male_tiancaitongsheng_mars_bigtts",
+    "4": "huoshan::zh_female_daimengchuanmei_moon_bigtts",
+    "1": "huoshan::zh_male_wennuanahu_moon_bigtts",
+    "0": "huoshan::zh_female_wanwanxiaohe_moon_bigtts"
+  },
+  "dev_pass": "dEX5qdAPR2lhOBRmHbgbmPKZsPAcGN"
+}
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/constants.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/constants.py
new file mode 100644 (file)
index 0000000..38d9214
--- /dev/null
@@ -0,0 +1,225 @@
+class PROTOCOL:
+    LK_SEND = "LK_SEND"
+    LK_RECV = "LK_RECV"
+
+    PING_SEND = "PING_SEND"
+    PING_RECV = "PING_RECV"
+
+    KA_SEND = "KA_SEND"
+    KA_RECV = "KA_RECV"
+
+    UD_SEND = "UD_SEND"
+    UD_RECV = "UD_RECV"
+
+    CR_SEND = "CR_SEND"
+    CR_RECV = "CR_RECV"
+
+    AL_SEND = "AL_SEND"
+    AL_RECV = "AL_RECV"
+
+    FIND_SEND = "FIND_SEND"
+    FIND_RECV = "FIND_RECV"
+
+    POWEROFF_SEND = "POWEROFF_SEND"
+    POWEROFF_RECV = "POWEROFF_RECV"
+
+    PHL_SEND = "PHL_SEND"
+    PHL_RECV = "PHL_RECV"
+
+    TK_SEND = "TK_SEND"
+    TK_RECV = "TK_RECV"
+
+    TKS_SEND = "TKS_SEND"
+    TKS_RECV = "TKS_RECV"
+
+    MESSAGE_SEND = "MESSAGE_SEND"
+    MESSAGE_RECV = "MESSAGE_RECV"
+
+    WT_SEND = "WT_SEND"
+    WT_RECV = "WT_RECV"
+
+    REMIND_SEND = "REMIND_SEND"
+    REMIND_RECV = "REMIND_RECV"
+
+    HRTSTART_SEND = "hrtstart_SEND"
+    HRTSTART_RECV = "hrtstart_RECV"
+
+    HEART_SEND = "heart_SEND"
+    HEART_RECV = "heart_RECV"
+    
+    OXYGEN_SEND = "oxygen_SEND"
+    OXYGEN_RECV = "oxygen_RECV"
+
+    OXSTART_SEND = "oxstart_SEND"
+    OXSTART_RECV = "oxstart_RECV"
+
+    TEMP_SEND = "temp_SEND"
+    TEMP_RECV = "temp_RECV"
+
+    DLT_SEND = "DLT_SEND"
+    DLT_RECV = "DLT_RECV"
+
+    UPLOAD_SEND = "UPLOAD_SEND"
+    UPLOAD_RECV = "UPLOAD_RECV"
+
+    CENTER_SEND = "CENTER_SEND"
+    CENTER_RECV = "CENTER_RECV"
+
+    MONITOR_SEND = "MONITOR_SEND"
+    MONITOR_RECV = "MONITOR_RECV"
+
+    SOS_SEND = "SOS_SEND"
+    SOS_RECV = "SOS_RECV"
+
+    BOOTOFF_SEND = "BOOTOFF_SEND"
+    BOOTOFF_RECV = "BOOTOFF_RECV"
+
+    WDSTART_SEND ="wdstart_SEND"
+    WDSTART_RECV ="wdstart_RECV"
+
+
+    LOWBAT_SEND = "LOWBAT_SEND"
+    LOWBAT_RECV = "LOWBAT_RECV"
+
+    TIME_SEND = "Time_SEND"
+    TIME_RECV = "Time_RECV"
+
+    WLKEY_SEND = "WLKEY_SEND"
+    WLKEY_RECV = "WLKEY_RECV"
+
+    SILENCETIME2_SEND = "SILENCETIME2_SEND"
+    SILENCETIME2_RECV = "SILENCETIME2_RECV"
+
+    KEYBRD_SEND = "KEYBRD_SEND"
+    KEYBRD_RECV = "KEYBRD_RECV"
+
+    FALLDOWN_SEND = "FALLDOWN_SEND"
+    FALLDOWN_RECV = "FALLDOWN_RECV"
+    
+    HELP_SEND = "HELP_SEND"
+    HELP_RECV = "HELP_RECV"
+    
+    REMOVE_SEND = "REMOVE_SEND"
+    REMOVE_RECV = "REMOVE_RECV"
+
+    BLOOD_SEND = "blood_SEND"
+    BLOOD_RECV = "blood_RECV"
+
+    BLDSTART_SEND ="bldstart_SEND"
+    BLDSTART_RECV = "bldstart_RECV"
+
+    BGSTART_SEND = "bgstart_SEND"
+    BGSTART_RECV = "bgstart_RECV"
+
+    BLOODGLUSOCE_SEND = "bloodglucose_SEND"
+    BLOODGLUSOCE_RECV = "bloodglucose_RECV"
+
+    REMIND_CH_DRINK_SEND = "REMIND_CH_DRINK_SEND"
+    REMIND_CH_DRINK_RECV = "REMIND_CH_DRINK_RECV"
+
+    REMIND_CH_MEDICINE2_SEND = "REMIND_CH_MEDICINE2_SEND"
+    REMIND_CH_MEDICINE2_RECV = "REMIND_CH_MEDICINE2_RECV"
+
+    REMIND_CH_HOME_SEND = "REMIND_CH_HOME_SEND"
+    REMIND_CH_HOME_RECV = "REMIND_CH_HOME_RECV"
+
+    REMIND_CH_WAKEUP_SEND = "REMIND_CH_WAKEUP_SEND"
+    REMIND_CH_WAKEUP_RECV = "REMIND_CH_WAKEUP_RECV"
+
+    REMIND_CH_SLEEP_SEND = "REMIND_CH_SLEEP_SEND"
+    REMIND_CH_SLEEP_RECV = "REMIND_CH_SLEEP_RECV"
+
+    REMIND_CH_REST_SEND = "REMIND_CH_REST_SEND"
+    REMIND_CH_REST_RECV = "REMIND_CH_REST_RECV"
+
+    SLEEP_DATA_SEND = "SleepReport_SEND"
+    SLEEP_DATA_RECV = "SleepReport_RECV"
+
+    SLEEPTIME_SEND = "SLEEPTIME_SEND"
+    SLEEPTIME_RECV = "SLEEPTIME_RECV"
+
+    FACTORY_SEND = "FACTORY_SEND"
+    FACTORY_RECV = "FACTORY_RECV"
+
+    RESET_SEND = "RESET_SEND"
+    RESET_RECV = "RESET_RECV"
+
+    REMIND_CH_SIT_SEND = "REMIND_CH_SIT_SEND"
+    REMIND_CH_SIT_RECV = "REMIND_CH_SIT_RECV"
+
+    SCREEN_SHOW_SEND = "SCREEN_SHOW_SEND"
+    SCREEN_SHOW_RECV = "SCREEN_SHOW_RECV"
+
+    JPREG_SEND = "JPREG_SEND"
+    JPREG_RECV = "JPREG_RECV"
+
+    MEMBERS_SEND = "MEMBERS_SEND"
+    MEMBERS_RECV = "MEMBERS_RECV"
+
+    CALLING_SEND = "CALLING_SEND"
+    CALLING_RECV = "CALLING_RECV"
+    
+
+    RCALLING_SEND  = "RCALLING_SEND"
+    RCALLING_RECV  = "RCALLING_RECV"
+
+    AGTALK_SEND = "AGTALK_SEND"
+    AGTALK_RECV = "AGTALK_RECV"
+
+    RTALK_SEND = "RTALK_SEND"
+    RTALK_RECV = "RTALK_RECV"
+
+    JMEMBERS_SEND = "JMEMBERS_SEND"
+    JMEMBERS_RECV = "JMEMBERS_RECV"
+
+    RINGING_SEND = "RINGING_SEND"
+    RINGING_RECV = "RINGING_RECV"
+
+    HANGUP_SEND = "HANGUP_SEND"
+    HANGUP_RECV = "HANGUP_RECV"
+
+    CALLCANCEL_SEND ="CALLCANCEL_SEND"
+    CALLCANCEL_RECV = "CALLCANCEL_RECV"
+    
+
+class EVENT:
+    CHANNEL_SOCKET_SEND = "CHANNEL_SOCKET_SEND"
+    START_LOCATION = "START_LOCATION" 
+    START_LOCATION_TEST = "START_LOCATION_TEST" 
+    READ_LOCATION = "READ_LOCATION"  
+    CLOSE_LOCATION = "CLOSE_LOCATION"
+    GPSOPEN = "GPSOPEN"
+    GPSCLOSE = "GPSCLOSE"
+    GPSINFO = "GPSINFO"
+    WIFISCANOPEN = "WIFISCANOPEN"
+    WIFIINFO = "WIFIINFO"
+
+    GET_KEY = "GET_KEY"
+    SET_KEY = "SET_KEY"
+    GET_IMEI = "GET_IMEI"
+    GET_CID = "GET_CID"
+    SET_CID = "SET_CID"
+    GET_IMSI = "GET_IMSI"
+    GET_PASSWORD = "GET_PASSWORD"
+    SET_PASSWORD = "SET_PASSWORD"
+    GET_BATTERY = "GET_BATTERY"
+    PERSISTENT_CONFIG_GET = "PERSISTENT_CONFIG_GET"
+    PERSISTENT_CONFIG_STORE = "PERSISTENT_CONFIG_STORE"
+    SET_PING = "SET_PING"
+    GET_PING = "GET_PING"
+    SET_CONNECT = "SET_CONNECT"
+    GET_CONNECT = "GET_CONNECT"
+    GET_STEP = "GET_STEP"
+    PUSH_STEP = "PUSH_STEP"
+    SYSTEM_SLEEP = "SYSTEM_SLEEP"
+    SYSTEM_UP = "SYSTEM_UP"
+    START_HEART = "START_HEART" 
+    GET_HEART = "GET_HEART"
+    STOP_HEART = "STOP_HEART"
+    GET_WEAR = "GET_WEAR"
+    START_TEMP = "START_TEMP"
+    STOP_TEMP = "STOP_TEMP"
+    GET_TEMP = "GET_TEMP"
+    START_BLOOD_OXYGEN = "STARTT_BLOOD_OXYGEN" 
+    GET_BLOOD_OXYGEN = "GET_BLOOD_OXYGEN"
+    STOP_BLOOD_OXYGEN = "STOP_BLOOD_OXYGEN"
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led.py
new file mode 100644 (file)
index 0000000..a1b19e0
--- /dev/null
@@ -0,0 +1,587 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+
+from queue import Queue
+import _thread
+import usys
+
+led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+
+led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
+
+led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
+
+
+
+def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(num):
+        led_green.write(1)
+        utime.sleep_ms(freq)
+        led_green.write(0)
+        utime.sleep_ms(freq)
+
+def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(num):
+        led_red.write(1)
+        utime.sleep_ms(freq)
+        led_red.write(0)
+        utime.sleep_ms(freq)
+def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+    for i in range(10):
+        led_red.write(1)
+        utime.sleep_ms(500)
+        led_red.write(0)
+        utime.sleep_ms(500)
+
+def red_green_light(num,freq):#红绿灯交替闪烁 
+    for i in range(num):
+        led_red.write(1)
+        utime.sleep_ms(freq)
+        led_red.write(0)
+        utime.sleep_ms(freq)
+        led_green.write(1)
+        utime.sleep_ms(freq)
+        led_green.write(0)
+        utime.sleep_ms(freq)
+
+def open_led_red():
+    led_red.write(1)
+
+def close_led_red():
+    led_red.write(0)
+
+def open_led_white():
+    led_white.write(1)
+
+def close_led_white():
+    led_white.write(0)
+
+def open_led_green():
+    led_green.write(1)
+
+def close_led_green():
+    led_green.write(0)
+
+
+
+LED_TIMER_OUT = 100 
+class led_mode:
+    LONG_LIGHT_RED = 1
+    LONG_LIGHT_GREEN = 2
+    LONG_LIGHT_WHITE = 3
+    FLASH_LIGHT_RED = 4
+    FLASH_LIGHT_GREEN = 5
+    FLASH_LIGHT_WHITE = 6
+    FLASH_LIGHT_RED_GREEN = 7
+    FLASH_LIGHT_RED_WHITE = 8
+    FLASH_LIGHT_GREEN_WHITE = 9
+    LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
+
+    DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
+    OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
+    CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
+    INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
+    INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
+    INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
+
+    OTHER_MEASURE_MODE = 200
+
+    HEALTH_LED_MODE = 201 #健康测试模式
+    WECHAT_LED_MODE = 202 #微聊模式
+    CHARGE_IN_MODE = 203 #充电模式
+    CHARGE_OUT_MODE = 204 #充电已移出
+    CHARGE_FULL_MODE = 205 #充电已满
+    POWER_OFF_MODE = 206 #关机模式
+
+
+
+
+
+class ledEventManager(Abstract):#灯事件
+    def __init__(self):
+        self.timer = osTimer()
+        self.freq_time = 0#交替闪烁时间 最小100ms 
+        self.freq_num = 0#交替闪烁的次数
+        self.flash_light = 0
+        self.total_time = 0
+        self.long_count = 0
+        self.timer_state = 0
+        self.total_count = 0
+        self.freq = 0
+        self.led_state = 0
+        self.long_light_mode = 0
+        self.hr_state = 0
+        self.wechat_btn = 1
+        self.need_hr_btn = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.led_total_time = 0#闪的总时间
+        self.led_enable = 0
+        self.led_mode = 0
+        self.working_led_mode = None
+        self.ledInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.ledInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
+        pass
+    
+        
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
+        EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
+
+        EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
+
+        EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
+
+        EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
+
+        EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
+
+        EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
+
+        EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
+
+        EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
+
+        EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
+
+
+    def ledInfo_queue_thread(self):
+        while True:
+            data = self.ledInfo_queue.get()
+            #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_message_event_ledInfo(self,event,msg):
+        self.ledInfo_queue.put(msg)
+
+    def publish_led_event_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
+
+    def read_red_led_level(self, event, msg): #
+        red_level = led_red.read()
+        return red_level
+
+    def read_green_led_level(self, event, msg): #
+        green_level = led_green.read()
+        return green_level
+    
+    def read_white_led_level(self, event, msg): #
+        white_level = led_green.read()
+        return white_level
+
+    def set_hr_blood_led(self, event, msg): #
+        EventMesh.debug_log("set_hr_blood_led :{}".format(msg))
+        if msg != None:
+            if msg == 1:
+                EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[1000,200,300,led_mode.FLASH_LIGHT_RED_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.HEALTH_LED_MODE])#開始測量
+            elif msg == 2:
+                EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功
+                # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+            elif msg == 3:#测量失败
+                EventMesh.publish("stop_led_timer")
+                # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
+                pass
+                # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败
+                #加音频文件
+
+    def set_find_watch_led(self, event, msg): #查找设备
+        EventMesh.publish("OPEN_FIND_WATCH")#
+       
+        # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
+
+    def get_led_state(self, event, msg): #
+        return self.timer_state
+    def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
+        if msg != None:
+            if len(msg) != 0:
+                self.led_total_time = msg[2]#
+                # EventMesh.debug_log("open_timer:{}".format(msg))
+                if self.led_total_time != None:
+
+                    if self.led_total_time > 0:
+                        self.led_enable=msg[0]
+                        if self.led_enable != 0:
+                            self.led_mode = msg[1]
+                            self.long_light_mode = msg[3]
+                            self.led_open_time = msg[4]
+                            self.led_close_time = msg[5]
+                            self.working_led_mode = msg[6]
+                            self.long_count = 0
+
+                            if self.timer_state == 0:
+                                self.timer_state = 1
+                                self.timer.stop()
+                                # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
+                                self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
+                
+        
+
+
+    def set_led_time_arg(self, event, msg): #msg 
+        
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
+        if open_power != None:
+            if open_power == 0:
+                return
+        if power_off != None:
+            if power_off == 1:
+                return
+        usb_in = EventMesh.publish("get_usb")#
+        if msg != None:
+            if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯
+                # EventMesh.debug_log("usb_in",usb_in)
+                if usb_in != None:
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                        if self.timer_state == 1:
+                            self.timer_state = 0
+                            self.timer.stop()
+                        if usb_in == 1:
+                            if self.working_led_mode != led_mode.CHARGE_IN_MODE:
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                                self.open_timer(str_buf)
+                            self.working_led_mode = led_mode.CHARGE_IN_MODE
+
+                        elif usb_in == 3:
+                            if self.working_led_mode != led_mode.CHARGE_FULL_MODE:
+                                str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                                self.open_timer(str_buf)
+                            self.working_led_mode = led_mode.CHARGE_FULL_MODE
+                        
+                        return
+                    else:
+                        if msg[5] != led_mode.HEALTH_LED_MODE:
+                            self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        
+                        wechat_state = EventMesh.publish("get_wechat_state")
+                        temp_state = EventMesh.publish("get_temp_state")
+                        bp_state = EventMesh.publish("get_bp_state")
+                        bg_state = EventMesh.publish("get_bg_state")
+                        EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)
+                        if wechat_state != None: #获取微聊状态
+                            if wechat_state == 1:
+                                if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                    self.timer_state = 0
+                                    self.timer.stop()
+                                    str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]
+                                    self.open_timer(str_buf)
+                                    self.working_led_mode = led_mode.WECHAT_LED_MODE
+                                    return
+                                else:
+                                    return
+                            else:
+                                self.wechat_btn = 0
+                                # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高
+                                if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \
+                                or bp_state == 1  or bg_state == 1:
+                                    if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                        EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")
+                                        str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功
+                                        self.timer_state = 0
+                                        self.timer.stop()
+                                        self.open_timer(str_buf)
+                                        self.working_led_mode = led_mode.HEALTH_LED_MODE
+                                        return
+                                    else:
+                                        EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")
+                                        return
+                                else:# 0 2都认为其他模式灯亮 不是测试健康灯
+                                    self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+        self.open_timer(msg)
+
+
+   
+    # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
+    def led_fun_cb(self, data):#
+        if self.led_enable == 0 or self.led_total_time == 0:
+            return
+        call_state = EventMesh.publish("get_call_state")
+        if call_state == None:
+            call_state = 0
+        if call_state != 0:
+            battery = EventMesh.publish("screen_get_battery")
+            if battery != None:
+                if battery[0] != "1":#在充电得时候
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_temp_state = EventMesh.publish("get_temp_state")
+                    get_bp_state = EventMesh.publish("get_bp_state")
+                    get_bg_state = EventMesh.publish("get_bg_state")
+                    if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
+                        if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
+                                EventMesh.publish("close_hr_sop2")
+                                EventMesh.publish("close_led_pin")
+                                return
+        # EventMesh.debug_log("self.long_count",self.long_count)
+        if self.led_total_time != 0:
+            #红灯闪烁
+            if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
+                if self.led_mode == 1:
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_green()
+                            close_led_white()
+                            open_led_red()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                elif self.led_mode == 2:
+                    # EventMesh.debug_log("led red!!!!!!!")
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_green()
+                        close_led_white()
+                        open_led_red()
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
+                if self.led_mode == 1:#长亮时间限制
+                    
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_red()
+                            close_led_white()
+                            open_led_green()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                        
+
+                elif self.led_mode == 2:
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_red()
+                        close_led_white()
+                        open_led_green()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                        pass
+                    
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #蓝灯闪烁 暂时是白色灯
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
+                if self.led_mode == 1:#长亮时间限制
+                    if self.led_total_time > 0:
+                        self.led_total_time-=1
+                        if self.led_total_time > 0:
+                            close_led_red()
+                            close_led_green()
+                            open_led_white()
+                        else:
+                            EventMesh.publish("stop_led_timer")#关闭所有的灯
+                elif self.led_mode == 2:
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_red()
+                        close_led_green()
+                        open_led_white()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_white()
+                        close_led_red()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+            #红绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
+                
+                
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    pass
+                else: 
+                    close_led_white()
+                    close_led_red()
+                    open_led_green()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #红蓝灯闪烁 蓝变成白色灯
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    pass
+                else:
+                    close_led_green()
+                    close_led_red()
+                    open_led_white()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #蓝绿灯闪烁
+            elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
+
+                
+                if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                    close_led_white()#白色灯
+                    close_led_red()
+                    open_led_green()
+                    pass
+                else:
+                    close_led_green()
+                    close_led_red()
+                    open_led_white()
+                    pass
+                if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    return
+                self.long_count+=1
+            #红灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
+                close_led_white()#白色灯
+                close_led_green()
+                open_led_red()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+
+            #绿灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
+                close_led_white()#白色灯
+                close_led_red()
+                open_led_green()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+            #蓝灯长亮
+            elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
+                close_led_green()#白色灯
+                close_led_red()
+                open_led_white()
+                self.timer.stop()
+                self.timer_state = 0
+                self.led_total_time = 0
+                self.led_enable = 0
+                self.led_mode = 0
+                self.long_light_mode = 0
+                self.led_open_time = 0
+                self.led_close_time = 0
+                self.working_led_mode = 0
+                self.long_count = 0
+    
+    def close_led_pin(self, event, msg):
+        EventMesh.debug_log("close_led_pin!!!")
+
+        self.timer.stop()
+        self.timer_state = 0
+        self.led_total_time = 0
+        self.led_enable = 0
+        self.led_mode = 0
+        self.long_light_mode = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.working_led_mode = 0
+        self.long_count = 0
+        close_led_red()
+        close_led_green()
+        close_led_white()
+
+    def stop_led_timer(self, event, msg):
+        EventMesh.publish("close_all_led")#关闭所有的灯
+    
+    def close_all_led(self, event, msg):
+        self.close_all_led_do(0)
+    def close_all_led_do(self,data):   
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        if open_power != None:
+            if open_power == 0:
+                return
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        if open_power_off != None:
+            if open_power_off == 1:
+                return
+        usb_in = EventMesh.publish("get_usb")#
+        open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+        if open_power_off != None:
+            if open_power_off != 1:
+                if usb_in != None:
+                    if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                        if self.timer_state == 1:
+                            self.timer_state = 0
+                            self.timer.stop()
+                        return
+                    else:
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        
+                        wechat_state = EventMesh.publish("get_wechat_state")
+                        temp_state = EventMesh.publish("get_temp_state")
+                        bp_state = EventMesh.publish("get_bp_state")
+                        bg_state = EventMesh.publish("get_bg_state")
+                        # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)
+                        if wechat_state != None: #获取微聊状态
+                            if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
+                                or bg_state == 1 :
+                                return
+        if self.timer_state == 1:
+            self.timer.stop()
+        self.timer_state = 0
+        self.led_total_time = 0
+        self.led_enable = 0
+        self.led_mode = 0
+        self.long_light_mode = 0
+        self.led_open_time = 0
+        self.led_close_time = 0
+        self.working_led_mode = 0
+        self.long_count = 0
+        close_led_red()
+        close_led_green()
+        close_led_white()
+        # EventMesh.debug_log("close led!!!")
+
+    def led_test_fun_cb(self, data):
+        return
+   
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led_d15.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/led_d15.py
new file mode 100644 (file)
index 0000000..4680da9
--- /dev/null
@@ -0,0 +1,590 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+from queue import Queue
+import _thread
+import usys
+if EventMesh.model == "D15":
+
+    led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+
+    led_green = Pin(Pin.GPIO44, Pin.OUT, Pin.PULL_PD, 0)
+
+    led_white = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 0)
+
+
+
+    def green_light_fast(num,freq):#快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(num):
+            led_green.write(1)
+            utime.sleep_ms(freq)
+            led_green.write(0)
+            utime.sleep_ms(freq)
+
+    def red_light_fast(num,freq):#快闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(num):
+            led_red.write(1)
+            utime.sleep_ms(freq)
+            led_red.write(0)
+            utime.sleep_ms(freq)
+    def red_light_slow(num,freq):#慢闪 #快闪 num 循环闪烁次数 freq 交替闪烁的频率ms单位 
+        for i in range(10):
+            led_red.write(1)
+            utime.sleep_ms(500)
+            led_red.write(0)
+            utime.sleep_ms(500)
+
+    def red_green_light(num,freq):#红绿灯交替闪烁 
+        for i in range(num):
+            led_red.write(1)
+            utime.sleep_ms(freq)
+            led_red.write(0)
+            utime.sleep_ms(freq)
+            led_green.write(1)
+            utime.sleep_ms(freq)
+            led_green.write(0)
+            utime.sleep_ms(freq)
+
+    def open_led_red():
+        led_red.write(1)
+
+    def close_led_red():
+        led_red.write(0)
+
+    def open_led_white():
+        led_white.write(1)
+
+    def close_led_white():
+        led_white.write(0)
+
+    def open_led_green():
+        led_green.write(1)
+
+    def close_led_green():
+        led_green.write(0)
+
+
+
+    LED_TIMER_OUT = 100 
+    class led_mode:
+        LONG_LIGHT_RED = 1
+        LONG_LIGHT_GREEN = 2
+        LONG_LIGHT_WHITE = 3
+        FLASH_LIGHT_RED = 4
+        FLASH_LIGHT_GREEN = 5
+        FLASH_LIGHT_WHITE = 6
+        FLASH_LIGHT_RED_GREEN = 7
+        FLASH_LIGHT_RED_WHITE = 8
+        FLASH_LIGHT_GREEN_WHITE = 9
+        LIGHT_NONE = FLASH_LIGHT_GREEN_WHITE+1
+
+        DEFAULT_LONG_LIGHT_MODE = 0+LIGHT_NONE #默认是关闭
+        OPEN_LONG_LIGHT_MODE = 1+LIGHT_NONE#开启
+        CLOSE_LONG_LIGHT_MODE = 2+LIGHT_NONE#需要关闭
+        INTERVAL_LIGHT_RED  = 3+LIGHT_NONE
+        INTERVAL_LIGHT_GREEN  = 4+LIGHT_NONE
+        INTERVAL_LIGHT_WHITE  = 5+LIGHT_NONE
+
+        OTHER_MEASURE_MODE = 200
+
+        HEALTH_LED_MODE = 201 #健康测试模式
+        WECHAT_LED_MODE = 202 #微聊模式
+        CHARGE_IN_MODE = 203 #充电模式
+        CHARGE_OUT_MODE = 204 #充电已移出
+        CHARGE_FULL_MODE = 205 #充电已满
+        POWER_OFF_MODE = 206 #关机模式
+
+        VIDEO_MEASURE_MODE = 207 #视频通话
+
+
+
+
+
+    class ledEventManager(Abstract):#灯事件
+        def __init__(self):
+            self.timer = osTimer()
+            self.freq_time = 0#交替闪烁时间 最小100ms 
+            self.freq_num = 0#交替闪烁的次数
+            self.flash_light = 0
+            self.total_time = 0
+            self.long_count = 0
+            self.timer_state = 0
+            self.total_count = 0
+            self.freq = 0
+            self.led_state = 0
+            self.long_light_mode = 0
+            self.hr_state = 0
+            self.wechat_btn = 1
+            self.need_hr_btn = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.led_total_time = 0#闪的总时间
+            self.led_enable = 0
+            self.led_mode = 0
+            self.working_led_mode = None
+            self.ledInfo_queue = Queue()
+            _thread.stack_size(10*1024)
+            _thread.start_new_thread(self.ledInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_ledInfo",self.publish_message_event_ledInfo)
+            pass
+        
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_led_time_arg", self.set_led_time_arg)#设置参数
+            EventMesh.subscribe("get_led_state", self.get_led_state)#设置参数
+
+            EventMesh.subscribe("set_hr_blood_led", self.set_hr_blood_led)#设置参数
+
+            EventMesh.subscribe("set_find_watch_led", self.set_find_watch_led)#设置参数
+
+            EventMesh.subscribe("close_all_led", self.close_all_led)#设置参数
+
+            EventMesh.subscribe("stop_led_timer", self.stop_led_timer)#设置参数
+
+            EventMesh.subscribe("read_red_led_level", self.read_red_led_level)#读取红灯的电平状态
+
+            EventMesh.subscribe("read_green_led_level", self.read_green_led_level)#读取绿灯的电平状态
+
+            EventMesh.subscribe("read_white_led_level", self.read_white_led_level)#读取白灯的电平状态
+
+            EventMesh.subscribe("close_led_pin", self.close_led_pin)#读取白灯的电平状态def close_led_pin(self, event, msg):
+
+
+        def ledInfo_queue_thread(self):
+            while True:
+                data = self.ledInfo_queue.get()
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_ledInfo(self,event,msg):
+            self.ledInfo_queue.put(msg)
+
+        def publish_led_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_ledInfo",{"func":self.led_fun_cb,"data":0})  
+
+        def read_red_led_level(self, event, msg): #
+            red_level = led_red.read()
+            return red_level
+
+        def read_green_led_level(self, event, msg): #
+            green_level = led_green.read()
+            return green_level
+        
+        def read_white_led_level(self, event, msg): #
+            white_level = led_green.read()
+            return white_level
+
+        def set_hr_blood_led(self, event, msg): #
+            EventMesh.debug_log("set_hr_blood_led :{}".format(msg))
+            if msg != None:
+                if msg == 1:
+                    EventMesh.publish("set_led_time_arg",[1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,200,300,led_mode.FLASH_LIGHT_RED_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.HEALTH_LED_MODE])#開始測量
+                elif msg == 2:
+                    EventMesh.publish("set_led_time_arg",[1,2,60,led_mode.FLASH_LIGHT_GREEN,60,30,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[3000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#測量成功
+                elif msg == 3:#测量失败
+                    EventMesh.publish("stop_led_timer")
+                    # EventMesh.publish("set_led_time_arg",[1,1,1,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    pass
+                    # EventMesh.publish("set_led_time_arg",[1,1,30,led_mode.FLASH_LIGHT_RED,31,10*3,led_mode.OTHER_MEASURE_MODE])#测量失败
+                    #加音频文件
+
+        def set_find_watch_led(self, event, msg): #查找设备
+            EventMesh.publish("OPEN_FIND_WATCH")#
+        
+            # EventMesh.publish("set_led_time_arg",[37000,1000,1,led_mode.LONG_LIGHT_GREEN,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#查找设备绿灯长亮37s
+
+        def get_led_state(self, event, msg): #
+            return self.timer_state
+        def open_timer(self,msg): #msg 0 使能 1总的时间 2 灯模式 3 开启时间 4 关闭时间 
+            if msg != None:
+                if len(msg) != 0:
+                    self.led_total_time = msg[2]#
+                    # EventMesh.debug_log("open_timer:{}".format(msg))
+                    if self.led_total_time != None:
+
+                        if self.led_total_time > 0:
+                            self.led_enable=msg[0]
+                            if self.led_enable != 0:
+                                self.led_mode = msg[1]
+                                self.long_light_mode = msg[3]
+                                self.led_open_time = msg[4]
+                                self.led_close_time = msg[5]
+                                self.working_led_mode = msg[6]
+                                self.long_count = 0
+
+                                if self.timer_state == 0:
+                                    self.timer_state = 1
+                                    self.timer.stop()
+                                    # self.timer.start(LED_TIMER_OUT,1,self.led_fun_cb)
+                                    self.timer.start(LED_TIMER_OUT,1,self.publish_led_event_cb)
+                    
+            
+
+
+        def set_led_time_arg(self, event, msg): #msg 
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            # EventMesh.debug_log("set_led_time_arg",msg,open_power,power_off)
+            if open_power != None:
+                if open_power == 0:
+                    return
+            if power_off != None:
+                if power_off == 1:
+                    return
+            usb_in = EventMesh.publish("get_usb")#
+
+            if msg != None:
+                if msg[6] != led_mode.POWER_OFF_MODE:#插入usb关机以防不亮红绿灯
+                    # EventMesh.debug_log("usb_in",usb_in)
+                    if usb_in != None:
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                            if self.timer_state == 1:
+                                self.timer_state = 0
+                                self.timer.stop()
+                            if usb_in == 1:
+                                if self.working_led_mode != led_mode.CHARGE_IN_MODE:
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_RED,4,2,led_mode.CHARGE_IN_MODE]
+                                    self.open_timer(str_buf)
+                                self.working_led_mode = led_mode.CHARGE_IN_MODE
+
+                            elif usb_in == 3:
+                                if self.working_led_mode != led_mode.CHARGE_FULL_MODE:
+                                    str_buf = [1,1,10,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.CHARGE_FULL_MODE]
+                                    self.open_timer(str_buf)
+                                self.working_led_mode = led_mode.CHARGE_FULL_MODE
+                            
+                            return
+                        else:
+                            if msg[5] != led_mode.HEALTH_LED_MODE:
+                                self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            
+                            wechat_state = EventMesh.publish("get_wechat_state")
+                            temp_state = EventMesh.publish("get_temp_state")
+                            bp_state = EventMesh.publish("get_bp_state")
+                            bg_state = EventMesh.publish("get_bg_state")
+                            EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,temp_state,wechat_state,self.working_led_mode)
+                            if wechat_state != None: #获取微聊状态
+                                if wechat_state == 1:
+                                    if self.working_led_mode != led_mode.WECHAT_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                        self.timer_state = 0
+                                        self.timer.stop()
+                                        str_buf = [1,1,1,led_mode.LONG_LIGHT_GREEN,4,2,led_mode.WECHAT_LED_MODE]
+                                        self.open_timer(str_buf)
+                                        self.working_led_mode = led_mode.WECHAT_LED_MODE
+                                        return
+                                    else:
+                                        return
+                                else:
+                                    self.wechat_btn = 0
+                                    # if get_hr_state != 0 or get_spo2_state != 0 or temp_state != 0 or bp_state != 0 or bg_state != 0 :#心率血氧优先级高
+                                    if get_hr_state == 1 or get_spo2_state == 1 or temp_state == 1 \
+                                    or bp_state == 1  or bg_state == 1:
+                                        if self.working_led_mode != led_mode.HEALTH_LED_MODE:#如果不在亮微聊模式需要亮微聊模式
+                                            EventMesh.debug_log("set_hr_blood_led!!!!!!!!!!")
+                                            str_buf = [1,2,10*70*2,led_mode.FLASH_LIGHT_RED_GREEN,10,5,led_mode.HEALTH_LED_MODE]#測量成功
+                                            self.timer_state = 0
+                                            self.timer.stop()
+                                            self.open_timer(str_buf)
+                                            self.working_led_mode = led_mode.HEALTH_LED_MODE
+                                            return
+                                        else:
+                                            EventMesh.debug_log("set_hr_blood_led stop!!!!!!!!!!")
+                                            return
+                                    else:# 0 2都认为其他模式灯亮 不是测试健康灯
+                                        self.working_led_mode = led_mode.OTHER_MEASURE_MODE
+
+            if EventMesh.publish("get_video_state") != 0:
+                if msg[6] != led_mode.VIDEO_MEASURE_MODE:
+                    return
+            self.open_timer(msg)
+
+
+    
+        # EventMesh.publish("set_led_time_arg",[1,2,2*300,led_mode.FLASH_LIGHT_RED_GREEN,2,1,led_mode.HEALTH_LED_MODE])#測量成功
+        def led_fun_cb(self, data):#
+            if self.led_enable == 0 or self.led_total_time == 0:
+                return
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+            if call_state != 0:
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":#在充电得时候
+                        get_hr_state = EventMesh.publish("get_hr_state")
+                        get_spo2_state = EventMesh.publish("get_spo2_state")
+                        get_temp_state = EventMesh.publish("get_temp_state")
+                        get_bp_state = EventMesh.publish("get_bp_state")
+                        get_bg_state = EventMesh.publish("get_bg_state")
+                        if get_hr_state != None and  get_spo2_state != None and get_temp_state != None and get_bp_state != None and get_bg_state != None:
+                            if get_hr_state == 1 or get_spo2_state == 1 or get_temp_state == 1 or get_bp_state == 1 or get_bg_state == 1:
+                                    EventMesh.publish("close_hr_sop2")
+                                    EventMesh.publish("close_led_pin")
+                                    return
+            # EventMesh.debug_log("self.long_count",self.long_count)
+            if self.led_total_time != 0:
+                #红灯闪烁
+                if self.long_light_mode == led_mode.FLASH_LIGHT_RED :#
+                    if self.led_mode == 1:
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_green()
+                                close_led_white()
+                                open_led_red()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                    elif self.led_mode == 2:
+                        # EventMesh.debug_log("led red!!!!!!!")
+                        
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_green()
+                            close_led_white()
+                            open_led_red()
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN:#
+                    if self.led_mode == 1:#长亮时间限制
+                        
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_red()
+                                close_led_white()
+                                open_led_green()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                            
+
+                    elif self.led_mode == 2:
+                        
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_red()
+                            close_led_white()
+                            open_led_green()
+                            pass
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                            pass
+                        
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #蓝灯闪烁 暂时是白色灯
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_WHITE:#
+                    if self.led_mode == 1:#长亮时间限制
+                        if self.led_total_time > 0:
+                            self.led_total_time-=1
+                            if self.led_total_time > 0:
+                                close_led_red()
+                                close_led_green()
+                                open_led_white()
+                            else:
+                                EventMesh.publish("stop_led_timer")#关闭所有的灯
+                    elif self.led_mode == 2:
+                        if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                            close_led_red()
+                            close_led_green()
+                            open_led_white()
+                            pass
+                        else:
+                            close_led_green()
+                            close_led_white()
+                            close_led_red()
+                            pass
+                        if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            return
+                        self.long_count+=1
+                #红绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_GREEN:#
+                    
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_green()
+                        open_led_red()
+                        pass
+                    else: 
+                        close_led_white()
+                        close_led_red()
+                        open_led_green()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #红蓝灯闪烁 蓝变成白色灯
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_RED_WHITE:#
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_green()
+                        open_led_red()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_red()
+                        open_led_white()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #蓝绿灯闪烁
+                elif self.long_light_mode == led_mode.FLASH_LIGHT_GREEN_WHITE:#
+
+                    
+                    if self.long_count % (self.led_open_time) <=  self.led_close_time: # 4*cnt cnt 多少次 4 开启时间保护关闭时间 2 关闭时间 100ms 4-2关闭时间为200ms 开启时间也为200ms 
+                        close_led_white()#白色灯
+                        close_led_red()
+                        open_led_green()
+                        pass
+                    else:
+                        close_led_green()
+                        close_led_red()
+                        open_led_white()
+                        pass
+                    if self.long_count >= self.led_total_time-1:#大于总的时间 4
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        return
+                    self.long_count+=1
+                #红灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_RED:#
+                    close_led_white()#白色灯
+                    close_led_green()
+                    open_led_red()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+
+                #绿灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_GREEN:#
+                    close_led_white()#白色灯
+                    close_led_red()
+                    open_led_green()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+                #蓝灯长亮
+                elif self.long_light_mode == led_mode.LONG_LIGHT_WHITE:#
+                    close_led_green()#白色灯
+                    close_led_red()
+                    open_led_white()
+                    self.timer.stop()
+                    self.timer_state = 0
+                    self.led_total_time = 0
+                    self.led_enable = 0
+                    self.led_mode = 0
+                    self.long_light_mode = 0
+                    self.led_open_time = 0
+                    self.led_close_time = 0
+                    self.working_led_mode = 0
+                    self.long_count = 0
+        
+        def close_led_pin(self, event, msg):
+            EventMesh.debug_log("close_led_pin!!!")
+
+            self.timer.stop()
+            self.timer_state = 0
+            self.led_total_time = 0
+            self.led_enable = 0
+            self.led_mode = 0
+            self.long_light_mode = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.working_led_mode = 0
+            self.long_count = 0
+            close_led_red()
+            close_led_green()
+            close_led_white()
+
+        def stop_led_timer(self, event, msg):
+            EventMesh.publish("close_all_led")#关闭所有的灯
+        
+        def close_all_led(self, event, msg):
+            self.close_all_led_do(0)
+        def close_all_led_do(self,data):   
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 0:
+                    return
+            usb_in = EventMesh.publish("get_usb")#
+            open_power_off = EventMesh.publish("get_power_off_state")#获取开机标识
+            if open_power_off != None:
+                if open_power_off != 1:
+                    if usb_in != None:
+                        if usb_in == 1 or usb_in == 3:#正在充电或者充电已满都不要被打断
+                            if self.timer_state == 1:
+                                self.timer_state = 0
+                                self.timer.stop()
+                            return
+                        else:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            
+                            wechat_state = EventMesh.publish("get_wechat_state")
+                            temp_state = EventMesh.publish("get_temp_state")
+                            bp_state = EventMesh.publish("get_bp_state")
+                            bg_state = EventMesh.publish("get_bg_state")
+                            # EventMesh.debug_log("get_hr_state",get_hr_state,get_spo2_state,wechat_state,self.working_led_mode)
+                            if wechat_state != None: #获取微聊状态
+                                if wechat_state == 1 or get_spo2_state == 1  or get_hr_state == 1  or temp_state == 1 or bp_state == 1 \
+                                    or bg_state == 1 :
+                                    return
+            if self.timer_state == 1:
+                self.timer.stop()
+            self.timer_state = 0
+            self.led_total_time = 0
+            self.led_enable = 0
+            self.led_mode = 0
+            self.long_light_mode = 0
+            self.led_open_time = 0
+            self.led_close_time = 0
+            self.working_led_mode = 0
+            self.long_count = 0
+            close_led_red()
+            close_led_green()
+            close_led_white()
+            # EventMesh.debug_log("close led!!!")
+
+        def led_test_fun_cb(self, data):
+            return
+    
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_1.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_1.py
new file mode 100644 (file)
index 0000000..c14a3dc
--- /dev/null
@@ -0,0 +1,239 @@
+import sms
+
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+
+if __name__ == '__main__':
+    import uos
+    import ql_fs
+    import utime
+    if ql_fs.path_exists("/ext") == False:
+        ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+        uos.mount(ldev,'/ext')
+    res = uos.statvfs("/ext")
+    res = list(res)
+    print('总ext空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
+    print("init1:{}".format(utime.localtime()))
+    import EventMesh
+    from common import Abstract
+    print("init2:{}".format(utime.localtime()))
+    from lcd import tp_cst816
+    print("init3:{}".format(utime.localtime()))
+
+    from usr.ui_main_menu import MainMenuScreen
+    # from ui_WatchFaceScreen import WatchFaceScreen
+    
+    from appFactoryMode import  FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeAlipayInitScreen
+    import ui as _ui
+    # import ui as _ui
+    print("init4:{}".format(utime.localtime()))
+    ui = _ui.UI()
+    ui.post_processor_after_instantiation()
+    ui.add_screen(MainMenuScreen()) 
+    EventMesh.publish("load_screen", {"screen": "main_menu"})
+    print("init5:{}".format(utime.localtime()))
+    
+    ui.add_screen(_ui.PopupScreen()) 
+    ui.add_screen(_ui.PhoneScreen()) 
+    ui.add_screen(_ui.HeartrateScreen()) 
+    import ui_setting as _ui_setting
+    ui.add_screen(_ui_setting.SettingScreen()) 
+    ui.add_screen(_ui.ToolboxScreen()) 
+    ui.add_screen(_ui.StepScreen()) 
+    ui.add_screen(_ui.CountdownScreen()) 
+    ui.add_screen(_ui.StopwatchScreen()) 
+    ui.add_screen(_ui.WeatherScreen()) 
+    ui.add_screen(_ui.Spo2Screen()) 
+    ui.add_screen(_ui.TemperatureScreen()) 
+    ui.add_screen(_ui.ContactsScreen()) 
+    from appWechat import WechatScreen,TK_ProtoCol,MESSAGE_ProtoCol,NewWechatPopupScreen
+    ui.add_screen(WechatScreen()) 
+    from alarm import ClkListScreen,NewEditClk,CLKTimeScreen,ClkPeriod,PopupAlarmScreen
+  
+    ui.add_screen(ClkListScreen()) 
+    ui.add_screen(_ui.CountdownEndScreen()) 
+    ui.add_screen(NewEditClk()) 
+    ui.add_screen(CLKTimeScreen()) 
+    ui.add_screen(ClkPeriod()) 
+  
+    # ui.add_screen(_ui_setting.LanguageScreen()) 
+    ui.add_screen(_ui_setting.DialswitchScreen()) 
+    # ui.add_screen(_ui.ThemeswitchScreen()) 
+    ui.add_screen(_ui_setting.ImeiScreen()) 
+    ui.add_screen(_ui_setting.AppScreen()) 
+    ui.add_screen(_ui_setting.BrightnessScreen()) 
+    ui.add_screen(_ui_setting.VolumeScreen()) 
+    ui.add_screen(_ui_setting.RestoreScreen()) 
+    ui.add_screen(_ui_setting.PoweroffScreen()) 
+    ui.add_screen(_ui_setting.VersionScreen()) 
+    ui.add_screen(_ui_setting.UpdateScreen()) 
+    ui.add_screen(_ui_setting.AlarmvolumeScreen()) 
+    ui.add_screen(_ui_setting.MsgvolumeScreen()) 
+    ui.add_screen(_ui_setting.PhoneringScreen()) 
+    ui.add_screen(_ui_setting.totalvolumeScreen()) 
+    ui.add_screen(_ui_setting.PoweroffConfirmScreen()) 
+    ui.add_screen(_ui.DialingScreen()) 
+    ui.add_screen(_ui.CallLogScreen()) 
+    from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\
+    Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent
+    ui.add_screen(AlipayOpenScreen()) 
+    ui.add_screen(Alipay_1_1())
+    ui.add_screen(Alipay_invite())  
+    ui.add_screen(Alipay_inviting()) 
+    ui.add_screen(Alipay_success()) 
+    ui.add_screen(Alipay_paycode()) 
+    ui.add_screen(Alipay_pay_success()) 
+    ui.add_screen(Alipay_collect()) 
+    ui.add_screen(Alipay_parent()) 
+    ui.add_screen(_ui.UIFINDScreen())
+    ui.add_screen(_ui.MsgDetailScreen())
+    ui.add_screen(_ui.IncomingCallScreen())
+    ui.add_screen(_ui.OnCallScreen())
+    ui.add_screen(_ui.MessageFullScreen())
+    # ui.add_screen(_ui.PowerOnScreen())
+    ui.add_screen(FactoryModeLocationScreen())
+    ui.add_screen(FactoryModeScreen())
+    ui.add_screen(FactoryModeAlipayInitScreen())
+    ui.add_screen(PopupAlarmScreen())
+    ui.add_screen(_ui.LowPowerScreen())
+    ui.add_screen(_ui.NewMessageScreen())
+    ui.add_screen(NewWechatPopupScreen())
+    ui.add_screen(HealthScreen())
+    # ui.add_screen(_ui.Setting3Screen())  
+    print("init6:{}".format(utime.localtime()))
+    
+
+    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,\
+            ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager
+    import mgr as mgr
+    print("init7:{}".format(utime.localtime()))
+    
+    from mgr import ConfigStoreManager,getBootOffManager,getSosFlagManager,CountdownManager, LocationManager, getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, getplayAudiodStateManager,\
+    AddrBookManager,MsgdetailManager,PhoneCallingManager,getOldTimeManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getTempTimeManager,getLowBatManager
+    print("init8:{}".format(utime.localtime()))
+    
+    
+    #from ui_WatchFaceScreen import WatchFaceScreen 
+    
+    
+    # from usr.test_sms import HRSTART_ProtoCol,getHrTimeManager,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,getBrightnessManager,\
+    # getStorageDataManager
+    print("init9:{}".format(utime.localtime()))
+   #from usr.ui_wechat import WechatScreen,TK_ProtoCol
+
+    print("init10:{}".format(utime.localtime()))
+    
+
+    app = watchApp()
+    app.set_ui(ui)
+    app.append_manager(mgr.AlarmVolumeLevelManager()) \
+        .append_manager(mgr.MsgVolumeLevelManager()) \
+        .append_manager(mgr.PhoneVolumeLevelManager()) \
+        .append_manager(mgr.DeviceInfoManager()) \
+        .append_manager(mgr.BatteryManager()) \
+           
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+   
+    app.append_manager(ConfigStoreManager())
+    app.append_manager(NetManager())
+    app.append_manager(LocationManager())
+    app.append_manager(AddrBookManager())
+    app.append_manager(mgr.MsgManager())
+    app.append_manager(MsgdetailManager())
+    app.append_manager(mgr.CallLogManager())
+    app.append_manager(mgr.getWeatherDataManager())
+    app.append_manager(PhoneCallingManager())
+    app.append_manager(ClockManager())
+    app.append_manager(gethistoryDataManager())
+    app.append_manager(getHrTimeManager())
+    app.append_manager(getBrightnessManager())
+    app.append_manager(getStorageDataManager())
+    app.append_manager(getUpLoadDataManager())
+    app.append_manager(getVolumSizeManager())
+    app.append_manager(getTempTimeManager())
+    app.append_manager(getplayAudiodStateManager())
+    app.append_manager(getLowBatManager())
+    app.append_manager(getBootOffManager())
+    app.append_manager(getOldTimeManager())
+    app.append_manager(getSosFlagManager())
+    app.append_manager(CountdownManager())
+
+    print("init21:{}".format(utime.localtime()))    
+    
+    print("init11:{}".format(utime.localtime()))    
+    pcr = ProtoColResolver()
+    pcr.add_support(LK_ProtoCol())
+    pcr.add_support(PING_ProtoCol())
+    pcr.add_support(KA_ProtoCol())
+    pcr.add_support(UD_ProtoCol())
+    pcr.add_support(CR_ProtoCol())
+    pcr.add_support(FIND_ProtoCol())
+    pcr.add_support(POWEROFF_ProtoCol())
+    pcr.add_support(PHL_ProtoCol())
+    pcr.add_support(TK_ProtoCol())
+    pcr.add_support(MESSAGE_ProtoCol())
+    pcr.add_support(WT_ProtoCol())
+    pcr.add_support(REMIND_ProtoCol())
+    pcr.add_support(HRSTART_ProtoCol())
+    pcr.add_support(HEART_ProtoCol())
+    pcr.add_support(OXYGEN_ProtoCol())
+    pcr.add_support(OXYGEN_One_ProtoCol())
+    pcr.add_support(TEMP_ProtoCol())
+    pcr.add_support(DLT_ProtoCol())
+    pcr.add_support(UPLOAD_ProtoCol())
+    pcr.add_support(MONITOR_ProtoCol())
+    # pcr.add_support(CENTER_ProtoCol())
+    pcr.add_support(CENTER_ProtoCol())
+    pcr.add_support(bootoff_ProtoCol())
+    pcr.add_support(WDSTART_ProtoCol())
+    pcr.add_support(LOWBAT_ProtoCol())
+    pcr.add_support(sosHome_dial_ProtoCol())
+
+    sm = SockManager()
+    sm.add_support_resolver(pcr)
+    app.append_manager(sm)
+    print("init11.0:{}".format(utime.localtime()))   
+    app.start()
+    sms_data = sms.getSaveLoc()
+    sms_lacv = sms_data[0][0]
+    if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
+        sms.setSaveLoc('SM', 'SM', 'SM')
+    print("init12:{}".format(utime.localtime()))
+    import atcmd
+    resp=bytearray(50)
+    atcmd.sendSync('AT+log=52,1\r\n',resp,'',20)
+    print("AT+log=52,1:{}".format(resp))
+
+
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/main_init.py
new file mode 100644 (file)
index 0000000..e7d5c4b
--- /dev/null
@@ -0,0 +1,273 @@
+import sms
+import atcmd
+import net
+import machine
+import EventMesh
+import usys
+
+    
+resp=bytearray(50)
+# atcmd.sendSync('AT+log=52,1\r\n',resp,'',200)
+# EventMesh.debug_log("AT+log=52,1:{}".format(resp))
+from common import Abstract
+class App(object):
+    def __init__(self):
+        self.managers = []
+
+    def append_manager(self, manager):
+        if isinstance(manager, Abstract):
+            manager.post_processor_after_instantiation()
+            self.managers.append(manager)
+        return self
+
+    def start(self):
+        for manager in self.managers:
+            manager.post_processor_before_initialization()
+            manager.initialization()
+            manager.post_processor_after_initialization()
+
+
+class watchApp(App):
+    def __init__(self):
+        super(watchApp, self).__init__()
+        self.__ui = None
+
+    def set_ui(self, ui):
+        self.__ui = ui
+
+    def start(self):
+        if self.__ui is not None:
+            self.__ui.start()
+        super().start()
+
+
+
+def main_init():
+# if __name__ == '__main__':
+    import uos
+    import ql_fs
+    import utime
+    import EventMesh
+    # if ql_fs.path_exists("/ext") == False:
+    #     ldev = uos.VfsLfs1(32, 32, 32, "ext_fs",0,3)
+    #     uos.mount(ldev,'/ext')
+    res = uos.statvfs("/usr")
+    res = list(res)
+    EventMesh.debug_log('总usr空间:{} MB,剩余空间:{} MB'.format((((res[0] * res[2]) / 1024 / 1024)),((res[0] * res[3]) / 1024 / 1024)))
+    EventMesh.debug_log("init1:{}".format(utime.localtime()))
+    
+    
+    EventMesh.debug_log("init2:{}".format(utime.localtime()))
+    EventMesh.debug_log("init3:{}".format(utime.localtime()))
+
+    
+    import ui as _ui
+
+    
+    # import ui as _ui
+    EventMesh.debug_log("init4:{}".format(utime.localtime()))
+    ui = _ui.UI()
+    ui.post_processor_after_instantiation()
+
+
+    
+
+    app = watchApp()
+    app.set_ui(ui)
+    # if EventMesh.model == "D15":
+    #     from motor import motorEventManager
+    #     app.append_manager(motorEventManager())
+
+    # app.append_manager(mgr.getStorageDataManager())
+    # app.append_manager(mgr.AlarmVolumeLevelManager()) \
+    #     .append_manager(mgr.MsgVolumeLevelManager()) \
+    #     .append_manager(mgr.PhoneVolumeLevelManager()) \
+    #     .append_manager(mgr.DeviceInfoManager()) \
+    #     .append_manager(mgr.BatteryManager()) \
+    #     .append_manager(intervManager())\
+    #     .append_manager(ledEventManager())\
+        # .append_manager(playImeiManager())\
+        # .append_manager(playCurStepManager())\
+        # .append_manager(usbStateManager())\
+        # .append_manager(hrandBloodOxgenManager())\
+        # .append_manager(simManager())\
+        # .append_manager(PoweronManager())\
+        # .append_manager(sosManager())\
+        # .append_manager(playCurTimeManager())
+        # .append_manager(mgr.StopwatchManager()) \
+        # .append_manager(mgr.CountdownManager()) \
+
+    
+    # app.append_manager(mgr.ConfigStoreManager())
+    # app.append_manager(protocol.NetManager())
+    # app.append_manager(mgr.LocationManager())
+    # app.append_manager(mgr.AddrBookManager())
+    # app.append_manager(mgr.MsgManager())
+    # app.append_manager(mgr.MsgdetailManager())
+    # app.append_manager(mgr.CallLogManager())
+    # app.append_manager(mgr.getWeatherDataManager())
+    # app.append_manager(mgr.PhoneCallingManager())
+    # app.append_manager(mgr.ClockManager())
+    # app.append_manager(mgr.sendDevinfoManager())
+   
+    # app.append_manager(mgr.gethistoryDataManager())
+    # app.append_manager(mgr.getHrTimeManager())
+    # app.append_manager(mgr.getBrightnessManager())
+    
+    # app.append_manager(mgr.getUpLoadDataManager())
+    # app.append_manager(mgr.getVolumSizeManager())
+    # app.append_manager(mgr.getTempTimeManager())
+    # app.append_manager(mgr.getplayAudiodStateManager())
+    # app.append_manager(mgr.getLowBatManager())
+    # app.append_manager(mgr.getBootOffManager())
+    # app.append_manager(mgr.getOldTimeManager())
+    # app.append_manager(mgr.getSosFlagManager())
+    # app.append_manager(mgr.CountdownManager())
+    # app.append_manager(mgr.sosInfoCallManager())
+    # app.append_manager(mgr.testSmsSetIPManager())
+    # app.append_manager(mgr.deleteSmsManager())
+    # app.append_manager(mgr.schoolclassManager())
+    # app.append_manager(mgr.firwDownloadManager())
+    # if EventMesh.model == "D15":
+    #     app.append_manager(mgr.vedioInforManager())
+    try:
+        try:
+            import usr.ai_VC_t as _ai
+        except Exception as e:
+            usys.print_exception(e) 
+            
+        try:
+            import usr.ai_VC as _ai
+        except Exception as e:
+            usys.print_exception(e) 
+            try:
+                import ai_VC as _ai
+            except Exception as e:
+                usys.print_exception(e)    
+            try:
+                import usr.ai_VC_7PIN as _ai
+            except Exception as e:
+                usys.print_exception(e) 
+                try:
+                    import ai_VC as _ai
+                except Exception as e:
+                    usys.print_exception(e) 
+                try:
+                    import usr.ai_VC_G15 as _ai
+                except Exception as e:
+                    usys.print_exception(e) 
+
+        #app.append_manager(intervManager())
+        try:
+            app.append_manager(_ai.getStorageDataManager())
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            app.append_manager(_ai.AI_led())
+        except Exception as e:
+            usys.print_exception(e)
+        try:
+            app.append_manager(_ai.AI_dev())
+        except Exception as e:
+            usys.print_exception(e)
+        
+        try:
+            app.append_manager(_ai.device_res_author())
+        except Exception as e:
+            usys.print_exception(e)     
+        
+        try:
+            app.append_manager(_ai.AI_VC())
+        except Exception as e:
+            usys.print_exception(e) 
+              
+    except Exception as e:
+        usys.print_exception(e)   
+        
+    EventMesh.debug_log("init21:{}".format(utime.localtime()))    
+    
+    EventMesh.debug_log("init11:{}".format(utime.localtime()))    
+    
+    #EventMesh.publish("open_power_on", 1)#
+    # pcr = protocol.ProtoColResolver()
+    # pcr.add_support(protocol.LK_ProtoCol())
+    # pcr.add_support(protocol.PING_ProtoCol())
+    # pcr.add_support(protocol.KA_ProtoCol())
+    # pcr.add_support(protocol.UD_ProtoCol())
+    # pcr.add_support(protocol.CR_ProtoCol())
+    # pcr.add_support(protocol.AL_ProtoCol())
+    # pcr.add_support(protocol.FIND_ProtoCol())
+    # pcr.add_support(protocol.POWEROFF_ProtoCol())
+    # pcr.add_support(protocol.PHL_ProtoCol())
+    # pcr.add_support(protocol.TK_ProtoCol())
+    # pcr.add_support(protocol.TKS_ProtoCol())
+    # pcr.add_support(protocol.MESSAGE_ProtoCol())
+    # pcr.add_support(protocol.WT_ProtoCol())
+    # pcr.add_support(protocol.REMIND_ProtoCol())
+    # pcr.add_support(protocol.HRSTART_ProtoCol())
+    # pcr.add_support(protocol.HEART_ProtoCol())
+    # pcr.add_support(protocol.OXYGEN_ProtoCol())
+    # pcr.add_support(protocol.OXYGEN_One_ProtoCol())
+    # pcr.add_support(protocol.TEMP_ProtoCol())
+    # pcr.add_support(protocol.DLT_ProtoCol())
+    # pcr.add_support(protocol.UPLOAD_ProtoCol())
+    # pcr.add_support(protocol.MONITOR_ProtoCol())
+    # # pcr.add_support(protocol.CENTER_ProtoCol())
+    # pcr.add_support(protocol.CENTER_ProtoCol())
+    # pcr.add_support(protocol.bootoff_ProtoCol())
+    # pcr.add_support(protocol.WDSTART_ProtoCol())
+    # pcr.add_support(protocol.LOWBAT_ProtoCol())
+    # pcr.add_support(protocol.sosHome_dial_ProtoCol())
+    # pcr.add_support(protocol.Time_ProtoCol())
+    # pcr.add_support(protocol.SILENCETIME2_ProtoCol())
+    # pcr.add_support(protocol.FALLDOWN_ProtoCol())
+    # pcr.add_support(protocol.HELP_ProtoCol())
+    # pcr.add_support(protocol.REMOVE_ProtoCol())
+    # pcr.add_support(protocol.UD_ProtoCol())
+    # pcr.add_support(protocol.bldstart_ProtoCol())
+    # pcr.add_support(protocol.blood_ProtoCol())
+    # pcr.add_support(protocol.bgstart_ProtoCol())
+    # pcr.add_support(protocol.bloodglucose_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CHDRINK_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CHMEDICINE2_ProtoCol())
+    # pcr.add_support(protocol.WLKEY_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_WAKEUP_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_SLEEP_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_HOME_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_REST_ProtoCol())
+    # pcr.add_support(protocol.SLEEP_DATA_ProtoCol())
+    # pcr.add_support(protocol.SLEEPTIME_ProtoCol())
+    # pcr.add_support(protocol.FACTORY_ProtoCol())
+    # pcr.add_support(protocol.RESET_ProtoCol())
+    # pcr.add_support(protocol.REMIND_CH_SIT_ProtoCol())
+    # pcr.add_support(protocol.SCREEN_SHOWProtoCol())
+
+
+
+
+
+    # sm = protocol.SockManager()
+    # sm.add_support_resolver(pcr)
+    # app.append_manager(sm)
+    EventMesh.debug_log("init11.0:{}".format(utime.localtime()))   
+    app.start()
+    
+    sms_data = sms.getSaveLoc()
+    if(sms_data != -1):
+        sms_lacv = sms_data[0][0]
+        if sms_lacv != 'SM':#每次开机设置一下短信的存储位置
+            sms.setSaveLoc('SM', 'SM', 'SM')
+    EventMesh.debug_log("init12:{}".format(utime.localtime()))
+    # timer_t = net.nitzTime()
+    # EventMesh.debug_log("timer_t:{}".format(timer_t))
+    # if(timer_t != -1):
+    #     timeSecond = int(timer_t[1])
+    #     if timeSecond != 0:
+    #         next_alarm_time = utime.localtime(timeSecond)
+    #         machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+    
+    
+    
+    # EventMesh.publish("load_screen", {"screen": "main_menu"})
+
+
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr.py
new file mode 100644 (file)
index 0000000..de38bf6
--- /dev/null
@@ -0,0 +1,5072 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import usocket
+import ql_fs
+import ujson
+import _thread
+import modem
+import utime
+import sim
+import net
+import dataCall
+import checkNet
+import osTimer
+import constants
+import sms
+from common import Lock, Abstract, LogAdapter
+#from location import GPS, GPSMatch,CellLocator
+from misc import USB, Power, ADC
+from machine import ExtInt, Pin,Timer,RTC,UART
+import EventMesh
+import usys
+import audio
+from machine import I2C
+from Gsensor import SC7A20
+import pm
+import ure
+import urandom
+try :
+    from Hsensor import GH3018
+except Exception as e:
+    EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
+#
+try :
+    from Hsensor import HX3918
+except Exception as e:
+    EventMesh.debug_log("Hsensor none HX3918:{}".format(e))    
+from machine import RTC
+import quecgnss
+import wifiScan
+import math
+import voiceCall
+from misc import PWM
+from led import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white
+from queue import Queue
+if EventMesh.model == "D10":
+    heartbeat_time = 7*60 #心跳时间
+    gheartbeat_time = 5*60 #心跳时间
+
+    def get_autoblood_value():#血压值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_Maxvalue = 0
+        blood_Minvalue = 0
+        if hour >= 6 and hour <= 10:
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 120+random_numMax
+            blood_Minvalue = 75+random_numMin
+
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 10 and hour <= 14:#10-14(10,14]
+            random_numMax = urandom.randint(0, 20)
+            random_numMin = urandom.randint(0, 25)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 14 and hour <= 18:#14-18
+            random_numMax = urandom.randint(0, 25)
+            random_numMin = urandom.randint(0, 15)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 70+random_numMin
+
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 2 and hour < 6:#2-6
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalu = 105+random_numMax
+            blood_Minvalue = 65+random_numMin
+
+            
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        else:#18-2 19 20 21 22 23 1 2
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 100+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
+        return [blood_Maxvalue,blood_Minvalue]
+
+    def get_blood_sugar_value():#血糖值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_sugar = 0
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
+            random_value = urandom.randint(39, 61)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 6 -10",blood_sugar)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
+            random_value = urandom.randint(67, 90)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 10 -14",blood_sugar)
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
+            random_value = urandom.randint(39, 78)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 18 -2",blood_sugar)
+        return blood_sugar
+
+
+
+
+    class PhoneVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_phonering_level", self.add)
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
+            EventMesh.subscribe("get_phonering_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class MsgVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
+            EventMesh.subscribe("get_msgvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class AlarmVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
+            EventMesh.subscribe("get_alarmvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+            
+    class StopwatchManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.ms_value = 0
+            self.sec_value = 0
+            self.min_value = 0
+            self.timer = Timer(Timer.Timer1)
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("stopwatch_start", self.start)
+            EventMesh.subscribe("stopwatch_stop", self.paused)
+            EventMesh.subscribe("stopwatch_reset", self.reset)
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)
+
+        def start(self, event, msg):        
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
+        
+        def paused(self, event, msg):        
+            self.timer.stop()
+        
+        def reset(self, event, msg):
+            self.timer.stop()
+
+            self.sec_value = 0
+            self.min_value = 0
+            self.ms_value = 0
+
+        def fun(self):
+            self.ms_value += 1
+            if self.ms_value > 9:
+                self.ms_value = 0   
+                self.sec_value += 1
+            if self.sec_value > 60:
+                self.sec_value = 0
+                self.min_value += 1
+            if self.min_value > 60:
+                self.timer.stop()
+
+        def get_ms(self, event=None, msg=None):
+            return self.ms_value
+
+        def get_min(self, event=None, msg=None):
+            return self.min_value
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec_value
+
+    class CountdownManager(Abstract):
+        def __init__(self):
+            self.sec = 0
+            self.min = 0
+            self.hour = 0
+            self.timer = osTimer()
+            self.total = 0
+            self.time_cb = 0
+            self.time_play = 0
+            self.total_sec = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
+            EventMesh.subscribe("add_countdown_min", self.add_min)
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)
+            EventMesh.subscribe("get_countdown_min", self.get_min)
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)
+
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
+
+
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
+
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
+
+            EventMesh.subscribe("reset_time_countdown",self.reset)
+
+        def set_countdown_all_time(self, event, msg):
+            self.total = msg[0]
+            self.total_sec = msg[1]
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
+
+
+        def get_countdown_all_time(self, event, msg):
+            return self.total
+        
+        def set_countdown_off_state(self, event, msg):
+
+            self.time_cb = msg[0]
+            self.time_play = msg[1]
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
+
+
+        def get_countdown_off_state(self, event, msg):
+            return [self.time_cb,self.time_play]
+        
+        def countdown_end_cb(self, event, msg):
+            
+            if self.time_cb == 1 and self.time_play == 1:
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp) 
+                reduce = time_tmp- self.total_sec
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
+                self.total = self.total - reduce
+                if self.total <= 0:
+                    self.total = 0
+                    self.time_cb = 0
+                    self.time_play = 0
+                    self.sec = 0
+                    self.min = 0
+                    self.hour = 0
+                    
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
+                    return
+                self.total_sec = time_tmp
+
+
+        def add_sec(self, event, msg):
+            if self.sec < 59:
+                self.sec = self.sec + 1
+
+        def reduce_sec(self, event, msg):
+            if self.sec > 0:
+                self.sec = self.sec - 1
+
+        def add_min(self, event, msg):
+            if self.min < 59:
+                self.min = self.min + 1
+
+        def reduce_min(self, event, msg):
+            if self.min > 0:
+                self.min = self.min - 1
+
+        def add_hour(self, event, msg):
+            if self.hour < 99:
+                self.hour = self.hour + 1
+
+        def reduce_hour(self, event, msg):
+            if self.hour > 0:
+                self.hour = self.hour - 1
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec
+
+        def get_min(self, event=None, msg=None):
+            return self.min
+
+        def get_hour(self, event=None, msg=None):
+            return self.hour
+        
+
+        
+        def reset(self, event=None, msg=None):
+            self.hour = 0
+            self.min = 0
+            self.sec = 0
+        
+        
+
+    BATTERY_OCV_TABLE = {
+        "nix_coy_mnzo2": {
+            55: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            20: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            0: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+        },
+    }
+
+
+
+    class Battery(object):
+        """This class is for battery info.
+
+        This class can get battery voltage and energy.
+        if adc_args is not None, use cbc to read battery
+
+        adc_args: (adc_num, adc_period, factor)
+
+            adc_num: ADC channel num
+            adc_period: Cyclic read ADC cycle period
+            factor: calculation coefficient
+        """
+
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
+            self.__energy = 100
+            self.__temp = 55
+
+            # ADC params
+            self.__adc = None
+            if adc_args:
+                self.__adc_num, self.__adc_period, self.__factor = adc_args
+                if not isinstance(self.__adc_num, int):
+                    raise TypeError("adc_args adc_num is not int number.")
+                if not isinstance(self.__adc_period, int):
+                    raise TypeError("adc_args adc_period is not int number.")
+                if not isinstance(self.__factor, float):
+                    raise TypeError("adc_args factor is not int float.")
+                self.__adc = ADC()
+
+            # Charge params
+            self.__charge_callback = None
+            self.__charge_status = None
+            self.__chrg_gpion = chrg_gpion
+            self.__stdby_gpion = stdby_gpion
+            self.__chrg_gpio = None
+            self.__stdby_gpio = None
+            self.__chrg_exint = None
+            self.__stdby_exint = None
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                self.__init_charge()
+
+        def __chrg_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __stdby_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __update_charge_status(self):
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 0
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 1
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
+                self.__charge_status = 2
+            else:
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
+
+        def __init_charge(self):
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
+                                        self.__stdby_callback)
+            self.__chrg_exint.enable()
+            self.__stdby_exint.enable()
+            self.__update_charge_status()
+
+        def __get_soc_from_dict(self, key, volt_arg):
+            """Get battery energy from map"""
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
+                pre_volt = 0
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
+                for volt in volts:
+                    if volt_arg > volt:
+                        volt_not_under = 1
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
+                        break
+                    else:
+                        pre_volt = volt
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
+                    return soc1
+                elif volt_not_under == 0:
+                    return 0
+                else:
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
+
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
+            """Get battery energy by temperature and voltage"""
+            if bat_type == "nix_coy_mnzo2":
+                if temp > 30:
+                    return self.__get_soc_from_dict(55, volt_arg)
+                elif temp < 10:
+                    return self.__get_soc_from_dict(0, volt_arg)
+                else:
+                    return self.__get_soc_from_dict(20, volt_arg)
+
+        def __get_power_vbatt(self):
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
+
+        def __get_adc_vbatt(self):
+            self.__adc.open()
+            utime.sleep_ms(self.__adc_period)
+            adc_list = list()
+            for i in range(self.__adc_period):
+                adc_list.append(self.__adc.read(self.__adc_num))
+                utime.sleep_ms(self.__adc_period)
+            adc_list.remove(min(adc_list))
+            adc_list.remove(max(adc_list))
+            adc_value = int(sum(adc_list) / len(adc_list))
+            self.__adc.close()
+            vbatt_value = adc_value * (self.__factor + 1)
+            return vbatt_value
+
+        def set_temp(self, temp):
+            """Set now temperature."""
+            if isinstance(temp, int) or isinstance(temp, float):
+                self.__temp = temp
+                return True
+            return False
+
+        def get_voltage(self):
+            """Get battery voltage"""
+            if self.__adc is None:
+                return self.__get_power_vbatt()
+            else:
+                return self.__get_adc_vbatt()
+
+        def get_energy(self,volt_arg ):
+            """Get battery energy"""
+            if( volt_arg == None) :
+                volt_arg = self.get_voltage()
+            self.__energy = self.__get_soc(self.__temp, volt_arg)
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
+            return self.__energy
+
+        def set_charge_callback(self, charge_callback):
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                if callable(charge_callback):
+                    self.__charge_callback = charge_callback
+                    return True
+            return False
+
+        def get_charge_status(self):
+            return self.__charge_status
+
+    class BatteryManager(Abstract):
+        def __init__(self):
+            """电池管理器"""
+            self.battery = Battery()
+            self.low_battery = False
+
+        def post_processor_after_instantiation(self):
+            """订阅此类所有的事件到 EventMesh中"""
+            EventMesh.subscribe("get_battery", self.get_battery)
+
+        def get_battery(self, event=None, msg=None):
+            battery = self.battery.get_energy(msg)
+            return battery
+
+        def get_voltage(self, event=None, msg=None):
+            voltage = self.battery.get_voltage()
+            return voltage
+
+    class ConfigStoreManager(Abstract):
+        """
+        持久化落盘存储
+        """
+
+        def __init__(self):
+            self.file_name = "/usr/conf_store.json"
+            self.lock = Lock()
+            self.map = dict()
+
+        def post_processor_after_instantiation(self):
+            if ql_fs.path_exists(self.file_name):
+                self.map = ql_fs.read_json(self.file_name)
+            else:
+                self.__store()
+            EventMesh.subscribe("persistent_config_get", self.__read)
+            EventMesh.subscribe("persistent_config_store", self.__store)
+
+        def __read(self, event, msg):
+            with self.lock:
+                return self.map.get(msg)
+
+        def __store(self, event=None, msg=None):
+            if msg is None:
+                msg = dict()
+            with self.lock:
+                self.map.update(msg)
+                ql_fs.touch(self.file_name, self.map)
+            
+    class sosInfoCallManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
+
+        def set_sos_info_call(self, event, msg):
+            hangup_mode = EventMesh.publish("get_hangup_mode")
+            if hangup_mode == 1:
+                EventMesh.publish("set_sos_flag",0)
+                EventMesh.publish("set_sos_num",0)
+                EventMesh.publish("set_hangup_mode",0)
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
+            sos_flag = EventMesh.publish("get_sos_flag")
+            EventMesh.debug_log('voicecall sos_flag',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 number != None:
+                    if len(number) > 0:
+                        if num == None:
+                            num = 0
+                        num+=1
+                        num_len = 0
+
+                        if len(number) == 1:
+                            num_len = len(number)+1#三次
+                        elif len(number) == 2:
+                            num_len = len(number)+1+2 #1+2+1+2
+                        elif len(number) == 3:
+                            num_len = len(number)+5 #1+3+5
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
+                        if num > num_len :
+                            if len(number) == 1:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 2:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 3:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                                number3 = str(number[2])
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                        else:
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
+                            EventMesh.publish("set_sos_num",num)
+                            if len(number) == 1:
+                                if len(number[0]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[0])
+                                    EventMesh.debug_log("phone 1")
+                            elif len(number) == 2:
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
+                                    if len(number[1]) != 0:
+                                        EventMesh.debug_log("phone 2")
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                elif num == 2 or num == 4:
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 3")
+                                        EventMesh.publish("set_callnumer_cb",number[0])
+                            elif len(number) == 3:
+                                if num == 1 or num == 4 or num == 7:
+                                    if len(number[1]) != 0:
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                        EventMesh.debug_log("phone 4")
+                                elif num == 2 or num == 5 or num == 8:
+                                    if len(number[2]) != 0:
+                                        EventMesh.debug_log("phone 5")
+                                        EventMesh.publish("set_callnumer_cb",number[2])
+                                elif num == 3 or num == 6 :
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 6")
+                                        EventMesh.publish("set_callnumer_cb",number[0])   
+    WL_timer = osTimer()   
+    def WL_timer_cb(*args):   
+        get_call = EventMesh.publish("get_call_state") 
+        if get_call == 2:#只有拨进来才给接听
+            EventMesh.publish("answer_call_event")#接听电话
+    def voice_callback(args):
+        EventMesh.debug_log('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
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
+
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单
+                    on_list_flag = 0
+                    phonebook = EventMesh.publish("get_phonebook_list")
+                    phonebook_list = phonebook[1]
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
+                    try:
+                        for value in phonebook_list.values():
+                            if value == args[6]:
+                                on_list_flag = 1
+                                break
+                    except Exception as e:
+                        usys.print_exception(e)
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
+                    if on_list_flag == 1:#在白名单里
+                        if WLKEY == "2":
+                            WL_timer.stop()
+                            WL_timer.start(30000, 0, WL_timer_cb)
+                    else:
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
+                        voiceCall.callEnd()
+                        return 
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if fall_down != 0:
+                    voiceCall.callEnd()
+                    return
+                EventMesh.publish("set_call_state",2) 
+                EventMesh.publish("dialin_call_event")#电话拨进响铃
+                # 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)
+
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                EventMesh.publish("set_call_state",3) 
+                # 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)
+                
+
+                
+                
+                EventMesh.publish("set_sos_info_call")  
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("close_timer_all")#
+                EventMesh.publish("set_call_state",0) 
+                EventMesh.debug_log('voicecall disconnect end')
+                
+
+        elif args[0] == 13:
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
+        elif args[0] == 14:
+
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
+                EventMesh.publish("set_UI_high_priority",0)
+                EventMesh.publish("set_call_state",1) 
+                # EventMesh.publish("load_screen", {"screen": "dialing"})
+
+                
+        elif args[0] == 15:
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
+                EventMesh.publish("set_call_state",1) 
+                
+        elif args[0] == 16:
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
+
+    class DeviceInfoManager(Abstract):
+        
+        """
+            设备信息管理
+        """
+
+        def __init__(self):
+
+            self.DeviceInfo_queue = Queue()
+            _thread.stack_size((9+6)*1024)
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            self.boot_time_count = 0
+            self.factory_test_time = 0
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
+            self.key = ""
+            self.imei = ""
+            self.cid = "ETEST20221014010"
+            self.imsi = ""
+            self.password = "000000"
+            #self.__city = None
+            #self.__location = None
+            self.timer_push_schedule = osTimer()
+            self.timer_pusht_test = osTimer()
+            
+            #self.battery_push_schedule = osTimer()
+            self.check_battery_list = []
+            
+            self.step = [0,0,0,0]
+            self.timer_push=0
+            self.timer_push_tmp=60
+            self.PING = "0" #绑定状态
+            self.connect = 0 #服务器连接状态
+            self.KA_time = 0
+            self.HR_time = 0
+            self.hr_timeSecond = 0
+            self.HR_state = 0
+            self.HR_Onestate = 0
+            self.get_hr_state = 0
+            self.get_spo2_state = 0
+            self.set_hsenor_crt = 0
+            self.HR_OneTime = 0
+            self.Hr_Need_Open = 0
+            self.Spo2_Need_Open = 0
+            self.bat_time = 0
+            self.vbat_full_flag = 0
+            self.clear_step = 0
+            self.test = 0
+            self.old_time = 0
+            self.UD_time = 0
+            self.upload_time = 0
+            self.UD_timeout = 7*60
+
+            self.low_power_AL = 0
+
+            self.temp_timeSecond = 0
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.temp_warning = 0
+
+            self.bg_timeSecond = 0
+
+            self.bp_timeSecond = 0
+            self.bpauto_state = 0
+
+            self.spo2_timeSecond = 0
+            self.spo2auto_state = 0
+
+            self.vbat_count = 0
+
+            self.vbat_buf=[]
+
+            self.curr_battery_level = 4200
+            self.bat_count = 0
+
+            self.mearsure_btn = 0
+            self.mearsure_timer = 0
+
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+
+            self.no_smi_count = 0
+            self.no_smi_state = 0
+
+            self.old_bp_time = 0
+
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+            
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+            
+            self.charge_full_count = 0
+            self.GPS_step_t = 0#记录步数
+            self.usb = USB()
+            self.usb.setCallback(self.usb_event_cb)
+            self.log = LogAdapter(self.__class__.__name__)
+            self.rtc = RTC()
+            self.aud = audio.Audio(0)
+            EventMesh.debug_log("DeviceInfoManager:1")
+            self.gsensor = SC7A20()
+            EventMesh.debug_log("DeviceInfoManager:1.0")
+            self.gsensor.activate()
+            EventMesh.debug_log("DeviceInfoManager:1.1")
+            self.gsensor.init()
+            EventMesh.debug_log("DeviceInfoManager:2")
+            self.gsensor.set_callback(self.gsensor_cb)
+            try :
+                self.hsensor = HX3918()
+                
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none HX3918:{}".format(e))   
+            try :
+                self.hsensor = GH3018()
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none GH3018:{}".format(e))   
+            #
+            self.hsensor.activate()
+            self.hsensor.init()
+            self.hsensor.close()
+            try :
+                self.hsensor.set_sar(1)
+            except Exception as e:
+                EventMesh.debug_log("Hsensor none set_sar:{}".format(e)) 
+            self.old_temp_time = 0
+            # #EventMesh.debug_log("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
+            EventMesh.debug_log("DeviceInfoManager:3")
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
+            self.stop_temp( None, None)
+            self.dev_state = 0
+            self.wear = 1
+            self.BG_state = 0
+            self.old_bg_time = 0
+
+            self.pull_time = 0
+
+            self.drink_time = 0
+
+            self.alarm_count = 0
+            self.alarm_flag = 0
+
+            self.time_count = 0
+            
+            self.auto_spo2_count = 0
+
+            self.auto_hr_count = 0
+
+            self.auto_temp_count = 0
+
+            self.test_time = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.debug_log("post_processor_after_instantiation:1")
+            """订阅此类所有的事件到 EventMesh中"""
+            voiceCall.setCallback(voice_callback)
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
+            EventMesh.subscribe("screen_get_sig", self.get_signal)
+            EventMesh.subscribe("screen_get_time", self.get_time)
+            EventMesh.subscribe("about_get_imei", self.get_imei)
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
+            EventMesh.subscribe("screen_get_battery", self.get_battery)
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
+
+            
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
+
+            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)
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)
+
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)
+
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
+
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
+
+
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
+            
+            EventMesh.debug_log("post_processor_after_instantiation:2")
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
+            # 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.publish_event_cb()
+            
+            EventMesh.debug_log("post_processor_after_instantiation:3")
+
+        def clear_manual_hr_flag(self,event,msg):
+            self.auto_hr_count = 0
+        
+        def clear_manual_temp_flag(self,event,msg):
+            self.auto_temp_count = 0
+
+        def publish_message_event_DeviceInfo(self,event,msg):
+            self.DeviceInfo_queue.put(msg)
+
+        #DeviceInfo的消息队列处理,防止卡顿
+        def DeviceInfo_queue_thread(self):
+            while True:
+                data = self.DeviceInfo_queue.get()
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+
+        def gsensor_cb(self, para):
+            EventMesh.debug_log("gsensor_cb:{}".format(para))
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
+            if para == 0: #跌倒报警
+                pass
+                if fall_sw == "1":
+                    EventMesh.publish("falldown_alarm_event")
+                    dev_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 21
+                    dev_state = dev_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",dev_state)
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+                    pass
+                #EventMesh.publish("load_screen", {"screen": "FIND"})
+            elif para == 1: #抬腕
+                
+                if flip_sw == 1:
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
+                
+            elif para == 2: #放手
+                pass
+                # if flip_sw == 1:
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
+        def get_boot_time_count(self, event, msg):
+            return self.boot_time_count
+        
+        def get_factory_test_time(self, event, msg):
+            return self.factory_test_time
+        
+        def get_dev_state(self, event, msg):
+            return self.dev_state
+        def set_dev_state(self, event, msg):
+            self.dev_state = msg
+        
+        def publish_event_cb(self, *args, **kwargs):
+            
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 1:
+                    if self.boot_time_count < 50000000:
+                        self.boot_time_count += 10
+                    if self.factory_test_time < 300:
+                        self.factory_test_time+=10
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
+        def optimize_temp(self,temp):
+            temp += 0.5
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            EventMesh.debug_log("temp:{}".format(temp))
+            if temp < 36 :#or temp > 37.5:
+                temp = 36+urandom.random()
+            if temp > 37.5:
+                
+                self.temp_warning += 1
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
+                
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
+                    temp = 37+(urandom.randint(1, 4)/10)
+                else:
+                    self.temp_warning = 0
+            else:
+                if self.temp_warning>=1:
+                    self.temp_warning -= 1
+            if temp >= 40:
+                temp = 40
+            return temp
+        def clear_health_state(self,event,msg):
+            print("clear_health_state")
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
+            self.old_time = 0
+            self.HR_Onestate = 0
+            self.HR_OneTime = 0
+            self.HR_state = 0
+            self.set_hsenor_crt = 0
+            self.old_bg_time = 0
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+            self.BG_state = 0
+            self.bpauto_state = 0
+            self.spo2auto_state = 0
+            pass
+
+        def clear_temp_state(self,event,msg):
+            print("clear_temp_state")
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.old_temp_time = 0
+            pass
+
+        def publish_event(self,data):
+            """
+            定时事件处理
+            :param args:
+            :param kwargs:
+            :return:
+            """
+
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
+            
+
+            EventMesh.publish("countdown_end_cb")
+            """定时检查是否关闭gps失败"""
+            # gnss_state = quecgnss.get_state()
+            # get_location_flag = EventMesh.publish("get_location_flag")
+            # if get_location_flag != None:
+            #     # if gnss_state == 2 and get_location_flag == 0:
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
+            #     if(get_location_flag == 0):
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+            """7分钟一次心跳"""
+            if EventMesh.platform == "gewu":
+                if  math.fabs(time_tmp - self.KA_time) > gheartbeat_time: #7分钟一次心跳
+                    self.KA_time = time_tmp
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
+            else:
+                if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
+                    self.KA_time = time_tmp
+                    EventMesh.publish(constants.PROTOCOL.KA_SEND)
+
+            """定时定位"""
+            #EventMesh.publish("set_upload_data",3*60)
+            self.upload_time = EventMesh.publish("get_upload_data")
+            #EventMesh.debug_log("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: #30分钟一次定位
+                    self.UD_time = time_tmp
+                    status_tmp = self.gsensor.get_status()#获取运动次数
+                    #status_tmp = 4
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+                        self.gsensor.clean_status()#清除运动次数
+                    else : #关闭定位
+                        #EventMesh.txt_log("NO status")
+                        EventMesh.debug_log("NO status")
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+            
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
+
+            """电池平均值"""
+            temp = Power.getVbatt()
+            if self.bat_count < 10:
+                self.vbat_buf.append(temp)
+                self.bat_count += 1
+            else:
+                for i in range(9):
+                    self.vbat_buf[i] = self.vbat_buf[i+1]
+                self.vbat_buf[9] = temp
+            curr_count = len(self.vbat_buf)
+            bat_total_value = 0
+            for i in range(curr_count):
+                bat_total_value += self.vbat_buf[i]
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
+            EventMesh.publish("set_curr_battery_level",bat_total_value)
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
+            bat_tmp = EventMesh.publish("screen_get_battery")
+            self.vbat_count+=10
+            if self.vbat_count >= 60:
+                self.vbat_count = 0
+                if bat_tmp != None:
+                    bat_value = bat_tmp[1]
+                    if bat_value <= 0:
+                        pass
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
+            
+            
+            """"隔天清步数"""
+
+            data = RTC().datetime()
+
+            hour = int(data[4])
+            min = int(data[5])
+
+
+
+            cur_month = int(data[1])
+            cur_day = int(data[2])
+            cur_year = int(data[0])
+
+            old_Timesec = EventMesh.publish("get_old_time_data")
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
+            # EventMesh.debug_log("old_Timesec",old_Timesec)
+            if old_Timesec != None:
+                next_alarm_time = utime.localtime(int(old_Timesec))
+                month = int(next_alarm_time[1]) #00:00 18
+                day = int(next_alarm_time[2])
+                year = int(next_alarm_time[0])
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
+                    EventMesh.publish("set_old_time_data",time_tmp)
+                    self.gsensor.reset_step()
+
+                    EventMesh.publish("set_old_step_value",0)
+                    
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step1111")
+                else:
+                    pass
+                    
+                    
+            if hour == 23:#清步数23:59
+                if min == 59:#58 59
+                    # if self.clear_step == 0:
+                    #     self.clear_step = 1
+                    EventMesh.publish("set_old_time_data",time_tmp)
+                    self.gsensor.reset_step()
+                    EventMesh.publish("set_old_step_value",0)
+
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step2222")
+
+                else:
+                    self.clear_step = 0
+            else:
+                self.clear_step = 0
+            
+            """电量小于0% 关机"""
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#
+            battery = EventMesh.publish("screen_get_battery")
+            if battery != None:
+                power = int(battery[1])
+                if battery[0] != '1':
+                    if power == 0:
+                        EventMesh.publish("open_power_on",2)#  
+                    """"低电报警"""
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
+                    if power <= 15 and self.low_power_AL==0:
+                        self.low_power_AL = 1
+                        dev_state =  EventMesh.publish("get_dev_state")
+
+                        tmp = 1 << 17
+                        dev_state = dev_state|tmp #第17位=1
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+
+                if power >= 50:
+                    self.low_power_AL = 0
+
+            """未联网提示关机"""
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
+            # EventMesh.debug_log("ble",ble)
+            if ble == 0:#未联网提示关机
+                if battery[0] != '1':
+                    self.no_smi_count+=10
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
+                    if self.no_smi_count >= (15*60):#(15*60)
+                        self.no_smi_count = 0
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
+                    
+            else:
+                self.no_smi_count = 0
+
+            msg_nums = sms.getMsgNums() #获取短信条数
+            # EventMesh.debug_log("msg_nums",msg_nums)
+            if(msg_nums != -1):
+                sms_data = sms.getSaveLoc()
+                sms_max = sms_data[0][2]
+                if msg_nums >= sms_max-1:
+                    EventMesh.publish("delete_sms_event")#
+
+            #佩戴检测
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            if self.wear != WEAR:
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
+                if remove_sw == "1":#开启了佩戴检测的开关
+                    dev_state =  EventMesh.publish("get_dev_state")
+                    
+                    if WEAR != 1:
+                        tmp = 1 << 3
+                        tmp = ~tmp
+                        tmp = 1 << 20
+                        dev_state = dev_state|tmp #第20位=1
+                    # else :     
+                    #     pass              
+                        
+                    #     tmp = 1 << 20
+                    #     dev_state = dev_state|tmp #第20位=1
+                    #     tmp = 1 << 3
+                    #     dev_state = dev_state|tmp #第三位=1
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
+            self.wear = WEAR
+            """定时测量心率,血氧,体温"""
+            self.get_hr_state = EventMesh.publish("get_hr_state")
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            if get_bg_state == None:
+                get_bg_state = 0
+            if get_bp_state == None:
+                get_bp_state = 0
+
+            if get_temp_state == None:
+                get_temp_state = 0
+
+            if self.get_hr_state == None:
+                self.get_hr_state = 0
+            if self.get_spo2_state == None:
+                self.get_spo2_state = 0 
+        
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+            if battery[0] != "1":
+                if get_temp_state != None and call_state != None: #突然脱腕
+
+                    if get_temp_state > 1  and (WEAR != 1 or call_state != 0):
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+                        EventMesh.publish("set_temp_state",0)
+                        EventMesh.txt_log("auto stop_temp:22")
+
+                    if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0):
+                        # print("wear faile")
+                        if self.get_hr_state > 1 :
+                            EventMesh.txt_log("auto stop_hr:22")
+                            EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                            EventMesh.publish(constants.EVENT.STOP_HEART) 
+                            if WEAR == 1:
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                            
+                        if self.get_spo2_state > 1:
+                            EventMesh.txt_log("auto stop_spo2:22")
+                            EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+
+                            EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if WEAR == 1:
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                            
+                        if get_bp_state > 1:
+                            EventMesh.txt_log("auto stop_bp:22")
+                            EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            if WEAR == 1:
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                            
+                        if get_bg_state > 1:
+                            EventMesh.txt_log("auto stop_bg:22")
+                            EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            if WEAR == 1:
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+                            
+            if self.pull_time == 0:
+                self.pull_time = time_tmp
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0:
+                #防止时间校时出错
+                if time_tmp < self.pull_time :
+                    self.pull_time = time_tmp
+                if time_tmp < self.temp_timeSecond:
+                    self.temp_timeSecond = time_tmp
+                if time_tmp < self.hr_timeSecond:
+                    self.hr_timeSecond = time_tmp
+                if time_tmp < self.spo2_timeSecond :
+                    self.spo2_timeSecond = time_tmp
+                if time_tmp < self.bp_timeSecond:
+                    self.bp_timeSecond = time_tmp
+                if time_tmp < self.bg_timeSecond:
+                     self.bg_timeSecond = time_tmp
+                     
+                if time_tmp - self.pull_time >= 30:
+                    # EventMesh.debug_log("shifens:")  
+
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_bp_state  = EventMesh.publish("get_bp_state")
+                    get_bg_state  = EventMesh.publish("get_bg_state")
+                    get_temp_state  = EventMesh.publish("get_temp_state")
+                    if get_hr_state == None:
+                        get_hr_state = 0
+                        self.old_hr_time = 0
+
+                    if get_spo2_state == None:
+                        get_spo2_state = 0
+                        self.old_spo2_time = 0
+
+                    if get_temp_state == None:
+                        get_temp_state = 0
+                        self.temp_one_state = 0
+
+                    if get_bp_state == None:
+                        get_bp_state = 0
+                        self.old_bp_time = 0
+                    
+                    if get_bg_state == None:
+                        get_bg_state = 0
+                        self.old_bg_time = 0
+                    
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
+
+                    
+                    if get_hr_state != None:
+                        if get_hr_state == 3:
+                            self.old_hr_time+=1
+                            if self.old_hr_time == 1:
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_hr:333")
+                            elif self.old_hr_time > 6:
+                                self.old_hr_time = 0
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                EventMesh.txt_log("auto stop_hr:333")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                EventMesh.debug_log("STOP_HEART:3")
+                        else:
+                            self.old_hr_time = 0
+                    else:
+                        self.old_hr_time = 0
+
+
+                    if get_spo2_state != None:
+                        if get_spo2_state == 3:
+                            self.old_spo2_time+=1
+                            if self.old_spo2_time == 1:
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                EventMesh.txt_log("auto start_spo2:333")
+                            elif self.old_spo2_time > 6:
+                                self.old_spo2_time = 0
+                                EventMesh.txt_log("auto stop_spo2:333")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    
+                        else:
+                            self.old_spo2_time = 0
+                    else:
+                        self.old_spo2_time = 0
+
+
+                    if get_bp_state != None:
+                        if get_bp_state == 3:
+                            self.old_bp_time+=1
+                            if self.old_bp_time == 1:
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bp:333")
+                            elif self.old_bp_time > 6:
+                                self.old_bp_time = 0
+                                
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bp_time = 0
+                    else:
+                        self.old_bp_time = 0
+
+                    if get_bg_state != None:
+                        if get_bg_state == 3:
+                            self.old_bg_time+=1
+                            if self.old_bg_time == 1:
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bg:333")
+                            elif self.old_bg_time > 6:
+                                self.old_bg_time = 0
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bg_time = 0
+                    else:
+                        self.old_bg_time = 0
+
+                    
+                    if get_temp_state != None:
+                        if get_temp_state == 3:#单次测量
+                            self.temp_one_state+=1
+                            if self.temp_one_state == 1:
+                                EventMesh.txt_log("auto start_temp:333")
+                                EventMesh.debug_log("AUTO one temp:2") 
+                                EventMesh.publish("set_temp_state",3)
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_TEMP)   
+                            elif self.temp_one_state > 3:
+                                self.temp_one_state = 0
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                temp = self.optimize_temp(temp)
+                                
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                                EventMesh.txt_log("auto start_temp:333")
+                        else:
+                            self.temp_one_state = 0
+
+
+        
+                    
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
+                    if get_temp_time != None:#定时测量体温
+                        if get_temp_time > 0:
+                            if get_temp_state != None:
+                                get_temp_state  = EventMesh.publish("get_temp_state")
+                                if get_temp_state == 0 or get_temp_state == 2:
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
+                                        self.temp_state = 0
+                                        self.temp_timeSecond = time_tmp
+
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
+                                        self.temp_state = 1
+                                        EventMesh.publish("set_temp_state",2)
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.debug_log("AUTO temp:") 
+                                        EventMesh.txt_log("auto START_temp:1")
+                                        EventMesh.publish(constants.EVENT.START_TEMP)
+
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
+                                        self.temp_state = 0
+                                        EventMesh.txt_log("auto stop_temp:1")
+                                        EventMesh.publish("set_temp_state",0)
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                        temp = self.optimize_temp(temp)
+                                        
+                                        tmp_f_tmp = 0
+                                        tmp_d_tmp = 0
+                                        if str(temp).find(".") != -1:
+                                            tmp_f = str(temp).split('.')[0] 
+                                            tmp_f_tmp = int(tmp_f)
+                                            
+                                            tmp_d = str(temp).split('.')[1][:1]
+                                            tmp_d_tmp = int(tmp_d)
+                                        else:
+                                            tmp_f_tmp = temp
+                                            
+                                        if temp != None:
+                                            if temp != 0:
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                                else:
+                                    self.temp_state = 0
+                                    self.old_temp_time = 0
+                        else:
+                            temp_state  = EventMesh.publish("get_temp_state") 
+                            if temp_state == 2:
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.txt_log("auto wear stop_temp:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            self.temp_state = 0
+                            self.temp_timeSecond = 0
+                            self.old_temp_time = 0
+
+
+
+                    hr_time = {}
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
+                    # print("hr_time{}".format(hr_time))
+                    if hr_time[0] !=  None:
+                        self.mearsure_btn = int(hr_time[0])
+                        self.mearsure_timer = int(hr_time[1])
+
+                        if self.mearsure_btn != None and self.mearsure_timer != None:
+                            
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                        self.hr_timeSecond = time_tmp
+                                        self.HR_Onestate = 0
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
+                                        self.HR_Onestate = 1
+                                        EventMesh.txt_log("auto START_hr:1")
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.publish(constants.EVENT.START_HEART)
+                                        
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
+                                        self.HR_Onestate = 0
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                        EventMesh.debug_log("stop debug3")
+                                        EventMesh.txt_log("auto stop_hr:1")
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                        # heart_value = 60+urandom.randint(0,10)
+                                        if heart_value >= 50 and heart_value != None:
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                        #获取心率数据上传数据app
+                                        EventMesh.debug_log("STOP_HEART:")
+                                        
+                                else:
+                                    self.HR_Onestate = 0
+                            else:
+                                self.hr_timeSecond = 0
+                                self.HR_Onestate = 0
+                                hr_state = EventMesh.publish("get_hr_state")#心率
+                                if hr_state == 2:
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                    EventMesh.debug_log("33stop debug3")
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")
+
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
+                    # print("get_spo2time",get_spo2time)
+                    if get_spo2time != None:#血压时间不为0
+                        spo2_on = int(get_spo2time[0])
+                        spo2_time = int(get_spo2time[1])
+                        if spo2_on != 0 and spo2_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.spo2_timeSecond = time_tmp
+                                    self.spo2auto_state = 0
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
+                                    self.spo2auto_state = 1
+                                    EventMesh.debug_log("START_spo2:auto")
+                                    EventMesh.txt_log("auto START_spo2:1")
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                    
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                    self.spo2auto_state = 0
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    EventMesh.txt_log("auto stop_spo2:1")
+                                
+                            else:
+                                self.spo2auto_state = 0
+                        else:
+                            self.spo2_timeSecond = 0
+                            self.spo2auto_state = 0
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率
+                            if spo2_state == 2:
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("spo2 stop debug3")
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+
+
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
+                    # print("get_bptime",get_bptime)
+                    if get_bptime != None:#血压时间不为0
+                        bp_on = int(get_bptime[0])
+                        bp_time = int(get_bptime[1])
+                        if bp_on != 0 and bp_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bp_timeSecond = time_tmp
+                                    self.bpauto_state = 0
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
+                                    self.bpauto_state = 1
+                                    EventMesh.debug_log("START_bp:auto")
+                                    EventMesh.txt_log("auto START_bp:1")
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
+                                    self.bpauto_state = 0
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto stop_bp:1")
+                                    
+                            else:
+                                self.bpauto_state = 0
+                        else:
+                            self.bp_timeSecond = 0
+                            self.bpauto_state = 0
+                            bp_state = EventMesh.publish("get_bp_state")#心率
+                            if bp_state == 2:
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("bp stop debug3")
+                                EventMesh.txt_log("auto wear stop_bp:2 ")
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+
+
+
+                    bg_time = {}
+                    bg_time = EventMesh.publish("get_bgauto_time")
+                    if bg_time[0] != None:
+                    
+                        bg_btn = int(bg_time[0])
+                        bg_timer = int(bg_time[1]) 
+                        # print("state bg2",self.bg_btn,self.bg_timer)
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bg_timeSecond = time_tmp #1780 
+                                    self.BG_state = 0
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
+                                    EventMesh.debug_log("START_bg:1")
+                                    EventMesh.txt_log("auto START_bg:1")
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    self.BG_state = 1
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
+                                    self.BG_state = 0
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.txt_log("auto stop_bg:1")
+                                    EventMesh.debug_log("stop bgdebug3")
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    bgdata = get_blood_sugar_value()
+                                    if bgdata == None:
+                                        bgdata = 0
+                                    if bgdata != 0:
+                                        EventMesh.debug_log("bgdata",bgdata)
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                                    
+                            else:
+                                
+                                self.BG_state = 0
+                        else:
+                            bg_state  = EventMesh.publish("get_bg_state") 
+                            if bg_state == 2:
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.debug_log("bg stop bgdebug3")
+                                EventMesh.txt_log("auto wear stop_bg:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                            self.bg_timeSecond = 0
+                            self.BG_state = 0
+                    
+                else:
+                    self.old_temp_time = 0
+                    self.old_time = 0
+                    # self.hr_timeSecond = time_tmp
+                    self.HR_Onestate = 0
+                    self.HR_OneTime = 0
+                    self.HR_state = 0
+                    self.old_time = 0    
+                    self.old_bp_time = 0
+                    self.old_hr_time = 0
+                    self.old_spo2_time = 0
+                    self.set_hsenor_crt = 0
+                    self.old_bg_time = 0
+                    # self.bg_timeSecond = time_tmp
+                    self.BG_state = 0
+                    # self.temp_timeSecond = time_tmp
+
+                    # self.bp_timeSecond = time_tmp
+                    self.bpauto_state = 0
+
+                    # self.spo2_timeSecond = time_tmp
+                    self.spo2auto_state = 0
+
+                    self.temp_state = 0
+                    self.temp_one_state = 0
+
+            else:
+                self.old_temp_time = 0
+                self.old_time = 0
+                # self.hr_timeSecond = time_tmp
+                self.HR_Onestate = 0
+                self.HR_OneTime = 0
+                self.HR_state = 0
+                self.old_time = 0    
+                self.old_bp_time = 0
+                self.old_hr_time = 0
+                self.old_spo2_time = 0
+                self.set_hsenor_crt = 0
+                self.old_bg_time = 0
+                # self.bg_timeSecond = time_tmp
+
+                self.BG_state = 0
+                # self.temp_timeSecond = time_tmp
+
+                # self.bp_timeSecond = time_tmp
+                self.bpauto_state = 0
+
+                # self.spo2_timeSecond = time_tmp
+                self.spo2auto_state = 0
+
+                self.temp_state = 0
+                self.temp_one_state = 0
+
+                get_hr_state = EventMesh.publish("get_hr_state")
+                get_spo2_state = EventMesh.publish("get_spo2_state")
+                get_bp_state  = EventMesh.publish("get_bp_state")
+                get_bg_state  = EventMesh.publish("get_bg_state")
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
+                    if get_hr_state > 1:
+                        EventMesh.txt_log("auto stop_hr:44")
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        # if get_hr_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.debug_log("stop debug8")
+                        if WEAR == 1:
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    elif get_spo2_state > 1:
+                        EventMesh.txt_log("auto stop_spo2:44")
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        # if get_spo2_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if spo2_value > 85 and spo2_value != None:
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    elif get_bp_state > 1:
+                        EventMesh.txt_log("auto stop_bp:44")
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        # if get_bp_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            blood_data = get_autoblood_value()
+                            if blood_data == None:
+                                blood_data[0] = 0
+                                blood_data[1] = 0
+
+                            max_value = blood_data[0]
+                            min_value = blood_data[1]
+                            if max_value != 0 and min_value != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop debug14")
+                    elif get_bg_state > 1:
+                        EventMesh.txt_log("auto stop_bg:44")
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        # if get_bg_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        if WEAR == 1:
+                            bgdata = get_blood_sugar_value()
+                            if bgdata == None:
+                                bgdata = 0
+                            if bgdata != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                        EventMesh.debug_log("stop debug15")
+                get_temp_state  = EventMesh.publish("get_temp_state")
+                if get_temp_state != None:
+                    if get_temp_state > 1:
+                        self.temp_one_state = 0
+                        self.temp_state = 0
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                        temp = self.optimize_temp(temp)
+                        EventMesh.txt_log("auto stop_temp:44")
+                        EventMesh.publish("set_temp_state",0)
+                        if WEAR == 1:
+                            tmp_f_tmp = 0
+                            tmp_d_tmp = 0
+                            if str(temp).find(".") != -1:
+                                tmp_f = str(temp).split('.')[0] 
+                                tmp_f_tmp = int(tmp_f)
+                                
+                                tmp_d = str(temp).split('.')[1][:1]
+                                tmp_d_tmp = int(tmp_d)
+                            else:
+                                tmp_f_tmp = temp
+                                
+                            if temp != None:
+                                if temp != 0:
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+            
+
+
+            hr_state = EventMesh.publish("get_hr_state")
+            spo2_state = EventMesh.publish("get_spo2_state")
+            temp_state  = EventMesh.publish("get_temp_state")
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_hr == None:
+                    auto_hr = 0
+                if hr_state == 1:
+                    if auto_hr != 0:
+                        self.auto_hr_count+=1
+                        if  self.auto_hr_count > 6:
+                            self.auto_hr_count = 0
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                            EventMesh.debug_log("stop debug7")
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish("play_hr_value",heart_value)
+                                # EventMesh.publish("set_history_hr_value",heart_value)
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+
+                            else:
+                                EventMesh.publish("play_hr_value",0) 
+                            
+                            
+
+                        else :
+                            if WEAR != 1:
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop debug7")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
+                                EventMesh.publish("play_hr_value",0) 
+                                
+                else:
+                    self.auto_hr_count = 0
+                    
+
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_spo2 == None:
+                    auto_spo2 = 0
+                if spo2_state == 1:#手动测试血氧
+                    if auto_spo2 != None:
+                        if auto_spo2 != 0:
+                            self.auto_spo2_count+=1
+                            if self.auto_spo2_count > 6:
+                                self.auto_spo2_count = 0
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop spo2 debug7")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish("play_spo2_value",spo2_value)
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                else:
+                                    EventMesh.publish("play_spo2_value",0)
+                            
+                            else:
+                                if WEAR != 1:
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug8")
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
+                                    EventMesh.publish("play_spo2_value",0) 
+                                    
+                else:
+                    self.auto_spo2_count = 0
+
+                if temp_state == 1:#手动测试体温
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
+                    if auto_temp == None:
+                        auto_temp = 0
+                    if auto_temp != None:
+                        if auto_temp != 0:
+                            self.auto_temp_count += 1
+                            if self.auto_temp_count > 6:
+                                self.auto_temp_count = 0
+                                EventMesh.debug_log("体温测量结束")
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                                temp = self.optimize_temp(temp)
+                                EventMesh.debug_log("temp",temp)
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        # EventMesh.publish("set_history_temp_value",temp)
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                    else:
+                                        # EventMesh.publish("set_history_temp_value",0)
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值
+                                
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                            else :
+                                if WEAR  != 1:
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug9")
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
+                                    EventMesh.publish("play_temp_value",0) 
+                                    
+                else:
+                    self.auto_temp_count = 0
+
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
+
+            usb_state = EventMesh.publish("get_usb")#
+            
+
+            if battery[0] == '1':
+                # EventMesh.debug_log("battery[1]",battery[1])
+                if self.vbat_full_flag <= 120:
+                    self.vbat_full_flag+=10
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
+                        if usb_state != 1:
+                            EventMesh.publish("set_usb",1)#
+                else:
+                    if battery[1] >= 100:
+                        if self.charge_full_count == 0:#充电已满
+                            EventMesh.publish("set_usb",3)#
+                            EventMesh.debug_log("charge R_CHARGE_full")
+                            self.charge_full_count = 1
+                    
+            else:
+                self.charge_full_count = 0
+                low_power = battery[1]
+                if low_power <= 5:#小于5%红色灯慢闪
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
+
+            
+            self.normal_alarm()
+            #喝水提醒
+            self.drink_alarm()
+            #该吃药了
+            self.medicine_alarm()
+            #该起床了
+            self.wakeup_alarm()
+            #该睡觉了
+            self.sleep_alarm()
+            #该回家了
+            self.home_alarm()
+            #该休息了
+            self.reset_alarm()
+
+
+            if self.alarm_flag == 0:
+                self.alarm_flag = 1
+                EventMesh.publish("set_rtc_alarm")
+
+        def clear_usb_flag(self,event,msg):
+            self.charge_full_count = 0
+        #普通闹钟
+        def normal_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.normal_oldtotalmin == 0:
+                self.normal_oldtotalmin = cur_total_min #549
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.normal_flag == 1:
+                    self.normal_flag = 0
+                    self.normal_count = 0
+            normal_alarm = []
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.normal_flag == 1:#表示闹钟响过清除标志
+                self.normal_count+=1
+                if self.normal_count > 6:
+                    self.normal_count = 0
+                    self.normal_flag = 0
+            if normal_alarm != None:
+                if len(normal_alarm) != 0 and normal_alarm != []:
+                    j = 0
+                    for i in range(len(normal_alarm)):
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
+                        normalalarm_hour = normal_alarm[j]["hour"]
+                        normalalarm_min = normal_alarm[j]["min"]
+                        normalalarm_day = normal_alarm[j]["day"]
+                        normalalarm_enale = normal_alarm[j]["enable"]
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if normalalarm_day == []:#单次闹钟只响一次
+                            if normalalarm_enale != 0:
+                                if cur_total_min > normalalarm_totalmin:
+                                    normal_alarm.pop(j)
+                                    self.normal_count = 0
+                                    self.normal_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                        self.normal_count = 0
+                                        self.normal_flag  = 0    
+                                        normal_alarm.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
+                                        break
+                        else:
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                    self.normal_flag  = 1
+                                    self.normal_count = 0
+                                    self.normal_oldtotalmin = normalalarm_totalmin
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
+                                    break
+                        j+=1
+
+
+        #喝水提醒
+        def drink_alarm(self):
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+        
+            if self.drink_time == 0:
+                self.drink_time = time_tmp
+            
+            on = EventMesh.publish("get_storage_config","drink_on")
+            time = EventMesh.publish("get_storage_config","drink_time")
+            # print("drink info2",on,time)
+            if on != None and time != None:
+                if on != 0 and time != 0:
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600
+                        self.drink_time = time_tmp 
+                        EventMesh.publish("drink_alarm_event")#该喝水了
+                        #该喝水了
+                else:
+                    self.drink_time = 0
+            else:
+                self.drink_time = 0
+
+        #吃药提醒
+        def medicine_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.medicine_oldtotalmin == 0:
+                self.medicine_oldtotalmin = cur_total_min #549
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.medicine_flag == 1:
+                    self.medicine_flag = 0
+                    self.medicine_count = 0
+            medicine = EventMesh.publish("get_storage_config","medicine")
+            # print("medicine info2",medicine,cur_total_min)
+            if self.medicine_flag == 1:#表示闹钟响过清除标志
+                self.medicine_count+=1
+                if self.medicine_count > 6:
+                    self.medicine_count = 0
+                    self.medicine_flag = 0
+            if medicine != None:
+                if len(medicine) != 0 and medicine != []:
+                    for i in range(len(medicine)):
+                        medicine_hour = medicine[i]["hour"]
+                        medicine_min = medicine[i]["min"]
+                        medicine_day = medicine[i]["day"]
+                        medicine_enale = medicine[i]["enable"]
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
+                        if medicine_day == []:
+                            if medicine_enale != 0:
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_count = 0
+                                    self.medicine_flag  = 1    
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
+                                    # print("medicine alarm1")
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
+                                    break
+                        else:
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_flag  = 1
+                                    self.medicine_count = 0
+                                    self.medicine_oldtotalmin = medicine_totalmin
+                                    # print("medicine alarm2",)
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+        #该起床了
+        def wakeup_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.wakeup_oldtotalmin == 0:
+                self.wakeup_oldtotalmin = cur_total_min #549
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.wakeup_flag == 1:
+                    self.wakeup_flag = 0
+                    self.wakeup_count = 0
+            wakeup = []
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志
+                self.wakeup_count+=1
+                if self.wakeup_count > 6:
+                    self.wakeup_count = 0
+                    self.wakeup_flag = 0
+            if wakeup != None:
+                if len(wakeup) != 0 and wakeup != []:
+                    j = 0
+                    for i in range(len(wakeup)):
+                        wakeup_hour = wakeup[j]["hour"]
+                        wakeup_min = wakeup[j]["min"]
+                        wakeup_day = wakeup[j]["day"]
+                        wakeup_enale = wakeup[j]["enable"]
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
+                        if wakeup_day == []:#单次闹钟只响一次
+                            if wakeup_enale != 0:
+                                if cur_total_min > wakeup_totalmin:
+                                    self.wakeup_count = 0
+                                    self.wakeup_flag  = 0    
+                                    wakeup.pop(j)
+                                    j=0#每次删除都从0开始遍历
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                    continue
+                                else:
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                        self.wakeup_count = 0
+                                        self.wakeup_flag  = 0    
+                                        wakeup.pop(j)
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                    self.wakeup_flag  = 1
+                                    self.wakeup_count = 0
+                                    self.wakeup_oldtotalmin = wakeup_totalmin
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该睡觉了
+        def sleep_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.sleep_oldtotalmin == 0:
+                self.sleep_oldtotalmin = cur_total_min #549
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.sleep_flag == 1:
+                    self.sleep_flag = 0
+                    self.sleep_count = 0
+            sleep = []
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.sleep_flag == 1:#表示闹钟响过清除标志
+                self.sleep_count+=1
+                if self.sleep_count > 6:
+                    self.sleep_count = 0
+                    self.sleep_flag = 0
+            if sleep != None:
+                if len(sleep) != 0 and sleep != []:
+                    j = 0
+                    count = int(len(sleep))
+                    for i in range(len(sleep)):
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
+                        sleep_hour = sleep[j]["hour"]
+                        sleep_min = sleep[j]["min"]
+                        sleep_day = sleep[j]["day"]
+                        sleep_enale = sleep[j]["enable"]
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if sleep_day == []:#单次闹钟只响一次
+                            if sleep_enale != 0:
+                                if cur_total_min > sleep_totalmin:
+                                    sleep.pop(j)
+                                    self.sleep_count = 0
+                                    self.sleep_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                        self.sleep_count = 0
+                                        self.sleep_flag  = 0    
+                                        sleep.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                    self.sleep_flag  = 1
+                                    self.sleep_count = 0
+                                    self.sleep_oldtotalmin = sleep_totalmin
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该回家了
+        def home_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.home_oldtotalmin == 0:
+                self.home_oldtotalmin = cur_total_min #549
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.home_flag == 1:
+                    self.home_flag = 0
+                    self.home_count = 0
+            home = ''
+            home = EventMesh.publish("get_storage_config","home_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.home_flag == 1:#表示闹钟响过清除标志
+                self.home_count+=1
+                if self.home_count > 6:
+                    self.home_count = 0
+                    self.home_flag = 0
+            if home != None:
+                if len(str(home)) != 0 and str(home) != '':
+                    # EventMesh.debug_log("home home 33",home)
+                    home_hour = int(str(home).split(":")[0])
+                    home_min = int(str(home).split(":")[1])
+                    
+                    home_totalmin = int(home_hour)*60+int(home_min)
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
+                        self.home_flag  = 1
+                        self.home_count = 0
+                        self.home_oldtotalmin = home_totalmin
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
+
+
+        
+        #该休息了
+        def reset_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.reset_oldtotalmin == 0:
+                self.reset_oldtotalmin = cur_total_min #549
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.reset_flag == 1:
+                    self.reset_flag = 0
+                    self.reset_count = 0
+            reset_alarm = []
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
+            if self.reset_flag == 1:#表示闹钟响过清除标志
+                self.reset_count+=1
+                if self.reset_count > 6:
+                    self.reset_count = 0
+                    self.reset_flag = 0
+            if reset_alarm != None:
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
+                    for i in range(len(reset_alarm)):
+                        # print("i",i)
+                        start_hour = int(reset_alarm[i]["start_hour"])
+                        start_min = int(reset_alarm[i]["start_min"])
+
+                        end_hour = int(reset_alarm[i]["end_hour"])
+                        end_min = int(reset_alarm[i]["end_min"])
+
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
+                        
+                        start_totalmin = int(start_hour)*60+int(start_min)
+                        end_totalmin = int(end_hour)*60+int(end_min)
+
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = start_totalmin
+                            EventMesh.publish("reset_alarm_event")#该休息了     
+                            break
+
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = end_totalmin
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
+                            break
+                                                                                                                                                                    
+
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+
+        def clear_reset_alarm(self,event,msg):#休息清除标志
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+        def clear_home_alarm(self,event,msg):#回家清除标志
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+        
+
+        def clear_wakeup_alarm(self,event,msg):#起床标识
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+        def clear_sleep_alarm(self,event,msg):#睡觉标识
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            
+
+
+        def get_sim_Status(self, event, msg):
+            return sim.getStatus()
+        def get_device_ope(self, event, msg):
+            """
+            获取设备运营商信息
+            :param event:
+            :param msg:
+            :return: 运营商
+            """
+            net_ope_map = {
+                "UNICOM": "中国联通HD",
+                "CMCC": "中国移动HD",
+                "CT": "中国电信HD"
+            }
+            """获取运营商"""
+            try:
+                short_eons = net.operatorName()[1]
+            except Exception:
+                return "无"
+            return net_ope_map.get(short_eons, None)
+
+        def get_signal(self, event=None, msg=None):
+            """
+            获取信号事件
+            :param event:
+            :param msg:
+            :return: int 类型
+            """
+            return net.csqQueryPoll()
+
+        def get_time_bucket(self, time):
+            if time < 12:
+                return '上午'
+            else:
+                return '下午'
+
+        def get_week(self, week):
+            if week == 1:
+                return '一'
+            elif week == 2:
+                return '二'
+            elif week == 3:
+                return '三'
+            elif week == 4:
+                return '四'
+            elif week == 5:
+                return '五'
+            elif week == 6:
+                return '六'
+            elif week == 7 or week == 0:
+                return '日'
+
+        def get_time(self, event=None, msg=None):
+            """
+            获取时间事件
+            :param event:
+            :param msg:
+            :return: HH:MM 格式
+            """
+            rtc_time = self.rtc.datetime()
+            
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
+            year = ("%04d年" % (rtc_time[0]))
+            week = ("星期%s"%(self.get_week(rtc_time[3])))
+            week_data = rtc_time[3]
+            time = [rtc_time[4], rtc_time[5]]
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
+            
+            result = [time, time_quantum, date , week,year,week_data]
+            #时分,上午下午,日期,星期,年 星期
+            return result
+
+        def get_step_count(self, event=None, msg=None):
+            """
+            获取步数
+            """
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            XYZ = self.gsensor.get_x_y_z()
+            tmp = 0
+            step =[0,0,0,0]
+            tmp =  self.gsensor.get_step() 
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
+            step[0]= tmp 
+            step[1] = XYZ[0]
+            step[2] = XYZ[1]
+            step[3] = XYZ[2]
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            return step
+
+        def get_ic_cid(self, event, msg):
+            """
+            获取ic cid事件
+            :param event:
+            :param msg:
+            :return: str ic cid
+            """
+            return sim.getIccid()
+
+        def get_phone_num(self, event, msg):
+            """
+            获取电话号码事件
+            :param event:
+            :param msg:
+            :return: str number
+            """
+            return sim.getPhoneNumber()
+
+        def get_battery(self, event=None, msg=None):
+            """
+            获取电池事件,暂时没支持
+            :param event:
+            :param msg:
+            :return:
+            """
+
+            charge_state = '0'
+            if self.get_usb_state() == 1:
+                charge_state = '1'
+            else:
+                charge_state = '0'
+
+            #temp = Power.getVbatt()
+            temp = EventMesh.publish("get_curr_battery_level")
+            vbat = EventMesh.publish("get_battery",temp)
+            if vbat == None:
+                vbat = 100
+            # EventMesh.debug_log("vbat",vbat)
+            # if temp != None :
+            #     if temp <= 3505:
+            #         vbat = 0 
+            #     elif temp <= 3699:
+            #         vbat = 20 #"E:/vbat_20.jpg"
+            #     elif temp <= 3772:
+            #         vbat = 40 #"E:/vbat_40.jpg"
+            #     elif temp <= 3882:
+            #         vbat = 60 #"E:/vbat_60.jpg"
+            #     elif temp <= 4070:
+            #         vbat = 80 #"E:/vbat_80.jpg"
+            #     elif temp <= 4200:
+            #         vbat = 90 #
+            #     else:
+            #         vbat = 100 #"E:/vbat_100.jpg"
+            # else:
+            #     vbat = 100
+
+            result = [charge_state, vbat]
+
+            return result
+        #Set the current average battery level
+        def set_curr_battery_level(self, event=None, msg=None):
+            self.curr_battery_level = msg
+        
+        def get_curr_battery_level(self, event=None, msg=None):
+            return self.curr_battery_level
+
+        def get_device_fw_version(self, *args):
+            '''
+            获取设备固件版本号
+            '''
+            fw_version = modem.getDevFwVersion()
+            if isinstance(fw_version, str):
+                return fw_version
+            return "--"
+
+        def get_standby_time(self, *args):
+            '''
+            获取设备单次开机待机时间
+            '''
+            time_msg = utime.time()
+            d = int(
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
+            time_msg -= (
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
+            h = int(time_msg / 3600)
+            time_msg -= (h * 3600)
+            m = int(time_msg / 60)
+            time_msg -= (m * 60)
+            s = time_msg
+            result = "{}天{}小时{}分".format(d, h, m)
+            return result
+
+        def set_key(self, topic, msg):
+            self.key = msg["value"]
+        def get_key(self, topic, msg):
+            return self.key
+
+        def get_imei(self, topic, msg):
+            if not self.imei:
+                self.imei = modem.getDevImei()
+            
+            # self.imei = "866610001011658" #860132060128634
+            return self.imei
+
+        def get_cid(self, topic, msg):
+            return self.cid
+
+        def set_cid(self, topic, msg):
+            self.cid = msg["value"]
+
+        def get_imsi(self, topic, msg):
+            if not self.imei:
+                self.imei = sim.getImsi()
+            return self.imsi
+
+        def get_password(self, topic, msg):
+            return self.password
+
+        def set_password(self, topic, msg):
+            self.password = msg["value"]
+
+        def set_ping(self, topic, msg):
+            self.PING = msg
+        def get_ping(self, topic, msg):
+            return self.PING
+
+        def set_connect(self, topic, msg):
+            #EventMesh.debug_log("set_connect:{}".format(msg))
+            self.connect = msg
+        def get_connect(self, topic, msg):
+            return self.connect
+
+        def start_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("start_blood_oxygen!!!")
+            self.hsensor.open_blood_oxygen()
+
+        def start_heart(self, topic, msg):
+            EventMesh.debug_log("start_heart!!!")
+            self.hsensor.open_heart()
+
+        def stop_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("stop_blood_oxygen!!!")
+            self.hsensor.close()
+
+        def stop_heart(self, topic, msg):
+            EventMesh.debug_log("stop_heart!!!")
+            self.hsensor.close()
+
+        def get_blood_oxygen(self, topic, msg):
+            data = self.hsensor.get_all_data()
+            return data[1]
+
+        def get_heart(self, topic, msg):
+            data = self.hsensor.get_all_data()
+            return data[0]
+        
+        def get_wear(self, topic, msg):
+            return self.hsensor.get_wear()
+        
+        def get_Hsensor(self, topic, msg):
+            return self.hsensor
+        
+        def Hsensor_set_sleep(self, topic, msg):
+            self.hsensor.set_sleep()
+
+        def start_temp(self, topic, msg):
+            EventMesh.debug_log("start_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            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):
+            EventMesh.debug_log("stop_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            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
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
+            #EventMesh.debug_log("temp_data:{}".format(r_data))
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))
+            temp_data = temp_s * 0.0625
+            EventMesh.debug_log("temp_data:{}".format(temp_data))
+            return temp_data
+    
+                
+
+        def sim_slot_get(self, topic=None, msg=None):
+            return sim.getCurSimid()
+
+        def sim_slot_switch(self, topic=None, slot=None):
+            """
+            sim 卡槽切换
+            :param topic:
+            :param slot:
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
+            """
+            if self.sim_slot_get() == slot:
+                return 1
+            else:
+                return sim.switchCard(slot)
+
+        def usb_event_cb(self, state):
+            status = state
+
+            if status == 1:#插入USB
+                EventMesh.debug_log("charge R_CHARGE_in")
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 1)#
+                pass
+            elif status == 0:#拨出usbs
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 2)#
+                EventMesh.debug_log("charge R_CHARGE_out")
+
+                
+                
+
+        
+
+        def get_usb_state(self):
+            state = self.usb.getStatus()
+            if state == -1:
+                state = 0
+            return state
+        
+
+    def wifiScan_cb(args):
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)
+            wifiScan.control(0)
+
+    class LocationManager(Abstract):
+
+        def __init__(self):
+            self.gps = None
+            #self.match = GPSMatch()
+            self.timer_read_GPS_info = osTimer()
+            self.wifi_data = []
+            self.gps_data  = {}
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.location_check_data_timer_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+            self.location_flag = 0
+            self.start_location_flag = 0
+            self.location_thread_id  = 0
+            self.location_queue = Queue(100)
+            self.lpm_fd = None
+            self.start_agps = 0
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
+            if read_data != None:
+                self.isOpenGNSS = read_data
+            else:#默认关闭GNSS
+                self.isOpenGNSS = "1"
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
+            if self.isOpenGNSS == None:
+                self.isOpenGNSS = "1"
+            if self.isOpenGNSS == "1":
+                if quecgnss.init() == -1:
+                    self.isOpenGNSS = "0"
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+                else:
+                    quecgnss.gnssEnable(0)
+        @staticmethod
+        def get_date():
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+        @staticmethod
+        def get_time():
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+        def post_processor_after_instantiation(self):
+            # _gps_cfg = {
+            #     "UARTn": UART.UART1,
+            #     "buadrate": 115200,
+            #     "databits": 8,
+            #     "parity": 0,
+            #     "stopbits": 1,
+            #     "flowctl": 0,
+            #     "PowerPin": Pin.GPIO2,
+            #     "StandbyPin": Pin.GPIO3,
+            #     "BackupPin": None,
+            #     "gps_mode": 0x01,
+            # }
+            # self.gps = GPS(**_gps_cfg)
+            # self.gps.power_switch(0)#关闭GPS
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)
+            
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+        def get_location_flag(self, event, msg):
+            return self.location_flag
+        def start_location(self, event, msg):
+            self.location_queue.put(msg)#测试类型入队
+            self.gps_data = {}
+            self.wifi_data = []
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.GSV_sig_ok_count = 0
+            EventMesh.debug_log("start_location:{}".format(msg))
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+5)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+            
+            self.location_flag = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            #self.gps_open(event, msg)
+
+
+        def start_location_test(self, event, msg):
+            EventMesh.debug_log("start_location_test")
+            
+            self.location_type = 1
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+4)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+        
+            self.location_timer_count = 0
+            self.location_flag = 1
+            #self.gps_open(event, msg)
+            self.location_type = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+    
+
+        def close_location(self, event, msg):
+            self.location_flag = 0
+            self.location_type = 0
+            self.timer_read_GPS_info.stop()
+
+            
+
+        def WIFI_INFO(self, event, msg):
+            self.wifi_data = msg
+            # EventMesh.debug_log("WIFI_INFO:")
+            # EventMesh.debug_log([msg[0],msg])
+
+        def WIFI_scan_open(self, event, msg):
+            #EventMesh.debug_log("WIFI_scan_open")
+            
+
+            if wifiScan.getState() == False :
+                self.wifi_data = []
+                wifiScan.control(1)
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数
+                wifiScan.asyncStart()
+                #EventMesh.debug_log("wifiScan.asyncStart")
+            else :
+                EventMesh.debug_log("WIFI_scan_open:error1") 
+        def gps_open(self, event, msg):
+            if self.isOpenGNSS == "1":
+                #EventMesh.debug_log("publish:gps_open")
+                #quecgnss.init()
+                quecgnss.gnssEnable(2)
+                #self.gps.__gps_nmea_data_clean()
+        def gps_close(self, event, msg):
+            if self.isOpenGNSS == "1":
+                quecgnss.gnssEnable(0)
+        def location_timer(self, *args, **kwargs):
+            
+            self.location_timer_count = self.location_timer_count +1
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1
+
+        def Location_send(self, msg) :
+            EventMesh.debug_log("Location_send1")
+            if self.location_queue.empty() == True:
+                return
+            EventMesh.debug_log("Location_send2")
+            while True:
+                if self.location_queue.empty() == False:
+                    TYPE = self.location_queue.get()
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+                    date = date[2:]
+                    #date = "180916,025723"
+                    GPS_type = "V"
+                    latitude = "0.000000,N"
+                    longitude = "0.000000,E"
+                    speed = "0.00"
+                    direction = "0.0"
+                    high = "100.0"
+                    number = "0"
+                    precision = "24"
+                    if msg[0] :#有GPS数据
+                        GPS_type = "A"
+                        # 纬度
+                        latitude = msg[0]["latitude"]
+                        # 经度
+                        longitude = msg[0]["longitude"]
+                        # 速度
+                        speed = msg[0]["speed"]
+                        # 方向
+                        direction = "0"
+                        if msg[0]["direction"] :
+                            direction = msg[0]["direction"]
+                        # 高度
+                        high = msg[0]["high"]
+                        high_tmp = high.split(".")
+                        if len(high_tmp) >= 2 :
+                            high = "%s"%(high_tmp[0])
+                        # 讯号质量:搜索到的卫星数目
+                        number = msg[0]["number"]
+                        precision = msg[0]["precision"]
+                        #date = msg[0]["date"]
+                    
+                    #gsm 信号强度
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+                    # 电池电量百分比 
+                    bat_tmp = EventMesh.publish("screen_get_battery")
+                    battery_caption =  str(bat_tmp[1])
+                    #步数
+                    old_step = 0
+                    step = 0
+                    step = EventMesh.publish("get_old_step_value")
+                    if step != 0:
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
+                        if tmp_data != None:
+                            old_step = tmp_data
+                        if old_step !=  step:
+                            EventMesh.publish("set_storage_config",["old_step",step])
+                            EventMesh.publish("set_storage_config",["old_step_new",step])
+                            
+                    old_step = step
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+                    #翻转次数
+                    turn_count = "0"
+                    #终端状态
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
+                        if len(TYPE)>= 2 :
+                            state = "%08X"%(TYPE[1])
+                    
+                    EventMesh.debug_log("state:{}".format(state))
+                    #基站数据
+                    CELL_num = len(msg[2])
+                    CELL_data = "1," #时延
+                    if msg[2] != []:
+                        for CELL in msg[2] :
+                            if CELL[0] == 0 :
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC
+                                CELL_data += str(CELL[3]) +","#MNC
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                            else :
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]
+                    #WIFI数据
+                    WIFI_num = 0 
+                    WIFI_data = ""
+                    if msg[1] :
+                        WIFI_num = msg[1][0]
+                        i = 0
+                        for MAC in msg[1][1] :
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                            i += 1
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+                    WIFI_data = WIFI_data.lower()
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+                    #定位数据
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+                    send_data+=",%s"%(precision)
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
+            
+                
+                    #EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
+                    if type(TYPE) == list:
+                        EventMesh.publish(TYPE[0],send_data)
+                    else:
+                        EventMesh.publish(TYPE,send_data)
+                else :
+                    break
+
+        def GxGGA_latitude(self, gga_data):
+            """Parse latitude from GGA"""
+            if gga_data:
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
+                if latitude_re:
+                    latitude = latitude_re.group(0)[1:-3]
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
+            return ""
+        def GxGGA_longitude(self, gga_data):
+            """Parse longitude from GGA"""
+            if gga_data:
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
+                if longitude_re:
+                    longitude = longitude_re.group(0)[1:-3]
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
+            return ""
+
+        def GxGGA_altitude(self, gga_data):
+            """Parse altitude from GGA"""
+            if gga_data:
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
+                if altitude_re:
+                    return altitude_re.group(0)[1:-3]
+            return ""
+        def location_thread(self):
+            
+            self.wifi_data = []
+            self.gps_data = {}
+            self.cell_data = []
+            gnss_r_data = []
+            self.GSV_sig_ok_count = 0
+            self.GSV_sig_very_ok_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            # if self.start_agps == 1: #开启agps
+            #     self.start_agps = 0
+            #     quecgnss.configSet(2,1)
+            if self.lpm_fd == None:
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
+            pm.wakelock_lock(self.lpm_fd)
+            EventMesh.debug_log("location_thread:1")
+            EventMesh.publish(constants.EVENT.GPSOPEN)
+            EventMesh.debug_log("location_thread:2")
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            EventMesh.debug_log("location_thread:3")
+            #utime.sleep_ms(1000)
+            self.location_timer_count = 0
+            #quecgnss.read(4096)#去掉第一次错误数据
+            #EventMesh.txt_log("START_LOCATION")
+            # pm.autosleep(0)#唤醒
+            # pm.sclkEx_set(0, 1, 5)
+            GSV_dict= {}
+            while self.location_flag == 1:
+                try :   
+                    
+                    match_gga_data = []
+                    #match_gsv_data = []
+                    gnss_r_data = []
+                    # if self.location_check_data_timer_count >= 3:
+                    #     pm.autosleep(0)#唤醒
+                    #     pm.sclkEx_set(0, 1, 5)
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
+                        self.location_check_data_timer_count = 0
+                        #EventMesh.debug_log(self.location_timer_count)
+                        GSV_dict= {}
+                        if self.isOpenGNSS == "1":                    
+                            #检查GNSS数据
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
+
+                                pass
+                                tmp_ok_count = 0
+                                tmp_very_ok_count = 0
+                                gsv_data = quecgnss.get_gsv()
+                                rmc_data = quecgnss.get_rmc()
+                                gga_data = quecgnss.get_gga()
+                                vtg_data = quecgnss.get_vtg()
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
+                                for i in range(len(gsv_data)) :
+                                    
+                                    if i % 2 == 0:
+                                        if i+1 >= len(gsv_data) :
+                                            # EventMesh.debug_log("gsv_data num error!!")
+                                            break
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
+                                        try:
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
+                                            if gsv_data[i+1] :
+                                                if (gsv_data[i+1])>=20:
+                                                    tmp_ok_count +=1   
+                                                if (gsv_data[i+1])>=30:
+                                                    tmp_very_ok_count +=1  
+                                                    
+                                        except Exception as e:
+                                            usys.print_exception(e)
+                                        
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):
+                                    self.GSV_sig_ok_count = tmp_ok_count
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
+                                match_rmc_data = rmc_data.split(",")
+                                if len (match_rmc_data)>3: #有rmc数据
+                                        if match_rmc_data[2] == 'A':    
+                                            match_gga_data = gga_data.split(",")
+                                            if len(match_gga_data) >4: #数据全
+                                                match_vtg_data = vtg_data.split(",")
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
+                                                latitude = "0,N" #纬度
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).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_rmc_data[4] )
+
+                                                longitude = "0,E"#经度
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).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_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
+                                                
+                                                high = "0"#高度
+                                                high = str(self.GxGGA_altitude(gga_data))
+                                                number = "0"#可用卫星
+                                                precision = "5.8"#精度
+                                                if len(match_gga_data)>5 :
+                                                    if match_gga_data[7]:
+                                                        number = match_gga_data[7]
+                                                    if match_gga_data[8]:
+                                                        precision = match_gga_data[8]
+                                                direction = "249.5" #方向
+                                                speed = '0.00'    #速度    
+                                                if(len(match_vtg_data)>5 ):
+                                                    if match_vtg_data[1]:
+                                                        direction =  match_vtg_data[1]
+                                                    if match_vtg_data[7]:    
+                                                        speed =  match_vtg_data[7]
+                                                self.gps_data = {
+                                                    "latitude": latitude,
+                                                    "longitude": longitude,
+                                                    "high": high,
+                                                    "direction": direction,
+                                                    "speed": speed,
+                                                    "number": number, 
+                                                    "date":  gps_date,
+                                                    "precision":  precision
+                                                }
+    # ***********************************************************************************
+
+
+                    #检查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)
+                
+                    #检查基站数据
+                    if self.cell_data == []:   
+                        data_tmp = net.getCellInfo()
+                        if(len(data_tmp)>=2):
+                            for cell in data_tmp:
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+                                    self.cell_data = cell
+                                    break
+
+                    if self.location_type == 1: #测试模式
+                        self.location_timer_count = 0
+                        
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
+                        if self.gps_data  != {} : #发送数据 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            
+
+                    elif self.location_type == 0: #正常模式     
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
+                            if self.location_queue.empty() == False:#有定位队列
+                                pass
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
+                                    self.start_agps = 1
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
+                            #upload_time = EventMesh.publish("get_upload_data")    
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            #if upload_time > 200  : 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
+                            #     self.location_timer_count = 0
+                            #     self.GSV_sig_ok_count = 0
+                                
+                            
+
+                            
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+
+                
+                    
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                utime.sleep_ms(500)
+
+            #self.timer_read_GPS_info.stop()
+            #self.gps.power_switch(0)
+            wifiScan.control(0)
+            EventMesh.publish(constants.EVENT.GPSCLOSE)
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
+            #     pm.autosleep(1)
+            #     pm.sclkEx_set(1, 1, 5)
+            if self.lpm_fd != None:
+                pm.wakelock_unlock(self.lpm_fd)
+            #pm.delete_wakelock(lpm_fd)
+            EventMesh.debug_log("CLOSE_LOCATION")
+            #EventMesh.txt_log("CLOSE_LOCATION")
+
+                    
+
+    class AddrBookManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            self.read_phonebook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
+                    self.read_phonebook = ujson.load(fd)
+                    EventMesh.debug_log("读取电话本")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_phonebook_list", self.get)
+            EventMesh.subscribe("set_phonebook_list", self.set)
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)
+
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+            return [self.check_json,self.read_phonebook]
+        
+        def call_phonebook_num(self, event, msg):
+            name = ''
+            key_tmp = ''
+            phone_num = int(msg)
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= phone_num:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
+                    key_tmp = phonebook_keys[phone_num-1]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))
+
+        def call_phonebook_one_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 1:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
+
+        def call_phonebook_two_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 2:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[1]]
+                    key_tmp = phonebook_keys[1]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
+        
+        def call_phonebook_three_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 3:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[2]]
+                    key_tmp = phonebook_keys[2]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
+
+        def set(self, event, msg):
+            self.check_json = msg[0]
+            self.read_phonebook = msg[1]
+
+    import sms
+    class MsgManager(Abstract):
+        # 短信
+        def __init__(self):
+            self.msg_nums = 0
+            self.msg_detail = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
+            # 可通过此push_addr_book_list主动推送
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
+
+        def get_msg_nums(self, event, msg):
+
+            self.msg_nums = sms.getMsgNums() 
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
+            return self.msg_nums
+        
+        def get_msg_detail(self, event, msg):
+            
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
+            return{
+                "小明":"有内鬼,停止交易",
+                "小红":"今晚十点一起吃饭"
+            }
+
+    class MsgdetailManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.msg_name = ""
+            self.msg_content = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)
+
+        def save_msg_name(self, event, msg): 
+            self.msg_name = str(msg)
+            EventMesh.debug_log("save_msg_name:msg".format(msg))
+        
+        def save_msg_content(self, event, msg):
+            self.msg_content = str(msg)
+            EventMesh.debug_log("save_msg_content:msg".format(msg))
+        
+        def get_msg_content(self, event, msg):
+            return self.msg_content
+
+        def get_msg_name(self, event, msg):
+            return self.msg_name
+
+    class CallLogManager(Abstract):
+        # 通话记录
+        def __init__(self):
+            self.read_call_log = {}
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
+                    self.read_call_log = ujson.load(fd)
+                    EventMesh.debug_log("读取通话记录")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_call_log_list", self.get)
+            EventMesh.subscribe("set_call_log_list", self.set)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+            return [self.check_json,self.read_call_log]
+
+        def set(self, event, msg):
+            return
+            self.check_json = msg[0]
+            self.read_call_log = msg[1]
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
+                ujson.dump(self.read_call_log,fd)
+        # def call_usr(self,event,msg):
+        #     content = self.log[msg]
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])
+
+
+
+    class PhoneCallingManager(Abstract):
+        def __init__(self):
+            self.phonenum = ""
+            self.phonename = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)
+            EventMesh.subscribe("get_phonename", self.get_phonename)
+            EventMesh.subscribe("save_phonename", self.save_phonename)
+
+        def get_phonename(self, event, msg): 
+            return self.phonename
+
+        def save_phonename(self, event, msg): 
+            self.phonename = str(msg)
+
+        def save_phonenum(self, event, msg): 
+            self.phonenum = str(msg)
+        
+        def get_phonenum(self, event, msg):
+            return self.phonenum
+
+    #获取心率 血氧 步数历史数据
+    class gethistoryDataManager(Abstract):
+        def __init__(self):
+            self.oldHr = 0
+            self.oldspo2 = 0
+            self.oldstep = 0
+            self.old_step = 0
+            self.read_histroy_hr_data = []
+            self.read_histroy_temp_data = []
+            self.read_histroy_spo2_data = []
+
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")
+            if oldHr != None:
+                self.oldHr = oldHr  
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
+            if old_spo2 != None:
+                self.oldspo2 = old_spo2 
+            old_step  = EventMesh.publish("get_storage_config","old_step")    
+            if old_step != None:
+                self.oldstep = old_step
+
+
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
+            if check_hr == True :
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
+                    self.read_histroy_hr_data = ujson.load(fd)
+            
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
+            if check_temp == True :
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
+                    self.read_histroy_temp_data = ujson.load(fd)
+
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
+            if check_spo2 == True :
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
+                    self.read_histroy_spo2_data = ujson.load(fd)
+            self.temp_value = 0
+            
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
+
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
+
+
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
+
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
+
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
+
+        
+
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
+            return self.read_histroy_spo2_data
+
+        def set_history_spo2_value(self, event, msg): 
+            pass
+
+
+
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
+            return self.read_histroy_temp_data
+
+        def set_history_temp_value(self, event, msg): 
+            self.temp_value = msg
+            if self.temp_value > 0:
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_temp_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_temp_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_temp_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
+                # else:
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
+
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_temp_data,fd)
+                #EventMesh.debug_log(self.read_histroy_temp_data)
+                pass
+            else:
+                pass
+
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
+            return self.read_histroy_hr_data
+
+        def set_history_hr_value(self, event, msg): 
+            pass
+                
+            
+
+        def save_hr_value(self, event, msg): 
+            if msg >= 50:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                self.oldHr = msg
+                
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if len(self.read_histroy_hr_data) >= 7:
+                    sort_new = {}
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                    EventMesh.debug_log(sort_new)
+                    for i in range(len(self.read_histroy_hr_data)-1):
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                        self.read_histroy_hr_data[i] = sort_new[i]
+                        pass
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
+                else:
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
+
+
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
+                    ujson.dump(self.read_histroy_hr_data,fd)
+                pass
+            else:
+                
+                pass
+
+
+        def get_hr_value(self, event, msg): 
+            return self.oldHr
+
+        def save_spo2_value(self, event, msg): 
+            if msg >= 85:
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])
+                # self.oldspo2 = msg
+
+
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_spo2_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_spo2_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_spo2_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
+                # else:
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
+
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_spo2_data,fd)
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)
+                #播放语音
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功
+                pass
+            else:
+                pass
+                pass
+
+        def get_spo2_value(self, event, msg): 
+            return self.oldspo2
+        
+        def set_old_step_value(self, event, msg): 
+            self.oldstep = msg
+            EventMesh.publish("set_storage_config",["old_step",msg])
+            
+            
+        def get_old_step_value(self, event, msg): 
+            step = EventMesh.publish(constants.EVENT.GET_STEP)
+            self.old_step = self.oldstep + step[0]
+            return self.old_step
+    #获取旧的时间戳
+    class getOldTimeManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.time_sec = 0
+            self.time_step = 0
+            self.step_second = 0
+            tmp_data = EventMesh.publish("get_storage_config","old_time")
+            if tmp_data !=None :
+                self.time_sec = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")
+            if tmp_data !=None :
+                self.time_step = tmp_data[0]
+                self.step_second = tmp_data[1]
+
+            
+            
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
+
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
+
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)
+
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)
+
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)
+
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)
+
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)
+
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)
+
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)
+
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)
+        
+
+        def set_test_data1(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state1",msg])
+
+        
+        def set_test_data2(self, event, msg):
+            
+            EventMesh.publish("set_storage_config",["clear_state2",msg])
+
+
+        def set_test_data3(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state3",msg])
+
+        def set_test_data4(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state4",msg])
+
+        def set_test_data5(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state5",msg])
+
+        def set_test_data6(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state6",msg])
+
+        def set_test_data7(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state7",msg])
+
+        def set_test_data8(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state8",msg])
+
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
+        # print(f.read())
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+        def get_old_time_data(self, event, msg):
+            return self.time_sec
+        
+        
+
+        def set_old_time_data(self, event, msg):
+            self.time_sec = msg
+            EventMesh.publish("set_storage_config",["old_time",msg])
+
+        def set_old_step_data(self, event, msg):
+            self.time_step = msg[0]
+            self.step_second = msg[1]
+            EventMesh.publish("set_storage_config",["clear_state",msg])
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+
+            
+        
+
+    class getWeatherDataManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.date = {} #日期23-04-07
+            self.time = {} #14:41:41
+            self.content = {} #天气描述 
+            self.type = None #天气类型
+            self.temp = None #当前温度
+            self.min_temp = None #最低温度
+            self.max_temp = None #最高温度
+            self.city = {} #城市
+            self.no_data = 0#0沒有数据 1有数据
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_weather_data", self.get)
+            EventMesh.subscribe("set_weather_data", self.set)
+
+        def get(self, event, msg):
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
+
+        def set(self, event, msg):
+            self.date = msg[0]
+            self.time = msg[1]
+            self.content = msg[2]
+            self.type = msg[3]
+            self.temp = msg[4]
+            self.min_temp = msg[5]
+            self.max_temp = msg[6]
+            self.city = msg[7]
+            self.no_data = msg[8]
+
+
+    class getHrTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
+            self.set_spo2 = 0
+            self.open_btn = 0
+            if EventMesh.platform == "gewu":
+                self.set_time = 10*60
+                self.open_btn = 1
+            self.set_bgautotime = 0
+            self.bgauto_btn = 0
+            read_data = EventMesh.publish("get_storage_config","measure_time")
+            if read_data != None:
+                self.set_time = read_data  
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
+                    
+            if read_data != None:
+                self.open_btn = read_data   
+
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")
+            if read_data != None:
+                self.set_bgautotime = read_data  
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
+                    
+            if read_data != None:
+                self.bgauto_btn = read_data   
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
+
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
+
+        def set_bgauto_time(self, event, msg): 
+            self.bgauto_btn = msg[0]
+            self.set_bgautotime = msg[1]
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
+
+        def get_bgauto_time(self, event, msg): 
+            if self.bgauto_btn == None:
+                self.bgauto_btn = 0
+            if self.set_bgautotime == None:
+                self.set_bgautotime = 0
+            return [self.bgauto_btn,self.set_bgautotime]
+        
+
+        def set_time_hr(self, event, msg): 
+            self.open_btn = msg[0]
+            self.set_time = msg[1]
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
+
+        def get_time_hr(self, event, msg): 
+            return [self.open_btn,self.set_time]
+
+        def set_hr_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+            self.set_hr = msg
+            if self.set_hr == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_hr_state(self, event, msg): 
+            return self.set_hr
+        
+        def set_spo2_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
+            self.set_spo2 = msg
+            if self.set_spo2 == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_spo2_state(self, event, msg): 
+            return self.set_spo2
+        
+    #体温
+    class getTempTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.get_temp = 0
+            read_data = EventMesh.publish("get_storage_config","temp_time")
+
+            if read_data != None:
+                self.set_time = read_data
+
+            self.get_bgstate = 0
+            self.get_bpstate = 0
+
+            self.bptime_on = 0
+            self.bptime_time = 0
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
+            if read_data != None:
+                self.bptime_on = read_data
+
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")
+            if read_data != None:
+                self.bptime_time = read_data
+
+            self.spo2time_on = 0
+            self.spo2time_time = 0
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
+            if read_data != None:
+                self.spo2time_on = read_data
+
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
+            if read_data != None:
+                self.spo2time_time = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)
+
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)
+
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)
+
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)
+
+
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)
+
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
+
+            
+        def set_bg_state(self, event, msg): 
+            self.get_bgstate = msg
+            if self.get_bgstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bg_state(self, event, msg): 
+            if self.get_bgstate:
+                return self.get_bgstate
+            else :
+                return 0
+
+        def set_spo2_time(self, event, msg): 
+            self.spo2time_on = msg[0]
+            self.spo2time_time = msg[1]
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
+
+
+        def get_spo2_time(self, event, msg): 
+            
+            return [self.spo2time_on,self.spo2time_time]
+
+
+        def set_bp_time(self, event, msg): 
+            self.bptime_on = msg[0]
+            self.bptime_time = msg[1]
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
+
+        def get_bp_time(self, event, msg): 
+            if self.bptime_on == None:
+                self.bptime_on = 0
+            if self.bptime_time == None:
+                self.bptime_time = 0
+            return [self.bptime_on,self.bptime_time]
+        
+            
+        def set_bp_state(self, event, msg): 
+            self.get_bpstate = msg
+            if self.get_bpstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bp_state(self, event, msg): 
+            if self.get_bpstate:
+                return self.get_bpstate
+            else :
+                return 0
+
+
+        def set_temp_time(self, event, msg): 
+            self.set_time = msg
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
+
+        def get_temp_time(self, event, msg): 
+            return self.set_time
+        
+        def set_temp_state(self, event, msg): 
+            self.get_temp = msg
+            if self.get_temp == 0:
+                EventMesh.publish("clear_temp_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_temp_state(self, event, msg): 
+            return self.get_temp
+            
+    class getBrightnessManager(Abstract):#获取亮度级别
+        def __init__(self):
+            self.level = 6#默认值6
+            # self.read_data = {}
+            self.time = 5
+            self.PWM_backlight  = None
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
+            EventMesh.subscribe("push_add_brightness_level", self.add)
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
+
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
+
+        def set_brightness_level(self, event, msg): 
+            self.level = msg
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+        def get_brightness_level(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_level")
+            if tmp != None:
+                self.level = tmp
+            return self.level
+        
+        def set_brightness_time(self, event, msg): 
+            self.time = msg
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
+        
+        def get_brightness_time(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_time")
+            if tmp != None:
+                self.time = tmp
+            return self.time
+        
+
+
+        def add(self, event, msg):
+            if self.level < 10:
+                self.level = self.level + 2
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+
+        def reduce(self, event, msg):
+            # if self.level > 0:
+            #     self.level = self.level - 2
+            # if self.level <= 0:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
+            # else:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
+
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+        
+        
+    class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+    #定位频率
+    class getUpLoadDataManager(Abstract):#
+        def __init__(self):
+            self.upload_time = 2*60*60
+            if EventMesh.platform == "gewu":
+                self.upload_time = 10*60
+
+            read_data = EventMesh.publish("get_storage_config","upload_time")
+            if read_data != None:
+                self.upload_time = read_data 
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)
+
+        def set_upload_data(self, event, msg): 
+            self.upload_time = msg
+
+        def get_upload_data(self, event, msg): 
+            if self.upload_time == None:
+                if EventMesh.platform == "gewu":
+                    self.upload_time = 10*60
+                else:
+                    self.upload_time = 2*60*60
+            return self.upload_time 
+
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
+        def __init__(self):
+            self.play = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)
+
+        def set_audio_state(self, event, msg): 
+            self.play = msg
+
+        def get_audio_state(self, event, msg): 
+            return self.play
+        
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
+        def __init__(self):
+            self.volume_size = 8
+            read_data = EventMesh.publish("get_storage_config","volum")
+            if read_data != None:
+                self.volume_size = read_data
+        
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)
+
+        def set_volum_size(self, event, msg): 
+            self.volume_size = msg
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
+
+        def get_volum_size(self, event, msg): 
+            return self.volume_size
+
+    class getSosFlagManager(Abstract):#设置sos
+        def __init__(self):
+            self.aud = audio.Audio(0)
+            self.sos_flag = 0
+            self.sos_num = 0
+            self.hangup_mode = 0
+            self.call_timer = osTimer()
+            self.sos_numer1 = []
+            self.callnumer =""
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
+            if SOS_NUMBER1 != None:
+                self.sos_numer1 = SOS_NUMBER1
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
+            if SOS_NUMBER2 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
+
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
+            if SOS_NUMBER3 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
+
+
+        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("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
+
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
+
+            EventMesh.subscribe("close_call_time",self.close_call_time)
+
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
+
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
+            return self.hangup_mode
+        
+        def set_hangup_mode(self, event, msg): 
+            self.hangup_mode = msg
+
+        def set_sos_flag(self, event, msg): 
+            self.sos_flag = msg
+        
+            if self.sos_flag == 1:
+                number = EventMesh.publish("get_dial_sos_number")
+            
+                if number != None:
+                    if len(number) > 0:
+                        self.call_timer.stop()
+                        EventMesh.publish("save_phonename",number[0])
+                        EventMesh.publish("save_phonenum",number[0])
+                        EventMesh.publish("set_sos_num",0)
+                        phone_num = EventMesh.publish("get_phonenum")  
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+                    else:
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
+
+        def set_callnumer_cb(self, event, msg):
+            if self.sos_flag == 1:
+                self.callnumer = msg
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+
+        def call_timer_cb(self, *args, **kwargs):
+            if self.sos_flag == 1:
+                EventMesh.publish("save_phonename",str(self.callnumer))
+                EventMesh.publish("save_phonenum",str(self.callnumer))
+                phone_num = EventMesh.publish("get_phonenum")  
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+        
+        def close_call_time(self, event, msg): 
+            self.call_timer.stop()
+
+        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
+            
+
+        def get_dial_sos_number(self, event, msg): 
+            return self.sos_numer1
+    class getLowBatManager(Abstract):#低电提醒
+        def __init__(self):
+
+            self.low_btn = 0
+            read_data = EventMesh.publish("get_storage_config","low_on")
+            if read_data != None:
+                self.low_btn = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
+
+        def set_low_bat_btn(self, event, msg): 
+            self.low_btn = msg
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
+
+        def get_low_bat_btn(self, event, msg): 
+            return self.low_btn
+        
+
+
+    class playPowerAudioManager(Abstract):#播放开关机音频文件
+        def __init__(self):
+            self.aud = audio.Audio(0)
+
+        def post_processor_after_instantiation(self):
+            
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
+
+        def play_poewr_on_event(self, event, msg): 
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
+
+        def play_poewr_off_event(self, event, msg): 
+            self.aud.setVolume(11)
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
+        
+    class getBootOffManager(Abstract):#开关机时间
+        def __init__(self):
+            self.poweroff_time = []
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
+            if read_data != None:
+                self.poweroff_time = read_data
+            else:
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
+            
+
+
+        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 set_boot_off_time(self, event, msg): 
+            EventMesh.debug_log("set_boot_off_time",msg)
+
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
+            self.poweroff_time = msg
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def get_boot_off_time(self, event, msg):
+            return self.poweroff_time
+    class setSmsIndexManager(Abstract):#
+        def __init__(self):
+            self.index = -1
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)
+
+        def set_sms_index(self, event, msg): 
+            self.index = msg
+            
+
+        def get_sms_index(self, event, msg):
+            
+            return self.index
+    import protocol 
+    class testSmsSetIPManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+            #大锤
+            severdata = protocol.server_init()
+
+            self.newip = severdata[0]
+            self.newcom = severdata[1]
+            self.new_key = severdata[2]
+            self.new_pid = severdata[3]
+            
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
+
+            self.server_sate = 0
+
+
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            if tmp_data != None:
+                self.newip = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_data != None:
+                self.newcom = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
+            if tmp_data != None:
+                self.newmd5 = tmp_data    
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
+            if tmp_data != None:
+                self.new_key = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
+            if tmp_data != None:
+                self.new_pid = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
+            if tmp_data != None:
+                self.server_sate = tmp_data 
+            
+            
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
+
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
+            EventMesh.subscribe("get_ip", self.get_ip)
+
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
+            EventMesh.subscribe("get_com", self.get_com)
+
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
+
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
+
+            EventMesh.subscribe("set_server_state", self.set_server_state)#
+            EventMesh.subscribe("get_server_state", self.get_server_state)#
+
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
+
+
+
+        def set_new_key_cb(self, event, msg): 
+            self.new_key = msg
+            # print("set_new_key_cb",msg,self.new_key)
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
+
+        def get_new_key_cb(self, event, msg):
+            # print("get_new_key_cb",self.new_key)
+            return self.new_key
+        
+        def set_new_pid_cb(self, event, msg): 
+            self.new_pid = msg
+            # print("set_new_pid_cb",msg,self.new_pid)
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
+
+        def get_new_pid_cb(self, event, msg):
+            # print("get_new_pid_cb",self.new_pid)
+            return self.new_pid
+
+        def set_new_ip_com(self, event, msg): 
+            self.newip = str(msg[0])
+            self.newcom = int(msg[1])
+            # self.newmd5 = str(msg[2])
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
+
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
+        
+
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+
+            number = str(msg[2])
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+            
+        def fun(self,*argc):
+            Power.powerRestart()
+
+        def get_new_ip_com(self, event, msg):
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_addr != None:
+                self.newip = tmp_addr
+            if tmp_com != None:
+                self.newcom = tmp_com
+            return [self.newip,self.newcom]
+        
+        def set_ip(self, event, msg): 
+            self.newip = msg
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+
+        def get_ip(self, event, msg):
+            # print("get_ip",self.newip)
+            return self.newip
+        
+        def set_com(self, event, msg): 
+            self.newcom = msg
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+        def get_com(self, event, msg):
+            # print("get_com",self.newcom)
+            return self.newcom
+
+        def get_new_key_pid(self, event, msg):
+            return [self.new_key,self.new_pid]
+        
+        def set_server_state(self, event, msg):
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])
+            self.server_sate = msg
+
+        def get_server_state(self, event, msg):
+            return self.server_sate
+            
+
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
+    # Build:07-07-2022 16:12:58
+    # IMEI:861218001025267
+    # IP:api.xcloudtech.com
+    # PORT:9000
+    # UPLOAD:300
+    # Battery:3948, 64
+    # Udebug: 0
+    # ConnectTime: 7
+    import protocol
+
+    class sendDevinfoManager(Abstract):#发送设备信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
+
+        def send_devinfo_event(self, event, msg): 
+            number = str(msg)
+            versions = EventMesh.softversion
+            Build = EventMesh.builTime
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
+            IP = ""
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            new_com = EventMesh.publish("get_storage_config","set_new_com")
+            server_data = protocol.server_init()
+        
+            if new_ip != None:
+                if len(str(new_ip)) != 0:
+                    IP = new_ip
+                else:
+                    IP = server_data[0]
+            else:
+                IP = server_data[0]
+            
+            PORT = ''
+            if new_com != None:
+                if len(str(new_com)) != 0:
+                    PORT = str(new_com)
+                else:
+                    PORT = str(server_data[1])
+            else:
+                PORT = str(server_data[1])
+            
+            UPLOAD = EventMesh.publish("get_upload_data")
+
+            level = EventMesh.publish("get_curr_battery_level")
+            if level == None:
+                level = 4200
+            bat = EventMesh.publish("screen_get_battery")[1]
+            if bat == None:
+                bat = 100
+            Battery = str(level) +',' +  str(bat)
+
+            ConnectTime = 0
+            
+            if EventMesh.platform == "gewu":
+                ConnectTime = gheartbeat_time//60
+            else:
+                ConnectTime = heartbeat_time//60
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)
+
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
+            
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
+
+            send_state1 = -1
+            send_state2 = -1
+            # print("data",data1,data2,data3)
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
+
+            if send_state1 == 0:
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
+
+            if send_state2 == 0:
+                sms.sendPduMsg(number, data3, 'UCS2')
+            
+
+    class deleteSmsManager(Abstract):#删除信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
+
+        def delete_sms_event(self, event, msg): 
+            self.timer.start(4*1000,0,self.fun)
+            
+        def fun(self, *argc): 
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+
+        def remove_all_sms_cb(self, event, msg):
+            sms.deleteMsg(1,4)
+
+    #闹钟信息
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
+    #用于显示闹钟列表不包含开关机信息
+
+    class ClockManager(Abstract):
+        def __init__(self):
+            super().__init__()
+            self.rtc = RTC()
+            self.days = 0
+            self.idx = 0
+
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            self.check_alarm_list = []     
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    self.check_alarm_list = ujson.load(fd)
+            
+            EventMesh.subscribe("push_clock_info", self.set)
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
+            EventMesh.subscribe("add_alarm", self.add_alarm)
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
+
+        def post_processor_after_instantiation(self):
+        
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+        
+        def update_show_info(self,event,msg):
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+
+        def get_check_alarm_list(self, event, msg):
+            alarm_len = 0
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            alarm_len = len(alarm_list)
+            return alarm_len
+
+
+        def set(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("msg = {}".format(msg))
+            idx = msg.get("idx")
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
+            alarm_list[idx]["hour"] = msg["hour"]
+            alarm_list[idx]["minute"] = msg["minute"]
+            alarm_list[idx]["days"] = msg["days"]
+            alarm_list[idx]["enabled"] = msg["enabled"]
+            alarm_list[idx]["repeart"] = msg["repeart"]
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+        def read_alarminjson(self, event, msg):
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            global alarm_list     
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    alarm_list = ujson.load(fd)
+
+            
+            # read_data = EventMesh.publish("get_storage_config","off_on")
+
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
+            # min1 = str(alarm_list[0]["minute"])
+
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
+            # min2 = str(alarm_list[1]["minute"]) 
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
+
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
+
+            
+            return alarm_list
+
+        def add_alarm(self, event, msg):
+
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            EventMesh.debug_log("msg:{}".format(msg))
+            for i in range(0,2):#开关机固定是 idx 0 1
+                off_msg1 = msg[i+1]
+                msg_tmp1 = off_msg1.split(':')
+                start_hour = int(msg_tmp1[0])
+                start_min = int(msg_tmp1[1])
+                enable = int(msg[0])
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
+
+                alarm_list[i]["idx"]=i
+                alarm_list[i]["hour"]=start_hour
+                alarm_list[i]["minute"]=start_min
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
+                alarm_list[i]["enabled"]=enable
+                alarm_list[i]["repeart"]=10
+
+
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
+
+            
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+            EventMesh.publish("push_update_alarm_show")
+            
+        
+                
+            
+
+
+        def remove_alarm(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)
+            idx = msg.get("idx")
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
+
+            for i, alarm in enumerate(alarm_list):
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
+
+                if alarm["idx"] == idx:
+                    del alarm_list[i]
+                    EventMesh.debug_log("delete_here3-----",alarm_list)
+
+                    #删除闹钟后,对idx重新排序
+                    if alarm_list:
+                        for j in range(i,len(alarm_list)):
+                            alarm_list[j]["idx"] -= 1
+                            EventMesh.debug_log("delete_here4-----",alarm_list)
+
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+
+        def get_alarm_indx(self,event,msg):
+            return self.idx
+
+        def _rtc_callback(self,args):
+            #设置下一个闹钟,定时开关机功能
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+
+                rtc_now_time = self.rtc.datetime()
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
+                end_min_total = end_hour*60+end_min
+                next_minute = start_hour*60+start_min #10:11
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
+                if off_on != None:
+                    if off_on == 1:
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
+                            ubs_state = EventMesh.publish("get_usb")#'
+                            
+                            if ubs_state == 2 or ubs_state == 0:
+
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
+                                    interval_minute = next_minute - current_minute
+                                    
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
+                                else:#8:00 9:00
+                                    #7*60*24 7天一个周期 7*60*24 - 
+                                    interval_minute = next_minute + (24*60-current_minute)
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
+
+                                #反向获取时间戳
+                                time = utime.localtime()
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
+                                rtc_mktime = utime.mktime(time)-time[5]
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
+
+                                #加上下一次响铃需要的时间
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
+
+                                #格式化时间戳,得到下一次闹钟的时间
+                                next_alarm_time = utime.localtime(next_alarm_mktime)
+                                EventMesh.debug_log("开机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)
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
+                                
+                                self.rtc.register_callback(self._rtc_callback)
+
+                                FLAG = self.rtc.set_alarm(data_e)
+                                if FLAG == 0:
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
+                                else:
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
+                                self.rtc.enable_alarm(1)
+                                
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
+                                EventMesh.publish("open_power_on", 5)#静音关机
+                                return
+                            else:
+                                EventMesh.publish("set_rtc_alarm")
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
+                                return
+                
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def set_rtc_alarm(self,event,msg):
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+                if off_on == 1:
+                    next_minute = start_hour*60+start_min #10:11
+
+                    start_total = start_hour*60+start_min #10:11
+                    end_total = end_hour*60+end_min #10:11
+                    rtc_now_time = self.rtc.datetime()
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
+
+
+                    minute_list = []
+                    if start_total != current_minute:
+                        minute_list.append(start_total)#23*60=
+                    if end_total != current_minute:
+                        minute_list.append(end_total)
+                    minute_list.append(current_minute)#[927,927,930]
+                    minute_list = sorted(minute_list)
+                    current_index = minute_list.index(current_minute)
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
+                    
+                    
+                    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("08下一个闹钟的分钟数:", next_minute)
+
+                    print("minute_list1",minute_list,current_index,next_minute)
+                    if next_minute > current_minute:
+                        interval_minute = next_minute - current_minute
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
+                    else:
+                        interval_minute = (24*60 - current_minute) + next_minute
+                        print("10距离下一次响铃的的分钟数:", interval_minute)
+
+
+                    #反向获取时间戳
+                    time = utime.localtime()
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
+                    time
+                    rtc_mktime = utime.mktime(time)-time[5]
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
+
+                    #加上下一次响铃需要的时间
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
+
+                    #格式化时间戳,得到下一次闹钟的时间
+                    next_alarm_time = utime.localtime(next_alarm_mktime)
+                    EventMesh.debug_log("关机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)
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
+                    
+                    self.rtc.register_callback(self._rtc_callback)
+
+                    FLAG = self.rtc.set_alarm(data_e)
+                    if FLAG == 0:
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
+                    else:
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
+                    self.rtc.enable_alarm(1)
+                else:
+                    self.rtc.enable_alarm(0)
+                    
+
+    class schoolclassManager(Abstract):#
+        def __init__(self):
+            # ['火星情报局', '一年级二班', '柠檬茶']
+            self.school_name = ''
+            self.class_name = ''
+            self.full_name = ''
+            tmp_data = EventMesh.publish("get_storage_config","school_name")
+            if tmp_data != None:
+                self.school_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","class_name")
+            if tmp_data != None:
+                self.class_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","full_name")
+            if tmp_data != None:
+                self.full_name = tmp_data    
+
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#
+            EventMesh.subscribe("get_schoolname", self.get_school_name)
+
+            EventMesh.subscribe("set_classname", self.set_classname)#
+            EventMesh.subscribe("get_classname", self.get_classname)
+
+            EventMesh.subscribe("set_fullname", self.set_full_name)#
+            EventMesh.subscribe("get_fullname", self.get_full_name)
+
+        def set_school_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.school_name = str(msg)
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
+            
+
+        def get_school_name(self, event, msg):
+            if self.school_name:
+                return self.school_name
+            else:
+                return None
+        
+        def set_classname(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.class_name = str(msg)
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
+                
+            
+        def get_classname(self, event, msg):
+            if self.class_name:
+                return self.class_name
+            else:
+                return None
+        def set_full_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.full_name = str(msg)
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
+
+        def get_full_name(self, event, msg):
+            if self.full_name:
+                return self.full_name
+            else:
+                return None
+    
+    import fota
+    class firwDownloadManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("firware_download", self.firware_download)#
+
+        def firware_download(self, event, msg): 
+            number = str(msg)
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+
+        def fun(self,*argc):
+            fota_obj = fota()
+            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr_d15.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/mgr_d15.py
new file mode 100644 (file)
index 0000000..eb9ddec
--- /dev/null
@@ -0,0 +1,5450 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import usocket
+import ql_fs
+import ujson
+import _thread
+import modem
+import utime
+import sim
+import net
+import dataCall
+import checkNet
+import osTimer
+import constants
+import sms
+from common import Lock, Abstract, LogAdapter
+#from location import GPS, GPSMatch,CellLocator
+from misc import USB, Power, ADC
+from machine import ExtInt, Pin,Timer,RTC,UART
+import EventMesh
+import usys
+import audio
+from machine import I2C
+
+import pm
+import ure
+import urandom
+  
+from machine import RTC
+import quecgnss
+import wifiScan
+import math
+import voiceCall
+from misc import PWM
+from queue import Queue
+if EventMesh.model == "D15":
+    from led_d15 import led_mode,open_led_green,close_led_green,open_led_red,close_led_red,close_led_white
+    heartbeat_time = 7*60 #心跳时间
+
+    def get_autoblood_value():#血压值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_Maxvalue = 0
+        blood_Minvalue = 0
+        if hour >= 6 and hour <= 10:
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 120+random_numMax
+            blood_Minvalue = 75+random_numMin
+
+            print("get_autoblood_value 6 -10",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 10 and hour <= 14:#10-14(10,14]
+            random_numMax = urandom.randint(0, 20)
+            random_numMin = urandom.randint(0, 25)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 10 -14",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 14 and hour <= 18:#14-18
+            random_numMax = urandom.randint(0, 25)
+            random_numMin = urandom.randint(0, 15)
+            blood_Maxvalue = 115+random_numMax
+            blood_Minvalue = 70+random_numMin
+
+            print("get_autoblood_value 14 -18",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif hour > 2 and hour < 6:#2-6
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalu = 105+random_numMax
+            blood_Minvalue = 65+random_numMin
+
+            
+            print("get_autoblood_value 2 -6",blood_Maxvalue,blood_Minvalue)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        else:#18-2 19 20 21 22 23 1 2
+            random_numMax = urandom.randint(0, 30)
+            random_numMin = urandom.randint(0, 20)
+            blood_Maxvalue = 100+random_numMax
+            blood_Minvalue = 60+random_numMin
+            print("get_autoblood_value 18 -2",blood_Maxvalue,blood_Minvalue)
+        return [blood_Maxvalue,blood_Minvalue]
+
+    def get_blood_sugar_value():#血糖值
+        data = RTC().datetime()
+        hour = int(data[4])
+        blood_sugar = 0
+        if (hour >= 6 and hour <= 8) or (hour >= 12 and hour <= 13) or (hour >= 18 and hour <= 19):#6-8 12-13 18-19 
+            random_value = urandom.randint(39, 61)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 6 -10",blood_sugar)
+            # return [self.blood_Maxvalue,self.blood_Minvalue]
+        elif (hour > 8 and hour <= 9) or (hour >= 14 and hour <= 15) or (hour >= 20 and hour <= 21):#8-9 14-15 20-21
+            random_value = urandom.randint(67, 90)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 10 -14",blood_sugar)
+        else:#18-2 19 20 21 22 23 1 2 10-11 16-17 21-22
+            random_value = urandom.randint(39, 78)
+            blood_sugar = random_value/10
+            print("get_blood_sugar_value 18 -2",blood_sugar)
+        return blood_sugar
+
+
+
+
+    class PhoneVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_phonering_level", self.add)
+            EventMesh.subscribe("push_reduce_phonering_level", self.reduce)
+            EventMesh.subscribe("get_phonering_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class MsgVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_msgvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_msgvolume_level", self.reduce)
+            EventMesh.subscribe("get_msgvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+
+    class AlarmVolumeLevelManager(Abstract):
+        def __init__(self):
+            self.level = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("push_add_alarmvolume_level", self.add)
+            EventMesh.subscribe("push_reduce_alarmvolume_level", self.reduce)
+            EventMesh.subscribe("get_alarmvolume_level", self.get)
+
+        def add(self, event, msg):
+            if self.level < 7:
+                self.level = self.level + 1
+
+        def reduce(self, event, msg):
+            if self.level > 0:
+                self.level = self.level - 1
+
+        def get(self, event=None, msg=None):
+            return self.level
+            
+    class StopwatchManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.ms_value = 0
+            self.sec_value = 0
+            self.min_value = 0
+            self.timer = Timer(Timer.Timer1)
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("stopwatch_start", self.start)
+            EventMesh.subscribe("stopwatch_stop", self.paused)
+            EventMesh.subscribe("stopwatch_reset", self.reset)
+            EventMesh.subscribe("get_stopwatch_ms", self.get_ms)
+            EventMesh.subscribe("get_stopwatch_sec", self.get_sec)
+            EventMesh.subscribe("get_stopwatch_min", self.get_min)
+
+        def start(self, event, msg):        
+            self.timer.start(period=100, mode=self.timer.PERIODIC, callback=self.fun)
+        
+        def paused(self, event, msg):        
+            self.timer.stop()
+        
+        def reset(self, event, msg):
+            self.timer.stop()
+
+            self.sec_value = 0
+            self.min_value = 0
+            self.ms_value = 0
+
+        def fun(self):
+            self.ms_value += 1
+            if self.ms_value > 9:
+                self.ms_value = 0   
+                self.sec_value += 1
+            if self.sec_value > 60:
+                self.sec_value = 0
+                self.min_value += 1
+            if self.min_value > 60:
+                self.timer.stop()
+
+        def get_ms(self, event=None, msg=None):
+            return self.ms_value
+
+        def get_min(self, event=None, msg=None):
+            return self.min_value
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec_value
+
+    class CountdownManager(Abstract):
+        def __init__(self):
+            self.sec = 0
+            self.min = 0
+            self.hour = 0
+            self.timer = osTimer()
+            self.total = 0
+            self.time_cb = 0
+            self.time_play = 0
+            self.total_sec = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("add_countdown_sec", self.add_sec)
+            EventMesh.subscribe("reduce_countdown_sec", self.reduce_sec)
+            EventMesh.subscribe("add_countdown_min", self.add_min)
+            EventMesh.subscribe("reduce_countdown_min", self.reduce_min)
+            EventMesh.subscribe("add_countdown_hour", self.add_hour)
+            EventMesh.subscribe("reduce_countdown_hour", self.reduce_hour)
+            EventMesh.subscribe("get_countdown_sec", self.get_sec)
+            EventMesh.subscribe("get_countdown_min", self.get_min)
+            EventMesh.subscribe("get_countdown_hour", self.get_hour)
+
+            EventMesh.subscribe("set_countdown_off_state", self.set_countdown_off_state)
+            EventMesh.subscribe("get_countdown_off_state", self.get_countdown_off_state)
+
+
+            EventMesh.subscribe("set_countdown_all_time", self.set_countdown_all_time)
+            EventMesh.subscribe("get_countdown_all_time", self.get_countdown_all_time)
+
+            EventMesh.subscribe("countdown_end_cb", self.countdown_end_cb)
+
+            EventMesh.subscribe("reset_time_countdown",self.reset)
+
+        def set_countdown_all_time(self, event, msg):
+            self.total = msg[0]
+            self.total_sec = msg[1]
+            # EventMesh.debug_log("self.total:{} self.total_sec:{}".format(self.total,self.total_sec))
+
+
+        def get_countdown_all_time(self, event, msg):
+            return self.total
+        
+        def set_countdown_off_state(self, event, msg):
+
+            self.time_cb = msg[0]
+            self.time_play = msg[1]
+            # EventMesh.debug_log("self.time_cb:{} self.total_sec:{}".format(self.time_cb,self.time_play))
+
+
+        def get_countdown_off_state(self, event, msg):
+            return [self.time_cb,self.time_play]
+        
+        def countdown_end_cb(self, event, msg):
+            
+            if self.time_cb == 1 and self.time_play == 1:
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp) 
+                reduce = time_tmp- self.total_sec
+                EventMesh.debug_log("self.time_cb:{} self.time_play:{} self.total:{} self.total_sec:{}".format(self.time_cb,self.time_play, self.total,self.total_sec))
+                self.total = self.total - reduce
+                if self.total <= 0:
+                    self.total = 0
+                    self.time_cb = 0
+                    self.time_play = 0
+                    self.sec = 0
+                    self.min = 0
+                    self.hour = 0
+                    
+                    EventMesh.publish("load_screen", {"screen": "countdown_end"})
+                    return
+                self.total_sec = time_tmp
+
+
+        def add_sec(self, event, msg):
+            if self.sec < 59:
+                self.sec = self.sec + 1
+
+        def reduce_sec(self, event, msg):
+            if self.sec > 0:
+                self.sec = self.sec - 1
+
+        def add_min(self, event, msg):
+            if self.min < 59:
+                self.min = self.min + 1
+
+        def reduce_min(self, event, msg):
+            if self.min > 0:
+                self.min = self.min - 1
+
+        def add_hour(self, event, msg):
+            if self.hour < 99:
+                self.hour = self.hour + 1
+
+        def reduce_hour(self, event, msg):
+            if self.hour > 0:
+                self.hour = self.hour - 1
+
+        def get_sec(self, event=None, msg=None):
+            return self.sec
+
+        def get_min(self, event=None, msg=None):
+            return self.min
+
+        def get_hour(self, event=None, msg=None):
+            return self.hour
+        
+
+        
+        def reset(self, event=None, msg=None):
+            self.hour = 0
+            self.min = 0
+            self.sec = 0
+        
+        
+
+    BATTERY_OCV_TABLE = {
+        "nix_coy_mnzo2": {
+            55: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            20: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+            0: {
+                4290: 100, 4237: 95, 4179: 90, 4123: 85, 4070: 80, 4020: 75, 3963: 70, 3919: 65, 3882: 60, 3847: 55,
+                3818: 50, 3794: 45, 3772: 40, 3752: 35, 3733: 30, 3716: 25, 3699: 20, 3677: 15, 3652: 10, 3629: 5, 3400: 0,
+            },
+        },
+    }
+
+
+
+    class Battery(object):
+        """This class is for battery info.
+
+        This class can get battery voltage and energy.
+        if adc_args is not None, use cbc to read battery
+
+        adc_args: (adc_num, adc_period, factor)
+
+            adc_num: ADC channel num
+            adc_period: Cyclic read ADC cycle period
+            factor: calculation coefficient
+        """
+
+        def __init__(self, adc_args=None, chrg_gpion=None, stdby_gpion=None):
+            self.__energy = 100
+            self.__temp = 55
+
+            # ADC params
+            self.__adc = None
+            if adc_args:
+                self.__adc_num, self.__adc_period, self.__factor = adc_args
+                if not isinstance(self.__adc_num, int):
+                    raise TypeError("adc_args adc_num is not int number.")
+                if not isinstance(self.__adc_period, int):
+                    raise TypeError("adc_args adc_period is not int number.")
+                if not isinstance(self.__factor, float):
+                    raise TypeError("adc_args factor is not int float.")
+                self.__adc = ADC()
+
+            # Charge params
+            self.__charge_callback = None
+            self.__charge_status = None
+            self.__chrg_gpion = chrg_gpion
+            self.__stdby_gpion = stdby_gpion
+            self.__chrg_gpio = None
+            self.__stdby_gpio = None
+            self.__chrg_exint = None
+            self.__stdby_exint = None
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                self.__init_charge()
+
+        def __chrg_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __stdby_callback(self, args):
+            self.__update_charge_status()
+            if self.__charge_callback is not None:
+                self.__charge_callback(self.__charge_status)
+
+        def __update_charge_status(self):
+            if self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 0
+            elif self.__chrg_gpio.read() == 0 and self.__stdby_gpio.read() == 1:
+                self.__charge_status = 1
+            elif self.__chrg_gpio.read() == 1 and self.__stdby_gpio.read() == 0:
+                self.__charge_status = 2
+            else:
+                raise TypeError("CHRG and STDBY cannot be 0 at the same time!")
+
+        def __init_charge(self):
+            self.__chrg_gpio = Pin(self.__chrg_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__stdby_gpio = Pin(self.__stdby_gpion, Pin.IN, Pin.PULL_DISABLE)
+            self.__chrg_exint = ExtInt(self.__chrg_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.__chrg_callback)
+            self.__stdby_exint = ExtInt(self.__stdby_gpion, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU,
+                                        self.__stdby_callback)
+            self.__chrg_exint.enable()
+            self.__stdby_exint.enable()
+            self.__update_charge_status()
+
+        def __get_soc_from_dict(self, key, volt_arg):
+            """Get battery energy from map"""
+            if key in BATTERY_OCV_TABLE["nix_coy_mnzo2"]:
+                volts = sorted(BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].keys(), reverse=True)
+                pre_volt = 0
+                volt_not_under = 0  # Determine whether the voltage is lower than the minimum voltage value of soc.
+                for volt in volts:
+                    if volt_arg > volt:
+                        volt_not_under = 1
+                        soc1 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(volt, 0)
+                        soc2 = BATTERY_OCV_TABLE["nix_coy_mnzo2"][key].get(pre_volt, 0)
+                        break
+                    else:
+                        pre_volt = volt
+                # EventMesh.debug_log("__get_soc_from_dict:{}".format(soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)))
+                if pre_volt == 0:  # Input Voltarg > Highest Voltarg
+                    return soc1
+                elif volt_not_under == 0:
+                    return 0
+                else:
+                    return soc2 - (soc2 - soc1) * (pre_volt - volt_arg) // (pre_volt - volt)
+
+        def __get_soc(self, temp, volt_arg, bat_type="nix_coy_mnzo2"):
+            """Get battery energy by temperature and voltage"""
+            if bat_type == "nix_coy_mnzo2":
+                if temp > 30:
+                    return self.__get_soc_from_dict(55, volt_arg)
+                elif temp < 10:
+                    return self.__get_soc_from_dict(0, volt_arg)
+                else:
+                    return self.__get_soc_from_dict(20, volt_arg)
+
+        def __get_power_vbatt(self):
+            return int(sum([Power.getVbatt() for i in range(100)]) / 100)
+
+        def __get_adc_vbatt(self):
+            self.__adc.open()
+            utime.sleep_ms(self.__adc_period)
+            adc_list = list()
+            for i in range(self.__adc_period):
+                adc_list.append(self.__adc.read(self.__adc_num))
+                utime.sleep_ms(self.__adc_period)
+            adc_list.remove(min(adc_list))
+            adc_list.remove(max(adc_list))
+            adc_value = int(sum(adc_list) / len(adc_list))
+            self.__adc.close()
+            vbatt_value = adc_value * (self.__factor + 1)
+            return vbatt_value
+
+        def set_temp(self, temp):
+            """Set now temperature."""
+            if isinstance(temp, int) or isinstance(temp, float):
+                self.__temp = temp
+                return True
+            return False
+
+        def get_voltage(self):
+            """Get battery voltage"""
+            if self.__adc is None:
+                return self.__get_power_vbatt()
+            else:
+                return self.__get_adc_vbatt()
+
+        def get_energy(self,volt_arg ):
+            """Get battery energy"""
+            if( volt_arg == None) :
+                volt_arg = self.get_voltage()
+            self.__energy = self.__get_soc(self.__temp, volt_arg)
+            # EventMesh.debug_log("get_energy:volt_arg {} __energy{}".format(volt_arg,self.__energy))
+            return self.__energy
+
+        def set_charge_callback(self, charge_callback):
+            if self.__chrg_gpion is not None and self.__stdby_gpion is not None:
+                if callable(charge_callback):
+                    self.__charge_callback = charge_callback
+                    return True
+            return False
+
+        def get_charge_status(self):
+            return self.__charge_status
+
+    class BatteryManager(Abstract):
+        def __init__(self):
+            """电池管理器"""
+            self.battery = Battery()
+            self.low_battery = False
+
+        def post_processor_after_instantiation(self):
+            """订阅此类所有的事件到 EventMesh中"""
+            EventMesh.subscribe("get_battery", self.get_battery)
+
+        def get_battery(self, event=None, msg=None):
+            battery = self.battery.get_energy(msg)
+            return battery
+
+        def get_voltage(self, event=None, msg=None):
+            voltage = self.battery.get_voltage()
+            return voltage
+
+    class ConfigStoreManager(Abstract):
+        """
+        持久化落盘存储
+        """
+
+        def __init__(self):
+            self.file_name = "/usr/conf_store.json"
+            self.lock = Lock()
+            self.map = dict()
+
+        def post_processor_after_instantiation(self):
+            if ql_fs.path_exists(self.file_name):
+                self.map = ql_fs.read_json(self.file_name)
+            else:
+                self.__store()
+            EventMesh.subscribe("persistent_config_get", self.__read)
+            EventMesh.subscribe("persistent_config_store", self.__store)
+
+        def __read(self, event, msg):
+            with self.lock:
+                return self.map.get(msg)
+
+        def __store(self, event=None, msg=None):
+            if msg is None:
+                msg = dict()
+            with self.lock:
+                self.map.update(msg)
+                ql_fs.touch(self.file_name, self.map)
+            
+    class sosInfoCallManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sos_info_call", self.set_sos_info_call)
+
+        def set_sos_info_call(self, event, msg):
+            hangup_mode = EventMesh.publish("get_hangup_mode")
+            if hangup_mode == 1:
+                EventMesh.publish("set_sos_flag",0)
+                EventMesh.publish("set_sos_num",0)
+                EventMesh.publish("set_hangup_mode",0)
+            EventMesh.debug_log('hangup_mode disconnect',hangup_mode)
+            sos_flag = EventMesh.publish("get_sos_flag")
+            EventMesh.debug_log('voicecall sos_flag',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 number != None:
+                    if len(number) > 0:
+                        if num == None:
+                            num = 0
+                        num+=1
+                        num_len = 0
+
+                        if len(number) == 1:
+                            num_len = len(number)+1#三次
+                        elif len(number) == 2:
+                            num_len = len(number)+1+2 #1+2+1+2
+                        elif len(number) == 3:
+                            num_len = len(number)+5 #1+3+5
+                        # EventMesh.debug_log("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
+                        if num > num_len :
+                            if len(number) == 1:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 2:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                            elif len(number) == 3:
+                                number1 = str(number[0])
+                                sms.sendPduMsg(number1, '我需要你的帮助', 'UCS2')
+                                number2 = str(number[1])
+                                sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
+                                number3 = str(number[2])
+                                sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
+                            EventMesh.publish("set_sos_flag",0)
+                            EventMesh.publish("set_sos_num",0)
+                        else:
+                        # EventMesh.debug_log("number:{} number_len :{}".format(number,len(number)))
+                            EventMesh.publish("set_sos_num",num)
+                            if len(number) == 1:
+                                if len(number[0]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[0])
+                                    EventMesh.debug_log("phone 1")
+                            elif len(number) == 2:
+                                if num == 1 or num == 3 or num == 5: #1 2 3 4 5 
+                                    if len(number[1]) != 0:
+                                        EventMesh.debug_log("phone 2")
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                elif num == 2 or num == 4:
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 3")
+                                        EventMesh.publish("set_callnumer_cb",number[0])
+                            elif len(number) == 3:
+                                if num == 1 or num == 4 or num == 7:
+                                    if len(number[1]) != 0:
+                                        EventMesh.publish("set_callnumer_cb",number[1])
+                                        EventMesh.debug_log("phone 4")
+                                elif num == 2 or num == 5 or num == 8:
+                                    if len(number[2]) != 0:
+                                        EventMesh.debug_log("phone 5")
+                                        EventMesh.publish("set_callnumer_cb",number[2])
+                                elif num == 3 or num == 6 :
+                                    if len(number[0]) != 0:
+                                        EventMesh.debug_log("phone 6")
+                                        EventMesh.publish("set_callnumer_cb",number[0])   
+    
+    WL_timer = osTimer()   
+    def WL_timer_cb(*args):   
+        get_call = EventMesh.publish("get_call_state") 
+        if get_call == 2:#只有拨进来才给接听
+            EventMesh.publish("answer_call_event")#接听电话
+    def voice_callback(args):
+        EventMesh.debug_log('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
+                EventMesh.debug_log('voicecall incoming call, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了 判断号码是否大于11位数,如果大于11位数 并且第一个字符是数字就按照最后11位做存储
+
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
+                if WLKEY == "1" or WLKEY == "2":#开启了白名单
+                    on_list_flag = 0
+                    phonebook = EventMesh.publish("get_phonebook_list")
+                    phonebook_list = phonebook[1]
+                    EventMesh.debug_log("voice_callback:phonebook_list{}".format(phonebook_list))
+                    try:
+                        for value in phonebook_list.values():
+                            if value == args[6]:
+                                on_list_flag = 1
+                                break
+                    except Exception as e:
+                        usys.print_exception(e)
+                    EventMesh.debug_log("voice_callback:on_list_flag{}".format(on_list_flag))
+                    if on_list_flag == 1:#在白名单里
+                        if WLKEY == "2":
+                            WL_timer.start(30000, 0, WL_timer_cb)
+                    else:
+                        EventMesh.debug_log("voice_callback:不在白名单中,挂断")
+                        voiceCall.callEnd()
+                        return 
+                viode_state = EventMesh.publish("get_video_state")
+                fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+                if viode_state != 0 or fall_down != 0:
+                    voiceCall.callEnd()
+                    return
+
+                EventMesh.publish("set_call_state",2) 
+                EventMesh.publish("dialin_call_event")#电话拨进响铃
+                # 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)
+
+                EventMesh.debug_log('voicecall connected, PhoneNO.: ', args[6])
+                size_len = len(str(args[6]))
+                tmp = []
+                tmp = args[6]
+                find_num = tmp[0]
+                b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
+                if b == True and size_len > 11:
+                    tmp = tmp[size_len-11:]
+                EventMesh.publish("set_call_state",3) 
+                # if EventMesh.publish("get_call_state") == 2:#打通了才可设置状态 防止挂断太及时,又拨出去了
+                #     EventMesh.publish("set_call_state",3) 
+                # else:
+                #     EventMesh.publish("set_call_state",0) 
+                # 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)
+                
+
+                
+                
+                EventMesh.publish("set_sos_info_call")  
+                flag = EventMesh.publish("get_call_state") 
+                if flag == 2:
+                    EventMesh.publish("stop_led_timer")#设置参数
+                    EventMesh.publish("close_timer_all")#
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                    
+                EventMesh.publish("set_sos_state_out")
+                EventMesh.publish("set_call_state",0) 
+                EventMesh.debug_log('voicecall disconnect end')
+                
+
+        elif args[0] == 13:
+                EventMesh.debug_log('voicecall is waiting, PhoneNO.: ', args[6])
+        elif args[0] == 14:
+
+                EventMesh.debug_log('voicecall dialing, PhoneNO.: ', args[6])
+                EventMesh.publish("set_UI_high_priority",0)
+                EventMesh.publish("set_call_state",1) 
+                # EventMesh.publish("load_screen", {"screen": "dialing"})
+
+                
+        elif args[0] == 15:
+                EventMesh.debug_log('voicecall alerting, PhoneNO.: ', args[6])
+                EventMesh.publish("set_call_state",1) 
+                
+        elif args[0] == 16:
+                EventMesh.debug_log('voicecall holding, PhoneNO.: ', args[6])
+
+    class DeviceInfoManager(Abstract):
+        
+        """
+            设备信息管理
+        """
+
+        def __init__(self):
+
+            self.DeviceInfo_queue = Queue()
+            _thread.stack_size((9+6)*1024)
+            _thread.start_new_thread(self.DeviceInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            self.boot_time_count = 0
+            self.factory_test_time = 0
+            EventMesh.subscribe("publish_message_event_DeviceInfo",self.publish_message_event_DeviceInfo)
+            self.key = ""
+            self.imei = ""
+            self.cid = "ETEST20221014010"
+            self.imsi = ""
+            self.password = "000000"
+            #self.__city = None
+            #self.__location = None
+            self.timer_push_schedule = osTimer()
+            self.timer_pusht_test = osTimer()
+            
+            #self.battery_push_schedule = osTimer()
+            self.check_battery_list = []
+            
+            self.step = [0,0,0,0]
+            self.timer_push=0
+            self.timer_push_tmp=60
+            self.PING = "0" #绑定状态
+            self.connect = 0 #服务器连接状态
+            self.KA_time = 0
+            self.HR_time = 0
+            self.hr_timeSecond = 0
+            self.HR_state = 0
+            self.HR_Onestate = 0
+            self.get_hr_state = 0
+            self.get_spo2_state = 0
+            self.set_hsenor_crt = 0
+            self.HR_OneTime = 0
+            self.Hr_Need_Open = 0
+            self.Spo2_Need_Open = 0
+            self.bat_time = 0
+            self.vbat_full_flag = 0
+            self.clear_step = 0
+            self.test = 0
+            self.old_time = 0
+            self.UD_time = 0
+            self.upload_time = 0
+            self.UD_timeout = 7*60
+
+            self.temp_timeSecond = 0
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.temp_warning = 0
+
+            self.bg_timeSecond = 0
+
+            self.bp_timeSecond = 0
+            self.bpauto_state = 0
+
+            self.spo2_timeSecond = 0
+            self.spo2auto_state = 0
+
+            self.vbat_count = 0
+
+            self.vbat_buf=[]
+
+            self.curr_battery_level = 4200
+            self.bat_count = 0
+
+            self.mearsure_btn = 0
+            self.mearsure_timer = 0
+
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+
+            self.no_smi_count = 0
+            self.no_smi_state = 0
+
+            self.old_bp_time = 0
+
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+            
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+            
+            self.charge_full_count = 0
+            self.GPS_step_t = 0#记录步数
+            self.usb = USB()
+            self.usb.setCallback(self.usb_event_cb)
+            self.log = LogAdapter(self.__class__.__name__)
+            self.rtc = RTC()
+            self.aud = audio.Audio(0)
+            EventMesh.debug_log("DeviceInfoManager:1")
+
+            self.old_temp_time = 0
+
+            EventMesh.debug_log("DeviceInfoManager:3")
+            self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
+            self.stop_temp( None, None)
+            self.dev_state = 0
+            self.wear = 1
+            self.BG_state = 0
+            self.old_bg_time = 0
+
+            self.pull_time = 0
+
+            self.drink_time = 0
+
+            self.alarm_count = 0
+            self.alarm_flag = 0
+
+            self.time_count = 0
+            
+            self.auto_spo2_count = 0
+
+            self.auto_hr_count = 0
+
+            self.auto_temp_count = 0
+
+            self.low_power_AL = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.debug_log("post_processor_after_instantiation:1")
+            """订阅此类所有的事件到 EventMesh中"""
+            voiceCall.setCallback(voice_callback)
+            EventMesh.subscribe("screen_get_ope", self.get_device_ope)
+            EventMesh.subscribe("screen_get_sig", self.get_signal)
+            EventMesh.subscribe("screen_get_time", self.get_time)
+            EventMesh.subscribe("about_get_imei", self.get_imei)
+            EventMesh.subscribe("about_get_iccid", self.get_ic_cid)
+            EventMesh.subscribe("get_sim_Status", self.get_sim_Status)
+            EventMesh.subscribe("about_get_phonenum", self.get_phone_num)
+            EventMesh.subscribe("screen_get_battery", self.get_battery)
+            EventMesh.subscribe("set_curr_battery_level", self.set_curr_battery_level)
+            EventMesh.subscribe("get_curr_battery_level", self.get_curr_battery_level)
+            EventMesh.subscribe("get_fw_version", self.get_device_fw_version)
+            EventMesh.subscribe("get_standby_time", self.get_standby_time)
+            EventMesh.subscribe(constants.EVENT.GET_STEP, self.get_step_count)
+            EventMesh.subscribe("sim_slot_get", self.sim_slot_get)
+            EventMesh.subscribe("sim_slot_switch", self.sim_slot_switch)
+            EventMesh.subscribe(constants.EVENT.GET_KEY, self.get_key)
+            EventMesh.subscribe(constants.EVENT.SET_KEY, self.set_key)
+            EventMesh.subscribe(constants.EVENT.GET_IMEI, self.get_imei)
+            EventMesh.subscribe(constants.EVENT.GET_CID, self.get_cid)
+            EventMesh.subscribe(constants.EVENT.SET_CID, self.set_cid)
+            EventMesh.subscribe(constants.EVENT.GET_IMSI, self.get_imsi)
+            EventMesh.subscribe(constants.EVENT.GET_PASSWORD, self.get_password)
+            EventMesh.subscribe(constants.EVENT.SET_PASSWORD, self.set_password)     
+            EventMesh.subscribe(constants.EVENT.SET_PING, self.set_ping)
+            EventMesh.subscribe(constants.EVENT.GET_PING, self.get_ping)
+            EventMesh.subscribe(constants.EVENT.SET_CONNECT, self.set_connect)
+            EventMesh.subscribe(constants.EVENT.GET_CONNECT, self.get_connect)
+
+            
+            EventMesh.subscribe(constants.EVENT.START_BLOOD_OXYGEN, self.start_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.START_HEART, self.start_heart)
+            EventMesh.subscribe(constants.EVENT.STOP_BLOOD_OXYGEN, self.stop_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.STOP_HEART, self.stop_heart)
+            EventMesh.subscribe(constants.EVENT.GET_BLOOD_OXYGEN, self.get_blood_oxygen)
+            EventMesh.subscribe(constants.EVENT.GET_HEART, self.get_heart)
+            EventMesh.subscribe(constants.EVENT.GET_WEAR, self.get_wear)
+            EventMesh.subscribe("get_Hsensor", self.get_Hsensor)
+            EventMesh.subscribe("Hsensor_set_sleep", self.Hsensor_set_sleep)
+
+            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)
+            EventMesh.subscribe("get_boot_time_count", self.get_boot_time_count)
+            EventMesh.subscribe("get_factory_test_time", self.get_factory_test_time)
+            EventMesh.subscribe("get_dev_state", self.get_dev_state)
+            EventMesh.subscribe("set_dev_state", self.set_dev_state)
+
+            EventMesh.subscribe("clear_health_state", self.clear_health_state)
+
+            EventMesh.subscribe("clear_home_alarm", self.clear_home_alarm)
+            EventMesh.subscribe("clear_medicine_alarm", self.clear_medicine_alarm)
+            EventMesh.subscribe("clear_wakeup_alarm", self.clear_wakeup_alarm)
+            EventMesh.subscribe("clear_sleep_alarm", self.clear_sleep_alarm)
+            EventMesh.subscribe("clear_normal_alarm", self.clear_normal_alarm)
+
+            EventMesh.subscribe("clear_manual_hr_flag", self.clear_manual_hr_flag)
+            EventMesh.subscribe("clear_manual_temp_flag", self.clear_manual_temp_flag)
+
+
+            EventMesh.subscribe("clear_usb_flag", self.clear_usb_flag)
+            
+            EventMesh.debug_log("post_processor_after_instantiation:2")
+            self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
+            # 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.publish_event_cb()
+            
+            EventMesh.debug_log("post_processor_after_instantiation:3")
+
+        def clear_manual_hr_flag(self,event,msg):
+            self.auto_hr_count = 0
+        
+        def clear_manual_temp_flag(self,event,msg):
+            self.auto_temp_count = 0
+
+        def publish_message_event_DeviceInfo(self,event,msg):
+            self.DeviceInfo_queue.put(msg)
+
+        #DeviceInfo的消息队列处理,防止卡顿
+        def DeviceInfo_queue_thread(self):
+            while True:
+                data = self.DeviceInfo_queue.get()
+                #EventMesh.debug_log("DeviceInfo_queue_thread:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+
+
+        def gsensor_cb(self, para):
+            EventMesh.debug_log("gsensor_cb:{}".format(para))
+            flip_sw = EventMesh.publish("get_storage_config","flip_sw")
+            fall_sw = EventMesh.publish("get_storage_config","fall_sw")
+            if para == 0: #跌倒报警
+                pass
+                if fall_sw == "1":
+                    EventMesh.publish("falldown_alarm_event")
+                    dev_state =  EventMesh.publish("get_dev_state")
+
+                    tmp = 1 << 21
+                    dev_state = dev_state|tmp #第21位=1
+                    EventMesh.publish("set_dev_state",dev_state)
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+                    pass
+                #EventMesh.publish("load_screen", {"screen": "FIND"})
+            elif para == 1: #抬腕
+                
+                if flip_sw == 1:
+                    EventMesh.publish(constants.EVENT.SYSTEM_UP)
+                
+            elif para == 2: #放手
+                pass
+                # if flip_sw == 1:
+                #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
+        def get_boot_time_count(self, event, msg):
+            return self.boot_time_count
+        
+        def get_factory_test_time(self, event, msg):
+            return self.factory_test_time
+        
+        def get_dev_state(self, event, msg):
+            return self.dev_state
+        def set_dev_state(self, event, msg):
+            self.dev_state = msg
+        
+        def publish_event_cb(self, *args, **kwargs):
+            open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+            if open_power != None:
+                if open_power == 1:
+                    if self.boot_time_count < 50000000:
+                        self.boot_time_count += 10
+                    
+                    if self.factory_test_time < 300:
+                        self.factory_test_time+=10
+                #EventMesh.debug_log("boot_time_count:{}".format(self.boot_time_count))
+            EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
+        def optimize_temp(self,temp):
+            temp += 0.5
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            EventMesh.debug_log("temp:{}".format(temp))
+            if temp < 36 :#or temp > 37.5:
+                temp = 36+urandom.random()
+            if temp > 37.5:
+                
+                self.temp_warning += 1
+                EventMesh.debug_log("temp_warning:{} get_temp_time{}".format(self.temp_warning,get_temp_time))
+                
+                if self.temp_warning < 5:#高温没连续超过3次,和谐成37.5度以下
+                    temp = 37+(urandom.randint(1, 4)/10)
+                else:
+                    self.temp_warning = 0
+            else:
+                if self.temp_warning>=1:
+                    self.temp_warning -= 1
+            if temp >= 40:
+                temp = 40
+            return temp
+        def clear_health_state(self,event,msg):
+            print("clear_health_state")
+            self.old_bp_time = 0#关闭心率 血压 血氧 体温清除标志
+            self.old_time = 0
+            self.HR_Onestate = 0
+            self.HR_OneTime = 0
+            self.HR_state = 0
+            self.set_hsenor_crt = 0
+            self.old_bg_time = 0
+            self.old_hr_time = 0
+            self.old_spo2_time = 0
+            self.BG_state = 0
+            self.bpauto_state = 0
+            self.spo2auto_state = 0
+            pass
+
+        def clear_temp_state(self,event,msg):
+            print("clear_temp_state")
+            self.temp_state = 0
+            self.temp_one_state = 0
+            self.old_temp_time = 0
+            pass
+
+        def publish_event(self,data):
+            """
+            定时事件处理
+            :param args:
+            :param kwargs:
+            :return:
+            """
+
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+            # EventMesh.debug_log("date_tmp......01....{} time_tmp:{}\r\n".format(date_tmp,time_tmp))
+            
+
+            EventMesh.publish("countdown_end_cb")
+            """定时检查是否关闭gps失败"""
+            # gnss_state = quecgnss.get_state()
+            # get_location_flag = EventMesh.publish("get_location_flag")
+            # if get_location_flag != None:
+            #     # if gnss_state == 2 and get_location_flag == 0:
+            #     #     EventMesh.publish(constants.EVENT.GPSCLOSE)
+            #     if(get_location_flag == 0):
+            #         EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+            """7分钟一次心跳"""
+            if  math.fabs(time_tmp - self.KA_time) > heartbeat_time: #7分钟一次心跳
+                self.KA_time = time_tmp
+                EventMesh.publish(constants.PROTOCOL.KA_SEND)
+
+            """定时定位"""
+            #EventMesh.publish("set_upload_data",3*60)
+            self.upload_time = EventMesh.publish("get_upload_data")
+            #EventMesh.debug_log("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: #30分钟一次定位
+                    self.UD_time = time_tmp
+
+                    status_tmp = 4
+                    #EventMesh.txt_log("status_count:{}".format(status_tmp))
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 :
+                        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+
+                    else : #关闭定位
+                        #EventMesh.txt_log("NO status")
+                        EventMesh.debug_log("NO status")
+                        EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+            
+            EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count())
+
+            """电池平均值"""
+            temp = Power.getVbatt()
+            if self.bat_count < 10:
+                self.vbat_buf.append(temp)
+                self.bat_count += 1
+            else:
+                for i in range(9):
+                    self.vbat_buf[i] = self.vbat_buf[i+1]
+                self.vbat_buf[9] = temp
+            curr_count = len(self.vbat_buf)
+            bat_total_value = 0
+            for i in range(curr_count):
+                bat_total_value += self.vbat_buf[i]
+            bat_total_value = bat_total_value//curr_count#一分钟更新一次电量 10个平均值
+            EventMesh.publish("set_curr_battery_level",bat_total_value)
+            # EventMesh.debug_log("self.vbat_buf:{} curr_count :{} bat_total_value:{} temp:{}".format(self.vbat_buf,curr_count,bat_total_value,temp))
+            bat_tmp = EventMesh.publish("screen_get_battery")
+            self.vbat_count+=10
+            if self.vbat_count >= 60:
+                self.vbat_count = 0
+                if bat_tmp != None:
+                    bat_value = bat_tmp[1]
+                    if bat_value <= 0:
+                        pass
+                        # EventMesh.publish("load_screen", {"screen": "LOW_ONE_POWER"})
+            
+            
+            """"隔天清步数"""
+
+            data = RTC().datetime()
+
+            hour = int(data[4])
+            min = int(data[5])
+
+
+
+            cur_month = int(data[1])
+            cur_day = int(data[2])
+            cur_year = int(data[0])
+
+            old_Timesec = EventMesh.publish("get_old_time_data")
+            # EventMesh.debug_log("hour:{} {} cur_month:{} {} next_alarm_time:{} old_Timesec:{}".format(hour,min,cur_month,cur_day,next_alarm_time,old_Timesec))
+            # EventMesh.debug_log("old_Timesec",old_Timesec)
+            if old_Timesec != None:
+                next_alarm_time = utime.localtime(int(old_Timesec))
+                month = int(next_alarm_time[1]) #00:00 18
+                day = int(next_alarm_time[2])
+                year = int(next_alarm_time[0])
+                if month != cur_month or day != cur_day or year != cur_year:#年 月 日只要其中一个都不一样就清零
+                    EventMesh.publish("set_old_time_data",time_tmp)
+
+
+                    EventMesh.publish("set_old_step_value",0)
+                    
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step1111")
+                else:
+                    pass
+                    
+                    
+            if hour == 23:#清步数23:59
+                if min == 59:#58 59
+                    # if self.clear_step == 0:
+                    #     self.clear_step = 1
+                    EventMesh.publish("set_old_time_data",time_tmp)
+
+                    EventMesh.publish("set_old_step_value",0)
+
+                    hr = EventMesh.publish("get_old_hr_data")
+                    if hr != 0:
+                        EventMesh.publish("set_old_hr_data", 0)
+                    
+                    spo2 = EventMesh.publish("get_old_spo2_data")
+                    if spo2 != 0:
+                        EventMesh.publish("set_old_spo2_data", 0)
+                    EventMesh.debug_log("clear step2222")
+
+                else:
+                    self.clear_step = 0
+            else:
+                self.clear_step = 0
+            
+            """电量小于0% 关机"""
+            get_low_btn = EventMesh.publish("get_low_bat_btn")#
+            battery = EventMesh.publish("screen_get_battery")
+
+            if battery != None:
+                power = int(battery[1])
+                if battery[0] != '1':
+                    if power == 0:
+                        EventMesh.publish("open_power_on",2)#  
+                    """"低电报警"""
+                    # print("low power!!!!!!!!!!! %d",self.low_power_AL)
+                    if power <= 15 and self.low_power_AL==0:
+                        self.low_power_AL = 1
+                        dev_state =  EventMesh.publish("get_dev_state")
+
+                        tmp = 1 << 17
+                        dev_state = dev_state|tmp #第17位=1
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位
+
+                if power >= 50:
+                    self.low_power_AL = 0
+            
+            """未联网提示关机"""
+            ble=EventMesh.publish(constants.EVENT.GET_CONNECT)
+            # EventMesh.debug_log("ble",ble)
+            if ble == 0:#未联网提示关机
+                if battery[0] != '1':
+                    self.no_smi_count+=10
+                    # EventMesh.debug_log("self.no_smi_count",self.no_smi_count)
+                    if self.no_smi_count >= (15*60):#(15*60)
+                        self.no_smi_count = 0
+                        EventMesh.publish("open_power_on",2)#  #未检测到sim卡15分钟后关机
+                    
+            else:
+                self.no_smi_count = 0
+
+            msg_nums = sms.getMsgNums() #获取短信条数
+            # EventMesh.debug_log("msg_nums",msg_nums)
+            if(msg_nums != -1):
+                sms_data = sms.getSaveLoc()
+                sms_max = sms_data[0][2]
+                if msg_nums >= sms_max-1:
+                    EventMesh.publish("delete_sms_event")#
+
+            #佩戴检测
+            WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据
+            if self.wear != WEAR:
+                remove_sw = EventMesh.publish("get_storage_config","remove_sw")
+                if remove_sw == "1":#开启了佩戴检测的开关
+                    dev_state =  EventMesh.publish("get_dev_state")
+                    
+                    if WEAR != 1:
+                        tmp = 1 << 3
+                        tmp = ~tmp
+                        tmp = 1 << 20
+                        dev_state = dev_state|tmp #第20位=1
+                    # else :     
+                    #     pass              
+                        
+                    #     tmp = 1 << 20
+                    #     dev_state = dev_state|tmp #第20位=1
+                    #     tmp = 1 << 3
+                    #     dev_state = dev_state|tmp #第三位=1
+                        EventMesh.debug_log("佩戴检测:{}".format(dev_state))    
+                        EventMesh.publish("set_dev_state",dev_state)
+                        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,dev_state]) #开始AL定位,发送报警
+                        #EventMesh.publish(constants.PROTOCOL.HELP_SEND,65)
+            self.wear = WEAR
+            """定时测量心率,血氧,体温"""
+            self.get_hr_state = EventMesh.publish("get_hr_state")
+            self.get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_temp_time  = EventMesh.publish("get_temp_time")
+            get_temp_state  = EventMesh.publish("get_temp_state")
+            get_bp_state  = EventMesh.publish("get_bp_state")
+            get_bg_state  = EventMesh.publish("get_bg_state")
+            if get_bg_state == None:
+                get_bg_state = 0
+            if get_bp_state == None:
+                get_bp_state = 0
+
+            if get_temp_state == None:
+                get_temp_state = 0
+
+            if self.get_hr_state == None:
+                self.get_hr_state = 0
+            if self.get_spo2_state == None:
+                self.get_spo2_state = 0 
+
+            video_state = EventMesh.publish("get_video_state")#获取
+            if video_state == None:
+                video_state = 0
+                
+            call_state = EventMesh.publish("get_call_state")
+            if call_state == None:
+                call_state = 0
+
+
+            video_state = EventMesh.publish("get_video_state")
+            if video_state != None:
+                if battery[0] != "1":
+                    if get_temp_state != None and call_state != None and video_state != None: #突然脱腕
+
+                        if get_temp_state > 1  and (WEAR != 1 or call_state != 0 or video_state != 0):
+                            EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            EventMesh.publish("set_temp_state",0)       
+                            EventMesh.txt_log("auto stop_temp:22")
+
+                        if (self.get_hr_state > 1 or self.get_spo2_state > 1 or get_bp_state > 1 or get_bg_state > 1) and (WEAR != 1 or call_state != 0 or video_state != 0):
+                            # print("wear faile")
+                            if self.get_hr_state > 1 :
+                                EventMesh.txt_log("auto stop_hr:22")
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                                EventMesh.publish(constants.EVENT.STOP_HEART) 
+                                if WEAR == 1:
+                                    heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                    if heart_value >= 50 and heart_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                
+                            if self.get_spo2_state > 1:
+                                EventMesh.txt_log("auto stop_spo2:22")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if WEAR == 1:
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                
+                            if get_bp_state > 1:
+
+                                EventMesh.txt_log("auto stop_bp:22")
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                if WEAR == 1:
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                
+                            if get_bg_state > 1:
+                                EventMesh.txt_log("auto stop_bg:22")
+                                
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                if WEAR == 1:
+                                    bg_data = get_blood_sugar_value()
+                                    if bg_data == None:
+                                        bg_data = 0
+                                    if bg_data != 0:
+                                        # EventMesh.publish("play_sugar_value", bg_data)#播放血糖数值
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)   
+        
+            if self.pull_time == 0:
+                self.pull_time = time_tmp
+            # if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#已联网 并且不在充电 佩戴正常 不在通话就给测试心率
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and battery[0] != "1" and WEAR == 1 and call_state == 0 and video_state == 0:
+                #防止时间校时出错
+                if time_tmp < self.pull_time :
+                    self.pull_time = time_tmp
+                if time_tmp < self.temp_timeSecond:
+                    self.temp_timeSecond = time_tmp
+                if time_tmp < self.hr_timeSecond:
+                    self.hr_timeSecond = time_tmp
+                if time_tmp < self.spo2_timeSecond :
+                    self.spo2_timeSecond = time_tmp
+                if time_tmp < self.bp_timeSecond:
+                    self.bp_timeSecond = time_tmp
+                if time_tmp < self.bg_timeSecond:
+                     self.bg_timeSecond = time_tmp
+
+                if time_tmp - self.pull_time >= 30:
+                    # EventMesh.debug_log("shifens:")  
+
+                    get_hr_state = EventMesh.publish("get_hr_state")
+                    get_spo2_state = EventMesh.publish("get_spo2_state")
+                    get_bp_state  = EventMesh.publish("get_bp_state")
+                    get_bg_state  = EventMesh.publish("get_bg_state")
+                    get_temp_state  = EventMesh.publish("get_temp_state")
+                    if get_hr_state == None:
+                        get_hr_state = 0
+                        self.old_hr_time = 0
+
+                    if get_spo2_state == None:
+                        get_spo2_state = 0
+                        self.old_spo2_time = 0
+
+                    if get_temp_state == None:
+                        get_temp_state = 0
+                        self.temp_one_state = 0
+
+                    if get_bp_state == None:
+                        get_bp_state = 0
+                        self.old_bp_time = 0
+                    
+                    if get_bg_state == None:
+                        get_bg_state = 0
+                        self.old_bg_time = 0
+                    
+                    # print("bp get_bp_state ",get_bp_state,self.old_bp_time)
+
+                    
+                    if get_hr_state != None:
+                        if get_hr_state == 3:
+                            self.old_hr_time+=1
+                            if self.old_hr_time == 1:
+                                EventMesh.publish("set_hr_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_hr:333")
+                            elif self.old_hr_time > 6:
+                                self.old_hr_time = 0
+                                EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                EventMesh.txt_log("auto stop_hr:333")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                if heart_value >= 50 and heart_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                EventMesh.debug_log("STOP_HEART:3")
+                        else:
+                            self.old_hr_time = 0
+                    else:
+                        self.old_hr_time = 0
+
+
+                    if get_spo2_state != None:
+                        if get_spo2_state == 3:
+                            self.old_spo2_time+=1
+                            if self.old_spo2_time == 1:
+                                EventMesh.publish("set_spo2_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                EventMesh.txt_log("auto start_spo2:333")
+                            elif self.old_spo2_time > 6:
+                                self.old_spo2_time = 0
+                                EventMesh.txt_log("auto stop_spo2:333")
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    
+                        else:
+                            self.old_spo2_time = 0
+                    else:
+                        self.old_spo2_time = 0
+
+
+                    if get_bp_state != None:
+                        if get_bp_state == 3:
+                            self.old_bp_time+=1
+                            if self.old_bp_time == 1:
+                                EventMesh.publish("set_bp_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bp:333")
+                            elif self.old_bp_time > 6:
+                                self.old_bp_time = 0
+                                
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bp_time = 0
+                    else:
+                        self.old_bp_time = 0
+
+                    if get_bg_state != None:
+                        if get_bg_state == 3:
+                            self.old_bg_time+=1
+                            if self.old_bg_time == 1:
+                                EventMesh.publish("set_bg_state",3)#2代表后台进入测试
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_HEART)
+                                EventMesh.txt_log("auto start_bg:333")
+                            elif self.old_bg_time > 6:
+                                self.old_bg_time = 0
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                bg_data = get_blood_sugar_value()
+                                if bg_data == None:
+                                    bg_data = 0
+                                if bg_data != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bg_data)
+
+                                EventMesh.txt_log("auto stop_bp:333")
+                        else:
+                            self.old_bg_time = 0
+                    else:
+                        self.old_bg_time = 0
+
+                    
+                    if get_temp_state != None:
+                        if get_temp_state == 3:#单次测量
+                            self.temp_one_state+=1
+                            if self.temp_one_state == 1:
+                                EventMesh.txt_log("auto start_temp:333")
+                                EventMesh.debug_log("AUTO one temp:2") 
+                                EventMesh.publish("set_temp_state",3)
+                                # EventMesh.publish("set_hr_blood_led",1)
+                                EventMesh.publish(constants.EVENT.START_TEMP)   
+                            elif self.temp_one_state > 3:
+                                self.temp_one_state = 0
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                temp = self.optimize_temp(temp)
+                                
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                                EventMesh.txt_log("auto start_temp:333")
+
+
+        
+                    
+                    # EventMesh.debug_log("get_temp_time:{} self.temp_one_state:{}".format(get_temp_time,self.temp_one_state))
+                    if get_temp_time != None:#定时测量体温
+                        if get_temp_time > 0:
+                            if get_temp_state != None:
+                                get_temp_state  = EventMesh.publish("get_temp_state")
+                                if get_temp_state == 0 or get_temp_state == 2:
+                                    if (time_tmp-self.temp_timeSecond) >= get_temp_time:#大于一个周期的时间,重新赋值
+                                        self.temp_state = 0
+                                        self.temp_timeSecond = time_tmp
+
+                                    if (time_tmp-self.temp_timeSecond) == 0 and self.temp_state == 0:#一开始就测量 测量一分钟停止测量体温
+                                        self.temp_state = 1
+                                        EventMesh.publish("set_temp_state",2)
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.debug_log("AUTO temp:") 
+                                        EventMesh.txt_log("auto START_temp:1")
+                                        EventMesh.publish(constants.EVENT.START_TEMP)
+
+                                    elif (time_tmp-self.temp_timeSecond) >= 30 and self.temp_state == 1 and get_temp_state == 2:
+                                        self.temp_state = 0
+                                        EventMesh.txt_log("auto stop_temp:1")
+                                        EventMesh.publish("set_temp_state",0)
+                                        temp = EventMesh.publish(constants.EVENT.GET_TEMP) 
+                                        temp = self.optimize_temp(temp)
+                                        
+                                        tmp_f_tmp = 0
+                                        tmp_d_tmp = 0
+                                        if str(temp).find(".") != -1:
+                                            tmp_f = str(temp).split('.')[0] 
+                                            tmp_f_tmp = int(tmp_f)
+                                            
+                                            tmp_d = str(temp).split('.')[1][:1]
+                                            tmp_d_tmp = int(tmp_d)
+                                        else:
+                                            tmp_f_tmp = temp
+                                            
+                                        if temp != None:
+                                            if temp != 0:
+                                                EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                                else:
+                                    self.temp_state = 0
+                                    self.old_temp_time = 0
+                        else:
+                            temp_state  = EventMesh.publish("get_temp_state") 
+                            if temp_state == 2:
+                                EventMesh.publish("set_temp_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.txt_log("auto wear stop_temp:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+                            self.temp_state = 0
+                            self.temp_timeSecond = 0
+                            self.old_temp_time = 0
+
+
+
+                    hr_time = EventMesh.publish("get_time_hr")#获取时间是否大于0
+                    if hr_time !=  None:
+                        self.mearsure_btn = int(hr_time[0])
+                        self.mearsure_timer = int(hr_time[1])
+
+                        if self.mearsure_btn != None and self.mearsure_timer != None:
+                            
+                            if self.mearsure_btn >= 1 and self.mearsure_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                                get_hr_state = EventMesh.publish("get_hr_state")#心率
+                                get_spo2_state = EventMesh.publish("get_spo2_state")#血氧
+                                get_bp_state  = EventMesh.publish("get_bp_state")#血压
+                                get_bg_state  = EventMesh.publish("get_bg_state")#血糖
+                                # print("state hr",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                                if (get_bg_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and  (get_hr_state == 2 or get_hr_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                    if (time_tmp-self.hr_timeSecond) >= self.mearsure_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                        self.hr_timeSecond = time_tmp
+                                        self.HR_Onestate = 0
+                                    # print("time_tmp hr",time_tmp,self.hr_timeSecond,time_tmp-self.hr_timeSecond,self.mearsure_timer,self.HR_Onestate)
+                                    if (time_tmp - self.hr_timeSecond) == 0 and self.HR_Onestate == 0:
+                                        self.HR_Onestate = 1
+                                        EventMesh.txt_log("auto START_hr:1")
+                                        EventMesh.publish("set_hr_state",2)#2代表后台进入测试
+                                        # EventMesh.publish("set_hr_blood_led",1)
+                                        EventMesh.publish(constants.EVENT.START_HEART)
+                                        
+                                    elif (time_tmp - self.hr_timeSecond) >= 60 and self.HR_Onestate == 1 and get_hr_state == 2:
+                                        self.HR_Onestate = 0
+                                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                        EventMesh.debug_log("stop debug3")
+                                        EventMesh.txt_log("auto stop_hr:1")
+                                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                                        heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                                        EventMesh.debug_log("heart_value:{}".format(heart_value))
+                                        # heart_value = 60+urandom.randint(0,10)
+                                        if heart_value >= 50 and heart_value != None:
+                                            EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                                        #获取心率数据上传数据app
+                                        EventMesh.debug_log("STOP_HEART:")
+                                        
+                                else:
+                                    self.HR_Onestate = 0
+                            else:
+                                self.hr_timeSecond = 0
+                                self.HR_Onestate = 0
+                                hr_state = EventMesh.publish("get_hr_state")#心率
+                                if hr_state == 2:
+                                    EventMesh.publish("set_hr_state",0)#2代表后台进入测试
+                                    EventMesh.debug_log("33stop debug3")
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto wear stop_hr:2 ")
+
+                    get_spo2time = EventMesh.publish("get_spo2_time")#血压自动测试
+                    # print("get_spo2time",get_spo2time)
+                    if get_spo2time != None:#血压时间不为0
+                        spo2_on = int(get_spo2time[0])
+                        spo2_time = int(get_spo2time[1])
+                        if spo2_on != 0 and spo2_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            if (get_hr_state == 0 and get_bp_state == 0 and get_bg_state == 0) and (get_spo2_state == 2 or get_spo2_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.spo2_timeSecond) >= spo2_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.spo2_timeSecond = time_tmp
+                                    self.spo2auto_state = 0
+                                # print("time_tmp spo2",time_tmp,self.spo2_timeSecond,time_tmp-self.spo2_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.spo2_timeSecond) == 0 and self.spo2auto_state == 0:
+                                    self.spo2auto_state = 1
+                                    EventMesh.debug_log("START_spo2:auto")
+                                    EventMesh.txt_log("auto START_spo2:1")
+                                    EventMesh.publish("set_spo2_state",2)#2代表后台进入测试
+                                    EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN)#K开血氧
+                                    
+                                elif (time_tmp - self.spo2_timeSecond) >= 60 and self.spo2auto_state == 1 and get_spo2_state == 2:
+                                    EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                    self.spo2auto_state = 0
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                    spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                    if spo2_value > 85 and spo2_value != None:
+                                        EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                    EventMesh.txt_log("auto stop_spo2:1")
+                                
+                            else:
+                                self.spo2auto_state = 0
+                        else:
+                            self.spo2_timeSecond = 0
+                            self.spo2auto_state = 0
+                            spo2_state = EventMesh.publish("get_spo2_state")#心率
+                            if spo2_state == 2:
+                                EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("spo2 stop debug3")
+                                EventMesh.txt_log("auto wear stop_spo2:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+
+
+                    get_bptime = EventMesh.publish("get_bp_time")#血压自动测试
+                    # print("get_bptime",get_bptime)
+                    if get_bptime != None:#血压时间不为0
+                        bp_on = int(get_bptime[0])
+                        bp_time = int(get_bptime[1])
+                        if bp_on != 0 and bp_time != 0:
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0) and (get_bp_state == 2 or get_bp_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bp_timeSecond) >= bp_time:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bp_timeSecond = time_tmp
+                                    self.bpauto_state = 0
+                                # print("time_tmp bp",time_tmp,self.bp_timeSecond,time_tmp-self.bp_timeSecond,self.bg_timer,self.bpauto_state)
+                                if (time_tmp - self.bp_timeSecond) == 0 and self.bpauto_state == 0:
+                                    self.bpauto_state = 1
+                                    EventMesh.debug_log("START_bp:auto")
+                                    EventMesh.txt_log("auto START_bp:1")
+                                    EventMesh.publish("set_bp_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    
+                                elif (time_tmp - self.bp_timeSecond) >= 60 and self.bpauto_state == 1 and get_bp_state == 2:
+                                    self.bpauto_state = 0
+                                    EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                    blood_data = get_autoblood_value()
+                                    if blood_data == None:
+                                        blood_data[0] = 0
+                                        blood_data[1] = 0
+
+                                    max_value = blood_data[0]
+                                    min_value = blood_data[1]
+                                    if max_value != 0 and min_value != 0:
+                                        EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    EventMesh.txt_log("auto stop_bp:1")
+                                    
+                            else:
+                                self.bpauto_state = 0
+                        else:
+                            self.bp_timeSecond = 0
+                            self.bpauto_state = 0
+                            bp_state = EventMesh.publish("get_bp_state")#心率
+                            if bp_state == 2:
+                                EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                                EventMesh.debug_log("bp stop debug3")
+                                EventMesh.txt_log("auto wear stop_bp:2 ")
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+
+
+
+                    bg_time = EventMesh.publish("get_bgauto_time")
+                    if bg_time != None:
+                    
+                        bg_btn = int(bg_time[0])
+                        bg_timer = int(bg_time[1]) 
+                        # print("state bg2",self.bg_btn,self.bg_timer)
+                        if bg_btn >= 1 and bg_timer > 0:#开关打开并且时间大于0就可以测试血糖
+                            get_hr_state = EventMesh.publish("get_hr_state")
+                            get_spo2_state = EventMesh.publish("get_spo2_state")
+                            get_bp_state  = EventMesh.publish("get_bp_state")
+                            get_bg_state  = EventMesh.publish("get_bg_state")
+                            # print("state bg2",get_hr_state,get_spo2_state,get_bp_state,get_bg_state)
+                            
+                            if (get_hr_state == 0 and get_spo2_state == 0 and get_bp_state == 0) and (get_bg_state == 2 or get_bg_state == 0):#心率血压血氧不在测试就测试血糖自动测量
+                                if (time_tmp-self.bg_timeSecond) >= bg_timer:#大于一个周期的时间,保存的时间戳时间 1678 0 1678 30 1678 
+                                    self.bg_timeSecond = time_tmp #1780 
+                                    self.BG_state = 0
+                                # print("time_tmp bg",time_tmp,self.bg_timeSecond,time_tmp-self.bg_timeSecond,bg_timer,self.BG_state)
+                                if (time_tmp - self.bg_timeSecond) == 0 and self.BG_state == 0:
+                                    EventMesh.debug_log("START_bg:1")
+                                    EventMesh.txt_log("auto START_bg:1")
+                                    EventMesh.publish("set_bg_state",2)#2代表后台进入测试
+                                    # EventMesh.publish("set_hr_blood_led",1)
+                                    EventMesh.publish(constants.EVENT.START_HEART)
+                                    self.BG_state = 1
+                                elif (time_tmp - self.bg_timeSecond) >= 60 and self.BG_state == 1 and get_bg_state == 2:
+                                    self.BG_state = 0
+                                    EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                    # EventMesh.publish("stop_led_timer")#设置参数
+                                    EventMesh.txt_log("auto stop_bg:1")
+                                    EventMesh.debug_log("stop bgdebug3")
+                                    EventMesh.publish(constants.EVENT.STOP_HEART)
+                                    bgdata = get_blood_sugar_value()
+                                    if bgdata == None:
+                                        bgdata = 0
+                                    if bgdata != 0:
+                                        EventMesh.debug_log("bgdata",bgdata)
+                                        EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                                    
+                            else:
+                                
+                                self.BG_state = 0
+                        else:
+                            bg_state  = EventMesh.publish("get_bg_state") 
+                            if bg_state == 2:
+                                EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                                # EventMesh.publish("stop_led_timer")#设置参数
+                                EventMesh.debug_log("bg stop bgdebug3")
+                                EventMesh.txt_log("auto wear stop_bg:2 ")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)
+                            self.bg_timeSecond = 0
+                            self.BG_state = 0
+
+
+
+
+
+                else:
+                    self.old_temp_time = 0
+                    self.old_time = 0
+                    # self.hr_timeSecond = time_tmp
+                    self.HR_Onestate = 0
+                    self.HR_OneTime = 0
+                    self.HR_state = 0
+                    self.old_time = 0    
+                    self.old_bp_time = 0
+                    self.old_hr_time = 0
+                    self.old_spo2_time = 0
+                    self.set_hsenor_crt = 0
+                    self.old_bg_time = 0
+                    # self.bg_timeSecond = time_tmp
+                    self.BG_state = 0
+                    # self.temp_timeSecond = time_tmp
+
+                    # self.bp_timeSecond = time_tmp
+                    self.bpauto_state = 0
+
+                    # self.spo2_timeSecond = time_tmp
+                    self.spo2auto_state = 0
+
+                    self.temp_state = 0
+                    self.temp_one_state = 0
+
+
+            else:
+                self.old_temp_time = 0
+                self.old_time = 0
+                # self.hr_timeSecond = time_tmp
+                self.HR_Onestate = 0
+                self.HR_OneTime = 0
+                self.HR_state = 0
+                self.old_time = 0    
+                self.old_bp_time = 0
+                self.old_hr_time = 0
+                self.old_spo2_time = 0
+                self.set_hsenor_crt = 0
+                self.old_bg_time = 0
+                # self.bg_timeSecond = time_tmp
+
+                self.BG_state = 0
+                # self.temp_timeSecond = time_tmp
+
+                # self.bp_timeSecond = time_tmp
+                self.bpauto_state = 0
+
+                # self.spo2_timeSecond = time_tmp
+                self.spo2auto_state = 0
+
+                self.temp_state = 0
+                self.temp_one_state = 0
+
+                get_hr_state = EventMesh.publish("get_hr_state")
+                get_spo2_state = EventMesh.publish("get_spo2_state")
+                get_bp_state  = EventMesh.publish("get_bp_state")
+                get_bg_state  = EventMesh.publish("get_bg_state")
+                if get_hr_state != None and get_spo2_state != None and get_bp_state != None and get_bg_state != None:
+                    if get_hr_state > 1:
+                        EventMesh.txt_log("auto stop_hr:44")
+                        EventMesh.publish("set_hr_state",0)#2代表后台进入测试,定时测心率 1ui界面测试洗心率 
+                        # if get_hr_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.debug_log("stop debug8")
+                        if WEAR == 1:
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+                        EventMesh.publish(constants.EVENT.STOP_HEART) 
+                    elif get_spo2_state > 1:
+                        EventMesh.txt_log("auto stop_spo2:44")
+                        EventMesh.publish("set_spo2_state",0)#2代表后台进入测试
+                        # if get_spo2_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                            if spo2_value > 85 and spo2_value != None:
+                                EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                        EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                        EventMesh.debug_log("stop debug13")
+                    elif get_bp_state > 1:
+                        EventMesh.txt_log("auto stop_bp:44")
+                        EventMesh.publish("set_bp_state",0)#2代表后台进入测试
+                        # if get_bp_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        if WEAR == 1:
+                            blood_data = get_autoblood_value()
+                            if blood_data == None:
+                                blood_data[0] = 0
+                                blood_data[1] = 0
+
+                            max_value = blood_data[0]
+                            min_value = blood_data[1]
+                            if max_value != 0 and min_value != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        EventMesh.debug_log("stop debug14")
+                    elif get_bg_state > 1:
+                        EventMesh.txt_log("auto stop_bg:44")
+                        EventMesh.publish("set_bg_state",0)#2代表后台进入测试
+                        # if get_bg_state == 3:
+                        #     EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish(constants.EVENT.STOP_HEART)
+                        if WEAR == 1:
+                            bgdata = get_blood_sugar_value()
+                            if bgdata == None:
+                                bgdata = 0
+                            if bgdata != 0:
+                                EventMesh.publish(constants.PROTOCOL.BLOODGLUSOCE_SEND,bgdata)#上传心率数据
+                        EventMesh.debug_log("stop debug15")
+                get_temp_state  = EventMesh.publish("get_temp_state")
+                if get_temp_state != None:
+                    if get_temp_state > 1:
+                        self.temp_one_state = 0
+                        self.temp_state = 0
+                        temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                        temp = self.optimize_temp(temp)
+                        EventMesh.txt_log("auto stop_temp:44")
+                        EventMesh.publish("set_temp_state",0)
+                        if WEAR == 1:
+                            tmp_f_tmp = 0
+                            tmp_d_tmp = 0
+                            if str(temp).find(".") != -1:
+                                tmp_f = str(temp).split('.')[0] 
+                                tmp_f_tmp = int(tmp_f)
+                                
+                                tmp_d = str(temp).split('.')[1][:1]
+                                tmp_d_tmp = int(tmp_d)
+                            else:
+                                tmp_f_tmp = temp
+                                
+                            if temp != None:
+                                if temp != 0:
+                                    EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                        EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+
+            hr_state = EventMesh.publish("get_hr_state")
+            spo2_state = EventMesh.publish("get_spo2_state")
+            temp_state  = EventMesh.publish("get_temp_state")
+            if hr_state != None or spo2_state != None or temp_state != None:#手动测试
+                auto_hr = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_hr == None:
+                    auto_hr = 0
+                if hr_state == 1:
+                    if auto_hr != 0:
+                        self.auto_hr_count+=1
+                        if  self.auto_hr_count > 6:
+                            self.auto_hr_count = 0
+                            EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                            EventMesh.debug_log("stop debug7")
+                            EventMesh.publish(constants.EVENT.STOP_HEART)
+                            heart_value = EventMesh.publish(constants.EVENT.GET_HEART)
+                            if heart_value >= 50 and heart_value != None:
+                                EventMesh.publish("play_hr_value",heart_value)
+                                # EventMesh.publish("set_history_hr_value",heart_value)
+                                EventMesh.publish(constants.PROTOCOL.HEART_SEND,heart_value)#上传心率数据
+
+                                blood_data = get_autoblood_value()
+                                if blood_data == None:
+                                    blood_data[0] = 0
+                                    blood_data[1] = 0
+
+                                max_value = blood_data[0]
+                                min_value = blood_data[1]
+                                if max_value != 0 and min_value != 0:
+                                    EventMesh.publish(constants.PROTOCOL.BLOOD_SEND,[max_value,min_value])
+
+                            else:
+                                EventMesh.publish("play_hr_value",0) 
+                        else :
+                            if WEAR != 1:
+                                EventMesh.publish("set_hr_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop debug7")
+                                EventMesh.publish(constants.EVENT.STOP_HEART)                               
+                                EventMesh.publish("play_hr_value",0) 
+                                
+                else:
+                    self.auto_hr_count = 0
+                    
+
+                auto_spo2 = EventMesh.publish("get_start_measure_time")#设置开始测量的时间戳时间
+                if auto_spo2 == None:
+                    auto_spo2 = 0
+                if spo2_state == 1:#手动测试血氧
+                    if auto_spo2 != None:
+                        if auto_spo2 != 0:
+                            self.auto_spo2_count+=1
+                            if self.auto_spo2_count > 6:
+                                self.auto_spo2_count = 0
+                                EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                EventMesh.debug_log("stop spo2 debug7")
+                                EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)
+                                spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN)
+                                if spo2_value > 85 and spo2_value != None:
+                                    EventMesh.publish("play_spo2_value",spo2_value)
+                                    EventMesh.publish("set_old_spo2_data",spo2_value)
+                                    EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND,spo2_value)
+                                else:
+                                    EventMesh.publish("play_spo2_value",0)
+                            
+                            else:
+                                if WEAR != 1:
+                                    EventMesh.publish("set_spo2_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug8")
+                                    EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN)                               
+                                    EventMesh.publish("play_spo2_value",0) 
+                                    
+                else:
+                    self.auto_spo2_count = 0
+
+                if temp_state == 1:#手动测试体温
+                    auto_temp = EventMesh.publish("get_start_temp_measure_time")#设置开始测量的时间戳时间
+                    if auto_temp == None:
+                        auto_temp = 0
+                    if auto_temp != None:
+                        if auto_temp != 0:
+                            self.auto_temp_count += 1
+                            if self.auto_temp_count > 6:
+                                self.auto_temp_count = 0
+                                EventMesh.debug_log("体温测量结束")
+                                temp = EventMesh.publish(constants.EVENT.GET_TEMP)       
+                                temp = self.optimize_temp(temp)
+                                EventMesh.debug_log("temp",temp)
+                                EventMesh.publish("set_temp_state",0)
+                                tmp_f_tmp = 0
+                                tmp_d_tmp = 0
+                                if str(temp).find(".") != -1:
+                                    tmp_f = str(temp).split('.')[0] 
+                                    tmp_f_tmp = int(tmp_f)
+                                    
+                                    tmp_d = str(temp).split('.')[1][:1]
+                                    tmp_d_tmp = int(tmp_d)
+                                else:
+                                    tmp_f_tmp = temp
+                                    
+                                if temp != None:
+                                    if temp != 0:
+                                        # EventMesh.publish("set_history_temp_value",temp)
+                                        EventMesh.publish("play_temp_value",temp)#播放体温数值
+                                        EventMesh.publish(constants.PROTOCOL.TEMP_SEND,[tmp_f_tmp,tmp_d_tmp])
+                                    else:
+                                        # EventMesh.publish("set_history_temp_value",0)
+                                        EventMesh.publish("play_temp_value",0)#播放体温数值
+                                
+                                EventMesh.publish(constants.EVENT.STOP_TEMP)
+
+                            else :
+                                if WEAR  != 1:
+                                    EventMesh.publish("set_temp_state",0)#0代表g关闭测试
+                                    EventMesh.debug_log("stop debug9")
+                                    EventMesh.publish(constants.EVENT.STOP_TEMP)                               
+                                    EventMesh.publish("play_temp_value",0) 
+                                    
+                else:
+                    self.auto_temp_count = 0
+
+            EventMesh.publish("play_unread_wechat_infor")#每10s检测是否有未读语音数据
+
+            usb_state = EventMesh.publish("get_usb")#
+            
+            # EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+            if battery[0] == '1':
+                # EventMesh.debug_log("battery[1]",battery[1])
+                if self.vbat_full_flag <= 120:
+                    self.vbat_full_flag+=10
+                    if self.vbat_full_flag == 60:#开机检测一次如果是充电标识为1就不再提示
+                        if usb_state != 1:
+                            EventMesh.publish("set_usb",1)#
+                else:
+                    if battery[1] >= 100:
+                        if self.charge_full_count == 0:#充电已满
+                            EventMesh.publish("set_usb",3)#
+                            EventMesh.debug_log("charge R_CHARGE_full")
+                            self.charge_full_count = 1
+                    
+            else:
+                self.charge_full_count = 0
+                low_power = battery[1]
+                if low_power <= 5:#小于5%红色灯慢闪
+                    EventMesh.publish("set_led_time_arg",[1,2,20*11,led_mode.FLASH_LIGHT_RED,20,10,led_mode.OTHER_MEASURE_MODE])#測量成功
+                    # EventMesh.publish("set_led_time_arg",[1000,400,52,led_mode.FLASH_LIGHT_RED,led_mode.DEFAULT_LONG_LIGHT_MODE,led_mode.OTHER_MEASURE_MODE])#開始測量
+
+            
+            self.normal_alarm()
+            #喝水提醒
+            self.drink_alarm()
+            #该吃药了
+            self.medicine_alarm()
+            #该起床了
+            self.wakeup_alarm()
+            #该睡觉了
+            self.sleep_alarm()
+            #该回家了
+            self.home_alarm()
+            #该休息了
+            self.reset_alarm()
+
+
+            if self.alarm_flag == 0:
+                self.alarm_flag = 1
+                EventMesh.publish("set_rtc_alarm")
+
+            EventMesh.publish("video_no_network")
+
+        def clear_usb_flag(self,event,msg):
+            self.charge_full_count = 0
+        #普通闹钟
+        def normal_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.normal_oldtotalmin",self.normal_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.normal_oldtotalmin == 0:
+                self.normal_oldtotalmin = cur_total_min #549
+            if self.normal_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.normal_flag == 1:
+                    self.normal_flag = 0
+                    self.normal_count = 0
+            normal_alarm = []
+            normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.normal_flag == 1:#表示闹钟响过清除标志
+                self.normal_count+=1
+                if self.normal_count > 6:
+                    self.normal_count = 0
+                    self.normal_flag = 0
+            if normal_alarm != None:
+                if len(normal_alarm) != 0 and normal_alarm != []:
+                    j = 0
+                    for i in range(len(normal_alarm)):
+                        # EventMesh.debug_log("normal_alarm normal_alarm 33",normal_alarm,j)
+                        normalalarm_hour = normal_alarm[j]["hour"]
+                        normalalarm_min = normal_alarm[j]["min"]
+                        normalalarm_day = normal_alarm[j]["day"]
+                        normalalarm_enale = normal_alarm[j]["enable"]
+                        normalalarm_totalmin = int(normalalarm_hour)*60+int(normalalarm_min)
+                        # EventMesh.debug_log("wake alarm",normalalarm_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if normalalarm_day == []:#单次闹钟只响一次
+                            if normalalarm_enale != 0:
+                                if cur_total_min > normalalarm_totalmin:
+                                    normal_alarm.pop(j)
+                                    self.normal_count = 0
+                                    self.normal_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                        self.normal_count = 0
+                                        self.normal_flag  = 0    
+                                        normal_alarm.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm])#删除之后重新保存
+                                        EventMesh.publish("OPEN_ALARM_RING")                                                                                                                                            
+                                        break
+                        else:
+                            if normalalarm_enale != 0 and (week in normalalarm_day):#记录响过的时间分钟数
+                                if normalalarm_totalmin == cur_total_min and self.normal_flag == 0:#14:00
+                                    self.normal_flag  = 1
+                                    self.normal_count = 0
+                                    self.normal_oldtotalmin = normalalarm_totalmin
+                                    EventMesh.publish("OPEN_ALARM_RING")#                                                                                                                                                  
+                                    break
+                        j+=1
+
+
+        #喝水提醒
+        def drink_alarm(self):
+            date_tmp = utime.localtime()
+            time_tmp = utime.mktime(date_tmp)
+        
+            if self.drink_time == 0:
+                self.drink_time = time_tmp
+            
+            on = EventMesh.publish("get_storage_config","drink_on")
+            time = EventMesh.publish("get_storage_config","drink_time")
+            # print("drink info2",on,time)
+            if on != None and time != None:
+                if on != 0 and time != 0:
+                    if (time_tmp - self.drink_time) >= (time*60*60):#需要转换成小时3600
+                        self.drink_time = time_tmp 
+                        EventMesh.publish("drink_alarm_event")#该喝水了
+                        #该喝水了
+                else:
+                    self.drink_time = 0
+            else:
+                self.drink_time = 0
+
+        #吃药提醒
+        def medicine_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # print("self.medicine_oldtotalmin",self.medicine_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.medicine_oldtotalmin == 0:
+                self.medicine_oldtotalmin = cur_total_min #549
+            if self.medicine_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.medicine_flag == 1:
+                    self.medicine_flag = 0
+                    self.medicine_count = 0
+            medicine = EventMesh.publish("get_storage_config","medicine")
+            # print("medicine info2",medicine,cur_total_min)
+            if self.medicine_flag == 1:#表示闹钟响过清除标志
+                self.medicine_count+=1
+                if self.medicine_count > 6:
+                    self.medicine_count = 0
+                    self.medicine_flag = 0
+            if medicine != None:
+                if len(medicine) != 0 and medicine != []:
+                    for i in range(len(medicine)):
+                        medicine_hour = medicine[i]["hour"]
+                        medicine_min = medicine[i]["min"]
+                        medicine_day = medicine[i]["day"]
+                        medicine_enale = medicine[i]["enable"]
+                        medicine_totalmin = int(medicine_hour)*60+int(medicine_min)
+                        # print("medicine alarm",medicine_hour,medicine_min,medicine_day,medicine_enale,medicine_totalmin,week)
+                        if medicine_day == []:
+                            if medicine_enale != 0:
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_count = 0
+                                    self.medicine_flag  = 1    
+                                    self.medicine_oldtotalmin = medicine_totalmin#记录响过的时间分钟数
+                                    # print("medicine alarm1")
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                              
+                                    break
+                        else:
+                            if medicine_enale != 0 and (week in medicine_day):#记录响过的时间分钟数
+                                if medicine_totalmin == cur_total_min and self.medicine_flag == 0:#14:00
+                                    self.medicine_flag  = 1
+                                    self.medicine_count = 0
+                                    self.medicine_oldtotalmin = medicine_totalmin
+                                    # print("medicine alarm2",)
+                                    EventMesh.publish("medicine_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+        #该起床了
+        def wakeup_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.wakeup_oldtotalmin",self.wakeup_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.wakeup_oldtotalmin == 0:
+                self.wakeup_oldtotalmin = cur_total_min #549
+            if self.wakeup_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.wakeup_flag == 1:
+                    self.wakeup_flag = 0
+                    self.wakeup_count = 0
+            wakeup = []
+            wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+            # EventMesh.debug_log("wakeup info2",wakeup,cur_total_min)
+            if self.wakeup_flag == 1:#表示闹钟响过清除标志
+                self.wakeup_count+=1
+                if self.wakeup_count > 6:
+                    self.wakeup_count = 0
+                    self.wakeup_flag = 0
+            if wakeup != None:
+                if len(wakeup) != 0 and wakeup != []:
+                    j = 0
+                    for i in range(len(wakeup)):
+                        wakeup_hour = wakeup[j]["hour"]
+                        wakeup_min = wakeup[j]["min"]
+                        wakeup_day = wakeup[j]["day"]
+                        wakeup_enale = wakeup[j]["enable"]
+                        wakeup_totalmin = int(wakeup_hour)*60+int(wakeup_min)
+                        # EventMesh.debug_log("wake alarm",wakeup_hour,wakeup_min,wakeup_day,wakeup_enale,wakeup_totalmin,week)
+                        if wakeup_day == []:#单次闹钟只响一次
+                            if wakeup_enale != 0:
+                                if cur_total_min > wakeup_totalmin:
+                                    self.wakeup_count = 0
+                                    self.wakeup_flag  = 0    
+                                    wakeup.pop(j)
+                                    j=0#每次删除都从0开始遍历
+                                    # EventMesh.debug_log("wakeup wakeup1 dayu",wakeup,j)
+                                    EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                    continue
+                                else:
+                                    if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                        self.wakeup_count = 0
+                                        self.wakeup_flag  = 0    
+                                        wakeup.pop(j)
+                                        EventMesh.debug_log("wakeup wakeup1",wakeup,j)
+                                        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup])
+                                        EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if wakeup_enale != 0 and (week in wakeup_day):#记录响过的时间分钟数
+                                if wakeup_totalmin == cur_total_min and self.wakeup_flag == 0:#14:00
+                                    self.wakeup_flag  = 1
+                                    self.wakeup_count = 0
+                                    self.wakeup_oldtotalmin = wakeup_totalmin
+                                    EventMesh.publish("wakeup_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该睡觉了
+        def sleep_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.sleep_oldtotalmin",self.sleep_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.sleep_oldtotalmin == 0:
+                self.sleep_oldtotalmin = cur_total_min #549
+            if self.sleep_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.sleep_flag == 1:
+                    self.sleep_flag = 0
+                    self.sleep_count = 0
+            sleep = []
+            sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.sleep_flag == 1:#表示闹钟响过清除标志
+                self.sleep_count+=1
+                if self.sleep_count > 6:
+                    self.sleep_count = 0
+                    self.sleep_flag = 0
+            if sleep != None:
+                if len(sleep) != 0 and sleep != []:
+                    j = 0
+                    count = int(len(sleep))
+                    for i in range(len(sleep)):
+                        # EventMesh.debug_log("wakeup wakeup 33",sleep,j)
+                        sleep_hour = sleep[j]["hour"]
+                        sleep_min = sleep[j]["min"]
+                        sleep_day = sleep[j]["day"]
+                        sleep_enale = sleep[j]["enable"]
+                        sleep_totalmin = int(sleep_hour)*60+int(sleep_min)
+                        # EventMesh.debug_log("wake alarm",sleep_hour,sleep_min,sleep_day,sleep_enale,sleep_totalmin,week)
+                        if sleep_day == []:#单次闹钟只响一次
+                            if sleep_enale != 0:
+                                if cur_total_min > sleep_totalmin:
+                                    sleep.pop(j)
+                                    self.sleep_count = 0
+                                    self.sleep_flag  = 0 
+                                    j=0
+                                    # EventMesh.debug_log("wakeup wakeup dayu",sleep,j)
+                                    EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                    # sleep = EventMesh.publish("get_storage_config","sleep_alarm")#删除之后重新保存
+                                    continue
+                                else:
+                                    if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                        self.sleep_count = 0
+                                        self.sleep_flag  = 0    
+                                        sleep.pop(j)
+                                        # EventMesh.debug_log("wakeup wakeup1",sleep,j)
+                                        EventMesh.publish("set_storage_config",["sleep_alarm",sleep])#删除之后重新保存
+                                        EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                              
+                                        break
+                        else:
+                            if sleep_enale != 0 and (week in sleep_day):#记录响过的时间分钟数
+                                if sleep_totalmin == cur_total_min and self.sleep_flag == 0:#14:00
+                                    self.sleep_flag  = 1
+                                    self.sleep_count = 0
+                                    self.sleep_oldtotalmin = sleep_totalmin
+                                    EventMesh.publish("sleep_alarm_event")#该吃药了                                                                                                                                                   
+                                    break
+                        j+=1
+
+
+        #该回家了
+        def home_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.home_oldtotalmin",self.home_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.home_oldtotalmin == 0:
+                self.home_oldtotalmin = cur_total_min #549
+            if self.home_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.home_flag == 1:
+                    self.home_flag = 0
+                    self.home_count = 0
+            home = ''
+            home = EventMesh.publish("get_storage_config","home_alarm")
+            # EventMesh.debug_log("sleep info2",sleep,cur_total_min)
+            if self.home_flag == 1:#表示闹钟响过清除标志
+                self.home_count+=1
+                if self.home_count > 6:
+                    self.home_count = 0
+                    self.home_flag = 0
+            if home != None:
+                if len(str(home)) != 0 and str(home) != '':
+                    # EventMesh.debug_log("home home 33",home)
+                    home_hour = int(str(home).split(":")[0])
+                    home_min = int(str(home).split(":")[1])
+                    
+                    home_totalmin = int(home_hour)*60+int(home_min)
+                    if home_totalmin == cur_total_min and self.home_flag == 0:#14:00
+                        self.home_flag  = 1
+                        self.home_count = 0
+                        self.home_oldtotalmin = home_totalmin
+                        EventMesh.publish("home_alarm_event")#该回家了                                                                                                                                                   
+
+
+        
+        #该休息了
+        def reset_alarm(self):
+            data = RTC().datetime()
+            hour = data[4]
+            min = data[5]
+
+            week = int(data[3])
+
+            date1 = data[1]
+            date2 = data[2]
+            cur_total_min = int(hour)*60+int(min)
+            # EventMesh.debug_log("self.reset_oldtotalmin",self.reset_oldtotalmin,cur_total_min,self.alarm_flag)
+            if self.reset_oldtotalmin == 0:
+                self.reset_oldtotalmin = cur_total_min #549
+            if self.reset_oldtotalmin != cur_total_min: #上次响过的闹钟分钟数不等于当前的分钟数据需要清零否则下一个不会响铃
+                if self.reset_flag == 1:
+                    self.reset_flag = 0
+                    self.reset_count = 0
+            reset_alarm = []
+            reset_alarm = EventMesh.publish("get_storage_config","reset_alarm")
+            # EventMesh.debug_log("reset_alarm info2",len(reset_alarm),cur_total_min)
+            if self.reset_flag == 1:#表示闹钟响过清除标志
+                self.reset_count+=1
+                if self.reset_count > 6:
+                    self.reset_count = 0
+                    self.reset_flag = 0
+            if reset_alarm != None:
+                if len(str(reset_alarm)) != 0 and str(reset_alarm) != []:
+                    for i in range(len(reset_alarm)):
+                        # print("i",i)
+                        start_hour = int(reset_alarm[i]["start_hour"])
+                        start_min = int(reset_alarm[i]["start_min"])
+
+                        end_hour = int(reset_alarm[i]["end_hour"])
+                        end_min = int(reset_alarm[i]["end_min"])
+
+                        # EventMesh.debug_log("reset_alarm home 33",reset_alarm)
+                        
+                        start_totalmin = int(start_hour)*60+int(start_min)
+                        end_totalmin = int(end_hour)*60+int(end_min)
+
+                        if start_totalmin == cur_total_min and self.reset_flag == 0:#14:00
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = start_totalmin
+                            EventMesh.publish("reset_alarm_event")#该休息了     
+                            break
+
+                        if end_totalmin == cur_total_min and self.reset_flag == 0:
+                            self.reset_flag  = 1
+                            self.reset_count = 0
+                            self.reset_oldtotalmin = end_totalmin
+                            EventMesh.publish("reset_end_alarm_event")#休息结束了     
+                            break
+                                                                                                                                                                    
+
+        def clear_normal_alarm(self,event,msg):#普通闹钟清除标志
+            self.normal_flag = 0
+            self.normal_count = 0
+            self.normal_oldtotalmin = 0
+
+        def clear_reset_alarm(self,event,msg):#休息清除标志
+            self.reset_flag = 0
+            self.reset_count = 0
+            self.reset_oldtotalmin = 0
+
+        def clear_home_alarm(self,event,msg):#回家清除标志
+            self.home_flag = 0
+            self.home_count = 0
+            self.home_oldtotalmin = 0
+
+
+        def clear_medicine_alarm(self,event,msg):#吃药清除标志
+            self.medicine_count = 0
+            self.medicine_flag  = 0
+            self.medicine_oldtotalmin = 0
+        
+
+        def clear_wakeup_alarm(self,event,msg):#起床标识
+            self.wakeup_flag = 0
+            self.wakeup_count = 0
+            self.wakeup_oldtotalmin = 0
+
+        def clear_sleep_alarm(self,event,msg):#睡觉标识
+
+            self.sleep_flag = 0
+            self.sleep_count = 0
+            self.sleep_oldtotalmin = 0
+
+            
+
+
+        def get_sim_Status(self, event, msg):
+            return sim.getStatus()
+        def get_device_ope(self, event, msg):
+            """
+            获取设备运营商信息
+            :param event:
+            :param msg:
+            :return: 运营商
+            """
+            net_ope_map = {
+                "UNICOM": "中国联通HD",
+                "CMCC": "中国移动HD",
+                "CT": "中国电信HD"
+            }
+            """获取运营商"""
+            try:
+                short_eons = net.operatorName()[1]
+            except Exception:
+                return "无"
+            return net_ope_map.get(short_eons, None)
+
+        def get_signal(self, event=None, msg=None):
+            """
+            获取信号事件
+            :param event:
+            :param msg:
+            :return: int 类型
+            """
+            return net.csqQueryPoll()
+
+        def get_time_bucket(self, time):
+            if time < 12:
+                return '上午'
+            else:
+                return '下午'
+
+        def get_week(self, week):
+            if week == 1:
+                return '一'
+            elif week == 2:
+                return '二'
+            elif week == 3:
+                return '三'
+            elif week == 4:
+                return '四'
+            elif week == 5:
+                return '五'
+            elif week == 6:
+                return '六'
+            elif week == 7 or week == 0:
+                return '日'
+
+        def get_time(self, event=None, msg=None):
+            """
+            获取时间事件
+            :param event:
+            :param msg:
+            :return: HH:MM 格式
+            """
+            rtc_time = self.rtc.datetime()
+            
+            date = ("%d月%d日" % (rtc_time[1], rtc_time[2]))
+            year = ("%04d年" % (rtc_time[0]))
+            week = ("星期%s"%(self.get_week(rtc_time[3])))
+            week_data = rtc_time[3]
+            time = [rtc_time[4], rtc_time[5]]
+            time_quantum = ("%s" % (self.get_time_bucket(rtc_time[4])))
+            
+            result = [time, time_quantum, date , week,year,week_data]
+            #时分,上午下午,日期,星期,年 星期
+            return result
+
+        def get_step_count(self, event=None, msg=None):
+            """
+            获取步数
+            """
+            # print("11111:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+
+            tmp = 0
+            step =[0,0,0,0]
+
+            # EventMesh.debug_log("x:%d,y:%d,z:%d tmp %d",XYZ[0],XYZ[1],XYZ[2],tmp)
+            step[0]= tmp 
+            step[1] = 0
+            step[2] = 1
+            step[3] = 2
+            # print("1222:{}".format(EventMesh.publish("get_storage_config","clear_state3")))
+            return step
+
+        def get_ic_cid(self, event, msg):
+            """
+            获取ic cid事件
+            :param event:
+            :param msg:
+            :return: str ic cid
+            """
+            return sim.getIccid()
+
+        def get_phone_num(self, event, msg):
+            """
+            获取电话号码事件
+            :param event:
+            :param msg:
+            :return: str number
+            """
+            return sim.getPhoneNumber()
+
+        def get_battery(self, event=None, msg=None):
+            """
+            获取电池事件,暂时没支持
+            :param event:
+            :param msg:
+            :return:
+            """
+
+            charge_state = '0'
+            if self.get_usb_state() == 1:
+                charge_state = '1'
+            else:
+                charge_state = '0'
+
+            #temp = Power.getVbatt()
+            temp = EventMesh.publish("get_curr_battery_level")
+            vbat = EventMesh.publish("get_battery",temp)
+            if vbat == None:
+                vbat = 100
+            # EventMesh.debug_log("vbat",vbat)
+            # if temp != None :
+            #     if temp <= 3505:
+            #         vbat = 0 
+            #     elif temp <= 3699:
+            #         vbat = 20 #"E:/vbat_20.jpg"
+            #     elif temp <= 3772:
+            #         vbat = 40 #"E:/vbat_40.jpg"
+            #     elif temp <= 3882:
+            #         vbat = 60 #"E:/vbat_60.jpg"
+            #     elif temp <= 4070:
+            #         vbat = 80 #"E:/vbat_80.jpg"
+            #     elif temp <= 4200:
+            #         vbat = 90 #
+            #     else:
+            #         vbat = 100 #"E:/vbat_100.jpg"
+            # else:
+            #     vbat = 100
+
+            result = [charge_state, vbat]
+
+            return result
+        #Set the current average battery level
+        def set_curr_battery_level(self, event=None, msg=None):
+            self.curr_battery_level = msg
+        
+        def get_curr_battery_level(self, event=None, msg=None):
+            return self.curr_battery_level
+
+        def get_device_fw_version(self, *args):
+            '''
+            获取设备固件版本号
+            '''
+            fw_version = modem.getDevFwVersion()
+            if isinstance(fw_version, str):
+                return fw_version
+            return "--"
+
+        def get_standby_time(self, *args):
+            '''
+            获取设备单次开机待机时间
+            '''
+            time_msg = utime.time()
+            d = int(
+                time_msg / 86400)  # The int call removes the decimals.  Conveniently, it always rounds down.  int(2.9) returns 2 instead of 3, for example.
+            time_msg -= (
+                    d * 86400)  # This updates the value of x to show that the already counted seconds won't be double counted or anything.
+            h = int(time_msg / 3600)
+            time_msg -= (h * 3600)
+            m = int(time_msg / 60)
+            time_msg -= (m * 60)
+            s = time_msg
+            result = "{}天{}小时{}分".format(d, h, m)
+            return result
+
+        def set_key(self, topic, msg):
+            self.key = msg["value"]
+        def get_key(self, topic, msg):
+            return self.key
+
+        def get_imei(self, topic, msg):
+            if not self.imei:
+                self.imei = modem.getDevImei()
+            # self.imei = "876226002021444"#视频通话测试账号
+            # self.imei = "826226524724963"#视频通话测试账号
+            # self.imei = "860132060128634" #860132060128634
+            return self.imei
+
+        def get_cid(self, topic, msg):
+            return self.cid
+
+        def set_cid(self, topic, msg):
+            self.cid = msg["value"]
+
+        def get_imsi(self, topic, msg):
+            if not self.imei:
+                self.imei = sim.getImsi()
+            return self.imsi
+
+        def get_password(self, topic, msg):
+            return self.password
+
+        def set_password(self, topic, msg):
+            self.password = msg["value"]
+
+        def set_ping(self, topic, msg):
+            self.PING = msg
+        def get_ping(self, topic, msg):
+            return self.PING
+
+        def set_connect(self, topic, msg):
+            #EventMesh.debug_log("set_connect:{}".format(msg))
+            self.connect = msg
+        def get_connect(self, topic, msg):
+            return self.connect
+
+        def start_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("start_blood_oxygen!!!")
+
+
+        def start_heart(self, topic, msg):
+            EventMesh.debug_log("start_heart!!!")
+
+
+        def stop_blood_oxygen(self, topic, msg):
+            EventMesh.debug_log("stop_blood_oxygen!!!")
+
+
+        def stop_heart(self, topic, msg):
+            EventMesh.debug_log("stop_heart!!!")
+
+
+        def get_blood_oxygen(self, topic, msg):
+
+            return 0
+
+        def get_heart(self, topic, msg):
+
+            return 0
+        
+        def get_wear(self, topic, msg):
+            return 0
+        
+        def get_Hsensor(self, topic, msg):
+            return 0
+        
+        def Hsensor_set_sleep(self, topic, msg):
+            pass
+
+        def start_temp(self, topic, msg):
+            EventMesh.debug_log("start_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            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):
+            EventMesh.debug_log("stop_temp!!!!!!!")
+            WHO_AM_I = bytearray([0x01, 0])
+            I2C_SLAVE_ADDR = 0x49
+            #I2C_SLAVE_ADDR = 0x48
+            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
+            #I2C_SLAVE_ADDR = 0x48
+            r_data = bytearray(2)
+            self.i2c0.read(I2C_SLAVE_ADDR, WHO_AM_I, 1, r_data, 2, 0)
+            #EventMesh.debug_log("temp_data:{}".format(r_data))
+            temp_s = ((r_data[0]<<8) | (r_data[1]))>>4
+            #EventMesh.debug_log("temp_s:{}".format(temp_s))
+            temp_data = temp_s * 0.0625
+            EventMesh.debug_log("temp_data:{}".format(temp_data))
+            return temp_data
+    
+                
+
+        def sim_slot_get(self, topic=None, msg=None):
+            return sim.getCurSimid()
+
+        def sim_slot_switch(self, topic=None, slot=None):
+            """
+            sim 卡槽切换
+            :param topic:
+            :param slot:
+            :return: 切换sim卡卡槽  0 切换成功, 1 无需切换, -1 切换失败
+            """
+            if self.sim_slot_get() == slot:
+                return 1
+            else:
+                return sim.switchCard(slot)
+
+        def usb_event_cb(self, state):
+            status = state
+
+            if status == 1:#插入USB
+                EventMesh.debug_log("charge R_CHARGE_in")
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 1)#
+                pass
+            elif status == 0:#拨出usbs
+                EventMesh.publish("clear_usb_flag")
+                EventMesh.publish("set_usb", 2)#
+                EventMesh.debug_log("charge R_CHARGE_out")
+
+                
+                
+
+        
+
+        def get_usb_state(self):
+            state = self.usb.getStatus()
+            if state == -1:
+                state = 0
+            return state
+        
+
+    def wifiScan_cb(args):
+            EventMesh.publish(constants.EVENT.WIFIINFO, args)
+            wifiScan.control(0)
+
+    class LocationManager(Abstract):
+
+        def __init__(self):
+            self.gps = None
+            #self.match = GPSMatch()
+            self.timer_read_GPS_info = osTimer()
+            self.wifi_data = []
+            self.gps_data  = {}
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.location_check_data_timer_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭
+            self.location_flag = 0
+            self.start_location_flag = 0
+            self.location_thread_id  = 0
+            self.location_queue = Queue(100)
+            self.lpm_fd = None
+            self.start_agps = 0
+            read_data = EventMesh.publish("get_storage_config","isOpenGNSS")#获取是否打开GNSS
+            if read_data != None:
+                self.isOpenGNSS = read_data
+            else:#默认关闭GNSS
+                self.isOpenGNSS = "1"
+                EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+
+            self.isOpenGNSS = EventMesh.publish("get_storage_config","isOpenGNSS")
+            if self.isOpenGNSS == None:
+                self.isOpenGNSS = "1"
+            if self.isOpenGNSS == "1":
+                if quecgnss.init() == -1:
+                    self.isOpenGNSS = "0"
+                    EventMesh.publish("set_storage_config",["isOpenGNSS",self.isOpenGNSS])
+                else:
+                    quecgnss.gnssEnable(0)
+        @staticmethod
+        def get_date():
+            return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+        @staticmethod
+        def get_time():
+            return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+        def post_processor_after_instantiation(self):
+            # _gps_cfg = {
+            #     "UARTn": UART.UART1,
+            #     "buadrate": 115200,
+            #     "databits": 8,
+            #     "parity": 0,
+            #     "stopbits": 1,
+            #     "flowctl": 0,
+            #     "PowerPin": Pin.GPIO2,
+            #     "StandbyPin": Pin.GPIO3,
+            #     "BackupPin": None,
+            #     "gps_mode": 0x01,
+            # }
+            # self.gps = GPS(**_gps_cfg)
+            # self.gps.power_switch(0)#关闭GPS
+            EventMesh.subscribe(constants.EVENT.GPSOPEN, self.gps_open)
+            EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION, self.start_location)
+            EventMesh.subscribe(constants.EVENT.START_LOCATION_TEST, self.start_location_test)
+            EventMesh.subscribe(constants.EVENT.WIFIINFO, self.WIFI_INFO)
+            EventMesh.subscribe(constants.EVENT.WIFISCANOPEN,self.WIFI_scan_open)
+            EventMesh.subscribe(constants.EVENT.CLOSE_LOCATION,self.close_location)
+            EventMesh.subscribe("get_location_flag",self.get_location_flag)
+            
+            #EventMesh.subscribe(constants.EVENT.GPSCLOSE, self.gps_close)
+        def get_location_flag(self, event, msg):
+            return self.location_flag
+        def start_location(self, event, msg):
+            self.location_queue.put(msg)#测试类型入队
+            self.gps_data = {}
+            self.wifi_data = []
+            self.cell_data = []
+            self.location_timer_count = 0
+            self.GSV_sig_ok_count = 0
+            EventMesh.debug_log("start_location:{}".format(msg))
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+5)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+            
+            self.location_flag = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            #self.gps_open(event, msg)
+
+
+        def start_location_test(self, event, msg):
+            EventMesh.debug_log("start_location_test")
+            
+            self.location_type = 1
+            if( self.location_flag == 1):
+                return
+            _thread.stack_size((9+4)*1024)
+            self.location_thread_id  = _thread.start_new_thread(self.location_thread, ())
+            _thread.stack_size(8*1024)
+        
+            self.location_timer_count = 0
+            self.location_flag = 1
+            #self.gps_open(event, msg)
+            self.location_type = 1
+            self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+    
+
+        def close_location(self, event, msg):
+            self.location_flag = 0
+            self.location_type = 0
+            self.timer_read_GPS_info.stop()
+
+            
+
+        def WIFI_INFO(self, event, msg):
+            self.wifi_data = msg
+            # EventMesh.debug_log("WIFI_INFO:")
+            # EventMesh.debug_log([msg[0],msg])
+
+        def WIFI_scan_open(self, event, msg):
+            #EventMesh.debug_log("WIFI_scan_open")
+            
+
+            if wifiScan.getState() == False :
+                self.wifi_data = []
+                wifiScan.control(1)
+                wifiScan.setCfgParam(6, 2, 5,  0)  #设置WiFi参数,10秒上层,两轮,最多6个,6秒底层,PS优先
+                wifiScan.setCallback(wifiScan_cb) #注册回调函数
+                wifiScan.asyncStart()
+                #EventMesh.debug_log("wifiScan.asyncStart")
+            else :
+                EventMesh.debug_log("WIFI_scan_open:error1") 
+        def gps_open(self, event, msg):
+            if self.isOpenGNSS == "1":
+                #EventMesh.debug_log("publish:gps_open")
+                #quecgnss.init()
+                quecgnss.gnssEnable(2)
+                #self.gps.__gps_nmea_data_clean()
+        def gps_close(self, event, msg):
+            if self.isOpenGNSS == "1":
+                quecgnss.gnssEnable(0)
+        def location_timer(self, *args, **kwargs):
+            
+            self.location_timer_count = self.location_timer_count +1
+            self.location_check_data_timer_count = self.location_check_data_timer_count+1
+
+        def Location_send(self, msg) :
+            EventMesh.debug_log("Location_send1")
+            if self.location_queue.empty() == True:
+                return
+            EventMesh.debug_log("Location_send2")
+            while True:
+                if self.location_queue.empty() == False:
+                    TYPE = self.location_queue.get()
+                    date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+                    date = date[2:]
+                    #date = "180916,025723"
+                    GPS_type = "V"
+                    latitude = "0.000000,N"
+                    longitude = "0.000000,E"
+                    speed = "0.00"
+                    direction = "0.0"
+                    high = "100.0"
+                    number = "0"
+                    precision = "24"
+                    if msg[0] :#有GPS数据
+                        GPS_type = "A"
+                        # 纬度
+                        latitude = msg[0]["latitude"]
+                        # 经度
+                        longitude = msg[0]["longitude"]
+                        # 速度
+                        speed = msg[0]["speed"]
+                        # 方向
+                        direction = "0"
+                        if msg[0]["direction"] :
+                            direction = msg[0]["direction"]
+                        # 高度
+                        high = msg[0]["high"]
+                        high_tmp = high.split(".")
+                        if len(high_tmp) >= 2 :
+                            high = "%s"%(high_tmp[0])
+                        # 讯号质量:搜索到的卫星数目
+                        number = msg[0]["number"]
+                        precision = msg[0]["precision"]
+                        #date = msg[0]["date"]
+                    
+                    #gsm 信号强度
+                    gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+                    # 电池电量百分比 
+                    bat_tmp = EventMesh.publish("screen_get_battery")
+                    battery_caption =  str(bat_tmp[1])
+                    #步数
+                    old_step = 0
+                    step = 0
+                    step = EventMesh.publish("get_old_step_value")
+                    if step != 0:
+                        tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
+                        if tmp_data != None:
+                            old_step = tmp_data
+                        if old_step !=  step:
+                            EventMesh.publish("set_storage_config",["old_step",step])
+                            EventMesh.publish("set_storage_config",["old_step_new",step])
+                            
+                    old_step = step
+                    # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+                    #翻转次数
+                    turn_count = "0"
+                    #终端状态
+                    state = "%08X"%(EventMesh.publish("get_dev_state"))
+                    #EventMesh.debug_log("TYPE:{}".format(TYPE))
+                    if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
+                        if len(TYPE)>= 2 :
+                            state = "%08X"%(TYPE[1])
+                    
+                    EventMesh.debug_log("state:{}".format(state))
+                    #基站数据
+                    CELL_num = len(msg[2])
+                    CELL_data = "1," #时延
+                    if msg[2] != []:
+                        for CELL in msg[2] :
+                            if CELL[0] == 0 :
+                                CELL_data += "%X,"%(int(CELL[2])) #MCC
+                                CELL_data += str(CELL[3]) +","#MNC
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                            else :
+                                CELL_data += str(CELL[5]) +","#tac,区域码
+                                CELL_data += str(CELL[1]) +","#基站编号 CID
+                                CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                        CELL_data = CELL_data[:(len(CELL_data)-1)]
+                    #WIFI数据
+                    WIFI_num = 0 
+                    WIFI_data = ""
+                    if msg[1] :
+                        WIFI_num = msg[1][0]
+                        i = 0
+                        for MAC in msg[1][1] :
+                            WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                            i += 1
+                        WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+                    WIFI_data = WIFI_data.lower()
+                    #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+                    #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+                    #定位数据
+                    send_data = "%s,%s,%s"%(date,GPS_type,latitude)
+                    send_data += ",%s,%s,%s"%(longitude,speed,direction)
+                    send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+                    send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+                    send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+                    send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+                    send_data+=",%s"%(precision)
+                    #EventMesh.debug_log("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
+            
+                
+                    EventMesh.debug_log("Location_send3:{}:{}".format(TYPE,send_data))
+                    if type(TYPE) == list:
+                        EventMesh.publish(TYPE[0],send_data)
+                    else:
+                        EventMesh.publish(TYPE,send_data)
+                else :
+                    break
+
+        def GxGGA_latitude(self, gga_data):
+            """Parse latitude from GGA"""
+            if gga_data:
+                latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
+                if latitude_re:
+                    latitude = latitude_re.group(0)[1:-3]
+                    return str(float(latitude[:2]) + float(latitude[2:]) / 60)
+            return ""
+        def GxGGA_longitude(self, gga_data):
+            """Parse longitude from GGA"""
+            if gga_data:
+                longitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
+                if longitude_re:
+                    longitude = longitude_re.group(0)[1:-3]
+                    return str(float(longitude[:3]) + float(longitude[3:]) / 60)
+            return ""
+
+        def GxGGA_altitude(self, gga_data):
+            """Parse altitude from GGA"""
+            if gga_data:
+                altitude_re = ure.search(r",-*[0-9]+\.[0-9]+,M,", gga_data)
+                if altitude_re:
+                    return altitude_re.group(0)[1:-3]
+            return ""
+        def location_thread(self):
+            
+            self.wifi_data = []
+            self.gps_data = {}
+            self.cell_data = []
+            gnss_r_data = []
+            self.GSV_sig_ok_count = 0
+            self.GSV_sig_very_ok_count = 0
+            self.GGA_count = 0
+            self.RMC_A_count = 0
+            # if self.start_agps == 1: #开启agps
+            #     self.start_agps = 0
+            #     quecgnss.configSet(2,1)
+            if self.lpm_fd == None:
+                self.lpm_fd = pm.create_wakelock("test_lock", len("test_lock"))
+            pm.wakelock_lock(self.lpm_fd)
+            EventMesh.debug_log("location_thread:1")
+            EventMesh.publish(constants.EVENT.GPSOPEN)
+            EventMesh.debug_log("location_thread:2")
+            #self.timer_read_GPS_info.start(1000, 1, self.location_timer)
+            EventMesh.debug_log("location_thread:3")
+            #utime.sleep_ms(1000)
+            self.location_timer_count = 0
+            #quecgnss.read(4096)#去掉第一次错误数据
+            #EventMesh.txt_log("START_LOCATION")
+            # pm.autosleep(0)#唤醒
+            # pm.sclkEx_set(0, 1, 5)
+            GSV_dict= {}
+            while self.location_flag == 1:
+                try :   
+                    
+                    match_gga_data = []
+                    #match_gsv_data = []
+                    gnss_r_data = []
+                    # if self.location_check_data_timer_count >= 3:
+                    #     pm.autosleep(0)#唤醒
+                    #     pm.sclkEx_set(0, 1, 5)
+                    if self.location_check_data_timer_count >= 1 :#3秒查一次基站数据和wifi数据
+                        self.location_check_data_timer_count = 0
+                        #EventMesh.debug_log(self.location_timer_count)
+                        GSV_dict= {}
+                        if self.isOpenGNSS == "1":                    
+                            #检查GNSS数据
+                            if ( self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2:
+
+                                pass
+                                tmp_ok_count = 0
+                                tmp_very_ok_count = 0
+                                gsv_data = quecgnss.get_gsv()
+                                rmc_data = quecgnss.get_rmc()
+                                gga_data = quecgnss.get_gga()
+                                vtg_data = quecgnss.get_vtg()
+                                # EventMesh.debug_log("gsv:{}".format(quecgnss.get_gsv()))
+                                # EventMesh.debug_log("gga:{}".format(quecgnss.get_gga()))
+                                # EventMesh.debug_log("rmc:{}".format(quecgnss.get_rmc()))
+                                # EventMesh.debug_log("vtg:{}".format(quecgnss.get_vtg())) 
+                                for i in range(len(gsv_data)) :
+                                    
+                                    if i % 2 == 0:
+                                        if i+1 >= len(gsv_data) :
+                                            # EventMesh.debug_log("gsv_data num error!!")
+                                            break
+                                        GSV_dict[gsv_data[i]] = gsv_data[i+1]
+                                        #EventMesh.debug_log("type:gsv_data{}".format(type(gsv_data[i+1])))
+                                        try:
+                                            #EventMesh.debug_log("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3]))
+                                            if gsv_data[i+1] :
+                                                if (gsv_data[i+1])>=20:
+                                                    tmp_ok_count +=1   
+                                                if (gsv_data[i+1])>=30:
+                                                    tmp_very_ok_count +=1  
+                                                    
+                                        except Exception as e:
+                                            usys.print_exception(e)
+                                        
+                                if(tmp_ok_count > self.GSV_sig_ok_count ):
+                                    self.GSV_sig_ok_count = tmp_ok_count
+                                if(tmp_very_ok_count > self.GSV_sig_very_ok_count ):
+                                    self.GSV_sig_very_ok_count = tmp_very_ok_count
+                                match_rmc_data = rmc_data.split(",")
+                                if len (match_rmc_data)>3: #有rmc数据
+                                        if match_rmc_data[2] == 'A':    
+                                            match_gga_data = gga_data.split(",")
+                                            if len(match_gga_data) >4: #数据全
+                                                match_vtg_data = vtg_data.split(",")
+                                                gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6])#日期
+                                                #gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1])
+                                                latitude = "0,N" #纬度
+                                                latitude_tmp = str(self.GxGGA_latitude(gga_data)).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_rmc_data[4] )
+
+                                                longitude = "0,E"#经度
+                                                longitude_tmp = str(self.GxGGA_longitude(gga_data)).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_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1])
+                                                
+                                                high = "0"#高度
+                                                high = str(self.GxGGA_altitude(gga_data))
+                                                number = "0"#可用卫星
+                                                precision = "5.8"#精度
+                                                if len(match_gga_data)>5 :
+                                                    if match_gga_data[7]:
+                                                        number = match_gga_data[7]
+                                                    if match_gga_data[8]:
+                                                        precision = match_gga_data[8]
+                                                direction = "249.5" #方向
+                                                speed = '0.00'    #速度    
+                                                if(len(match_vtg_data)>5 ):
+                                                    if match_vtg_data[1]:
+                                                        direction =  match_vtg_data[1]
+                                                    if match_vtg_data[7]:    
+                                                        speed =  match_vtg_data[7]
+                                                self.gps_data = {
+                                                    "latitude": latitude,
+                                                    "longitude": longitude,
+                                                    "high": high,
+                                                    "direction": direction,
+                                                    "speed": speed,
+                                                    "number": number, 
+                                                    "date":  gps_date,
+                                                    "precision":  precision
+                                                }
+    # ***********************************************************************************
+
+
+                    #检查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)
+                
+                    #检查基站数据
+                    if self.cell_data == []:   
+                        data_tmp = net.getCellInfo()
+                        if(len(data_tmp)>=2):
+                            for cell in data_tmp:
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+                                    self.cell_data = cell
+                                    break
+
+                    if self.location_type == 1: #测试模式
+                        self.location_timer_count = 0
+                        
+                        EventMesh.publish("PUSH_LOCATION_DATA", [[self.gps_data,GSV_dict],self.wifi_data,self.cell_data]) 
+                        if self.gps_data  != {} : #发送数据 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            self.location_queue.put(constants.PROTOCOL.UD_SEND)
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            
+
+                    elif self.location_type == 0: #正常模式     
+                        if self.gps_data  != {} or self.location_timer_count > 100: #or( self.wifi_data != [] and self.cell_data != []): 
+                            if self.location_queue.empty() == False:#有定位队列
+                                pass
+                                #EventMesh.txt_log("LOCATION timer:{} ok:{} very_ok:{}".format(self.location_timer_count,self.GSV_sig_ok_count))   
+                                #EventMesh.txt_log("LOCATION:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            if self.gps_data  == {}: #定位超时,且信噪比多个大于30,下次启动agps
+                                if self.GSV_sig_very_ok_count > 3:#3个超30以上
+                                    self.start_agps = 1
+                                    #EventMesh.txt_log("open agps:{}".format(GSV_dict))
+                            #upload_time = EventMesh.publish("get_upload_data")    
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                            #if upload_time > 200  : 
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位
+                            # else:   #定位间隔小于3分钟不关闭gps,不影响无信号判断
+                            #     self.location_timer_count = 0
+                            #     self.GSV_sig_ok_count = 0
+                                
+                            
+
+                            
+                        if (self.isOpenGNSS != "1" or (self.GSV_sig_ok_count <= 1 and self.location_timer_count > 20)) and self.wifi_data != [] and self.cell_data != [] : #超过40秒且信号大于30的不足3个
+                            EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                            EventMesh.debug_log("Location_send:CLOSE_LOCATION")  
+                            #EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} ".format(self.location_timer_count,self.GSV_sig_ok_count))
+                            self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+
+                
+                    
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.txt_log("location_thread:ERROR:".format(e))
+                    #EventMesh.debug_log("location_thread:ERROR:{}".format(usys.print_exception(e)))
+                    EventMesh.debug_log("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data))
+                    #self.Location_send([self.gps_data,self.wifi_data,self.cell_data])
+                    EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 
+                utime.sleep_ms(500)
+
+            #self.timer_read_GPS_info.stop()
+            #self.gps.power_switch(0)
+            wifiScan.control(0)
+            EventMesh.publish(constants.EVENT.GPSCLOSE)
+            # if EventMesh.publish("get_lcd_state" ) == 0:#休眠的时候,恢复休眠
+            #     pm.autosleep(1)
+            #     pm.sclkEx_set(1, 1, 5)
+            if self.lpm_fd != None:
+                pm.wakelock_unlock(self.lpm_fd)
+            #pm.delete_wakelock(lpm_fd)
+            EventMesh.debug_log("CLOSE_LOCATION")
+            #EventMesh.txt_log("CLOSE_LOCATION")
+
+                    
+
+    class AddrBookManager(Abstract):
+        # 通讯录
+        def __init__(self):
+            self.read_phonebook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
+                    self.read_phonebook = ujson.load(fd)
+                    EventMesh.debug_log("读取电话本")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_phonebook_list", self.get)
+            EventMesh.subscribe("set_phonebook_list", self.set)
+            EventMesh.subscribe("call_phonebook_one_call", self.call_phonebook_one_call)
+            EventMesh.subscribe("call_phonebook_two_call", self.call_phonebook_two_call)
+            EventMesh.subscribe("call_phonebook_three_call", self.call_phonebook_three_call)
+
+            EventMesh.subscribe("call_phonebook_num", self.call_phonebook_num)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
+            return [self.check_json,self.read_phonebook]
+        
+        def call_phonebook_num(self, event, msg):
+            name = ''
+            key_tmp = ''
+            phone_num = int(msg)
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= phone_num:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[phone_num-1]]
+                    key_tmp = phonebook_keys[phone_num-1]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_call name:{} msg:{}".format(len(self.read_phonebook),msg))
+
+        def call_phonebook_one_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 1:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0]
+                    if len(name) != 0:
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_one_call name:{} key_tmp:{} len:{}".format(name,key_tmp,len(self.read_phonebook)))
+
+        def call_phonebook_two_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 2:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[1]]
+                    key_tmp = phonebook_keys[1]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                EventMesh.debug_log("call_phonebook_two_call name:{} key_tmp:{}".format(name,key_tmp))
+        
+        def call_phonebook_three_call(self, event, msg):
+            name = ''
+            key_tmp = ''
+            if self.read_phonebook != {}:
+                if len(self.read_phonebook) >= 3:
+                    phonebook_keys = sorted(self.read_phonebook.keys())
+                    name = self.read_phonebook[phonebook_keys[2]]
+                    key_tmp = phonebook_keys[2]
+                    if len(name) != 0:
+                        #voiceCall.callStart(str(name))
+                        EventMesh.publish("save_phonename",str(name))
+                        EventMesh.publish("save_phonenum",str(name))
+                        EventMesh.publish("dial_out_call_center_cb",str(name))#电话拨出去
+                    else:
+                        EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+                    
+                else:
+                    EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            else:
+                EventMesh.publish("dial_out_call_center_cb",None)#电话拨出去
+            EventMesh.debug_log("call_phonebook_three_call name:{} key_tmp:{}".format(name,key_tmp))
+
+        def set(self, event, msg):
+            self.check_json = msg[0]
+            self.read_phonebook = msg[1]
+
+    import sms
+    class MsgManager(Abstract):
+        # 短信
+        def __init__(self):
+            self.msg_nums = 0
+            self.msg_detail = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_msg_nums", self.get_msg_nums)
+            # 可通过此push_addr_book_list主动推送
+            EventMesh.subscribe("get_msg_detail", self.get_msg_detail)
+
+        def get_msg_nums(self, event, msg):
+
+            self.msg_nums = sms.getMsgNums() 
+            EventMesh.debug_log("self.msg_nums {}:".format(self.msg_nums))
+            return self.msg_nums
+        
+        def get_msg_detail(self, event, msg):
+            
+            # self.msg_detail = sms.searchTextMsg(self.msg_nums)
+            # EventMesh.debug_log("self.msg_detai {}:".format(self.msg_detai))
+            return{
+                "小明":"有内鬼,停止交易",
+                "小红":"今晚十点一起吃饭"
+            }
+
+    class MsgdetailManager(Abstract):
+        def __init__(self):
+            self.level = 0
+            self.msg_name = ""
+            self.msg_content = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_msg_name", self.save_msg_name)
+            EventMesh.subscribe("save_msg_content", self.save_msg_content)
+            EventMesh.subscribe("get_msg_name", self.get_msg_name)
+            EventMesh.subscribe("get_msg_content", self.get_msg_content)
+
+        def save_msg_name(self, event, msg): 
+            self.msg_name = str(msg)
+            EventMesh.debug_log("save_msg_name:msg".format(msg))
+        
+        def save_msg_content(self, event, msg):
+            self.msg_content = str(msg)
+            EventMesh.debug_log("save_msg_content:msg".format(msg))
+        
+        def get_msg_content(self, event, msg):
+            return self.msg_content
+
+        def get_msg_name(self, event, msg):
+            return self.msg_name
+
+    class CallLogManager(Abstract):
+        # 通话记录
+        def __init__(self):
+            self.read_call_log = {}
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
+                    self.read_call_log = ujson.load(fd)
+                    EventMesh.debug_log("读取通话记录")
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_call_log_list", self.get)
+            EventMesh.subscribe("set_call_log_list", self.set)
+
+        def get(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
+            return [self.check_json,self.read_call_log]
+
+        def set(self, event, msg):
+            return
+            self.check_json = msg[0]
+            self.read_call_log = msg[1]
+            with open("/usr/static/storage_file/Call_log.json","w+",encoding="utf-8") as fd:
+                ujson.dump(self.read_call_log,fd)
+        # def call_usr(self,event,msg):
+        #     content = self.log[msg]
+        #     # 参数1 姓名  参数2  电话   参数3 1/主动呼叫  0别人呼叫
+        #     EventMesh.publish("call_in", [content[2], content[0], 1])
+
+
+
+    class PhoneCallingManager(Abstract):
+        def __init__(self):
+            self.phonenum = ""
+            self.phonename = ""
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("save_phonenum", self.save_phonenum)
+            EventMesh.subscribe("get_phonenum", self.get_phonenum)
+            EventMesh.subscribe("get_phonename", self.get_phonename)
+            EventMesh.subscribe("save_phonename", self.save_phonename)
+
+        def get_phonename(self, event, msg): 
+            return self.phonename
+
+        def save_phonename(self, event, msg): 
+            self.phonename = str(msg)
+
+        def save_phonenum(self, event, msg): 
+            self.phonenum = str(msg)
+        
+        def get_phonenum(self, event, msg):
+            return self.phonenum
+
+    #获取心率 血氧 步数历史数据
+    class gethistoryDataManager(Abstract):
+        def __init__(self):
+            self.oldHr = 0
+            self.oldspo2 = 0
+            self.oldstep = 0
+            self.old_step = 0
+            self.read_histroy_hr_data = []
+            self.read_histroy_temp_data = []
+            self.read_histroy_spo2_data = []
+
+            oldHr  = EventMesh.publish("get_storage_config","old_hr")
+            if oldHr != None:
+                self.oldHr = oldHr  
+            old_spo2  = EventMesh.publish("get_storage_config","old_spo2")
+            if old_spo2 != None:
+                self.oldspo2 = old_spo2 
+            old_step  = EventMesh.publish("get_storage_config","old_step")    
+            if old_step != None:
+                self.oldstep = old_step
+
+
+            check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
+            if check_hr == True :
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
+                    self.read_histroy_hr_data = ujson.load(fd)
+            
+            check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
+            if check_temp == True :
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
+                    self.read_histroy_temp_data = ujson.load(fd)
+
+            check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
+            if check_spo2 == True :
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
+                    self.read_histroy_spo2_data = ujson.load(fd)
+            self.temp_value = 0
+            
+            # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
+            #                              {"timeSec":16789897,"value":88},{"timeSec":16789867,"value":77},{"timeSec":16789895,"value":70}]
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_old_hr_data", self.save_hr_value)
+            EventMesh.subscribe("get_old_hr_data", self.get_hr_value)
+            EventMesh.subscribe("set_old_spo2_data", self.save_spo2_value)
+            EventMesh.subscribe("get_old_spo2_data", self.get_spo2_value)
+
+            EventMesh.subscribe("get_old_step_value", self.get_old_step_value)
+            EventMesh.subscribe("set_old_step_value", self.set_old_step_value)
+
+
+            EventMesh.subscribe("get_history_hr_value", self.get_history_hr_value)
+            EventMesh.subscribe("set_history_hr_value", self.set_history_hr_value)
+
+            EventMesh.subscribe("get_history_temp_value", self.get_history_temp_value)
+            EventMesh.subscribe("set_history_temp_value", self.set_history_temp_value)
+
+            EventMesh.subscribe("get_history_spo2_value", self.get_history_spo2_value)
+            EventMesh.subscribe("set_history_spo2_value", self.set_history_spo2_value)
+
+        
+
+        def get_history_spo2_value(self, event, msg): #近7次血氧历史数据统计显示
+            return self.read_histroy_spo2_data
+
+        def set_history_spo2_value(self, event, msg): 
+            pass
+
+
+
+        def get_history_temp_value(self, event, msg): #近7次体温历史数据统计显示
+            return self.read_histroy_temp_data
+
+        def set_history_temp_value(self, event, msg): 
+            self.temp_value = msg
+            if self.temp_value > 0:
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_temp_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_temp_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_temp_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_temp_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_temp_data[6] = {"timeSec": time_tmp, "temp": self.temp_value}
+                # else:
+                #     self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
+
+                # with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_temp_data,fd)
+                #EventMesh.debug_log(self.read_histroy_temp_data)
+                pass
+            else:
+                pass
+
+        def get_history_hr_value(self, event, msg): #近7次心率历史数据统计显示
+            return self.read_histroy_hr_data
+
+        def set_history_hr_value(self, event, msg): 
+            pass
+                
+            
+
+        def save_hr_value(self, event, msg): 
+            if msg >= 50:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                self.oldHr = msg
+                
+
+                date_tmp = utime.localtime()
+                time_tmp = utime.mktime(date_tmp)
+                if len(self.read_histroy_hr_data) >= 7:
+                    sort_new = {}
+                    sort_new = sorted(self.read_histroy_hr_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                    EventMesh.debug_log(sort_new)
+                    for i in range(len(self.read_histroy_hr_data)-1):
+                        sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                        self.read_histroy_hr_data[i] = sort_new[i]
+                        pass
+                    self.read_histroy_hr_data[6] = {"timeSec": time_tmp, "hr": self.oldHr}
+                else:
+                    self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
+
+
+                with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
+                    ujson.dump(self.read_histroy_hr_data,fd)
+                pass
+            else:
+                EventMesh.publish("set_storage_config",["old_hr",msg])
+                pass
+
+
+        def get_hr_value(self, event, msg): 
+            return self.oldHr
+
+        def save_spo2_value(self, event, msg): 
+            if msg >= 85:
+                # EventMesh.publish("set_storage_config",["old_spo2",msg])
+                # self.oldspo2 = msg
+
+
+                # date_tmp = utime.localtime()
+                # time_tmp = utime.mktime(date_tmp)
+                # if len(self.read_histroy_spo2_data) >= 7:
+                #     sort_new = {}
+                #     sort_new = sorted(self.read_histroy_spo2_data, key = lambda i: i['timeSec'],reverse = False)#按照时间戳进行排序 去掉最旧的一次数据如果满了五十条
+                #     EventMesh.debug_log(sort_new)
+                #     for i in range(len(self.read_histroy_spo2_data)-1):
+                #         sort_new[i] = sort_new[i+1]#0==1 1== 2 2== 3 3==4 4==5 5==6 6==7
+                #         self.read_histroy_spo2_data[i] = sort_new[i]
+                #         pass
+                #     self.read_histroy_spo2_data[6] = {"timeSec": time_tmp, "spo2": self.oldspo2}
+                # else:
+                #     self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
+
+                # with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
+                #     ujson.dump(self.read_histroy_spo2_data,fd)
+                # #EventMesh.debug_log(self.read_histroy_spo2_data)
+                #播放语音
+                # EventMesh.publish("set_hr_blood_led",2)#测量成功
+                pass
+            else:
+                pass
+                pass
+
+        def get_spo2_value(self, event, msg): 
+            return self.oldspo2
+        
+        def set_old_step_value(self, event, msg): 
+            self.oldstep = msg
+            EventMesh.publish("set_storage_config",["old_step",msg])
+            
+            
+        def get_old_step_value(self, event, msg): 
+            step = EventMesh.publish(constants.EVENT.GET_STEP)
+            self.old_step = self.oldstep + step[0]
+            return self.old_step
+    #获取旧的时间戳
+    class getOldTimeManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.time_sec = 0
+            self.time_step = 0
+            self.step_second = 0
+            tmp_data = EventMesh.publish("get_storage_config","old_time")
+            if tmp_data !=None :
+                self.time_sec = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","clear_state")
+            if tmp_data !=None :
+                self.time_step = tmp_data[0]
+                self.step_second = tmp_data[1]
+
+            
+            
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_old_time_data", self.get_old_time_data)
+            EventMesh.subscribe("set_old_time_data", self.set_old_time_data)
+
+            EventMesh.subscribe("get_old_step_data", self.get_old_step_data)
+            EventMesh.subscribe("set_old_step_data", self.set_old_step_data)
+
+            EventMesh.subscribe("set_test_data1", self.set_test_data1)
+
+            EventMesh.subscribe("set_test_data2", self.set_test_data2)
+
+            EventMesh.subscribe("set_test_data3", self.set_test_data3)
+
+            EventMesh.subscribe("set_test_data4", self.set_test_data4)
+
+            EventMesh.subscribe("set_test_data5", self.set_test_data5)
+
+            EventMesh.subscribe("set_test_data6", self.set_test_data6)
+
+            EventMesh.subscribe("set_test_data7", self.set_test_data7)
+
+            EventMesh.subscribe("set_test_data8", self.set_test_data8)
+        
+
+        def set_test_data1(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state1",msg])
+
+        
+        def set_test_data2(self, event, msg):
+            
+            EventMesh.publish("set_storage_config",["clear_state2",msg])
+
+
+        def set_test_data3(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state3",msg])
+
+        def set_test_data4(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state4",msg])
+
+        def set_test_data5(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state5",msg])
+
+        def set_test_data6(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state6",msg])
+
+        def set_test_data7(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state7",msg])
+
+        def set_test_data8(self, event, msg):
+            EventMesh.publish("set_storage_config",["clear_state8",msg])
+
+        # f = open("/usr/static/storage_file/config.json",'r',encoding="utf-8")
+        # print(f.read())
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+        def get_old_time_data(self, event, msg):
+            return self.time_sec
+        
+        
+
+        def set_old_time_data(self, event, msg):
+            self.time_sec = msg
+            EventMesh.publish("set_storage_config",["old_time",msg])
+
+        def set_old_step_data(self, event, msg):
+            self.time_step = msg[0]
+            self.step_second = msg[1]
+            EventMesh.publish("set_storage_config",["clear_state",msg])
+
+        def get_old_step_data(self, event, msg):
+            return [self.time_step,self.step_second]
+
+
+            
+        
+
+    class getWeatherDataManager(Abstract):
+        # 获取天气数据
+        def __init__(self):
+            self.date = {} #日期23-04-07
+            self.time = {} #14:41:41
+            self.content = {} #天气描述 
+            self.type = None #天气类型
+            self.temp = None #当前温度
+            self.min_temp = None #最低温度
+            self.max_temp = None #最高温度
+            self.city = {} #城市
+            self.no_data = 0#0沒有数据 1有数据
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_weather_data", self.get)
+            EventMesh.subscribe("set_weather_data", self.set)
+
+        def get(self, event, msg):
+            return [self.date,self.time,self.content,self.type,self.temp,self.min_temp,self.max_temp,self.city,self.no_data]
+
+        def set(self, event, msg):
+            self.date = msg[0]
+            self.time = msg[1]
+            self.content = msg[2]
+            self.type = msg[3]
+            self.temp = msg[4]
+            self.min_temp = msg[5]
+            self.max_temp = msg[6]
+            self.city = msg[7]
+            self.no_data = msg[8]
+
+
+    class getHrTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.set_hr = 0 #0关闭 1手动 2 自动测量按照时间间隔测试心率
+            self.set_spo2 = 0
+            self.open_btn = 0
+            self.set_bgautotime = 0
+            self.bgauto_btn = 0
+            read_data = EventMesh.publish("get_storage_config","measure_time")
+            if read_data != None:
+                self.set_time = read_data  
+            read_data = EventMesh.publish("get_storage_config","open_hr_btn")
+                    
+            if read_data != None:
+                self.open_btn = read_data   
+
+            read_data = EventMesh.publish("get_storage_config","bgauto_time")
+            if read_data != None:
+                self.set_bgautotime = read_data  
+            read_data = EventMesh.publish("get_storage_config","bgauto_btn")
+                    
+            if read_data != None:
+                self.bgauto_btn = read_data   
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_time_hr", self.set_time_hr)
+            EventMesh.subscribe("get_time_hr", self.get_time_hr)
+            EventMesh.subscribe("set_hr_state", self.set_hr_state)
+            EventMesh.subscribe("get_hr_state", self.get_hr_state)
+            EventMesh.subscribe("set_spo2_state", self.set_spo2_state)
+            EventMesh.subscribe("get_spo2_state", self.get_spo2_state)
+
+            EventMesh.subscribe("set_bgauto_time", self.set_bgauto_time)
+            EventMesh.subscribe("get_bgauto_time", self.get_bgauto_time)
+
+        def set_bgauto_time(self, event, msg): 
+            self.bgauto_btn = msg[0]
+            self.set_bgautotime = msg[1]
+            EventMesh.publish("set_storage_config",["bgauto_btn",self.bgauto_btn])
+            EventMesh.publish("set_storage_config",["bgauto_time",self.set_bgautotime])
+
+        def get_bgauto_time(self, event, msg): 
+            if self.bgauto_btn == None:
+                self.bgauto_btn = 0
+            if self.set_bgautotime == None:
+                self.set_bgautotime = 0
+            return [self.bgauto_btn,self.set_bgautotime]
+        
+
+        def set_time_hr(self, event, msg): 
+            self.open_btn = msg[0]
+            self.set_time = msg[1]
+            EventMesh.publish("set_storage_config",["measure_time",self.set_time])
+            EventMesh.publish("set_storage_config",["open_hr_btn",self.open_btn])
+
+        def get_time_hr(self, event, msg): 
+            return [self.open_btn,self.set_time]
+
+        def set_hr_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+            self.set_hr = msg
+            if self.set_hr == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_hr_state(self, event, msg): 
+            return self.set_hr
+        
+        def set_spo2_state(self, event, msg): 
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)##红绿灯交替闪烁
+            self.set_spo2 = msg
+            if self.set_spo2 == 0:
+                EventMesh.publish("clear_health_state")
+            
+
+        def get_spo2_state(self, event, msg): 
+            return self.set_spo2
+        
+    #体温
+    class getTempTimeManager(Abstract):
+        def __init__(self):
+            self.set_time = 0
+            self.get_temp = 0
+            read_data = EventMesh.publish("get_storage_config","temp_time")
+
+            if read_data != None:
+                self.set_time = read_data
+
+            self.get_bgstate = 0
+            self.get_bpstate = 0
+
+            self.bptime_on = 0
+            self.bptime_time = 0
+            read_data=EventMesh.publish("get_storage_config","bpauto_btn")
+            if read_data != None:
+                self.bptime_on = read_data
+
+            read_data=EventMesh.publish("get_storage_config","bpauto_time")
+            if read_data != None:
+                self.bptime_time = read_data
+
+            self.spo2time_on = 0
+            self.spo2time_time = 0
+            read_data = EventMesh.publish("get_storage_config","spo2auto_btn")
+            if read_data != None:
+                self.spo2time_on = read_data
+
+            read_data = EventMesh.publish("get_storage_config","spo2auto_time")
+            if read_data != None:
+                self.spo2time_time = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_temp_time", self.set_temp_time)
+            EventMesh.subscribe("get_temp_time", self.get_temp_time)
+
+            EventMesh.subscribe("set_temp_state", self.set_temp_state)
+            EventMesh.subscribe("get_temp_state", self.get_temp_state)
+
+            EventMesh.subscribe("set_bp_time", self.set_bp_time)
+            EventMesh.subscribe("get_bp_time", self.get_bp_time)
+
+            EventMesh.subscribe("set_bp_state", self.set_bp_state)
+            EventMesh.subscribe("get_bp_state", self.get_bp_state)
+
+
+            EventMesh.subscribe("set_bg_state", self.set_bg_state)
+            EventMesh.subscribe("get_bg_state", self.get_bg_state)
+
+            EventMesh.subscribe("set_spo2_time", self.set_spo2_time)
+            EventMesh.subscribe("get_spo2_time", self.get_spo2_time)
+
+            
+        def set_bg_state(self, event, msg): 
+            self.get_bgstate = msg
+            if self.get_bgstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bg_state(self, event, msg): 
+            if self.get_bgstate:
+                return self.get_bgstate
+            else :
+                return 0
+
+        def set_spo2_time(self, event, msg): 
+            self.spo2time_on = msg[0]
+            self.spo2time_time = msg[1]
+            EventMesh.publish("set_storage_config",["spo2auto_btn",self.spo2time_on])
+            EventMesh.publish("set_storage_config",["spo2auto_time",self.spo2time_time])
+
+
+        def get_spo2_time(self, event, msg): 
+            
+            return [self.spo2time_on,self.spo2time_time]
+
+
+        def set_bp_time(self, event, msg): 
+            self.bptime_on = msg[0]
+            self.bptime_time = msg[1]
+            EventMesh.publish("set_storage_config",["bpauto_btn",self.bptime_on])
+            EventMesh.publish("set_storage_config",["bpauto_time",self.bptime_time])
+
+        def get_bp_time(self, event, msg): 
+            if self.bptime_on == None:
+                self.bptime_on = 0
+            if self.bptime_time == None:
+                self.bptime_time = 0
+            return [self.bptime_on,self.bptime_time]
+        
+            
+        def set_bp_state(self, event, msg): 
+            self.get_bpstate = msg
+            if self.get_bpstate == 0:
+                EventMesh.publish("clear_health_state")
+            # if msg != 0:
+                # EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_bp_state(self, event, msg): 
+            if self.get_bpstate:
+                return self.get_bpstate
+            else :
+                return 0
+
+
+        def set_temp_time(self, event, msg): 
+            self.set_time = msg
+            EventMesh.publish("set_storage_config",["temp_time",self.set_time])
+
+        def get_temp_time(self, event, msg): 
+            return self.set_time
+        
+        def set_temp_state(self, event, msg): 
+            self.get_temp = msg
+            if self.get_temp == 0:
+                EventMesh.publish("clear_temp_state")
+            # if msg != 0:
+            #     EventMesh.publish("set_hr_blood_led",1)#红绿灯交替闪烁
+
+        def get_temp_state(self, event, msg): 
+            return self.get_temp
+            
+    class getBrightnessManager(Abstract):#获取亮度级别
+        def __init__(self):
+            self.level = 6#默认值6
+            # self.read_data = {}
+            self.time = 5
+            self.PWM_backlight  = None
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("get_brightness_level", self.get_brightness_level)
+            EventMesh.subscribe("push_add_brightness_level", self.add)
+            EventMesh.subscribe("push_reduce_brightness_level", self.reduce)
+            EventMesh.subscribe("set_brightness_level", self.set_brightness_level)
+
+            EventMesh.subscribe("set_brightness_time", self.set_brightness_time)
+            EventMesh.subscribe("get_brightness_time", self.get_brightness_time)
+
+        def set_brightness_level(self, event, msg): 
+            self.level = msg
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+        def get_brightness_level(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_level")
+            if tmp != None:
+                self.level = tmp
+            return self.level
+        
+        def set_brightness_time(self, event, msg): 
+            self.time = msg
+            EventMesh.publish("set_storage_config", ["brightness_time",self.time])
+        
+        def get_brightness_time(self, event, msg): 
+            tmp = EventMesh.publish("get_storage_config","brightness_time")
+            if tmp != None:
+                self.time = tmp
+            return self.time
+        
+
+
+        def add(self, event, msg):
+            if self.level < 10:
+                self.level = self.level + 2
+            # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+
+
+        def reduce(self, event, msg):
+            # if self.level > 0:
+            #     self.level = self.level - 2
+            # if self.level <= 0:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, 1, 10)
+            # else:
+            #     self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS,self.level, 10)
+
+            # self.PWM_backlight.open()
+            EventMesh.publish("set_storage_config", ["brightness_level",self.level])
+        
+        
+    class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+    #定位频率
+    class getUpLoadDataManager(Abstract):#
+        def __init__(self):
+            self.upload_time = 2*60*60
+            read_data = EventMesh.publish("get_storage_config","upload_time")
+            if read_data != None:
+                self.upload_time = read_data 
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_upload_data", self.set_upload_data)
+            EventMesh.subscribe("get_upload_data", self.get_upload_data)
+
+        def set_upload_data(self, event, msg): 
+            self.upload_time = msg
+
+        def get_upload_data(self, event, msg): 
+            if self.upload_time == None:
+                self.upload_time = 2*60*60
+            return self.upload_time 
+
+    class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
+        def __init__(self):
+            self.play = 0
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_audio_state", self.set_audio_state)
+            EventMesh.subscribe("get_audio_state", self.get_audio_state)
+
+        def set_audio_state(self, event, msg): 
+            self.play = msg
+
+        def get_audio_state(self, event, msg): 
+            return self.play
+        
+    class getVolumSizeManager(Abstract):#设置或获取音量大小数据
+        def __init__(self):
+            self.volume_size = 8
+            read_data = EventMesh.publish("get_storage_config","volum")
+            if read_data != None:
+                self.volume_size = read_data
+        
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_volum_size", self.set_volum_size)
+            EventMesh.subscribe("get_volum_size", self.get_volum_size)
+
+        def set_volum_size(self, event, msg): 
+            self.volume_size = msg
+            EventMesh.publish("set_storage_config", ["volum",self.volume_size])
+
+        def get_volum_size(self, event, msg): 
+            return self.volume_size
+
+    class getSosFlagManager(Abstract):#设置sos
+        def __init__(self):
+            self.aud = audio.Audio(0)
+            self.sos_flag = 0
+            self.sos_num = 0
+            self.hangup_mode = 0
+            self.call_timer = osTimer()
+            self.sos_numer1 = []
+            self.callnumer =""
+            SOS_NUMBER1 = EventMesh.publish("get_storage_config","SOS_NUMBER1")
+            if SOS_NUMBER1 != None:
+                self.sos_numer1 = SOS_NUMBER1
+            SOS_NUMBER2 = EventMesh.publish("get_storage_config","SOS_NUMBER2")
+            if SOS_NUMBER2 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2]
+
+            SOS_NUMBER3 = EventMesh.publish("get_storage_config","SOS_NUMBER3")
+            if SOS_NUMBER3 != None:        
+                self.sos_numer1 = [SOS_NUMBER1, SOS_NUMBER2,SOS_NUMBER3]
+
+
+        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("get_dial_sos_number", self.get_dial_sos_number)#设置家庭号码三个
+
+            EventMesh.subscribe("set_callnumer_cb", self.set_callnumer_cb)#延时回调
+
+            EventMesh.subscribe("close_call_time",self.close_call_time)
+
+            EventMesh.subscribe("set_hangup_mode", self.set_hangup_mode)
+            EventMesh.subscribe("get_hangup_mode", self.get_hangup_mode)#获取挂断方式 是对方挂断 还是手表按键主动挂断
+
+        def get_hangup_mode(self, event, msg): # 1是设备端手表主动挂断 0是手机端
+            return self.hangup_mode
+        
+        def set_hangup_mode(self, event, msg): 
+            self.hangup_mode = msg
+
+        def set_sos_flag(self, event, msg): 
+            self.sos_flag = msg
+            EventMesh.publish("set_sos_state_out")
+            if self.sos_flag == 1:
+                number = EventMesh.publish("get_dial_sos_number")
+            
+                if number != None:
+                    if len(number) > 0:
+                        self.call_timer.stop()
+                        EventMesh.publish("save_phonename",number[0])
+                        EventMesh.publish("save_phonenum",number[0])
+                        EventMesh.publish("set_sos_num",0)
+                        phone_num = EventMesh.publish("get_phonenum")  
+                        EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+                    else:
+                        EventMesh.publish("sos_out_call_center_cb",None)#电话拨出去
+
+        def set_callnumer_cb(self, event, msg):
+            if self.sos_flag == 1:
+                EventMesh.publish("set_sos_state_out")
+                self.callnumer = msg
+                self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+
+        def call_timer_cb(self, *args, **kwargs):
+            EventMesh.publish("set_sos_state_out")
+            flag = EventMesh.publish("get_call_state") 
+            fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+            video_state = EventMesh.publish("get_video_state")
+            if flag != 0 or fall_down != 0 or video_state != 0:#防止不会被中断不会继续拨打sos号码正在通话或者打电话中,跌倒报警 视频通话中不允许拨打sos
+                if self.sos_flag == 1:
+                    self.call_timer.start(5000, 0, self.call_timer_cb)#延迟10S 继续拨打
+                    return
+                else:
+                    self.call_timer.stop()
+                    return
+
+            if self.sos_flag == 1:
+                self.call_timer.stop()
+                EventMesh.publish("save_phonename",str(self.callnumer))
+                EventMesh.publish("save_phonenum",str(self.callnumer))
+                phone_num = EventMesh.publish("get_phonenum")  
+                EventMesh.publish("sos_out_call_center_cb",phone_num)#电话拨出去
+            else:
+                self.call_timer.stop()
+        
+        def close_call_time(self, event, msg): 
+            self.call_timer.stop()
+
+        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
+            
+
+        def get_dial_sos_number(self, event, msg): 
+            return self.sos_numer1
+    class getLowBatManager(Abstract):#低电提醒
+        def __init__(self):
+
+            self.low_btn = 0
+            read_data = EventMesh.publish("get_storage_config","low_on")
+            if read_data != None:
+                self.low_btn = read_data
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_low_bat_btn", self.set_low_bat_btn)#
+            EventMesh.subscribe("get_low_bat_btn", self.get_low_bat_btn)
+
+        def set_low_bat_btn(self, event, msg): 
+            self.low_btn = msg
+            EventMesh.publish("set_storage_config",["low_on",self.low_btn])
+
+        def get_low_bat_btn(self, event, msg): 
+            return self.low_btn
+        
+
+
+    class playPowerAudioManager(Abstract):#播放开关机音频文件
+        def __init__(self):
+            self.aud = audio.Audio(0)
+
+        def post_processor_after_instantiation(self):
+            
+            EventMesh.subscribe("play_poewr_on_event", self.play_poewr_on_event)#
+            EventMesh.subscribe("play_poewr_off_event", self.play_poewr_off_event)
+
+        def play_poewr_on_event(self, event, msg): 
+            self.aud.play(1, 1, 'U:/static/R_POWER_1.mp3')  #播放播放开机铃声
+
+        def play_poewr_off_event(self, event, msg): 
+            self.aud.setVolume(11)
+            self.aud.play(1, 1, 'U:/static/R_POWER_OFF_1.mp3')  #播放关机铃声
+        
+    class getBootOffManager(Abstract):#开关机时间
+        def __init__(self):
+            self.poweroff_time = []
+            read_data = EventMesh.publish("get_storage_config","poweroff_alarm")
+            if read_data != None:
+                self.poweroff_time = read_data
+            else:
+                self.poweroff_time = [{"poweroff_on":0,"start_hour":6,"start_min":0,"end_hour":0,"end_min":0}]
+            
+
+
+        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 set_boot_off_time(self, event, msg): 
+            EventMesh.debug_log("set_boot_off_time",msg)
+
+            EventMesh.publish("set_storage_config",["poweroff_alarm",msg])
+            self.poweroff_time = msg
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def get_boot_off_time(self, event, msg):
+            return self.poweroff_time
+    class setSmsIndexManager(Abstract):#
+        def __init__(self):
+            self.index = -1
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_sms_index", self.set_sms_index)#设置关机时间
+            EventMesh.subscribe("get_sms_index", self.get_sms_index)
+
+        def set_sms_index(self, event, msg): 
+            self.index = msg
+            
+
+        def get_sms_index(self, event, msg):
+            
+            return self.index
+    import protocol 
+    class testSmsSetIPManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+            #大锤
+            severdata = protocol.server_init()
+
+            self.newip = severdata[0]
+            self.newcom = severdata[1]
+            self.new_key = severdata[2]
+            self.new_pid = severdata[3]
+            
+            EventMesh.debug_log("testSmsSetIPManager:{}\n".format(severdata))
+
+            self.server_sate = 0
+
+
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            if tmp_data != None:
+                self.newip = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_data != None:
+                self.newcom = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","set_new_md5")
+            if tmp_data != None:
+                self.newmd5 = tmp_data    
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_key")
+            if tmp_data != None:
+                self.new_key = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","set_new_pid")
+            if tmp_data != None:
+                self.new_pid = tmp_data 
+
+            tmp_data = EventMesh.publish("get_storage_config","get_server_sate")
+            if tmp_data != None:
+                self.server_sate = tmp_data 
+            
+            
+
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_new_ip_com", self.set_new_ip_com)#设置关机时间
+            EventMesh.subscribe("get_new_ip_com", self.get_new_ip_com)
+
+            EventMesh.subscribe("set_ip", self.set_ip)#设置关机时间
+            EventMesh.subscribe("get_ip", self.get_ip)
+
+            EventMesh.subscribe("set_com", self.set_com)#设置关机时间
+            EventMesh.subscribe("get_com", self.get_com)
+
+            EventMesh.subscribe("get_new_key", self.get_new_key_cb)#获取key
+            EventMesh.subscribe("set_new_key", self.set_new_key_cb)#获取key
+
+            EventMesh.subscribe("set_new_pid", self.set_new_pid_cb)#获取pid
+            EventMesh.subscribe("get_new_pid", self.get_new_pid_cb)#获取pid
+
+            EventMesh.subscribe("set_server_state", self.set_server_state)#
+            EventMesh.subscribe("get_server_state", self.get_server_state)#
+
+            EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
+
+
+
+        def set_new_key_cb(self, event, msg): 
+            self.new_key = msg
+            # print("set_new_key_cb",msg,self.new_key)
+            EventMesh.publish("set_storage_config",["set_new_key",self.new_key])
+
+        def get_new_key_cb(self, event, msg):
+            # print("get_new_key_cb",self.new_key)
+            return self.new_key
+        
+        def set_new_pid_cb(self, event, msg): 
+            self.new_pid = msg
+            # print("set_new_pid_cb",msg,self.new_pid)
+            EventMesh.publish("set_storage_config",["set_new_pid",self.new_pid])
+
+        def get_new_pid_cb(self, event, msg):
+            # print("get_new_pid_cb",self.new_pid)
+            return self.new_pid
+
+        def set_new_ip_com(self, event, msg): 
+            self.newip = str(msg[0])
+            self.newcom = int(msg[1])
+            # self.newmd5 = str(msg[2])
+            #短信格式:SETIP:api.xcloudtech.com:9000:bZld0ALsZTt15tKEZhOlLPgbsO75BLTP 以冒号分隔 SETIP:ip地址:ip端口号:ip密钥key
+
+            # self.read_data["set_new_md5"] = self.newmd5  #通过短信设置ip的key密钥
+        
+
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+
+            number = str(msg[2])
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+            
+        def fun(self,*argc):
+            Power.powerRestart()
+
+        def get_new_ip_com(self, event, msg):
+            tmp_addr = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            tmp_com = EventMesh.publish("get_storage_config","set_new_com")
+            if tmp_addr != None:
+                self.newip = tmp_addr
+            if tmp_com != None:
+                self.newcom = tmp_com
+            return [self.newip,self.newcom]
+        
+        def set_ip(self, event, msg): 
+            self.newip = msg
+            EventMesh.publish("set_storage_config",["set_new_ip_addr",self.newip])
+
+        def get_ip(self, event, msg):
+            # print("get_ip",self.newip)
+            return self.newip
+        
+        def set_com(self, event, msg): 
+            self.newcom = msg
+            EventMesh.publish("set_storage_config",["set_new_com",self.newcom])
+
+        def get_com(self, event, msg):
+            # print("get_com",self.newcom)
+            return self.newcom
+
+        def get_new_key_pid(self, event, msg):
+            return [self.new_key,self.new_pid]
+        
+        def set_server_state(self, event, msg):
+            EventMesh.publish("set_storage_config",["get_server_sate",msg])
+            self.server_sate = msg
+
+        def get_server_state(self, event, msg):
+            return self.server_sate
+            
+
+    # MMI Version:UIX8910_C55_DS_D12G_PRO18_FZD_V1.0_Release
+    # Build:07-07-2022 16:12:58
+    # IMEI:861218001025267
+    # IP:api.xcloudtech.com
+    # PORT:9000
+    # UPLOAD:300
+    # Battery:3948, 64
+    # Udebug: 0
+    # ConnectTime: 7
+    import protocol
+
+    class sendDevinfoManager(Abstract):#发送设备信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("send_devinfo_event", self.send_devinfo_event)#删除短信
+
+        def send_devinfo_event(self, event, msg): 
+            number = str(msg)
+            versions = EventMesh.softversion
+            Build = EventMesh.builTime
+            IMEI = EventMesh.publish(constants.EVENT.GET_IMEI)
+            IP = ""
+            new_ip = EventMesh.publish("get_storage_config","set_new_ip_addr")
+            new_com = EventMesh.publish("get_storage_config","set_new_com")
+            server_data = protocol.server_init()
+        
+            if new_ip != None:
+                if len(new_ip) != 0:
+                    IP = new_ip
+                else:
+                    IP = server_data[0]
+            else:
+                IP = server_data[0]
+            
+            PORT = ""
+            if new_com != None:
+                if len(str(new_com)) != 0:
+                    PORT = str(new_com)
+                else:
+                    PORT = str(server_data[1])
+            else:
+                PORT = str(server_data[1])
+            
+            UPLOAD = EventMesh.publish("get_upload_data")
+
+            level = EventMesh.publish("get_curr_battery_level")
+            if level == None:
+                level = 4200
+            bat = EventMesh.publish("screen_get_battery")[1]
+            if bat == None:
+                bat = 100
+            Battery = str(level) +',' +  str(bat)
+
+            ConnectTime = heartbeat_time//60
+            data1 = "Version:{}\nBuild:{}".format(versions,Build)
+
+            data2 = "IMEI:{}\nIP:{}\nPORT:{}".format(IMEI,IP,PORT)
+            
+            data3 = "UPLOAD:{}\nBattery:{}\nConnectTime:{}".format(UPLOAD,Battery,ConnectTime)
+
+            send_state1 = -1
+            send_state2 = -1
+            # print("data",data1,data2,data3)
+            send_state1 = sms.sendPduMsg(number, data1, 'UCS2')
+
+            if send_state1 == 0:
+                send_state2 = sms.sendPduMsg(number, data2, 'UCS2')
+
+            if send_state2 == 0:
+                sms.sendPduMsg(number, data3, 'UCS2')
+            
+
+    class deleteSmsManager(Abstract):#删除信息
+        def __init__(self):
+            self.timer = osTimer()
+            pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("delete_sms_event", self.delete_sms_event)#删除短信
+            EventMesh.subscribe("remove_all_sms_cb", self.remove_all_sms_cb)#
+
+        def delete_sms_event(self, event, msg): 
+            self.timer.start(4*1000,0,self.fun)
+            
+        def fun(self, *argc): 
+            EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+
+        def remove_all_sms_cb(self, event, msg):
+            sms.deleteMsg(1,4)
+
+    #闹钟信息
+    alarm_list = [{'hour': 6, 'repeart': 10, 'idx': 0, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0},
+                {'hour': 0, 'repeart': 10, 'idx': 1, 'enabled': 1, 'days': [0,1,2,3,4,5,6], 'minute': 0}]
+    #用于显示闹钟列表不包含开关机信息
+
+    class ClockManager(Abstract):
+        def __init__(self):
+            super().__init__()
+            self.rtc = RTC()
+            self.days = 0
+            self.idx = 0
+
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            self.check_alarm_list = []     
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    self.check_alarm_list = ujson.load(fd)
+            
+            EventMesh.subscribe("push_clock_info", self.set)
+            EventMesh.subscribe("read_alarminjson", self.read_alarminjson)
+            EventMesh.subscribe("add_alarm", self.add_alarm)
+            EventMesh.subscribe("remove_alarm", self.remove_alarm)
+            EventMesh.subscribe("set_rtc_alarm", self.set_rtc_alarm)
+            EventMesh.subscribe("get_alarm_indx", self.get_alarm_indx)
+            EventMesh.subscribe("get_check_alarm_list", self.get_check_alarm_list)
+            EventMesh.subscribe("push_update_alarm_show", self.update_show_info)
+
+        def post_processor_after_instantiation(self):
+        
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+        
+        def update_show_info(self,event,msg):
+            EventMesh.publish("read_alarminjson")
+            # EventMesh.publish("set_rtc_alarm")
+
+        def get_check_alarm_list(self, event, msg):
+            alarm_len = 0
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            alarm_len = len(alarm_list)
+            return alarm_len
+
+
+        def set(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("msg = {}".format(msg))
+            idx = msg.get("idx")
+            EventMesh.debug_log("修改第{}个闹钟信息{}".format(idx,alarm_list[idx]))
+            alarm_list[idx]["hour"] = msg["hour"]
+            alarm_list[idx]["minute"] = msg["minute"]
+            alarm_list[idx]["days"] = msg["days"]
+            alarm_list[idx]["enabled"] = msg["enabled"]
+            alarm_list[idx]["repeart"] = msg["repeart"]
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+        def read_alarminjson(self, event, msg):
+            IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
+            global alarm_list     
+            EventMesh.debug_log("IFEXIST:{}".format(IFEXIST))
+            if IFEXIST == True:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    alarm_list = ujson.load(fd)
+
+            
+            # read_data = EventMesh.publish("get_storage_config","off_on")
+
+            hour1 = str(alarm_list[0]["hour"])+':'+str(alarm_list[0]["minute"])
+            # min1 = str(alarm_list[0]["minute"])
+
+            hour2 = str(alarm_list[1]["hour"])+':'+str(alarm_list[1]["minute"])
+            # min2 = str(alarm_list[1]["minute"]) 
+            # EventMesh.publish("set_boot_off_time",[1,hour1,hour2])
+
+            EventMesh.debug_log("hour1:{}-{}".format(hour1,hour2))
+
+            
+            return alarm_list
+
+        def add_alarm(self, event, msg):
+
+            global alarm_list
+            EventMesh.publish("read_alarminjson")
+            EventMesh.debug_log("msg:{}".format(msg))
+            for i in range(0,2):#开关机固定是 idx 0 1
+                off_msg1 = msg[i+1]
+                msg_tmp1 = off_msg1.split(':')
+                start_hour = int(msg_tmp1[0])
+                start_min = int(msg_tmp1[1])
+                enable = int(msg[0])
+                EventMesh.debug_log("start_hour:{} start_min:{} enable:{}",start_hour,start_min,enable)
+                # EventMesh.publish("set_boot_off_time",[msg[0],msg[1],msg[2]])
+
+                alarm_list[i]["idx"]=i
+                alarm_list[i]["hour"]=start_hour
+                alarm_list[i]["minute"]=start_min
+                alarm_list[i]["days"]=[0,1,2,3,4,5,6]
+                alarm_list[i]["enabled"]=enable
+                alarm_list[i]["repeart"]=10
+
+
+                # alarm_list.append({"idx": i, "hour": start_hour, "minute": start_min, "days":[0,1,2,3,4,5,6], "enabled": enable,"repeart":10})
+
+            
+            # EventMesh.debug_log("alarm_list----len- :{} alarm_list:{}".format(len(alarm_list),alarm_list))
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+            EventMesh.publish("push_update_alarm_show")
+            
+        
+                
+            
+
+
+        def remove_alarm(self, event, msg):
+            global alarm_list
+            EventMesh.debug_log("ddddddddddddddddddd:",msg)
+            idx = msg.get("idx")
+            EventMesh.debug_log("delete_here1-----{},{}:".format(idx,msg))
+
+            for i, alarm in enumerate(alarm_list):
+                EventMesh.debug_log("delete_here2-----{},{}:".format(i,alarm))
+
+                if alarm["idx"] == idx:
+                    del alarm_list[i]
+                    EventMesh.debug_log("delete_here3-----",alarm_list)
+
+                    #删除闹钟后,对idx重新排序
+                    if alarm_list:
+                        for j in range(i,len(alarm_list)):
+                            alarm_list[j]["idx"] -= 1
+                            EventMesh.debug_log("delete_here4-----",alarm_list)
+
+            with open("/usr/static/storage_file/alarm_msg.json", 'w+',encoding='utf-8') as fd:
+                ujson.dump(alarm_list,fd)
+
+
+        def get_alarm_indx(self,event,msg):
+            return self.idx
+
+        def _rtc_callback(self,args):
+            #设置下一个闹钟,定时开关机功能
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+
+                rtc_now_time = self.rtc.datetime()
+                current_minute = rtc_now_time[4]*60 + rtc_now_time[5]
+                end_min_total = end_hour*60+end_min
+                next_minute = start_hour*60+start_min #10:11
+                EventMesh.debug_log("off_on:{} {} {}".format(off_on,current_minute,next_minute))
+                if off_on != None:
+                    if off_on == 1:
+                        if end_min_total == current_minute:#结束的时间分钟等于关机时间分钟数则关机
+                            ubs_state = EventMesh.publish("get_usb")#'
+                            
+                            if ubs_state == 2 or ubs_state == 0:
+
+                                if next_minute > current_minute:#开机时间大于当前时间 9:00 > = 8:00 
+                                    interval_minute = next_minute - current_minute
+                                    
+                                    EventMesh.debug_log("开机距离下一次响铃的的分钟数:", interval_minute,next_minute)
+                                else:#8:00 9:00
+                                    #7*60*24 7天一个周期 7*60*24 - 
+                                    interval_minute = next_minute + (24*60-current_minute)
+                                    EventMesh.debug_log("开机08888距离下一次响铃的的分钟数:", interval_minute,next_minute)
+
+                                #反向获取时间戳
+                                time = utime.localtime()
+                                EventMesh.debug_log("开机9获取utime的时间戳:", time)
+                                rtc_mktime = utime.mktime(time)-time[5]
+                                EventMesh.debug_log("开机10反向获取utime的mktime:", rtc_mktime)
+
+                                #加上下一次响铃需要的时间
+                                next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                                EventMesh.debug_log("开机11下一次响铃的mktime:", next_alarm_mktime)
+
+                                #格式化时间戳,得到下一次闹钟的时间
+                                next_alarm_time = utime.localtime(next_alarm_mktime)
+                                EventMesh.debug_log("开机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)
+                                EventMesh.debug_log("开机13将该时间转换为RTC元组:", data_e)
+                                
+                                self.rtc.register_callback(self._rtc_callback)
+
+                                FLAG = self.rtc.set_alarm(data_e)
+                                if FLAG == 0:
+                                    EventMesh.debug_log("开机11成功设置rtc的到期时间:", data_e)
+                                else:
+                                    EventMesh.debug_log("开机时设置rtc的到期时间失败:", data_e)
+                                self.rtc.enable_alarm(1)
+                                
+                                EventMesh.debug_log("结束时设置rtc的到期时间失败:", data_e)
+                                EventMesh.publish("open_power_on", 5)#静音关机
+                                return
+                            else:
+                                EventMesh.publish("set_rtc_alarm")
+                                #self.rtc.datetime([2023, 12, 1, 5, 5, 59, 30, 0])
+                                return
+                
+            EventMesh.publish("set_rtc_alarm")
+
+
+        def set_rtc_alarm(self,event,msg):
+            msg_data = EventMesh.publish("get_boot_off_time")
+            if msg_data != None:
+                power_offdata = msg_data[0]
+                start_hour = int(power_offdata["start_hour"])
+                start_min = int(power_offdata["start_min"])
+                end_hour = int(power_offdata["end_hour"])
+                end_min = int(power_offdata["end_min"])
+                off_on = int(power_offdata["poweroff_on"])
+                if off_on == 1:
+                    next_minute = start_hour*60+start_min #10:11
+
+                    start_total = start_hour*60+start_min #10:11
+                    end_total = end_hour*60+end_min #10:11
+                    rtc_now_time = self.rtc.datetime()
+                    current_minute = rtc_now_time[4]*60 + rtc_now_time[5]#当前时间
+
+
+                    minute_list = []
+                    if start_total != current_minute:
+                        minute_list.append(start_total)#23*60=
+                    if end_total != current_minute:
+                        minute_list.append(end_total)
+                    minute_list.append(current_minute)#[927,927,930]
+                    minute_list = sorted(minute_list)
+                    current_index = minute_list.index(current_minute)
+                    print("minute_list",minute_list,start_total,end_total,current_index,power_offdata)
+                    
+                    
+                    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("08下一个闹钟的分钟数:", next_minute)
+
+                    print("minute_list1",minute_list,current_index,next_minute)
+                    if next_minute > current_minute:
+                        interval_minute = next_minute - current_minute
+                        print("09距离下一次响铃的的分钟数:", interval_minute)#14 31 14 29 14 31 24*60-
+                    else:
+                        interval_minute = (24*60 - current_minute) + next_minute
+                        print("10距离下一次响铃的的分钟数:", interval_minute)
+
+
+                    #反向获取时间戳
+                    time = utime.localtime()
+                    EventMesh.debug_log("关机09获取utime的时间戳:", time)
+                    time
+                    rtc_mktime = utime.mktime(time)-time[5]
+                    EventMesh.debug_log("关机10反向获取utime的mktime:", rtc_mktime)
+
+                    #加上下一次响铃需要的时间
+                    next_alarm_mktime = rtc_mktime + interval_minute*60 #转换成s单位 时间戳
+                    EventMesh.debug_log("关机11下一次响铃的mktime:", next_alarm_mktime)
+
+                    #格式化时间戳,得到下一次闹钟的时间
+                    next_alarm_time = utime.localtime(next_alarm_mktime)
+                    EventMesh.debug_log("关机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)
+                    EventMesh.debug_log("关机13将该时间转换为RTC元组:", data_e)
+                    
+                    self.rtc.register_callback(self._rtc_callback)
+
+                    FLAG = self.rtc.set_alarm(data_e)
+                    if FLAG == 0:
+                        EventMesh.debug_log("关机11成功设置rtc的到期时间:", data_e)
+                    else:
+                        EventMesh.debug_log("关机时设置rtc的到期时间失败:", data_e)
+                    self.rtc.enable_alarm(1)
+                else:
+                    self.rtc.enable_alarm(0)
+                    
+
+    class schoolclassManager(Abstract):#
+        def __init__(self):
+            # ['火星情报局', '一年级二班', '柠檬茶']
+            self.school_name = ''
+            self.class_name = ''
+            self.full_name = ''
+            tmp_data = EventMesh.publish("get_storage_config","school_name")
+            if tmp_data != None:
+                self.school_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","class_name")
+            if tmp_data != None:
+                self.class_name = tmp_data
+            tmp_data = EventMesh.publish("get_storage_config","full_name")
+            if tmp_data != None:
+                self.full_name = tmp_data    
+
+            
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_schoolname", self.set_school_name)#
+            EventMesh.subscribe("get_schoolname", self.get_school_name)
+
+            EventMesh.subscribe("set_classname", self.set_classname)#
+            EventMesh.subscribe("get_classname", self.get_classname)
+
+            EventMesh.subscribe("set_fullname", self.set_full_name)#
+            EventMesh.subscribe("get_fullname", self.get_full_name)
+
+        def set_school_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.school_name = str(msg)
+                    EventMesh.publish("set_storage_config",["school_name",str(msg)])
+            
+
+        def get_school_name(self, event, msg):
+            if self.school_name:
+                return self.school_name
+            else:
+                return None
+        
+        def set_classname(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.class_name = str(msg)
+                    EventMesh.publish("set_storage_config",["class_name",str(msg)])
+                
+            
+        def get_classname(self, event, msg):
+            if self.class_name:
+                return self.class_name
+            else:
+                return None
+        def set_full_name(self, event, msg): 
+            if msg != None:
+                if len(msg) != 0:
+                    self.full_name = str(msg)
+                    EventMesh.publish("set_storage_config",["full_name",str(msg)])
+
+        def get_full_name(self, event, msg):
+            if self.full_name:
+                return self.full_name
+            else:
+                return None
+            
+    
+    class vedioInforManager(Abstract):#
+        def __init__(self):
+            self.call_id = ""
+            self.meet_id = ""#会议id
+            self.call_type = 0 #会议id
+            self.tokens_data= ""#tokens
+            self.timer = osTimer()
+            self.videobook = {}
+            self.check_json = 0
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
+
+            if self.check_json == True:
+                with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:
+                    self.videobook = ujson.load(fd)
+                    print("读取视频通话账号列表")
+            
+            self.video_state = 0
+            self.video_count = 0
+            self.video_state_time = 0
+
+            self.video_dev_mode = 0
+
+            self.video_led_state = 0
+            self.video_answer = 0
+
+            self.video_timer = 0
+
+            self.video_init = 0
+            self.video_network_end = 0 #网络不好或者信号较差菊风底层挂断当前视频通话
+            self.videoInfo_queue = Queue()
+            _thread.stack_size(10*1024)
+            _thread.start_new_thread(self.videoInfo_queue_thread, ())
+            _thread.stack_size(8*1024)
+            EventMesh.subscribe("publish_message_event_videoInfo",self.publish_message_event_videoInfo)
+            pass
+
+        def videoInfo_queue_thread(self):
+            while True:
+                data = self.videoInfo_queue.get()
+                #EventMesh.debug_log("ledInfo_queue:data = {}".format(data))
+                if data != None:
+                    try:
+                        data["func"](data["data"])
+                    except Exception as e:
+                        EventMesh.debug_log("ledInfo_queue:ERROR:{}".format(e))
+                        usys.print_exception(e)
+        def publish_message_event_videoInfo(self,event,msg):
+            self.videoInfo_queue.put(msg)
+
+        def publish_led_event_cb(self, *args, **kwargs):
+            EventMesh.publish("publish_message_event_videoInfo",{"func":self.video_time_cb,"data":0})
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_vedio_call_id", self.set_vedio_call_id)#
+            EventMesh.subscribe("set_vedio_meet_id", self.set_vedio_meet_id)#
+            EventMesh.subscribe("set_vedio_call_type", self.set_vedio_call_type)#
+            EventMesh.subscribe("set_vedio_tokens_data", self.set_vedio_tokens_data)#
+
+            EventMesh.subscribe("get_vedio_call_id", self.get_vedio_call_id)#
+            EventMesh.subscribe("get_vedio_meet_id", self.get_vedio_meet_id)#
+            EventMesh.subscribe("get_vedio_call_type", self.get_vedio_call_type)#
+            EventMesh.subscribe("get_vedio_tokens_data", self.get_vedio_tokens_data)#
+
+
+            EventMesh.subscribe("open_vedio_infor",self.open_vedio_infor)
+            EventMesh.subscribe("close_jrtc_event",self.close_jrtc_event)
+
+            EventMesh.subscribe("get_videobook_list", self.get_videobook_list)
+            EventMesh.subscribe("set_videobook_list", self.set_videobook_list)
+
+            EventMesh.subscribe("set_video_state", self.set_video_state)
+            EventMesh.subscribe("get_video_state", self.get_video_state)
+
+            EventMesh.subscribe("set_dev_app_mode", self.set_dev_app_mode)
+            EventMesh.subscribe("get_dev_app_mode", self.get_dev_app_mode)
+
+            EventMesh.subscribe("close_video_timer",self.close_video_timer)
+
+            EventMesh.subscribe("call_viode_book_num",self.call_viode_book_num)
+
+            EventMesh.subscribe("app_rtalk_cb",self.app_rtalk_cb)#app拒绝视频通话
+
+            EventMesh.subscribe("video_answer_cb",self.video_answer_cb)#接听视频通话
+
+            EventMesh.subscribe("video_newwork_reject_cb",self.video_newwork_reject_cb)#端挂断视频通话
+            EventMesh.subscribe("video_dev_reject_cb",self.video_dev_reject_cb)#手表端挂断视频或者语音通话
+
+            EventMesh.subscribe("video_no_network",self.video_no_network)#打着突然掉网或者未绑定设备 每10s检测一次
+
+            EventMesh.subscribe("clear_video_timer_state",self.clear_video_timer_state)
+
+            EventMesh.subscribe("set_vedio_init",self.set_vedio_init)
+            
+
+            EventMesh.subscribe("set_app_dev_end_state",self.set_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
+            EventMesh.subscribe("get_app_dev_end_state",self.get_app_dev_end_state)#设置是app 设备 还是主动信号不好的挂断当前的视频通话
+
+        def set_video_state(self, event, msg):#视频通话 1是刚播进去 2 是手机拨进去 3是正在加入中 5是已接通出现画面
+            self.video_state = msg
+
+        def get_video_state(self, event, msg):
+            return self.video_state
+        
+        def set_dev_app_mode(self, event, msg):#设置是手表拨 还是手机app拨视频通话 0未拨打 1是手表设备端  2 手机app拨打视频通话
+            self.video_dev_mode = msg
+
+        def get_dev_app_mode(self, event, msg):
+            return self.video_dev_mode
+        
+        def get_videobook_list(self, event, msg):
+            self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
+            return [self.check_json,self.videobook]
+        
+        def set_videobook_list(self, event, msg):
+            print("videolist",msg)
+            self.check_json = msg[0]
+            self.videobook = msg[1]
+
+        def call_viode_book_num(self, event, msg):#默认拨打视频通话列表第一个
+            self.video_led_state = 0
+            self.video_network_end = 0
+            EventMesh.publish("clear_video_timer_state")
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#未联网提示关机
+                if len(self.videobook) != 0:#已联网未添加账号
+                    phonebook_keys = sorted(self.videobook.keys())
+                    name = self.videobook[phonebook_keys[0]]
+                    key_tmp = phonebook_keys[0][4:]
+                    print("key_tmp list",key_tmp)
+                    print("calling",key_tmp)
+                    EventMesh.publish("set_vedio_call_id", key_tmp)#
+                    EventMesh.publish("set_vedio_call_type", 1)#
+                    EventMesh.publish("set_video_state", 1)#
+                    EventMesh.publish("set_dev_app_mode", 1)#
+                    EventMesh.publish("close_hr_sop2")##在测试心率血氧 血压体温是关闭测试
+                    EventMesh.publish("video_call_out_cb",1)#视频通话拨进中
+                    EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[1,key_tmp])
+                else:
+                    EventMesh.publish("video_call_out_cb",None)#视频通话拨进中
+                    print("no video list")
+                    pass
+            else:
+                EventMesh.publish("set_sim_mode")#
+                pass
+        
+
+            
+        def set_vedio_call_id(self, event, msg): 
+            self.call_id = msg
+
+        def set_vedio_meet_id(self, event, msg): 
+            self.meet_id = msg
+
+        def set_vedio_call_type(self, event, msg): 
+            self.call_type = msg
+
+        def set_vedio_tokens_data(self, event, msg): 
+            self.tokens_data= msg
+            
+
+        def get_vedio_call_id(self, event, msg): 
+            return self.call_id
+        
+        def get_vedio_meet_id(self, event, msg): 
+            return self.meet_id
+        
+        def get_vedio_call_type(self, event, msg): 
+            return self.call_type
+        
+        def get_vedio_tokens_data(self, event, msg): 
+            return self.tokens_data
+
+        def set_vedio_init(self, event, msg): 
+            self.video_init = 0
+
+        def open_vedio_infor(self,event,msg):
+            if self.video_init == 0:
+                self.video_init = 1
+                EventMesh.publish(constants.EVENT.SYSTEM_UP)#唤醒休眠
+                call_id = EventMesh.publish("get_vedio_call_id")#对方的账号
+                meet_id = EventMesh.publish("get_vedio_meet_id")#共有的会议id
+                call_type = EventMesh.publish("get_vedio_call_type")#呼叫类型
+                tokens_data = EventMesh.publish("get_vedio_tokens_data")#tookens数据#云米平台不需要tokens
+            
+
+
+                
+                uid = str(call_id)
+                ticket = str(meet_id)
+
+                # data = ['6951832', '876226002021444', '1', '01lqlyqzQ4Gozdz8OJv1Mij2Y3PBq2y3+rtIA26Ge+m2QHTc/Vk=gufkGNMBiYhPjbq1tLCwtLKysLKws7a2tg==']
+
+                tokens = str(tokens_data)
+                appkey = "efe9f8800a39d96244234097"#
+                uid_key = "25v9C652123QL3N8"
+
+                # appkey = "249e7d505516af0a7ed44097"
+                # uid_key = "qQI4gkB9FxH8J2cb"
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                oneself_id = str(imei)#自己的账号默认是imei号
+
+            
+                
+                print("uid ",uid,ticket,oneself_id)
+
+                
+                self.video_count = 0
+                self.video_state_time = 0
+                self.video_led_state = 0
+                self.video_answer = 0
+                self.video_timer = 0
+                self.timer.start(1*1000,1,self.publish_led_event_cb)
+            
+
+        def video_time_cb(self,data):#1s定时器 实时监测视频通话的状态 3是拨进未接通 5是接通出画面了
+            EventMesh.publish("system_sleep_rest")#防止黑屏 
+            call_state = 1
+            video_state = EventMesh.publish("get_video_state")#这个函数获取为了防止不进回调不置0
+            get_video_state = EventMesh.publish("get_video_in_out_state")
+            dev_mode = EventMesh.publish("get_dev_app_mode")
+            if self.video_led_state == 1 or self.video_timer == 1:#手表挂断不在进入
+                self.timer.stop()
+                return
+
+            if video_state != 0 or call_state != 0:
+                if get_video_state == 0 and call_state != 0:#双方接通如果是信号不好就开始计算30 30s过后还没有出画面就挂断当前视频通话
+                    self.video_count+=1
+                    if self.video_count > 30:
+                        if call_state != 5:
+                            self.video_state = 0
+                            self.video_state_time = 0
+                            self.timer.stop()
+                            EventMesh.publish("video_newwork_reject_cb",5)#挂断视频通话
+                            return
+
+                if call_state == 5:#已经接通出画面了
+                    self.video_count = 0
+                    self.video_answer = 4
+                    EventMesh.publish("set_video_in_out_state",0)
+                    if self.video_state_time == 0:
+                        self.video_state_time = 1
+                        EventMesh.publish("stop_led_timer")#设置参数
+                        EventMesh.publish("close_timer_all")#
+                        EventMesh.publish("video_answer_mode_timer_cb",2)#
+
+                    EventMesh.publish("set_video_state", 5)
+                else:
+                    self.video_state_time = 0 
+                    if call_state != 0:#信号不好的时候正在接听
+                        EventMesh.publish("set_video_state", call_state)
+
+                        if call_state == 4:
+                            EventMesh.publish("stop_led_timer")#设置参数
+                            EventMesh.publish("close_timer_all")#
+
+                        if dev_mode != 0:
+                            if get_video_state == 0 and call_state != 4 and self.video_answer == 0:
+                                EventMesh.publish("video_answer_mode_timer_cb",3)#
+                        
+                    if call_state == 0:
+                        self.timer.stop()
+                        EventMesh.publish("video_newwork_reject_cb",1)
+            else:
+                self.video_state_time = 0
+                self.video_count = 0
+                self.timer.stop()
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("video_newwork_reject_cb",1)
+
+        def video_waite_event_time_cb(self,*argc):#正在接听中,请稍候
+            EventMesh.publish("video_answer_mode_timer_cb",1)
+            pass
+
+        def video_answer_event_time_cb(self,*argc):#对方已接听可以正常视频通话了
+            EventMesh.publish("video_answer_mode_timer_cb",2)
+            pass
+        def video_no_network(self,event,msg):#视频通话无网络
+            if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#
+                if EventMesh.publish("get_video_state") != 0:
+                    EventMesh.publish("video_newwork_reject_cb",None)
+                pass
+
+
+        def close_video_timer(self,event,msg):
+            self.timer.stop()
+            pass
+        def close_jrtc_event(self,event,msg):
+            
+            pass
+
+
+        def video_answer_cb(self,event,msg):#手表端拒绝视频通话
+            EventMesh.publish("stop_led_timer")#关闭亮灯模式
+            EventMesh.publish("close_timer_all")##关闭统一的计时器
+            EventMesh.publish("set_video_in_out_state",0)
+            EventMesh.publish("open_vedio_infor")#启动视频通话的SDK相关配置
+
+        
+        def clear_video_timer_state(self,event,msg):#清除标识
+            self.video_timer = 0
+            self.video_network_end = 0
+        
+        def video_newwork_reject_cb(self,event,msg):#信号不好底层SDK挂断
+            if self.video_led_state != 2:#2表示app挂断
+                if self.video_network_end == 1:
+                    return
+                self.video_network_end = 1
+                self.video_timer = 1
+                self.video_init = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("close_video_timer")
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("set_dev_app_mode", 0)
+                EventMesh.publish("set_video_in_out_state",0)
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#
+
+                
+                if self.video_led_state == 0:
+                    EventMesh.publish("video_answer_mode_timer_cb",4)#提示对方已挂断
+                    EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
+
+
+        def video_dev_reject_cb(self,event,msg):#手表主动挂断
+            if self.video_timer == 0:
+                self.video_init = 0
+                EventMesh.publish("stop_led_timer")#设置参数
+                EventMesh.publish("close_timer_all")#
+                EventMesh.publish("close_video_timer")
+                EventMesh.publish("set_video_state", 0)
+                EventMesh.publish("set_dev_app_mode", 0)
+                EventMesh.publish("set_video_in_out_state",0)
+                call_id = str(EventMesh.publish("get_vedio_call_id"))#
+                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
+                call_type = int(EventMesh.publish("get_vedio_call_type"))#
+
+                self.video_led_state = 1
+                self.video_timer = 1
+                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
+
+
+            
+        def set_app_dev_end_state(self,event,msg):#app拒绝视频通话
+            self.video_led_state = 0 #手表挂断不在进入
+
+        def get_app_dev_end_state(self,event,msg):#app拒绝视频通话
+            return self.video_led_state #手表挂断不在进入
+
+        def app_rtalk_cb(self,event,msg):#app拒绝视频通话
+            dev_mode = EventMesh.publish("get_dev_app_mode")#如果是app主动挂断需要提示音频文件
+            video_state = EventMesh.publish("get_video_state")#清除视频通话状态
+            if self.video_led_state != 0 or self.video_timer != 0:#手表挂断不在进入
+                return
+            
+            self.video_init = 0
+            self.video_timer = 1
+            self.video_led_state = 2
+            EventMesh.publish(constants.EVENT.SYSTEM_UP)#
+
+            EventMesh.publish("stop_led_timer")#设置参数
+            EventMesh.publish("close_timer_all")#
+            EventMesh.publish("close_video_timer")
+            EventMesh.publish("set_dev_app_mode", 0)
+            EventMesh.publish("set_video_state",0)#清除视频通话状态
+            EventMesh.publish("set_video_in_out_state",0)#清除视频通话拨进还是拨出的状态
+            EventMesh.publish("video_answer_mode_timer_cb",4)##提示对方已挂断
+
+
+    def jrtc_cb(close_sta):#注册回调
+        print("jrtc callback:", close_sta)
+        if close_sta == 0 or close_sta == 1:
+            EventMesh.publish("set_video_state", 0)
+            EventMesh.publish("set_video_in_out_state",0)
+            EventMesh.publish("set_vedio_init")
+
+
+
+    import fota
+    class firwDownloadManager(Abstract):#
+        def __init__(self):
+            self.timer = osTimer()
+
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("firware_download", self.firware_download)#
+
+        def firware_download(self, event, msg): 
+            number = str(msg)
+            sms.sendPduMsg(number, 'set ok', 'UCS2')
+            self.timer.start(10*1000,0,self.fun)
+
+        def fun(self,*argc):
+            fota_obj = fota()
+            fota_obj.httpDownload(url1="http://u-oss.thisiot.com/test/dfota_1.bin",url2="http://u-oss.thisiot.com/test/dfota_2.bin")
+
+
+
+
+
+
+
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/motor.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/motor.py
new file mode 100644 (file)
index 0000000..cd31639
--- /dev/null
@@ -0,0 +1,112 @@
+from common import Abstract
+import osTimer
+import EventMesh
+from machine import Pin
+import utime
+
+from queue import Queue
+import _thread
+import usys
+
+
+motor_pin = Pin(Pin.GPIO20, Pin.OUT, Pin.PULL_PD, 0)
+def open_motor():#开马达
+    motor_pin.write(1)
+
+def close_motor():#关闭马达
+    motor_pin.write(0)
+
+
+
+MOTOR_TIME = 100
+class motorEventManager(Abstract):#马达事件
+    def __init__(self):
+        self.motor_timer = osTimer()
+        self.motorInfo_queue = Queue()
+        self.motor_enable = 0#马达使能
+        self.motor_total_time = 0#总的时间
+        self.motor_open_time = 0 #开马达事件
+        self.motor_close_time = 0#关马达事件100ms
+        self.motor_count = 0
+        self.motor_mode = 0#模式
+        _thread.start_new_thread(self.motorInfo_queue_thread, ())
+        EventMesh.subscribe("publish_message_event_motorInfo",self.publish_message_event_motorInfo)
+        pass
+
+    def motorInfo_queue_thread(self):
+        while True:
+            data = self.motorInfo_queue.get()
+            #print("ledInfo_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    print("ledInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_message_event_motorInfo(self,event,msg):
+        self.motorInfo_queue.put(msg)
+
+    def publish_motor_event_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_message_event_motorInfo",{"func":self.motor_fun_cb,"data":0})  
+        
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("set_motor_time", self.set_motor_time)#设置参数
+        EventMesh.subscribe("close_motor_infor", self.close_motor_infor)#关闭马达和定时器
+
+    # msg 0马达使能 1 马达振动时间100ms单位 2 震动次数 3 间隔时间振动 4 是否需要长振 5 长振时间  6间隔时间长振 7长振次数1一次 要为200ms的倍数
+    def set_motor_time(self,event,msg):
+        open_power = EventMesh.publish("get_power_on_state")#获取开机标识
+        if open_power != None:
+            if open_power == 0:
+                return
+        if msg != None:
+            self.motor_enable = msg[0]
+            if self.motor_enable == 1: #马达使能
+                self.motor_mode = msg [1]
+                self.motor_total_time = msg[2]#总的时间
+                self.motor_open_time = msg[3] #开马达事件
+                self.motor_close_time = msg[4]#关马达事件100ms
+                self.motor_count = 0
+                self.motor_timer.stop()
+                # print("motor msg",msg)
+                close_motor()
+                self.motor_timer.start(MOTOR_TIME,1,self.publish_motor_event_cb)
+
+    def motor_fun_cb(self, data):
+        if self.motor_mode == 0 or self.motor_enable == 0:
+            close_motor()
+            EventMesh.publish("close_motor_infor")#关闭马达和定时器
+            return
+        if self.motor_mode == 1:#
+            if self.motor_total_time > 0:
+                self.motor_total_time-=1
+                if self.motor_total_time > 0:
+                    open_motor()
+                else:
+                    close_motor()
+                    EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                    return
+        elif self.motor_mode == 2:#
+            # print("self.motor_count",self.motor_count,self.motor_open_time,self.motor_close_time,self.motor_total_time)
+            if self.motor_count % (self.motor_open_time) < self.motor_close_time: # 4 4 2 1%4 = 1 2%4 = 2 3%4 = 3
+                open_motor()
+            else:
+                close_motor()
+            if self.motor_count >= self.motor_total_time-1:
+                EventMesh.publish("close_motor_infor")#关闭马达和定时器
+                return
+            self.motor_count+=1
+
+    def close_motor_infor(self,event,msg):
+        print("close_motor_infor!!!")
+        close_motor()
+        self.motor_enable = 0#马达使能
+        self.motor_total_time = 0#总的时间
+        self.motor_open_time = 0 #开马达事件
+        self.motor_close_time = 0#关马达事件100ms
+        self.motor_count = 0
+        self.motor_mode = 0#模式
+        self.motor_timer.stop()
+
+
+
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/pcm_stream_play_test.py
new file mode 100644 (file)
index 0000000..edbbd1b
--- /dev/null
@@ -0,0 +1,35 @@
+# -*- coding: UTF-8 -*-
+import audio
+from machine import Pin
+import utime
+import uos
+
+def audio_cb(event):
+    if event == 0:
+        print('audio-play start.')
+    elif event == 7:
+        print('audio-play finish.')
+
+aud = audio.Audio(0)
+aud.setCallback(audio_cb)
+
+# 音频流播放
+size = 4*1024 # 保证一次填充的音频数据足够大以便底层连续播放
+format = 3 # 1:PCM RAW;2 :WAVPCM 3mp3
+
+def play_from_fs():
+    file_size = uos.stat("/usr/tesr.mp3")[6]  # 获取文件总字节数
+    print(file_size)
+    with open("/usr/tesr.mp3", "rb")as f:   
+        while 1:
+            b = f.read(size)   # read
+            if not b:
+                break
+            aud.playStream(format, b)
+
+
+play_from_fs()
+# 等待播放完成
+utime.sleep_ms(5000) 
+# 停止本次播放以便不影响下次播放
+aud.stopPlayStream() 
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/protocol.py
new file mode 100644 (file)
index 0000000..2ab81a5
--- /dev/null
@@ -0,0 +1,3760 @@
+import ujson
+import utime
+import EventMesh
+import constants
+from common import Abstract
+import uhashlib
+import ubinascii
+from misc import Power
+import audio
+from machine import Pin
+import ujson
+import ql_fs
+import dataCall
+import checkNet
+import net
+import usocket
+import osTimer
+
+import machine
+import urandom
+import _thread
+import usys
+import request
+import umqtt 
+import modem
+SHA256 = uhashlib.sha256
+import SecureData
+def server_init(server_type = None):
+    #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 8:ds未知 dey.hinwatch. com:9968  9:183.62.239.121:31869 10:183.62.239.121:33461
+    if server_type == None:
+        server_type = 2
+    #EventMesh.debug_log("server_init:server_type:{}".format(server_type))
+   
+    d_server_addr = "api.xcloudtech.com"
+    d_server_port = 9000
+    d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+    d_PID = "SZKW"
+    if server_type == 1:
+        pass
+        
+    elif server_type == 2:
+        # test.iot.socket.thisiot.com:9999
+        # iot.socket .thisiot.com:9999
+        # d_server_addr = "test.iot.socket.thisiot.com"
+        # d_server_port = 9999
+        # d_md5_key = "3JyCjsw4ryXKzjzudayY"
+        # d_PID = "qAELPTKmFanR4RHe"
+
+        d_server_addr = "iot.socket.thisiot.com"
+        d_server_port = 9999
+        d_md5_key = "SZYhyGhroQ3xFKFWZq1g"
+        d_PID = "oxLwDqcwJCtiPSRu"
+
+    elif server_type == 3:
+        d_server_addr = "tcp.zhihuixuexiao.com"
+        d_server_port = 2346
+        d_md5_key = ""
+        d_PID = "3G"
+    elif  server_type == 4:
+         d_server_addr = "tcp.tx.kidxin.com"
+         d_server_port = 20500
+    elif server_type == 5:
+        d_server_addr = "device.miwitracker.com"
+        d_server_port = 8505
+        d_md5_key = ""
+        d_PID = "3G"
+    elif server_type == 6:
+        d_server_addr = "120.26.104.21"
+        d_server_port = 9968
+        d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+        d_PID = "SZKW"
+    elif server_type == 7:
+        d_server_addr = "8.134.68.15"
+        d_server_port = 30346
+        d_PID="KnHnj1Cd5VxcO3Ft"
+        d_md5_key = "evxThVhMBmRNiQ1Twigw"
+    elif server_type == 99:
+        d_server_addr = "lab.xcloudtech.com"
+        d_server_port = 9000
+    elif server_type == 8:
+        d_server_addr = "dev.hxinwatch.com"
+        d_server_port = 9968
+    elif server_type == 9:
+        d_server_addr = "183.62.239.121"
+        d_server_port = 31869
+    elif server_type == 10:
+        d_server_addr = "183.62.239.121"
+        d_server_port = 33461
+
+    return [d_server_addr,d_server_port,d_md5_key,d_PID]
+from queue import Queue
+def unicode_to_utf8(src):
+    ref = 0xe08080
+    result = ref
+    
+    #取最后六位
+    a = src & 0x3f
+    
+    #将最后六位放在ref最后六位的空位置
+    result = result | a
+    src = src >> 6
+    
+    #取接下来的六位
+    a = src & 0x3f
+    
+    #放在ref对应的六个位置
+    result = result | (a << 8)
+
+    #保留最后四位
+    src = src >> 6
+
+    #放在ref对应的四个位置    
+    result = result | (src << 16)
+    return result
+
+def UnicodeHexStr_To_Utf8Str(str):
+    odata = 0
+
+    result = bytes() 
+    su =str.upper()
+
+    i = 0
+    for c in su:
+        tmp=ord(c)
+        if tmp <= ord('9') :
+            odata = odata << 4
+            odata += tmp - ord('0')
+
+        elif ord('A') <= tmp <= ord('F'):
+            odata = odata << 4
+            odata += tmp - ord('A') + 10
+        if(i%4==3): #每2字节获取一个int,拿到转换后的unicode int
+            #print(odata.to_bytes(2, 'big'))
+            #result.append(odata)
+            if odata > 255:
+                tmp = unicode_to_utf8(odata)#拿到转换后的utf8 int
+                tmp2 = tmp.to_bytes(3, 'big') #转bytes
+            else :
+                tmp2 = odata.to_bytes(1, 'big') 
+            #print("tmp2:{}".format(tmp2))
+            result = result + tmp2
+            odata = 0 
+        i+=1
+    return result.decode('utf-8') #返回utf8的str
+
+def gewu_init():
+    productKey = "cu1shld45y4hjr1L"
+    return productKey
+mqtt_state = 0
+def mqttsub_cb(topic, msg):
+    global mqtt_state
+    print("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode()))
+    jsload_data =  ujson.loads(msg.decode())
+    print("jsload_data-{} type:{}".format(jsload_data,type(msg.decode())))
+    # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
+    # ujson.loads(c)
+    # $sys/cu1shld45y4hjr1L/866610001011658/ext/regist
+    #data = {"messageId":"25","params":{"deviceSecret":"C1D75A63C0338978438E9197372FC698""}}
+    if "params" in jsload_data:
+        params_str = jsload_data["params"]
+        if "deviceSecret" in params_str:
+            str_tmp = params_str["deviceSecret"]
+            print(str_tmp)
+            EventMesh.publish("set_deviceSecret",str_tmp)
+    mqtt_state = 1
+def mqtterr_cb(error):
+    '''
+    接收umqtt线程内异常的回调函数
+    '''
+    print("error!!!!!!!!!!!".format(error))
+
+def HMAC(k, m):
+    SHA1_BLOCK_SIZE = 64
+    KEY_BLOCK = k + (b'\0' * (SHA1_BLOCK_SIZE - len(k)))
+    KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+    KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+    inner_message = KEY_INNER + m
+    outer_message = KEY_OUTER + SHA256(inner_message).digest()
+    return SHA256(outer_message)
+
+
+def get_hmac_sha256(k, m):
+    data = HMAC(k, m).digest()
+    # print("HMAC(k, m).digest():", data)
+    # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+    hex_data = ubinascii.hexlify(data)
+    hex_data = hex_data.decode('ascii')
+    return hex_data
+
+def mqtt_client_pro_init():#一型一密
+    client = 0
+    
+    # 创建一个mqtt实例
+#     
+    # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息
+    # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId
+    deviceId = ""#"bOOSGN5FlXEjt15"
+    deviceKey = ''#"bOOSGN5FlXEjt15"
+    imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+    deviceId = str(imei)
+    deviceKey = str(imei)
+    productKey = gewu_init()
+    
+    EventMesh.publish("set_product_key",productKey)
+    data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据
+    # data = b"The data to encrypt"
+    # 密钥
+    productSecret = b"765fc66242616852209d1c57e51b0744" #765fc66242616852209d1c57e51b0744 ,productSecret
+
+    # {"productKey":"cu1shld45y4hjr1L","deviceKey":"bOOSGN5FlXEjt15","deviceSecret":"9234577490038E0949B800C243BF4321"}
+    checkpassword = get_hmac_sha256(productSecret,data)
+    # print(checkpassword)
+    # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
+    
+    Client_id = "{}|{}|0|1|0".format(deviceId,productKey) #
+    # print(Client_id)
+    server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+    port = 8883
+    # {deviceKey}|{productKey} mqttUsername
+    userName = "{}|{}".format(deviceKey,productKey)
+    userpassword = checkpassword
+    # print(userName)
+    # print(userpassword)
+    # client = umqtt.MQTTClient("866610001011658|cu1shld45y4hjr1L|0|1|0","dmp-mqtt.cuiot.cn", 1883, "866610001011658|cu1shld45y4hjr1L","675f6fbfb15a729bbc280273632ce3a96f8b38d4736fbaf888fe8a48fd7aee09")
+    # client = umqtt.MQTTClient("lxRXQayZ4poQz8G|cujg06l29iav591b|0|0|0","dmp-mqtt.cuiot.cn", 1883, "lxRXQayZ4poQz8G|cujg06l29iav591b","1f8c69d29afca0505d967066b39d84a5eb1e54302b87e337b405f99d029a9242")
+    client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
+    # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
+    # 设置消息回调
+    client.set_callback(mqttsub_cb)
+    # 设置异常回调
+    client.error_register_cb(mqtterr_cb)
+    return client
+
+def mqtt_client_dev_init():#一机一密
+    client = 0
+    
+    # 创建一个mqtt实例
+#     
+    # {"productKey":"cu1r1rjjrjdhz0lx","deviceKey":"DD86000000001","deviceSecret":"93FEEC6D16D30E2B90FE0DBC2FFCDB14"} 设备基本信息
+    # hmac_sha256(deviceIddeviceKeyproductKey,deviceSecret) mqttclientId
+    deviceId = '' #"bOOSGN5FlXEjt15"
+    deviceKey = ''#"bOOSGN5FlXEjt15"
+    imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+    deviceId = str(imei)
+    deviceKey = str(imei)
+    productKey = gewu_init()
+    data = "{}{}{}".format(deviceId,deviceKey,productKey)#需要用户定义产品是提供数据
+    # data = b"The data to encrypt"
+    # 密钥
+    deviceSecret_tmp = EventMesh.publish("get_deviceSecret")
+    subscribe_msg = deviceSecret_tmp.encode('ascii')
+    deviceSecret = subscribe_msg #765fc66242616852209d1c57e51b0744 ,productSecret
+    print(deviceSecret)
+
+    checkpassword = get_hmac_sha256(deviceSecret,data)
+    print(checkpassword)
+    # {deviceId}|{productKey}|{signMethod}|{authType}|{operator};连接id格式
+    Client_id = "{}|{}|0|0|0".format(deviceId,productKey) # 860132060346475|cu1shld45y4hjr1L|0|0|0
+    server = "dmp-mqtts.cuiot.cn"#"dmp-mqtt.cuiot.cn"
+    port = 8883
+    # {deviceKey}|{productKey} mqttUsername
+    userName = "{}|{}".format(deviceKey,productKey)
+    userpassword = checkpassword
+
+    client = umqtt.MQTTClient(Client_id,server, port, userName,"{}".format(userpassword),reconn=False,ssl=True)
+    # client = MqttClient(Client_id, server, port, userName,"{}".format(userpassword))
+    # 设置消息回调
+    client.set_callback(mqttsub_cb)
+    # 设置异常回调
+    client.error_register_cb(mqtterr_cb)
+    return client
+
+
+
+class SockManager(Abstract):
+    def __init__(self):
+        self.sock = None
+        self.resolver = None
+        self.run_flag = False
+        self.lost_conn_check_time = 5 * 60 * 30
+        self.monitor_timer = osTimer()
+        self.publish_timer = osTimer()
+        self.reconnect_timer = osTimer()
+        self.mqtt_recv_timer = osTimer()
+        self.reconnect_time = 1000
+        self.reconnect_flag = 0
+        self.connect_tmp = 0
+        server_data = server_init()
+        # EventMesh.debug_log("SockManager:server_data:{}".format(server_data))
+        # self.server_addr = server_data[0]
+        # self.server_port = server_data[1]
+        self.server_addr = ""
+        self.server_port = ""
+        self.device_id = ""
+        self.device_key = ""
+        self.product_key = gewu_init()
+        self.deviceSecret = ""
+        self.client = 0
+        self.client_dev = 0
+        self.client_state = 0
+        self.mqtt_client_count = 0
+        ip_infor = {}
+        ip_infor = EventMesh.publish("get_new_ip_com")
+        EventMesh.debug_log("ip_infor1:{} \n\n\n".format(ip_infor))
+        
+        if ip_infor != None: #已经改过服务器
+            self.server_addr = ip_infor[0]
+            self.server_port = ip_infor[1]
+        else:
+            self.server_addr = server_data[0]
+            self.server_port = server_data[1]
+
+        EventMesh.debug_log("server_addr:{} server_port:{}".format(self.server_addr,self.server_port))
+        _thread.stack_size((9+3)*1024)
+        _thread.start_new_thread(self.connect, ())
+        _thread.stack_size(8*1024)
+        
+        
+        self.socket_send_queue = Queue()
+        _thread.stack_size((9+2)*1024)
+        _thread.start_new_thread(self.socket_send_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("set_device_id",self.set_device_id)
+        EventMesh.subscribe("set_device_key",self.set_device_key)
+        EventMesh.subscribe("set_product_key",self.set_product_key)
+
+        EventMesh.subscribe("get_device_id",self.get_device_id)
+        EventMesh.subscribe("get_device_key",self.get_device_key)
+        EventMesh.subscribe("get_product_key",self.get_product_key)
+
+        EventMesh.subscribe("set_deviceSecret",self.set_deviceSecret)
+
+        EventMesh.subscribe("get_deviceSecret",self.get_deviceSecret)
+        if EventMesh.platform == "gewu":
+            str = "deviceSecret:"
+            buf = bytearray(32+len(str))
+            length = SecureData.Read(2, buf, 32+len(str))
+            deviceSecret = buf.decode()
+            print(type(deviceSecret))
+            if deviceSecret != "":
+                if "deviceSecret" in deviceSecret:
+                    self.deviceSecret = deviceSecret.split(":")[1]
+            else:
+                self.deviceSecret = " "
+        if EventMesh.platform == "gewu":
+            self.client = mqtt_client_pro_init()
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("get_mqtt_pro_connect_state",self.get_mqtt_pro_connect_state)
+        EventMesh.subscribe("get_mqtt_dev_connect_state",self.get_mqtt_dev_connect_state)
+        EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send)
+        self.monitor_timer.start(7 * 60 * 1000, 1, self.check)
+
+    def add_support_resolver(self, resolver):
+        self.resolver = resolver
+
+    def initialization(self, *args, **kwargs):
+        _thread.stack_size(16*1024)
+        _thread.start_new_thread(self.recv, ())
+        _thread.stack_size(8*1024)
+    
+    def set_device_id(self,event,msg):
+        self.device_id = str(msg)
+        
+    def get_device_id(self,event,msg):
+
+        return self.device_id
+    def set_device_key(self,event,msg):
+        self.device_key = str(msg)
+        return
+    def get_device_key(self,event,msg):
+
+        return self.device_key
+    
+    def set_product_key(self,event,msg):
+        self.product_key = str(msg)
+        
+    def get_product_key(self,event,msg):
+
+        return self.product_key
+    
+    def set_deviceSecret(self,event,msg):
+        if EventMesh.platform == "gewu":
+            self.deviceSecret = str(msg)
+            deviceSecret_tmp = "deviceSecret:{}".format(msg)
+            SecureData.Store(2, deviceSecret_tmp, len(deviceSecret_tmp))
+        
+    def get_deviceSecret(self,event,msg):
+        return self.deviceSecret
+    
+    def connect(self):
+        EventMesh.debug_log("connect1{}:{}".format(self.server_addr, self.server_port))
+        if EventMesh.publish("get_sim_Status") != 1: #没sim
+            return
+        try:
+            if(self.sock != None) :
+                self.sock.close()
+            self.sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
+            #self.sock.setblocking(False) &self.sock.settimeout(0)不阻塞
+            self.sock.connect((self.server_addr, self.server_port))
+            
+            self.publish_timer.start(2000, 1, self.publish_timer_cb)
+            if EventMesh.platform == "gewu":
+                self.mqtt_client_count = 0
+                self.mqtt_recv_timer.start(5000, 1, self.mqtt_recv_timer_cb)
+            
+            utime.sleep_ms(500)
+            EventMesh.publish(constants.PROTOCOL.LK_SEND)
+            #  发送数据
+            
+            
+        except Exception as e:
+            usys.print_exception(e)
+            self.run_flag = False
+        else:
+            self.run_flag = True
+        EventMesh.debug_log("connect2{}:{}".format(self.server_addr, self.server_port))
+        self.reconnect_flag = 0
+    def publish_timer_cb(self, *args):
+        self.authen_set()
+
+    def authen_set(self):
+        sever_state = EventMesh.publish("get_server_state")#获取修改服务器状态
+        # print("sever_state{}".format(sever_state))
+        if sever_state != None:
+            if sever_state == 0:
+                imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+                server_data = EventMesh.publish("get_new_key_pid")#获取pid和key
+                key_data = ""
+                pid_data = ""
+                if server_data != None:
+                    key_data = server_data[0]
+                    pid_data = server_data[1]
+                else:
+                    server_data = server_init()
+                    key_data = server_data[2]
+                    pid_data = server_data[3]
+
+                # server_data = server_init()
+                # key_data = server_data[2]
+                # pid_data = server_data[3]
+               
+                sonce_data = str(urandom.getrandbits(32))#随机生成32位的随机数
+                md5_data = "{}*{}*{}*{}".format(imei,pid_data,sonce_data,key_data)#md5签名
+                sign_data = ""
+                hash_obj = uhashlib.md5(md5_data)
+                res = hash_obj.digest()
+
+                # 转成十六进制表示
+                sign_data = ubinascii.hexlify(res)
+                sign_data = sign_data.decode('ascii')
+                # print("sign_data:{} sonce_data:{}".format(md5_data,sign_data))
+                # sign_data = MD5_head
+                # http://8.134.110.49:31379/dev/device/check?imei=&bid=sonce=sign=
+                # ip_addr = "test.iot.api.thisiot.com"
+                # ip_addr = "app.api.thisiot.com"
+                # http://app.api.thisiot.com/
+                url = "http://app.api.thisiot.com/dev/device/check?imei={}&bid={}&sonce={}&sign={}".format(imei,pid_data,sonce_data,sign_data)
+                
+                # print("url:{}".format(url))
+                response = request.get(url)
+                data_tmp ={}
+                # d_server_addr = "device.miwitracker.com"
+                # d_server_port = 8505
+                # d_md5_key = ""
+                # d_PID = "3G"
+                # response.content = {'protocolType': '', 'host': 'device.miwitracker.com', 'secretKey': '', 'port': 8505, 'bid': '3G', 'extJsonStr': ''}
+                # response.status_code=200
+                print("test-{}".format(response.status_code))
+                if response.status_code == 200:
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    jsload_data =  ujson.loads(c)
+                    print("jsload_data-{}".format(jsload_data))
+                    # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
+                    # ujson.loads(c)
+                    
+                    if "success" in jsload_data:
+                        success = jsload_data["success"]
+                        if success == True:#合法设备
+                            if "data" in jsload_data:
+                                data_tmp = jsload_data["data"]#返回的数据 
+                                print("data_tmp:{}".format(data_tmp))
+                                code = jsload_data["code"]
+                                if code == 20000:#合法的设备
+                                    protocloType = data_tmp["protocolType"]#协议类型
+                                    host = data_tmp["host"]#服务骑地址
+                                    secretKey = data_tmp["secretKey"]#
+                                    pid = data_tmp["bid"]#产品型号
+                                    port = data_tmp["port"]#端口号
+
+                                   
+
+                                    if host != '' and (port != '' and port != -1):
+                                        if host != '':
+                                            self.server_addr = host
+                                            EventMesh.publish("set_ip",str(self.server_addr))
+                                        
+                                        if port != '' and port != -1:
+                                            self.server_port = port
+                                            EventMesh.publish("set_com",self.server_port)
+                                        EventMesh.publish("set_new_key", str(secretKey))#获取pid和key
+                                        EventMesh.publish("set_new_pid",str(pid))#获取pid和key
+                                        # self.reconnect_timer_cb()#重连设备
+                                        print("self.reconnect_flag",self.reconnect_flag)
+                                        self.reconnect_flag = 0
+                                        self.reconnect()#重连设备
+                    self.publish_timer.stop()
+                    EventMesh.publish("set_server_state",1)#获取修改服务器状态
+            else:
+                self.publish_timer.stop()
+            
+    
+
+    def mqtt_recv_timer_cb(self, *args):
+        self.mqtt_clien_cb()
+        
+
+
+    def mqtt_clien_cb(self):
+        if EventMesh.platform != "gewu":
+            return
+       # 需要加密的数据
+        get_deviceSecret = EventMesh.publish("get_deviceSecret")
+        if get_deviceSecret != None:
+            if self.mqtt_client_count == 0:
+                self.mqtt_client_count = 1
+                self.mqtt_recv_timer.stop()
+                get_deviceSecret = EventMesh.publish("get_deviceSecret")#获取设备的秘钥 只获取一次
+                print("get_deviceSecret{}".format(get_deviceSecret))
+                if get_deviceSecret == '':#如果为空就获取一次
+                    # print("self.client:{}".format(self.client))
+                    mqtt_connect = -1
+                    try:
+                        mqtt_connect = self.client.connect()
+                    except Exception as e:
+                        print(e)
+                        mqtt_connect = -1
+                    print("mqtt_connect:{}".format(mqtt_connect))
+                    if mqtt_connect == 0 :
+                        # 订阅主题
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        #$sys/{productKey}/{deviceKey}/ext/regist
+                        client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey)
+                        # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                        subscribe_msg = client_msg.encode('ascii')
+                        print(subscribe_msg)
+
+                        self.client.subscribe(subscribe_msg,0)#订阅消息主题
+
+                        
+                        self.client.wait_msg()  # 阻塞函数,监听消息
+                        utime.sleep(5)
+                        get_deviceSecret = EventMesh.publish("get_deviceSecret")
+                        if get_deviceSecret != '':
+                            self.client.disconnect()
+                            self.client_dev = mqtt_client_dev_init()
+                            print(self.client_dev)
+                            # mqtt_connect = self.client_dev.connect()
+                            try:
+                                mqtt_connect = self.client_dev.connect()
+                            except Exception as e:
+                                print(e)
+                                mqtt_connect = -1
+                            if mqtt_connect == 0:
+                                # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply
+                                msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey)
+                                sub_msg = msg_reply.encode('ascii')
+                                self.client_dev.subscribe(sub_msg,0)#订阅消息主题
+                                print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                                # 发布消息
+                                # UnicodeHexStr_To_Utf8Str(str_data)
+                                date_tmp = utime.localtime()
+                                time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                                updataTime = "{}".format(time_tmp*1000)
+                                # imei_tmp= modem.getDevImei()
+                                imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI)
+                                bat_tmp = EventMesh.publish("screen_get_battery")
+                                imei = "{}".format(imei_tmp)
+                                power = 0
+                                power = int(bat_tmp[1])
+                                hr = 0
+                                hr = EventMesh.publish("get_old_hr_data")
+                                if hr == None:
+                                    hr = 0
+                                deviceTime = "{}".format(time_tmp)
+                                manufactury = "fengda"
+                                DeviceState = "online"
+
+                                data_info = {
+                                    "messageId":"0",
+                                    "params": {
+                                        "data": [
+                                            {
+                                                "key":"deviceOffOn",
+                                                "value": {
+                                                    "deviceStatus":"Poweron",
+                                                    "updateTime":updataTime,
+                                                    "Imei":imei
+                                                }
+                                                
+                                            },
+                                            {
+                                                "key":"HeartRate",
+                                                "value":{
+                                                    "heartRate":hr,
+                                                    "updateTme":updataTime,
+                                                    "Imei":imei
+                                                }
+                                            },
+                                            {
+                                                "key":"powerSavingMode",
+                                                "value":0
+                                            },
+                                            {
+                                                "key":"IMEI",
+                                                "value":imei
+                                            },
+                                            {
+                                                "key":"DEVICE_TIME",
+                                                "value":deviceTime
+                                            },
+                                            {
+                                                "key":"MANUFACTURER",
+                                                "value":manufactury
+                                            },
+                                            {
+                                                "key":"REMAINING_POWER",
+                                                "value":power
+                                            },
+                                            {
+                                                "key":"DeviceState",
+                                                "value":DeviceState
+                                            }
+                                        ]
+                                    }
+                                }
+                                
+                                data_json = ujson.dumps(data_info) 
+                                # print("data_json:{}",data_json)
+                                # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch
+                                msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey)
+                                pub_msg = msg_pub.encode('ascii')
+                                self.client_dev.publish(pub_msg,data_json,0)#publis主题内容
+
+                                print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+                            pass
+
+                else:
+                    mqtt_dev_connect = -1
+                    mqtt_ret_connect = -1
+                    mqtt_pro_connect = -1
+                    if self.client_dev == 0:
+                        self.client_dev = mqtt_client_dev_init()
+                    try:
+                        mqtt_dev_connect = self.client_dev.connect()
+                    except Exception as e:
+                        print("erro!{}".format(e))
+                        mqtt_dev_connect = -2
+                        # Server Actively FIN Disconnected.Need Check Connection parameters
+                        err_dis = "FIN Disconnected" in str(e)
+                        err_parm1 = "107" in str(e)
+                        err_parm2 = "4" in str(e)
+                        # print("err_parm1!{} {} {} {}".format(err_parm1,err_parm2,err_info,err_dis))
+                        # Connect Error='4' MQTT Connect error=
+                        if err_dis == True or err_parm1 == True or err_parm2 == True:
+                            mqtt_dev_connect = -1
+                        
+
+                    if mqtt_dev_connect != 0:#连接参数错误可能是deviceScrete出错重新获取
+                    
+                        try:
+                            mqtt_ret_connect = self.client.connect()#重新获取deviceScrete
+                        except Exception as e:
+                            print(e)
+                            mqtt_ret_connect = -1
+                        # mqtt_connect = self.client.connect()
+                        print("mqtt_ret_connect:{}".format(mqtt_ret_connect))
+                        if mqtt_ret_connect == 0:
+                            # 订阅主题
+                            get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                            get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                            get_productKey = gewu_init()
+                            #$sys/{productKey}/{deviceKey}/ext/regist
+                            client_msg = "$sys/{}/{}/ext/regist".format(get_productKey,get_deviceKey)
+                            # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                            subscribe_msg = client_msg.encode('ascii')
+                            print(subscribe_msg)
+
+                            self.client.subscribe(subscribe_msg,0)#订阅消息主题
+
+                            self.client.wait_msg()  # 阻塞函数,监听消息
+                            utime.sleep(5)
+
+                            self.client.disconnect()
+                            self.client_dev = mqtt_client_dev_init()
+                            # print(self.client_dev)
+                            try:
+                                mqtt_pro_connect = self.client_dev.connect()
+                            except Exception as e:
+                                print(e)
+                                mqtt_pro_connect = -1
+                    # print("no deviceScret!!!!!!!{}".format(self.client_dev))
+                    # 设备秘钥不为空 重连获取设备失败不连接 第一次连接失败不连接不发送数据
+                    if EventMesh.publish("get_deviceSecret") != "" and (mqtt_pro_connect == 0 or mqtt_dev_connect == 0):
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        # $sys/cu1shld45y4hjr1L/bOOSGN5FlXEjt15/property/batch_reply
+                        msg_reply = "$sys/{}/{}/property/batch_reply".format(get_productKey,get_deviceKey)
+                        sub_msg = msg_reply.encode('ascii')
+                        # print(" deviceScret!!!!!!!{} msg_reply:{} sub_msg:{}".format(self.client_dev,msg_reply,sub_msg))
+                        self.client_dev.subscribe(sub_msg,0)#订阅消息主题
+                        print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                        # 发布消息
+                        # UnicodeHexStr_To_Utf8Str(str_data)
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                        updataTime = "{}".format(time_tmp*1000)
+                        imei_tmp = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        imei = "{}".format(imei_tmp)
+                        bat_tmp = EventMesh.publish("screen_get_battery")
+                        power = 0
+                        power = int(bat_tmp[1])
+                        hr = 0
+                        hr = EventMesh.publish("get_old_hr_data")
+                        if hr == None:
+                            hr = 0
+                        deviceTime = "{}".format(time_tmp)
+                        manufactury = "fengda"
+                        DeviceState = "online"
+
+                        data_info = {
+                            "messageId":"0",
+                            "params": {
+                                "data": [
+                                    {
+                                        "key":"deviceOffOn",
+                                        "value": {
+                                            "deviceStatus":"Poweron",
+                                            "updateTime":updataTime,
+                                            "Imei":imei
+                                        }
+                                        
+                                    },
+                                    {
+                                        "key":"HeartRate",
+                                        "value":{
+                                            "heartRate":hr,
+                                            "updateTme":updataTime,
+                                            "Imei":imei
+                                        }
+                                    },
+                                    {
+                                        "key":"powerSavingMode",
+                                        "value":0
+                                    },
+                                    {
+                                        "key":"IMEI",
+                                        "value":imei
+                                    },
+                                    {
+                                        "key":"DEVICE_TIME",
+                                        "value":deviceTime
+                                    },
+                                    {
+                                        "key":"MANUFACTURER",
+                                        "value":manufactury
+                                    },
+                                    {
+                                        "key":"REMAINING_POWER",
+                                        "value":power
+                                    },
+                                    {
+                                        "key":"DeviceState",
+                                        "value":DeviceState
+                                    }
+                                ]
+                            }
+                        }
+                        
+                        data_json = ujson.dumps(data_info) 
+                        # print("data_json:{}",data_json)
+                        # $sys/cu1shld45y4hjr1L/{deviceKey}/property/batch
+                        msg_pub = "$sys/{}/{}/property/batch".format(get_productKey,get_deviceKey)
+                        pub_msg = msg_pub.encode('ascii')
+                        self.client_dev.publish(pub_msg,data_json,0)#publis主题内容
+
+                        print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+
+    def get_mqtt_pro_connect_state(self,event,msg):
+        return self.client
+    def get_mqtt_dev_connect_state(self,event,msg):
+        return self.client_dev
+    
+    def check(self, *args):
+        if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了
+            EventMesh.debug_log("tcp reconnect!!!!!!!!!!!!!!!!!!")
+            EventMesh.publish(constants.EVENT.SET_CONNECT,0) #标记断网
+            self.reconnect()
+        self.connect_tmp = 0
+    def reconnect(self):
+        if(self.reconnect_flag == 1):
+            return
+        self.reconnect_flag = 1
+        self.reconnect_timer.start(self.reconnect_time, 0, self.reconnect_timer_cb)
+        if self.reconnect_time < 600*1000:
+            self.reconnect_time += 30*1000
+
+    def reconnect_timer_cb(self, *args): 
+        _thread.stack_size((9+1)*1024)
+        _thread.start_new_thread(self.connect, ())   
+        _thread.stack_size(8*1024)
+        
+    def socket_send_queue_thread(self):
+        while True:
+            data = self.socket_send_queue.get()
+            EventMesh.debug_log("TCP:send data1 len:{}".format(len(data)))
+
+            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))
+            socketsta = self.sock.getsocketsta() 
+            if(socketsta == -1): #给释放了或者出错了
+                continue
+            if(socketsta == 4):#正常连击
+                if data != None:
+                    try:
+                        self.sock.send(data)
+                        EventMesh.debug_log("TCP:send data2 len:{}".format(len(data)))    
+                    except Exception as e:
+                        self.reconnect()
+                        self.socket_send_queue.put(data)#重新把数据加回队列
+                        #EventMesh.debug_log("socket_send_queue_thread1:ERROR:")
+                        #usys.print_exception(e)
+            elif socketsta < 4:#正在连接,等待连接成功重新发送
+                count = 0
+                while True:
+                    if count > 15 :
+                        break
+                    utime.sleep(1)
+                    if(self.sock.getsocketsta() == 4):#
+                        try:
+                            self.sock.send(data)
+                            EventMesh.debug_log("TCP:send data3 len:{}".format(len(data)))    
+                        except Exception as e:
+                            self.reconnect()
+                            self.socket_send_queue.put(data)#重新把数据加回队列
+                            #EventMesh.debug_log("socket_send_queue_thread2:ERROR:")
+                            #usys.print_exception(e)
+                        break
+            else :#连接错误
+                EventMesh.debug_log("socket_send_queue_thread:ERROR:reconnect")
+                self.reconnect()
+            utime.sleep(1)
+
+    def send(self, topic, msg):
+        # EventMesh.debug_log("TCP:send data:{}".format(msg))
+        if EventMesh.publish("get_sim_Status") != 1: #没sim,则不发送
+            EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网
+            EventMesh.debug_log("dataCall not connect")
+            return
+        else :
+            try:
+                self.socket_send_queue.put(msg)
+            except Exception as e:   
+                EventMesh.debug_log("self.socket_send_queue.put:ERROR:")
+                usys.print_exception(e) 
+                # self.run_flag = False
+
+    def recv(self):
+        data = b''
+        while True:
+            try:
+                r =  b''
+                r = self.sock.recv(1024*5)
+
+                if not r:
+                    self.run_flag = False
+                    self.reconnect()
+   
+                data = data + r
+                EventMesh.debug_log("TCP recv: data:len:{}".format(len(data)))
+                # EventMesh.debug_log("TCP recv: data:{}".format(data))
+                if data[-1] != 0x5d and len(data)<20*1024: #']':
+                    continue
+                self.connect_tmp = 1 #有数据,就认为是连接状态
+                self.reconnect_time = 1000
+                EventMesh.publish(constants.EVENT.SET_CONNECT, 1)
+                data_str = data.decode('ascii')
+                data_str = data_str.split(']')
+                if len(data_str) < 3 :
+                    self.resolver.handler(data)
+                else :
+                    for i in range(len(data_str)-1):
+                        self.resolver.handler(data_str[i])
+                
+                data = b''
+            except Exception as e:
+                #EventMesh.debug_log("TCP:ERROR:recv:")
+                #usys.print_exception(e)
+                self.run_flag = False
+                self.reconnect()
+                
+                data = b''
+                utime.sleep(2)
+
+
+
+class NetManager(Abstract):
+    THRESHOLD = 10
+
+    def __init__(self):
+        self.__data_call = dataCall
+        self.__net = net
+        self.check_net = checkNet.CheckNetwork("QuecPython_Helios_Framework", "this latest version")
+        EventMesh.subscribe("get_network_state", self.get_network_state)
+        self.network_state = 0
+
+    def post_processor_after_instantiation(self, *args, **kwargs):
+        count = 0
+        while True:
+            count += 1
+            if count > 5 :
+                return
+            data = dataCall.getInfo(1, 0)
+            EventMesh.debug_log("data call INFO {}".format(data))
+            if data[2][0]:
+                self.network_state = 1
+                break
+            utime.sleep(1)
+        self.__data_call.start(2, 0, "", "", "", 0)
+        self.__data_call.setCallback(self.__datacall_cb)
+
+    def __datacall_cb(self, args):
+        pdp = args[0]
+        nw_sta = args[1]
+        if nw_sta == 1:
+            self.network_state = 1
+            EventMesh.debug_log("*** network %d connected! ***" % pdp)
+
+        else:
+            self.network_state = 0
+            EventMesh.debug_log("*** network %d not connected! ***" % pdp)
+           
+    def get_network_state(self, topic, msg):
+        return self.network_state 
+
+
+class ProtoCol(Abstract):
+    TYPE = ""
+    HEADER = "#@{}@#;"
+    SEPARATOR = ";"
+    END = ";" + chr(0x01)
+    #PID = "SZKW"
+    #PID = "qAELPTKmFanR4RHe"
+    md5_key = ''
+    PID = ''
+
+    def __init__(self):
+        self.content = None
+        self.check_sum = None
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        self.HEADER = self.HEADER.format(self.TYPE)
+
+        self.md5_key = ''
+        self.PID = ''
+        server_data = EventMesh.publish("get_new_key_pid")#获取pid和key
+        if server_data == None:
+            server_data = server_init()#如果获取的数据是None,就用默认的大锤key和pid
+            self.md5_key = server_data[2]
+            self.PID = server_data[3]
+        else:
+            self.md5_key = server_data[0]
+            self.PID = server_data[1]
+        
+        # EventMesh.debug_log("md5_key:--",self.md5_key,self.PID)
+        # ip_infor = {}
+        # ip_infor = EventMesh.publish("get_new_ip_com")
+        # if ip_infor != None:
+        #     self.md5_key = ip_infor[2]
+        # EventMesh.debug_log("md5_key",self.md5_key)
+
+    def initialization(self, *args, **kwargs):
+        EventMesh.subscribe(self.TYPE + "_SEND", self.handler)
+        EventMesh.subscribe(self.TYPE + "_RECV", self.handler)
+        #EventMesh.debug_log("ProtoCol:{}".format(self.TYPE + "_SEND"))
+
+    def handler(self, event, msg):
+        #EventMesh.debug_log("ProtoCol:handler:{}".format(event))
+        self.password = EventMesh.publish(constants.EVENT.GET_PASSWORD)
+        self.imei = EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166" #EventMesh.publish(constants.EVENT.GET_IMEI)#"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#EventMesh.publish(constants.EVENT.GET_IMEI) #"867387060319166"#"867387060319188"#"867387060319177"#"867387060319166"#"860132060004322"#"867387060319166"#"860132060004322"#EventMesh.publish(constants.EVENT.GET_IMEI)
+        self.cid = EventMesh.publish(constants.EVENT.GET_CID)
+        self.imsi = EventMesh.publish(constants.EVENT.GET_IMSI)
+        self.key = EventMesh.publish(constants.EVENT.GET_KEY)
+        if event.endswith("_SEND"):
+            self.send(event, msg)
+        else:
+            self.recv(event, msg)
+
+    def send(self, event, msg):
+        pass
+
+    def recv(self, event, msg):
+        pass
+
+    @staticmethod
+    def get_date():
+        return "{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+
+    @staticmethod
+    def get_time():
+        return "{:02d}:{:02d}:{:02d}".format(*utime.localtime()[3:6])
+
+    def calc_crc(self):
+        data = self.content
+        if not isinstance(data, bytes):
+            data = data.encode()
+        count = 0
+        for x in data:
+            count += x
+        self.check_sum = 100 - count % 100
+
+    def pack(self):
+        self.calc_crc()
+        return self.HEADER.encode() + self.content.encode() + self.SEPARATOR.encode() + int(self.check_sum).to_bytes(1,'little') + self.END.encode()
+    
+    def pack_MD5_head(self,data):                                                                                                                 
+        #key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP"
+        self.md5_key=EventMesh.publish("get_new_key")
+        if self.md5_key == None:
+            self.md5_key = server_init[2]
+
+        if(self.md5_key == ""):
+            return ""
+        MD5_head = ""
+        hash_obj = uhashlib.md5(data+self.md5_key)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        MD5_head = ubinascii.hexlify(res)
+        MD5_head = MD5_head.decode('ascii')
+        #EventMesh.debug_log("data+self.md5_key:{}".format(data+self.md5_key))
+        #EventMesh.debug_log(res)
+        #EventMesh.debug_log(MD5_head)
+        return MD5_head
+
+class LK_ProtoCol(ProtoCol):
+    """链路保持"""
+    TYPE = "LK"
+
+    def send(self, event, msg):
+        #[SZKW*334588000000156*0002*LK]
+        #EventMesh.debug_log('self.imei:%s'%(self.imei))
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0002*LK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("LK_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: LK成功
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.debug_log("LK_ProtoCol:recv:%s"%(msg))
+        EventMesh.publish(constants.PROTOCOL.PING_SEND)
+        EventMesh.publish(constants.PROTOCOL.KA_SEND)
+        EventMesh.publish(constants.PROTOCOL.TIME_SEND)
+
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.WT_SEND) #开始WT定位
+        if EventMesh.model == 'D15':
+            EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)
+
+class PING_ProtoCol(ProtoCol):
+    """获取绑定状态"""
+    TYPE = "PING"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*PING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("PING_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.debug_log("PING_ProtoCol:recv:%s"%(msg))   
+        data_tmp =  msg.decode('ascii')   
+        data_tmp = data_tmp.split(']')[0] #去掉]   
+        EventMesh.publish(constants.EVENT.SET_PING, data_tmp.split(',')[1])
+        if EventMesh.model == 'D15':
+            EventMesh.publish(constants.PROTOCOL.JPREG_SEND) 
+            EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)
+
+class KA_ProtoCol(ProtoCol):
+    """心跳"""
+    TYPE = "KA"
+    count = 0
+    roll_count = 0
+    def send(self, event, msg):
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[XT*YYYYYYYYYYYYYYY*LEN*KA,日期,步数,翻滚次数,电量百分数,车载里程数(km)] 实例:[XT*334588000000156*0014*KA,120414,50,100,100,100.12]
+        date = "{:04d}{:02d}{:02d}".format(*utime.localtime()[0:3])
+        date = date[2:]
+        #EventMesh.debug_log("date:",date)
+        #步数
+        old_step = 0
+        step = 0
+        step = EventMesh.publish("get_old_step_value")
+        if step != None:
+            if step != 0:
+                read_data = EventMesh.publish("get_storage_config","old_step_new")
+                if read_data != None:
+                    old_step = read_data
+                
+                if old_step !=  step:
+                    # EventMesh.debug_log("old_step:send:%d %d"%(old_step,step))
+                    EventMesh.publish("set_storage_config",["old_step_new",step+10])
+                    EventMesh.publish("set_storage_config",["old_step_new",step])
+
+        old_step = step
+        # step = EventMesh.publish(constants.EVENT.GET_STEP)[0]
+        # 电池电量百分比 
+        
+        bat_tmp = EventMesh.publish("screen_get_battery")
+        sleep_time = EventMesh.publish("get_storage_config","sleep_time")
+        if sleep_time != None:
+            if len(sleep_time) != 0:
+                hour = utime.localtime()[3]
+                min = utime.localtime()[4]
+                cur_time = hour*60+min
+                start_hour = int(sleep_time["start_hour"])
+                start_min = int(sleep_time["start_min"])
+                start_total = start_hour*60+start_min
+
+                end_hour = int(sleep_time["end_hour"])
+                end_min = int(sleep_time["end_min"])
+                end_total = end_hour*60+end_min
+                # EventMesh.debug_log("ka roll_:",hour,min,cur_time,start_total,end_total)
+                if cur_time >= start_total and cur_time <= end_total:
+                    self.roll_count = int(hour)
+                    if self.roll_count == 0:
+                        self.roll_count+=1
+                else:
+                    self.roll_count = 0
+            else:
+                self.roll_count = 0
+        else:
+            self.roll_count = 0
+        hour = utime.localtime()[3]
+        min = utime.localtime()[4]
+        EventMesh.txt_log("ka step:{} hour:{} min:{}".format(step,hour,min))
+        
+        battery_caption =  bat_tmp[1]
+        send_data = "KA,%s,%d,%d,%d"%(date,step,self.roll_count,battery_caption)
+        send_len = len(send_data)
+
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"KA")
+
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("KA_ProtoCol:send:%s"%(data))
+
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.debug_log("KA_ProtoCol:recv:%s"%(msg))   
+        
+class UD_ProtoCol(ProtoCol):
+    """位置信息"""
+    TYPE = "UD"
+    UD_count = 0#每6次定位获取一次天气数据
+    def send(self, event, msg):
+        #EventMesh.debug_log("UD:send:%s"%(msg))  
+        #"{:04d}-{:02d}-{:02d}".format(*utime.localtime()[0:3])
+        #[6f62cfc40fc50173f9a7b21e87be3424IS*861217001020120*00f6*UD,220726,211210,A,22.649529,N,114.119165,E,0.28,137.4,100.0,8,24,63,119,0,00000000,2,1,460,11,30472,125667122,24,30472,218944048,19,4,
+        # wifi0,34:93:44:01:28:b9,-74,wifi1,34:20:03:96:35:ad,-78,wifi2,ea:b5:7b:e8:56:54,-80,wifi3,c4:49:bb:d4:d9:78,-88]
+        
+        
+        self.UD_count+=1
+        #每6次定位获取一次天气数据
+        if self.UD_count>=6:
+            self.UD_count = 0
+            EventMesh.publish(constants.PROTOCOL.WT_SEND,msg)
+
+        send_data ="UD,"+msg
+        send_len = len(send_data)
+        #wt_data = "%s"%(send_data)
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"UD")
+        
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("{}".format(data))
+        # wt_data = EventMesh.publish("get_weather_data")
+        # # #如果没有天气数据,则获取天气数据
+        # if wt_data != None or wt_data[0] == None :
+        #     
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        if EventMesh.platform == "gewu":
+            if(msg != ""):
+                client = EventMesh.publish("get_mqtt_dev_connect_state")
+                if client != 0:
+                    mqtt_connect = -1
+                    try:
+                        mqtt_connect = client.connect()
+                    except Exception as e:
+                        print(e)
+                        mqtt_connect = -1
+                    print("mqtt_connect:{}".format(mqtt_connect))
+                    if mqtt_connect == 0:
+                        # 订阅主题
+                        get_device_id = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_deviceKey = EventMesh.publish(constants.EVENT.GET_IMEI)
+                        get_productKey = gewu_init()
+                        #$sys/{productKey}/{deviceKey}/ext/regist
+                        event_msg = "$sys/{}/{}/event/pub_reply".format(get_productKey,get_deviceKey)
+                        # client_msg = "$sys/cu1shld45y4hjr1L/866610001011658/ext/regist"
+                        subscribe_msg = event_msg.encode('ascii')
+
+                        client.subscribe(subscribe_msg,0)#订阅事件消息消息主题
+                        print("Connected to dmp-mqtt.cuiot.cn, subscribed to /public/TEST/quecpython topic")
+                        msg_tmp = msg.decode('ascii')
+                        msg_tmp = msg_tmp.split(',')
+                        longitude = float(msg_tmp[3])
+                        latitude = float(msg_tmp[5])
+                        date_tmp = utime.localtime()
+                        time_tmp = utime.mktime(date_tmp)#需要转换成毫秒级别
+                        updataTime = "{}".format(time_tmp*1000)
+                        data_info = {
+                            "messageId":"0",
+                            "params": {
+                                "key":"location",
+                                "info": [
+                                    {
+                                        "key":"longitude",
+                                        "value":longitude
+                                    },
+                                    {
+                                        "key":"latitude",
+                                        "value":latitude
+                                    },
+                                    {
+                                        "key":"UpdateTime",
+                                        "value":updataTime
+                                    }
+                            ]
+                            }
+                        }
+                        data_json = ujson.dumps(data_info) 
+                        event_pub_msg = "$sys/{}/{}/event/pub".format(get_productKey,get_deviceKey)
+                        pub_msg = event_pub_msg.encode('ascii')
+                        client.publish(pub_msg,data_json,0)#publis主题内容
+
+                        print("Publish topic: /public/TEST/quecpython758, msg: my name is Quecpython")
+
+            
+
+    def recv(self, event, msg):
+        pass
+        # EventMesh.debug_log("UD_ProtoCol:recv:%s"%(msg))  
+
+class CR_ProtoCol(ProtoCol):
+    """立即定位"""
+    TYPE = "CR"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0002*CR"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("CR_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
+        #EventMesh.debug_log("CR_ProtoCol:recv:%s"%(msg))   
+
+class AL_ProtoCol(ProtoCol):
+    """报警数据上报"""
+    TYPE = "AL"
+    timer_repetition_send = None
+    repetition_queue = None
+
+    def send(self, event, msg):
+        if EventMesh.platform != "gewu": 
+            if self.timer_repetition_send == None:
+                self.timer_repetition_send = osTimer()
+            if self.repetition_queue == None:
+                self.repetition_queue = Queue(100)
+            
+
+        send_data ="AL,"+msg
+        send_len = len(send_data)
+        #wt_data = "%s"%(send_data)
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL")
+        
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("AL_ProtoCol:send:{}".format(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        if EventMesh.platform != "gewu":
+            self.repetition_queue.put(data)#发送入队
+            self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb)
+        EventMesh.publish("set_dev_state",0)
+    def recv(self, event, msg):
+        """
+
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
+        # print("报警数据上报:recv:%s"%(msg))  
+        EventMesh.debug_log("报警数据上报:recv:{}".format(msg)) 
+        #       
+        if EventMesh.platform != "gewu": 
+            if self.repetition_queue.empty() == False:
+                self.repetition_queue.get()#出队
+            else:
+                self.timer_repetition_send.stop()
+
+    def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次
+        if self.repetition_queue.empty() == False:
+            data = self.repetition_queue.get()#出队
+            self.repetition_queue.put(data)#发送入队
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        else:
+            self.timer_repetition_send.stop()
+
+class FIND_ProtoCol(ProtoCol):
+    """查找设备"""
+    TYPE = "FIND"
+
+    def send(self, event, msg):
+        #[SZKWT*YYYYYYYYYYYYYYY*LEN*PING]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*FIND"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("FIND_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: FIND,播放铃声
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.FIND_SEND)
+        # a = audio.Audio(0)
+        # a.set_pa(Pin.GPIO29)
+        # a.setVolume(10)
+        # a.play(1, 1, 'E:/audio_find_haixiu.mp3')  #文件名前面要加上路径
+        
+        # EventMesh.publish("load_screen", {"screen": "FIND"})
+        EventMesh.publish("OPEN_FIND_WATCH")#
+        #EventMesh.debug_log("FIND_ProtoCol:recv:%s"%(msg)) 
+
+class POWEROFF_ProtoCol(ProtoCol):
+    """关机"""
+    TYPE = "POWEROFF"
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*POWEROFF]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*POWEROFF"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: POWEROFF关机
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.publish(constants.PROTOCOL.POWEROFF_SEND)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:recv:%s"%(msg))
+        battery = EventMesh.publish("screen_get_battery")
+        if battery != None:
+            if battery[0] != "1":
+                EventMesh.publish("open_power_on", 2)#  #远程关机
+         
+class PHL_ProtoCol(ProtoCol):
+    """电话本同步"""
+    TYPE = "PHL"
+
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*PHL]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*PHL"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: 电话本同步
+        @param msg: 接收到的下行数据
+        """
+        msg = msg[1:-1]
+        # EventMesh.debug_log("phonebook:msg:%s\r\n"%msg)
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp))
+
+        phonebook = {}
+        msg_tmp = msg_tmp[1:]
+    
+        j = 0
+        i = 0
+        phonebook_oldtmp = {}
+        # 0 1 2 3
+        for phonebook_tmp in msg_tmp: 
+            j+=1
+            # EventMesh.debug_log("phonebook_tmp:{} len:{}".format(phonebook_tmp,len(phonebook_tmp)))
+
+            if (j%2) == 0:
+                i+=1
+                if len(phonebook_tmp) != 0:
+                    phonebook_name = UnicodeHexStr_To_Utf8Str(phonebook_tmp)
+                    phonebook_name = "{}:{}".format("%03d"%i,phonebook_name)                                      
+                    phonebook[phonebook_name] = phonebook_oldtmp
+                
+            phonebook_oldtmp = phonebook_tmp
+                # EventMesh.debug_log("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp)))
+        # EventMesh.debug_log("phonebook!!!:{}".format(str(phonebook)))
+        with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd:
+            ujson.dump(phonebook,fd)
+            EventMesh.debug_log("创建电话簿")
+        
+        EventMesh.publish(constants.PROTOCOL.PHL_SEND)
+        EventMesh.publish("set_phonebook_list",[1,phonebook])
+        EventMesh.publish("contact_updata_list_show")
+
+         
+class WT_ProtoCol(ProtoCol):
+    """天气数据"""
+    TYPE = "WT"
+    WT_T = 0
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*WT]
+        # if self.WT_T != 0:
+        #     tmp_WT = 
+        if(msg != ""):
+            msg_tmp = "WT," + msg
+            data_len = len(msg_tmp)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*WT"%(self.imei,data_len)
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,data_len,msg_tmp)
+            data = "[%s%s]"%(str(MD5_SIGN),send_data)
+            EventMesh.debug_log("WT_ProtoCol:send:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        
+    def recv(self, event, msg):
+        """
+
+        @param event: T天气温度数据下发
+        @param msg: 接收到的下行数据
+        """
+        # b'SZKW*860132060004322*0035*WT,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split('WT,')
+        # EventMesh.debug_log("phonebook:len:{}\r\n data:{}".format(len(msg_tmp),msg_tmp))
+        msg_tmp = str(msg_tmp[1])
+
+        # EventMesh.debug_log("msg_tmp :%s"%(msg_tmp))
+
+        msg_date = msg_tmp.split(',')[0]
+
+        msg_time = msg_tmp.split(',')[1]
+        msg_weather_content = msg_tmp.split(',')[2]
+        msg_type = msg_tmp.split(',')[3]
+        msg_temp = msg_tmp.split(',')[4]
+        msg_min_temp = msg_tmp.split(',')[5]
+        msg_max_temp = msg_tmp.split(',')[6]
+        msg_city = msg_tmp.split(',')[7]
+
+        msg_city = UnicodeHexStr_To_Utf8Str(msg_city)
+        msg_weather_content = UnicodeHexStr_To_Utf8Str(msg_weather_content)
+        # EventMesh.debug_log("msg_date:{} msg_time:{} msg_weather_content:{} msg_type:{} msg_temp:{} msg_min_temp:{} msg_max_temp:{} msg_city:{}".format(msg_date,msg_time,\
+        #     msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city))
+        EventMesh.debug_log("WT_ProtoCol RECV msg:%s"%(msg))
+
+        EventMesh.publish("set_weather_data",[msg_date,msg_time,msg_weather_content,msg_type,msg_temp,msg_min_temp,msg_max_temp,msg_city,1])
+        EventMesh.publish("updata_weather_show")
+class REMIND_ProtoCol(ProtoCol):#普通闹钟
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND]
+    """
+    TYPE = "REMIND"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        
+        normal_alarm_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND,08:00-1-1,,]'",)
+        # b'[SZKW*860132060346475*001B*REMIND,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        alarm_day = []
+        alarm_switch = 0
+
+        print("count",count,msg_tmp_new)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            alarm_day = []
+            alarm_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(alarm_data) != 0:
+                b = alarm_data.find('-')
+                if b != -1:
+                    alarm_time = alarm_data.split('-')[0]#-作为分隔符
+                    alarm_switch = int(alarm_data.split('-')[1])#开关
+                    alarm_repeat = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    alarm_hour = int(alarm_time.split(":")[0])#时间
+                    alarm_min = int(alarm_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if alarm_repeat == 2:#每一天
+                        alarm_day = [0,1,2,3,4,5,6]
+                    elif alarm_repeat == 3:#自定义
+                        alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符
+                        if len(str(alarm_day_tmp)) != 0:
+                            for i in range(0,7):
+                                if alarm_day_tmp[i] != '0':
+                                    alarm_day.append(i)
+                    else:#单次 1
+                       alarm_day=[] 
+                    if alarm_switch != 0:
+                        normal_alarm_save.append({"hour":alarm_hour,"min":alarm_min,"day":alarm_day,"enable":alarm_switch})
+        
+        EventMesh.publish("set_storage_config",["normal_alarm",normal_alarm_save])
+        # normal_alarm = EventMesh.publish("get_storage_config","normal_alarm")
+
+        # EventMesh.debug_log("recv REMIND_SEND:{} normal_alarm ;{}".format(msg,normal_alarm))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_SEND)   
+        EventMesh.publish("clear_normal_alarm")
+
+
+
+
+
+
+
+class HRSTART_ProtoCol(ProtoCol):
+    """心率频率数据"""
+    TYPE = "hrtstart"
+
+
+    def send(self, event, msg):
+        # [SZKW*867387060319491*0008*hrtstart]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*hrtstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("HRSTART_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # b'SZKW*860132060004322*0035*REMIND,23-04-06,14:41:06,b6e0d4c6,1,27,-1,40,6DF157335E02'
+        # EventMesh.debug_log("REMIND_ProtoCol RECV msg:%s"%(msg))
+        # HRSTART_ProtoCol RECV msg:b'SZKW*860132060004322*000D*hrtstart,7200' msg_:7200
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("HRSTART_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp))
+        hrTotal = int(msg_tmp)
+        if hrTotal == 1:#单次测量
+            EventMesh.debug_log("HRSTART_ 2".format(hrTotal))
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            # if (get_hr_state == 3 ) or (get_spo2_state == 0 and get_hr_state == 0):#只要两个不在测量 单次优先级最低
+            if (get_spo2_state == 0 and get_hr_state == 0 and get_bg_state == 0 and get_bp_state == 0):
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_hr_state",3)#3代表单次测量
+            pass
+        else:
+            if hrTotal > 0 and hrTotal <= 300:
+                hrTotal = 300
+            elif hrTotal >= 65536:
+                hrTotal = 65536
+            EventMesh.debug_log("HRSTART_ 3".format(hrTotal))
+            on = 0
+            if hrTotal != 0:
+                on = 1
+            EventMesh.publish("set_time_hr",[on,hrTotal])
+
+
+        EventMesh.publish(constants.PROTOCOL.HRTSTART_SEND)
+
+class HEART_ProtoCol(ProtoCol):
+    """心率数据"""
+    TYPE = "heart"
+
+
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("HEART:send:{}".format(msg))
+        len_size = len(str(msg))+len("heart,")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*heart"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"heart")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.HEART_SEND)
+class OXYGEN_ProtoCol(ProtoCol):
+    """上传血氧测试数据"""
+    TYPE = "oxygen"
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("oxstart:send:{}".format(msg))
+        len_size = len(str(msg))+len("oxygen,")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*oxygen"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"oxygen")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 心率数据下发
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.OXYGEN_SEND)
+
+class OXYGEN_One_ProtoCol(ProtoCol):#单次测量
+    """上传单次测量测试数据"""
+    TYPE = "oxstart"
+
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*oxygen,x]
+# x 表示血氧饱和度
+# 示例[XT*334588000000156*0009*oxygen,15]
+# 平台回复:handler -> b'[SZKW*860132060004322*0009*oxstart,1]'
+# [XT*334588000000156*0006*oxygen]
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        EventMesh.debug_log("oxstart:")
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*oxstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("HEART_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 血氧单次测量下发
+        @param msg: 接收到的下行数据
+        """
+        EventMesh.debug_log("oxstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        oxstartTotal = int(msg_tmp)
+        # oxstartTotal = 300
+        print("oxstartTotal:{}".format(oxstartTotal))
+        if oxstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bp_state")
+            print("get_bp_state:{}".format(get_bp_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_spo2_state",3)#3代表单次测量
+        else:
+            if oxstartTotal > 0 and oxstartTotal <= 300:
+                oxstartTotal = 300
+            elif oxstartTotal >= 65536:
+                oxstartTotal = 65536
+
+            # if oxstartTotal == 0:#关闭自动测量
+            #     EventMesh.debug_log("bpSTART_ 1")
+            #     EventMesh.publish("set_spo2_time",[0,0])
+            # else:
+            on = 0
+            if oxstartTotal != 0:
+                on = 1
+            EventMesh.publish("set_spo2_time",[on,oxstartTotal])
+
+        EventMesh.publish(constants.PROTOCOL.OXSTART_SEND)
+
+class TEMP_ProtoCol(ProtoCol):
+    """上传体温测试数据"""
+    TYPE = "temp"
+    def send(self, event, msg):
+        # [SZKW*334588000000156*len*heart,x]
+        # EventMesh.debug_log("temp:send:{}".format(msg))
+        len_size = len(str(msg[0]))+len("temp,")+1+len(str(msg[1]))
+        EventMesh.debug_log("temp:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*temp,36.2]
+        # 代表终端的温度为:36.2
+        # 平台回复:
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*temp"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"temp")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d.%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        # EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+class WDSTART_ProtoCol(ProtoCol):
+    """上传体温频率"""
+    TYPE = "wdstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*wdstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("WDSTART_ProtoCol RECV msg:")
+        EventMesh.debug_log("wdstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        tempTotal = int(msg_tmp)
+        EventMesh.debug_log("tempTotal:{}".format(tempTotal))
+        if tempTotal == 1:#单次测量
+            get_temp_state = EventMesh.publish("get_temp_state")
+            EventMesh.debug_log("get_temp_state:{}".format(get_temp_state))
+            if get_temp_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_temp_state",3)#3代表单次测量
+        else:
+            if tempTotal > 0 and tempTotal <= 300:
+                tempTotal = 300
+            elif tempTotal >= 65536:
+                tempTotal = 65536
+            
+            EventMesh.publish("set_temp_time",tempTotal)
+
+            
+        
+        EventMesh.publish(constants.PROTOCOL.WDSTART_SEND)
+#解绑
+# 设置血压上传频率
+# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x]
+# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535.
+# 示例[XT*334588000000156*0008*bldstart,300]
+# 终端回复:
+# [XT*334588000000156*0005*bldstart]
+# x为1则代表终端单次上传。
+# x为0则代表终端上传关闭。
+class bldstart_ProtoCol(ProtoCol):
+    """app下发血压测试频率"""
+    TYPE = "bldstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # print("WDSTART_ProtoCol RECV msg:")
+        print("bldstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        bldstartTotal = int(msg_tmp)
+        # bldstartTotal = 300
+        print("bldstartTotal:{}".format(bldstartTotal))
+        if bldstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            print("get_bp_state:{}".format(get_bp_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_bp_state",3)#3代表单次测量
+        else:
+            if bldstartTotal > 0 and bldstartTotal <= 300:
+                bldstartTotal = 300
+            elif bldstartTotal >= 65536:
+                bldstartTotal = 65536
+
+            on = 0
+            if bldstartTotal != 0:#关闭自动测量
+                on = 1
+            print("on:{} bldstartTotal:{} ".format(on,bldstartTotal))
+            EventMesh.publish("set_bp_time",[on,bldstartTotal])
+           
+        EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND)
+
+
+# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看)
+# 上传血压数据
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y]
+# x 是收缩压(高压)
+# y 是舒张压(低压)
+# 示例[XT*334588000000156*000C*blood,150,70]
+# 平台回复:
+# [XT*334588000000156*0005*blood]
+class blood_ProtoCol(ProtoCol):
+    """上传血压测试数据"""
+    TYPE = "blood"
+    def send(self, event, msg):
+        len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1]))
+        print("blood:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*blood,36,2]
+        # 代表终端的
+        # 平台回复:
+        # [XT*334588000000156*0004*blood]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        print("blood:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # print("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+
+
+
+# 设置血糖上传频率
+# 平台发送:
+# [XT*334588000000156*len*bgstart,x]
+# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535.
+# 实例:[XT*334588000000156*len*bgstart,300]
+# 终端会每隔300秒检测一次
+
+# x为1则代表终端单次上传。
+# x为0则代表终端上传关闭。
+class bgstart_ProtoCol(ProtoCol):
+    """app下发血糖测试频率"""
+    TYPE = "bgstart"
+    def send(self, event, msg):
+        #[XT*334588000000156*len*wdstart,300]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*bgstart"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event: 体温下发频率数据
+        @param msg: 接收到的下行数据
+        """
+        # print("WDSTART_ProtoCol RECV msg:")
+        print("bgstart:{}".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+
+        bgstartTotal = int(msg_tmp)
+        print("bgstartTotal:{}".format(bgstartTotal))
+        if bgstartTotal == 1:#单次测量
+            get_bp_state = EventMesh.publish("get_bp_state")
+            get_hr_state = EventMesh.publish("get_hr_state")
+            get_spo2_state = EventMesh.publish("get_spo2_state")
+            get_bg_state = EventMesh.publish("get_bg_state")
+            print("get_bg_state:{}".format(get_bg_state))
+            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0 and get_bg_state == 0:#只要两个不在测量 单次优先级最低
+                battery = EventMesh.publish("screen_get_battery")
+                if battery != None:
+                    if battery[0] != "1":
+                        EventMesh.publish("set_bg_state",3)#3代表单次测量
+        else:
+            if bgstartTotal > 0 and bgstartTotal <= 300:
+                bgstartTotal = 300
+            elif bgstartTotal >= 65536:
+                bgstartTotal = 65536
+           
+            # if bgstartTotal == 0:#关闭自动测量
+            #     EventMesh.debug_log("bgSTART_ 1")
+            #     EventMesh.publish("set_bgauto_time",[0,0])
+            # else:
+            on = 0
+            if bgstartTotal != 0:
+                on = 1
+            EventMesh.publish("set_bgauto_time",[on,bgstartTotal])
+           
+        EventMesh.publish(constants.PROTOCOL.BGSTART_SEND)
+
+# 上传血糖数据
+# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*bloodglucose,x]
+# x 表示血糖,单位mmol/L
+# 示例[XT*334588000000156*0010*bloodglucose,6.1]
+# 平台回复:
+# [XT*334588000000156*000B*bloodglucose]
+class bloodglucose_ProtoCol(ProtoCol):
+    """上传血糖测试数据"""
+    TYPE = "bloodglucose"
+    def send(self, event, msg):
+        len_size = len("bloodglucose,")+1+len(str(msg))
+        print("bloodglucose:send:{} len:{}".format(msg,len_size))
+        #  实例:[XT*334588000000156*0009*blood,36,2]
+        # 代表终端的
+        # 平台回复:
+        # [XT*334588000000156*0004*blood]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*bloodglucose"%(self.imei,len_size)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"bloodglucose")
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg)
+        print("bloodglucose:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        
+    def recv(self, event, msg):
+        """
+        @param event: 
+        @param msg: 接收到的下行数据
+        """
+        # print("HRSTART_ProtoCol RECV msg:")
+        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
+
+# [XT*334588000000156*0003*DLT]
+def reset_factory(msg):
+    if msg == 1:
+        Power.powerRestart()
+class DLT_ProtoCol(ProtoCol):
+    """解绑数据"""
+    TYPE = "DLT"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*DLT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("temp:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:")
+        
+
+#定位频率
+class UPLOAD_ProtoCol(ProtoCol):
+    """定位频率数据"""
+    TYPE = "UPLOAD"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*UPLOAD"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*UPLOAD,600]'
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        upload_time = int(msg_tmp)
+        EventMesh.publish("set_storage_config",["upload_time",upload_time])
+
+        EventMesh.publish("set_upload_data", upload_time)
+        EventMesh.publish(constants.PROTOCOL.UPLOAD_SEND)
+
+#设置快捷号码
+class CENTER_ProtoCol(ProtoCol):
+    """设置快捷号码"""
+    TYPE = "CENTER"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*temp]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*CENTER"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("UPLOAD:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*UPLOAD,600]'
+        # EventMesh.debug_log("DLT_ProtoCol RECV msg:".format(msg))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("CENTER_ProtoCol RECV msg:{} msg_:{}".format(msg,msg_tmp))
+        center_dial = str(msg_tmp)
+        EventMesh.publish("set_storage_config",["center_dial",center_dial])
+        EventMesh.publish(constants.PROTOCOL.CENTER_SEND)  
+
+#呼叫快捷电话号码
+import voiceCall
+class MONITOR_ProtoCol(ProtoCol):
+    """呼叫快捷号码"""
+    TYPE = "MONITOR"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MONITOR"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("MONITOR:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*MONITOR]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split('MONITOR')
+        msg_tmp = msg_tmp[1]
+        EventMesh.debug_log("MONITOR_ProtoCol RECV msg:{} msg_:{}".format(msg,len(msg_tmp)))
+        if len(msg_tmp) != 0:
+            EventMesh.publish("save_phonename", contact)
+            EventMesh.publish("save_phonenum", contact)
+            EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去
+        else:
+            read_data = EventMesh.publish("get_storage_config","center_dial")
+            EventMesh.debug_log("MONITOR:data:%s"%(read_data))
+            if read_data != None: 
+                contact = read_data
+                if len(contact) > 0:
+                    EventMesh.debug_log("MONITOR RECV msg:{} {}".format(contact,type(contact)))
+                    EventMesh.publish("save_phonename", contact)
+                    EventMesh.publish("save_phonenum", contact)
+                    EventMesh.publish("dial_out_call_center_cb",contact)#电话拨出去
+        EventMesh.publish(constants.PROTOCOL.MONITOR_SEND)  
+
+#定时开关机
+class bootoff_ProtoCol(ProtoCol):
+    """定时开关机"""
+    TYPE = "BOOTOFF"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*BOOTOFF"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("BOOTOFF:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*SOS_SEND]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        on_bt = int(msg_tmp[1])
+        start_hour = int(str(msg_tmp[2]).split(":")[0])
+        start_min = int(str(msg_tmp[2]).split(":")[1])
+
+        end_hour = int(str(msg_tmp[3]).split(":")[0])
+        end_min = int(str(msg_tmp[3]).split(":")[1])
+
+        EventMesh.debug_log("BOOTOFF:send data:",on_bt,start_hour,start_min,end_hour,end_min)
+        poweroff = []
+        poweroff.append({"poweroff_on":on_bt,"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min})
+        #b'[SZKW*860132060006970*0015*BOOTOFF,1,06:00,23:59]'
+        EventMesh.publish("set_boot_off_time",poweroff)#设置关机时间
+
+        EventMesh.publish(constants.PROTOCOL.BOOTOFF_SEND)  
+
+
+#sos家庭号码
+class sosHome_dial_ProtoCol(ProtoCol):
+    """sos家庭号码"""
+    TYPE = "SOS"
+    def send(self, event, msg):
+        # [XT*334588000000156*0004*MONITOR]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0003*SOS"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        print("sosHome_dial_ProtoCol:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+
+        # b'[SZKW*867387060319166*000A*SOS_SEND]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+
+        # print("sosHome_dial_ProtoCol:send data :{} {}".format(len(msg_tmp),msg_tmp))
+        #b'[SZKW*860132060006970*0015*sosHome_dial_ProtoCol,15521469561,10086,15521469561]'
+        i = 0
+        num = 0
+        count = 0
+        print("sos msg_tmp",msg_tmp)
+        if len(msg_tmp) > 4:
+            num = 3
+        else:
+            num = len(msg_tmp)-1
+        data = []
+        for i in range(num):
+            # print("sos:send data :{}".format(msg_tmp[i+1]))
+            if len(msg_tmp[i+1]) != 0:
+                EventMesh.publish("set_storage_config",["SOS_NUMBER{}".format(i+1),msg_tmp[i+1]])
+                data.append(str(msg_tmp[i+1]))
+                count+=1
+        print("data:{}".format(data))
+        EventMesh.publish("set_dial_sos_number",data)
+             
+        EventMesh.publish(constants.PROTOCOL.SOS_SEND)  
+
+  
+# 低电提醒
+#[XT*334588000000156*0008*LOWBAT,1]
+class LOWBAT_ProtoCol(ProtoCol):
+    """低电提醒"""
+    TYPE = "LOWBAT"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*LOWBAT]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*LOWBAT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("LOWBAT:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*LOWBAT]'
+
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        on_bt = msg_tmp[1]
+        EventMesh.debug_log("LOWBAT:send data:{}".format(on_bt))
+        #b'[SZKW*860132060006970*0015*LOWBAT,1,06:00,23:59]'
+        EventMesh.publish("set_low_bat_btn",on_bt)
+        EventMesh.publish(constants.PROTOCOL.LOWBAT_SEND)  
+
+# 设置系统时间
+#
+class Time_ProtoCol(ProtoCol):
+    """设置系统时间"""
+    TYPE = "Time"
+    def send(self, event, msg):
+        # 
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0004*Time"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("Time:data:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # rtc = RTC()
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        
+        timeSecond = int(msg_data[1])
+        #EventMesh.debug_log("type {} timeSecond {}".format((msg_data[1]),timeSecond))
+        # timeSecond = 1703001360
+        next_alarm_time = utime.localtime(timeSecond)
+        #EventMesh.debug_log("next_alarm_time",next_alarm_time)
+        #EventMesh.debug_log("local time",msg)
+       # machine.RTC().datetime((tm[0], tm[1], tm[2], tm[6], tm[3], tm[4], tm[5], 0))
+
+        machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+        #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天
+        EventMesh.publish("set_rtc_alarm")
+        #EventMesh.publish(constants.PROTOCOL.TIME_SEND)  
+
+
+
+
+#免打扰
+class SILENCETIME2_ProtoCol(ProtoCol):
+    """免打扰"""
+    TYPE = "SILENCETIME2"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000C*SILENCETIME2"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("KEYBRD:data:%s"%(data))
+        # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        # EventMesh.debug_log("SILENCETIME2!!!!!!!!!!!!!",msg)
+        EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND)  
+
+#键盘开关
+class KEYBRD_ProtoCol(ProtoCol):
+    """免打扰"""
+    TYPE = "KEYBRD"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*KEYBRD"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # EventMesh.debug_log("KEYBRD:data:%s"%(data))
+        # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        # EventMesh.debug_log("KEYBRD!!!!!!!!!!!!!",msg)
+        EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND)  
+
+class TK_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "TK"
+    
+
+    def send(self, event, msg):
+        EventMesh.debug_log("TK send:")
+        if len(str(msg)) == 1:
+
+            len_size = len(str(msg))+len("TK,")
+            #  实例:[XT*334588000000156*0009*TK,1]
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TK"%(self.imei,len_size)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TK")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+            EventMesh.debug_log("TK:data:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        else:
+            # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据]
+            #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据]
+            arm_data = msg
+            # arm_sec = msg[0]
+            # EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec))
+
+            arm = bytearray()
+            for i in range(len(arm_data)):
+                if arm_data[i] == 0x7d:
+                    arm.extend(b'\x7d\x01')
+                elif arm_data[i] == 0x5b :
+                    arm.extend(b'\x7d\x02')
+                elif arm_data[i] == 0x5d :
+                    arm.extend(b'\x7d\x03')
+                elif arm_data[i] == 0x2c :
+                    arm.extend(b'\x7d\x04')
+                elif arm_data[i] == 0x2a :
+                    arm.extend(b'\x7d\x05')
+                else :
+                    arm.append(arm_data[i])
+                
+            datalen = len(arm) + len("TK,")+1
+            #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
+            send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TK,"%(self.imei,datalen))
+            send_data.extend(arm)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TK")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = bytearray('[')
+            data.extend(MD5_SIGN)
+            data.extend(send_data)
+            data.extend(']')
+            # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data))
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+
+    def recv(self, event, msg):
+        """
+
+        ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        @param event: 微聊
+        @param msg: 接收到的下行数据
+        [SZKW*860132060004322*20BD*TK,#!AMR...]
+        """
+        #Wechat_log("K_ProtoCol:recv:data:{}".format(msg))
+        
+        msg_tmp = msg.decode('ascii')
+        str = msg_tmp.split('TK,')
+        # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
+
+        read_AMR_flag = msg_tmp.find("#!AMR")
+        #EventMesh.debug_log("TK recv:read_AMR_flag:{} ,{}".format(read_AMR_flag,EventMesh.publish("get_wechat_record_flag")))
+        # if  EventMesh.publish("get_wechat_record_flag") != 1 and  read_AMR_flag != -1: #是否是服务器下发音频数据
+        if  read_AMR_flag != -1: #是否是服务器下发音频数据
+            # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg)))
+            arm_data = bytearray(str[1])#获取amr输出
+            get_wechat_data = EventMesh.publish("get_wechat_data")
+            MXA_MSG = get_wechat_data[0]
+            wechat_recode_list = get_wechat_data[1]
+            wechat_num = int(wechat_recode_list["num"])
+            # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+            
+            if wechat_num >= MXA_MSG:
+                wechat_num = 0 
+            if wechat_num == 0:
+                wechat_num += 1 
+            elif wechat_num > 0:
+                wechat_num += 1 
+
+
+            EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
+            wechat_recode_list["%02d"%(wechat_num)] = "read:1"
+            wechat_recode_list['num'] = wechat_num
+            EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+            #写语音文件数据
+
+            # path = "/usr/static/storage_file/wechat.amr"
+            path = "/usr/static/storage_file/{}.amr".format(wechat_num)
+            with open(path,"w") as fd:
+                arm = bytearray()
+                j = 0
+                for i in range(len(arm_data)):
+                    if arm_data[j] == 0x7d and arm_data[j+1] == 0x01:
+                        arm.extend(b'\x7d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02:
+                        arm.extend(b'\x5b')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03:
+                        arm.extend(b'\x5d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04:
+                        arm.extend(b'\x2c')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05:
+                        arm.extend(b'\x2a')
+                        j+=1
+                    else :
+                        arm.append(arm_data[j])
+                    j+=1
+                    if j >= len(arm_data):
+                        break
+                fd.write(arm)
+            EventMesh.publish("recv_wechat_audio")#
+            EventMesh.publish(constants.PROTOCOL.TK_SEND,1)
+            EventMesh.debug_log("constants.PROTOCOL.TK_SEND1!!!")
+        else :
+            if read_AMR_flag != -1:
+                EventMesh.publish(constants.PROTOCOL.TK_SEND,0)
+        
+class TKS_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "TKS"
+    
+
+    def send(self, event, msg):
+        EventMesh.debug_log("TKS send:")
+        if len(str(msg)) == 1:
+            len_size = len(str(msg))+len("TKS,")
+            #  实例:[XT*334588000000156*0009*TK,1]
+            send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*TKS"%(self.imei,len_size)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"TKS")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+            EventMesh.debug_log("TKS:data:%s"%(data))
+            # 通过socket发送到服务器端
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        else:
+            # [SZKW*YYYYYYYYYYYYYYY*LEN*TK,AMR 格式音频数据]
+            #[XT*YYYYYYYYYYYYYYY*LEN*TKS,秒数(十进制),AMR 格式音频数据]
+            arm_data = msg[1]
+            arm_sec = msg[0]
+            EventMesh.debug_log("TK_ProtoCol:msgtype:{} arm_sec:{}".format(len(msg[1]),arm_sec))
+
+            arm = bytearray()
+            for i in range(len(arm_data)):
+                if arm_data[i] == 0x7d:
+                    arm.extend(b'\x7d\x01')
+                elif arm_data[i] == 0x5b :
+                    arm.extend(b'\x7d\x02')
+                elif arm_data[i] == 0x5d :
+                    arm.extend(b'\x7d\x03')
+                elif arm_data[i] == 0x2c :
+                    arm.extend(b'\x7d\x04')
+                elif arm_data[i] == 0x2a :
+                    arm.extend(b'\x7d\x05')
+                else :
+                    arm.append(arm_data[i])
+                
+            datalen = len(arm) + len("TKS,")+len(str(arm_sec))+1
+            #Wechat_log("len(str(arm_sec)):{}".format(len(str(arm_sec))+1))
+            send_data = bytearray(EventMesh.publish("get_new_pid")+"*%s*%04X*TKS,%d,"%(self.imei,datalen,arm_sec))
+            send_data.extend(arm)
+            MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,datalen,"TKS")
+            MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+            data = bytearray('[')
+            data.extend(MD5_SIGN)
+            data.extend(send_data)
+            data.extend(']')
+            # EventMesh.debug_log("TK:send data:%s MD5_head_data:%s"%(data,MD5_head_data))
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+
+    def recv(self, event, msg):
+        """
+
+        ("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        @param event: 微聊
+        @param msg: 接收到的下行数据
+        [SZKW*860132060004322*20BD*TK,#!AMR...]
+        """
+        #Wechat_log("K_ProtoCol:recv:data:{}".format(msg))
+        # EventMesh.debug_log("TK recv:{}".format(msg))
+        msg_tmp = msg.decode('ascii')
+        str = msg_tmp.split('TKS,')
+        # Wechat_log("TK_ProtoCol:recv:len:{} {} {}".format(len(msg),len(str),msg_tmp.find("#!AMR")))
+        read_AMR_flag = msg_tmp.find("#!AMR")
+        # if  EventMesh.publish("get_wechat_record_flag") != 1 and  read_AMR_flag != -1: #是否是服务器下发音频数据
+        if  read_AMR_flag != -1: #是否是服务器下发音频数据
+            # Wechat_log("TK_ProtoCol:recv:datalen{}".format(len(msg)))
+            arm_data = bytearray(str[1])#获取amr输出
+            get_wechat_data = EventMesh.publish("get_wechat_data")
+            MXA_MSG = get_wechat_data[0]
+            wechat_recode_list = get_wechat_data[1]
+            wechat_num = int(wechat_recode_list["num"])
+            # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+            
+            if wechat_num >= MXA_MSG:
+                wechat_num = 0 
+            if wechat_num == 0:
+                wechat_num += 1 
+            elif wechat_num > 0:
+                wechat_num += 1 
+
+
+            EventMesh.debug_log("num_total:datalen:{} {}".format(MXA_MSG,wechat_recode_list))
+            wechat_recode_list["%02d"%(wechat_num)] = "read:1"
+            wechat_recode_list['num'] = wechat_num
+            EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+            #写语音文件数据
+
+            # path = "/usr/static/storage_file/wechat.amr"
+            path = "/usr/static/storage_file/{}.amr".format(wechat_num)
+            with open(path,"w") as fd:
+                arm = bytearray()
+                j = 0
+                for i in range(len(arm_data)):
+                    if arm_data[j] == 0x7d and arm_data[j+1] == 0x01:
+                        arm.extend(b'\x7d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x02:
+                        arm.extend(b'\x5b')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x03:
+                        arm.extend(b'\x5d')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x04:
+                        arm.extend(b'\x2c')
+                        j+=1
+                    elif arm_data[j] == 0x7d and arm_data[j+1] == 0x05:
+                        arm.extend(b'\x2a')
+                        j+=1
+                    else :
+                        arm.append(arm_data[j])
+                    j+=1
+                    if j >= len(arm_data):
+                        break
+                fd.write(arm)
+            EventMesh.publish("recv_wechat_audio")#
+            EventMesh.publish(constants.PROTOCOL.TKS_SEND,1)#返回接收成功
+        else :
+            if read_AMR_flag != -1 :
+                EventMesh.publish(constants.PROTOCOL.TKS_SEND,0)#返回接收失败
+        
+
+            
+            
+            
+            
+
+class MESSAGE_ProtoCol(ProtoCol):
+    """微聊"""
+    TYPE = "MESSAGE"
+    
+
+    def send(self, event, msg):
+        #[XT*334588000000156*0007*MESSAGE]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MESSAGE"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+
+        @param event: 微聊文字
+        @param msg: 接收到的下行数据
+        """
+        # msg = msg[1:-1]
+
+        # msg_s = msg.decode('ascii')
+        # msg_s = msg_s.split(',')
+        # msg_s = msg_s[1]
+        # # Wechat_log("msg_tmp:len:{}\r\n data:{}".format(len(msg_s),msg_s))
+        
+
+        # get_wechat_data = EventMesh.publish("get_wechat_data")
+        
+        # MXA_MSG = get_wechat_data[0]
+        # wechat_recode_list = get_wechat_data[1]
+        # wechat_num = wechat_recode_list["num"]
+        # # Wechat_log("TK_ProtoCol:datalen:{} {} {}".format(wechat_num,MXA_MSG,wechat_recode_list))
+        
+        # if wechat_num >= MXA_MSG:
+        #     wechat_num = 0 
+        # if wechat_num == 0:
+        #     wechat_num += 1 
+        # elif wechat_num > 0:
+        #     wechat_num += 1 
+        # msg_txt = {}
+        # # 0 1 2 3
+        # Wechat_log("wechat_num:init {}".format(wechat_num))
+        # msg_txt = UnicodeHexStr_To_Utf8Str(msg_s)
+        # # Wechat_log("msg_txt:{}".format(msg_txt))
+        # wechat_recode_list["%02d"%(wechat_num)] = "T:{}".format(msg_txt)
+        # wechat_recode_list['num'] = wechat_num
+        # EventMesh.publish("set_wechat_data",[MXA_MSG,wechat_recode_list])
+        # # Wechat_log("wechat_recode_list:len data:{}".format(wechat_recode_list))
+        
+        # screen_NAME = EventMesh.publish("get_screen_NAME")
+        # get_lcd_state = EventMesh.publish("get_lcd_state")
+        # if screen_NAME != "wechat" or get_lcd_state == 0:
+        #     EventMesh.publish("load_screen", {"screen": "wechat_popup"})
+        # else:
+        #     EventMesh.publish("wechat_updata_list_show")
+        EventMesh.publish(constants.PROTOCOL.MESSAGE_SEND)
+        # EventMesh.publish("recv_wechat_audio")#
+
+class FALLDOWN_ProtoCol(ProtoCol):
+    """
+    跌倒提醒开关
+    服务器下发跌倒报警设置命令
+    [XT*334588000000156*LEN*FALLDOWN,ONOFF]
+    ONOFF: 1:开启,0:关闭。
+    终端回复
+    [XT*334588000000156*LEN*FALLDOWN]
+    """
+    TYPE = "FALLDOWN"
+    
+    def send(self, event, msg):
+       
+        #[XT*334588000000156*LEN*FALLDOWN]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+        [SZKW*860132060341484*000A*FALLDOWN,1]
+        """
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        
+        Falldowm = msg_data[1]
+        EventMesh.debug_log("FALLDOWN:{}".format(Falldowm))
+        EventMesh.publish("set_storage_config",["fall_sw",Falldowm])
+
+        EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND)
+
+class REMOVE_ProtoCol(ProtoCol):
+    """
+    取下手环报警开关
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1]
+    实例:[XT*334588000000156*0008*REMOVE,1]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE]
+    """
+    TYPE = "REMOVE"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        Falldowm = msg_data[1]
+        EventMesh.debug_log("REMOVE:{}".format(Falldowm))
+        EventMesh.publish("set_storage_config",["remove_sw",Falldowm])
+        EventMesh.publish(constants.PROTOCOL.REMOVE_SEND)   
+
+class HELP_ProtoCol(ProtoCol):
+    """
+一键报警
+    [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态]
+    状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警),
+    63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警,
+    124烟感报警,125水浸报警
+    实例:
+    [XT*334588000000156*0004*HELP,60]
+    """
+    TYPE = "HELP"
+    
+    def send(self, event, msg):
+        #[XT*334588000000156*LEN*FALLDOWN]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        """
+        [XT*334588000000156*0004*HELP,60]
+        """
+
+        pass   
+
+
+#喝水闹钟提示
+# 喝水闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_DRINK,4,0]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK]
+# 实例:[XT*334588000000156*000E*REMIND_CH_DRINK]
+class REMIND_CHDRINK_ProtoCol(ProtoCol):
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+    实例:[XT*334588000000156*0008*REMIND_CH_DRINK,时间间隔(小时),开关(0为关,1为开)]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_DRINK]
+    """
+    TYPE = "REMIND_CH_DRINK"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000F*REMIND_CH_DRINK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_DRINK,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        data = str(msg_data[1])
+        hour = int(data.split('-')[0])
+        btn_on = int(data.split('-')[1])
+
+        EventMesh.debug_log("recv REMIND_CH_DRINK:{}-{}-{}".format(hour,btn_on,msg))
+        EventMesh.publish("set_storage_config",["drink_on",btn_on])
+        EventMesh.publish("set_storage_config",["drink_time",hour])
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_DRINK_SEND)  
+
+# 自定义服药闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,时间1-开关,时间2-开关,周几]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_MEDICINE2,08:10-0,09:10-0,1000001]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2]
+# 实例:[XT*334588000000156*000E*REMIND_CH_MEDICINE2]
+# 说明:闹铃格式为:时间-开关(0/1),周几(周六到周日)
+
+#REMIND_CH_MEDICINE2,09:00-1,14:00-0,18:00-0,1111111]'",)
+class REMIND_CHMEDICINE2_ProtoCol(ProtoCol):#吃药提醒
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_MEDICINE2,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_MEDICINE2]
+    """
+    TYPE = "REMIND_CH_MEDICINE2"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0013*REMIND_CH_MEDICINE2"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+
+        msg_data = str(msg_tmp.split('REMIND_CH_MEDICINE2,')[1])
+        msg_data_tmp = str(msg_tmp.split('REMIND_CH_MEDICINE2')[1])
+
+        medicin_data = []
+        alarmday=[]
+        count = 0
+        for i in str(msg_data_tmp):
+            # print("i",i)
+            if i == ",":
+                count+=1
+
+        if count >= 3:
+            count = 3
+        medicine_alarmday = []
+        for i in range(0,count):#默认是三个时间多了也不保存
+            medicine_alarmday = str(msg_data.split(",")[count])
+            # print("i",i)
+            medicine_alarm = str(msg_data.split(",")[i])
+            if str(medicine_alarm).find("-") != -1:
+                on = int(medicine_alarm.split('-')[1])
+                if on != 0:
+                    alarmday = []
+                    data = str(medicine_alarm.split('-')[0])
+                    hour = int(data.split(":")[0])
+                    min = int(data.split(":")[1])
+                    for i in range(0,7):
+                        # print("medicine_alarmday",medicine_alarmday,medicine_alarmday[i])
+                        if medicine_alarmday[i] != '0':
+                            alarmday.append(i)
+                    enable = 1
+                    medicin_data.append({"hour":hour,"min":min,"day":alarmday,"enable":enable})
+        
+        EventMesh.publish("set_storage_config",["medicine",medicin_data])
+        EventMesh.debug_log("recv REMIND_CH_MEDICINE2:{} medicin_data ;{}".format(msg,medicin_data))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_MEDICINE2_SEND) 
+        EventMesh.publish("clear_medicine_alarm")
+
+# 回家闹钟设置指令
+# 可设置闹钟的提醒文字
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,闹钟1,闹钟2,闹钟3]
+# 实例:
+# [XT*334588000000156*0018*REMIND_CH_HOME,08:10,12:10]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME]
+# 实例:[XT*334588000000156*0006*REMIND_CH_HOME]
+# 说明:闹钟为时间点;
+class REMIND_CH_HOME_ProtoCol(ProtoCol):#回家提醒
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_HOME,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_HOME]
+    """
+    TYPE = "REMIND_CH_HOME"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_HOME"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+
+        # [SZKW*860132060346475*0014*REMIND_CH_HOME,00:00',)
+        home_data = str(msg_data[1])
+  
+        EventMesh.debug_log("recv REMIND_CH_HOME:{} medicin_data ;{}".format(msg,home_data))
+        if len(home_data) != 0:
+            EventMesh.publish("set_storage_config",["home_alarm",home_data])
+        EventMesh.publish("clear_home_alarm")
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_HOME_SEND)   
+# 起床闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,闹钟1,闹钟2]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_WAKEUP,08:10-0-3-1000001,09:10-0-3-1000001]
+# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义)
+# 08:10-1-1:闹钟时间8:10,打开,响铃一次
+# 08:10-1-2:闹钟时间8:10,打开,每天响铃
+# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开
+# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP]
+# 实例:[XT*334588000000156*000E*REMIND_CH_WAKEUP]
+# 说明:闹铃格式为:时间-开关-周几(周六到周日)
+class REMIND_CH_WAKEUP_ProtoCol(ProtoCol):#该起床了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_WAKEUP,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_WAKEUP]
+    """
+    TYPE = "REMIND_CH_WAKEUP"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_WAKEUP"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND_CH_WAKEUP,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND_CH_WAKEUP')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        wakeup_data_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_WAKEUP,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        wakeup_day = []
+        wakeup_switch = 0
+
+        print("count",count)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            wakeup_day = []
+            wakeup_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,wakeup_data)
+            if len(wakeup_data) != 0:
+                b = wakeup_data.find('-')
+                if b != -1:
+                    wakeup_time = wakeup_data.split('-')[0]#-作为分隔符
+                    wakeup_switch = int(wakeup_data.split('-')[1])#开关
+                    wakeup_repeat = int(wakeup_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    wakeup_hour = int(wakeup_time.split(":")[0])#时间
+                    wakeup_min = int(wakeup_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if wakeup_repeat == 2:#每一天
+                        wakeup_day = [0,1,2,3,4,5,6]
+                    elif wakeup_repeat == 3:#自定义
+                        wakeup_day_tmp = wakeup_data.split('-')[3]#-作为分隔符
+                        for i in range(0,7):
+                            if wakeup_day_tmp[i] != '0':
+                                wakeup_day.append(i)
+                    else:#单次 1
+                       wakeup_day=[] 
+                    if wakeup_switch != 0:
+                        wakeup_data_save.append({"hour":wakeup_hour,"min":wakeup_min,"day":wakeup_day,"enable":wakeup_switch})
+        
+        EventMesh.publish("set_storage_config",["wakeup_alarm",wakeup_data_save])
+        wakeup = EventMesh.publish("get_storage_config","wakeup_alarm")
+
+        EventMesh.debug_log("recv REMIND_CH_WAKEUP:{} wakeup ;{}".format(msg,wakeup))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_WAKEUP_SEND)  
+       
+        EventMesh.publish("clear_wakeup_alarm") 
+
+
+
+# 睡觉闹钟设置指令
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,闹钟1,闹钟2]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_SLEEP,08:10-0-3-1000001,09:10-0-3-1000001]
+# 闹钟格式为:时间-开关-频率(1:一次;2:每天;3:自定义)
+# 08:10-1-1:闹钟时间8:10,打开,响铃一次
+# 08:10-1-2:闹钟时间8:10,打开,每天响铃
+# 08:10-1-3-0111110:闹钟时间8:10,打开,自定义周一至周五打开
+# 最左边是周日,最右边是周六,即0111110的顺序是:周日,周一,周二,周三,周四,周五,周六(1为打开,0为关闭),其中周一至周五打开闹钟
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP]
+# 实例:[XT*334588000000156*000E*REMIND_CH_SLEEP]
+# 说明:闹铃格式为:时间-开关-周几(周六到周日)
+class REMIND_CH_SLEEP_ProtoCol(ProtoCol):#该睡觉了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_SLEEP,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SLEEP]
+    """
+    TYPE = "REMIND_CH_SLEEP"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0011*REMIND_CH_SLEEP"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_MEDICINE2,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_new = str(msg_tmp.split('REMIND_CH_SLEEP,')[1])
+        msg_tmp_data = str(msg_tmp.split('REMIND_CH_SLEEP')[1])
+        count = 0
+        for i in str(msg_tmp_data):
+            # print("i",i)
+            if i == ",":
+                count+=1
+
+        sleep_data_save = []
+        # # ("handler -> b'[SZKW*860132060346475*001C*REMIND_CH_SLEEP,08:00-1-1,,]'",)
+        # b'[SZKW*860132060346475*001B*REMIND_CH_SLEEP,08:00-1-1,,]'",)
+        # medicine_alarmday = str(msg_data[4])
+        # alarmday=[]
+        sleep_day = []
+        sleep_switch = 0
+
+        print("count",count)
+        if count >= 3:
+            count = 3
+        for i in range(0,count):#默认是三个时间多了也不保存
+            sleep_day = []
+            sleep_data = str(msg_tmp_new.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(sleep_data) != 0:
+                b = sleep_data.find('-')
+                if b != -1:
+                    sleep_time = sleep_data.split('-')[0]#-作为分隔符
+                    sleep_switch = int(sleep_data.split('-')[1])#开关
+                    sleep_repeat = int(sleep_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    sleep_hour = int(sleep_time.split(":")[0])#时间
+                    sleep_min = int(sleep_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    
+                    if sleep_repeat == 2:#每一天
+                        sleep_day = [0,1,2,3,4,5,6]
+                    elif sleep_repeat == 3:#自定义
+                        sleep_day_tmp = sleep_data.split('-')[3]#-作为分隔符
+                        for i in range(0,7):
+                            if sleep_day_tmp[i] != '0':
+                                sleep_day.append(i)
+                    else:#单次 1
+                       sleep_day=[] 
+                    if sleep_switch != 0:
+                        sleep_data_save.append({"hour":sleep_hour,"min":sleep_min,"day":sleep_day,"enable":sleep_switch})
+        
+        EventMesh.publish("set_storage_config",["sleep_alarm",sleep_data_save])
+        # sleep = EventMesh.publish("get_storage_config","sleep_alarm")
+
+        # EventMesh.debug_log("recv REMIND_CH_SLEEP_SEND:{} sleep ;{}".format(msg,sleep))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_SLEEP_SEND)   
+        EventMesh.publish("clear_sleep_alarm")
+
+
+# 可设置闹钟的提醒文字
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,时间间隔1,时间间隔2,时间间隔3]
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_REST,08:10-10:00,12:10-15:00]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST]
+# 实例:[XT*334588000000156*000E*REMIND_CH_REST]
+# 说明:时间间隔 【起始-结束】,起始为开始休息,结束为休息结束
+
+class REMIND_CH_REST_ProtoCol(ProtoCol):#该休息了
+    """
+    
+    平台发送:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST,,时间1-开关,时间2-开关,周几]
+    实例:[XT*334588000000156*0008*REMIND_CH_REST,,时间1-开关,时间2-开关,周几]
+    终端回复:
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_REST]
+    """
+    TYPE = "REMIND_CH_REST"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000E*REMIND_CH_REST"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # SZKW*860132060346475*0013*REMIND_CH_REST,4-1
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = str(msg_tmp.split('REMIND_CH_REST,')[1])
+        msg_data_new = str(msg_tmp.split('REMIND_CH_REST')[1])
+        print("REMIND_CH_REST",len(msg_data),msg_data)
+
+        reset_data_save = []
+        count = 0
+        for i in str(msg_data_new):
+            # print("i",i)
+            if i == ",":
+                count+=1
+        
+        if count >= 2:
+            count = 2
+
+        for i in range(0,count):#默认是三个时间多了也不保存
+            reset_data = str(msg_data.split(',')[i])
+            print("i",i,reset_data)
+            if len(reset_data) != 0:
+                b = reset_data.find('-')
+                if b != -1:
+                    start_time = reset_data.split('-')[0]#-作为分隔符
+                    end_time = reset_data.split('-')[1]#-作为分隔符
+                    
+                    start_hour = int(start_time.split(":")[0])
+                    start_min = int(start_time.split(":")[1])
+
+                    end_hour = int(end_time.split(":")[0])
+                    end_min = int(end_time.split(":")[1])
+                    
+                    reset_data_save.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min})
+        
+        EventMesh.publish("set_storage_config",["reset_alarm",reset_data_save])
+        # reset = EventMesh.publish("get_storage_config","reset_alarm")
+
+        # EventMesh.debug_log("recv REMIND_CH_REST:{} reset ;{}".format(msg,reset))
+       
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_REST_SEND)   
+        EventMesh.publish("clear_reset_alarm")
+
+
+
+class WLKEY_ProtoCol(ProtoCol):#白名单开关
+    """
+    白名单开关
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF]  ONOFF: 1:开启,0:关闭,2:30秒后自动接听。
+    实例:[XT*334588000000156*0008*WLKEY,1]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*WLKEY]
+    """
+    TYPE = "WLKEY"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*00006*WLKEY"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = msg_tmp.split(',')
+        EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+        
+
+        EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) 
+# 终端发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*SLEEP_DATA,清醒时间(分钟),浅睡时间(分钟),深睡时间(分钟),日期(年月日)]
+# 实例: [XT*334588000000156*0004*SLEEP_DATA,120,240,360,20221008]
+# 实例表示:上传睡眠数据
+#[XT*334588000000156*0010*SleepReport,2022-02-09,80,2,532,164,164,25,25,25,25,21:45-0-164-155-3,22:00-1-162-155-0,22:15-2-162-155-0]
+class SLEEP_DATA_ProtoCol(ProtoCol):#睡眠时间
+    """
+    白名单开关
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF]  ONOFF: 1:开启,0:关闭,2:30秒后自动接听。
+    实例:[XT*334588000000156*0008*WLKEY,1]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*WLKEY]
+    """
+    TYPE = "SleepReport"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0000b*SleepReport"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%s]"%(str(MD5_SIGN),send_data,msg)
+        EventMesh.debug_log("SLEEP_DATA:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("SLEEP_DATA!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+        
+
+        # EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) 
+
+class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间
+    """
+    """
+    TYPE = "SLEEPTIME"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("SLEEPTIME:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+        # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30]
+        EventMesh.debug_log("SLEEPTIME!!!!!!!!!")
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_data = str(msg_tmp.split(',')[1])
+        data = {}
+        if len(msg_data) == 0:
+            EventMesh.publish("set_storage_config",["sleep_time",data])
+            pass
+        else:
+            sleep_start = msg_data.split("-")[0]
+            sleep_end = msg_data.split("-")[1]
+            start_hour = int(sleep_start.split(":")[0])
+            start_min = int(sleep_start.split(":")[1])
+
+            end_hour = int(sleep_end.split(":")[0])
+            end_min = int(sleep_end.split(":")[1])
+
+            data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}
+            # EventMesh.debug_log("SLEEPTIME".format(data))
+            EventMesh.publish("set_storage_config",["sleep_time",data])
+            # sleep_time = EventMesh.publish("get_storage_config","sleep_time")
+            # EventMesh.debug_log("sleep_time:{}".format(sleep_time))
+
+        EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) 
+
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
+# 实例:[XT*334588000000156*0007*FACTORY]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
+# 实例:[XT*334588000000156*0007*FACTORY]
+# 说明:终端恢复出厂设置,里面设置的号码都将清空
+class FACTORY_ProtoCol(ProtoCol):#睡眠时间
+    """
+    实例:[XT*334588000000156*0008*FACTORY]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
+    实例:[XT*334588000000156*0006*FACTORY]
+    """
+    TYPE = "FACTORY"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("FACTORY:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("FACTORY!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) 
+        EventMesh.publish("app_factory",None)#app恢复出厂
+
+# 平台发送:
+# [3G*YYYYYYYYYY*LEN*RESET]
+# 实例:[3g*5678901234*0005*RESET]
+# 终端回复:
+# [3G*YYYYYYYYYY*LEN*RESET]
+class RESET_ProtoCol(ProtoCol):#重启
+    """
+    实例:[XT*334588000000156*0008*RESET]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*RESET]
+    实例:[XT*334588000000156*0006*RESET]
+    """
+    TYPE = "RESET"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RESET"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("RESET:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("RESET!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.RESET_SEND) 
+        Power.powerRestart()
+
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT,时间间隔(分钟),总开关(0为关,1为开),午间休息时段,晚间休息时段]
+# 午间/晚间休息时段格式为:开始时间(hh:mm)-结束时间(hh:mm)-开关(0为关,1为开),例如 12:00-15:00-1。
+# 久坐默认值为20分钟。
+# 午间和晚间默认值,午间12:00-14:00,晚上20:00-07:00。
+# 实例:
+# [XT*334588000000156*0026*REMIND_CH_SIT,20,0,12:00-15:00-1,20:00-07:00-1]
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT]
+# 实例:[XT*334588000000156*000E*REMIND_CH_SIT]
+class REMIND_CH_SIT_ProtoCol(ProtoCol):#久坐提醒
+    """
+    实例:[XT*334588000000156*0008*REMIND_CH_SIT]
+    终端回复
+    [XT*YYYYYYYYYYYYYYY*LEN*REMIND_CH_SIT]
+    实例:[XT*334588000000156*0006*REMIND_CH_SIT]
+    """
+    TYPE = "REMIND_CH_SIT"
+    
+    def send(self, event, msg):
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000d*REMIND_CH_SIT"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        EventMesh.debug_log("REMIND_CH_SIT:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+
+    def recv(self, event, msg):
+
+        EventMesh.debug_log("REMIND_CH_SIT!!!!!!!!!")
+        # msg = msg[1:-1]
+        # msg_tmp = msg.decode('ascii')
+        # msg_data = msg_tmp.split(',')
+        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
+        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
+
+        EventMesh.publish(constants.PROTOCOL.REMIND_CH_SIT_SEND) 
+        
+# 平台发送:
+# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容]
+# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000]
+# 参数内容用 unicode 编码呈现,设备收到后需解码。
+# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三"
+# 终端回复:
+# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW]
+# 实例:[XT*334588000000156*000B*SCREEN_SHOW]
+
+class SCREEN_SHOWProtoCol(ProtoCol):
+    """开屏显示"""
+    TYPE = "SCREEN_SHOW"
+    def send(self, event, msg):
+        # [XT*334588000000156*0006*SILENCETIME2]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("KEYBRD:data:%s"%(data))
+        # print("KEYBRD!!!!!!!!!!!!!",msg)
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+        msg_tmp = msg_tmp[1:]
+        msg_tmp = msg_tmp[0]
+        print("screen_school_data msg",msg)
+
+        j = 0
+        i = 0
+        videobook_old = {}
+        videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp)
+        lst = videobook_name_tmp.split(",")
+        print("lst data",lst)
+
+         # 0 1 2 3
+        screen_school_data = ""#学校
+        screen_class_data = ""#班级
+        screen_fullname_data = ""#姓名
+        if len(lst) != 0: 
+            count = len(lst)
+            if count > 3:
+                count = 3
+            for i in range(count):
+                if i == 0:
+                    screen_school_data = lst[0]
+                    EventMesh.publish("set_schoolname", screen_school_data)#
+                elif i == 1:
+                    screen_class_data = lst[1]
+                    EventMesh.publish("set_classname", screen_class_data)#
+                else:
+                    screen_fullname_data= lst[2]
+                    EventMesh.publish("set_fullname", screen_fullname_data)#
+                
+                # EventMesh.publish("update_screen_show")#更新开屏显示
+
+        print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data)
+
+        EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND)  
+
+# #小见平台视频通话
+# # [XT*YYYYYYYYYYYYYYY*LEN*JPREG]
+# # 实例:
+# # [XT*334588000000156*0004*JPREG]
+# # 平台回复:
+# # [XT*设备ID*LEN*JPREG,账号(整型)]
+# # 实例:[XT*334588000000156*0010*JPREG,1087654321]
+class JPREG_ProtoCol(ProtoCol):#登入注册
+    """"""
+    TYPE = "JPREG"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        # print("WLKEY:data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*KEYBRD]'
+        print("JPREG!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid"))
+        # EventMesh.publish(constants.PROTOCOL.JPREG_SEND)  
+
+# # (声网,佰锐的账号是整型)
+# # [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS]
+# # 实例:[XT*334588000000156*0007*MEMBERS]
+# # 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....]
+# # 实例:
+# # [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555]
+# # 以上数据部分使用Unicode编码,最终上面示例传到服务端将是:
+
+class MEMBERS_ProtoCol(ProtoCol):#获取账号列表
+    """"""
+    TYPE = "MEMBERS"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*MEMBERS"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        print("MEMBERS SEND:data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*876226002021444*0048*MEMBERS,0036003900350031003800330032002C563F563FD83CDF410020D83CDF42002C]'
+        print("MEMBERS!!!!!!!!!!!!!",msg,EventMesh.publish("get_new_pid"))
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp = msg_tmp.split(',')
+
+        videobook = {}
+        msg_tmp = msg_tmp[1:]
+        msg_tmp = msg_tmp[0]
+
+        j = 0
+        i = 0
+        videobook_old = {}
+        videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp)
+        lst = videobook_name_tmp.split(",")
+        
+        print("msg_tmp:{} phonebook_oldtmp:{} type:{}".format(msg_tmp,videobook_name_tmp,lst))
+        # 0 1 2 3
+        for vediobook_tmp in lst: 
+            
+            if (j % 3) == 0:#账号
+                videobook_old = vediobook_tmp
+            elif (j % 3) == 1:#名称
+                i+=1
+                videobook_name_cont= "{}:{}".format("%03d"%(i),videobook_old)                                      
+                videobook[videobook_name_cont] = vediobook_tmp
+            j+=1
+        print("videobook!!!:{}".format(str(videobook)))
+        # print("phonebook!!!:{}".format(str(phonebook)))
+        with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd:
+            ujson.dump(videobook,fd)
+            print("创建视频通话账号")
+        
+        EventMesh.publish("set_videobook_list",[1,videobook])
+        # EventMesh.publish("video_updata_list_show")
+        # EventMesh.publish(constants.PROTOCOL.MEMBERS_SEND)  
+
+# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token]
+
+# # 设备回复
+# # [X*Y*LEN*CALLING,音视频状态]
+# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1
+class CALLING_ProtoCol(ProtoCol):#app发起视频通话
+    """"""
+    TYPE = "CALLING"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
+        # print("CALLING:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*CALLING]'
+        print("CALLING!!!!!!!!!!!!!",msg)
+        if EventMesh.model == "D10":#D10没有视频通话
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
+            return
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        call_id = msg_tmp_d[1]#id
+        meet_id = msg_tmp_d[2]#会议id
+        call_type = int(msg_tmp_d[3])#会议id# 0音频 1视频
+        tokens_data = msg_tmp_d[4]#tokens
+        EventMesh.publish("set_vedio_call_id", call_id)#
+        EventMesh.publish("set_vedio_meet_id", meet_id)#
+        EventMesh.publish("set_vedio_call_type", call_type)#
+        EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+
+        flag = EventMesh.publish("get_call_state") 
+        fall_down = EventMesh.publish("get_fall_down_state")#跌倒报警标识
+        usb_state = EventMesh.publish("get_usb")#
+        video_state = EventMesh.publish("get_video_state")
+        sos_dialing = EventMesh.publish("get_sos_state_out")#正在拨打sos电话
+        if flag != 0 or fall_down != 0 or video_state != 0 or sos_dialing != 0: #电话在打入或者 在充电不允许视频通话
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
+        else:
+            EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0)
+            EventMesh.publish("set_video_state", 6)
+            EventMesh.publish("set_dev_app_mode", 2)#
+            EventMesh.publish("close_hr_sop2")#
+            EventMesh.publish("video_call_in_event",call_type)
+
+# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)]
+# # 实例:
+# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0]
+# # 终端回复:
+# # [XT*设备ID*LEN*RCALLING]
+# # 实例:[XT*334588000000156*0009*RCALLING]  
+# #   
+class RCALLING_ProtoCol(ProtoCol):#设备拒接接听
+    """"""
+    TYPE = "RCALLING"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%s,%s,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1],msg[2])
+        # print("RCALLING:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+        # print("RCALLING:send data end:%s"%(data))
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*RCALLING]'
+        print("RCALLING!!!!!!!!!!!!!")
+
+class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话
+    """"""
+    TYPE = "AGTALK"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*AGTALK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        print("AGTALK:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]'
+        # print("AGTALK!!!!!!!!!!!!!")
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        call_state = int(msg_tmp_d[1])#返回是否可以视频通话
+        if call_state == 0:#可正常通话
+            if EventMesh.publish("get_video_state") != 0: 
+                # print("AGTALK!!!!!!!!!!!!!answer")
+                tokens_data = msg_tmp_d[2]#会议id
+                meet_id = msg_tmp_d[3]#会议id
+                EventMesh.publish("set_vedio_meet_id", meet_id)#
+                EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+                EventMesh.publish("open_vedio_infor")
+
+        else:
+            #不能视频通话
+            tokens_data = msg_tmp_d[2]#token数据
+            meet_id = msg_tmp_d[3]#会议id
+            EventMesh.publish("set_vedio_meet_id", meet_id)#
+            EventMesh.publish("set_vedio_tokens_data", tokens_data)#
+            EventMesh.publish("video_newwork_reject_cb",None)#挂断视频通话
+            # print("AGTALK no!!!!!!!!!!!!!")
+
+        print("AGTALK!!!!!!!!!!!!!")
+
+
+class RTALK_ProtoCol(ProtoCol):#app拒接视频通话
+    """"""
+    TYPE = "RTALK"
+    def send(self, event, msg):
+        
+        # [XT*334588000000156*0005*WLKEY]
+        send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei)
+        MD5_SIGN = self.pack_MD5_head(send_data)
+        data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
+        # print("AGTALK:send data:%s"%(data))
+        # print("WLKEY!!!!!!!!!!!!!")
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
+
+    def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
+        # b'[SZKW*867387060319166*000A*RTALK]'
+        print("RTALK!!!!!!!!!!!!!")  
+        # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]'
+        msg = msg[1:-1]
+        msg_tmp = msg.decode('ascii')
+        msg_tmp_d = msg_tmp.split(',')
+        EventMesh.publish("app_rtalk_cb",1)
+
+        
+
+
+class ProtoColResolver(object):
+    def __init__(self):
+        self.protocol_list = []
+
+    def add_support(self, prot):
+        self.protocol_list.append(prot)
+        prot.initialization()
+
+    def handler(self, data):
+        # 这里接收数据
+        
+        EventMesh.debug_log("handler -> {}".format(data))
+        # if data.startswith('Init;'):
+        #     data = data[5:]
+        #     EventMesh.publish(constants.EVENT.SET_KEY, {"value": ujson.loads(data)['KEY']})
+            
+        # elif data.startswith("Update;"):
+        #     data = data[7:]
+        #     EventMesh.publish(constants.PROTOCOL.H04_RECV, data)
+        try:
+            if len(data) > 0: 
+                #EventMesh.debug_log("handler:{}".format(len(data)))
+                data_tmp = data.decode('ascii')
+                data_tmp = data_tmp.split(']')[0] #去掉]
+                ProtoCol_type = data_tmp.split('*')[3] #拿到协议标识
+                ProtoCol_type = ProtoCol_type.split(',')[0]
+                ProtoCol_type = "%s_RECV"%(ProtoCol_type)
+                # EventMesh.debug_log("ProtoColResolver:ProtoCol_type:%s\r\ndata:%s"%(ProtoCol_type,data))
+                EventMesh.publish(ProtoCol_type, data) #返回协议read
+        except Exception as e:
+            EventMesh.debug_log("handler:ERROR:")
+            usys.print_exception(e)
+            EventMesh.debug_log("handler:error data:{}".format(len(data)))
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/sleep_test.py
new file mode 100644 (file)
index 0000000..8d7caf4
--- /dev/null
@@ -0,0 +1,205 @@
+
+import utime
+import audio
+from machine import Pin
+import osTimer
+import _thread
+from queue import Queue
+import uwebsocket
+import usys
+import EventMesh
+import constants
+import ujson
+
+
+import gc
+AI_audio_queue = Queue(100)
+aud = audio.Audio(0)
+aud.set_pa(Pin.GPIO29)
+aud.setVolume(11)
+AI_TTS_str = ""
+AI_client_tts = None
+_4S_timer = None
+def AI_client_tts_recv(cli,fd):
+
+    while True:
+        try:
+            # 死循环接收数据
+            
+            recv_data = cli.recv()
+            if not recv_data:
+                # 服务器关闭连接或客户端关闭连接
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                print("AI_client_tts_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+                break
+            try:
+                # print("AI_client_tts_recv :{}".format(len(recv_data)))
+                #结束标志{"header":{"event":"EndSynthesis","msg":"success","status":20000000,"task_id":"ffd727e620000803280c5a6498d0e321"}}
+                if isinstance(recv_data, str):
+                    print("AI_client_tts_recv:str recv_data:{}".format(recv_data))
+                    if recv_data.find('\"state\":\"Listening\"') != -1:
+                        AI_client_VC_RequestToRespond()
+                    if recv_data.find('\"event\":\"RespondingEnded\"') != -1:
+                    
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!\r\n")
+                        print("EndSynthesis!!!!!!!!!!!!!!!!!!\r\n")
+                        cli.close()
+                        fd.close()
+                        _4S_timer.stop()
+                        break
+                else:
+                    fd.write(recv_data)
+                    AI_audio_queue.put([recv_data,""])
+                #utime.sleep_ms(1000)
+            except Exception as e:
+                usys.print_exception(e)
+                
+        except Exception as e:
+                usys.print_exception(e)
+                break
+def _4S_timer_cb(self,*argc):
+    print("_4S_timer_cb!!!!!!!!!!!!!!!!!!!!!")
+    global AI_TTS_str,AI_client_tts,_4S_timer
+    try:
+        AI_client_VC_ping()
+    except Exception as e:
+        usys.print_exception(e)
+        _4S_timer.stop()
+def websocket_connect_tts(fd_neme,tts_str):
+    global AI_TTS_str,AI_client_tts,_4S_timer
+    _4S_timer = osTimer()
+    _4S_timer.start(4000,1,_4S_timer_cb)
+    
+    print("websocket_connect_tts {},{}!!!!!!!!!".format(fd_neme,tts_str))
+    fd=open(fd_neme,'w')
+    req_str = ""
+    AI_TTS_str = tts_str
+    lang = "&lang=zh-cn"#普通话测试环境
+      
+    platform = "&platform=huoshan&is_bot=1"
+
+    req_str = "is_auth=0{}{}".format(platform,lang)
+    try:
+       
+        AI_client_tts = uwebsocket.Client.connect('ws://118.145.158.207:22082/voice-chat/ws?{}'.format(req_str), debug=True)
+    except Exception as e: #网络连接异常
+        usys.print_exception(e)
+        print("websocket_connect_tts ERROR:{}\r\n".format(e))
+        
+    print("websocket_connect_tts:AI_client_tts {}\r\n".format(AI_client_tts))
+    # 线程接收数据
+
+    #_thread.stack_size(20*1024)
+    AI_client_tts_recv_id = _thread.start_new_thread(AI_client_tts_recv, (AI_client_tts,fd))
+    AI_audio_queue_thread_id = _thread.start_new_thread(AI_audio_queue_thread, ())
+    #_thread.stack_size(8*1024)
+    #开始会话
+    json_data = \
+    {
+        "header": {
+            "trace_id": "0a75ac012af172eb808782150509ee67",
+            "event": "Start"
+            }, 
+        "payload": {
+            "simple_response": True, 
+            "out_format": "mp3", 
+            "custom_variables": {
+                "bot_name": "柒妹妹"
+                }, 
+            "in_format": "pcm", 
+            "space_time": 0, 
+            "dialog_id": "", 
+            "in_sample_rate": 16000, 
+            "device_id": "860132060359338", 
+            "volume": "100", 
+            "sample_rate": 16000, 
+            "user_agent": "python", 
+            "voice": "ICL_zh_female_huoponvhai_tob", 
+            "voice_detection": "enabled"
+            }
+    }
+    AI_client_tts.send(ujson.dumps(json_data))
+    print("AI_client_tts.send:{}".format(ujson.dumps(json_data)))
+def AI_client_VC_ping():
+    global AI_TTS_str,AI_client_tts,_4S_timer    
+    AI_client_tts.send("ping")
+
+def AI_client_VC_RequestToRespond():
+        global AI_TTS_str,AI_client_tts
+        json_data = \
+        {
+            "header":{
+                "trace_id":"123456",
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":"123456",
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_VC_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        # if VC_state == VC_State_RequestToRespond:
+        #     print("AI_client_VC_RequestToRespond 重复 tts_str:{}\nasr_str:{}".format(AI_TTS_str,AI_ASR_str))
+
+        if AI_TTS_str != "":
+            json_data["payload"]["text"] = AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            AI_TTS_str = ""
+        AI_client_tts.send(ujson.dumps(json_data))
+            #AI_ASR_str = ""
+        # utime.sleep_ms(1)
+# 音频队列        
+def AI_audio_queue_thread():
+    while True:
+        try:
+            if AI_audio_queue.empty() :
+                # if count_t%200 == 0:
+                #     print("AI_send_data_queue.empty")
+                utime.sleep_ms(5)
+            else:
+                #print("AI_audio_queue_thread")
+
+                data = AI_audio_queue.get()
+                
+                #AI_client_tts_data_len=len(data)
+                print("audio_queue:len:{} \r\n".format(len(data[0]),data[1]))
+                if len(data[0]) > 1:
+                    try:
+
+                        tmp= aud.playStream(3, data[0])#播放音频流
+
+                        print("出:{}!!!".format(len(data[0])))
+                        mem = gc.mem_free()
+                        print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                    except Exception as e:
+                        print("AI_audio_queue_thread:ERROR:")
+                        usys.print_exception(e)
+
+                    utime.sleep_ms(2)
+        except Exception as e:
+            print("AI_audio_queue_thread:ERROR:")
+            usys.print_exception(e)
+
+#websocket_connect_tts("/usr/shouhou.mp3",",可联系售后解决,联系方式见售后客服电话是400-886-8777或到微信公众号柒牌SEVENBRAND自行充值!")
+# for i in range(10):
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"{}。".format(i))
+#     utime.sleep_ms(4000)
+
+# data = "OPQRSTUVWXYZ"
+# #data = "AB"
+# for i in data:
+#     websocket_connect_tts("/usr/R_READ_TIME_{}.mp3".format(i),"-{}。".format(i))
+#     utime.sleep_ms(4000)
+
+# try:
+#     att = None
+#     att.connect()
+# except Exception as e:
+#             str_tmp = str(e)
+#             print("str_tmp:{}".format(str_tmp))
+#             if str_tmp.find("connect") != -1:
+#                 print("find connect!!!!")
+#             print("AI_audio_queue_thread:ERROR:{}".format(e))
+#             usys.print_exception(e)
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tesr.mp3 b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tesr.mp3
new file mode 100644 (file)
index 0000000..9aad4b0
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tesr.mp3 differ
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3
new file mode 100644 (file)
index 0000000..0be5a24
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/tts_tesr.mp3 differ
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ui.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/ui.py
new file mode 100644 (file)
index 0000000..1ed017e
--- /dev/null
@@ -0,0 +1,351 @@
+import utime
+import osTimer
+import EventMesh
+from machine import Timer
+import voiceCall
+import osTimer
+import constants
+from misc import Power
+import pm
+import ujson
+import audio
+import ql_fs
+import audio
+import sms
+from machine import Pin
+from misc import PWM
+import uos
+import gc
+import _thread
+from queue import Queue
+from machine import RTC
+import usys
+def audio_cb(event):
+    if event == 0:
+        EventMesh.publish("set_audio_state", 1)
+        EventMesh.debug_log('audio-play start.') 
+    elif event == 7:
+        EventMesh.publish("set_audio_state", 0)
+        EventMesh.debug_log('audio-play finish.')
+CALL_LOG_MAX = 50
+aud = audio.Audio(0)
+aud.setCallback(audio_cb)
+
+def msg_cb(args):
+    index = args[1]
+    storage = args[2]
+    # EventMesh.debug_log("index:{}".format(index))
+    sms_data = sms.getSaveLoc()
+    sms_max = sms_data[0][2]
+    if index != -1:
+        tmp = sms.searchTextMsg(index)
+        detail = tmp[1]#内容
+        # EventMesh.debug_log("msg_cb:detail {}".format,detail)
+
+        if  detail.find("SETIP:") != -1:#寻找是否有这个字符串
+            tmp_test = detail.split("SETIP:")[1]
+            if  tmp_test.find(":") != -1:
+                new_ip = tmp_test.split(':')[0]
+                # EventMesh.debug_log("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))
+                new_com = tmp_test.split(':')[1]
+                # new_md5 = detail.split(':')[3]
+                if len(new_ip) > 0 and len(new_com) > 0:
+                    EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#
+                    # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间
+        if detail.find("ts#") != -1:
+            EventMesh.publish("send_devinfo_event", tmp[0])#删除短信
+            pass
+        if detail.find("SETWHITEPHB:1") != -1:
+            EventMesh.publish("set_storage_config",["WLKEY","2"])#打开自动接听
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
+            pass
+        if detail.find("SETWHITEPHB:0") != -1:
+            EventMesh.publish("set_storage_config",["WLKEY","0"])#关闭自动接听
+            sms.sendPduMsg(tmp[0], 'set ok', 'UCS2')
+            pass
+        if detail.find("factory#") != -1:#恢复出厂设置
+            EventMesh.publish("app_factory",tmp[0])#app恢复出厂
+        
+        if detail.find("reset#") != -1:#重启
+            EventMesh.publish("app_restart",tmp[0])#
+
+        if detail.find("fota:http://u-oss.thisiot.com/test/") != -1:#固件升级
+            EventMesh.publish("firware_download",tmp[0])#
+        
+    if index >= sms_max-1:#删除短信
+        EventMesh.publish("delete_sms_event")#删除短信
+sms.setCallback(msg_cb)
+
+import audio
+from machine import Pin
+
+
+
+#from usr.ui_WatchFaceScreen import WatchFaceScreen
+class UI(object):
+    def __init__(self):
+        #self.screen = WatchFaceScreen()
+        #self.screen_old = self.screen
+        self.ui_queue = Queue()
+        _thread.stack_size(13*1024)
+        _thread.start_new_thread(self.ui_queue_thread, ())
+        _thread.stack_size(8*1024)
+        self.screen = None
+        self.screen_old = None
+        self.screen_prev = None
+        self.screen_list = []
+        #self.lv = lv
+        self.system_sleep_timer = osTimer()
+        self.system_sleep_timer_count = 0
+        self.sleep_flag = 1
+        self.level = 6
+        self.read_data = {}
+        self.aud = audio.Audio(0)
+        self.aud.set_pa(Pin.GPIO29)
+        self.aud.setVolume(11)
+        # self.level = EventMesh.publish("get_brightness_level")
+        self.read_data = EventMesh.publish("get_storage_data")
+        self.main_flag = 0
+        self.main_id = 0
+        self.set_interrup_flag = 0
+        self.UI_high_priority_flag = 0 #如果=1,则当前ui不被打断
+        # EventMesh.debug_log("self.read_data:{} self.level:{}".format(self.read_data,self.level))
+        # check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+        # if check == True:
+        #     with open("/usr/static/storage_file/config.json","r") as fd:
+        #         self.read_data = ujson.load(fd)
+        #         if self.read_data != {}:
+        #             b = str("brightness_level") in self.read_data.keys()
+        #             if b == True:
+        #                 self.level = self.read_data["brightness_level"]
+        #             else:
+        #                 self.level = 6
+        #                 self.read_data["brightness_level"] = self.level
+        #                 EventMesh.publish("set_storage_data", self.read_data)
+        #                 with open("/usr/static/storage_file/config.json","w",encoding="utf-8") as fd:
+        #                     ujson.dump(self.read_data,fd)
+        # else:
+        #     self.level = 6 #默认是6级别
+        
+        # if self.level == None:
+        #     self.level = 6
+        # self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_MS, self.level, 10)
+        # self.PWM_backlight.open()
+        self.sleep_lock = 0
+
+    def post_processor_after_instantiation(self):
+        # EventMesh.subscribe("load_screen", self.load_screen_cb)
+
+        # EventMesh.subscribe("btn1_press", self.btn_press)
+        # EventMesh.subscribe("btn8_press", self.btn_press)
+        # EventMesh.subscribe("btn8_long_press", self.btn_press)
+
+        # EventMesh.subscribe("btn1_release", self.btn_release)
+        # EventMesh.subscribe("btn8_release", self.btn_release)
+
+        # EventMesh.subscribe("done_left_to_right", self.ui_press)
+        # EventMesh.subscribe("done_right_to_left", self.ui_press)
+        # EventMesh.subscribe("done_bottom_to_top", self.ui_press)
+        # EventMesh.subscribe("done_top_to_bottom", self.ui_press)
+        # EventMesh.subscribe("done_return", self.ui_press)
+        # EventMesh.subscribe("done_click", self.ui_press)
+        # EventMesh.subscribe("done_error", self.ui_press)
+        # EventMesh.subscribe("done_press", self.ui_press)
+        # EventMesh.subscribe("call_in", self.publish_call_in)
+
+        # EventMesh.subscribe("get_lcd_state", self.get_lcd_state)
+        # EventMesh.subscribe("set_lcd_state", self.set_lcd_state)
+        
+        #EventMesh.subscribe("call_in", self.publish_call_in)
+        #EventMesh.subscribe("set_bg_img", self.set_bg_img)
+
+        EventMesh.subscribe(constants.EVENT.SYSTEM_SLEEP, self.system_sleep)
+        EventMesh.subscribe(constants.EVENT.SYSTEM_UP, self.system_up)
+        EventMesh.subscribe("system_sleep_rest", self.system_sleep_rest)
+        # EventMesh.subscribe("set_UI_high_priority", self.set_UI_high_priority)
+        # EventMesh.subscribe("get_UI_high_priority", self.get_UI_high_priority)
+
+        # EventMesh.subscribe("set_interrup_incall", self.set_interrup_incall)
+        # EventMesh.subscribe("get_interrup_incall", self.get_interrup_incall)
+        # EventMesh.subscribe("get_screen_NAME",self.get_screen_NAME)
+        EventMesh.subscribe("publish_message_event_ui",self.publish_message_event_ui)
+        # EventMesh.subscribe("return_prev_screen",self.return_prev_screen)
+
+        self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
+
+    def publish_message_event_ui(self,event,msg):
+        self.ui_queue.put(msg)
+
+    #ui的消息队列处理,防止内存越界 格式:{函数名,数据}
+    def ui_queue_thread(self):
+        while True:
+            data = self.ui_queue.get()
+            #EventMesh.debug_log("ui_queue_thread:data = {}".format(data))
+            if data != None:
+                try:
+                    data["func"](data["data"])
+                except Exception as e:
+                    usys.print_exception(e)
+                    EventMesh.debug_log("ui_queue_thread:ERROR:{}".format(e))
+            # for scr in self.screen_list:
+            #     if scr.handle_message_event(data) == 1 :
+            #         break
+    def return_prev_screen(self, event, msg):
+        if self.screen_prev != None:
+            EventMesh.publish("load_screen", {"screen": self.screen_prev.NAME})
+
+    def set_interrup_incall(self, event, msg):
+        self.set_interrup_flag = msg
+        
+    def get_interrup_incall(self, event, msg):
+        return self.set_interrup_flag
+    
+    def set_UI_high_priority(self, event, msg):
+        self.UI_high_priority_flag = msg
+
+    def get_UI_high_priority(self, event, msg):
+        return self.UI_high_priority_flag
+
+    def get_lcd_state(self, event, key):
+        return self.sleep_flag
+    
+    def set_lcd_state(self, event, key):
+        EventMesh.debug_log("key_:{}".format(key))
+        self.sleep_flag = key
+    
+    def system_sleep_rest(self, event, key):
+        #EventMesh.debug_log("system_sleep_rest!!!!!")
+        self.system_sleep_timeout_rest()
+
+    
+
+    def __lcd_on(self):
+        self.system_sleep_timeout_rest()
+        if self.sleep_flag == 0 :
+            EventMesh.debug_log("__lcd_on")
+            if self.sleep_lock == 1:
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
+            self.sleep_lock = 1
+            self.sleep_flag = 1
+            
+            
+            #lcd_ctrl.write(1)
+            #utime.sleep(10)
+            
+            self.system_sleep_timer.start(500, 1, self.system_sleep_timer_cb)
+            EventMesh.publish("set_lcd_state",self.sleep_flag)
+           
+            #lv.autoSleep(0)
+            pm.autosleep(0)
+            pm.sclkEx_set(0, 1, 5)
+            
+            
+           
+            self.sleep_lock = 0
+            
+
+    def __lcd_off(self):
+        
+        if self.sleep_flag == 1 :
+            EventMesh.debug_log("__lcd_off")
+            if self.sleep_lock == 1:
+                EventMesh.debug_log("__lcd_on:sleep_lock:error!")
+            self.sleep_lock = 1
+            self.sleep_flag = 0
+           
+            #lcd_ctrl.write(0)
+            #
+            #lv.autoSleep(1)
+            pm.autosleep(1)
+            pm.sclkEx_set(1, 1, 5)
+            #utime.sleep_ms(2)
+           
+            #utime.sleep_ms(80)
+            #EventMesh.publish("set_lcd_state",self.sleep_flag)
+            self.sleep_lock = 0
+           
+            self.system_sleep_timer.stop()
+            EventMesh.publish("Hsensor_set_sleep") #让系统更快休眠
+
+    def system_sleep(self, event, msg) :
+        self.__lcd_off()
+
+    def system_up(self, event, msg):
+        self.__lcd_on()
+
+    def system_sleep_timer_cb(self, *args):
+        #EventMesh.debug_log("system_sleep_timer_count:{}".format(self.system_sleep_timer_count))
+        time = EventMesh.publish("get_brightness_time")
+        if time == None:
+            time = 20
+        self.system_sleep_timer_count += 1
+        if self.system_sleep_timer_count >= time :
+            self.system_sleep_timer_count = 0
+            self.__lcd_off()
+
+    def system_sleep_timeout_rest(self) :
+        #EventMesh.debug_log("system_sleep_timeout_rest")
+        self.system_sleep_timer_count = 0
+
+    def start(self):
+        #self.post_processor_after_instantiation()
+        pass
+
+    def add_screen(self, screen):
+        self.screen_list.append(screen)
+        return self
+    
+    def get_screen_NAME(self, event, msg):
+        return 0
+    
+    def load_screen_cb(self, topic, msg):
+        EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  
+
+    def load_screen(self, msg):
+        EventMesh.debug_log("msg1={}".format(msg))
+        if self.UI_high_priority_flag == 1:#电话界面屏蔽其他界面
+            return
+        if self.screen :
+            if self.screen.NAME == msg["screen"]:
+                return
+        for scr in self.screen_list:
+            if scr.NAME == msg["screen"]:
+                # 每次屏幕切换开始息屏倒计时
+                
+                if scr.NAME == 'main_menu':
+                    self.main_flag = 1
+                else :
+                    self.main_flag = 0
+                mem = gc.mem_free()
+                EventMesh.debug_log('1剩余内存RAM:{} KB'.format(mem / 1024))
+    
+                self.screen = scr
+                
+
+                if self.screen_old != None :
+                    self.screen_old.Close() #先关闭上一次界面
+                    # self.lv.img.cache_invalidate_src(None) #清img cache
+                    # self.lv.img.cache_set_size(16) #开img cache
+                    if self.screen_old.meta_type != "popup": #不是弹窗,保存上一个界面,用来返回
+                        self.screen_prev = self.screen_old #
+                self.screen_old = self.screen
+                if msg.get("meta"):
+                    self.screen.meta_info = msg.get("meta")
+                EventMesh.debug_log("load_screen:post_processor_before_initialization")
+                self.screen.post_processor_before_initialization()
+                EventMesh.debug_log("load_screen:initialization")
+                # self.screen.initialization()
+                
+                EventMesh.debug_log("load_screen.load()")
+                # self.screen.load()
+                # self.lv.scr_load(self.screen.get_meta())
+                
+                self.screen.post_processor_after_initialization()
+                # self.__lcd_on()
+                mem = gc.mem_free()
+                EventMesh.debug_log('2剩余内存RAM:{} KB'.format(mem / 1024))
+
+                
+
+
+
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3
new file mode 100644 (file)
index 0000000..a82319c
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/R_READ_TIME_AB.mp3 differ
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/ai_VC.py
new file mode 100644 (file)
index 0000000..4534877
--- /dev/null
@@ -0,0 +1,2175 @@
+from common import Abstract, LogAdapter
+import EventMesh
+import uwebsocket
+import usys
+import gc
+import urandom
+import uhashlib
+import ubinascii
+import ujson
+import osTimer
+import _thread
+from queue import Queue
+import utime
+import audio
+import uos
+from machine import Pin
+from machine import ExtInt
+from machine import WDT
+import modem
+import sim
+import net
+import base64
+import ucryptolib
+import urandom as random
+import request
+import ql_fs
+from misc import Power,USB,PowerKey
+import ntptime
+import machine
+class AI_led(Abstract):
+    def __init__(self):
+        self.led_red = Pin(Pin.GPIO36, Pin.OUT, Pin.PULL_PD, 0)
+        self.led_green = Pin(Pin.GPIO21, Pin.OUT, Pin.PULL_PD, 1)
+        self.led_white = Pin(Pin.GPIO19, Pin.OUT, Pin.PULL_PD, 1)
+        EventMesh.subscribe("open_led_red",self.open_led_red)
+        EventMesh.subscribe("open_led_white",self.open_led_white)
+        EventMesh.subscribe("open_led_green",self.open_led_green)
+        EventMesh.subscribe("open_led_all",self.open_led_all)
+        EventMesh.subscribe("close_led",self.close_led)
+        EventMesh.publish("open_led_red")
+    def open_led_red(self,event,msg):
+        print("open_led_red")
+        #self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_red.write(1)
+
+    def open_led_white(self,event,msg):
+        print("open_led_white")
+        self.led_red.write(0)
+        #self.led_white.write(0)
+        self.led_green.write(0)
+        self.led_white.write(1)
+
+    def open_led_green(self,event,msg):
+        print("open_led_green")
+        self.led_red.write(0)
+        self.led_white.write(0)
+        #self.led_green.write(0)
+        self.led_green.write(1)
+
+    def open_led_all(self,event,msg):
+        print("open_led_all")
+        #self.led_red.write(0)
+        self.led_white.write(1)
+        self.led_green.write(1)
+        self.led_red.write(1)
+
+    def close_led(self,event,msg):
+        print("close_led")
+        self.led_red.write(0)
+        self.led_white.write(0)
+        self.led_green.write(0)
+audio_buf = ['dianliangshengyu10', 'dianliangshengyu100', 'dianliangshengyu20', 'dianliangshengyu40', 'dianliangshengyu60', 'dianliangshengyu80', 'dianliangshengyu90', 'IMEIhao', 'jianquancuowu', 'key_prompt', 'liuliangtishi', 'Low_power_warning', 'peizhichenggong', 'qiehuanchenggong', 'R_CHARGE_FULL', 'R_CHARGE_IN', 'R_CHARGE_OUT', 'R_POWER_OFF_1', 'R_READ_TIME_0', 'R_READ_TIME_1', 'R_READ_TIME_2', 'R_READ_TIME_3', 'R_READ_TIME_4', 'R_READ_TIME_5', 'R_READ_TIME_6', 'R_READ_TIME_7', 'R_READ_TIME_8', 'R_READ_TIME_9', 'R_SIM_FAILE', 'xianyikaiji', 'xinhaoruo1', 'xinhaoruo2', 'yinliangyizuida', 'yinliangyizuixiao', 'zhengzaiguanji']
+
+class AI_dev(Abstract):
+    # AI
+    def __init__(self):
+        self.VBATT_tab = {"charge_full":4300,100 :4250 ,  90:3994 , 80:3883, 60: 3707, 40:3604, 20:3537,  10:3486,}
+        self.KeyAI_status = 0
+        self.KeyAI_timer_count = 0
+        self.KeyAI_long_press = 0
+        self.KeyAI_press = 0
+        self.KeyAI_timer = osTimer()
+        #self.extint_AI = ExtInt(ExtInt.GPIO19,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI = ExtInt(ExtInt.GPIO22,ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.keyAI_extint_cb)
+        self.extint_AI.enable()
+        self.pwk_key_status = 0
+        self.pwk_key_timer_count = 0
+        self.pwk_key_long_press = 0
+        self.pwk_key_press = 0
+        self.pwk_key_timer = osTimer()
+        #self.pwk_key = ExtInt(ExtInt.GPIO26, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_DISABLE, self.pwk_extint_cb)
+        self.pwk_key = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
+        self.pwk_key.enable() 
+        self.btnInfo_queue = Queue()
+        _thread.stack_size(10*1024)
+        _thread.start_new_thread(self.btnInfo_queue_thread, ())
+        _thread.stack_size(8*1024)
+        EventMesh.subscribe("publish_AI_btnInfo",self.publish_AI_btnInfo)
+        EventMesh.subscribe("get_battery",self.get_battery)
+        EventMesh.subscribe("audio_montage_play",self.audio_montage_play)
+        EventMesh.subscribe("paly_iccid_imei",self.paly_iccid_imei)
+        EventMesh.subscribe("paly_device_res_error",self.paly_device_res_error)
+        
+        self.wdt = WDT(30) #开启看门狗
+        # self.wdt_timer = osTimer()
+        # self.wdt_timer.start(10000, 1, self.wdt_timer_cb)
+        self.pk = PowerKey()
+        self.pk.powerKeyEventRegister(self.powerKey_callback)
+        self.usb = USB()
+        self.usb.setCallback(self.usb_event_cb)
+        self.usb_status = self.usb.getStatus()
+        self.usb_charge_flag = 0 
+        self.AI_dev_timer = osTimer()
+        self.AI_dev_timer.start(10000, 1, self.AI_dev_timer_cb)
+        self.aud = audio.Audio(0)
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.aud.setVolume(self.VC_TTS_volume //10)
+        #self.aud.play(1,0,'U:/static/xianyikaiji.mp3')#开机音频
+        #EventMesh.publish("audio_montage_play",["xianyikaiji.mp3"])
+        #EventMesh.publish("publish_AI_btnInfo",{"func":self.ntptime_cb})
+    def ntptime_cb(self):
+        #ntptime.settime(8)
+        print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+    def usb_event_cb(self, state):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.usb_event,"data":state})
+    def usb_event(self, state):    
+        status = state
+        self.usb_charge_flag = 0
+        if status == 1:#插入USB
+            print("charge R_CHARGE_in")
+            self.usb_status = 1
+            self.aud.stop()
+            #self.aud.play(1,1,'U:/static/R_CHARGE_IN.mp3')
+            EventMesh.publish("audio_montage_play",["R_CHARGE_IN.mp3"])
+            pass
+        elif status == 0:#拨出usbs
+            self.usb_status = 0
+            self.aud.stop()
+            EventMesh.publish("audio_montage_play",["R_CHARGE_OUT.mp3"])
+            #self.aud.play(1,1,'U:/static/R_CHARGE_OUT.mp3')
+    def btnInfo_queue_thread(self):
+        while True:
+            data = self.btnInfo_queue.get()
+            #EventMesh.debug_log("Info_queue:data = {}".format(data))
+            if data != None:
+                try:
+                    if "data" in data :
+                        data["func"](data["data"])
+                    else :
+                        data["func"]()
+                except Exception as e:
+                    #EventMesh.debug_log("btnInfo_queue:ERROR:{}".format(e))
+                    usys.print_exception(e)
+    def publish_AI_btnInfo(self,event,msg):
+        self.btnInfo_queue.put(msg)
+    def powerKey_callback(self, status):
+        print("powerKey_callback:{}".format(status))
+
+    def pwk_extint_cb(self,args):#pwk
+        try:
+            self.pwk_key_status = int(args[1])
+            if self.pwk_key_status == 0:
+                self.pwk_key_status = 1
+            else:
+                self.pwk_key_status = 0
+                pass
+            if self.pwk_key_status == 0:#按下
+                if self.pwk_key_press == 0 :
+                    self.pwk_key.disable()
+                    self.pwk_key_press = 1
+                    self.pwk_key_long_press = 0
+                    self.pwk_key_timer.start(100, 1, self.pwk_key_timer_cb)
+                    self.pwk_key_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    
+        except Exception as e: 
+            usys.print_exception(e)
+    def pwk_key_timer_cb(self, *args, **kwargs):
+        try:
+            self.pwk_key_status = self.pwk_key.read_level()
+            self.pwk_key_timer_count +=1
+            if self.pwk_key_timer_count >= 10*3: #长按3s 
+                #print("pwk_key_long_press {}".format(self.pwk_key_long_press))
+                if self.pwk_key_long_press == 0:
+                        self.pwk_key_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_Long_Press})  
+            if self.pwk_key_status == 1:#松开
+                #print("pwk_key_timer_cb:{}".format(self.pwk_key_timer_count))
+                if self.pwk_key_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.pwk_key_release})
+                    self.pwk_key.enable()
+                    self.pwk_key_timer.stop()
+                    self.pwk_key_timer_count = 0
+                    self.pwk_key_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+            
+    def keyAI_extint_cb(self,args):#call 2
+        try:
+            #print("AI_btn:keyAI_extint_cb{}".format(args[1]))
+            self.KeyAI_status = int(args[1])
+            if self.KeyAI_status == 0:
+                self.KeyAI_status = 1
+            else:
+                self.KeyAI_status = 0
+            
+            if self.KeyAI_status == 0:#按下
+                if self.KeyAI_press == 0 :
+                    self.extint_AI.disable()
+                    self.KeyAI_press = 1
+                    self.KeyAI_long_press = 0
+                    self.KeyAI_timer.start(100, 1, self.KeyAI_timer_cb)
+                    self.KeyAI_timer_count = 0
+                    #EventMesh.publish("AI_key_press")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_press})  
+        except Exception as e: 
+            usys.print_exception(e)
+    def KeyAI_timer_cb(self, *args, **kwargs):
+        try:
+            self.KeyAI_status = self.extint_AI.read_level()
+            self.KeyAI_timer_count +=1
+            if self.KeyAI_timer_count >= 10*1: #长按3s 
+                if self.KeyAI_long_press == 0:
+                        self.KeyAI_long_press = 1
+                        #EventMesh.publish("AI_key_long_press")
+                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_long_press})  
+            if self.KeyAI_status == 1:#松开
+                #print("KeyAI_timer_cb:{}".format(self.KeyAI_timer_count))
+                if self.KeyAI_timer_count >= 5: #防抖200ms
+                    #EventMesh.publish("AI_key_release")
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_key_release})  
+                    self.extint_AI.enable()
+                    self.KeyAI_timer.stop()
+                    self.KeyAI_timer_count = 0
+                    self.KeyAI_press = 0
+            
+        except Exception as e: 
+            usys.print_exception(e) 
+       
+    def AI_key_press(self):
+        #print("AI_key_press")
+        EventMesh.publish("AI_key_press")
+    def AI_key_long_press(self):
+        #print("AI_key_long_press")
+        EventMesh.publish("AI_key_long_press")
+        
+    def AI_key_release(self):
+        #print("AI_key_release")
+        EventMesh.publish("AI_key_release")
+    def pwk_key_Long_Press(self):
+        print("pwk_key_long_press!!!!!!!")
+        print("pwk_key_long_press!!!!!!!")
+        
+        # EventMesh.publish("paly_iccid_imei")
+        # return
+        EventMesh.publish("audio_montage_play",["zhengzaiguanji.mp3"])
+        #self.aud.play(1,0,'U:/static/zhengzaiguanji.mp3')#关机音频
+        EventMesh.publish("open_led_red")
+        utime.sleep_ms(3000)
+        Power.powerDown()
+        #print("AI_key_release")
+        EventMesh.publish("pwk_key_long_press")
+        
+    def pwk_key_release(self):
+        #print("pwk_key_release")
+        EventMesh.publish("pwk_key_release")
+
+    def AI_dev_timer_cb(self, *args, **kwargs):
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_dev_timer_event})  
+    def AI_dev_timer_event(self):
+        self.wdt.feed()
+        Vbatt = Power.getVbatt()
+        if self.usb_charge_flag == 0 and self.usb_status == 1 and Vbatt>=self.VBATT_tab["charge_full"]:#充电充满
+            EventMesh.publish("audio_montage_play",["R_CHARGE_FULL.mp3"])
+            #self.aud.play(1,0,'U:/static/R_CHARGE_FULL.mp3')#充电已满
+            self.usb_charge_flag = 1
+        if self.usb_charge_flag == 0 and self.usb_status == 0 and Vbatt<self.VBATT_tab[10]:#低电报警
+            #self.aud.play(1,0,'Low_power_warning.mp3')
+            EventMesh.publish("audio_montage_play",["Low_power_warning.mp3"])
+            self.usb_charge_flag = 1
+        pass
+    def get_battery(self, event=None, msg=None):
+        Vbatt = Power.getVbatt()
+        if Vbatt>self.VBATT_tab[90]:
+            return 100
+        if Vbatt>self.VBATT_tab[80]:
+            return 90
+        if Vbatt>self.VBATT_tab[60]:
+            return 80
+        if Vbatt>self.VBATT_tab[40]:
+            return 60
+        if Vbatt>self.VBATT_tab[20]:
+            return 40
+        if Vbatt>self.VBATT_tab[10]:
+            return 20
+        if Vbatt<=self.VBATT_tab[10]:
+            return 10
+    def audio_montage_play(self,event,msg):
+        self.aud.stopPlayStream()
+        str_data='mp3files='
+        for i in msg:
+            try:
+                str_tmp = i.replace(".mp3","")
+                str_data+="{}.mp3+".format(audio_buf.index(str_tmp))
+            except Exception as e:
+                    usys.print_exception(e)    
+        str_data = str_data[:-1]
+        print("audio_montage_play:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    def paly_iccid_imei(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("liuliangtishi"))#流量提示
+        imei  = modem.getDevImei()
+        iccid = sim.getIccid()
+        if iccid != -1 and len(iccid) > 5:
+            str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+'.format(audio_buf.index("R_READ_TIME_{}".format(iccid[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(iccid[1])),audio_buf.index("R_READ_TIME_{}".format(iccid[2])),audio_buf.index("R_READ_TIME_{}".format(iccid[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[4])),audio_buf.index("R_READ_TIME_{}".format(iccid[5])),audio_buf.index("R_READ_TIME_{}".format(iccid[6])),audio_buf.index("R_READ_TIME_{}".format(iccid[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[8])),audio_buf.index("R_READ_TIME_{}".format(iccid[9])),audio_buf.index("R_READ_TIME_{}".format(iccid[10])),audio_buf.index("R_READ_TIME_{}".format(iccid[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(iccid[12])),audio_buf.index("R_READ_TIME_{}".format(iccid[13])),audio_buf.index("R_READ_TIME_{}".format(iccid[14])))
+        str_data += '{}.mp3+'.format(audio_buf.index("IMEIhao"))#IMEI号为:
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+    #鉴权出错,播放imei号
+    def paly_device_res_error(self,event,msg):
+        str_data = 'mp3files={}.mp3+'.format(audio_buf.index("jianquancuowu"))#AI功能异常,请联系客户查询,设备号为:
+        imei  = modem.getDevImei()
+        str_data += '{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3+{}.mp3'.format(audio_buf.index("R_READ_TIME_{}".format(imei[0]))\
+                ,audio_buf.index("R_READ_TIME_{}".format(imei[1])),audio_buf.index("R_READ_TIME_{}".format(imei[2])),audio_buf.index("R_READ_TIME_{}".format(imei[3])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[4])),audio_buf.index("R_READ_TIME_{}".format(imei[5])),audio_buf.index("R_READ_TIME_{}".format(imei[6])),audio_buf.index("R_READ_TIME_{}".format(imei[7])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[8])),audio_buf.index("R_READ_TIME_{}".format(imei[9])),audio_buf.index("R_READ_TIME_{}".format(imei[10])),audio_buf.index("R_READ_TIME_{}".format(imei[11])),\
+                audio_buf.index("R_READ_TIME_{}".format(imei[12])),audio_buf.index("R_READ_TIME_{}".format(imei[13])),audio_buf.index("R_READ_TIME_{}".format(imei[14])))
+        #print("str_data:{}".format(str_data))
+        self.aud.montage_play('U:/static/audio.bin',1,1,str_data)
+#存储信息
+class getStorageDataManager(Abstract):#获取内存数据
+        def __init__(self):
+            self.config_data = {}
+            check = ql_fs.path_exists("/usr/static/storage_file/config.json")
+            if check == True:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            else :
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+                pass
+
+        def post_processor_after_instantiation(self):
+            EventMesh.subscribe("set_storage_data", self.set_storage_data)
+            EventMesh.subscribe("set_storage_config", self.set_storage_config)
+            EventMesh.subscribe("get_storage_data", self.get_storage_data)
+            EventMesh.subscribe("get_storage_config", self.get_storage_config)
+
+        def set_storage_data(self, event, msg): 
+            # EventMesh.debug_log("set_storage_data:{}".format(msg))
+            if msg != None:
+                self.config_data = msg
+                with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                    ujson.dump(self.config_data,fd)
+        
+
+        def set_storage_config(self,event,msg): 
+            # EventMesh.debug_log("set_storage_key_data1:{}".format(msg))
+            if len(msg) >= 2:
+                self.config_data[msg[0]]=msg[1]
+                # EventMesh.debug_log("set_storage_key_data2:{}".format(self.config_data[msg[0]]))
+                EventMesh.publish("publish_message_event_ui",{"func":self.set_storage_save,"data":0})
+        def set_storage_save(self, data): 
+            with open("/usr/static/storage_file/config.json",'w+',encoding="utf-8") as fd:
+                ujson.dump(self.config_data,fd)
+        def get_storage_data(self, event, msg): 
+            # EventMesh.debug_log("get_storage_data:{}".format(self.config_data))
+            return self.config_data 
+        def get_storage_config(self,event,msg):
+            # EventMesh.debug_log("get_storage_key_data1:{}".format(msg))
+            b = msg in self.config_data.keys()
+            if b == True:
+                # EventMesh.debug_log("get_storage_key_data2:{}".format(self.config_data[msg]))
+                return self.config_data[msg]
+            else :
+                return None
+            # try:
+            #     return self.config_data[msg]
+            # except:
+            #     EventMesh.debug_log("get_storage_key_data:none key:{}",msg)
+            #     return None
+#设备资源授权平台
+class device_res_author(Abstract):
+   
+    def __init__(self) :
+        self.deviceId = modem.getDevImei()#"876226002022574"
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        #K01
+        # self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1" 
+        # self.pid = "qAtdDOGXgXYjT2HGFr3a"
+        #G15
+        # self.key = b"3LWfBicxfRZ3ZAqmZCFuvMdGUXdAFWkb" 
+        # self.pid = "qLx4Pu4mSUQxyfVKGLXG"
+        #7pin
+        self.key = b"uKLrChwrxA1LklgBc3VwawYjUkbT3BgX" 
+        self.pid = "cqxJZi5CNgzjS3mX21Zw"
+        
+        self.dev_res_timer = osTimer()
+        self.dev_res_timer.start(10000, 1, self.dev_timer_cb)
+        self.dev_res_timerCount = 0
+        self.ud_token_timer = osTimer()
+        self.ud_token_timer.start(30000, 1, self.ud_token_timer_cb)
+        self.ud_token_timer_Count = 0
+        self.dev_token = None
+        self.res_error_count = 0
+        EventMesh.subscribe("get_dev_token", self.get_dev_token)
+        EventMesh.subscribe("update_dev_token", self.update_dev_token)
+        self.dev_active() #设备激活
+        self.dev_sign_in() #设备登入
+        self.ntptime_flag = 0
+
+    def get_dev_token(self, event, msg): 
+        return self.dev_token
+    #网络校时
+    def dev_NTP(self):
+        url = "http://dmp.raisound.com/bz-api/dev/time"
+        response = request.get(url)
+        data = response.json()
+        print("dev_NTP:{}".format(data))
+        if data:
+            try:
+                timeSecond = data["data"]["timestamp"]//1000
+                
+                next_alarm_time = utime.localtime(timeSecond)
+                print("timeSecond {} next_alarm_time {}".format(timeSecond,next_alarm_time))
+                machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
+            except Exception as e:
+                    usys.print_exception(e)
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_timer_cb_}) 
+
+    def dev_timer_cb_(self):    
+        #if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        if self.dev_token == None:
+            if self.ntptime_flag == 0:
+                self.ntptime_flag  = 1
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.dev_NTP})
+            print("timer:{}!!!!!!!!\r\n".format(utime.localtime()))
+            self.dev_active() #设备激活
+            self.dev_sign_in() #设备登入
+            self.dev_res_timerCount+=1
+            if self.dev_res_timerCount > 6: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                self.dev_res_timerCount=0
+                self.dev_res_timer.stop()
+    def ud_token_timer_cb(self, *args): 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.ud_token_timer_cb_}) 
+
+    def ud_token_timer_cb_(self):   
+        #print("ud_token_timer_!!!!")
+        self.ud_token_timer_Count+=1
+        if self.ud_token_timer_Count >= 20: #定时30*200s时更新token
+            self.ud_token_timer_Count = 0
+            EventMesh.publish("update_dev_token")
+            
+    def get_sim_Status(self):
+        return sim.getStatus() 
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            date_tmp = utime.localtime() #获取当前时间
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+            deviceId = self.deviceId #"876226002022574" #以imei号
+            pid = self.pid
+            key = self.key
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+            print("sign_data:{}\r\n".format(sign_data))
+            sha256_hex = self.get_hmac_sha256(key,sign_data)
+            print("sha256_hex:{}\r\n".format(sha256_hex))
+
+            data = {
+                "deviceId":"{}".format(deviceId), #设备名
+                "pid":pid, #产品PID
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                "timeStamp":timeStamp, #要以ms的形式
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+            }
+            print(ujson.dumps(data))
+            headers_T ={"Content-Type":"application/json"}
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+            data =ujson.dumps(data)
+            response = 0
+            response_result = 0
+            try:
+                response = request.put(url,data=data,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("put error!!!!!\r\n")
+                response_result = 0
+            
+            IV = "" #偏移量
+            PASSWORD= "" #服务器返回后的加密内容 密码
+            if response_result == 1: #访问成功ip
+                if response.status_code == 200:
+                    print("headers:{}".format(response.headers))
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    data =  ujson.loads(c)
+                    # data = response.json()
+                    print("data-{}".format(data))
+                    if data != None:
+                        if "success" in data:
+                            if data['success'] == True:
+                                if "data" in data:
+                                    data_tmp = data["data"]
+                                    if "nonce" in data_tmp: #偏移量
+                                        IV = data_tmp["nonce"]
+                                    if "password" in data_tmp:
+                                        PASSWORD = data_tmp["password"]
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                            if data["code"] == 20001:#鉴权成功
+                                pass
+                            elif data["code"] > 50000:#时间错误
+                                self.res_error_count+=1
+                                if self.res_error_count>=3:
+                                    self.res_error_count = 0
+                                    EventMesh.publish("paly_device_res_error")
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                    if PASSWORD != None and IV != None:
+                        if len(PASSWORD) != 0 and len(IV) != 0:
+                            password = PASSWORD
+                            iv = IV
+                            #解密 之后保存本地下一次登入做使用
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                            print("decrypt_data {}".format(decrypt_data))
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])
+                    
+                        
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self):
+        signal = net.csqQueryPoll()
+        if signal == -1 or self.get_sim_Status() != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        token = ""
+        token = self.dev_token
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+        #print("token:{}\r\n".format(token))
+        if token == None:
+            token = ""
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0:#没有密码
+            return
+        if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)
+                    response_result = 1
+                except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            self.dev_token = data_tmp["token"]
+                                if data["code"] == 50003:#时间错误
+                                    self.ntptime_flag  = 0
+                print("token:{}\r\n".format(token))
+                pass
+    #获取新的令牌 更新token
+    def update_dev_token(self, event, msg):
+        print("update_dev_token")
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0: #没有密码走激活
+            print("no dev_pass:{}\r\n".format(dev_pass))
+            self.dev_active()
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) == 0: #没有token走登入
+            print("no dev_token:{}\r\n".format(token))
+            self.dev_sign_in()
+
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+        token = self.dev_token
+        if token == None:
+            token = ""
+        if len(token) != 0:
+            response_result=0
+            response = 0
+            headers_T = {"bz-dt":"{}".format(token)}
+            try:
+                response = request.get(dev_tokenip,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("get error!!!!!\r\n")
+                response_result = 0
+            if response_result == 1:
+                if response.status_code == 200:
+                    try:
+                        headers_data = response.headers
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                            bz_dt = headers_data["bz-dt"] 
+                            self.dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                            print("update_dev_token:{}".format(self.dev_token))
+                    except Exception as e:
+                        print("headers_data!!!!! error\r\n")
+        
+        pass
+
+
+
+
+#阿里voice_chat状态枚举
+VC_State_None=0
+VC_State_Listening=1#听
+VC_State_SpeechStart=2#说开始
+VC_State_SpeechEnd=3#说结束
+VC_State_Thinking=4#想(chat)
+VC_State_Responding=5#音频播放
+VC_State_TTSStart=6
+VC_State_TTSData=7
+VC_State_TTSFinish=8
+VC_State_TTSEnd=9
+VC_State_TTSError=10
+VC_State_DialogError=11
+VC_State_End=12
+
+VC_record_TYPE_PCM = 0
+VC_record_TYPE_AMR = 1
+VC_play_TYPE_PCM = 0
+VC_play_TYPE_MP3 = 1
+
+#websocket发送数据编号
+# AI_client_asr_num = 0
+# AI_client_chat_num = 1
+# AI_client_tts_num = 2
+AI_client_voice_chat_num = 3
+AI_client_asr_num = 4
+class AI_VC(Abstract):
+    # AI
+    
+    def __init__(self):
+        self.record_data_save_flag = 0 #是否保存录音文件
+        self.record_fd = None
+        #self.VC_mode = 0 #0:短按连续问答模式 1:长按录音模式
+        self.VC_mode = EventMesh.publish("get_storage_config","VC_mode")#音色配置
+        if self.VC_mode == None :
+            self.VC_mode = 0
+
+        self.VC_server = 2 #0正式服务器,1:测试服务器1,2:测试服务器2
+        self.VC_record_TYPE = VC_record_TYPE_PCM #0:PCM 1:AMR
+        self.VC_play_TYPE = VC_play_TYPE_PCM #0:PCM 1:mp3 
+        self.VC_record_samplerate = 16000
+        self.VC_play_samplerate = 16000
+        #女,男,童,粤,川
+        self.VC_TTS_voice_type = {0:"huoshan::zh_female_xinlingjitang_moon_bigtts",1:"huoshan::zh_male_wennuanahu_moon_bigtts",2:"huoshan::ICL_zh_female_huoponvhai_tob",
+                                  3:"aliyun::longjiaxin",4:"huoshan::zh_female_daimengchuanmei_moon_bigtts"}
+        #self.VC_TTS_voice_type = ["aliyun::longxiaoxia","aliyun::longnan","aliyun::longling"]
+        self.VC_TTS_voice_num = EventMesh.publish("get_storage_config","VC_TTS_voice_num")#音色配置
+        if self.VC_TTS_voice_num == None or self.VC_TTS_voice_num>=len(self.VC_TTS_voice_type):
+            self.VC_TTS_voice_num = 0
+         
+        self.VC_TTS_volume =  EventMesh.publish("get_storage_config","VC_TTS_volume")#音量配置
+        if self.VC_TTS_volume == None:
+            self.VC_TTS_volume = 100
+        self.AI_audio_queue_thread_id = 0
+        self.AI_send_data_queue_thread_id = 0
+
+        self.AI_record_tmp_queue = Queue(100)
+        self.AI_send_data_queue = Queue(100)
+        self.AI_audio_queue = Queue(100)
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_flag = 0
+        self.AI_ASR_str_tmp = ""
+        # #开始线程
+        # if self.AI_audio_queue_thread_id ==0:
+        #     self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+        # else:
+        #     print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        # if self.AI_send_data_queue_thread_id == 0:    
+        #     self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            
+        self.voice_chat_state = VC_State_None #阿里ai voice_chat状态
+        self.VC_dialog_id = ""
+        self.VC_message_id=None
+        self.VC_task_id =None
+        self.AI_client_voice_chat = None
+        self.AI_client_voice_chat_recv_id = 0
+        self.AI_client_voice_chat_isconnect =0
+
+        self.asr_state = VC_State_None #阿里VC_ASR voice_chat状态
+        self.VC_asr_dialog_id = ""
+        self.VC_asr_message_id=None
+        self.VC_asr_task_id =None
+        self.AI_client_asr = None
+        self.AI_client_asr_recv_id = 0
+        self.AI_client_asr_isconnect =0
+
+        self.asr_satrt_flag = 0
+
+        self.record_pcm = None
+        self.play_pcm = None
+        self.VC_record_thread_id = 0
+        self.pingping_timerout = 0
+        
+        self.factory_timer = osTimer()
+        self._1S_timer = osTimer()
+        self.Audio_buf_size = 16*1024
+        self.record = audio.Record()
+        #self.record.end_callback(self.record_callback)
+        self.record.gain_set(4,10)
+        self.aud = audio.Audio(0)
+        self.aud.setCallback(self.audio_cb)
+        #self.aud.setVolume(self.VC_TTS_volume //10)
+        self.audio_play_state = 1 #音频播放完状态
+        self.close_timerout = 0
+        self.LocalRespondingEnded_timerout = 0
+        
+        self.play_flag = 0
+        self.VC_record_state_flag = 0
+        self.AI_key_long_press_flag = 0
+        self.websocket_error_count = 0
+
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        EventMesh.subscribe("AI_key_press", self.AI_key_press)
+        EventMesh.subscribe("AI_key_release", self.AI_key_release)
+        EventMesh.subscribe("AI_key_long_press", self.AI_key_long_press)
+        EventMesh.subscribe("pwk_key_release", self.pwk_key_release)
+        EventMesh.subscribe("get_AI_audio_queue", self.get_AI_audio_queue)
+        
+        EventMesh.publish("close_led")
+        #开机提示语,如果联网失败,直接提示信号弱
+        #女,男,童,粤,川
+        self.bot_name = "柒先生"
+        if self.VC_TTS_voice_num == 0 or self.VC_TTS_voice_num == 3 or self.VC_TTS_voice_num == 4:
+            self.bot_name = "柒妹妹"
+        elif self.VC_TTS_voice_num == 1:
+            self.bot_name = "柒先生"
+        elif self.VC_TTS_voice_num == 2:
+            self.bot_name = "柒思思"
+        self.AI_TTS_str = "您好!我是柒牌 AI 智能男装生活好帮手-{}, 很高兴为您服务,我可以帮您解答日常生活、工作,旅游信息、健康咨询、教育与学习、情感交流、全球资讯等问题!请问您有什么需要我帮忙的吗?".format(self.bot_name )
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+    def post_processor_after_instantiation(self):
+        pass
+    def get_AI_audio_queue(self, event, msg):
+        return self.AI_audio_queue
+    def audio_cb(self,event):
+        if event == 0:
+            self.audio_play_state =1
+            #EventMesh.publish("set_audio_state", 1)
+            print('audio-play start.')
+        elif event == 7:
+            self.audio_play_state = 0
+            #EventMesh.publish("set_audio_state", 0)   
+            print('audio-play finish.!!!!!!')
+
+    def AI_key_press(self, event, msg):#按键按下
+        print("AI_key_press")
+        self.aud.aud_tone_play(16,200)#播放按键音
+        self.asr_satrt_flag = 1#
+        self.AI_TTS_str = ""#"你好,有什么吩咐"
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        # if self.voice_chat_state != VC_State_None:
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        #     EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(10)})
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+        # self.Close()
+        # self.AI_VC_start()
+        self.AI_key_long_press_flag = 0
+
+    def AI_key_release(self, event, msg):#按键弹起
+        print("AI_key_release123")
+        if self.AI_key_long_press_flag == 1 :#有长按
+            self.AI_client_voice_chat_end_speech()
+        else :
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("audio_montage_play",["key_prompt.mp3"])
+                #self.aud.play(1,1,'U:/static/key_prompt.mp3')#提示请您按住中间的按钮开始讲话,讲完松开即可
+                self.AI_send_data_queue.clear()
+                try:
+                    self.websocket_deconnect_voice_chat()
+                except Exception as e:
+                    usys.print_exception(e)
+                self.VC_Speech_End()
+    def AI_key_long_press(self, event, msg):#按键长按
+        print("AI_key_long_press")
+        self.AI_key_long_press_flag = 1
+
+    def pwk_key_release(self, event, msg):#电源键短按,关闭
+        print("pwk_key_release")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+
+    
+#****************************************ASR连接**********************************************************************
+    def websocket_connect_asr(self):
+        print("websocket_connect_asr:{} {}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_asr_isconnect,_thread.threadIsRunning(self.AI_client_asr_recv_id)))
+        if self.AI_client_asr_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_asr = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-hk', debug=False)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn-sc', debug=False)#四川话测试环境
+                else :
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://118.145.158.207:22080/asr/ws?platform=aliyun&lang=zh-cn', debug=False)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_asr = uwebsocket.Client.connect('ws://amp.raisound.com/asr/ws?dt={}'.format(token), debug=False)
+                else:
+                    pass
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)  
+            self.websocket_error()
+            return
+        if self.AI_client_asr == None:
+            EventMesh.publish("update_dev_token")#获取token
+            return 
+        # 线程接收数据
+        if self.AI_client_asr_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_asr_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_asr_recv_id = _thread.start_new_thread(self.AI_client_asr_recv, (self.AI_client_asr,))
+        _thread.stack_size(8*1024)
+        self.AI_client_asr_isconnect = 1
+        # 
+
+    def websocket_deconnect_asr(self):
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+        print("websocket_deconnect_asr!!!!!!!")
+        if self.AI_client_asr_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_asr_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_asr_recv_id = 0
+        if self.AI_client_asr_isconnect == 1:
+            self.AI_client_asr_isconnect = 0
+            self.AI_client_asr.close()
+        print("websocket_deconnect_asr {}!!!!!!!".format(self.AI_client_asr_isconnect))
+
+    #websocket发送数据    
+    def AI_client_asr_send(self,data_str):
+        if isinstance(data_str, str):#是字符串
+            print("ASR ASR AI_client_asr_send:{}".format(data_str))
+            pass
+        else:
+            pass
+            #print("ASR ASR AI_client_asr_send:len:{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_asr_num,data_str]) 
+    #Ai VC websocket返回数据       
+    def AI_client_asr_recv(self,cli):
+        while True:
+            try:
+                # 死循环接收数据
+                utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("AI_client_asr_recv close!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_deconnect_voice_chat()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_asr}) 
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) 
+                    break
+                try:
+                    if isinstance(recv_data, str):
+                        jsload_data =  ujson.loads(recv_data)
+                        print("ASR ASR recv_data: {}".format(jsload_data))
+                        if jsload_data["event"] != None:
+                            if jsload_data["event"] == "TranscriptionStarted": #开始录音
+                                pass
+                        if recv_data.find('\"result\"') == -1:
+                        #if jsload_data["result"] == None:
+                            #print("continue recv_data:{}".format(recv_data))
+                            continue 
+                        if jsload_data["result"] == None:
+                            #print("continue recv_data:{}".format(recv_data))
+                            continue 
+                        if jsload_data["result"]["result"]:
+                            #self.AI_listen_text = str(jsload_data["result"]["result"])
+                            text= str(jsload_data["result"]["result"])
+                            
+
+                            print("ASR recv self.voice_chat_state :{}".format(self.voice_chat_state))
+                            if self.voice_chat_state >= VC_State_TTSStart:#开始播音后不响应asr结果
+                                print("asr continue")
+                                continue
+                            EventMesh.publish("open_led_red")
+                            if jsload_data["result"]["is_end"] == True:  #asr结束
+                                # if text.find('你好') != -1:
+                                #     self.asr_satrt_flag = 0
+                                #     self.AI_TTS_str = ""#"你好,有什么吩咐"
+                                #     self.AI_ASR_str = ""
+                                #     self.asr_satrt_flag = 1
+                                #     self.aud.aud_tone_play(16,200)#播放按键音
+                                #     # self.AI_client_asr_StopTranscription_requset()#终止前面合成
+                                #     # self.AI_client_asr_start_requset()#开始新的合成
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                #     EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                #     EventMesh.publish("open_led_red")
+                                #     continue
+                                #     #self.VC_Play_End()#关闭音频播放
+                                ret= self.check_text(text)
+                                if ret == 0:#配置指令
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                    self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                    continue
+                                elif ret == 1:#不处理
+                                    pass
+                                else:#正常asr
+                                    if self.AI_ASR_flag == 0:#d第一次识别,没有打断
+                                        self.AI_ASR_str = text#
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str
+                                        self.AI_ASR_flag  = 1
+                                    else:#第二次识别,打断了
+                                        self.AI_ASR_str = self.AI_ASR_str_tmp+text
+                                        print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                        self.AI_ASR_str_tmp = self.AI_ASR_str
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+
+
+                                    # if self.AI_ASR_str != "":#识别过一次asr,打断当前思考或者tts播放
+                                    #     self.AI_ASR_str_tmp = self.AI_ASR_str
+                                    #     print("ASR ASR 打断1 AI_ASR_str_tmp {}".format(self.AI_ASR_str_tmp))
+                                    #     self.AI_ASR_str = ""
+                                    # if self.AI_ASR_str_tmp != "":
+                                    #     self.AI_ASR_str = self.AI_ASR_str_tmp +text#加上之前的数据
+                                    #     print("ASR ASR 打断 续集 AI_ASR_str {}".format(self.AI_ASR_str))
+                                    # else:
+                                    #     self.AI_ASR_str = text#
+                                    # EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    # self.AI_ASR_str_tmp = ""
+                                        
+                                    
+                            elif jsload_data["result"]["is_end"] == False:
+                                if self.AI_ASR_flag ==1 :#如果已经识别过一次asr
+                                    self.AI_ASR_flag = 2
+                                    print("asr 打断,关闭VC连接")
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init2})#关闭vc连接
+                                    EventMesh.publish("publish_AI_btnInfo",{"func":EventMesh.publish,"data":"open_led_red"})#关闭vc连接
+                                pass
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                    break
+        self.AI_client_asr_isconnect = 0
+        self.AI_client_asr_recv_id = 0 
+        print("AI_client_asr_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    #ASR开始会话
+    def AI_client_asr_start_requset(self):
+        
+        json_data = \
+        { 
+            "header":{
+                "event":"StartTranscription",
+                "trace_id":self.get_trace_id()
+                },
+            "payload":{
+                "format":"pcm",
+                "sample_rate":self.VC_record_samplerate,
+                }
+            
+        }
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["format"]='amr'
+            pass
+        # if self.VC_mode == 1:
+        #     json_data["payload"]["voice_detection"]='disable'
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    #ASR终止
+    def AI_client_asr_StopTranscription_requset(self):   
+        json_data = \
+        {
+            "header":{
+                "event":"StopTranscription",
+                "trace_id":self.get_trace_id()
+                }
+        }
+
+        self.AI_client_asr_send(ujson.dumps(json_data))
+    
+     #开始录音
+    def VC_Speech_Start(self):
+        #self.voice_chat_state =  VC_State_SpeechStart
+        print("VC_Speech_Start VC_record_state_flag:{} self.AI_ASR_flag:{}!!!!!!!!".format(self.VC_record_state_flag,self.AI_ASR_flag))  
+        if self.AI_ASR_flag  != 0:
+            return
+        if self.VC_record_state_flag  == 0:
+            self.AI_client_asr_start_requset()#开始请求
+            if self.VC_record_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.VC_record_thread_id)
+                except Exception as e:
+                        usys.print_exception(e)
+                self.VC_record_thread_id = 0
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.VC_record_thread_id = _thread.start_new_thread(self.VC_record_thread,())
+            _thread.stack_size(8*1024)
+            print("self.VC_record_thread_id:{}".format(self.VC_record_thread_id))
+            if self.VC_record_TYPE == VC_record_TYPE_AMR :
+                try :
+                    self.record.stream_start(audio.Record.AMRNB, self.VC_record_samplerate, 0)
+                except Exception as e:
+                        usys.print_exception(e)
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+                self.record.stream_start(audio.Record.WAV, self.VC_record_samplerate, 0)
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+                # if self.record_pcm == None:        
+                #     ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                #     print("audio.Audio.PCM:ret:{}".format(ret))
+                #     ret = self.record_pcm.stream_read_start()
+                #     print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+            self.VC_record_state_flag = 1
+    #停止录音
+    def VC_Speech_End(self):
+        try:
+            self.AI_ASR_flag = 0
+            self.AI_client_asr_StopTranscription_requset()#请求停止
+            if self.VC_record_TYPE == VC_record_TYPE_AMR:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+            elif self.VC_record_TYPE == VC_record_TYPE_PCM:
+                self.record.stream_stop()
+                self.record.stop()#关闭录音
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                for i in range(10):
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    print("Record_len:!!!!!!{}".format(Record_len))
+                    if Record_len <= 0:
+                        break
+                # if self.record_pcm != None:
+                #     try:
+                #         self.record_pcm.stream_stop()
+                #         self.record_pcm.close()
+                #         self.record_pcm = None
+                #     except Exception as e:
+                #         usys.print_exception(e)
+        except Exception as e:
+            usys.print_exception(e)
+        if self.VC_record_thread_id != 0:
+            try:
+                _thread.stop_thread(self.VC_record_thread_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.VC_record_thread_id = 0
+        
+        self.VC_record_state_flag = 0
+        print("VC_Speech_End VC_record_state_flag:{}!!!!!!!!".format(self.VC_record_state_flag))   
+    #获取录音数据
+    def VC_record_thread(self):
+        ##return
+        print("VC_record_thread start!!!!!!!!!!!!!!!!!!!!\r\n")
+        count = 0
+        # try:
+        #     uos.remove('/usr/test.pcm')
+        # except Exception as e:
+        #     usys.print_exception(e)
+        #record_data_queue = Queue(100)
+        #fd = open('/usr/test.pcm','w')
+        # if self.VC_record_TYPE == 1:
+        #     h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+        #     h_data_b = bytes(h_data)
+        #     self.AI_client_voice_chat_send(h_data_b)
+        
+        count = 0
+        while True:
+            try:
+                
+                # 死循环接收数据
+                #if self.voice_chat_state ==  VC_State_SpeechStart:
+                Record_read_buf = bytearray(self.Audio_buf_size)
+                
+                Record_len = 0
+                if self.VC_record_TYPE == VC_record_TYPE_PCM:#pcm
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(20)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(600)
+
+                #Record_len = 1024*2
+                #print("VC_record_thread:{}".format(Record_len))
+                if Record_len > 0:
+                    read_buf = bytes(Record_read_buf[:Record_len])
+                    if self.record_fd != None:
+                        self.record_fd.write(read_buf)
+                    self.AI_client_asr_send(read_buf)
+                    
+                    # if self.voice_chat_state !=  VC_State_SpeechStart:#没发送前先存起来
+                    #     self.AI_record_tmp_queue.put(read_buf)
+                    # else:
+                    #     while True:
+                    #         if self.AI_record_tmp_queue.empty() == True:
+                    #             break
+                    #         else:
+                    #             self.AI_client_voice_chat_send(self.AI_record_tmp_queue.get())  #发送之前存的数据
+                    #     self.AI_client_voice_chat_send(read_buf)   
+                    #print("VC_record_thread:{}".format(len(read_buf)))
+                    count+=len(read_buf)
+                # if count>=500*1024:#结束
+                #     self.AI_client_voice_chat_end_speech()
+                #     break
+                utime.sleep_ms(40)
+                # if self.voice_chat_state >=  VC_State_SpeechEnd:
+                #     break
+                count+=1
+                if count %10 == 0:
+                    print("VC_record_thread on line {} asr recv :{} send:{}".format(Record_len,_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_send_data_queue_thread_id)))
+            except Exception as e:
+                    usys.print_exception(e)
+                    #break
+
+        #fd.close()
+        print("VC_record_thread:exit")
+        self.VC_record_thread_id = 0#线程退出
+###################################################### VC ###################################################################################
+    def websocket_connect_voice_chat(self):
+        print("websocket_connect_voice_chat:{}!!!!!!!!!!!!!!!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        if self.AI_client_voice_chat_isconnect == 1:
+            return
+        # 创建VC客户端
+        try:
+            signal = net.csqQueryPoll()
+            if signal == -1 or sim.getStatus() != 1:#网络正常
+                self.websocket_error()
+                return
+            # Headers = {'X-NLS-Token':'0c8b8f05a46f423096be64a9c4c46310'}
+            # self.AI_client_voice_chat = uwebsocket.Client.connect('wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1',headers=Headers, debug=False)
+            if self.VC_server == 1:# 
+                self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws', debug=False)#测试环境
+            elif self.VC_server == 2:# 
+                if self.VC_TTS_voice_num <= 2:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+                elif self.VC_TTS_voice_num == 3:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-hk', debug=False)#粤语测试环境
+                elif self.VC_TTS_voice_num == 4:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn-sc', debug=False)#四川话测试环境
+                else :
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://118.145.158.207:22080/voice-chat/ws?is_auth=0&platform=raisound&lang=zh-cn', debug=False)#普通话测试环境
+            else:
+                token = EventMesh.publish("get_dev_token")
+                print("token:{}".format(token))
+                if token != None:
+                    self.AI_client_voice_chat = uwebsocket.Client.connect('ws://amp.raisound.com/voice-chat/ws?dt={}'.format(token), debug=False)
+                else:
+                    self.websocket_error()
+                    return
+        except Exception as e: #网络连接异常
+            usys.print_exception(e)
+            print("websocket_connect_voice_chat error!!!\r\n")
+            #self.connect_timerout_popup(2)
+            self.websocket_error()
+            return
+        print("AI_client_voice_chat:{}".format(self.AI_client_voice_chat))
+        if self.AI_client_voice_chat == None:
+            EventMesh.publish("update_dev_token")#获取token
+            self.websocket_error()
+            return
+        utime.sleep_ms(20)
+        # 线程接收数据
+        if self.AI_client_voice_chat_recv_id != 0:
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                    usys.print_exception(e)
+            self.AI_client_voice_chat_recv_id = 0
+        _thread.stack_size(self.Audio_buf_size+8*1024)
+        self.AI_client_voice_chat_recv_id = _thread.start_new_thread(self.AI_client_voice_chat_recv, (self.AI_client_voice_chat,))
+        _thread.stack_size(8*1024)
+        self.AI_client_voice_chat_isconnect = 1
+    def websocket_error(self):
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        print("websocket_error!!!!")
+        self.websocket_error_count+=1
+        if self.websocket_error_count <=3:
+            EventMesh.publish("audio_montage_play",["xinhaoruo1.mp3"])
+        elif self.websocket_error_count <10 :
+            EventMesh.publish("audio_montage_play",["xinhaoruo2.mp3"])
+        elif self.websocket_error_count >=10:
+            EventMesh.publish("paly_iccid_imei")    
+        else:
+            EventMesh.publish("audio_montage_play",["R_SIM_FAILE.mp3"])
+        #self.aud.play(1,1,'U:/static/R_SIM_FAILE.mp3')
+        self.AI_send_data_queue.clear()
+        self.AI_audio_queue.clear()
+        #self.VC_Speech_End()
+        EventMesh.publish("close_led")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+                usys.print_exception(e)
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+                usys.print_exception(e)
+
+    def websocket_deconnect_voice_chat(self):
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+        print("websocket_deconnect_voice_chat!!!!!!!")
+        if self.AI_client_voice_chat_recv_id != 0:#关闭线程
+            try:
+                _thread.stop_thread(self.AI_client_voice_chat_recv_id)
+            except Exception as e:
+                usys.print_exception(e)
+        self.AI_client_voice_chat_recv_id = 0
+        if self.AI_client_voice_chat_isconnect == 1:
+            self.AI_client_voice_chat_isconnect = 0
+            self.AI_client_voice_chat.close()
+        print("websocket_deconnect_voice_chat {}!!!!!!!".format(self.AI_client_voice_chat_isconnect))
+    #websocket发送ping
+    def AI_client_voice_chat_ping(self):
+        pass
+        if self.AI_client_voice_chat_isconnect == 1:
+            #self.AI_client_voice_chat.write_frame(0x09,b'ping ping')
+            self.AI_client_voice_chat_send("ping")
+            #print("websocket ping ping")
+
+    #websocket发送数据    
+    def AI_client_voice_chat_send(self,data_str):
+        if isinstance(data_str, str):#是字符串
+            print("AI_client_voice_chat_send:{}".format(data_str))
+            pass
+        # else:
+        #     print("AI_client_voice_chat_send:len{}".format(len(data_str)))
+        self.AI_send_data_queue.put([AI_client_voice_chat_num,data_str]) 
+    
+    #Ai VC websocket返回数据       
+    def AI_client_voice_chat_recv(self,cli):
+        count = 0
+        while True:
+            try:
+                # 死循环接收数据
+                count+=1
+                if self.tts_in_data_len - self.tts_out_data_len > 64*1024 or count>4:
+                    count = 0
+                    utime.sleep_ms(1)
+                recv_data = cli.recv()
+                self.close_timerout = 0#服务器有返回清零退出时间
+                if not recv_data:
+                    # 服务器关闭连接或客户端关闭连接
+                    print("服务器主动关闭连接!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+                    #self.AI_client_voice_chat_isconnect = 0
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error}) 
+                    #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                    
+                    break
+                try:
+                    self.websocket_error_count = 0
+                    if isinstance(recv_data, str):#返回的是字符串
+                        print("VC VC:recv_data:{}".format(recv_data))
+                        jsload_data =  ujson.loads(recv_data)
+                        #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))
+                        if jsload_data["status"] != 20000000:#返回错误
+                            self.websocket_error()
+                            break
+                        if jsload_data["event"] == "Started" :#会话开始
+                            payload = jsload_data["payload"]
+                            self.VC_dialog_id = payload["dialog_id"] 
+                            self.VC_task_id = jsload_data["task_id"] 
+                            print("VC:Started!!!!!!!!\r\n")
+                        elif jsload_data["event"]  == "SpeechContent" :#asr转译
+                            print("VC:SpeechContent!!!!!!!!\r\n")
+                            payload = jsload_data["payload"]
+                            
+                            
+                            if(payload['finished'] == True):#asr结束
+                                self.voice_chat_state =  VC_State_SpeechEnd
+                                #self.VC_Speech_End()#停止录音
+                                text = payload["text"]
+                                if self.check_text(text) == 0:
+                                    #print("check_text ok:{} self.VC_TTS_voice_num:{},{}".format(text,self.VC_TTS_voice_num,self.VC_TTS_voice_type[self.VC_TTS_voice_num]))
+                                    self.AI_send_data_queue.clear()
+                                    EventMesh.publish("open_led_all")
+                                    try:
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_deconnect_voice_chat}) 
+                                        #EventMesh.publish("publish_AI_btnInfo",{"func":utime.sleep_ms,'data':(1500)})
+                                        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_VC_start}) 
+                                    except Exception as e:
+                                        usys.print_exception(e)
+                                
+                                pass
+                            else:
+                                self.AI_listen_end = 0
+
+                        elif jsload_data["event"]  == "SpeechEnded" :#服务器下发ASR说话结束
+                            self.voice_chat_state =  VC_State_SpeechEnd
+                        elif jsload_data["event"]  == "RespondingContent" :#chat回答      
+                            pass
+                            # payload = jsload_data["payload"]
+
+                            # if(payload['finished'] == True):#chat回答 结束,开始tts
+                            #     self.AI_client_chat_end_flag = 1
+                            #     pass
+                            # else:
+                                
+                            #     self.AI_client_chat_end_flag = 0
+                            #     self.AI_client_tts_data_len = 0
+                            #utime.sleep_ms(5)
+                            
+                        elif jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.play_flag = 0
+                            self.voice_chat_state = VC_State_TTSStart
+                            self.VC_Speech_End()#停止录音
+                            self.VC_Play_Start()
+                            #self.tts_fd = open('/usr/tts_tesr.pcm','w')
+                            pass
+                        elif jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            #if self.voice_chat_state == VC_State_TTSStart:
+                                print("RespondingEnded!!!!!!" )
+                                self.voice_chat_state = VC_State_TTSEnd
+                                if self.asr_satrt_flag == 0 :
+                                    self.asr_satrt_flag =1
+                            #self.tts_fd.close()
+                            #pass
+                        elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
+                            payload = jsload_data["payload"]
+                            if payload["state"] == "Listening":
+                                self.voice_chat_state = VC_State_Listening
+                                if self.AI_TTS_str != "" or self.AI_ASR_str != "":#有tts数据,则请求TTS数据,没有就请求开始上传语音
+                                    self.AI_client_voice_chat_RequestToRespond()
+                                else:
+                                    self.VC_Speech_Start()#开启线程获取录音数据
+                                    #self.AI_client_voice_chat_send_speech()#开始上传语音
+                                #self.AI_client_voice_chat_RequestToRespond()#chat请求或者tts请求
+                                EventMesh.publish("open_led_red")
+                            if payload["state"] == "Thinking":#准备开始TTS
+                                self.voice_chat_state = VC_State_Thinking
+                                
+                                self.AI_client_tts_data_total_len = 0
+                                EventMesh.publish("open_led_all")
+                            if payload["state"] == "Responding":
+                                self.voice_chat_state = VC_State_Responding
+                                EventMesh.publish("open_led_green")
+                        elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
+                            #self.voice_chat_state =  VC_State_Responding
+                            #self.AI_client_voice_chat_send_speech()#开始上传语音
+                            pass
+                    else:#下发音频数据
+                        #填充头
+                        #self.tts_fd.write(recv_data)
+                        #recv_data_len = len(recv_data)
+                        # data_len_b = recv_data_len.to_bytes(4,'little')#数据长度转16进制数组
+                        # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                        #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                        #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                        #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                        # h_data_b = bytes(h_data)
+                        # file_len = recv_data_len+len(h_data_b)+4+4
+                        # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                        # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+
+                        #print("下发音频数据1:{}".format(len(recv_data)))
+                        # # self.AI_client_tts_data_total_len += len(recv_data)
+                        # # self.AI_client_tts_data_len += len(recv_data)
+                        # #if self.AI_client_tts_data_total_len >10*1024:
+                        # ret=self.AI_audio_queue.put([recv_data,""])
+                        # print("下发音频数据2:{}".format(len(recv_data)))
+                        if self.voice_chat_state >= VC_State_TTSStart:
+                            self.put_record_data([recv_data,""])
+                        #EventMesh.publish("publish_AI_btnInfo",{"func":self.put_record_data,"data":[recv_data,""]}) 
+                except Exception as e:
+                    usys.print_exception(e)
+                
+            except Exception as e:
+                    usys.print_exception(e)
+                    #self.websocket_error()
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_error})#
+                    break
+        self.AI_client_voice_chat_isconnect = 0
+        self.AI_client_voice_chat_recv_id = 0 
+        print("AI_client_voice_chat_recv END!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+    def put_record_data(self,data):
+        #print("下发音频数据1:{}".format(len(data[0])))
+        # self.AI_client_tts_data_total_len += len(recv_data)
+        # self.AI_client_tts_data_len += len(recv_data)
+        #if self.AI_client_tts_data_total_len >10*1024:
+        ret=self.AI_audio_queue.put(data)
+        self.tts_in_data_len += len(data[0])
+        print("下发音频数据2:{},{}".format(len(data[0]),self.tts_in_data_len))
+    def check_text(self,text):
+        if len(text)>60:
+            return -1
+        try:
+            if isinstance(text, str): 
+                if text.find("更改声音") != -1:
+                    self.VC_TTS_voice_num += 1
+                    if self.VC_TTS_voice_num >= len(self.VC_TTS_voice_type):
+                        self.VC_TTS_voice_num = 0
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功"    
+                    return 0
+                if text.find("声音改为") != -1 and (text.find("男声") != -1 or text.find("男生") != -1 ):
+                    self.VC_TTS_voice_num = 1
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("女声") != -1 or text.find("女生") != -1 ):
+                    self.VC_TTS_voice_num = 0
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("同声") != -1 or text.find("童声") != -1 ):
+                    self.VC_TTS_voice_num = 2
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and  (text.find("粤语") != -1 or text.find("越野") != -1 ):
+                    self.VC_TTS_voice_num = 3
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("声音改为") != -1 and text.find("四川话") != -1 :
+                    self.VC_TTS_voice_num = 4
+                    
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_TTS_voice_num])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+                    self.AI_TTS_str = "更改成功" 
+                    return 0
+                if text.find("切换对话模式") != -1:
+                    if self.VC_mode == 0:
+                       self.VC_mode = 1
+                       self.AI_TTS_str = "已切换到单对话模式" 
+                    else:
+                        self.VC_mode = 0 
+                        self.AI_TTS_str = "已切换到长对话模式" 
+                    EventMesh.publish("set_storage_config",["VC_TTS_voice_num",self.VC_mode])
+                    # EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                    #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+                    return 0
+                if text.find("音量") != -1 and text.find("加") != -1 :
+                    self.VC_TTS_volume += 10
+                    if self.VC_TTS_volume > 100:
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuida.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuida.mp3')#音量已最大
+                        self.AI_TTS_str = "音量已最大" 
+                        self.VC_TTS_volume = 100
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                        
+                    return 0
+                if text.find("音量") != -1 and text.find("减") != -1:
+                    self.VC_TTS_volume -= 10
+                    if self.VC_TTS_volume < 0:
+                        self.VC_TTS_volume = 0
+                        #EventMesh.publish("audio_montage_play",["yinliangyizuixiao.mp3"])
+                        #self.aud.play(1,0,'U:/static/yinliangyizuixiao.mp3')#音量已最小
+                        self.AI_TTS_str = "音量已最小"
+                    else:
+                        self.aud.setVolume(self.VC_TTS_volume //10)
+                        EventMesh.publish("set_storage_config",["VC_TTS_volume",self.VC_TTS_volume])
+                        #EventMesh.publish("audio_montage_play",["peizhichenggong.mp3"])
+                        #self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#配置成功
+                        self.AI_TTS_str = "配置成功,当前音量 {}".format(self.VC_TTS_volume)
+                    return 0
+                if text.find("电量") != -1 and text.find("查询") != -1:
+                    battery = EventMesh.publish("get_battery")
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "电量剩余百分之{}".format(battery)
+                    return 0
+                if text.find("电压") != -1 and text.find("查询") != -1:
+                    Vbatt = Power.getVbatt()
+                    #EventMesh.publish("audio_montage_play",["dianliangshengyu{}.mp3".format(battery)])
+                    #self.aud.play(1,0,'U:/static/dianliangshengyu{}.mp3'.format(battery))#电量剩余
+                    self.AI_TTS_str = "当前电池电压{}".format(Vbatt)
+                    return 0
+                if text.find("进入工厂模式") != -1 :
+                    self.factory_mode()
+                    return 1
+                if text.find("信号") != -1 and text.find("查询") != -1:
+                    signal = net.csqQueryPoll()
+                    
+                    self.AI_TTS_str = "当前信号{}".format(signal)
+                    return 0
+                
+                if text.find("再见") != -1 or text.find("拜拜") != -1:
+                    EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+                    return 1
+        except Exception as e:
+                usys.print_exception(e)
+        return -1
+    #获取trace_id
+    def get_trace_id(self):
+        t = utime.mktime(utime.localtime())
+        t = t*1000+urandom.randint(0, 1000)
+        md5_data = "{}".format(t)#md5签名
+        sign_data = ""
+        hash_obj = uhashlib.md5(md5_data)
+        res = hash_obj.digest()
+
+        # 转成十六进制表示
+        sign_data = ubinascii.hexlify(res)
+        sign_data = sign_data.decode('ascii')
+        return sign_data
+    def get_new_message_id(self):
+        message_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_message_id=message_id[:32]
+        return self.VC_message_id 
+    def get_new_task_id(self):
+        task_id = self.get_trace_id()+"aaa"+self.get_trace_id()
+        self.VC_task_id=task_id[:32]
+        return self.VC_task_id
+    #开始播放声音
+    def VC_Play_Start(self):
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                pass
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm == None:        
+                    self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                    #self.play_pcm.setVolume(11)
+                    ret = self.play_pcm.stream_write_start()
+                    print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            pass
+    #停止播放声音
+    def VC_Play_End(self):
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            if self.VC_play_samplerate == 8000:
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+            elif self.VC_play_samplerate == 16000:
+                if self.play_pcm != None:
+                    print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.play_pcm.stream_stop()
+                        self.play_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.play_pcm=None
+                self.aud.stopPlayStream()
+                self.aud.stopAll()
+        elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+            self.aud.stopPlayStream()
+            self.aud.stopAll()
+   
+    def _1S_timer_cb(self,*argc):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.close_timerout += 1
+        if self.close_timerout > 30:#20秒没数据就close
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        # print("get_audio_state !!!!!{} {} {}\r\n".format(self.play_end,EventMesh.publish("get_audio_state"),self.play_flag))
+        #self.LocalRespondingEnded_timerout+=1
+        if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty()  :#self.AI_audio_queue为空且tts下发结束
+            self.LocalRespondingEnded_timerout += 1
+        if self.LocalRespondingEnded_timerout >= 3:
+            self.LocalRespondingEnded_timerout = 0
+            if self.VC_mode == 1 :#长按单次问答模式
+                EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+            else:
+                #通知服务器播放结束
+                self.AI_client_voice_chat_LocalRespondingEnded()
+        self.pingping_timerout+=1
+        if self.pingping_timerout>5:
+            self.pingping_timerout=0
+            self.AI_client_voice_chat_ping()
+        
+    #VC开始
+    def AI_VC_start(self):
+        
+        self.VC_Play_End()#关闭音频播放
+        
+        #self.aud.aud_tone_play(16,200)#播放按键音
+        self.LocalRespondingEnded_timerout = 0
+        self.close_timerout = 0
+        self.websocket_connect_asr()
+        if self.AI_client_asr_isconnect == 0:
+            return
+        if self.record_data_save_flag == 1:
+            try:
+                uos.remove('/usr/record_data.pcm')
+            except Exception as e:
+                usys.print_exception(e)
+            self.record_fd = open('/usr/record_data.pcm','w')
+        #utime.sleep_ms(50)
+        if self.AI_client_voice_chat_isconnect == 0:#没连接的时候请求开始
+            self.websocket_connect_voice_chat()#连接服务器
+            self.AI_client_voice_chat_start_requset()
+        else:
+            print("self.voice_chat_state :{}".format(self.voice_chat_state ))
+            if self.voice_chat_state > VC_State_SpeechStart:
+                #客户端打断对话
+                print("打断对话")
+                self.AI_client_voice_chat_RequestToSpeak()
+            elif self.voice_chat_state == VC_State_Listening:
+                #直接chat
+                print("直接chat")
+                self.AI_client_voice_chat_RequestToRespond()
+        if self.AI_client_voice_chat_isconnect == 0:
+            return
+        self.voice_chat_state = VC_State_None
+        if self.AI_TTS_str == "":#没有tts要播放的时候才开始录音
+            #开始asr录音
+            self.VC_Speech_Start()
+            pass
+        #开始线程
+        if self.AI_audio_queue_thread_id ==0:
+            _thread.stack_size(24*1024)
+            self.AI_audio_queue_thread_id = _thread.start_new_thread(self.AI_audio_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_audio_queue_thread_id :{} ".format(self.AI_audio_queue_thread_id))
+        else:
+            print("AI_VC_start :AI_audio_queue_thread_id != 0 ")
+        if self.AI_send_data_queue_thread_id == 0:    
+            _thread.stack_size(self.Audio_buf_size+8*1024)
+            self.AI_send_data_queue_thread_id = _thread.start_new_thread(self.AI_send_data_queue_thread, ())
+            _thread.stack_size(8*1024)
+            print("AI_VC_start :AI_send_data_queue_thread_id :{} ".format(self.AI_send_data_queue_thread_id))
+        self._1S_timer.start(1000,1,self._1S_timer_cb)
+        self.pingping_timerout = 0
+        
+        
+    #开始会话
+    def AI_client_voice_chat_start_requset(self):
+        
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"Start"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "device_id":modem.getDevImei(),
+                "user_agent":"python",
+                "in_format":"pcm",
+                "out_format":"mp3",
+                "in_sample_rate":self.VC_record_samplerate,
+                "sample_rate":self.VC_play_samplerate,
+                "space_time": 150,
+                "volume": str(self.VC_TTS_volume),
+                "voice":self.VC_TTS_voice_type[self.VC_TTS_voice_num],
+                "voice_detection":"enabled",
+                "simple_response":True,
+                "custom_variables":{
+                    "bot_name":"{}".format(self.bot_name)
+                }
+                },
+            
+        }
+        if self.VC_play_TYPE == VC_play_TYPE_PCM:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == VC_record_TYPE_AMR :
+            json_data["payload"]["in_format"]='amr'
+            pass
+        if self.VC_mode == 1:
+            json_data["payload"]["voice_detection"]='disable'
+        self.voice_chat_state = VC_State_None
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+ 
+    #开始上传语音
+    def AI_client_voice_chat_send_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"SendSpeech"
+                },
+            "payload":
+            {
+                "dialog_id":self.VC_dialog_id
+            }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_Start()#开启线程获取录音数据
+        self.voice_chat_state =  VC_State_SpeechStart
+    #结束上传语音
+    def AI_client_voice_chat_end_speech(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"StopSpeech"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.VC_Speech_End()#停止线程录音
+
+    #通知服务器开始播放
+    def AI_client_voice_chat_LocalRespondingStarted(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingStarted"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        self.AI_client_voice_chat_send(ujson.dumps(json_data))
+    #通知服务器播放结束
+    def AI_client_voice_chat_LocalRespondingEnded(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"LocalRespondingEnded"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+        # self.AI_client_voice_chat_send(ujson.dumps(json_data))
+        self.voice_chat_state = VC_State_End
+    #客户端打断对话
+    def AI_client_voice_chat_RequestToSpeak(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToSpeak"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id
+                }
+        }
+        print("AI_client_voice_chat_RequestToSpeak!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+        # utime.sleep_ms(1)
+    #请求TTS或者chat事件
+    def AI_client_voice_chat_RequestToRespond(self):
+        json_data = \
+        {
+            "header":{
+                "trace_id":self.get_trace_id(),
+                "event":"RequestToRespond"
+                },
+            "payload":{
+                "dialog_id":self.VC_dialog_id,
+                "type":"transcript",#prompt是跳过asr,transcript是跳过asr和大模型
+                "text":""
+                }
+        }
+
+        print("AI_client_voice_chat_RequestToRespond!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_TTS_str != "":
+            json_data["payload"]["text"] = self.AI_TTS_str
+            json_data["payload"]["type"] = "transcript"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)}) 
+            self.AI_TTS_str = ""
+        elif self.AI_ASR_str != "":
+            json_data["payload"]["text"] = self.AI_ASR_str
+            json_data["payload"]["type"] = "prompt"
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.VC_init}) 
+            EventMesh.publish("publish_AI_btnInfo",{"func":self.AI_client_voice_chat_send,"data":ujson.dumps(json_data)})
+            self.AI_ASR_str = ""
+        # utime.sleep_ms(1)
+    #发送数据队列
+    def AI_send_data_queue_thread(self):
+        print("AI_send_data_queue_thread:start")
+        count_t = 0
+        while True:
+            if self.AI_send_data_queue.empty() :#不能去掉,去掉会卡死
+                count_t+=1
+                # if count_t%200 == 0:
+                #     print("self.AI_send_data_queue.empty")
+                utime.sleep_ms(1)
+            else:
+                #data[0]是websocket连接对象编号,data[1]是数据
+                #print("AI_send_data_queue_thread:get")
+                data = self.AI_send_data_queue.get()
+                #print("AI_send_data_queue_thread:num{} len{}".format(data[0],len(data[1])))
+                if data != None:
+                    try:
+                        #data["func"](data["data"])
+                        # 发送数据
+                        #bytes_data = bytes(data[1])
+                        #data[0].send(data[1])
+                        #print("AI_send_data_queue_thread:len:{}".format(len(data[1])))
+                        #print("AI_send_data_queue_thread on line asr recv :{} vc recv:{}".format(_thread.threadIsRunning(self.AI_client_asr_recv_id),_thread.threadIsRunning(self.AI_client_voice_chat_recv_id)))
+                        if data[0] == AI_client_voice_chat_num:
+                            # if self.AI_client_voice_chat_isconnect == 0:
+                            #     try:
+                            #         self.websocket_connect_voice_chat() 
+                            #     except Exception as e: #网络连接异常
+                            #         usys.print_exception(e)
+                            self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_voice_chat != None and self.AI_client_voice_chat_isconnect == 1:
+                                self.AI_client_voice_chat.send(data[1])
+                            #print("VC: send_data end")
+
+                        if data[0] == AI_client_asr_num:
+                            #self.pingping_timerout = 0
+                            #print("VC: send_data len:{}".format(len(data[1])))
+                            if self.AI_client_asr != None and self.AI_client_asr_isconnect == 1:
+                                self.AI_client_asr.send(data[1])
+                        #print("VC: send_data end")
+                    except Exception as e:
+                        print("DeviceInfo_queue_thread:ERROR:{}".format(e))
+                        usys.print_exception(e)
+                        if data[0] == AI_client_voice_chat_num:
+                            #self.websocket_error()
+                            pass
+                            #self.websocket_deconnect_voice_chat()
+                            self.AI_client_voice_chat_isconnect = 0
+                            try:
+                                self.websocket_error()
+                                #self.websocket_deconnect_voice_chat()
+                            except Exception as e: #网络连接异常
+                                usys.print_exception(e)
+                        if data[0] == AI_client_asr_num: 
+                            EventMesh.publish("publish_AI_btnInfo",{"func":self.websocket_connect_asr}) #重连
+                         
+    ############################################
+    # 音频队列        
+    def AI_audio_queue_thread(self):
+        print("AI_audio_queue_thread start")
+        count = 0
+        while True:
+            try:
+                # if self.AI_send_data_queue_thread_id == 0:
+                #     break
+                # print("AI_audio_queue_thread")
+                if self.AI_audio_queue.empty() :
+                    utime.sleep_ms(1)
+                    count+=1
+                    if count%5000 == 1:
+                        print("AI_audio_queue_thread on")
+                else:
+                    data = self.AI_audio_queue.get()
+                    self.close_timerout = 0
+                    if self.play_flag == 0:
+                        self.play_flag =1
+                        print("AI_client_voice_chat_LocalRespondingStarted!!!")
+                        self.AI_client_voice_chat_LocalRespondingStarted()#通知服务器开始播放
+                    #self.AI_client_tts_data_len=len(data)
+                    print("\r\naudio_queue:len:{},data{}".format(len(data[0]),len(data[1])))
+                    if len(data[0]) > 10:
+                        try:
+                            if self.VC_play_TYPE == VC_play_TYPE_PCM:
+                                if self.VC_play_samplerate == 8000:
+                                    tmp= self.aud.playStream(1,data[0] )
+                                elif self.VC_play_samplerate == 16000:
+                                
+                                
+                                    
+                                    write_buf = bytearray(data[0])
+                                    #print("play_pcm.stream_write1!!")
+                                    if self.play_pcm != None:
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        self.tts_out_data_len += ret
+                                        print("play_pcm.stream_write:{}".format(self.tts_out_data_len))
+                            elif self.VC_play_TYPE == VC_play_TYPE_MP3:
+                                tmp= self.aud.playStream(3, data[0])#播放音频流
+                                
+                                if tmp != 0:
+                                    print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    # # #播放失败的时候填充WAV头
+                                    # data_len = len(data[0])
+                                    # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                    # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                    #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                    #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                    #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                    # h_data_b = bytes(h_data)
+                                    # file_len = data_len+len(h_data_b)+4+4
+                                    # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                    # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                    # #self.aud.playStream(2, h_data_b)#播放音频流
+                                    # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                    # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
+                            
+                            #print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
+                            mem = gc.mem_free()
+                            #print('1剩余内存RAM:{} KB'.format(mem / 1024))
+                        except Exception as e:
+                            print("AI_audio_queue_thread:ERROR:")
+                            usys.print_exception(e)
+                    
+                    # if self.voice_chat_state == VC_State_TTSEnd and self.AI_audio_queue.empty() :#self.AI_audio_queue为空且tts下发结束
+                    #     #通知服务器播放结束
+                    #     self.AI_client_voice_chat_LocalRespondingEnded()
+            except Exception as e:
+                print("AI_audio_queue_thread:ERROR:")
+                usys.print_exception(e)
+        #print("AI_audio_queue_thread:exit")
+    def factory_mode(self):
+        print("factory_mode")
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.Close}) 
+        EventMesh.publish("publish_AI_btnInfo",{"func":self.factory_start}) 
+    def factory_start(self):
+        self.factory_timer.start(1000, 1, self.factory_timer_cb)
+    def factory_timer_cb(self, *args, **kwargs):
+        print("factory_timer_cb play......")
+        self.aud.play(1,0,'U:/static/peizhichenggong.mp3')#切换成功
+
+    def Close(self):
+        print("ai_VC Close1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.tts_in_data_len = 0
+        self.tts_out_data_len = 0
+        
+        print("ai_VC Close1.1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        self.VC_init()
+        self.VC_Speech_End()
+        print("ai_VC Close1.2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        self.AI_TTS_str = ""
+        self.AI_ASR_str = ""
+        self.AI_ASR_str_tmp = ""
+        self.AI_ASR_flag  = 0
+        print("ai_VC Close1.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+        #销毁线程
+            if self.AI_audio_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_audio_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+                self.AI_audio_queue_thread_id = 0
+            if self.AI_send_data_queue_thread_id != 0:
+                try:
+                    _thread.stop_thread(self.AI_send_data_queue_thread_id)
+                except Exception as e:
+                    usys.print_exception(e)
+            self.AI_send_data_queue_thread_id = 0
+            
+
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        try:
+            self.websocket_deconnect_asr()
+        except Exception as e:
+            usys.print_exception(e)
+        self._1S_timer.stop()
+        self.factory_timer.stop()
+        
+        if self.record_data_save_flag == 1:
+            if self.record_fd :
+                self.record_fd.close()
+            self.record_fd = None
+    def VC_init2(self):
+        self.VC_init()
+        if self.AI_send_data_queue.empty()!=True:
+            self.AI_send_data_queue.clear()
+        print("ai_VC VC_init2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+        try:
+            self.websocket_deconnect_voice_chat()
+        except Exception as e:
+            usys.print_exception(e)
+        print("ai_VC Close3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\r\n")
+        self._1S_timer.stop()
+
+
+    def VC_init(self):
+        
+        print("VC_init:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
+        if self.AI_audio_queue.empty()!=True:
+            self.AI_audio_queue.clear()
+        
+        print("VC_init2")
+        #self.VC_Speech_End()
+        print("VC_init3")
+        self.VC_Play_End()
+        print("VC_init4")
+        
+        EventMesh.publish("close_led")
+        # num = EventMesh.publish("get_volum_size")
+        # if num == None:
+        #     num = 8
+        # self.aud.setVolume(num)#恢复原始音量
+        
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/test.mp3 b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/test.mp3
new file mode 100644 (file)
index 0000000..52644cc
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/services/microPython/ports/quectel/core/usr/test.mp3 differ
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/EG810MCN_GA_VOLTE.mk
new file mode 100644 (file)
index 0000000..1c79156
--- /dev/null
@@ -0,0 +1,23 @@
+# Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+#  
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#  
+#     http://www.apache.org/licenses/LICENSE-2.0
+#  
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+NAME := EG810MCN_GA_VOLTE
+
+GLOBAL_INCS = include
+
+$(NAME)_ARCHIVES = \
+       libraries/libHeliosAPI.lib \
+       libraries/ql_common_api.lib
+
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/autoconf.h
new file mode 100644 (file)
index 0000000..7cb99e9
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *
+ * Automatically generated file; DO NOT EDIT.
+ * Helios SDK Configuration
+ *
+ */
+
+
+#define PROJECT_NAME_G3_7PIN  1  //项目宏定义
+
+
+// #define CONFIG_LVGL_SPAN 1
+// #define CONFIG_LVGL_FS_HELIOS 1
+// #define CONFIG_LVGL_GIF_DECODE 1
+// #define CONFIG_LVGL_SPINNER 1
+//#define CONFIG_LCD 1
+// #define CONFIG_LVGL_ANIMIMG 1
+// #define CONFIG_LVGL_KEYBOARD 1
+// #define CONFIG_LVGL_CALENDAR 1
+// #define CONFIG_LVGL_LED 1
+#define CONFIG_VIOCE_CALL 1
+// #define CONFIG_LVGL_FS_EXTFLASH_HELIOS 1
+// #define CONFIG_LVGL_TABVIEW 1
+//#define CONFIG_LVGL_LINE 1
+//#define CONFIG_LVGL 1
+// #define CONFIG_LVGL_CHART 1
+// #define CONFIG_LVGL_LIST 1
+// #define CONFIG_LVGL_MSGBOX 1
+// #define CONFIG_LVGL_ARC 1
+// #define CONFIG_LVGL_METER 1
+//#define CONFIG_LVGL_JPG_DECODE 1
+// #define CONFIG_LVGL_PNG_DECODE 1
+// #define CONFIG_LVGL_IMGBTN 1
+//#define CONFIG_GH301x 1
+//#define CONFIG_HX3918 1
+#define CONFIG_MBEDTLS 1
+//#define CONFIG_SC7A20 1
+// #define CONFIG_LVGL_WIN 1
+// #define CONFIG_LVGL_COLORWHEEL 1
+// #define CONFIG_LVGL_CANVAS 1
+// #define CONFIG_LVGL_SPINBOX 1
+// #define CONFIG_LVGL_QRCODE 1
+// #define CONFIG_LVGL_TILEVIEW 1
+// #define CONFIG_LVGL_HANDLER_TASK_PRIORITY 80
+//#define CONFIG_CAMERA 1
+//#define CONFIG_JPEG 1
+#define CONFIG_CAMERA_SAVEPHOTOS 1
+//菊风视频通话
+//#define CONFIG_juphoon 1
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.in
new file mode 100644 (file)
index 0000000..343bad7
--- /dev/null
@@ -0,0 +1,15 @@
+
+mainmenu "Helios SDK Configuration"
+
+menu "System Configuration"
+source "../system/config.in"
+endmenu
+
+menu "EG810MCN_GA_VOLTE"
+source "../services/microPython/config/config.in"
+source "../components/poc/poc_option.in"
+source "../components/GH301x/GH301x_option.in"
+source "../components/SC7A20/SC7A20_option.in"
+source "../components/juphoon/juphoon_option.in"
+endmenu
+
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/config.mk
new file mode 100644 (file)
index 0000000..51c8722
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Helios SDK Configuration
+#
+PROJECT_NAME_G3_7PIN=y
+#
+# System Configuration
+#
+CONFIG_MBEDTLS=y
+
+#
+# EG810MCN_GA_VOLTE
+#
+# CONFIG_LVGL=y
+
+#
+# lvgl option
+#
+# CONFIG_LVGL_PNG_DECODE=y
+# CONFIG_LVGL_GIF_DECODE is not set
+# CONFIG_LVGL_JPG_DECODE=y
+#CONFIG_LVGL_FS_HELIOS=y
+# CONFIG_LVGL_FS_SD_HELIOS is not set
+# CONFIG_LVGL_FS_EXTFLASH_HELIOS=y
+# CONFIG_LVGL_CUSTOMER_FONT_SUPPORT is not set
+# CONFIG_LVGL_QRCODE=y
+# CONFIG_LVGL_FONT is not set
+# CONFIG_LVGL_ARC is not set
+#CONFIG_LVGL_IMGBTN=y
+#CONFIG_LVGL_LINE=y
+#CONFIG_LVGL_LIST=y
+# CONFIG_LVGL_CHART is not set
+# CONFIG_LVGL_LED is not set
+# CONFIG_LVGL_CANVAS=y
+# CONFIG_LVGL_WIN=y
+# CONFIG_LVGL_TABVIEW is not set
+# CONFIG_LVGL_TILEVIEW=y
+# CONFIG_LVGL_MSGBOX=y
+# CONFIG_LVGL_METER is not set
+# CONFIG_LVGL_CALENDAR is not set
+# CONFIG_LVGL_SPINNER is not set
+# CONFIG_LVGL_SPINBOX is not set
+# CONFIG_LVGL_ANIMIMG is not set
+# CONFIG_LVGL_COLORWHEEL is not set
+# CONFIG_LVGL_KEYBOARD=y
+# CONFIG_LVGL_SPAN=y
+# CONFIG_LVGL_HANDLER_TASK_PRIORITY=80
+# CONFIG_QRCODE is not set
+#CONFIG_CAMERA=y
+# CONFIG_CAMERA_DECODE is not set
+CONFIG_CAMERA_SAVEPHOTOS=y
+# CONFIG_QUECTHING is not set
+# CONFIG_SPINAND is not set
+# CONFIG_RTMP is not set
+#CONFIG_JPEG=y
+# CONFIG_SPI_SDCARD is not set
+CONFIG_VIOCE_CALL=y
+# CONFIG_TTS is not set
+#CONFIG_LCD=y
+# CONFIG_UART_SLIP is not set
+# CONFIG_POC is not set
+#CONFIG_GH301x=y
+#CONFIG_HX3918=y
+#CONFIG_SC7A20=y
+
+#CONFIG_juphoon=y
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lcd.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/animimg.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/arc.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/calendar.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/canvas.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/chart.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/colorwheel.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/fs/helios.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/handler/task/priority.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/imgbtn.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/jpg/decode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/keyboard.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/led.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/line.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/list.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/meter.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/msgbox.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/png/decode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/qrcode.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/span.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinbox.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/spinner.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tabview.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/tileview.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/lvgl/win.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/mbedtls.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/include/config/vioce/call.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h
new file mode 100644 (file)
index 0000000..ea734f6
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) Quectel Wireless Solution, Co., Ltd.All Rights Reserved.
+ *  
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *  
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#ifndef __MPCONFIGBOARD_H__
+#define __MPCONFIGBOARD_H__
+
+#define MICROPY_QPY_MODULE_ATCMD            (1)
+#define MICROPY_QPY_MODULE_UOS              (1)
+#define MICROPY_QPY_MODULE_MACHINE          (1)
+#define MICROPY_QPY_MODULE_USOCKET          (1)
+#define MICROPY_QPY_MODULE_MISC             (1)
+#define MICROPY_QPY_MODULE_OSTIMER          (1)
+#define MICROPY_QPY_MODULE_EXAMPLE          (1)
+#define MICROPY_QPY_MODULE_DATACALL         (1)
+#define MICROPY_QPY_MODULE_MODEM            (1)
+#define MICROPY_QPY_MODULE_UTIME            (1)
+#define MICROPY_QPY_MODULE_UTILS            (1)
+#define MICROPY_QPY_MODULE_HMACSHA1         (1)
+#define MICROPY_QPY_MODULE_SMS              (1)
+#define MICROPY_QPY_MODULE_SIM              (1)
+#define MICROPY_QPY_MODULE_DUALSIM          (1)
+#define MICROPY_QPY_MODULE_LPM              (1)
+#define MICROPY_QPY_MODULE_NET              (1)
+#define MICROPY_QPY_MODULE_CELLLOCATOR      (0)
+#define MICROPY_QPY_MODULE_CELLLOCATOR_QPY  (1)
+#define MICROPY_QPY_MODULE_AUDIO            (1)
+#define MICROPY_QPY_MODULE_FOTA             (1)
+#define MICROPY_QPY_MODULE_WIFISCAN         (1)
+#define MICROPY_QPY_MODULE_QUECGNSS         (1)
+#define MICROPY_QPY_MODULE_WIFILOCATOR      (1)
+#define MICROPY_QPY_MODULE_ETHERNET         (0)
+#define MICROPY_QPY_MODULE_SENSOR           (1)
+#define MICROPY_QPY_MODULE_SECUREDATA       (1)
+#define MICROPY_QPY_MODULE_SLIP             (0)
+#define MICROPY_QPY_MODULE_TP               (1)
+#define MICROPY_QPY_MODULE_AUDIOCODEC       (0)
+#define MICROPY_QPY_MODULE_CSD              (0)
+#define MICROPY_QPY_MODULE_LWM2M            (0)
+#define MICROPY_QPY_MODULE_NB               (0)
+#define MICROPY_QPY_MODULE_UHASHLIB         (1)
+#define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)
+#define MICROPY_QPY_MODULE_ALIPAY           (0)
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)
+#define MICROPY_QPY_CAMERA_LVGL_PREVIEW     (1)
+#if CONFIG_MBEDTLS
+    #define MICROPY_QPY_MODULE_USSL         (1)
+    #define MICROPY_QPY_SSL_MBEDTLS         (1)
+#endif
+
+#if CONFIG_QUECTHING
+    #define MICROPY_QPY_MODULE_QUECIOT          (1)
+#else
+    #define MICROPY_QPY_MODULE_QUECIOT          (0)
+#endif
+
+#if CONFIG_LVGL
+    #define MICROPY_QPY_MODULE_LVGL             (1)
+#else
+    #define MICROPY_QPY_MODULE_LVGL             (0)
+#endif
+
+#if CONFIG_CAMERA
+    #define MICROPY_QPY_MODULE_CAMERA           (1)
+#else
+    #define MICROPY_QPY_MODULE_CAMERA           (0)
+#endif
+
+#if CONFIG_RTMP
+    #define MICROPY_QPY_MODULE_RTMP             (1)
+#else
+    #define MICROPY_QPY_MODULE_RTMP             (0)
+#endif
+#if CONFIG_VIOCE_CALL
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (1)
+#else
+    #define MICROPY_QPY_MODULE_VIOCE_CALL       (0)
+#endif
+
+#if CONFIG_POC
+    #define MICROPY_QPY_MODULE_POC              (1)
+#else
+    #define MICROPY_QPY_MODULE_POC              (0)
+#endif
+#if CONFIG_QRCODE
+    #define MICROPY_QPY_MODULE_QRCODE           (1)
+#else
+    #define MICROPY_QPY_MODULE_QRCODE           (0)
+#endif
+
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_BLE_GATT
+    #define MICROPY_QPY_MODULE_BLE              (1)
+#else
+    #define MICROPY_QPY_MODULE_BLE              (0)
+#endif
+
+#ifdef CONFIG_QUEC_PROJECT_FEATURE_CLASSIC_BT
+    #define MICROPY_QPY_MODULE_BT               (1)
+#else
+    #define MICROPY_QPY_MODULE_BT               (0)
+#endif
+
+
+//modmachine
+#if MICROPY_QPY_MODULE_MACHINE
+    #define MICROPY_QPY_MACHINE_TIMER           (1)
+    #define MICROPY_QPY_MACHINE_RTC             (1)
+    #define MICROPY_QPY_MACHINE_WDT             (1)
+    #define MICROPY_QPY_MACHINE_PIN             (1)
+    #define MICROPY_QPY_MACHINE_EXTINT          (1)
+    #define MICROPY_QPY_MACHINE_UART            (1)
+    #define MICROPY_QPY_MACHINE_SPI             (1)
+    #define MICROPY_QPY_MACHINE_I2C             (1)
+    #define MICROPY_QPY_MACHINE_I2C_SOFT        (1)
+    #ifdef CONFIG_LCD
+        #define MICROPY_QPY_MACHINE_LCD             (1)
+#else
+        #define MICROPY_QPY_MACHINE_LCD             (0)
+#endif
+    #define MICROPY_QPY_MACHINE_KEYPAD          (1)
+    #ifdef CONFIG_SPINAND
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (1)
+    #else
+        #define MICROPY_QPY_MACHINE_NANDFLASH       (0)
+    #endif
+
+#if MICROPY_QPY_MACHINE_UART
+       #define MICROPY_QPY_UART4 (1)
+#endif
+
+#endif
+
+#if MICROPY_QPY_MODULE_MISC
+    #define MICROPY_QPY_MISC_POWER              (1)
+    #define MICROPY_QPY_MISC_ADC                (1)
+    #define MICROPY_QPY_MISC_POWERKEY           (1)
+    #define MICROPY_QPY_MISC_TEMPERATURE        (0)
+    #define MICROPY_QPY_MISC_PWM                (1)
+    #define MICROPY_QPY_MISC_USB                (1)
+    #define MICROPY_QPY_MISC_USBNET             (1)
+#endif
+
+#if MICROPY_QPY_MODULE_AUDIO
+    #define MICROPY_QPY_AUDIO_AUDIO             (1)
+    #if CONFIG_TTS
+        #define MICROPY_QPY_AUDIO_TTS               (1)
+    #else
+        #define MICROPY_QPY_AUDIO_TTS               (0)
+    #endif
+    #define MICROPY_QPY_AUDIO_RECORD            (1)
+#endif
+
+#if MICROPY_QPY_MODULE_ETHERNET
+    #define MICROPY_QPY_ETHERNET_DM9051         (0)
+    #define MICROPY_QPY_ETHERNET_W5500          (0)
+#endif
+
+#if MICROPY_QPY_MODULE_TP
+    #define MICROPY_QPY_TP_XPT2046              (0)
+    #define MICROPY_QPY_TP_GT9XX                (0)
+    #define MICROPY_QPY_TP_CST816               (1)
+#endif
+
+#if MICROPY_QPY_MODULE_AUDIOCODEC
+    #define MICROPY_QPY_AUDIOCODEC_RT5616       (0)
+#endif
+
+#if MICROPY_QPY_MODULE_SENSOR
+    #define MICROPY_QPY_SENSOR_SN95500          (0)
+       #define MICROPY_QPY_SENSOR_ICC_KEY                      (0)
+       #define MICROPY_QPY_SENSOR_GNSS                         (1)
+#endif
+
+#if MICROPY_QPY_MODULE_CAMERA
+    #define MICROPY_QPY_CAMERA_CAMPREVIEW       (1)
+    #if CONFIG_CAMERA_SAVEPHOTOS
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (1)
+    #else
+        #define MICROPY_QPY_CAMERA_CAMCAPTURE       (0)
+    #endif
+    #ifdef CONFIG_CAMERA_DECODE
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (1)
+    #else
+        #define MICROPY_QPY_CAMERA_CAMSCANDECODE    (0)
+    #endif
+#endif
+
+#define MICROPY_QPY_DEVICE_REPORT           (1)
+
+/***********************micropython opts*******************************/
+#define MICROPY_QPY_DEBUG_PRINTERS                     (0)  //flash 4160 Byte
+#define MICROPY_QPY_PY_MATH                            (1)  //flash 14880 Byte
+#define MICROPY_QPY_PY_CMATH                           (0)  //flash 3136 Byte
+#define MICROPY_QPY_PY_USELECT                         (0)  //flash 1792 Byte
+#define MICROPY_QPY_PY_UCTYPES                         (0)  //flash 2816 Byte
+#define MICROPY_QPY_PY_UZLIB                           (0)  //flash 3072 Byte
+#define MICROPY_QPY_PY_UASYNCIO                        (0)  //flash 2048 Byte
+#define MICROPY_QPY_PY_ENABLE_WEBSERVER                        (0)  //flash 3424 Byte
+#define MICROPY_QPY_PERSISTENT_CODE_LOAD        (1)  //flash 2048 Byte
+#define MICROPY_QPY_EMIT_XTENSAWIN              (0)  //flash 19776 Byte
+#define MICROPY_QPY_MODULE_VFS_THREADSAFE       (1)
+#define MICROPY_QPY_GC_HEAP_SIZE       (1000 * 1024)
+#endif
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z
new file mode 100644 (file)
index 0000000..844215d
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip
new file mode 100644 (file)
index 0000000..c37c1ab
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/include/app_link_start_addr.h
new file mode 100644 (file)
index 0000000..33e3ed4
--- /dev/null
@@ -0,0 +1,11 @@
+
+#ifndef __APP_LINK_START_ADDR_H__
+#define __APP_LINK_START_ADDR_H__
+
+#define APP_LINK_START_ADDR  0x80521000
+#define APP_FLASH_MAX_SIZE 0x120000
+
+#define APP_RAM_START 0x7E3E0000
+#define APP_RAM_MAX_SIZE 0x180000
+
+#endif
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib
new file mode 100644 (file)
index 0000000..30b5c46
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
diff --git a/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib
new file mode 100644 (file)
index 0000000..4fd01b0
Binary files /dev/null and b/2.sdk/project/7PIN/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
diff --git a/2.sdk/project/7PIN/usr/audio_gain.nvm b/2.sdk/project/7PIN/usr/audio_gain.nvm
new file mode 100644 (file)
index 0000000..97148da
Binary files /dev/null and b/2.sdk/project/7PIN/usr/audio_gain.nvm differ
diff --git a/2.sdk/project/7PIN/usr/audio_ve.nvm b/2.sdk/project/7PIN/usr/audio_ve.nvm
new file mode 100644 (file)
index 0000000..a33dd45
Binary files /dev/null and b/2.sdk/project/7PIN/usr/audio_ve.nvm differ
diff --git a/2.sdk/project/7PIN/usr/main.py b/2.sdk/project/7PIN/usr/main.py
new file mode 100644 (file)
index 0000000..68ba3ff
--- /dev/null
@@ -0,0 +1,2 @@
+import main_init 
+main_init.main_init()
\ No newline at end of file
diff --git a/2.sdk/project/7PIN/usr/static/audio.bin b/2.sdk/project/7PIN/usr/static/audio.bin
new file mode 100644 (file)
index 0000000..74e20cb
Binary files /dev/null and b/2.sdk/project/7PIN/usr/static/audio.bin differ
diff --git a/2.sdk/project/7PIN/usr/static/storage_file/wechat_record.json b/2.sdk/project/7PIN/usr/static/storage_file/wechat_record.json
new file mode 100644 (file)
index 0000000..acd6563
--- /dev/null
@@ -0,0 +1 @@
+{ "num": "0" }
\ No newline at end of file
index 4b64252..880272e 100644 (file)
@@ -377,6 +377,7 @@ SRC_QSTR += \
                        source/modwlan_ASR5803.c \
                        source/machine_soft_spi.c \
                        source/code128_p.c \
+                       source/modmask.c \
                        source/modwlan.c\
                        source/modwlan.c \
                        source/machine_one_wire.c
index b68136d..72aae57 100644 (file)
Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
index b0c752f..eb5ba33 100644 (file)
Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
index effa9a7..20faa87 100644 (file)
Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
index 160f4dd..6f54881 100644 (file)
Binary files a/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib and b/2.sdk/project/D10/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
index 3e007de..c7b80b1 100644 (file)
@@ -13,7 +13,7 @@ if errorlevel 0 (
 )
 :STEP1
 
-..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 716800 -i .\images\customer_fs.bin
+..\..\Helios_SDK\tools\ASR_1606\win32\mklfs.exe -c usr -b 4096 -r 4096 -p 4096 -s 696320 -i .\images\customer_fs.bin
 if errorlevel 1 (
     echo "customer_fs.bin生成失败 请检查usr目录是否大于316K!!!!!!!!!!!!!!!"
     goto exit
index 3f601bc..4dd461f 100644 (file)
@@ -10,7 +10,8 @@ MODEL = "K01_" #项目型号
 version = "{}{}".format(MODEL,versions.Version)
 builTime = "{}".format(versions.Build_Time)
 
-
+#设备资源管理鉴权平台 1开启 0关闭
+DEV_RES_MANAGE_AUTHEN_PLATFORM = 0
 
 
 class EventStore(object):
index 0ea26a3..db25fff 100644 (file)
@@ -258,7 +258,7 @@ PY_EXTMOD_O_BASENAME += \
        extmod/vfs_efs_file.o
 endif
 
-ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05))
+ifeq ($(strip $(PLAT)), $(filter $(PLAT),Unisoc Unisoc_8910_R05 Unisoc_8850_R02))
 PY_EXTMOD_O_BASENAME += \
        extmod/vfs_temp.o \
        extmod/vfs_temp_file.o
@@ -378,7 +378,8 @@ SRC_QSTR += \
                        source/code128_p.c \
                        source/modwlan.c\
                        source/modwlan.c \
-                       source/machine_one_wire.c
+                       source/machine_one_wire.c\
+                       source/modmask.c \
 
 
 ifeq ($(strip $(PLAT)),RDA)
index b27a855..92a9a45 100644 (file)
@@ -128,7 +128,7 @@ no_add_alarm.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 alarm_list = [{'hour': 16, 'repeart': 10, 'idx': 0, 'enabled': 0, 'days': [0,1,2,3,4,5,6], 'minute': 39},
                {'hour': 16, 'repeart': 10, 'idx': 1, 'enabled': 0, 'days': [0,1,2,3,4,5,6], 'minute': 39}]
 #用于显示闹钟列表不包含开关机信息
-
+import usys
 class ClockManager(Abstract):
     def __init__(self):
         super().__init__()
@@ -139,8 +139,11 @@ class ClockManager(Abstract):
         IFEXIST = ql_fs.path_exists("/usr/static/storage_file/alarm_msg.json") 
         self.check_alarm_list = []     
         if IFEXIST == True:
-            with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                self.check_alarm_list = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    self.check_alarm_list = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
         print("self.check_alarm_list",self.check_alarm_list)
 
     def post_processor_after_instantiation(self):
@@ -180,8 +183,11 @@ class ClockManager(Abstract):
         global alarm_list     
         print("IFEXIST:{}".format(IFEXIST))
         if IFEXIST == True:
-            with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
-                alarm_list = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/alarm_msg.json","r",encoding='utf-8') as fd:
+                    alarm_list = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
         return alarm_list
 
     def add_alarm(self, event, msg):
index f437d10..6d5404f 100644 (file)
@@ -4,8 +4,6 @@ import EventMesh
 import constants
 import ujson
 import ql_fs
-import audio
-from machine import Pin
 from ui import style_font_youyuan_20,style_font_youyuan_20_red,style_screen,Screen,style_font_youyuan_20_black,style_img
 import audio
 from machine import Pin
@@ -156,25 +154,28 @@ class WechatScreen(Screen):
 
     def __init__(self):
         super().__init__()
-        self.MXA_MSG = 5
+        self.MXA_MSG = 2
         self.wechat_recode_list = {}
         self.wechat_num = 0
         self.volum_size = 8 
         self.msg_tmp = ""
         check_txt = ql_fs.path_exists("/usr/static/storage_file/wechat_record.json")
         if check_txt == True :
-            with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
-                self.wechat_recode_list = ujson.load(fd)
-                if not self.wechat_recode_list:
-                    self.wechat_recode_list = {"num":0}
-                    self.wechat_num = 0 
-                else:
-                    b = str("num") in self.wechat_recode_list.keys()
-                    if b == True:
-                        self.wechat_num = self.wechat_recode_list["num"]
+            try:
+                with open("/usr/static/storage_file/wechat_record.json","r") as fd:#音频文件编号
+                    self.wechat_recode_list = ujson.load(fd)
+                    if not self.wechat_recode_list:
+                        self.wechat_recode_list = {"num":0}
+                        self.wechat_num = 0 
+                    else:
+                        b = str("num") in self.wechat_recode_list.keys()
+                        if b == True:
+                            self.wechat_num = self.wechat_recode_list["num"]
+            except Exception as e:
+                usys.print_exception(e)
         else :
             self.wechat_recode_list = {"num":0}
-            with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+            with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.wechat_recode_list,fd)                
         # if self.wechat_num != 0:
         #     with open("/ext/static/storage_file/wechat_record.json","r",encoding="utf-8") as fd:#音频文件记录
@@ -197,6 +198,7 @@ class WechatScreen(Screen):
         self.timer = osTimer()
         self.second_timer = osTimer()
         self.play_timer = osTimer()
+        self.update_lcdTimer = osTimer()
 
         
 
@@ -204,8 +206,8 @@ class WechatScreen(Screen):
         self.startWidth = 0
         self.check_json = 0
         self.wechat_list = lv.obj(wechat_screen_list_screen)
-        self.wechat_list.set_pos(0, 2)
-        self.wechat_list.set_size(128, 94)
+        self.wechat_list.set_pos(0, 20)
+        self.wechat_list.set_size(128, 91-15)
         self.wechat_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
         self.wechat_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
         self.wechat_list.set_flex_flow(lv.FLEX_FLOW.COLUMN)#自动排成一列对齐
@@ -277,7 +279,7 @@ class WechatScreen(Screen):
         self.MXA_MSG = msg[0]
         self.wechat_recode_list = msg[1]
         self.wechat_num = self.wechat_recode_list["num"]
-        with open("/usr/static/storage_file/wechat_record.json","w",encoding="utf-8") as fd:
+        with open("/usr/static/storage_file/wechat_record.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.wechat_recode_list,fd)
             #写编号
         Wechat_log("set_wechat_data2:{} ".format(self.wechat_num))
@@ -447,6 +449,7 @@ class WechatScreen(Screen):
             print("talking1.0")
             self.record_test.start("/usr/static/storage_file/{}.amr".format(self.wechat_num),16) 
             self.second_timer.start(1000, 1, self.reduce_second)
+            self.update_lcdTimer.start(500, 1, self.update_lcd)
             self.press_state = 1
             self.ble_send = 1
             #松开发送   
@@ -481,6 +484,7 @@ class WechatScreen(Screen):
     def sending(self,e):
         Wechat_log("sending1") 
         if self.press_state == 1:
+            self.press_state = 0
             # wechat_label.clear_flag(lv.obj.FLAG.HIDDEN)
             # wechat_label.set_text("发送中")
             wechat_press_label_countdown.add_flag(lv.obj.FLAG.HIDDEN)
@@ -495,6 +499,7 @@ class WechatScreen(Screen):
             #写序号
             self.record_test.stop() #停止錄音
             self.second_timer.stop() #停止计时器
+            self.update_lcdTimer.stop()
             self.countdown_old = self.countdown
             # Wechat_log("self.countdown :{} self.wechat_num:{} self.wechat_recode_list:{} self.wechat_show:{}".format(self.countdown,self.wechat_num,self.wechat_recode_list,self.wechat_show))
             self.wechat_recode_list["%02d"%(self.wechat_show)] = "S:{}".format(str(self.countdown))
@@ -503,7 +508,7 @@ class WechatScreen(Screen):
             #读音频amr二进制数据
             
             #修改或添加词典键值
-            self.press_state = 0
+            
             self.ble_send = 0
             ##隐藏显示文本 显示列表显示框
             EventMesh.publish("publish_message_event_ui",{"func":self.updata_list_show,"data":2})
@@ -527,7 +532,7 @@ class WechatScreen(Screen):
         Wechat_log("play_img_cb2")
     def play_img(self,*args):    
         Wechat_log("play_img1")
-        if self.paay_btn_count < 0 or self.paay_btn_count>= self.MXA_MSG:
+        if self.paay_btn_count < 0 or self.paay_btn_count >= self.MXA_MSG:
             self.play_timer.stop()
             return
         EventMesh.publish("system_sleep_rest")#防止黑屏
@@ -545,7 +550,7 @@ class WechatScreen(Screen):
 
         self.sec_num+=1
         if self.sec_num % 2 == 0:
-            # Wechat_log("self.play_sec:{}".format(self.play_sec))
+            Wechat_log("self.play_sec:{}".format(self.play_sec))
             if self.play_sec > 0:
                 self.play_sec -= 1
                 if self.play_sec == 0:
@@ -562,7 +567,7 @@ class WechatScreen(Screen):
                     self.wechat_list_dict[self.paay_btn_count]["_btn_img"].set_src("U:/static/R_3.png")
                 elif self.play_text == "S:":
                     self.wechat_list_dict[self.paay_btn_count]["_btn_img"].set_src("U:/static/S_3.png") 
-        Wechat_log("play_img2")
+        Wechat_log("play_img2 {}\r\n".format(get_play))
     def play_label_cb(self,e): #lvgl按钮回调
         Wechat_log("play_label_cb1")
         #Wechat_log("play_label_cb.0:e:{}".format(e.get_code()))
@@ -579,6 +584,7 @@ class WechatScreen(Screen):
     def play_label(self,play_btn):#另外一个线程实际执行的地方
         Wechat_log("play_label1")
         self.sec_num = 0
+        self.count_img = 0 #喇叭动画显示的数量
         # Wechat_log("play_label self.play_text:{}".format(self.play_text)) 
         if self.paay_btn_old_count <= self.MXA_MSG: #停止东画还原到3图标
             text = self.wechat_list_dict[self.paay_btn_old_count]["_btn_label2"].get_text()
@@ -588,7 +594,7 @@ class WechatScreen(Screen):
             elif self.play_text == "S:":
                 self.wechat_list_dict[self.paay_btn_old_count]["_btn_img"].set_src("U:/static/S_3.png")
 
-        self.count_img = 0 #喇叭动画显示的数量
+        
   
 
         text = self.wechat_list_dict[self.paay_btn_count]["_btn_label2"].get_text()
@@ -617,6 +623,8 @@ class WechatScreen(Screen):
             self.aud.stop()#
             self.aud.play(1, 1, '/usr/static/storage_file/{}.amr'.format(i))  #文件名前面要加上路径
         self.paay_btn_old_count = self.paay_btn_count
+
+        
         Wechat_log("play_label2")
 
      #获取是否在录音
@@ -627,11 +635,20 @@ class WechatScreen(Screen):
         return self.ble_send
 
 
+    def lcd_off(self):
+        self.play_timer.stop()
+        self.record_test.stop() #停止錄音
+        self.second_timer.stop() #停止计时器
+        self.update_lcdTimer.stop()
+        self.aud.stop()
+    
     def Close(self):
         Wechat_log("Close1")
         self.play_timer.stop()
         self.record_test.stop() #停止錄音
         self.second_timer.stop() #停止计时器
+        self.update_lcdTimer.stop()
+        
         self.aud.stop()
         num = EventMesh.publish("get_volum_size")
         if num == None:
@@ -639,7 +656,18 @@ class WechatScreen(Screen):
         self.aud.setVolume(num)#恢复原始音量
         Wechat_log("Close2")
 
+    def update_lcd(self,*args):
+        EventMesh.publish("publish_message_event_ui",{"func":self.update_lcd_cb,"data":0})
+
+    def update_lcd_cb(self,data):
+        Wechat_log("update_lcd_cb")
+        EventMesh.publish("system_sleep_rest")#防止黑屏
+
     def reduce_second(self,*args):
+        EventMesh.publish("publish_message_event_ui",{"func":self.reduce_second_cb,"data":0})
+
+    def reduce_second_cb(self,data):
+        
         if self.countdown < 15:
             self.countdown += 1
         else:
@@ -653,6 +681,9 @@ class WechatScreen(Screen):
     def done_return(self):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
+    def done_left_to_right(self):
+       pass
+        
     def btn1_release(self):
         EventMesh.publish("load_screen", {"screen": "main_menu"})
         
index 47ca599..7f07510 100644 (file)
@@ -175,7 +175,7 @@ class calculatorScreen(Screen):
         self.count = 0
         self.str = ""
         self.equal = ''
-        calculator_num.add_event_cb(lambda e: self.calculator_event_cb(e,calculator_num), lv.EVENT.VALUE_CHANGED, None)
+        calculator_num.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calculator_event_cb(e,calculator_num)), lv.EVENT.VALUE_CHANGED, None)
         self.calculator_flag = ''
         self.result = ''
         self.num_count = 0 #限制输入位数 20位
@@ -190,7 +190,6 @@ class calculatorScreen(Screen):
         calculator_label.clear_flag(lv.obj.FLAG.HIDDEN)
         calculator_label.set_text(" ")
         self.meta = calculator_screen
-        
 
     def calculator_eval(self,str):
         print("calculator_eval:str{}".format)
@@ -232,8 +231,13 @@ class calculatorScreen(Screen):
     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:
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+        elif code == lv.EVENT.VALUE_CHANGED:
             txt = src.get_btn_text(src.get_selected_btn())  # 获取被点击的按钮的内容
             try :    
                 if txt == "<-":  # 如果是退格键,那么就删除1个字符
index 657aa31..bd9745a 100644 (file)
@@ -14,6 +14,9 @@ class PROTOCOL:
     CR_SEND = "CR_SEND"
     CR_RECV = "CR_RECV"
 
+    AL_SEND = "AL_SEND"
+    AL_RECV = "AL_RECV"
+
     FIND_SEND = "FIND_SEND"
     FIND_RECV = "FIND_RECV"
 
index 1575d7f..47acf3a 100644 (file)
@@ -32,7 +32,7 @@ init_data = (
     1, 1, 0x3f,
 
     0, 1, 0xB0,
-    0, 0, 0xC0,
+    1, 1, 0xC0,
 
     0, 1, 0xB2,
     1, 1, 0x2F,
@@ -259,6 +259,10 @@ style_font_youyuan_40 = lv.style_t()
 style_font_youyuan_40.init()
 style_font_youyuan_40.set_text_color(lv.color_make(0xff, 0xff, 0xff))
 style_font_youyuan_40.set_text_font(lv.K01_font_16_ALL)
+
+style_img = lv.style_t()
+style_img.init()
+style_img.set_img_opa(255)
 #style_font_youyuan_40.set_text_font_v2("font_40.bin",40,0)
 
 lcd.lcd_display_on()
@@ -269,12 +273,20 @@ power_on_screen = lv.obj()
 print("power_on_screen")
 power_on_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-power_on_label = lv.label(power_on_screen)
-power_on_label.set_text("系统初始化中")
-power_on_label.set_pos(0, 50)
-power_on_label.set_size(128, 20)
-power_on_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-power_on_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
+poweron_img = lv.img(power_on_screen)
+poweron_img.set_size(80,80)
+poweron_img.set_pos(24,24)
+poweron_img.set_src("U:/static/AI_MAIN_ICON.png")
+# screen_slider_img.add_flag(lv.obj.FLAG.CLICKABLE)
+poweron_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+# power_on_label = lv.label(power_on_screen)
+# power_on_label.set_text("WELCOME")
+# power_on_label.set_pos(0, 50)
+# power_on_label.set_size(128, 20)
+# power_on_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# power_on_label.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
 print("power_on_screen init...")
 
 
index 2dfaebe..9bc3fbd 100644 (file)
@@ -6,6 +6,7 @@ resp=bytearray(50)
 # atcmd.sendSync('AT+log=52,1\r\n',resp,'',200)
 # print("AT+log=52,1:{}".format(resp))
 from common import Abstract
+import usys
 class App(object):
     def __init__(self):
         self.managers = []
@@ -79,7 +80,7 @@ def main_init():
     print("init5:{}".format(utime.localtime()))
     ui.add_screen(MainMenuScreen()) 
 
-    ui.add_screen(_ui.deletealbumScreen())
+    
     ui.add_screen(_ui.PopupScreen()) 
     ui.add_screen(_ui.PhoneScreen()) 
     ui.add_screen(_ui.HeartrateScreen()) 
@@ -93,16 +94,13 @@ def main_init():
     ui.add_screen(_ui.Spo2Screen()) 
     ui.add_screen(_ui.TemperatureScreen()) 
     ui.add_screen(_ui.ContactsScreen()) 
-    ui.add_screen(_ui.cameraVdieoAnswerScreen())
-    ui.add_screen(_ui.vedioCallingCallScreen())
-    ui.add_screen(_ui.VedioShowScreen())
-    ui.add_screen(_ui.videoOutCallScreen())
+
     from appWechat import WechatScreen,NewWechatPopupScreen
     ui.add_screen(WechatScreen()) 
   
     from alarm import ClkListScreen,ClockManager,PopupAlarmScreen
     # from ui_health import HealthScreen
-    from calculator import calculatorScreen
+    
     ui.add_screen(ClkListScreen()) 
     ui.add_screen(_ui.CountdownEndScreen()) 
     # ui.add_screen(NewEditClk()) 
@@ -115,14 +113,10 @@ def main_init():
     ui.add_screen(_ui_setting.ImeiScreen()) 
     ui.add_screen(_ui_setting.AppScreen()) 
     ui.add_screen(_ui_setting.BrightnessScreen()) 
-    ui.add_screen(_ui_setting.VolumeScreen()) 
     ui.add_screen(_ui_setting.RestoreScreen()) 
     ui.add_screen(_ui_setting.PoweroffScreen()) 
     ui.add_screen(_ui_setting.VersionScreen()) 
     ui.add_screen(_ui_setting.UpdateScreen()) 
-    ui.add_screen(_ui_setting.AlarmvolumeScreen()) 
-    ui.add_screen(_ui_setting.MsgvolumeScreen()) 
-    ui.add_screen(_ui_setting.PhoneringScreen()) 
     ui.add_screen(_ui_setting.totalvolumeScreen()) 
     ui.add_screen(_ui_setting.PoweroffConfirmScreen()) 
     ui.add_screen(_ui_setting.RestartScreen())
@@ -156,33 +150,52 @@ def main_init():
     ui.add_screen(_ui.RemoveMessageScreen())
     ui.add_screen(_ui.keyboardScreen())
     ui.add_screen(_ui.classMgrPopupScreen())
-    ui.add_screen(calculatorScreen())
-    ui.add_screen(_ui.cameraScreen())
-    ui.add_screen(_ui.cameraalbumScreen())
-    ui.add_screen(_ui.albumPreviewScreen())
-    ui.add_screen(_ui.cameraFullScreen())
     ui.add_screen(_ui.restore_confirmScreen())
     ui.add_screen(_ui.down_Screen())
     ui.add_screen(_ui.up_Screen())
-    ui.add_screen(_ui.videolistScreen())
-    ui.add_screen(_ui.VdieoVoiceScreen())
-    ui.add_screen(_ui.VoiceShowScreen())
-    ui.add_screen(_ui.voiceInCallScreen())
-    ui.add_screen(_ui.videoModeScreen())
-    ui.add_screen(_ui.voiceOutCallScreen())
+    try:
+        import ui_video as _ui_video
+        ui.add_screen(_ui_video.deletealbumScreen())
+        ui.add_screen(_ui_video.vedioCallingCallScreen())
+        ui.add_screen(_ui_video.VedioShowScreen())
+        ui.add_screen(_ui_video.videoOutCallScreen())
+        ui.add_screen(_ui_video.cameraScreen())
+        ui.add_screen(_ui_video.cameraalbumScreen())
+        ui.add_screen(_ui_video.albumPreviewScreen())
+        ui.add_screen(_ui_video.cameraFullScreen())
+        ui.add_screen(_ui_video.videolistScreen())
+        ui.add_screen(_ui_video.VoiceShowScreen())
+        ui.add_screen(_ui_video.voiceInCallScreen())
+        ui.add_screen(_ui_video.videoModeScreen())
+        ui.add_screen(_ui_video.voiceOutCallScreen())
+    except Exception as e:
+        usys.print_exception(e)
+    try:
+        from calculator import calculatorScreen
+        ui.add_screen(calculatorScreen())
+    except Exception as e:
+        usys.print_exception(e)
+    # try:
+    #     from aigcdial import CreateScreen,aigcStyleLIstScreen,aigcMainLIstScreen,aigcShowNewImgScreen
+    #     ui.add_screen(CreateScreen())
+    #     ui.add_screen(aigcStyleLIstScreen())
+    #     ui.add_screen(aigcMainLIstScreen())
+    #     ui.add_screen(aigcShowNewImgScreen())
+    # except Exception as e:
+    #     usys.print_exception(e)
 
-    from pp_main import allppPopupScreen,delOnePopupScreen,ppListScreen,noppPopupScreen,delppsucessPopupScreen,ppMainScreen,addfaileppPopupScreen,ppMainPopupScreen,addppPopupScreen,addedppPopupScreen,ownaddppPopupScreen
-    ui.add_screen(ppMainScreen())
-    ui.add_screen(ppMainPopupScreen())
-    ui.add_screen(addppPopupScreen())
-    ui.add_screen(addedppPopupScreen())
-    ui.add_screen(ownaddppPopupScreen())
-    ui.add_screen(addfaileppPopupScreen())
-    ui.add_screen(delppsucessPopupScreen())
-    ui.add_screen(noppPopupScreen())
-    ui.add_screen(ppListScreen())
-    ui.add_screen(delOnePopupScreen())
-    ui.add_screen(allppPopupScreen())
+    # from pp_main import allppPopupScreen,delOnePopupScreen,ppListScreen,noppPopupScreen,delppsucessPopupScreen,ppMainScreen,addfaileppPopupScreen,ppMainPopupScreen,addppPopupScreen,addedppPopupScreen,ownaddppPopupScreen
+    # ui.add_screen(ppMainScreen())
+    # ui.add_screen(ppMainPopupScreen())
+    # ui.add_screen(addppPopupScreen())
+    # ui.add_screen(addedppPopupScreen())
+    # ui.add_screen(ownaddppPopupScreen())
+    # ui.add_screen(addfaileppPopupScreen())
+    # ui.add_screen(delppsucessPopupScreen())
+    # ui.add_screen(noppPopupScreen())
+    # ui.add_screen(ppListScreen())
+    # ui.add_screen(delOnePopupScreen())
+    # ui.add_screen(allppPopupScreen())
 
     ui.add_screen(NewWechatPopupScreen())
     # ui.add_screen(HealthScreen())
@@ -191,7 +204,7 @@ def main_init():
     
     from protocol import RTALK_ProtoCol,TKS_ProtoCol,RCALLING_ProtoCol,AGTALK_ProtoCol,CALLING_ProtoCol,MEMBERS_ProtoCol,JPREG_ProtoCol,ppsrvvoicemsg_ProtoCol,ppdevvoicemsg_ProtoCol,srvtextmsg_ProtoCol,TK_ProtoCol,MESSAGE_ProtoCol,APPVOICEMSG_ProtoCol,restart_ProtoCol,factory_ProtoCol,SILENCETIMEFS_ProtoCol,WLKEY_ProtoCol,SILENCETIME2_ProtoCol,KEYBRD_ProtoCol,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,Time_ProtoCol,\
-        pp_ProtoCol,ppfriends_ProtoCol,revpp_ProtoCol,reqpp_ProtoCol,delpp_ProtoCol,ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,SockManager,NetManager
+        pp_ProtoCol,ppfriends_ProtoCol,revpp_ProtoCol,AL_ProtoCol,reqpp_ProtoCol,delpp_ProtoCol,ProtoColResolver,PHL_ProtoCol,MONITOR_ProtoCol,bootoff_ProtoCol,WDSTART_ProtoCol,LOWBAT_ProtoCol,sosHome_dial_ProtoCol,device_res_author,SockManager,NetManager
     
     from protocol import CALLCANCEL_ProtoCol,HANGUP_ProtoCol,JMEMBERS_ProtoCol
 
@@ -201,12 +214,12 @@ def main_init():
 
     print("init8:{}".format(utime.localtime()))
     
-    
-    #from ui_WatchFaceScreen import WatchFaceScreen 
-    
-    
-    # from test_sms import HRSTART_ProtoCol,getHrTimeManager,HEART_ProtoCol,OXYGEN_ProtoCol,OXYGEN_One_ProtoCol,getBrightnessManager,\
-    # getStorageDataManager
+    try:
+        import ai
+        ui.add_screen(ai.AIScreen())
+    except Exception as e:
+        usys.print_exception(e)
+
     print("init9:{}".format(utime.localtime()))
    #from usr.ui_wechat import WechatScreen,TK_ProtoCol
 
@@ -220,38 +233,42 @@ def main_init():
         # .append_manager(mgr.CountdownManager()) \
     app.append_manager(mgr.vedioInforManager())
     app.append_manager(mgr.videoBookManager())
-    app.append_manager(setkeyboardManager())
-    app.append_manager(ConfigStoreManager())
+    app.append_manager(mgr.setkeyboardManager())
+    app.append_manager(mgr.ConfigStoreManager())
     app.append_manager(NetManager())
-    app.append_manager(LocationManager())
-    app.append_manager(AddrBookManager())
+    app.append_manager(mgr.LocationManager())
+    app.append_manager(mgr.AddrBookManager())
     app.append_manager(mgr.MsgManager())
-    app.append_manager(MsgdetailManager())
+    app.append_manager(mgr.MsgdetailManager())
     app.append_manager(mgr.CallLogManager())
     app.append_manager(mgr.getWeatherDataManager())
-    app.append_manager(PhoneCallingManager())
+    app.append_manager(mgr.PhoneCallingManager())
     app.append_manager(ClockManager())
-    app.append_manager(gethistoryDataManager())
-    app.append_manager(getHrTimeManager())
-    app.append_manager(getBrightnessManager())
-    app.append_manager(getUpLoadDataManager())
-    app.append_manager(getVolumSizeManager())
-    app.append_manager(getTempTimeManager())
-    app.append_manager(getplayAudiodStateManager())
-    app.append_manager(getLowBatManager())
-    app.append_manager(getBootOffManager())
-    app.append_manager(getOldTimeManager())
-    app.append_manager(getSosFlagManager())
-    app.append_manager(CountdownManager())
-    app.append_manager(sosInfoCallManager())
-    app.append_manager(testSmsSetIPManager())
-    app.append_manager(setclassTimeManager())
-    app.append_manager(cameraAlbumManager())
-    app.append_manager(AddPPManager())
-    app.append_manager(simFactoryManager())
+    app.append_manager(mgr.gethistoryDataManager())
+    app.append_manager(mgr.getHrTimeManager())
+    app.append_manager(mgr.getBrightnessManager())
+    app.append_manager(mgr.getUpLoadDataManager())
+    app.append_manager(mgr.getVolumSizeManager())
+    app.append_manager(mgr.getTempTimeManager())
+    app.append_manager(mgr.getplayAudiodStateManager())
+    app.append_manager(mgr.getLowBatManager())
+    app.append_manager(mgr.getBootOffManager())
+    app.append_manager(mgr.getOldTimeManager())
+    app.append_manager(mgr.getSosFlagManager())
+    app.append_manager(mgr.CountdownManager())
+    app.append_manager(mgr.sosInfoCallManager())
+    app.append_manager(mgr.testSmsSetIPManager())
+    app.append_manager(mgr.setclassTimeManager())
+    app.append_manager(mgr.setCallStateManager())
+    app.append_manager(mgr.cameraAlbumManager())
+    app.append_manager(mgr.AddPPManager())
+    app.append_manager(mgr.simFactoryManager())
     print("init21:{}".format(utime.localtime()))    
     
     print("init11:{}".format(utime.localtime()))    
+    if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+        app.append_manager(device_res_author())
+
     pcr = ProtoColResolver()
     pcr.add_support(LK_ProtoCol())
     pcr.add_support(PING_ProtoCol())
@@ -304,6 +321,7 @@ def main_init():
     pcr.add_support(CALLING_ProtoCol())
     pcr.add_support(RCALLING_ProtoCol())
     pcr.add_support(RTALK_ProtoCol())
+    pcr.add_support(AL_ProtoCol())
     # pcr.add_support(HANGUP_ProtoCol())
     EventMesh.publish("load_screen", {"screen": "poweron"})
     sm = SockManager()
index 5040ddc..cb88693 100644 (file)
@@ -374,7 +374,7 @@ class ConfigStoreManager(Abstract):
             ql_fs.touch(self.file_name, self.map)
         
 class sosInfoCallManager(Abstract):
-    # 通讯录
+    # SOS拨号
     def __init__(self):
         pass
 
@@ -384,9 +384,11 @@ class sosInfoCallManager(Abstract):
     def set_sos_info_call(self, event, msg):
         hangup_mode = EventMesh.publish("get_hangup_mode")
         if hangup_mode == 1:
+
             EventMesh.publish("set_sos_flag",0)
             EventMesh.publish("set_sos_num",0)
             EventMesh.publish("set_hangup_mode",0)
+
         print('hangup_mode disconnect',hangup_mode)
         sos_flag = EventMesh.publish("get_sos_flag")
         print('voicecall sos_flag',sos_flag)
@@ -403,11 +405,11 @@ class sosInfoCallManager(Abstract):
                     num_len = 0
 
                     if len(number) == 1:
-                        num_len = len(number)
-                    elif len(number) == 2:
                         num_len = len(number)+1
+                    elif len(number) == 2:
+                        num_len = len(number)+1+2
                     elif len(number) == 3:
-                        num_len = len(number)+2  
+                        num_len = len(number)+5 
                     # print("number:{} number_len :{} num:{} num_len:{}".format(number,len(number),num,num_len))
                     if num > num_len :
                         if len(number) == 1:
@@ -426,36 +428,48 @@ class sosInfoCallManager(Abstract):
                             sms.sendPduMsg(number2, '我需要你的帮助', 'UCS2')
                             number3 = str(number[2])
                             sms.sendPduMsg(number3, '我需要你的帮助', 'UCS2')
-                            
                         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")
+                            if len(number[0]) != 0:
+                                EventMesh.publish("set_callnumer_cb",number[0])
+                                print("phone 1")
                         elif len(number) == 2:
-                            if num == 1 or num == 3:
+                            if num == 1 or num == 3 or num == 5:
                                 print("phone 2")
-                                EventMesh.publish("set_callnumer_cb",number[1])
-                            elif num == 2:
+                                if len(number[1]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[1])
+                            elif num == 2 or num == 4:
                                 print("phone 3")
-                                EventMesh.publish("set_callnumer_cb",number[0])
+                                if len(number[0]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[0])
                         elif len(number) == 3:
-                            if num == 1 or num == 4:
-                                EventMesh.publish("set_callnumer_cb",number[1])
+                            if num == 1 or num == 4 or num == 7:
+                                if len(number[1]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[1])
                                 print("phone 4")
-                            elif num == 2 or num == 5:
+                            elif num == 2 or num == 5 or num == 8:
                                 print("phone 5")
-                                EventMesh.publish("set_callnumer_cb",number[2])
-                            elif num == 3:
-                                print("phone 6")
-                                EventMesh.publish("set_callnumer_cb",number[0])   
-        
+                                if len(number[2]) != 0:
+                                    EventMesh.publish("set_callnumer_cb",number[2])
+                            elif num == 3 or num == 6:
+                                if len(number[0]) != 0:
+                                    print("phone 6")
+                                    EventMesh.publish("set_callnumer_cb",number[0])   
+
+
+WL_timer = osTimer()   
+def WL_timer_cb(*args):   
+    get_call = EventMesh.publish("get_call_state") 
+    if get_call == 2:#只有拨进来才给接听
+        EventMesh.publish("answer_auto_event")
+
 def voice_callback(args):
-   print('voicecall iinfo:{}'.format(args))
-   if args[0] == 10:
+    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)
@@ -469,9 +483,37 @@ def voice_callback(args):
 
         if b == True and size_len > 11:
             tmp = tmp[size_len-11:]
+        WLKEY = EventMesh.publish("get_storage_config","WLKEY") 
+        if WLKEY != None:
+            if WLKEY == "1" or WLKEY == "2":#开启了白名单
+                on_list_flag = 0
+                phonebook = EventMesh.publish("get_phonebook_list")
+                phonebook_list = phonebook[1]
+                print("voice_callback:phonebook_list{}".format(phonebook_list))
+                try:
+                    for value in phonebook_list.values():
+                        if value == args[6]:
+                            on_list_flag = 1
+                            break
+                except Exception as e:
+                    usys.print_exception(e)
+                print("voice_callback:on_list_flag{}".format(on_list_flag))
+                if on_list_flag == 1:#在白名单里
+                    if WLKEY == "2":
+                        WL_timer.start(30000, 0, WL_timer_cb)
+                else:
+                    print("voice_callback:不在白名单中,挂断")
+                    EventMesh.publish("set_call_state",0)
+                    EventMesh.publish("set_interrup_incall",0)
+                    EventMesh.publish("set_UI_high_priority",0)
+                    EventMesh.publish("return_prev_screen")
+                    voiceCall.callEnd()
+                    
+                    return 
+        EventMesh.publish("set_call_state",2)#设置
         EventMesh.publish("load_screen", {"screen": "incoming_call","meta":str(tmp)})
 
-   elif args[0] == 11:
+    elif args[0] == 11:
         EventMesh.publish("set_UI_high_priority",0)
         sos_flag = EventMesh.publish("get_sos_flag")
         if sos_flag == 1:
@@ -488,9 +530,10 @@ def voice_callback(args):
         b = tmp[0].isdigit()#判断是否不是数字开头 暂时不用 因为截取了+判断不了
         if b == True and size_len > 11:
             tmp = tmp[size_len-11:]
+        EventMesh.publish("set_call_state",1)#设置
         EventMesh.publish("load_screen", {"screen": "on_call","meta":str(tmp)})
 
-   elif args[0] == 12:
+    elif args[0] == 12:
         set_interrup_call = EventMesh.publish("get_interrup_incall")#打断这次不需要来电的ui事件 以免通话中退出当前界面进不去了
         if set_interrup_call == 1:
             EventMesh.publish("set_interrup_incall",0)
@@ -499,25 +542,39 @@ def voice_callback(args):
         EventMesh.publish("set_interrup_incall",0)
         EventMesh.publish("set_UI_high_priority",0)
         
-        EventMesh.publish("return_prev_screen")
+        if EventMesh.publish("get_call_state") != 0:
+            EventMesh.publish("set_call_state",0)#设置通话状态为0
+            EventMesh.publish("return_prev_screen")
+        
             # EventMesh.publish("load_screen", {"screen": "main_menu"})  
         
         EventMesh.publish("set_sos_info_call")  
         print('voicecall disconnect end')
         
 
-   elif args[0] == 13:
+    elif args[0] == 13:
         print('voicecall is waiting, PhoneNO.: ', args[6])
-   elif args[0] == 14:
-
-        print('voicecall dialing, PhoneNO.: ', args[6])
-        EventMesh.publish("set_UI_high_priority",0)
-        EventMesh.publish("load_screen", {"screen": "dialing"})
+    elif args[0] == 14:
+        print('voicecall dialing, PhoneNO.: ', args[6],EventMesh.publish("get_phone_state"))
+        if EventMesh.publish("get_phone_state") == 0:
+            EventMesh.publish("set_call_state",0)
+            EventMesh.publish("set_interrup_incall",0)
+            EventMesh.publish("set_UI_high_priority",0)
+            voiceCall.callEnd()
+            return
+        EventMesh.publish("set_call_state",4)##设置通话状态
+        
+        screen_NAME = EventMesh.publish("get_screen_NAME")
+        if screen_NAME != None:
+            if screen_NAME != "dialing_noplay_popup":
+                EventMesh.publish("set_interrup_incall",0)
+                EventMesh.publish("set_UI_high_priority",0)
+        EventMesh.publish("load_screen", {"screen": "dialing_noplay_popup"})
         
-   elif args[0] == 15:
+    elif args[0] == 15:
         print('voicecall alerting, PhoneNO.: ', args[6])
         
-   elif args[0] == 16:
+    elif args[0] == 16:
         print('voicecall holding, PhoneNO.: ', args[6])
 
 class DeviceInfoManager(Abstract):
@@ -608,6 +665,10 @@ class DeviceInfoManager(Abstract):
         self.normal_oldtotalmin = 0
         self.normal_flag = 0
         self.normal_count = 0
+
+        self.dev_state = 0
+
+        self.updata_dev_token_count = 0
         # #print("hsensor.open_heart:%d\r\n"%(self.hsensor.open_heart()))
         print("DeviceInfoManager:3")
         self.i2c0 = I2C(I2C.I2C0, I2C.FAST_MODE)
@@ -660,6 +721,9 @@ class DeviceInfoManager(Abstract):
         EventMesh.subscribe(constants.EVENT.STOP_TEMP, self.stop_temp)
         EventMesh.subscribe(constants.EVENT.GET_TEMP, self.get_temp)
 
+        EventMesh.subscribe("get_dev_state",self.get_dev_state)
+        EventMesh.subscribe("set_dev_state",self.set_dev_state)
+
         print("post_processor_after_instantiation:2")
         self.timer_push_schedule.start(10000, 1, self.publish_event_cb)
         # self.timer_pusht_test.start(2000, 1, self.publish_test)
@@ -703,6 +767,11 @@ class DeviceInfoManager(Abstract):
             # if flip_sw == 1:
             #     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
 
+    def get_dev_state(self, event, msg):
+        return self.dev_state
+    def set_dev_state(self, event, msg):
+        self.dev_state = msg
+
     def publish_event_cb(self, *args, **kwargs):
         EventMesh.publish("publish_message_event_DeviceInfo",{"func":self.publish_event,"data":0})  
     def publish_event(self,data):
@@ -724,6 +793,7 @@ 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 self.sim_old_count < 60:
@@ -903,12 +973,13 @@ class DeviceInfoManager(Abstract):
         msg_nums = sms.getMsgNums() #获取短信条数
         if(msg_nums != -1):
             sms_data = sms.getSaveLoc()
-            sms_max = sms_data[0][2]
-            if msg_nums >= sms_max-1:
-                self.sms_full_flag+=10
-                if self.sms_full_flag >= 120:
-                    self.sms_full_flag=0
-                    EventMesh.publish("load_screen", {"screen": "message_full"})
+            if sms_data != -1:
+                sms_max = sms_data[0][2]
+                if msg_nums >= sms_max-1:
+                    self.sms_full_flag+=10
+                    if self.sms_full_flag >= 120:
+                        self.sms_full_flag=0
+                        EventMesh.publish("load_screen", {"screen": "message_full"})
             else:
                 self.sms_full_flag = 0
 
@@ -1897,138 +1968,146 @@ class LocationManager(Abstract):
           #print("Location_send1")
         if self.location_queue.empty() == True:
             return
-        server_data = server_init()
-        # print("SockManager:server_data:{}".format(server_data))
-        server_addr = server_data[0]
-        server_port = server_data[1]
-        ip_infor = EventMesh.publish("get_new_ip_com")
-        print("ip_infor1:{} \n\n\n".format(ip_infor))
-        
-        if ip_infor != None: #已经改过服务器
-            server_addr = ip_infor[0]
-            server_port = ip_infor[1]
-        d_server_addr = "device.miwitracker.com"
-        d_server_port = 8505
-        print("server_addr:{} server_port:{}".format(server_addr,server_port))
-        self.date_info = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
-        self.date_info =  self.date_info[2:]
-        if server_addr == d_server_addr and server_port == d_server_port:
-            
-            data = RTC().datetime()
-            hour = data[4]
-            min = data[5]
-            sec = data[6]
-
-            week = data[3]
-
-            year = data[0]#年
-            month = data[1]#月
-            day = data[2]#日
-            year_date = int(str(year)[2:])
-            # print("year_date",year_date)
-            self.date_info = "%02d"%(day)+"%02d"%(month)+"%02d"%(year_date)+','+"%02d"%(hour)+"%02d"%(min)+"%02d"%(sec)#云米要日月年
-        # self.date_info = "%02d"%(utime.localtime()[1])+"%02d"%(utime.localtime()[2])+"%02d"%(year_date)+','+"%02d"%(utime.localtime()[3])+"%02d"%(utime.localtime()[4])+"%02d"%(utime.localtime()[5])
-        # print("date_info",self.date_info)
-
-        #date = "180916,025723"
-        date = self.date_info
-        #date = "180916,025723"
-        GPS_type = "V"
-        latitude = "0.000000,N"
-        longitude = "0.000000,E"
-        speed = "0.00"
-        direction = "0.0"
-        high = "100.0"
-        number = "0"
-        precision = "24"
-        if msg[0] :#有GPS数据
-            GPS_type = "A"
-            # 纬度
-            latitude = msg[0]["latitude"]
-            # 经度
-            longitude = msg[0]["longitude"]
-            # 速度
-            speed = msg[0]["speed"]
-            # 方向
-            direction = "0"
-            if msg[0]["direction"] :
-                direction = msg[0]["direction"]
-            # 高度
-            high = msg[0]["high"]
-            high_tmp = high.split(".")
-            if len(high_tmp) >= 2 :
-                high = "%s"%(high_tmp[0])
-            # 讯号质量:搜索到的卫星数目
-            number = msg[0]["number"]
-            precision = msg[0]["precision"]
-            #date = msg[0]["date"]
-        
-        #gsm 信号强度
-        gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
-        # 电池电量百分比 
-        bat_tmp = EventMesh.publish("screen_get_battery")
-        battery_caption =  str(bat_tmp[1])
-        #步数
-        old_step = 0
-        step = 0
-        step = EventMesh.publish("get_old_step_value")
-        if step != 0:
-            tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
-            if tmp_data != None:
-                old_step = tmp_data
-            if old_step !=  step:
-                EventMesh.publish("set_storage_config",["old_step",step])
-                EventMesh.publish("set_storage_config",["old_step_new",step])
-                
-        old_step = step
-        # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
-        #翻转次数
-        turn_count = "0"
-        #终端状态
-        state = "00000000"
-        #基站数据
-        CELL_num = len(msg[2])
-        CELL_data = "1," #时延
-        if msg[2] != []:
-            for CELL in msg[2] :
-                if CELL[0] == 0 :
-                    CELL_data += "%X,"%(int(CELL[2])) #MCC
-                    CELL_data += str(CELL[3]) +","#MNC
-                    CELL_data += str(CELL[5]) +","#tac,区域码
-                    CELL_data += str(CELL[1]) +","#基站编号 CID
-                    CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-                else :
-                    CELL_data += str(CELL[5]) +","#tac,区域码
-                    CELL_data += str(CELL[1]) +","#基站编号 CID
-                    CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
-            CELL_data = CELL_data[:(len(CELL_data)-1)]
-        #WIFI数据
-        WIFI_num = 0 
-        WIFI_data = ""
-        if msg[1] :
-            WIFI_num = msg[1][0]
-            i = 0
-            for MAC in msg[1][1] :
-                WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
-                i += 1
-            WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
-        WIFI_data = WIFI_data.lower()
-        #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
-        #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
-        #定位数据
-        send_data = "%s,%s,%s"%(date,GPS_type,latitude)
-        send_data += ",%s,%s,%s"%(longitude,speed,direction)
-        send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
-        send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
-        send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
-        send_data += ",%d,%s"%(WIFI_num,WIFI_data)
-        send_data+=",%s"%(precision)
-        #print("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
         while True:
             if self.location_queue.empty() == False:
                 TYPE = self.location_queue.get()
+                server_data = server_init()
+                # print("SockManager:server_data:{}".format(server_data))
+                server_addr = server_data[0]
+                server_port = server_data[1]
+                ip_infor = EventMesh.publish("get_new_ip_com")
+                print("ip_infor1:{} \n\n\n".format(ip_infor))
+                
+                if ip_infor != None: #已经改过服务器
+                    server_addr = ip_infor[0]
+                    server_port = ip_infor[1]
+                d_server_addr = "device.miwitracker.com"
+                d_server_port = 8505
+                print("server_addr:{} server_port:{}".format(server_addr,server_port))
+                self.date_info = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6])
+                self.date_info =  self.date_info[2:]
+                if server_addr == d_server_addr and server_port == d_server_port:
+                    
+                    data = RTC().datetime()
+                    hour = data[4]
+                    min = data[5]
+                    sec = data[6]
+
+                    week = data[3]
+
+                    year = data[0]#年
+                    month = data[1]#月
+                    day = data[2]#日
+                    year_date = int(str(year)[2:])
+                    # print("year_date",year_date)
+                    self.date_info = "%02d"%(day)+"%02d"%(month)+"%02d"%(year_date)+','+"%02d"%(hour)+"%02d"%(min)+"%02d"%(sec)#云米要日月年
+                # self.date_info = "%02d"%(utime.localtime()[1])+"%02d"%(utime.localtime()[2])+"%02d"%(year_date)+','+"%02d"%(utime.localtime()[3])+"%02d"%(utime.localtime()[4])+"%02d"%(utime.localtime()[5])
+                # print("date_info",self.date_info)
+
+                #date = "180916,025723"
+                date = self.date_info
+                #date = "180916,025723"
+                GPS_type = "V"
+                latitude = "0.000000,N"
+                longitude = "0.000000,E"
+                speed = "0.00"
+                direction = "0.0"
+                high = "100.0"
+                number = "0"
+                precision = "24"
+                if msg[0] :#有GPS数据
+                    GPS_type = "A"
+                    # 纬度
+                    latitude = msg[0]["latitude"]
+                    # 经度
+                    longitude = msg[0]["longitude"]
+                    # 速度
+                    speed = msg[0]["speed"]
+                    # 方向
+                    direction = "0"
+                    if msg[0]["direction"] :
+                        direction = msg[0]["direction"]
+                    # 高度
+                    high = msg[0]["high"]
+                    high_tmp = high.split(".")
+                    if len(high_tmp) >= 2 :
+                        high = "%s"%(high_tmp[0])
+                    # 讯号质量:搜索到的卫星数目
+                    number = msg[0]["number"]
+                    precision = msg[0]["precision"]
+                    #date = msg[0]["date"]
+                
+                #gsm 信号强度
+                gsm_sig =  str((100//31)*EventMesh.publish("screen_get_sig"))
+                # 电池电量百分比 
+                bat_tmp = EventMesh.publish("screen_get_battery")
+                battery_caption =  str(bat_tmp[1])
+                #步数
+                old_step = 0
+                step = 0
+                step = EventMesh.publish("get_old_step_value")
+                if step != None:
+                    tmp_data  = EventMesh.publish("get_storage_config","old_step_new")
+                    if tmp_data != None:
+                        old_step = tmp_data
+                    if old_step !=  step:
+                        EventMesh.publish("set_storage_config",["old_step",step])
+                        EventMesh.publish("set_storage_config",["old_step_new",step])
+                else:
+                    step = 0  
+                old_step = step
+                # step = str(EventMesh.publish(constants.EVENT.GET_STEP)[0])
+                #翻转次数
+                turn_count = "0"
+                #终端状态
+                # state = "00000000"
+                state = "%08X"%(EventMesh.publish("get_dev_state"))
+                #基站数据
+                if type(TYPE) == list:#队列里的数据有终端状态,则用队里的终端状态
+                    if len(TYPE)>= 2 :
+                        state = "%08X"%(TYPE[1])
+                CELL_num = len(msg[2])
+                CELL_data = "1," #时延
+                if msg[2] != []:
+                    for CELL in msg[2] :
+                        if CELL[0] == 0 :
+                            CELL_data += "%X,"%(int(CELL[2])) #MCC
+                            CELL_data += str(CELL[3]) +","#MNC
+                            CELL_data += str(CELL[5]) +","#tac,区域码
+                            CELL_data += str(CELL[1]) +","#基站编号 CID
+                            CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                        else :
+                            CELL_data += str(CELL[5]) +","#tac,区域码
+                            CELL_data += str(CELL[1]) +","#基站编号 CID
+                            CELL_data += str(int(CELL[7]+140)) +","#信号强度 rssi
+                    CELL_data = CELL_data[:(len(CELL_data)-1)]
+                #WIFI数据
+                WIFI_num = 0 
+                WIFI_data = ""
+                if msg[1] :
+                    WIFI_num = msg[1][0]
+                    i = 0
+                    for MAC in msg[1][1] :
+                        WIFI_data += "wifi%d,%s,%d,"%(i,str(MAC[0]),MAC[1])
+                        i += 1
+                    WIFI_data = WIFI_data[:(len(WIFI_data)-1)]
+                WIFI_data = WIFI_data.lower()
+                #send_data = "UD ,%s ,%s     ,%s       ,%s       ,%s   ,%s       ,%s  ,%s    ,%s     ,%s             ,%s  ,%s        ,%s   ,%d     ,%s       ,%d      ,%s"\
+                #              %(date,GPS_type,latitude,longitude,speed,direction,high,number,gsm_sig,battery_caption,step,turn_count,state,CELL_num,CELL_data,WIFI_num,WIFI_data)
+                #定位数据
+                send_data = "%s,%s,%s"%(date,GPS_type,latitude)
+                send_data += ",%s,%s,%s"%(longitude,speed,direction)
+                send_data += ",%s,%s,%s"%(high,number,gsm_sig,)
+                send_data += ",%s,%s,%s"%(battery_caption,step,turn_count)
+                send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data)
+                send_data += ",%d,%s"%(WIFI_num,WIFI_data)
+                send_data+=",%s"%(precision)
+                #print("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size()))
                 print("Location_send3:{}-{}".format(TYPE,send_data))
-                EventMesh.publish(TYPE,send_data)
+                if type(TYPE) == list:
+                    EventMesh.publish(TYPE[0],send_data)
+                else:
+                    EventMesh.publish(TYPE,send_data)
             else :
                 break
 
@@ -2191,11 +2270,12 @@ class LocationManager(Abstract):
                 #检查基站数据
                 if self.cell_data == []:   
                     data_tmp = net.getCellInfo()
-                    if(len(data_tmp)>=2):
-                        for cell in data_tmp:
-                            if cell and cell[0][0] == 0 and len(cell[0]) > 1:
-                                self.cell_data = cell
-                                break
+                    if data_tmp != -1:
+                        if(len(data_tmp)>=2):
+                            for cell in data_tmp:
+                                if cell and cell[0][0] == 0 and len(cell[0]) > 1:
+                                    self.cell_data = cell
+                                    break
 
                 if self.location_type == 1: #测试模式
                     self.location_timer_count = 0
@@ -2274,9 +2354,12 @@ class AddrBookManager(Abstract):
         self.check_json = ql_fs.path_exists("/usr/static/storage_file/phonebook.json")
 
         if self.check_json == True:
-            with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
-                self.read_phonebook = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/phonebook.json","r",encoding="utf-8") as fd:
+                    self.read_phonebook = ujson.load(fd)
                 print("读取电话本")
+            except Exception as e:
+                usys.print_exception(e)
 
     def post_processor_after_instantiation(self):
         EventMesh.subscribe("get_phonebook_list", self.get)
@@ -2298,9 +2381,12 @@ class videoBookManager(Abstract):
         self.check_json = ql_fs.path_exists("/usr/static/storage_file/videobook.json")
 
         if self.check_json == True:
-            with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:
-                self.videobook = ujson.load(fd)
-                print("读取视频通话账号列表")
+            try:
+                with open("/usr/static/storage_file/videobook.json","r",encoding="utf-8") as fd:
+                    self.videobook = ujson.load(fd)
+                    print("读取视频通话账号列表")
+            except Exception as e:
+                usys.print_exception(e)
 
     def post_processor_after_instantiation(self):
         EventMesh.subscribe("get_videobook_list", self.get)
@@ -2391,9 +2477,12 @@ class CallLogManager(Abstract):
         self.check_json = ql_fs.path_exists("/usr/static/storage_file/Call_log.json")
 
         if self.check_json == True:
-            with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
-                self.read_call_log = ujson.load(fd)
-                print("读取通话记录")
+            try:
+                with open("/usr/static/storage_file/Call_log.json","r",encoding="utf-8") as fd:
+                    self.read_call_log = ujson.load(fd)
+                    print("读取通话记录")
+            except Exception as e:
+                usys.print_exception(e)
 
     def post_processor_after_instantiation(self):
         EventMesh.subscribe("get_call_log_list", self.get)
@@ -2462,18 +2551,27 @@ class gethistoryDataManager(Abstract):
 
         check_hr= ql_fs.path_exists("/usr/static/storage_file/history_hr.json")
         if check_hr == True :
-            with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
-                self.read_histroy_hr_data = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/history_hr.json","r") as fd:#音频文件编号
+                    self.read_histroy_hr_data = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
         
         check_temp= ql_fs.path_exists("/usr/static/storage_file/history_temp.json")
         if check_temp == True :
-            with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
-                self.read_histroy_temp_data = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/history_temp.json","r") as fd:#音频文件编号
+                    self.read_histroy_temp_data = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
 
         check_spo2= ql_fs.path_exists("/usr/static/storage_file/history_spo2.json")
         if check_spo2 == True :
-            with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
-                self.read_histroy_spo2_data = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/history_spo2.json","r") as fd:#音频文件编号
+                    self.read_histroy_spo2_data = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
         self.temp_value = 0
         
         # self.read_histroy_hr_data=[{"timeSec":16789890,"value":90},{"timeSec":16789888,"value":78},{"timeSec":16789688,"value":68},{"timeSec":16789898,"value":58},\
@@ -2526,7 +2624,7 @@ class gethistoryDataManager(Abstract):
             else:
                 self.read_histroy_temp_data.append({"timeSec": time_tmp, "temp": self.temp_value}) 
 
-            with open("/usr/static/storage_file/history_temp.json","w",encoding="utf-8") as fd:
+            with open("/usr/static/storage_file/history_temp.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.read_histroy_temp_data,fd)
             #print(self.read_histroy_temp_data)
 
@@ -2559,7 +2657,7 @@ class gethistoryDataManager(Abstract):
                 self.read_histroy_hr_data.append({"timeSec": time_tmp, "hr": self.oldHr}) 
 
 
-            with open("/usr/static/storage_file/history_hr.json","w",encoding="utf-8") as fd:
+            with open("/usr/static/storage_file/history_hr.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.read_histroy_hr_data,fd)
             #print(self.read_histroy_hr_data)
         
@@ -2587,7 +2685,7 @@ class gethistoryDataManager(Abstract):
             else:
                 self.read_histroy_spo2_data.append({"timeSec": time_tmp, "spo2": self.oldspo2}) 
 
-            with open("/usr/static/storage_file/history_spo2.json","w",encoding="utf-8") as fd:
+            with open("/usr/static/storage_file/history_spo2.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.read_histroy_spo2_data,fd)
             #print(self.read_histroy_spo2_data)
 
@@ -2659,7 +2757,7 @@ class getWeatherDataManager(Abstract):
         self.max_temp = msg[6]
         self.city = msg[7]
         self.no_data = msg[8]
-
+        EventMesh.publish("updata_refresh_weather")
 
 class getHrTimeManager(Abstract):
     def __init__(self):
@@ -2804,8 +2902,14 @@ class getStorageDataManager(Abstract):#获取内存数据
         self.config_data = {}
         check = ql_fs.path_exists("/usr/static/storage_file/config.json")
         if check == True:
-            with open("/usr/static/storage_file/config.json","r") as fd:
-                self.config_data = ujson.load(fd)
+            try:
+                with open("/usr/static/storage_file/config.json","r") as fd:
+                    self.config_data = ujson.load(fd)
+            except Exception as e:
+                usys.print_exception(e)
+                self.config_data = {'old_time': 0, 'flip_sw': 0}
+            
+            
         else :
             self.config_data = {'old_time': 0, 'flip_sw': 0}
             pass
@@ -2854,7 +2958,7 @@ class getStorageDataManager(Abstract):#获取内存数据
 #定位频率
 class getUpLoadDataManager(Abstract):#
     def __init__(self):
-        self.upload_time = 1800
+        self.upload_time = 3600
         read_data = EventMesh.publish("get_storage_config","upload_time")
         if read_data != None:
             self.upload_time = read_data 
@@ -2880,6 +2984,7 @@ class getplayAudiodStateManager(Abstract):#获取设置播放音频状态
         EventMesh.subscribe("get_audio_state", self.get_audio_state)
 
     def set_audio_state(self, event, msg): 
+        # print("getplayAudiodStateManager:{}".format(msg))
         self.play = msg
 
     def get_audio_state(self, event, msg): 
@@ -2954,6 +3059,12 @@ class getSosFlagManager(Abstract):#设置sos
            
             if number != None:
                 if len(number) > 0:
+                    sos_state =  EventMesh.publish("get_dev_state")
+                    tmp = 1 << 16
+                    sos_state = sos_state|tmp #第16位=1
+                    EventMesh.publish("set_dev_state",sos_state)
+
+                    EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
                     EventMesh.publish("save_phonename",number[0])
                     EventMesh.publish("save_phonenum",number[0])
                     EventMesh.publish("set_sos_num",0)
@@ -2968,6 +3079,11 @@ class getSosFlagManager(Abstract):#设置sos
         # print("call_timer_cb:{}".format(self.callnumer))
         EventMesh.publish("save_phonename",str(self.callnumer))
         EventMesh.publish("save_phonenum",str(self.callnumer))
+        sos_state =  EventMesh.publish("get_dev_state")
+        tmp = 1 << 16
+        sos_state = sos_state|tmp #第16位=1
+        EventMesh.publish("set_dev_state",sos_state)
+        EventMesh.publish(constants.EVENT.START_LOCATION,[constants.PROTOCOL.AL_SEND,sos_state]) #开始AL定位
         EventMesh.publish("load_screen", {"screen": "dialing_noplay_popup"})  
 
     def close_sos_timer(self,event,msg):
@@ -3130,8 +3246,6 @@ class testSmsSetIPManager(Abstract):#
 
         EventMesh.subscribe("get_new_key_pid", self.get_new_key_pid)#
 
-
-
     def set_new_key_cb(self, event, msg): 
         self.new_key = msg
         # print("set_new_key_cb",msg,self.new_key)
@@ -3314,18 +3428,21 @@ class cameraAlbumManager(Abstract):#保存相册数目
         self.album_num = 0
         check_txt = ql_fs.path_exists("/usr/static/storage_file/album_config.json")
         if check_txt == True :
-            with open("/usr/static/storage_file/album_config.json","r") as fd:#音频文件编号
-                self.album_list = ujson.load(fd)
-                if not self.album_list:
-                    self.album_list = {}
-                    self.album_num = 0 
-                else:
-                    b = str("num") in self.album_list.keys()
-                    if b == True:
-                        self.album_num = self.album_list["num"]
+            try:
+                with open("/usr/static/storage_file/album_config.json","r") as fd:#音频文件编号
+                    self.album_list = ujson.load(fd)
+                    if not self.album_list:
+                        self.album_list = {}
+                        self.album_num = 0 
+                    else:
+                        b = str("num") in self.album_list.keys()
+                        if b == True:
+                            self.album_num = self.album_list["num"]
+            except Exception as e:
+                usys.print_exception(e)
         else :
             self.album_list = {}
-            with open("/usr/static/storage_file/album_config.json","w",encoding="utf-8") as fd:
+            with open("/usr/static/storage_file/album_config.json","w+",encoding="utf-8") as fd:
                 ujson.dump(self.album_list,fd)                
 
 
@@ -3348,6 +3465,21 @@ class cameraAlbumManager(Abstract):#保存相册数目
     def get_camera_num(self, event, msg):
         
         return self.album_num
+class setCallStateManager(Abstract):#设置电话通话状态
+    def __init__(self):
+        self.call_state = 0
+
+    def post_processor_after_instantiation(self):
+        EventMesh.subscribe("set_call_state", self.set_call_state)#设置关机时间
+        EventMesh.subscribe("get_call_state", self.get_call_state)
+
+    def set_call_state(self, event, msg): 
+        self.call_state = msg
+        
+
+    def get_call_state(self, event, msg):
+        
+        return self.call_state
     
 class setclassTimeManager(Abstract):#设置上课禁用时间
     def __init__(self):
@@ -3356,11 +3488,13 @@ class setclassTimeManager(Abstract):#设置上课禁用时间
         check_json = ql_fs.path_exists("/usr/static/storage_file/class_msg.json")
 
         if check_json == True:
-            with open("/usr/static/storage_file/class_msg.json","r",encoding="utf-8") as fd:
-                self.class_buf = ujson.load(fd)
-                print("读取上课禁用时间段")
+            try:
+                with open("/usr/static/storage_file/class_msg.json","r",encoding="utf-8") as fd:
+                    self.class_buf = ujson.load(fd)
+                    print("读取上课禁用时间段")
                 # print("self.class_buf:",self.class_buf)
-        
+            except Exception as e:
+                usys.print_exception(e)
 
 
     def post_processor_after_instantiation(self):
index a4544cf..0df103e 100644 (file)
@@ -89,7 +89,7 @@ class ppMainScreen(Screen):
             delppmain_call_label = lv.label(ppmain_screen)
             delppmain_call_label.set_pos(35, 64)
             delppmain_call_label.set_size(LCD_X-35, 40)
-            delppmain_call_label.set_text("设备号交友")
+            delppmain_call_label.set_text("碰碰交友列表")
             delppmain_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
             delppmain_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -149,6 +149,7 @@ class ppMainScreen(Screen):
             EventMesh.publish("load_screen", {"screen": "pp_list"})
 
     def done_return(self):
+        # EventMesh.publish("return_prev_screen")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
     def btn1_release(self):
@@ -418,7 +419,8 @@ class ppListScreen(Screen):
 
 
     def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "pp_main"})
+        EventMesh.publish("return_prev_screen")
+        # EventMesh.publish("load_screen", {"screen": "pp_main"})
                
     def btn1_release(self):
         EventMesh.publish("load_screen", {"screen": "pp_main"})
index 3055eb4..82484d8 100644 (file)
@@ -22,6 +22,14 @@ import _thread
 import request
 import usys
 
+import uos
+from ucryptolib import aes
+import hashlib
+import base64
+import ucryptolib
+import urandom as random
+import modem
+
 def server_init(server_type = None):
     #服务器选择1,防走丢,2大锤,3三基同创,4童信 5云米
     if server_type == None:
@@ -114,6 +122,303 @@ def UnicodeHexStr_To_Utf8Str(str):
         i+=1
     return result.decode('utf-8') #返回utf8的str
 
+# Device resource authorization
+#设备资源授权平台
+
+# 补位
+
+class device_res_author(Abstract):
+   
+    def __init__(self):
+        self.deviceId = modem.getDevImei()
+        self.SHA1_BLOCK_SIZE = 64
+        self.PAD_BLOCK_SIZE = 16
+        self.SHA256 = uhashlib.sha256
+        self.pad = lambda s: s + chr(self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE) * (self.PAD_BLOCK_SIZE - len(s) % self.PAD_BLOCK_SIZE)
+        # 除去补16字节的多余字符
+        self.unpad = lambda s: s[:-s[-1]]
+        self.key = b"MWrMZjdtcPhj41jWuoqFAhTmqyFluqj1"  #产品producton 
+        self.pid = "qAtdDOGXgXYjT2HGFr3a"  #产品pid
+        EventMesh.subscribe("dev_active",self.dev_active) #设备激活
+        EventMesh.subscribe("dev_sign_in",self.dev_sign_in) #设备登入
+        EventMesh.subscribe("update_dev_token",self.update_dev_token) #设备令牌更新
+        EventMesh.subscribe("get_dev_token",self.get_dev_token) #获取token
+        self.update_dev_token_time = osTimer()
+        self.dev_res_timer=osTimer()
+        self.dev_token = None
+        self.dev_res_timerCount = 0
+        
+    def post_processor_after_instantiation(self):
+        if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+            self.dev_res_timer.start(2000, 1, self.dev_timer_cb)
+            self.update_dev_token_time.start(10*60*1000,1,self.update_dev_token_time_cb) #每10分钟更新一次
+    
+    def dev_timer_cb(self, *args): #设备资源管理鉴权平台定时器
+        if EventMesh.DEV_RES_MANAGE_AUTHEN_PLATFORM == 1:
+            EventMesh.publish("dev_active") #设备激活
+            EventMesh.publish("dev_sign_in") #设备登入
+            get_dev_token = EventMesh.publish("get_dev_token")
+            if get_dev_token == None:
+                get_dev_token = ""
+            if get_dev_token !=  None: #有token就关闭定时器s
+                if len(get_dev_token) != 0:
+                    self.dev_res_timer.stop()
+                    return
+            self.dev_res_timerCount+=1
+            if self.dev_res_timerCount > 30: #开机一分钟内没有获取到密码和token 等下一次更新令牌在走登入 激活流程
+                self.dev_res_timerCount=0
+                self.dev_res_timer.stop()
+
+    def update_dev_token_time_cb(self,*argc):
+        EventMesh.publish("update_dev_token")
+
+    def get_dev_token(self,event,msg):
+        return self.dev_token
+    
+    def HMAC(self,k, m):
+    
+        KEY_BLOCK = k + (b'\0' * (self.SHA1_BLOCK_SIZE - len(k)))
+        KEY_INNER = bytes((x ^ 0x36) for x in KEY_BLOCK)
+        KEY_OUTER = bytes((x ^ 0x5C) for x in KEY_BLOCK)
+        inner_message = KEY_INNER + m
+        outer_message = KEY_OUTER + self.SHA256(inner_message).digest()
+        return self.SHA256(outer_message)
+
+
+    def get_hmac_sha256(self,k, m):
+        data = self.HMAC(k, m).digest()
+        # print("HMAC(k, m).digest():", data)
+        # print("HMAC(k, m).digest():", ubinascii.hexlify(data))
+        hex_data = ubinascii.hexlify(data)
+        hex_data = hex_data.decode('ascii')
+        return hex_data
+    # 加密函数
+    def aes_CBC_Encrypt(self,data, key, iv):  # CBC模式的加密函数,data为明文,key为16字节密钥,iv为16字节的偏移量
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')  # CBC 模式下的偏移量
+        data = self.pad(data)  # 补位
+        data = data.encode('utf-8')
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv)
+        result = base64.b64encode(aes.encrypt(data))
+        return str(result, 'utf-8')  # 以字符串的形式返回
+
+    # 解密函数
+    def aes_CBC_Decrypt(self,data, key, iv):  # CBC模式的解密函数,data为密文,key为16字节密钥
+        key = key.encode('utf-8')
+        iv = iv.encode('utf-8')
+        
+        aes = ucryptolib.aes(key,ucryptolib.MODE_CBC,iv) #CBC模式
+
+        # decrypt AES解密  B64decode为base64 转码
+        result = aes.decrypt(base64.b64decode(data))
+        result = self.unpad(result)  # 除去补16字节的多余字符
+        return str(result, 'utf-8')  # 以字符串的形式返回
+    #激活接口 没有密码走激活
+    def dev_active(self,event,msg):
+        signal = EventMesh.publish("screen_get_sig")
+        if signal == -1 or EventMesh.publish("get_sim_Status") != 1:#网络不正常
+            print("dev_active 无 SIM卡!!!!!!!!\r\n")
+            return
+        # 签名内容: = deviceId+pid+timeStamp
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        print("dev_pass:{}\r\n".format(dev_pass))
+        if dev_pass == None:
+            dev_pass = ""
+        if dev_pass == "" or dev_pass == None:
+            date_tmp = utime.localtime() #获取当前时间
+            print("date_tmp:{}\r\n".format(date_tmp)) #转换时间戳s
+            timeStamp = (utime.mktime(date_tmp))*1000#获取时间戳ms
+            deviceId = modem.getDevImei() #self.deviceId #"876226002022574" #以imei号
+            pid = self.pid
+            key = self.key
+            sign_data = "{}{}{}".format(deviceId,pid,timeStamp)  #签名内容
+            print("sign_data:{}\r\n".format(sign_data))
+            sha256_hex = self.get_hmac_sha256(key,sign_data)
+            print("sha256_hex:{}\r\n".format(sha256_hex))
+
+            data = {
+                "deviceId":"{}".format(deviceId), #设备名
+                "pid":pid, #产品PID
+                "sign":"{}".format(sha256_hex), #HMACSHA256签名后的数据
+                "timeStamp":timeStamp, #要以ms的形式
+                "signMethod":"HMACSHA256" #签名方式 HMACSHA256
+            }
+            print(ujson.dumps(data))
+            headers_T ={"Content-Type":"application/json"}
+            url = "http://dmp.raisound.com/bz-api/dev/auth/active"
+            data =ujson.dumps(data)
+            response = 0
+            response_result = 0
+            try:
+                response = request.put(url,data=data,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("put error!!!!!\r\n")
+                response_result = 0
+            
+            IV = "" #偏移量
+            PASSWORD= "" #服务器返回后的加密内容 密码
+            if response_result == 1: #访问成功ip
+                if response.status_code == 200:
+                    content = response.content
+                    c = next(content)
+                    # "api.xcloudtech.com"
+                    # d_server_port = 9000
+                    data =  ujson.loads(c)
+                    # data = response.json()
+                    print("data-{}".format(data))
+                    if data != None:
+                        if "success" in data:
+                            if data['success'] == True:
+                                if "data" in data:
+                                    data_tmp = data["data"]
+                                    if "nonce" in data_tmp: #偏移量
+                                        IV = data_tmp["nonce"]
+                                    if "password" in data_tmp:
+                                        PASSWORD = data_tmp["password"]
+                                        # EventMesh.publish("set_storage_config",["dev_pass",PASS])
+                    if PASSWORD != None and IV != None:
+                        if len(PASSWORD) != 0 and len(IV) != 0:
+                            password = PASSWORD
+                            iv = IV
+                            #解密 之后保存本地下一次登入做使用
+                            decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                            print("decrypt_data {}".format(decrypt_data))
+                            EventMesh.publish("set_storage_config",["dev_pass",decrypt_data])
+                    
+                        
+                print("IV:{}\r\n PASS:{}".format(IV,PASSWORD)) 
+            return [response_result,PASSWORD,IV]
+    #随机生成16个字节的字符串作为加密的IV 偏移量
+    def generate_random_string(self,length=16): 
+        random_str = ""
+        chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+        for i in range(length):
+            random_str+=chars[random.randint(0,length)]
+        return random_str
+
+    #设备登入 没有Token 走登入获取token
+    def dev_sign_in(self,event,msg):
+        signal = EventMesh.publish("screen_get_sig")
+        if signal == -1 or EventMesh.publish("get_sim_Status") != 1:#网络不正常
+            print("dev_sign_in 无 SIM卡!!!!!!!!\r\n")
+            return
+        token = ""
+        token = self.dev_token #EventMesh.publish("get_storage_config","dev_token")
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass") 
+        print("token:{}\r\n".format(token))
+        if token == None:
+            token = ""
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0:#没有密码
+            return
+        if token == None or token == "":
+            if 1: #返回结果成功
+                #获取本地保存的密码
+                decrypt_data=EventMesh.publish("get_storage_config","dev_pass")
+                # decrypt_data = self.aes_CBC_Decrypt(password, self.key, iv) #对服务器下发的密码进行解密
+                print("decrypt_data {}".format(decrypt_data))
+                #随机生成16个字符串 设备生成做加密使用
+                random_string = self.generate_random_string(16) #随机的16个字符串
+                enc_iv = random_string #加密的IV偏移量
+                #设备端进行密码加密
+                encrypt_data = self.aes_CBC_Encrypt(decrypt_data, self.key, enc_iv)
+                print("encrypt_data {}".format(encrypt_data))
+
+                #登入数据
+                deviceId = modem.getDevImei() #self.deviceId
+                sign_in_data = {
+                    "deviceId":"{}".format(deviceId), #设备ID
+                    "password":"{}".format(encrypt_data), #加密的数据
+                    "nonce":"{}".format(random_string) #随机的16个字符串
+                }
+                print(ujson.dumps(sign_in_data))
+                sign_url = "http://dmp.raisound.com/bz-api/dev/auth/sign_in" #登入地址
+                headers_T ={"Content-Type":"application/json"}
+                response_result = 0
+                response = 0
+                try:
+                    response = request.post(sign_url,data=ujson.dumps(sign_in_data),headers = headers_T)
+                    response_result = 1
+                except Exception as e:
+                    print("post error!!!!!\r\n")
+                    response_result = 0
+                # {'msg': '', 'code': 20001, 'success': True, 
+                # 'data': {'deviceId': '876226002022574', 
+                # 'token': '95436a9e09fd0ff89feb8825257dca982f'}
+                # }
+                token = ""
+                if response_result == 1:
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        data =  ujson.loads(c)
+                        print("data-{}".format(data))
+                        if data != None:
+                            if "success" in data:
+                                if data['success'] == True: #登入成功
+                                    if "data" in data:
+                                        data_tmp = data["data"]
+                                        if "token" in data_tmp: #token
+                                            token = data_tmp["token"]
+                                            self.dev_token = token
+                                            # EventMesh.publish("set_storage_config",["dev_token",token])
+                print("token:{}\r\n".format(token))
+                pass
+    #获取新的令牌 更新token
+    def update_dev_token(self,event,msg):
+        dev_pass = ""
+        dev_pass = EventMesh.publish("get_storage_config","dev_pass")
+        # print("update_dev_token :\r\n")
+        if dev_pass == None:
+            dev_pass = ""
+        if len(dev_pass) == 0: #没有密码走激活
+            print("no dev_pass:{}\r\n".format(dev_pass))
+            EventMesh.publish("dev_active") #设备激活
+        token = self.dev_token #EventMesh.publish("get_storage_config","dev_token")
+        if token == None:
+            token = ""
+        if len(token) == 0: #没有token走登入
+            print("no dev_token:{}\r\n".format(token))
+            # self.dev_sign_in()
+            EventMesh.publish("dev_sign_in") #设备登入
+
+        dev_tokenip = "http://dmp.raisound.com/bz-api/dev/auth/token" #设备新令牌更新地址
+        token = self.dev_token #EventMesh.publish("get_storage_config","dev_token")
+        if token == None:
+            token = ""
+        if len(token) != 0:
+            response_result=0
+            response = 0
+            headers_T = {"bz-dt":"{}".format(token)}
+            try:
+                response = request.get(dev_tokenip,headers = headers_T)
+                response_result = 1
+            except Exception as e:
+                print("get error!!!!!\r\n")
+                response_result = 0
+            if response_result == 1:
+                if response.status_code == 200:
+                    try:
+                        headers_data = response.headers
+                        # print("headers_data!!!!! headers_data:{}\r\n".format(headers_data))
+                        if "bz-dt" in headers_data: #bz-dt字段是否在头部数据里面 如果有就需要更新
+                            bz_dt = headers_data["bz-dt"] 
+                            dev_token = bz_dt.replace(" ", "") #去掉所有的空格符
+                            print(dev_token)
+                            self.dev_token = dev_token
+                            # EventMesh.publish("set_storage_config",["dev_token",dev_token])
+                    except Exception as e:
+                        print("headers_data!!!!! error\r\n")
+        
+        pass
+
+
+
+
+
 class SockManager(Abstract):
     def __init__(self):
         self.sock = None
@@ -126,13 +431,14 @@ class SockManager(Abstract):
         self.reconnect_time = 1000
         self.reconnect_flag = 0
         self.connect_tmp = 0
-       
         server_data = server_init()
         # EventMesh.debug_log("SockManager:server_data:{}".format(server_data))
         # self.server_addr = server_data[0]
         # self.server_port = server_data[1]
         self.server_addr = ""
         self.server_port = ""
+        self.dev_res_timer = osTimer()
+        self.dev_res_timerCount = 0
         ip_infor = {}
         ip_infor = EventMesh.publish("get_new_ip_com")
         print("ip_infor1:{} \n\n\n".format(ip_infor))
@@ -154,6 +460,7 @@ class SockManager(Abstract):
     def post_processor_after_instantiation(self):
         EventMesh.subscribe(constants.EVENT.CHANNEL_SOCKET_SEND, self.send)
         self.monitor_timer.start(7 * 60 * 1000, 1, self.check)
+        
 
     def add_support_resolver(self, resolver):
         self.resolver = resolver
@@ -166,7 +473,7 @@ class SockManager(Abstract):
 
     def connect(self):
         print("connect1{}:{}".format(self.server_addr, self.server_port))
-        if EventMesh.publish("get_sim_Status") != 1: #没sim
+        if EventMesh.publish("network_state") == 0: #没注网
             return
         try:
             if(self.sock != None) :
@@ -178,10 +485,10 @@ class SockManager(Abstract):
             
             #utime.sleep_ms(500)
             #  发送数据
-            self.publish_timer.start(2000, 1, self.publish_timer_cb)
             
+            self.publish_timer.start(2000, 1, self.publish_timer_cb)
             EventMesh.publish(constants.PROTOCOL.LK_SEND)
-            print("connect LK_SEND!!!!!!!!!!!!!!")
+
         except Exception as e:
             #usys.print_exception(e)
             self.run_flag = False
@@ -190,8 +497,10 @@ class SockManager(Abstract):
         print("connect2{}:{}".format(self.server_addr, self.server_port))
         self.reconnect_flag = 0
     def publish_timer_cb(self, *args):
+        
         self.authen_set()
-
+    
+                
     def authen_set(self):
         sever_state = EventMesh.publish("get_server_state")#获取修改服务器状态
         # print("sever_state{}".format(sever_state))
@@ -231,60 +540,76 @@ class SockManager(Abstract):
                 url = "http://app.api.thisiot.com/dev/device/check?imei={}&bid={}&sonce={}&sign={}".format(imei,pid_data,sonce_data,sign_data)
 
                 # print("url:{}".format(url))
-                response = request.get(url)
-                data_tmp ={}
+                data_tmp = {}
+                connect_flag = 0
+                try:
+                    response = request.get(url)
+                    connect_flag = 1
+                except Exception as e:
+                    usys.print_exception(e)
+                
                 # d_server_addr = "device.miwitracker.com"
                 # d_server_port = 8505
                 # d_md5_key = ""
                 # d_PID = "3G"
                 # response.content = {'protocolType': '', 'host': 'device.miwitracker.com', 'secretKey': '', 'port': 8505, 'bid': '3G', 'extJsonStr': ''}
                 # response.status_code=200
-                print("test-{}".format(response.status_code))
-                if response.status_code == 200:
-                    content = response.content
-                    c = next(content)
-                    # "api.xcloudtech.com"
-                    # d_server_port = 9000
-                    jsload_data =  ujson.loads(c)
-                    print("jsload_data-{}".format(jsload_data))
-                    # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
-                    # ujson.loads(c)
-                    
-                    if "success" in jsload_data:
-                        success = jsload_data["success"]
-                        if success == True:#合法设备
-                            if "data" in jsload_data:
-                                data_tmp = jsload_data["data"]#返回的数据 
-                                print("data_tmp:{}".format(data_tmp))
-                                code = jsload_data["code"]
-                                if code == 20000:#合法的设备
-                                    protocloType = data_tmp["protocolType"]#协议类型
-                                    host = data_tmp["host"]#服务骑地址
-                                    secretKey = data_tmp["secretKey"]#
-                                    pid = data_tmp["bid"]#产品型号
-                                    port = data_tmp["port"]#端口号
-
-                                   
-
-                                    if host != '' and (port != '' and port != -1):
-                                        if host != '':
-                                            self.server_addr = host
-                                            EventMesh.publish("set_ip",str(self.server_addr))
-                                        
-                                        if port != '' and port != -1:
-                                            self.server_port = port
-                                            EventMesh.publish("set_com",self.server_port)
-                                        EventMesh.publish("set_new_key", str(secretKey))#获取pid和key
-                                        EventMesh.publish("set_new_pid",str(pid))#获取pid和key
-                                        # self.reconnect_timer_cb()#重连设备
-                                        print("self.reconnect_flag",self.reconnect_flag)
-                                        self.reconnect_flag = 0
-                                        self.reconnect()#重连设备
+                print("connect_flag:{}\r\n".format(connect_flag))
+                if connect_flag == 1:
+                    print("response.status_code:{} connect_flag:{}\r\n".format(response.status_code,connect_flag))
+                    if response.status_code == 200:
+                        content = response.content
+                        c = next(content)
+                        # "api.xcloudtech.com"
+                        # d_server_port = 9000
+                        jsload_data =  ujson.loads(c)
+                        print("jsload_data-{}".format(jsload_data))
+                        # jsload_data = {'data':'111','protocolType':'', 'host':'device.miwitracker.com', 'secretKey': 'bZld0ALsZTt15tKEZhOlLPgbsO75BLTP', 'port':8505, 'bid': '3G', 'extJsonStr': ''}
+                        # ujson.loads(c)
+                        
+                        if "success" in jsload_data:
+                            success = jsload_data["success"]
+                            if success == True:#合法设备
+                                if "data" in jsload_data:
+                                    data_tmp = jsload_data["data"]#返回的数据 
+                                    print("data_tmp:{}".format(data_tmp))
+                                    code = jsload_data["code"]
+                                    if code == 20000:#合法的设备
+                                        protocloType = data_tmp["protocolType"]#协议类型
+                                        host = data_tmp["host"]#服务骑地址
+                                        secretKey = data_tmp["secretKey"]#
+                                        pid = data_tmp["bid"]#产品型号
+                                        port = data_tmp["port"]#端口号
+
+                                    
+                                        if secretKey != '' and secretKey != -1:
+                                            EventMesh.publish("set_new_key", str(secretKey))#获取pid和key
+                                        if pid != '' and pid != -1:
+                                            EventMesh.publish("set_new_pid",str(pid))#获取pid和key
+
+                                        if host != '' and (port != '' and port != -1):
+                                            if host != '':
+                                                self.server_addr = host
+                                                EventMesh.publish("set_ip",str(self.server_addr))
+                                            
+                                            if port != '' and port != -1:
+                                                self.server_port = port
+                                                EventMesh.publish("set_com",self.server_port)
+                                            
+                                            # self.reconnect_timer_cb()#重连设备
+                                            print("self.reconnect_flag",self.reconnect_flag)
+                                            self.reconnect_flag = 0
+                                            self.reconnect()#重连设备
+                        self.publish_timer.stop()
+                        EventMesh.publish("set_server_state",1)#获取修改服务器状态
+                else:
                     self.publish_timer.stop()
-                    EventMesh.publish("set_server_state",1)#获取修改服务器状态
             else:
                 self.publish_timer.stop()
 
+
+
+
     def check(self, *args):
         if (not self.run_flag) or (self.connect_tmp == 0) : #7分钟无数据读取,则认为是掉线了
             print("tcp reconnect!!!!!!!!!!!!!!!!!!")
@@ -307,9 +632,10 @@ class SockManager(Abstract):
          while True:
             data = self.socket_send_queue.get()
             print("TCP:send data1 len:{}".format(len(data)))
-
+            socketsta = -1
+            if self.sock !=  None:
             #print("ui_queue_thread:data = {}".format(data))
-            socketsta = self.sock.getsocketsta() 
+                socketsta = self.sock.getsocketsta() 
             if(socketsta == -1): #给释放了或者出错了
                 continue
             if(socketsta == 4):#正常连击
@@ -344,7 +670,7 @@ class SockManager(Abstract):
             utime.sleep(1)
 
     def send(self, topic, msg):
-        print("TCP:send data:{}".format(msg))
+        # print("TCP:send data:{}".format(msg))
         if EventMesh.publish("network_state") == 0: #没注网,则不发送
             EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网
             print("dataCall not connect")
@@ -612,7 +938,8 @@ class KA_ProtoCol(ProtoCol):
                     # print("old_step:send:%d %d"%(old_step,step))
                     EventMesh.publish("set_storage_config",["old_step_new",step+10])
                     EventMesh.publish("set_storage_config",["old_step_new",step])
-
+        else:
+            step = 0
         old_step = step
         # step = EventMesh.publish(constants.EVENT.GET_STEP)[0]
         # 电池电量百分比 
@@ -805,7 +1132,7 @@ class PHL_ProtoCol(ProtoCol):
             phonebook_oldtmp = phonebook_tmp
                 # print("phonebook_oldtmp!!!:{}".format(str(phonebook_oldtmp)))
         # print("phonebook!!!:{}".format(str(phonebook)))
-        with open("/usr/static/storage_file/phonebook.json","w",encoding="utf-8") as fd:
+        with open("/usr/static/storage_file/phonebook.json","w+",encoding="utf-8") as fd:
             ujson.dump(phonebook,fd)
             print("创建电话簿")
         
@@ -881,7 +1208,7 @@ class REMIND_ProtoCol(ProtoCol):#普通闹钟
     TYPE = "REMIND"
     
     def send(self, event, msg):
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMIND"%(self.imei)
+        send_data = self.PID+"*%s*0006*REMIND"%(self.imei)
         MD5_SIGN = self.pack_MD5_head(send_data)
         data = "[%s%s]"%(str(MD5_SIGN),send_data)
         #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
@@ -1119,183 +1446,6 @@ class TEMP_ProtoCol(ProtoCol):
         # print("HRSTART_ProtoCol RECV msg:")
         #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
 
-# 设置血压上传频率
-# 平台发送[XT*YYYYYYYYYYYYYYY*LEN*bldstart,x]
-# x为上传间隔时间,单位秒,连续上传时最小时间不小于300秒,最大不超过65535.
-# 示例[XT*334588000000156*0008*bldstart,300]
-# 终端回复:
-# [XT*334588000000156*0005*bldstart]
-# x为1则代表终端单次上传。
-# x为0则代表终端上传关闭。
-class bldstart_ProtoCol(ProtoCol):
-    """app下发血压测试频率"""
-    TYPE = "bldstart"
-    def send(self, event, msg):
-        #[XT*334588000000156*len*wdstart,300]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bldstart"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # print("temp:data:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-    def recv(self, event, msg):
-        """
-        @param event: 体温下发频率数据
-        @param msg: 接收到的下行数据
-        """
-        # print("WDSTART_ProtoCol RECV msg:")
-        print("bldstart:{}".format(msg))
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_tmp = msg_tmp.split(',')
-        msg_tmp = msg_tmp[1]
-
-        bldstartTotal = int(msg_tmp)
-        print("bldstartTotal:{}".format(bldstartTotal))
-        if bldstartTotal == 1:#单次测量
-            get_bp_state = EventMesh.publish("get_bp_state")
-            get_hr_state = EventMesh.publish("get_hr_state")
-            get_spo2_state = EventMesh.publish("get_spo2_state")
-            print("get_bp_state:{}".format(get_bp_state))
-            if get_bp_state == 0 and get_hr_state == 0 and get_spo2_state == 0:#只要两个不在测量 单次优先级最低
-                EventMesh.publish("set_bp_state",3)#3代表单次测量
-        else:
-            if bldstartTotal > 0 and bldstartTotal <= 300:
-                bldstartTotal = 300
-            elif bldstartTotal >= 65536:
-                bldstartTotal = 65536
-            EventMesh.publish("set_bp_time", bldstartTotal)
-           
-        EventMesh.publish(constants.PROTOCOL.BLDSTART_SEND)
-
-
-# 注:回复完后开始测量血压并上传(一般测一次90秒,app端会提醒用户两分钟后刷新页面查看)
-# 上传血压数据
-# 终端发送[XT*YYYYYYYYYYYYYYY*LEN*blood,x,y]
-# x 是收缩压(高压)
-# y 是舒张压(低压)
-# 示例[XT*334588000000156*000C*blood,150,70]
-# 平台回复:
-# [XT*334588000000156*0005*blood]
-class blood_ProtoCol(ProtoCol):
-    """上传血压测试数据"""
-    TYPE = "blood"
-    def send(self, event, msg):
-        len_size = len(str(msg[0]))+len("blood,")+1+len(str(msg[1]))
-        print("blood:send:{} len:{}".format(msg,len_size))
-        #  实例:[XT*334588000000156*0009*blood,36,2]
-        # 代表终端的
-        # 平台回复:
-        # [XT*334588000000156*0004*blood]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*blood"%(self.imei,len_size)
-        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"blood")
-        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
-        data = "[%s%s,%d,%d]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
-        print("blood:data:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-        
-    def recv(self, event, msg):
-        """
-        @param event: 
-        @param msg: 接收到的下行数据
-        """
-        # print("HRSTART_ProtoCol RECV msg:")
-        #EventMesh.publish(constants.PROTOCOL.TEMP_SEND)
-
-
-
-class TEMP_Hour_ProtoCol(ProtoCol): #云米服务独立指令体温
-    """上传体温频率 小时单位"""
-    TYPE = "bodytemp"
-    def send(self, event, msg):
-        #[XT*334588000000156*len*wdstart,300]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*bodytemp"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # print("temp:data:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-    def recv(self, event, msg):
-        """
-        @param event: 体温下发频率数据
-        @param msg: 接收到的下行数据
-        """
-        # print("WDSTART_ProtoCol RECV msg:")
-        #TCP recv: data:b'[3G*860132060126844*000C*bodytemp,1,2]'
-        print("bodytemp:{}".format(msg))
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_tmp = msg_tmp.split('bodytemp,')
-        msg_tmp = msg_tmp[1]
-
-        body_time = 0
-        body_on = 0
-        body_on = msg_tmp.split(',')[0]#开关
-        body_time = msg_tmp.split(',')[1]
-
-        if int(body_on) == 0:
-            body_time = 0
-        else:
-            body_time = int(body_time)*3600
-
-        tempTotal = int(body_time)
-        
-
-        EventMesh.publish("set_temp_time",tempTotal)
-        EventMesh.publish(constants.PROTOCOL.BODYTEMP_SEND)
-
-class bodytemp2_ProtoCol(ProtoCol):
-    """立即测量"""
-    TYPE = "bodytemp2"
-    def send(self, event, msg):
-        #[XT*334588000000156*len*bodytemp2,300]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0009*bodytemp2"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # print("temp:data:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-    def recv(self, event, msg):
-        """
-        @param event: 体温下发频率数据
-        @param msg: 接收到的下行数据
-        """
-        # print("bodytemp2_ProtoCol RECV msg:")
-        print("bodytemp2:{}".format(msg))
-        get_temp_state = EventMesh.publish("get_temp_state")
-        print("get_temp_state:{}".format(get_temp_state))
-        if get_temp_state == 0:#只要两个不在测量 单次优先级最低
-            EventMesh.publish("set_temp_state",3)#3代表单次测量
-        EventMesh.publish(constants.PROTOCOL.BODYTEMP2_SEND)
-class btemp2_ProtoCol(ProtoCol):#上传体温数据
-    """立即测量"""
-    TYPE = "btemp2"
-    def send(self, event, msg):
-        # [3G*YYYYYYYYYY*LEN*btemp2,type,temp] Type :测量模式:0:额头模式 1: 手腕模式Temp :体温,
-        len_size = len(str(msg[0]))+len("btemp2,")+1+len(str(msg[1]))
-        print("btemp2:send:{} len:{}".format(msg,len_size))
-        #  实例:[XT*334588000000156*0009*btemp2,1,36.2]
-        # 代表终端的温度为:36.2
-        # 平台回复:
-        # [XT*334588000000156*0004*btemp2]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*btemp2"%(self.imei,len_size)
-        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,len_size,"btemp2")
-        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
-        data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,1,msg[1])
-        # print("btemp2:data:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-    def recv(self, event, msg):
-        """
-        @param event: 体温下发频率数据
-        @param msg: 接收到的下行数据
-        """
-        # print("btemp2_ProtoCol RECV msg:")
 class WDSTART_ProtoCol(ProtoCol):
     """上传体温频率"""
     TYPE = "wdstart"
@@ -1615,20 +1765,13 @@ class Time_ProtoCol(ProtoCol):
 
         machine.RTC().datetime((next_alarm_time[0],next_alarm_time[1],next_alarm_time[2],next_alarm_time[6],next_alarm_time[3],next_alarm_time[4],next_alarm_time[5],0))
         #next_alarm_time = utime.localtime(old_Timesec)#年月日时分秒星期365中的第几天
-        EventMesh.publish("set_rtc_alarm")
+
         #EventMesh.publish(constants.PROTOCOL.TIME_SEND)  
 
 
 #拒接模式来电
 class WLKEY_ProtoCol(ProtoCol):
-    """
-    白名单开关
-    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY,ONOFF]  ONOFF: 1:开启,0:关闭,2:30秒后自动接听。
-    实例:[XT*334588000000156*0008*WLKEY,1]
-    终端回复
-    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
-    实例:[XT*334588000000156*0006*WLKEY]
-    """
+    """"""
     TYPE = "WLKEY"
     def send(self, event, msg):
         
@@ -1642,14 +1785,16 @@ class WLKEY_ProtoCol(ProtoCol):
         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
 
     def recv(self, event, msg):
+        """
+        @param event:
+        @param msg: 接收到的下行数据
+        """
         msg = msg[1:-1]
         msg_tmp = msg.decode('ascii')
         msg_data = msg_tmp.split(',')
         print("WLKEY_ProtoCol".format(msg_data[1]))
         EventMesh.publish("set_storage_config",["WLKEY",str(msg_data[1])])
-        
-
-        EventMesh.publish(constants.PROTOCOL.WLKEY_SEND) 
+        EventMesh.publish(constants.PROTOCOL.WLKEY_SEND)  
 
 # [SG*5678901234*0037* SILENCETIMEFS,21:10-7:30@0111110,21:10-7:30@0111110,21:10-7:30@0111110,21:10-7:30@0111110]
 
@@ -1673,77 +1818,57 @@ class SILENCETIMEFS_ProtoCol(ProtoCol):#云米
         @param event:
         @param msg: 接收到的下行数据
         """
-        class_in_buf = {"1": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []},\
-        "0": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}, \
-        "3": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}, \
-        "2": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}}
-
+        # [XT*YYYYYYYYYYYYYYY*LEN*SILENCETIME2,时间段-开关-自定义日期,时间段-开关-自定义日期,时
+        # 间段-开关-自定义日期]
+        class_in_buf = []
+        # b'[SZKW*860132060128139*004E*SILENCETIME2,00:00-09:00-1-0111110,15:00-22:00-0-1111111,00:00-23:00-0-0100001]'
         # class_in_buf.append({'start_hour': "16:54", 'week': [], 'idx': 0, 'enabled': 0, 'end_hour': "18:39"}) 
         msg = msg[1:-1]
         msg_tmp = msg.decode('ascii')
-        msg_tmp_d = str(msg_tmp.split('SILENCETIMEFS,')[1])
+        msg_tmp_d = str(msg_tmp.split('SILENCETIME2,')[1])
         
-        count = 1
+        count = 0
         k = 0
-
+        i = 0
         for i in range(len(str(msg_tmp_d))):
             if msg_tmp_d[i] == ',':
                 count+=1
-
-        for x in range(count):#21:10-7:30@0111110,21:10-7:30@0111110,21:10-7:30@0111110,21:10-7:30@0111110
-            week = []
-            if x >= 4:
-                break
-            if count > 1:
-
-                msg_data = msg_tmp_d.split(',')[x]
-                print("SILENCETIMEFS count",msg_data)
-                b = msg_data.find('-')
+        
+        count+=1
+        if count >= 3:
+            count = 3
+        print("class count",count)
+        for i in range(0,count):#00:00-09:00-1-0111110,15:00-22:00-0-1111111,00:00-23:00-0-0100001默认是三个时间多了也不保存
+            alarm_day = []
+            alarm_data = str(msg_tmp_d.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(alarm_data) != 0:
+                b = alarm_data.find('-')
                 if b != -1:
-                    data = msg_data.split('-')#-作为分隔符
-                    time = data[1].split('@')#@作为分隔符
-                    print("data",data,time,data[0],time[0])
-                    start_time = data[0]#开始时间
-                    end_time = time[0]#结束时间
-                    enable = 1
-                    week_day = time[1]
-                    for i in range(0,7):
-                        if week_day[i] != '0':
-                            week.append(i)
-                    tmp={}
-                    tmp["start_time"] = start_time
-                    tmp["end_time"] = end_time
-                    tmp["week"] = week
-                    tmp["enable"] = enable
-                    class_in_buf["{}".format(x)] = tmp
-            else:
-                if len(msg_tmp_d) != 0:
-                    b = msg_tmp_d.find('-')
-                    if b != -1:
-                        
-                        data = msg_tmp_d.split('-')#-作为分隔符
-                        time = data[1].split('@')#@作为分隔符
-                        print("data",data,time,data[0],time[0])
-                        start_time = data[0]#开始时间
-                        end_time = time[0]#结束时间
-                        enable = 1
-                        week_day = time[1]
-                        for i in range(0,7):
-                            if week_day[i] != '0':
-                                week.append(i)
-                        tmp={}
-                        tmp["start_time"] = start_time
-                        tmp["end_time"] = end_time
-                        tmp["week"] = week
-                        tmp["enable"] = enable
-                        class_in_buf["{}".format(x)] = tmp
+                    start_time = alarm_data.split('-')[0]#-作为分隔符
+                    end_time = alarm_data.split('-')[1]#-作为分隔符
+                    alarm_enable = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义
 
-        with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
-            ujson.dump(class_in_buf,fd)
+                    start_hour = int(start_time.split(":")[0])#时间
+                    start_min = int(start_time.split(":")[1])#冒号分隔时间 时 分
 
+                    end_hour = int(end_time.split(":")[0])#时间
+                    end_min = int(end_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符
+                    if len(str(alarm_day_tmp)) != 0:
+                        for i in range(0,7):
+                            if alarm_day_tmp[i] != '0':
+                                alarm_day.append(i)
+                    # if alarm_switch = 0:
+                    class_in_buf.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min,"day":alarm_day,"enable":alarm_enable})
+        
+        EventMesh.publish("set_storage_config",["class_alarm",class_in_buf])
+        class_alarm = EventMesh.publish("get_storage_config","class_alarm")
+        print("class_alarm",class_alarm)
 
         EventMesh.publish("set_class_time", class_in_buf)
-        EventMesh.publish(constants.PROTOCOL.SILENCETIMEFS_SEND)  
+        EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND)  
         EventMesh.publish("get_class_in_time_page")
 
 
@@ -1767,65 +1892,54 @@ class SILENCETIME2_ProtoCol(ProtoCol):
         @param event:
         @param msg: 接收到的下行数据
         """
-        class_in_buf = {"1": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []},\
-        "0": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}, \
-        "3": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}, \
-        "2": {'enable': 0, 'end_time': '00:00', 'start_time': '00:00', 'week': []}}
-
+        # [XT*YYYYYYYYYYYYYYY*LEN*SILENCETIME2,时间段-开关-自定义日期,时间段-开关-自定义日期,时
+        # 间段-开关-自定义日期]
+        class_in_buf = []
+        # b'[SZKW*860132060128139*004E*SILENCETIME2,00:00-09:00-1-0111110,15:00-22:00-0-1111111,00:00-23:00-0-0100001]'
         # class_in_buf.append({'start_hour': "16:54", 'week': [], 'idx': 0, 'enabled': 0, 'end_hour': "18:39"}) 
         msg = msg[1:-1]
         msg_tmp = msg.decode('ascii')
         msg_tmp_d = str(msg_tmp.split('SILENCETIME2,')[1])
         
-        count = 1
+        count = 0
         k = 0
-
+        i = 0
         for i in range(len(str(msg_tmp_d))):
             if msg_tmp_d[i] == ',':
                 count+=1
-
-        for x in range(count):#08:00-17:00-1-0111110,08:00-17:00-1-0111110
-            week = []
-            if count > 1:
-                msg_data = msg_tmp_d.split(',')[k]
-                # print("SILENCETIME count",msg_data)
-                k+= 1
-                b = msg_data.find('-')
-                if b != -1:
-                    data = msg_data.split('-')#-作为分隔符
-                    start_time = data[0]
-                    end_time = data[1]
-                    enable = int(data[2])
-                    week_day = data[3]
-                    for i in range(0,7):
-                        if week_day[i] != '0':
-                            week.append(i)
-                    tmp={}
-                    tmp["start_time"] = start_time
-                    tmp["end_time"] = end_time
-                    tmp["week"] = week
-                    tmp["enable"] = enable
-                    class_in_buf["{}".format(x)] = tmp
-            else:
-                b = msg_tmp_d.find('-')
+        
+        count+=1
+        if count >= 3:
+            count = 3
+        print("class count",count)
+        for i in range(0,count):#00:00-09:00-1-0111110,15:00-22:00-0-1111111,00:00-23:00-0-0100001默认是三个时间多了也不保存
+            alarm_day = []
+            alarm_data = str(msg_tmp_d.split(',')[i])
+            # print("i",i,sleep_data)
+            if len(alarm_data) != 0:
+                b = alarm_data.find('-')
                 if b != -1:
-                    data = msg_tmp_d.split('-')#-作为分隔符
-                    start_time = data[0]
-                    end_time = data[1]
-                    enable = int(data[2])
-                    week_day = data[3]
-                    for i in range(0,7):
-                        if week_day[i] != '0':
-                            week.append(i)
-                    tmp={}
-                    tmp["start_time"] = start_time
-                    tmp["end_time"] = end_time
-                    tmp["week"] = week
-                    tmp["enable"] = enable
-                    class_in_buf["{}".format(x)] = tmp
-
-        with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
-            ujson.dump(class_in_buf,fd)
+                    start_time = alarm_data.split('-')[0]#-作为分隔符
+                    end_time = alarm_data.split('-')[1]#-作为分隔符
+                    alarm_enable = int(alarm_data.split('-')[2])#是单次还是每天 还是自定义
+
+                    start_hour = int(start_time.split(":")[0])#时间
+                    start_min = int(start_time.split(":")[1])#冒号分隔时间 时 分
+
+                    end_hour = int(end_time.split(":")[0])#时间
+                    end_min = int(end_time.split(":")[1])#冒号分隔时间 时 分
+                    
+                    alarm_day_tmp = alarm_data.split('-')[3]#-作为分隔符
+                    if len(str(alarm_day_tmp)) != 0:
+                        for i in range(0,7):
+                            if alarm_day_tmp[i] != '0':
+                                alarm_day.append(i)
+                    # if alarm_switch = 0:
+                    class_in_buf.append({"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min,"day":alarm_day,"enable":alarm_enable})
+        
+        EventMesh.publish("set_storage_config",["class_alarm",class_in_buf])
+        class_alarm = EventMesh.publish("get_storage_config","class_alarm")
+        # print("class_alarm",class_alarm)
 
         EventMesh.publish("set_class_time", class_in_buf)
         EventMesh.publish(constants.PROTOCOL.SILENCETIME2_SEND)  
@@ -1853,7 +1967,6 @@ class KEYBRD_ProtoCol(ProtoCol):
         """
         # b'[SZKW*867387060319166*000A*KEYBRD]'
         # print("KEYBRD!!!!!!!!!!!!!",msg)
-  
         msg = msg[1:-1]
         msg_tmp = msg.decode('ascii')
         msg_tmp_d = int(str(msg_tmp.split('KEYBRD,')[1]))
@@ -1861,310 +1974,6 @@ class KEYBRD_ProtoCol(ProtoCol):
         EventMesh.publish("set_key_board",msg_tmp_d)
 
         EventMesh.publish(constants.PROTOCOL.KEYBRD_SEND)  
-# 平台发送:
-# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW,参数内容]
-# 实例:[XT*334588000000156*0016*SCREEN_SHOW,00000000000]
-# 参数内容用 unicode 编码呈现,设备收到后需解码。
-# 解码后的参数内容可能有多个参数,不同参数用逗号分隔,设备自己决定如何在屏幕中显示这些参数。比如 "SCREEN_SHOW,深圳第一中学,三年1班、张三"
-# 终端回复:
-# [XT*YYYYYYYYYYYYYYY*LEN*SCREEN_SHOW]
-# 实例:[XT*334588000000156*000B*SCREEN_SHOW]
-
-class SCREEN_SHOWProtoCol(ProtoCol):
-    """开屏显示"""
-    TYPE = "SCREEN_SHOW"
-    def send(self, event, msg):
-        # [XT*334588000000156*0006*SILENCETIME2]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*000B*SCREEN_SHOW"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # print("KEYBRD:data:%s"%(data))
-        # print("KEYBRD!!!!!!!!!!!!!",msg)
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-    def recv(self, event, msg):
-        """
-        @param event:
-        @param msg: 接收到的下行数据
-        """
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_tmp = msg_tmp.split(',')
-        msg_tmp = msg_tmp[1:]
-        msg_tmp = msg_tmp[0]
-        print("screen_school_data msg",msg)
-
-        j = 0
-        i = 0
-        videobook_old = {}
-        videobook_name_tmp = UnicodeHexStr_To_Utf8Str(msg_tmp)
-        lst = videobook_name_tmp.split(",")
-        print("lst data",lst)
-
-         # 0 1 2 3
-        screen_school_data = ""#学校
-        screen_class_data = ""#班级
-        screen_fullname_data = ""#姓名
-        if len(lst) != 0: 
-            count = len(lst)
-            if count > 3:
-                count = 3
-            for i in range(count):
-                if i == 0:
-                    if len(str(lst[0])) != 0:
-                        screen_school_data = lst[0]
-                        EventMesh.publish("set_schoolname", screen_school_data)#
-                elif i == 1:
-                    if len(str(lst[1])) != 0:
-                        screen_class_data = lst[1]
-                        EventMesh.publish("set_classname", screen_class_data)#
-                else:
-                    if len(str(lst[2])) != 0:
-                        screen_fullname_data= lst[2]
-                        EventMesh.publish("set_fullname", screen_fullname_data)#
-                
-                EventMesh.publish("update_screen_show")#更新开屏显示
-
-        print("screen_school_data!!!:",screen_school_data,screen_class_data,screen_fullname_data)
-
-        EventMesh.publish(constants.PROTOCOL.SCREEN_SHOW_SEND)  
-
-class FALLDOWN_ProtoCol(ProtoCol):
-    """
-    跌倒提醒开关
-    服务器下发跌倒报警设置命令
-    [XT*334588000000156*LEN*FALLDOWN,ONOFF]
-    ONOFF: 1:开启,0:关闭。
-    终端回复
-    [XT*334588000000156*LEN*FALLDOWN]
-    """
-    TYPE = "FALLDOWN"
-    
-    def send(self, event, msg):
-       
-        #[XT*334588000000156*LEN*FALLDOWN]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*FALLDOWN"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-
-    def recv(self, event, msg):
-        """
-        [SZKW*860132060341484*000A*FALLDOWN,1]
-        """
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_data = msg_tmp.split(',')
-        
-        Falldowm = str(msg_data[1])
-        # EventMesh.debug_log("FALLDOWN:{}".format(Falldowm))
-        EventMesh.publish("set_storage_config",["fall_sw",Falldowm])
-
-        EventMesh.publish(constants.PROTOCOL.FALLDOWN_SEND)
-class REMOVE_ProtoCol(ProtoCol):
-    """
-    取下手环报警开关
-    平台发送:
-    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE,0或者1]
-    实例:[XT*334588000000156*0008*REMOVE,1]
-    终端回复:
-    [XT*YYYYYYYYYYYYYYY*LEN*REMOVE]
-    """
-    TYPE = "REMOVE"
-    
-    def send(self, event, msg):
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0006*REMOVE"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-
-    def recv(self, event, msg):
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_data = msg_tmp.split(',')
-        remove_sw = str(msg_data[1])
-        # EventMesh.debug_log("REMOVE:{}".format(remove_sw))
-        EventMesh.publish("set_storage_config",["remove_sw",remove_sw])
-        EventMesh.publish(constants.PROTOCOL.REMOVE_SEND)   
-
-class HELP_ProtoCol(ProtoCol):
-    """
-一键报警
-    [XT*YYYYYYYYYYYYYYY*LEN*HELP,状态]
-    状态值为整数:60或不带默认是普通报警,61光电式感烟火灾报警,62检测环境温度(高温报警,温度变化报警),
-    63人体活动检测报警,64电池欠压提醒功能,65设备脱落提醒功能,66离线报警,67测试报警,123气感报警,
-    124烟感报警,125水浸报警
-    实例:
-    [XT*334588000000156*0004*HELP,60]
-    """
-    TYPE = "HELP"
-    
-    def send(self, event, msg):
-        #[XT*334588000000156*LEN*FALLDOWN]
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0008*HELP,%d"%(self.imei,msg)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        #Wechat_log("POWEROFF_ProtoCol:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-
-    def recv(self, event, msg):
-        """
-        [XT*334588000000156*0004*HELP,60]
-        """
-
-        pass   
-
-class AL_ProtoCol(ProtoCol):
-    """报警数据上报"""
-    TYPE = "AL"
-    timer_repetition_send = None
-    repetition_queue = None
-
-    def send(self, event, msg):
-        if self.timer_repetition_send == None:
-            self.timer_repetition_send = osTimer()
-        if self.repetition_queue == None:
-            self.repetition_queue = Queue(100)
-        
-
-        send_data ="AL,"+msg
-        send_len = len(send_data)
-        #wt_data = "%s"%(send_data)
-        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
-        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL")
-        
-        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        #EventMesh.debug_log("AL_ProtoCol:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-        self.repetition_queue.put(data)#发送入队
-        self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb)
-        EventMesh.publish("set_dev_state",0)
-    def recv(self, event, msg):
-        """
-
-        @param event: PING
-        @param msg: 接收到的下行数据
-        """
-        #EventMesh.publish(constants.PROTOCOL.CR_SEND)
-        #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
-        print("报警数据上报:recv:%s"%(msg))   
-        #        
-        if self.repetition_queue.empty() == False:
-            self.repetition_queue.get()#出队
-        else:
-            self.timer_repetition_send.stop()
-
-    def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次
-        if self.repetition_queue.empty() == False:
-            data = self.repetition_queue.get()#出队
-            self.repetition_queue.put(data)#发送入队
-            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-        else:
-            self.timer_repetition_send.stop()
-
-
-# 平台发送:
-# [XT*YYYYYYYYYY*LEN*SLEEPTIME,时间段]
-# 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30]
-# 终端回复:
-# [XT*YYYYYYYYYY*LEN*SLEEPTIME]
-# 实例:[XT*5678901234*0009*SLEEPTIME]
-# 说明: 设置翻滚检测的时间段范围.如果时间段为空,即[XT*5678901234*0014*SLEEPTIME,],表示睡眠翻滚监测功能关。
-# 在此时间段内,开启翻滚检查,默认开启时翻滚次数为0,在此时间段内累计翻滚次数,并通过心跳接口上传。翻滚时间段结束,则停止翻滚检查,心跳接口的翻滚次数可置0。
-class SLEEPTIME_ProtoCol(ProtoCol):#睡眠时间
-    """
-    
-    平台发送:
-    [XT*YYYYYYYYYY*LEN*SLEEPTIME,时间段]
-    实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30]
-    终端回复:
-    [XT*YYYYYYYYYY*LEN*SLEEPTIME]
-    实例:[XT*5678901234*0009*SLEEPTIME]
-    说明: 设置翻滚检测的时间段范围.如果时间段为空,即[XT*5678901234*0014*SLEEPTIME,],表示睡眠翻滚监测功能关。
-    在此时间段内,开启翻滚检查,默认开启时翻滚次数为0,在此时间段内累计翻滚次数,并通过心跳接口上传。翻滚时间段结束,则停止翻滚检查,心跳接口的翻滚次数可置0。
-    """
-    TYPE = "SLEEPTIME"
-    
-    def send(self, event, msg):
-        send_data = EventMesh.publish("get_new_pid")+"*%s*00009*SLEEPTIME"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # EventMesh.debug_log("SLEEPTIME:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-
-    def recv(self, event, msg):
-        # 实例:[XT*5678901234*0014*SLEEPTIME,23:30-7:30]
-        # EventMesh.debug_log("SLEEPTIME!!!!!!!!!")
-        msg = msg[1:-1]
-        msg_tmp = msg.decode('ascii')
-        msg_data = msg_tmp.split(',')[1]
-        data = {}
-        if len(msg_data) == 0:
-            EventMesh.publish("set_storage_config",["sleep_time",data])
-            pass
-        else:
-            sleep_start = msg_data.split("-")[0]
-            sleep_end = msg_data.split("-")[1]
-            start_hour = int(sleep_start.split(":")[0])
-            start_min = int(sleep_start.split(":")[1])
-
-            end_hour = int(sleep_end.split(":")[0])
-            end_min = int(sleep_end.split(":")[1])
-
-            data = {"start_hour":start_hour,"start_min":start_min,"end_hour":end_hour,"end_min":end_min}
-            # EventMesh.debug_log("SLEEPTIME".format(data))
-            EventMesh.publish("set_storage_config",["sleep_time",data])
-            # sleep_time = EventMesh.publish("get_storage_config","sleep_time")
-            # EventMesh.debug_log("sleep_time:{}".format(sleep_time))
-
-        EventMesh.publish(constants.PROTOCOL.SLEEPTIME_SEND) 
-
-# 平台发送:
-# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
-# 实例:[XT*334588000000156*0007*FACTORY]
-# 终端回复:
-# [XT*YYYYYYYYYYYYYYY*LEN*FACTORY]
-# 实例:[XT*334588000000156*0007*FACTORY]
-# 说明:终端恢复出厂设置,里面设置的号码都将清空
-class FACTORY_ProtoCol(ProtoCol):#睡眠时间
-    """
-    实例:[XT*334588000000156*0008*FACTORY]
-    终端回复
-    [XT*YYYYYYYYYYYYYYY*LEN*WLKEY]
-    实例:[XT*334588000000156*0006*FACTORY]
-    """
-    TYPE = "FACTORY"
-    
-    def send(self, event, msg):
-        send_data = EventMesh.publish("get_new_pid")+"*%s*0007*FACTORY"%(self.imei)
-        MD5_SIGN = self.pack_MD5_head(send_data)
-        data = "[%s%s]"%(str(MD5_SIGN),send_data)
-        # EventMesh.debug_log("FACTORY:send:%s"%(data))
-        # 通过socket发送到服务器端
-        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
-
-    def recv(self, event, msg):
-
-        # EventMesh.debug_log("FACTORY!!!!!!!!!")
-        # msg = msg[1:-1]
-        # msg_tmp = msg.decode('ascii')
-        # msg_data = msg_tmp.split(',')
-        # EventMesh.debug_log("WLKEY_ProtoCol".format(msg_data[1]))
-        # EventMesh.publish("set_storage_config",["WLKEY",msg_data[1]])
-        EventMesh.publish("app_factory_cb")
-        EventMesh.publish(constants.PROTOCOL.FACTORY_SEND) 
-        # EventMesh.publish("app_factory",None)#app恢复出厂
-
-
 
 # [CS*YYYYYYYYYY*LEN*ppdevvoicemsg,ID,AMR格式音频数据]#设备好友语音发送
 # 服务端回复
@@ -2425,7 +2234,7 @@ class revpp_ProtoCol(ProtoCol):
             phonebook_oldtmp = phonebook_tmp
             # print("pppbook_oldtmp!!!:{}".format(str(phonebook_oldtmp)))
         # print("phonebook!!!:{}".format(str(phonebook)))
-        # with open("/usr/static/storage_file/pplist.json","w",encoding="utf-8") as fd:
+        # with open("/usr/static/storage_file/pplist.json","w+",encoding="utf-8") as fd:
         #     ujson.dump(phonebook,fd)
             # print("创建好友列表")
        
@@ -2601,7 +2410,7 @@ class TK_ProtoCol(ProtoCol):
                 EventMesh.publish("wechat_updata_list_show")
             # path = "/ext/static/storage_file/audio_amr/amr/{}.wav".format(wechat_num)
             path = "/usr/static/storage_file/{}.amr".format(wechat_num)
-            with open(path,"w") as fd:
+            with open(path,"w+") as fd:
                 arm = bytearray()
                 j = 0
                 for i in range(len(arm_data)):
@@ -2730,7 +2539,7 @@ class TKS_ProtoCol(ProtoCol):
                 EventMesh.publish("wechat_updata_list_show")
             # path = "/ext/static/storage_file/audio_amr/amr/{}.wav".format(wechat_num)
             path = "/usr/static/storage_file/{}.amr".format(wechat_num)
-            with open(path,"w") as fd:
+            with open(path,"w+") as fd:
                 arm = bytearray()
                 j = 0
                 for i in range(len(arm_data)):
@@ -2975,7 +2784,8 @@ class MEMBERS_ProtoCol(ProtoCol):#获取账号列表
             j+=1
         print("videobook!!!:{}".format(str(videobook)))
         # print("phonebook!!!:{}".format(str(phonebook)))
-        with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd:
+
+        with open("/usr/static/storage_file/videobook.json","w+",encoding="utf-8") as fd:
             ujson.dump(videobook,fd)
             print("创建视频通话账号")
         
@@ -3029,12 +2839,30 @@ class CALLING_ProtoCol(ProtoCol):#app发起视频通话
             EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
         else:
             EventMesh.publish(constants.PROTOCOL.CALLING_SEND,0)
+            videobook = EventMesh.publish("get_videobook_list")
+            datainfor = ""
+            if videobook != None:
+                check_json = videobook[0]
+                videobook_data = videobook[1] #视频通话列表
+                phonebook_keys = []
+                if videobook_data != {}:
+                    phonebook_keys = sorted(videobook_data.keys())
+                for i in range(len(phonebook_keys)):
+                    id = phonebook_keys[i]
+                    id_tmp = id[4:]
+                    if str(id_tmp)  == str(call_id): #在视频通话列表
+                        datainfor = videobook_data[id]
+                        break
+            if len(datainfor) <= 0:
+                datainfor = str(call_id)
+
             if int(call_type) == 1:#视频通话
-                EventMesh.publish("load_screen", {"screen": "vedio_incall"})
+                
+                EventMesh.publish("load_screen", {"screen": "vedio_incall","meta":str(datainfor)})
                 # EventMesh.publish("load_screen", {"screen": "vedio_incall","meta":"1"})
                 pass
             else:
-                EventMesh.publish("load_screen", {"screen": "voice_incall"})
+                EventMesh.publish("load_screen", {"screen": "voice_incall","meta":str(datainfor)})
                 # EventMesh.publish("load_screen", {"screen": "vedio_incall","meta":"0"})#语音界面
                 pass
         
@@ -3142,46 +2970,6 @@ class RTALK_ProtoCol(ProtoCol):#app拒接视频通话
                 EventMesh.publish("close_jrtc_event",None)
                 EventMesh.publish("set_UI_high_priority", 0)
                 EventMesh.publish("return_prev_screen")
-        
-
-
-#云米视频通话
-# [XT*YYYYYYYYYYYYYYY*LEN*JPREG]
-# 实例:
-# [XT*334588000000156*0004*JPREG]
-# 平台回复:
-# [XT*设备ID*LEN*JPREG,账号(整型)]
-# 实例:[XT*334588000000156*0010*JPREG,1087654321]
-# class JPREG_ProtoCol(ProtoCol):#登入注册
-#     """"""
-#     TYPE = "JPREG"
-#     def send(self, event, msg):
-        
-#         # [XT*334588000000156*0005*WLKEY]
-#         send_data = EventMesh.publish("get_new_pid")+"*%s*0005*JPREG"%(self.imei)
-#         MD5_SIGN = self.pack_MD5_head(send_data)
-#         data = "[%s%s]"%(str(MD5_SIGN),send_data)
-#         # print("WLKEY:data:%s"%(data))
-#         # print("WLKEY!!!!!!!!!!!!!")
-#         # 通过socket发送到服务器端
-#         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-#     def recv(self, event, msg):
-#         """
-#         @param event:
-#         @param msg: 接收到的下行数据
-#         """
-#         # b'[SZKW*867387060319166*000A*KEYBRD]'
-#         print("JPREG!!!!!!!!!!!!!",msg)
-#         # EventMesh.publish(constants.PROTOCOL.JPREG_SEND)  
-
-# (声网,佰锐的账号是整型)
-# [XT*YYYYYYYYYYYYYYY*LEN*MEMBERS]
-# 实例:[XT*334588000000156*0007*MEMBERS]
-# 平台回复:[XT*设备ID*LEN*MEMBERS,账号1,昵称1,电话1,账号2,昵称2,电话2.....]
-# 实例:
-# [XT*334588000000156*003F*MEMBERS,d3e2f759f9d5af3858f3530,爸爸,13662313580,妈妈,555]
-# 以上数据部分使用Unicode编码,最终上面示例传到服务端将是:
 
 class JMEMBERS_ProtoCol(ProtoCol):#获取账号列表
     """"""
@@ -3231,7 +3019,7 @@ class JMEMBERS_ProtoCol(ProtoCol):#获取账号列表
             j+=1
         print("videobook!!!:{}".format(str(videobook)))
         # print("phonebook!!!:{}".format(str(phonebook)))
-        with open("/usr/static/storage_file/videobook.json","w",encoding="utf-8") as fd:
+        with open("/usr/static/storage_file/videobook.json","w+",encoding="utf-8") as fd:
             ujson.dump(videobook,fd)
             print("创建视频通话账号")
         
@@ -3239,119 +3027,7 @@ class JMEMBERS_ProtoCol(ProtoCol):#获取账号列表
         EventMesh.publish("video_updata_list_show")
         # EventMesh.publish(constants.PROTOCOL.JMEMBERS_SEND)  
 
-# # [X*Y*LEN*CALLING,呼叫者id,会议id,通话类型,Token]
 
-# # 设备回复
-# # [X*Y*LEN*CALLING,音视频状态]
-# # 音视频状态:为0表示正常可通讯状态,否则填上用音视频返回的状态码,比如200,如果未获取到返回状态码,则填1
-# class CALLING_ProtoCol(ProtoCol):#app发起视频通话
-#     """"""
-#     TYPE = "CALLING"
-#     def send(self, event, msg):
-        
-#         # [XT*334588000000156*0005*WLKEY]
-#         send_data = EventMesh.publish("get_new_pid")+"*%s*0007*CALLING"%(self.imei)
-#         MD5_SIGN = self.pack_MD5_head(send_data)
-#         data = "[%s%s,%d]"%(str(MD5_SIGN),send_data,msg)
-#         print("CALLING:send data:%s"%(data))
-#         # print("WLKEY!!!!!!!!!!!!!")
-#         # 通过socket发送到服务器端
-#         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-#     def recv(self, event, msg):
-#         """
-#         @param event:
-#         @param msg: 接收到的下行数据
-#         """
-#         # b'[SZKW*867387060319166*000A*CALLING]'
-#         print("CALLING!!!!!!!!!!!!!",msg)
-#         msg = msg[1:-1]
-#         msg_tmp = msg.decode('ascii')
-#         msg_tmp_d = msg_tmp.split(',')
-#         call_id = msg_tmp_d[2]#id
-#         meet_id = msg_tmp_d[1]#会议id
-#         call_type = msg_tmp_d[3]#通话类型id
-#         tokens_data = ""
-#         # tokens_data = msg_tmp_d[4]#tokens
-#         EventMesh.publish("set_vedio_call_id",call_id)#
-#         EventMesh.publish("set_vedio_meet_id",meet_id)#
-#         EventMesh.publish("set_vedio_call_type", call_type)#
-#         EventMesh.publish("set_vedio_tokens_data", tokens_data)#
-
-
-#         # EventMesh.publish("set_vedio_infor",[call_id,meet_id,call_type,tokens_data])#
-#         EventMesh.publish(constants.PROTOCOL.CALLING_SEND,1)
-#         EventMesh.publish("load_screen", {"screen": "vedio_incall"})
-
-# # [XT*YYYYYYYYYYYYYYY*LEN*RCALLING,呼叫者id,会议id/声网频道名(没有则留空,但位置保留),音频还是视频(0为音频,1为视频)]
-# # 实例:
-# # [XT*334588000000156*0007*RCALLING,d3e2f759f9d5af3858f3530b,,0]
-# # 终端回复:
-# # [XT*设备ID*LEN*RCALLING]
-# # 实例:[XT*334588000000156*0009*RCALLING]  
-# #   
-# class RCALLING_ProtoCol(ProtoCol):#设备拒接接听
-#     """"""
-#     TYPE = "RCALLING"
-#     def send(self, event, msg):
-        
-#         # [XT*334588000000156*0005*WLKEY]
-#         send_data = EventMesh.publish("get_new_pid")+"*%s*0008*RCALLING"%(self.imei)
-#         MD5_SIGN = self.pack_MD5_head(send_data)
-#         data = "[%s%s]"%(str(MD5_SIGN),send_data)
-#         print("RCALLING:send data:%s"%(data))
-#         # print("WLKEY!!!!!!!!!!!!!")
-#         # 通过socket发送到服务器端
-#         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-#     def recv(self, event, msg):
-#         """
-#         @param event:
-#         @param msg: 接收到的下行数据
-#         """
-#         # b'[SZKW*867387060319166*000A*RCALLING]'
-#         print("RCALLING!!!!!!!!!!!!!")
-#         EventMesh.publish(constants.PROTOCOL.RCALLING_SEND)
-
-# class AGTALK_ProtoCol(ProtoCol):#设备发起视频通话与app接听视频通话
-#     """"""
-#     TYPE = "RINGING"
-#     def send(self, event, msg):
-        
-#         # [XT*334588000000156*0005*WLKEY]
-#         send_data = EventMesh.publish("get_new_pid")+"*%s*0007*RINGING"%(self.imei)
-#         MD5_SIGN = self.pack_MD5_head(send_data)
-#         data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
-#         print("AGTALK:send data:%s"%(data))
-#         # print("WLKEY!!!!!!!!!!!!!")
-#         # 通过socket发送到服务器端
-#         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-#     def recv(self, event, msg):
-#         """
-#         @param event:
-#         @param msg: 接收到的下行数据
-#         """
-#         # b'[SZKW*876226002021444*007B*AGTALK,0,01lqlyqzzQHpfwv5g7jFVC2H6Ha2tHFpMlfSm5sd2uo7o55JEcc=OVxewje6MjP0NgEODwsLDwkJCwkLCA0NDQ==,8762260020214441701226895]'
-        
-#         # msg = msg[1:-1]
-#         # msg_tmp = msg.decode('ascii')
-#         # msg_tmp_d = msg_tmp.split(',')
-#         # call_state = int(msg_tmp_d[1])#id
-       
-#         # if call_state == 0:#可正常通话
-#         #     tokens_data = msg_tmp_d[2]#会议id
-#         #     meet_id = msg_tmp_d[3]#会议id
-#         #     EventMesh.publish("set_vedio_meet_id", meet_id)#
-#         #     EventMesh.publish("set_vedio_tokens_data", tokens_data)#
-#         #     EventMesh.publish("open_vedio_infor")
-#         #     # EventMesh.publish("set_UI_high_priority", 0)
-#         #     # EventMesh.publish("load_screen", {"screen": "vedio_answer"})
-#         #     # EventMesh.publish("set_vedio_infor",[call_id,meet_id,call_type,tokens_data])#
-        
-        
-
-#         print("RINGING!!!!!!!!!!!!!")
 
 # 注:终端一旦收到该请求,则退出当前通话
 # [DL*YYYYYYYYYYYYYYY*LEN*HANGUP]
@@ -3432,41 +3108,55 @@ class CALLCANCEL_ProtoCol(ProtoCol):#app拒接视频通话
         
         EventMesh.publish(constants.PROTOCOL.CALLCANCEL_SEND)
 
-# class RTALK_ProtoCol(ProtoCol):#app拒接视频通话
-#     """"""
-#     TYPE = "RTALK"
-#     def send(self, event, msg):
-        
-#         # [XT*334588000000156*0005*WLKEY]
-#         send_data = EventMesh.publish("get_new_pid")+"*%s*0005*RTALK"%(self.imei)
-#         MD5_SIGN = self.pack_MD5_head(send_data)
-#         data = "[%s%s,%d,%s]"%(str(MD5_SIGN),send_data,msg[0],msg[1])
-#         print("AGTALK:send data:%s"%(data))
-#         # print("WLKEY!!!!!!!!!!!!!")
-#         # 通过socket发送到服务器端
-#         EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND,data)
-
-#     def recv(self, event, msg):
-#         """
-#         @param event:
-#         @param msg: 接收到的下行数据
-#         """
-#         # b'[SZKW*867387060319166*000A*RTALK]'
-#         print("RTALK!!!!!!!!!!!!!")  
-#         # [SZKW*876226002021444*003A*RTALK,3ef20e64f3abb84b27f7d764,8762260020214441701226522,1]'
-#         msg = msg[1:-1]
-#         msg_tmp = msg.decode('ascii')
-#         msg_tmp_d = msg_tmp.split(',')
-#         screen_NAME = EventMesh.publish("get_screen_NAME")
-#         if screen_NAME != None:
-#             if screen_NAME == "video_outcall":
-#                 # EventMesh.publish("close_jrtc_event")
-#                 EventMesh.publish("set_UI_high_priority", 0)
-#                 EventMesh.publish("load_screen", {"screen": "videolist"})
+class AL_ProtoCol(ProtoCol):
+    """报警数据上报"""
+    TYPE = "AL"
+    timer_repetition_send = None
+    repetition_queue = None
+
+    def send(self, event, msg):
+        if self.timer_repetition_send == None:
+            self.timer_repetition_send = osTimer()
+        if self.repetition_queue == None:
+            self.repetition_queue = Queue(100)
         
 
+        send_data ="AL,"+msg
+        send_len = len(send_data)
+        #wt_data = "%s"%(send_data)
+        send_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,send_data)
+        MD5_head_data = EventMesh.publish("get_new_pid")+"*%s*%04X*%s"%(self.imei,send_len,"AL")
+        
+        MD5_SIGN = self.pack_MD5_head(MD5_head_data)
+        data = "[%s%s]"%(str(MD5_SIGN),send_data)
+        #EventMesh.debug_log("AL_ProtoCol:send:%s"%(data))
+        # 通过socket发送到服务器端
+        EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        self.repetition_queue.put(data)#发送入队
+        self.timer_repetition_send.start(10000, 1, self.repetition_timer_cb)
+        EventMesh.publish("set_dev_state",0)
+    def recv(self, event, msg):
+        """
 
+        @param event: PING
+        @param msg: 接收到的下行数据
+        """
+        #EventMesh.publish(constants.PROTOCOL.CR_SEND)
+        #EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始ud定位
+        # EventMesh.debug_log("报警数据上报:recv:%s"%(msg))   
+        #        
+        if self.repetition_queue.empty() == False:
+            self.repetition_queue.get()#出队
+        else:
+            self.timer_repetition_send.stop()
 
+    def repetition_timer_cb(self, *args, **kwargs):#每隔10秒发送一次
+        if self.repetition_queue.empty() == False:
+            data = self.repetition_queue.get()#出队
+            self.repetition_queue.put(data)#发送入队
+            EventMesh.publish(constants.EVENT.CHANNEL_SOCKET_SEND, data)
+        else:
+            self.timer_repetition_send.stop()
 
 class ProtoColResolver(object):
     def __init__(self):
index 9d2001f..f836125 100644 (file)
@@ -32,7 +32,7 @@ def audio_cb(event):
     elif event == 7:
         EventMesh.publish("set_audio_state", 0)
         print('audio-play finish.')
-CALL_LOG_MAX = 50
+CALL_LOG_MAX = 10
 aud = audio.Audio(0)
 aud.setCallback(audio_cb)
 # -----------------------------------------style create--------------------------------------
@@ -189,6 +189,16 @@ style_contact_btn.set_pad_right(0)
 style_contact_btn.set_pad_top(0)
 style_contact_btn.set_pad_bottom(0)
 
+style_video_btn = lv.style_t()
+style_video_btn.init()
+style_video_btn.set_radius(5)
+style_video_btn.set_bg_color(lv.color_make(128, 128, 128))
+style_video_btn.set_bg_opa(255)
+style_video_btn.set_border_width(0)
+style_video_btn.set_pad_left(0)
+style_video_btn.set_pad_right(0)
+style_video_btn.set_pad_top(0)
+style_video_btn.set_pad_bottom(0)
 
 style_common_bg_rect_btn_pressed =  lv.style_t()
 style_common_bg_rect_btn_pressed.init()
@@ -221,6 +231,20 @@ style_screen_btn_1_main_main_default.set_border_color(lv.color_make(0x64,0x64,0x
 style_screen_btn_1_main_main_default.set_border_width(0)
 style_screen_btn_1_main_main_default.set_border_opa(255)
 
+
+style_screen_btn_1_main_main_black = lv.style_t()
+style_screen_btn_1_main_main_black.init()
+style_screen_btn_1_main_main_black.set_radius(0)
+style_screen_btn_1_main_main_black.set_bg_color(lv.color_make(0,0,0))
+style_screen_btn_1_main_main_black.set_bg_grad_color(lv.color_make(0,0,0))
+style_screen_btn_1_main_main_black.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+style_screen_btn_1_main_main_black.set_bg_opa(255)
+style_screen_btn_1_main_main_black.set_border_color(lv.color_make(0,0,0))
+style_screen_btn_1_main_main_black.set_border_width(0)
+style_screen_btn_1_main_main_black.set_border_opa(255)
+
+
+
 style_circle = lv.style_t()
 style_circle.init()
 style_circle.set_bg_color(lv.color_make(0xff, 0xff, 0xff))
@@ -379,8 +403,8 @@ class PhoneScreen(Screen):
     
 
     def initialization(self):
-        self.phone_num=''
-        self.phone_list = []
+        # self.phone_num=''
+        # self.phone_list = []
         global phone_screen ,phone_line,phone_label,phone_one,phone_two,phone_three,phone_four,phone_five,phone_six,phone_seven,phone_eight,phone_nine,phone_start,\
         phone_zero,phone_hash,phone_call,phone_call_btn,phone_contact,phone_contact_btn,phone_delete,phone_delete_btn
 
@@ -529,56 +553,57 @@ class PhoneScreen(Screen):
 
 
             self.meta = phone_screen
+            phone_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
 
-            phone_one.add_event_cb(lambda e: EventMesh.callback_wrapper(self.one(e)),
+            phone_one.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
-            phone_two.add_event_cb(lambda e: EventMesh.callback_wrapper(self.two(e)),
+            phone_two.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_three.add_event_cb(lambda e: EventMesh.callback_wrapper(self.three(e)),
+            phone_three.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_four.add_event_cb(lambda e: EventMesh.callback_wrapper(self.four(e)),
+            phone_four.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,4)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_five.add_event_cb(lambda e: EventMesh.callback_wrapper(self.five(e)),
+            phone_five.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,5)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_six.add_event_cb(lambda e: EventMesh.callback_wrapper(self.six(e)),
+            phone_six.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,6)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
+            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,7)),
                                         lv.EVENT.SHORT_CLICKED, None)
             
-            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.pressed_start(e)),
+            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                          lv.EVENT.LONG_PRESSED, None)#长按显示+
             
-            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.endpressed_start(e)),
+            phone_seven.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                          lv.EVENT.RELEASED, None)#释放按键
 
-            phone_eight.add_event_cb(lambda e: EventMesh.callback_wrapper(self.eight(e)),
+            phone_eight.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,8)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
+            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,9)),
                                          lv.EVENT.SHORT_CLICKED, None)
             
-            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.pressed_start(e)),
+            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                         lv.EVENT.LONG_PRESSED, None)#长按显示+
             
-            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.nine_endpressed_start(e)),
+            phone_nine.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                          lv.EVENT.RELEASED, None)#释放按键
 
             # phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.zero(e)),
             #                             lv.EVENT.SHORT_CLICKED, None)
             
-            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
+            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,10)),
                                          lv.EVENT.SHORT_CLICKED, None)#短按显示* 
 
-            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.pressed_start(e)),
+            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),
                                         lv.EVENT.LONG_PRESSED, None)#长按显示+
             
-            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.zero_endpressed_start(e)),
+            phone_zero.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),
                                          lv.EVENT.RELEASED, None)#释放按键
 
-            phone_call.add_event_cb(lambda e: EventMesh.callback_wrapper(self.call(e)),
+            phone_call.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,11)),
                                         lv.EVENT.SHORT_CLICKED, None)
             # phone_contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.contact(e)),
             #                             lv.EVENT.SHORT_CLICKED, None)
-            phone_delete.add_event_cb(lambda e: EventMesh.callback_wrapper(self.delete(e)),
+            phone_delete.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,12)),
                                         lv.EVENT.SHORT_CLICKED, None)
             
             # phone_start.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
@@ -595,19 +620,141 @@ class PhoneScreen(Screen):
             #                             lv.EVENT.SHORT_CLICKED, None)
             
 
-        self.phone_num=''
-        self.phone_list = []
+        # self.phone_num=''
+        # self.phone_list = []
         self.count = 0
         if phone_label != None:
-            phone_label.set_pos(0, 0)
-            phone_label.set_size(0, 0)
-            phone_label.set_text(" ")
+            if len(self.phone_num) != 0:
+                phone_label.set_pos(0, 5)
+                phone_label.set_size(128, 30)
+                phone_label.set_text(self.phone_num)
+                phone_label.set_text(str(self.phone_num))
+            else:
+                phone_label.set_pos(0, 0)
+                phone_label.set_size(0, 0)
+                phone_label.set_text(" ")
         #phone_label.set_text(" ")
         # print("self.phone_list :{} self.phone_num:{}".format(self.phone_list,self.phone_num))
         if self.timer_cb == 0:
             self.timer_cb = 1
             # self.timer.start(1000,1,self.refresh_line) 
-          
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE: #手势向左还是向右 还是向下向上
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                self.one(e)
+            elif msg == 2:
+                self.two(e)
+            elif msg == 3:
+                self.three(e)
+            elif msg == 4:
+                self.four(e)
+            elif msg == 5:
+                self.five(e)
+            elif msg == 6:
+                self.six(e)
+            elif msg == 7:
+                self.button = 0
+            elif msg == 8:
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:
+                    self.show_maxnum_warin()
+                    return
+                self.phone_list.append("8")                
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+            elif msg == 9:
+                self.button = 0
+            elif msg == 10:
+                self.button = 0
+            elif msg == 11:
+                self.call(e)
+            elif msg == 12:
+                self.delete(e)
+        elif code == lv.EVENT.LONG_PRESSED:
+            if msg == 1:
+                
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                self.button = 1
+                if self.button == 1:#长按
+                    self.phone_list.append("*")  
+                else:#短按
+                    self.phone_list.append("7")           
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+                self.button = 0
+            elif msg == 2:
+                
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                self.button = 1
+                if self.button == 1:#长按
+                    self.phone_list.append("#")  
+                else:#短按
+                    self.phone_list.append("9")  
+                self.button = 0
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+
+            elif msg == 3:
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                self.button = 1
+                if self.button == 1:#长按
+                    self.phone_list.append("+")  
+                else:#短按
+                    self.phone_list.append("0")  
+                self.button = 0
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+                
+
+        elif code == lv.EVENT.RELEASED:
+            if msg == 1:
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                if self.button == 1:#长按
+                    self.phone_list.append("*")  
+                else:#短按
+                    self.phone_list.append("7")           
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+                self.button = 0
+            elif msg == 2:
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                if self.button == 1:#长按
+                    self.phone_list.append("#")  
+                else:#短按
+                    self.phone_list.append("9")  
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+                self.button = 0
+            elif msg == 3:
+                if len(self.phone_list) >= PHONE_CALL_MAX_DATA:#限制拨号数量20个数字
+                    self.button = 0
+                    return
+                if self.button == 1:#长按
+                    self.phone_list.append("+")  
+                else:#短按
+                    self.phone_list.append("0")  
+            
+                self.phone_num = ''.join(self.phone_list)
+                self.show_num()
+                self.button = 0
+
 
     def refresh_line(self,e):
         return
@@ -824,12 +971,18 @@ class PhoneScreen(Screen):
 
 
     def done_return(self):
+        self.phone_num=''
+        self.phone_list = []
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
     def btn1_release(self):
+        self.phone_num=''
+        self.phone_list = []
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
     def btn8_press(self):
+        self.phone_num=''
+        self.phone_list = []
         EventMesh.publish("watch_top_show")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
@@ -1104,13 +1257,10 @@ class DialingScreen(Screen):
         self.timer = osTimer()
         self.meta = None
         self.meta_type = "popup"
-        self.call_log = {}
-        self.call_log_value = {}
-        self.read_call_log = {}
-        self.number_tmp = {}
-        self.CALL_LOG_MAX = CALL_LOG_MAX
+        self.count = 0
     def initialization(self):
         EventMesh.publish("set_UI_high_priority", 1)
+        self.count = 0
         global dialing_screen,dialing_img,dialing_name ,hangup_imgbtn 
         if dialing_screen == None:
             dialing_screen = lv.obj()
@@ -1150,29 +1300,38 @@ class DialingScreen(Screen):
         if dialing_name != None:
             name = EventMesh.publish("get_phonename")#获取拨打电话名称
             dialing_name.set_text(name)#名称
+        self.timer.start(1000,1,self.lcd_refresh)
     def post_processor_after_initialization(self):
+       
        pass
-        
+    def lcd_refresh(self,*argc):
+        EventMesh.publish("publish_message_event_ui",{"func":self.lcd_refresh_cb,"data":0})
+
+    def lcd_refresh_cb(self,data): 
+        flag = EventMesh.publish("get_lcd_state")
+        if flag == 1:
+            EventMesh.publish("system_sleep_rest")#防止黑屏
+        self.count+=1
+        if self.count >= 60:
+            self.count = 0
+            self.hangup(0)
+
     def hangup(self,e):
+
+        self.timer.stop()
         EventMesh.publish("set_UI_high_priority", 0)
         EventMesh.publish("close_sos_timer")
         EventMesh.publish("set_hangup_mode", 1)
-        voiceCall.callEnd()
         EventMesh.publish("set_interrup_incall",0)
         EventMesh.publish("set_UI_high_priority",0)
-        EventMesh.publish("load_screen", {"screen": "main_menu"})  
+        EventMesh.publish("set_call_state",0)#设置通话状态为0
+        EventMesh.publish("return_prev_screen")
+        voiceCall.callEnd()
+        
 
     def Close(self):
         self.timer.stop()
 
-    def call_end(self,*argc):
-        
-        call_state = EventMesh.publish("get_call_state")#
-        print("call_end!!!!!!!!",call_state)
-        if call_state != None:
-            if call_state == 0:#未打通
-                EventMesh.publish("load_screen", {"screen": "main_menu"})  
-
     def done_return(self):
         pass
         #EventMesh.publish("load_screen", {"screen": "main_menu"})
@@ -1422,51 +1581,119 @@ class NoSimPowerScreen(Screen):#
             no_sim_power_screen_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 
-            no_sim_power_screen_comfirm = lv.img(no_sim_power_screen)
-            no_sim_power_screen_comfirm.set_size(88, 23)
-            no_sim_power_screen_comfirm.set_pos(20, 65)
-            no_sim_power_screen_comfirm.set_src("U:/static/off_icon.png")
-            no_sim_power_screen_comfirm.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_power_screen_comfirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            no_sim_power_screen_comfirm_btn = lv.img(no_sim_power_screen)
-            no_sim_power_screen_comfirm_btn.set_size(88, 35)
-            no_sim_power_screen_comfirm_btn.set_pos(20, 55)
-            no_sim_power_screen_comfirm_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_power_screen_comfirm_btn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-
-            poweroff_confirm_label = lv.label(no_sim_power_screen_comfirm)
-            poweroff_confirm_label.set_text("确定")
-            poweroff_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
-            poweroff_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            no_sim_power_screen_cancel = lv.img(no_sim_power_screen)
-            no_sim_power_screen_cancel.set_size(88, 23)
-            no_sim_power_screen_cancel.set_pos(20, 95)
-            no_sim_power_screen_cancel.set_src("U:/static/cancel_icon.png")
-            no_sim_power_screen_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_power_screen_cancel.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            no_sim_power_screen_cancel_btn = lv.img(no_sim_power_screen)
-            no_sim_power_screen_cancel_btn.set_size(88, 38)
-            no_sim_power_screen_cancel_btn.set_pos(20, 90)
-            no_sim_power_screen_cancel_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_power_screen_cancel_btn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            poweroff_return_label = lv.label(no_sim_power_screen_cancel)
-            poweroff_return_label.set_text("取消")
-            poweroff_return_label.align(lv.ALIGN.CENTER, 0, 0)
-            poweroff_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            no_sim_power_screen_cancel.set_ext_click_area(20)
+            no_sim_power_screen_comfirm = lv.btn(no_sim_power_screen)
+            no_sim_power_screen_comfirm.set_pos(int(20),int(64))
+            no_sim_power_screen_comfirm.set_size(88,23)
+            no_sim_power_screen_comfirm.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(no_sim_power_screen_comfirm)
+            screen_btn_1_label.set_text("确定")
+            no_sim_power_screen_comfirm.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            no_sim_power_screen_comfirm.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+            # no_sim_power_screen_comfirm = lv.img(no_sim_power_screen)
+            # no_sim_power_screen_comfirm.set_size(88, 23)
+            # no_sim_power_screen_comfirm.set_pos(20, 65)
+            # no_sim_power_screen_comfirm.set_src("U:/static/off_icon.png")
+            # no_sim_power_screen_comfirm.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_power_screen_comfirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # no_sim_power_screen_comfirm_btn = lv.img(no_sim_power_screen)
+            # no_sim_power_screen_comfirm_btn.set_size(88, 35)
+            # no_sim_power_screen_comfirm_btn.set_pos(20, 55)
+            # no_sim_power_screen_comfirm_btn.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_power_screen_comfirm_btn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+
+            # poweroff_confirm_label = lv.label(no_sim_power_screen_comfirm)
+            # poweroff_confirm_label.set_text("确定")
+            # poweroff_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
+            # poweroff_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # no_sim_power_screen_cancel = lv.img(no_sim_power_screen)
+            # no_sim_power_screen_cancel.set_size(88, 23)
+            # no_sim_power_screen_cancel.set_pos(20, 95)
+            # no_sim_power_screen_cancel.set_src("U:/static/cancel_icon.png")
+            # no_sim_power_screen_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_power_screen_cancel.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # no_sim_power_screen_cancel_btn = lv.img(no_sim_power_screen)
+            # no_sim_power_screen_cancel_btn.set_size(88, 38)
+            # no_sim_power_screen_cancel_btn.set_pos(20, 90)
+            # no_sim_power_screen_cancel_btn.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_power_screen_cancel_btn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # poweroff_return_label = lv.label(no_sim_power_screen_cancel)
+            # poweroff_return_label.set_text("取消")
+            # poweroff_return_label.align(lv.ALIGN.CENTER, 0, 0)
+            # poweroff_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # no_sim_power_screen_cancel.set_ext_click_area(20)
+
+            no_sim_power_screen_cancel = lv.btn(no_sim_power_screen)
+            no_sim_power_screen_cancel.set_pos(int(20),int(98))
+            no_sim_power_screen_cancel.set_size(88,23)
+            no_sim_power_screen_cancel.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(no_sim_power_screen_cancel)
+            screen_btn_1_label.set_text("取消")
+            no_sim_power_screen_cancel.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            no_sim_power_screen_cancel.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
 
             self.meta = no_sim_power_screen
-            no_sim_power_screen_comfirm_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
+            no_sim_power_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),
+                                     lv.EVENT.GESTURE, None)
+            no_sim_power_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
         
-            no_sim_power_screen_cancel_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
+            no_sim_power_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
 
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    self.confirm(0)
+                elif msg == 2:
+                    self.cancel(0)
+                # EventMesh.publish("load_screen",  {"screen": "{}".format(msg)})
+
     def confirm(self,e):
         EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
 
@@ -1508,9 +1735,15 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
         self.timer2 = osTimer()
         self.CALL_LOG_MAX = CALL_LOG_MAX
         self.read_call_log = {}
-       
+        self.phone_page_state = 0
+        EventMesh.subscribe("get_phone_state",self.get_phone_state)
+    
+    def get_phone_state(self,event,msg):
+        return self.phone_page_state
+    
     def initialization(self):
         EventMesh.publish("set_UI_high_priority", 1)
+        self.phone_page_state = 1
         global dialing_popup_screen,dialing_popup_img,dialing_popup_name ,dialing_popup_call,dialing_popup_hangup_imgbtn 
         if dialing_popup_screen == None:
             dialing_popup_screen = lv.obj()
@@ -1533,7 +1766,7 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
 
             dialing_popup_call = lv.label(dialing_popup_screen)
             dialing_popup_call.set_pos(0, 50)
-            dialing_popup_call.set_size(LCD_X, 20)
+            dialing_popup_call.set_size(LCD_X, 40)
             dialing_popup_call.set_text("正在拨号中")
             dialing_popup_call.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
             dialing_popup_call.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -1550,6 +1783,9 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
         if dialing_popup_name != None:
             name = EventMesh.publish("get_phonename")#获取拨打电话名称
             dialing_popup_name.set_text(name)#名称
+        if dialing_popup_call != None:
+            dialing_popup_call.set_text("正在拨号中")
+
 
     def post_processor_after_initialization(self):
         self.time_count = 0
@@ -1620,22 +1856,37 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
         voiceCall.callStart(phone_num)
         
     def timeout_hangup(self,e):
-        EventMesh.publish("system_sleep_rest")#防止黑屏
+        flag = EventMesh.publish("get_lcd_state")
+        if flag == 1:
+            EventMesh.publish("system_sleep_rest")#防止黑屏
+        if EventMesh.publish("get_call_state") == 4:
+            if dialing_popup_call != None:
+                dialing_popup_call.set_text("正在等待对方接听\n听电话")
         self.time_count+=1
-        if self.time_count >= 5:#5s内没有打通则不在继续拨打关闭
+        if self.time_count >= 60:#5s内没有打通则不在继续拨打关闭
             self.time_count = 0
+            self.phone_page_state = 0
             self.timer1.stop()
+            self.timer2.stop()
             EventMesh.publish("set_UI_high_priority", 0)
+            
             sos_flag = EventMesh.publish("get_sos_flag")
             print("sos_flag!!!!!!!!!!!!!!!!:",sos_flag)
             if sos_flag == 1:
-                EventMesh.publish("set_sos_info_call")  
-
-            EventMesh.publish("load_screen", {"screen": "dial_no_connect_popup"})
+                EventMesh.publish("set_sos_info_call")
+            EventMesh.publish("set_interrup_incall",0)
+            EventMesh.publish("set_UI_high_priority",0)
+            EventMesh.publish("set_call_state",0)#设置通话状态为0
+            EventMesh.publish("return_prev_screen")
+            voiceCall.callEnd()
+            
 
     def hangup(self,e):
+        self.phone_page_state = 0
+        self.timer1.stop()
+        self.timer2.stop()
         EventMesh.publish("set_UI_high_priority", 0)
-        voiceCall.callEnd()
+        
         sos_flag = EventMesh.publish("get_sos_flag")
         if sos_flag == 1:
             EventMesh.publish("close_sos_timer")
@@ -1644,10 +1895,14 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
             EventMesh.publish("set_hangup_mode",0)
         EventMesh.publish("set_interrup_incall",0)
         EventMesh.publish("set_UI_high_priority",0)
+        EventMesh.publish("set_call_state",0)#设置通话状态为0
         EventMesh.publish("return_prev_screen")
+        voiceCall.callEnd()
+        
         # EventMesh.publish("load_screen", {"screen": "main_menu"})  
 
     def Close(self):
+        self.phone_page_state = 0
         self.timer1.stop()
         self.timer2.stop()
 
@@ -1940,25 +2195,28 @@ def msg_cb(args):
     storage = args[2]
     print("index:{}".format(index))
     sms_data = sms.getSaveLoc()
-    sms_max = sms_data[0][2]
-    if index != -1:
-        tmp = sms.searchTextMsg(index)
-        detail = tmp[1]#内容
-        if  detail.find("SETIP:") != -1:#寻找是否有这个字符串
-            tmp_test = detail.split("SETIP:")[1]
-            if  tmp_test.find(":") != -1:
-                new_ip = tmp_test.split(':')[0]
-                print("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))
-                new_com = tmp_test.split(':')[1]
-                # new_md5 = detail.split(':')[3]
-                if len(new_ip) > 0 and len(new_com) > 0:
-                    EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#设置关机时间
-                    # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间
+    if sms_data != -1:
+        sms_max = sms_data[0][2]
+        if index != -1:
+            tmp = sms.searchTextMsg(index)
+            detail = tmp[1]#内容
+            if  detail.find("SETIP:") != -1:#寻找是否有这个字符串
+                tmp_test = detail.split("SETIP:")[1]
+                if  tmp_test.find(":") != -1:
+                    new_ip = tmp_test.split(':')[0]
+                    print("tmp_test:{} new_ip:{}".format(tmp_test,new_ip))
+                    new_com = tmp_test.split(':')[1]
+                    # new_md5 = detail.split(':')[3]
+                    if len(new_ip) > 0 and len(new_com) > 0:
+                        EventMesh.publish("set_new_ip_com", [new_ip,new_com,tmp[0]])#设置关机时间
+                        # EventMesh.publish("set_new_ip_com", [new_ip,new_com,new_md5])#设置关机时间
         
     if index >= sms_max-1:
-        EventMesh.publish("load_screen", {"screen": "message_full"})
+        EventMesh.publish_async("remove_all_sms_cb","",1*1024)
+        # EventMesh.publish("load_screen", {"screen": "message_full"})
     else:
-        EventMesh.publish("load_screen", {"screen": "message_popup"})
+        pass
+        # EventMesh.publish("load_screen", {"screen": "message_popup"})
 
 sms.setCallback(msg_cb)
 style_sms_bg_btn =  lv.style_t()
@@ -2817,7 +3075,7 @@ class ToolboxScreen(Screen):
 
             toolbox_step_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_step_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_step_img_btn_1.set_size(120,35)
+            toolbox_step_img_btn_1.set_size(115,35)
             toolbox_step_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_step_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_step_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -2843,7 +3101,7 @@ class ToolboxScreen(Screen):
 
             toolbox_weather_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_weather_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_weather_img_btn_1.set_size(120,35)
+            toolbox_weather_img_btn_1.set_size(115,35)
             toolbox_weather_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_weather_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_weather_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -2869,7 +3127,7 @@ class ToolboxScreen(Screen):
 
             toolbox_alarm_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_alarm_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_alarm_img_btn_1.set_size(120,35)
+            toolbox_alarm_img_btn_1.set_size(115,35)
             toolbox_alarm_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_alarm_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_alarm_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -2903,7 +3161,7 @@ class ToolboxScreen(Screen):
 
             toolbox_countdown_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_countdown_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_countdown_img_btn_1.set_size(120,35)
+            toolbox_countdown_img_btn_1.set_size(115,35)
             toolbox_countdown_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_countdown_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_countdown_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -2928,7 +3186,7 @@ class ToolboxScreen(Screen):
             tool_set_y+=tool_set_y_offset
             toolbox_stopwatch_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_stopwatch_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_stopwatch_img_btn_1.set_size(120,35)
+            toolbox_stopwatch_img_btn_1.set_size(115,35)
             toolbox_stopwatch_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_stopwatch_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_stopwatch_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -2960,7 +3218,7 @@ class ToolboxScreen(Screen):
             tool_set_y+=tool_set_y_offset
             toolbox_calcut_img_btn_1 = lv.btn(toolbox_cont)
             toolbox_calcut_img_btn_1.set_pos(int(0),int(tool_set_y-5))
-            toolbox_calcut_img_btn_1.set_size(120,35)
+            toolbox_calcut_img_btn_1.set_size(115,35)
             toolbox_calcut_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             toolbox_calcut_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
             toolbox_calcut_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
@@ -3083,11 +3341,12 @@ class IncomingCallScreen(Screen):
         self.meta_type = "popup"
         self.aud = audio.Audio(0)
         self.call_timer = osTimer()
+        self.call_timer1 = osTimer()
         self.name = None
         self.phonebook = {}
         self.pro_state = 0
         self.meta = None
-        
+        self.timeout = 0
 
         self.call_log = {}
         self.call_log_value = {}
@@ -3134,9 +3393,15 @@ class IncomingCallScreen(Screen):
                                      lv.EVENT.SHORT_CLICKED, None)
             self.meta = incoming_call_screen 
         EventMesh.publish("set_UI_high_priority", 1)
+        self.timeout = 0
+        self.call_timer1.start(1*1000, 1, self.lcd_refresh)
 
 
     def post_processor_after_initialization(self):
+        num = EventMesh.publish("get_volum_size")
+        if num == None:
+            num = 8
+        self.aud.setVolume(num)
         global incoming_call_screen,incoming_call_img,incoming_call_name_label,incoming_call_answer ,incoming_call_hangup  
         utime.sleep_ms(200)#不加延时会切屏
         data = EventMesh.publish("get_phonebook_list")
@@ -3149,7 +3414,7 @@ class IncomingCallScreen(Screen):
                 j = 0
                 if b == True:
                     for i in range(len(self.phonebook)): #字典 key value
-                        #'001:邓雪英':15521469561
+                        #'001:':
                         name = self.phonebook[phonebook_keys[j]]
                         name_value = phonebook_keys[j]
                         number_tmp = str(self.meta_info)
@@ -3249,32 +3514,47 @@ class IncomingCallScreen(Screen):
         self.call_timer.start(6000, 1, self.call_timer_cb)
         self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
 
+    def lcd_refresh(self,*argc):
+        flag = EventMesh.publish("get_lcd_state")
+        if flag == 1:
+            EventMesh.publish("system_sleep_rest")#防止黑屏
+        
+        self.timeout+=1
+        if self.timeout >= 60:
+            self.timeout = 0
+            self.hangup(0)
+
     def call_timer_cb(self,e):
-       self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
+        self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
 
     def answer(self,e):
+        self.call_timer1.stop()
         self.call_timer.stop()
         self.aud.stop() 
         EventMesh.publish("set_UI_high_priority", 0)
         voiceCall.callAnswer()
 
     def Close(self):
+        num = EventMesh.publish("get_volum_size")
+        if num == None:
+            num = 8
+        self.aud.setVolume(num)
         self.call_timer.stop()
+        self.call_timer1.stop()
         self.aud.stop() 
     
     def hangup(self,e):
         EventMesh.publish("set_UI_high_priority", 0)
         self.aud.stop()
+        self.call_timer1.stop()
         self.call_timer.stop()
-        voiceCall.callEnd()
+        EventMesh.publish("set_call_state",0)#设置通话状态为0
         EventMesh.publish("set_interrup_incall",0)
         EventMesh.publish("set_UI_high_priority",0)
-
-        screen_NAME = EventMesh.publish("get_screen_NAME")
-        if screen_NAME != None:
-            if screen_NAME != "dialing_noplay_popup":
-                EventMesh.publish("return_prev_screen")
-                # EventMesh.publish("load_screen", {"screen": "main_menu"})  
+        EventMesh.publish("return_prev_screen")
+        voiceCall.callEnd()
+        
+        
 
 
     def btn1_release(self):
@@ -3429,9 +3709,9 @@ class OnCallScreen(Screen):
 
 
             on_call_volum_label = lv.label(on_call_obj)
-            on_call_volum_label.set_pos(0, 100)
+            on_call_volum_label.set_pos(0, 95)
             on_call_volum_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            on_call_volum_label.set_size(48, 28)
+            on_call_volum_label.set_size(48, 33)
             on_call_volum_label.set_text("静音")
             on_call_volum_label.set_style_text_align(lv.TEXT_ALIGN.CENTER,0)
             on_call_volum_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -3448,9 +3728,9 @@ class OnCallScreen(Screen):
                                      lv.EVENT.SHORT_CLICKED, None)
             
             on_call_tab_label = lv.label(on_call_obj)
-            on_call_tab_label.set_pos(80, 100)
+            on_call_tab_label.set_pos(80, 95)
             on_call_tab_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            on_call_tab_label.set_size(48, 28)
+            on_call_tab_label.set_size(48, 33)
             on_call_tab_label.set_text("键盘")
             on_call_tab_label.set_style_text_align(lv.TEXT_ALIGN.CENTER,0)
             on_call_tab_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
@@ -3907,32 +4187,47 @@ class OnCallScreen(Screen):
 
 
     def refresh(self,e):
-        # print("call_in")
-        global on_call_screen,on_call_label_name,on_call_second_label ,on_call_hangup
-        min = self.count_sec/60
-        sec = self.count_sec%60
-        if min > 99:
-            total = "%03d:%02d"%(min,sec)
-        else:
-            total = "%02d:%02d"%(min,sec)
-        on_call_second_label.set_text(str(total))
+        flag = EventMesh.publish("get_lcd_state")
+        if flag == 1:
+            # print("call_in")
+            global on_call_screen,on_call_label_name,on_call_second_label ,on_call_hangup
+            min = self.count_sec/60
+            sec = self.count_sec%60
+            if min > 99:
+                total = "%03d:%02d"%(min,sec)
+            else:
+                total = "%02d:%02d"%(min,sec)
+            on_call_second_label.set_text(str(total))
         self.count_sec+=1
     
     def hangup(self,e):
         EventMesh.publish("set_UI_high_priority", 0)
         self.timer.stop()
-        voiceCall.callEnd()
+        EventMesh.publish("set_call_state",0)#设置通话状态为0
         EventMesh.publish("set_interrup_incall",0)
         EventMesh.publish("set_UI_high_priority",0)
-
-        screen_NAME = EventMesh.publish("get_screen_NAME")
-        if screen_NAME != None:
-            if screen_NAME != "dialing_noplay_popup":
-                EventMesh.publish("return_prev_screen")
+        EventMesh.publish("return_prev_screen")
+        voiceCall.callEnd()
+        
                 # EventMesh.publish("load_screen", {"screen": "main_menu"})  
         
     def Close(self):
+        num = EventMesh.publish("get_volum_size")
+        if num == None:
+            num = 8
+        self.aud.setVolume(self.volum_size)
         self.timer.stop()
+        voiceCall.mute(2,0,0)
+    def lcd_on(self):
+        global on_call_second_label
+        if on_call_second_label != None:
+            min = self.count_sec/60
+            sec = self.count_sec%60
+            if min > 99:
+                total = "%03d:%02d"%(min,sec)
+            else:
+                total = "%02d:%02d"%(min,sec)
+            on_call_second_label.set_text(str(total))
 
     def btn1_release(self):
         pass
@@ -4225,12 +4520,14 @@ class ContactsScreen(Screen):
             print("contacts_screen")
             contacts_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             contacts_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+            contacts_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e,0)), lv.EVENT.GESTURE, None)
 
             contacts_screen_list_screen = lv.obj(contacts_screen)
             contacts_screen_list_screen.set_pos(0, 30)
             contacts_screen_list_screen.set_size(LCD_X, LCD_Y-30)
             contacts_screen_list_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             contacts_screen_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+            contacts_screen_list_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e,0)), lv.EVENT.GESTURE, None)
 
             contacts_top_title = lv.label(contacts_screen)
             contacts_top_title.set_pos(0, 5)
@@ -4254,12 +4551,13 @@ class ContactsScreen(Screen):
             self.contact_detail_list.set_size(LCD_X, LCD_Y-30+1)
             self.contact_detail_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
             self.contact_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
+            self.contact_detail_list.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e,0)), lv.EVENT.GESTURE, None)
             for i in range(self.MXA_phone_num):
                 contact_btn = lv.btn(self.contact_detail_list)
                 contact_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)),
+                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e,1)),
                                         lv.EVENT.SHORT_CLICKED, None)
-                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)), lv.EVENT.PRESSING, None)
+                # contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)), lv.EVENT.PRESSING, None)
                 contact_btn.add_flag(lv.obj.FLAG.HIDDEN)
                 # contact_btn.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.PRESSED)
                 
@@ -4322,7 +4620,7 @@ class ContactsScreen(Screen):
                 self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_pos(0, 0)
                 self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_size(LCD_X-15, 16)
                 self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_text(key_tmp[4:])
-                self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_long_mode(lv.label.LONG.CLIP)
+                self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_long_mode(lv.label.LONG.DOT)
                 # self.contact_detail_listt_dict[i]["contact_btn_label_1"].set_long_mode(lv.label.LONG.DOT)
                 # self.contact_detail_listt_dict[i]["contact_btn_label_1"].add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -4336,7 +4634,7 @@ class ContactsScreen(Screen):
                 self.contact_detail_listt_dict[i]["contact_btn_label_3"].set_pos(0, 20)
                 self.contact_detail_listt_dict[i]["contact_btn_label_3"].set_size(LCD_X-15, 16)
                 self.contact_detail_listt_dict[i]["contact_btn_label_3"].set_text(name)
-                self.contact_detail_listt_dict[i]["contact_btn_label_3"].set_long_mode(lv.label.LONG.CLIP)
+                self.contact_detail_listt_dict[i]["contact_btn_label_3"].set_long_mode(lv.label.LONG.DOT)
                 # self.contact_detail_listt_dict[i]["contact_btn_label_3"].add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
                 
                 
@@ -4352,26 +4650,41 @@ class ContactsScreen(Screen):
                 contact_none_label.clear_flag(lv.obj.FLAG.HIDDEN) #显示空文本
             if self.contact_detail_list != None:
                 self.contact_detail_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本
-            
-
-    def calling_cb(self,e):
+    def calling_cb(self,e,msg):
         code = e.get_code()
-        if code == lv.EVENT.PRESSING:
-            #print("PRESSING")
-            self.is_sliding += 1
-
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
         elif  code == lv.EVENT.SHORT_CLICKED:
-            #utime.sleep_ms(10)
-            print("1self.is_sliding",self.is_sliding)
-            if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
-                self.is_sliding = 0
+            if msg == 1:
                 if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#有卡时触发sos报警 无卡时自动关机
                     msg_text = e.get_target().get_child(1).get_text()
                     EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
                 else:
                     EventMesh.publish("load_screen", {"screen": "no_sim_popup_screen"})
+
+    # def calling_cb(self,e):
+    #     code = e.get_code()
+    #     if code == lv.EVENT.PRESSING:
+    #         #print("PRESSING")
+    #         self.is_sliding += 1
+
+    #     elif  code == lv.EVENT.SHORT_CLICKED:
+    #         #utime.sleep_ms(10)
+    #         print("1self.is_sliding",self.is_sliding)
+    #         if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
+    #             self.is_sliding = 0
+    #             if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#有卡时触发sos报警 无卡时自动关机
+    #                 msg_text = e.get_target().get_child(1).get_text()
+    #                 EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
+    #             else:
+    #                 EventMesh.publish("load_screen", {"screen": "no_sim_popup_screen"})
                 
-            self.is_sliding =0
+    #         self.is_sliding =0
             
 
     def calling(self,msg_text):    
@@ -5413,22 +5726,23 @@ class CountdownScreen(Screen):
             countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN)
 
             self.meta = countdown_screen
+            countdown_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
 
-            countdown_sec_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.sec_up(e)),
+            countdown_sec_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_sec_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.sec_down(e)),
+            countdown_sec_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_min_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.min_up(e)),
+            countdown_min_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_min_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.min_down(e)),
+            countdown_min_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,4)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_hour_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hour_up(e)),
+            countdown_hour_up_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,5)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_hour_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hour_down(e)),
+            countdown_hour_down_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,6)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_start_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
+            countdown_start_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,7)),
                                         lv.EVENT.SHORT_CLICKED, None)
-            countdown_reset_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reset(e)),
+            countdown_reset_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,8)),
                                         lv.EVENT.SHORT_CLICKED, None)
             # countdown_stop_imgbtn.add_event_cb(lambda e: self.stop(e),
             #                              lv.EVENT.SHORT_CLICKED, None)  
@@ -5439,6 +5753,52 @@ class CountdownScreen(Screen):
             if self.timer_cb == 1:
                 EventMesh.publish("set_countdown_off_state", [0,self.g_state])
                 self.timer.start(1000,1,self.fun)
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                EventMesh.publish("add_countdown_sec")
+                self.sec = EventMesh.publish("get_countdown_sec")
+                print("sec_up:",self.sec)
+                self.show_value()
+            elif msg == 2:
+                EventMesh.publish("reduce_countdown_sec")
+                self.sec = EventMesh.publish("get_countdown_sec")
+                print("sec_down:",self.sec)
+                self.show_value()
+            elif msg == 3:
+                EventMesh.publish("add_countdown_min")
+                self.min = EventMesh.publish("get_countdown_min")
+                print("min_up:",self.min)
+                self.show_value()
+            elif msg == 4:
+                EventMesh.publish("reduce_countdown_min")
+                self.min = EventMesh.publish("get_countdown_min")
+                print("min_down:",self.min)
+                self.show_value()
+            elif msg == 5:
+                EventMesh.publish("add_countdown_hour")
+                self.hour = EventMesh.publish("get_countdown_hour")
+                
+                print("hour_up:",self.hour)
+                self.show_value()
+            elif msg == 6:
+                EventMesh.publish("reduce_countdown_hour")
+                self.hour = EventMesh.publish("get_countdown_hour")
+                print("hour_down:",self.hour)
+                self.show_value()
+            elif msg == 7:
+                self.start(e)
+            elif msg == 8:
+                self.reset(e)
+
     def post_processor_after_initialization(self):
         global countdown_screen ,countdown_title,countdown_hour ,countdown_mao ,countdown_mao ,countdown_mao1 ,\
         countdown_sec ,countdown_hour_up ,countdown_hour_up_btn ,countdown_hour_down ,countdown_hour_down_btn ,\
@@ -5584,20 +5944,21 @@ class CountdownScreen(Screen):
         
 
         # print("self.total:{} self.time_tmp:{} self.timeSecond:{} test_hour:{} test_min:{} test_sec:{}".format(self.total,self.time_tmp,self.timeSecond,test_hour,test_min,test_sec))
-        self.show_value()  
+         
         # print("Close self.timeSecond:22")
         EventMesh.publish("set_countdown_all_time", [self.total,self.timeSecond])
         if self.total <= 0:
+            EventMesh.publish("set_countdown_off_state", [0,self.g_state])
+            self.timer.stop()
+            EventMesh.publish("load_screen", {"screen": "countdown_end"})
             self.g_state = 0
             self.g_end = 1
             self.hour = 0
             self.min = 0
             self.sec = 0
-            EventMesh.publish("set_countdown_off_state", [0,self.g_state])
-            self.timer.stop()
-            self.show_value()
-            EventMesh.publish("load_screen", {"screen": "countdown_end"})
-        
+            
+        else:
+            self.show_value() 
         # self.total = self.total - 1
         
         # self.sec = self.sec - 1 
@@ -5657,7 +6018,63 @@ class CountdownScreen(Screen):
             countdown_min_up,countdown_min_up_btn ,countdown_min_down,countdown_min_down_btn,countdown_sec_up ,\
             countdown_sec_up_btn,countdown_sec_down ,countdown_sec_down_btn ,countdown_reset_img ,countdown_reset_imgbtn ,\
             countdown_start_img,countdown_start_imgbtn,countdown_stop_img ,countdown_min 
-
+        if self.g_state == 0:#没点开始
+            countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up_btn.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_title.clear_flag(lv.obj.FLAG.HIDDEN)
+            
+        elif self.g_state == 1:#计时
+            countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_start_img.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_stop_img.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN)
+        elif self.g_state == 2:#暂停
+            countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_hour_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_min_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_up_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_sec_down_btn.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_start_img.clear_flag(lv.obj.FLAG.HIDDEN)
+            countdown_stop_img.add_flag(lv.obj.FLAG.HIDDEN)
+            countdown_reset_img.clear_flag(lv.obj.FLAG.HIDDEN) 
         countdown_sec.set_text(str("%02d"%(self.sec)))
         countdown_min.set_text(str("%02d"%(self.min)))
         countdown_hour.set_text(str("%02d"%(self.hour)))
@@ -5858,7 +6275,9 @@ class StopwatchScreen(Screen):
             stopwatch_screen = lv.obj()
             print("stopwatch_screen")
             stopwatch_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
+            stopwatch_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),
+                                        lv.EVENT.GESTURE, None)
+            
             stopwatch_title = lv.label(stopwatch_screen)
             stopwatch_title.set_pos(0, 5)
             stopwatch_title.set_size(128, 20)
@@ -5868,46 +6287,46 @@ class StopwatchScreen(Screen):
             stopwatch_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             stopwatch_label_min = lv.label(stopwatch_screen)
-            stopwatch_label_min.set_pos(33, 50)
-            stopwatch_label_min.set_size(20, 30)
-            stopwatch_label_min.set_text("00")
+            stopwatch_label_min.set_pos(0, 50)
+            stopwatch_label_min.set_size(128, 30)
+            stopwatch_label_min.set_text("00:00.0")
             stopwatch_label_min.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
             stopwatch_label_min.set_long_mode(lv.label.LONG.WRAP)
-            stopwatch_label_min.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+            stopwatch_label_min.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 
-            stopwatch_mao = lv.label(stopwatch_screen)
-            stopwatch_mao.set_pos(53, 50)
-            stopwatch_mao.set_size(12, 30)
-            stopwatch_mao.set_text(":")
-            stopwatch_mao.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
-            stopwatch_mao.set_long_mode(lv.label.LONG.WRAP)
-            stopwatch_mao.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+            # stopwatch_mao = lv.label(stopwatch_screen)
+            # stopwatch_mao.set_pos(53, 50)
+            # stopwatch_mao.set_size(12, 30)
+            # stopwatch_mao.set_text(":")
+            # stopwatch_mao.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # stopwatch_mao.set_long_mode(lv.label.LONG.WRAP)
+            # stopwatch_mao.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 
 
-            stopwatch_label_sec = lv.label(stopwatch_screen)
-            stopwatch_label_sec.set_pos(59, 50)
-            stopwatch_label_sec.set_size(20, 30)
-            stopwatch_label_sec.set_text("00")
-            stopwatch_label_sec.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
-            stopwatch_label_sec.set_long_mode(lv.label.LONG.WRAP)
-            stopwatch_label_sec.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+            # stopwatch_label_sec = lv.label(stopwatch_screen)
+            # stopwatch_label_sec.set_pos(59, 50)
+            # stopwatch_label_sec.set_size(20, 30)
+            # stopwatch_label_sec.set_text("00")
+            # stopwatch_label_sec.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # stopwatch_label_sec.set_long_mode(lv.label.LONG.WRAP)
+            # stopwatch_label_sec.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 
-            stopwatch_mao1 = lv.label(stopwatch_screen)
-            stopwatch_mao1.set_pos(80, 50)
-            stopwatch_mao1.set_size(12, 30)
-            stopwatch_mao1.set_text(".")
-            stopwatch_mao1.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
-            stopwatch_mao1.set_long_mode(lv.label.LONG.WRAP)
-            stopwatch_mao1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+            # stopwatch_mao1 = lv.label(stopwatch_screen)
+            # stopwatch_mao1.set_pos(80, 50)
+            # stopwatch_mao1.set_size(12, 30)
+            # stopwatch_mao1.set_text(".")
+            # stopwatch_mao1.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # stopwatch_mao1.set_long_mode(lv.label.LONG.WRAP)
+            # stopwatch_mao1.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 
 
-            stopwatch_label_ms = lv.label(stopwatch_screen)
-            stopwatch_label_ms.set_pos(85, 50)
-            stopwatch_label_ms.set_size(12, 30)
-            stopwatch_label_ms.set_text("0")
-            stopwatch_label_ms.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
-            stopwatch_label_ms.set_long_mode(lv.label.LONG.WRAP)
-            stopwatch_label_ms.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
+            # stopwatch_label_ms = lv.label(stopwatch_screen)
+            # stopwatch_label_ms.set_pos(85, 50)
+            # stopwatch_label_ms.set_size(12, 30)
+            # stopwatch_label_ms.set_text("0")
+            # stopwatch_label_ms.add_style(style_font_youyuan_40, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # stopwatch_label_ms.set_long_mode(lv.label.LONG.WRAP)
+            # stopwatch_label_ms.set_style_text_align(lv.TEXT_ALIGN.LEFT, 0)
 
 
 
@@ -5943,10 +6362,10 @@ class StopwatchScreen(Screen):
             stopwatch_stop_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
             stopwatch_stop_img.set_pos(66, 90)
             stopwatch_stop_img.add_flag(lv.obj.FLAG.HIDDEN)
-            stopwatch_start_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.start(e)),
+            stopwatch_start_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
         
-            stopwatch_reset_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reset(e)),
+            stopwatch_reset_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
             self.meta = stopwatch_screen
 
@@ -5966,7 +6385,22 @@ class StopwatchScreen(Screen):
             else:
                 self.timer.start(100,1,self._fun)
             
-
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE: #手势向左还是向右 还是向下向上
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("return_prev_screen")
+        elif code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                self.start(e)
+                pass
+            elif msg == 2:
+                self.reset(e)
+                pass
     def start(self, e):      
         global stopwatch_screen,stopwatch_title,stopwatch_label_min,stopwatch_mao,stopwatch_label_sec ,\
             stopwatch_mao1 ,stopwatch_label_ms,stopwatch_reset_img  ,stopwatch_start_img ,\
@@ -6020,7 +6454,10 @@ class StopwatchScreen(Screen):
         self.timer.stop()
         self.show_value()
 
-    def _fun(self,e):
+    def _fun(self,*argc):
+        EventMesh.publish("publish_message_event_ui",{"func":self._fun_cb,"data":0})
+
+    def _fun_cb(self,e):
         self.ms_value += 1
         if self.ms_value > 9:
             self.ms_value = 0   
@@ -6046,11 +6483,11 @@ class StopwatchScreen(Screen):
         test_s = self.total_time % 60
         test_m = self.total_time//60
         # print("test_s:{} test_m:{} self.total_time:{}".format(test_s,test_m,self.total_time))
-
-        stopwatch_label_ms.set_text(str("%d"%(self.ms_value)))
-        stopwatch_label_sec.set_text(str("%02d"%(test_s)))
-        # stopwatch_label_sec.set_text("{}:{}.{}".format("%02d"%(test_m),"%02d"%(test_s),"%d"%(self.ms_value)))
-        stopwatch_label_min.set_text(str("%02d"%(test_m)))
+        stopwatch_label_min.set_text(str("%02d:%02d.%d"%(test_m,test_s,self.ms_value)))
+        # stopwatch_label_ms.set_text(str("%d"%(self.ms_value)))
+        # stopwatch_label_sec.set_text(str("%02d"%(test_s)))
+        # # stopwatch_label_sec.set_text("{}:{}.{}".format("%02d"%(test_m),"%02d"%(test_s),"%d"%(self.ms_value)))
+        # stopwatch_label_min.set_text(str("%02d"%(test_m)))
 
     def Close(self):
         if self.s_state == 1:
@@ -6123,7 +6560,7 @@ class UIFINDScreen(Screen):
         self.meta_type = "popup"
 
     def initialization(self):
-        global FIND_screen ,findphone_img 
+        global FIND_screen
         
         if FIND_screen ==None:
             FIND_screen = lv.obj()
@@ -6149,32 +6586,38 @@ class UIFINDScreen(Screen):
 
 
             self.meta = FIND_screen
-        
+        self.aud.play(1, 1, 'U:/static/R_VOLUME_SET_1.mp3')  #播放声音
 
     def post_processor_after_initialization(self):
         utime.sleep_ms(200)#不加延时会切屏
         self.FIND_timer_count = 0
         print("self.FIND_timer_count:{}".format(self.FIND_timer_count))
         self.FIND_timer.start(2000, 1, self.FIND_timer_cb)
-        self.aud.play(1, 1, 'U:/static/R_VOLUME_SET_1.mp3')  #播放声音
+        
 
     def FIND_timer_cb(self, *args):
+        print("FIND_timer_cb!!!\r\n")
         EventMesh.publish("system_sleep_rest")
-        self.aud.play(1, 1, 'U:/static/R_VOLUME_SET_1.mp3') 
+        
         self.FIND_timer_count += 1
         if self.FIND_timer_count > 20: #120秒
             self.stop_FIND()
+            return
+        self.aud.play(1, 1, 'U:/static/R_VOLUME_SET_1.mp3') 
     
     def stop_FIND(self) :
+        self.FIND_timer_count = 0
         self.FIND_timer.stop()
-        self.aud.stop()  #播放声音
+        self.aud.stopAll()
         EventMesh.publish("return_prev_screen")
         # EventMesh.publish("load_screen", {"screen": "main_menu"})
 
     def Close(self):
+        self.FIND_timer_count = 0
         print("self.FIND_timer_Close")
         self.FIND_timer.stop()
-        self.aud.stop() #播放声音
+        self.aud.stopAll()
+        print("self.FIND_timer_Close")
 
     def done_left_to_right(self):
         self.stop_FIND()
@@ -6397,38 +6840,105 @@ class sosScreen(Screen):
             sos_screen_label.set_pos(0,25)
             sos_screen_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-
-            sos_screen_confirm_img = lv.img(sos_screen)
-            sos_screen_confirm_img.set_size(88, 23)
-            sos_screen_confirm_img.set_pos(20, 65)
-            sos_screen_confirm_img.set_src("U:/static/off_icon.png")
-            sos_screen_confirm_img.add_flag(lv.obj.FLAG.CLICKABLE)
-            sos_screen_confirm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            sos_screen_confirm_label = lv.label(sos_screen_confirm_img)
-            sos_screen_confirm_label.set_text("确定")
-            sos_screen_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
-            sos_screen_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            sos_screen_return = lv.img(sos_screen)
-            sos_screen_return.set_size(88, 23)
-            sos_screen_return.set_pos(20, 98)
-            sos_screen_return.set_src("U:/static/cancel_icon.png")
-            sos_screen_return.add_flag(lv.obj.FLAG.CLICKABLE)
-            sos_screen_return.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            sos_screen_return_label = lv.label(sos_screen_return)
-            sos_screen_return_label.set_text("取消")
-            sos_screen_return_label.align(lv.ALIGN.CENTER, 0, 0)
-            sos_screen_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            sos_screen_return_label.set_ext_click_area(20)
+            sos_screen_confirm_img = lv.btn(sos_screen)
+            sos_screen_confirm_img.set_pos(int(20),int(64))
+            sos_screen_confirm_img.set_size(88,23)
+            sos_screen_confirm_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(sos_screen_confirm_img)
+            screen_btn_1_label.set_text("确定")
+            sos_screen_confirm_img.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            sos_screen_confirm_img.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+
+            # sos_screen_confirm_img = lv.img(sos_screen)
+            # sos_screen_confirm_img.set_size(88, 23)
+            # sos_screen_confirm_img.set_pos(20, 65)
+            # sos_screen_confirm_img.set_src("U:/static/off_icon.png")
+            # sos_screen_confirm_img.add_flag(lv.obj.FLAG.CLICKABLE)
+            # sos_screen_confirm_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # sos_screen_confirm_label = lv.label(sos_screen_confirm_img)
+            # sos_screen_confirm_label.set_text("确定")
+            # sos_screen_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
+            # sos_screen_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # sos_screen_return = lv.img(sos_screen)
+            # sos_screen_return.set_size(88, 23)
+            # sos_screen_return.set_pos(20, 98)
+            # sos_screen_return.set_src("U:/static/cancel_icon.png")
+            # sos_screen_return.add_flag(lv.obj.FLAG.CLICKABLE)
+            # sos_screen_return.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # sos_screen_return_label = lv.label(sos_screen_return)
+            # sos_screen_return_label.set_text("取消")
+            # sos_screen_return_label.align(lv.ALIGN.CENTER, 0, 0)
+            # sos_screen_return_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # sos_screen_return_label.set_ext_click_area(20)
+
+            sos_screen_return = lv.btn(sos_screen)
+            sos_screen_return.set_pos(int(20),int(98))
+            sos_screen_return.set_size(88,23)
+            sos_screen_return.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(sos_screen_return)
+            screen_btn_1_label.set_text("取消")
+            sos_screen_return.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            sos_screen_return.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 
             self.meta = sos_screen
-            sos_screen_confirm_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.timer_comfirm_cb(e)),
+            
+            sos_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),
+                                     lv.EVENT.GESTURE, None)
+            sos_screen_confirm_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
             
-            sos_screen_return.add_event_cb(lambda e: EventMesh.callback_wrapper(self.timer_cancel_cb(e)),
+            sos_screen_return.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
 
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    self.timer_comfirm_cb(0)
+                elif msg == 2:
+                    self.timer_cancel_cb(0)
+
     def timer_comfirm_cb(self,e):
         EventMesh.publish("set_sos_flag", 1)
     
@@ -6844,36 +7354,89 @@ class NoSimAutoScreen(Screen):#无sim卡是否关机
             no_sim_auto_screen_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
             no_sim_auto_screen_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-
-            no_sim_auto_screen_comfirm = lv.img(no_sim_auto_screen)
-            no_sim_auto_screen_comfirm.set_size(88, 23)
-            no_sim_auto_screen_comfirm.set_pos(20, 64)
-            no_sim_auto_screen_comfirm.set_src("U:/static/off_icon.png")
-            no_sim_auto_screen_comfirm.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_auto_screen_comfirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            no_sim_confirm_label = lv.label(no_sim_auto_screen_comfirm)
-            no_sim_confirm_label.set_text("确定")
-            no_sim_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
-            no_sim_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            no_sim_auto_screen_cancel = lv.img(no_sim_auto_screen)
-            no_sim_auto_screen_cancel.set_size(88, 23)
-            no_sim_auto_screen_cancel.set_pos(20, 95)
-            no_sim_auto_screen_cancel.set_src("U:/static/cancel_icon.png")
-            no_sim_auto_screen_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
-            no_sim_auto_screen_cancel.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            no_sim_cancel_label = lv.label(no_sim_auto_screen_cancel)
-            no_sim_cancel_label.set_text("取消")
-            no_sim_cancel_label.align(lv.ALIGN.CENTER, 0, 0)
-            no_sim_cancel_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            no_sim_auto_screen_cancel.set_ext_click_area(20)
+            no_sim_auto_screen_comfirm = lv.btn(no_sim_auto_screen)
+            no_sim_auto_screen_comfirm.set_pos(int(20),int(64))
+            no_sim_auto_screen_comfirm.set_size(88,23)
+            no_sim_auto_screen_comfirm.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(no_sim_auto_screen_comfirm)
+            screen_btn_1_label.set_text("确定")
+            no_sim_auto_screen_comfirm.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(249,47,109))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            no_sim_auto_screen_comfirm.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+            # no_sim_auto_screen_comfirm = lv.img(no_sim_auto_screen)
+            # no_sim_auto_screen_comfirm.set_size(88, 23)
+            # no_sim_auto_screen_comfirm.set_pos(20, 64)
+            # no_sim_auto_screen_comfirm.set_src("U:/static/off_icon.png")
+            # no_sim_auto_screen_comfirm.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_auto_screen_comfirm.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # no_sim_confirm_label = lv.label(no_sim_auto_screen_comfirm)
+            # no_sim_confirm_label.set_text("确定")
+            # no_sim_confirm_label.align(lv.ALIGN.CENTER, 0, 0)
+            # no_sim_confirm_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+            # no_sim_auto_screen_cancel = lv.img(no_sim_auto_screen)
+            # no_sim_auto_screen_cancel.set_size(88, 23)
+            # no_sim_auto_screen_cancel.set_pos(20, 95)
+            # no_sim_auto_screen_cancel.set_src("U:/static/cancel_icon.png")
+            # no_sim_auto_screen_cancel.add_flag(lv.obj.FLAG.CLICKABLE)
+            # no_sim_auto_screen_cancel.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # no_sim_cancel_label = lv.label(no_sim_auto_screen_cancel)
+            # no_sim_cancel_label.set_text("取消")
+            # no_sim_cancel_label.align(lv.ALIGN.CENTER, 0, 0)
+            # no_sim_cancel_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # no_sim_auto_screen_cancel.set_ext_click_area(20)
+
+            no_sim_auto_screen_cancel = lv.btn(no_sim_auto_screen)
+            no_sim_auto_screen_cancel.set_pos(int(20),int(98))
+            no_sim_auto_screen_cancel.set_size(88,23)
+            no_sim_auto_screen_cancel.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+            screen_btn_1_label = lv.label(no_sim_auto_screen_cancel)
+            screen_btn_1_label.set_text("取消")
+            no_sim_auto_screen_cancel.set_style_pad_all(0, lv.STATE.DEFAULT)
+            screen_btn_1_label.align(lv.ALIGN.CENTER,0,0)
+            # create style style_screen_btn_1_main_main_default
+            style_screen_btn_1_main_main_default = lv.style_t()
+            style_screen_btn_1_main_main_default.init()
+            style_screen_btn_1_main_main_default.set_radius(20)
+            style_screen_btn_1_main_main_default.set_bg_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
+            style_screen_btn_1_main_main_default.set_bg_opa(255)
+            style_screen_btn_1_main_main_default.set_border_color(lv.color_make(7,222,169))
+            style_screen_btn_1_main_main_default.set_border_width(0)
+            style_screen_btn_1_main_main_default.set_border_opa(255)
+            style_screen_btn_1_main_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
+            style_screen_btn_1_main_main_default.set_text_font(lv.K01_font_16_ALL)
+            style_screen_btn_1_main_main_default.set_text_align(lv.TEXT_ALIGN.CENTER)
+
+            # add style for screen_btn_1
+            no_sim_auto_screen_cancel.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 
             self.meta = no_sim_auto_screen
-            no_sim_auto_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),
+            no_sim_auto_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),
+                                     lv.EVENT.GESTURE, None)
+            no_sim_auto_screen_comfirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
         
-            no_sim_auto_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.cancel(e)),
+            no_sim_auto_screen_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
         self.timer.start(1*1000,1,self.fun)
         self.count = 0
@@ -6889,6 +7452,18 @@ class NoSimAutoScreen(Screen):#无sim卡是否关机
     def Close(self):
         self.count = 0
         self.timer.stop()
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if  code == lv.EVENT.SHORT_CLICKED:
+            if msg != 0:
+                if msg == 1:
+                    self.confirm(0)
+                elif msg == 2:
+                    self.cancel(0)
+                # EventMesh.publish("load_screen",  {"screen": "{}".format(msg)})
 
     def confirm(self,e):
         EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})
@@ -6926,33 +7501,39 @@ class SystemInitScreen(Screen):
             print("SystemInitScreen")
             system_init_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
        
-            system_init_label = lv.label(system_init_screen)
-            system_init_label.set_pos(0, 50)
-            system_init_label.set_size(128, 20)
-            system_init_label.set_text("系统初始化中")
-            system_init_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            system_init_label.set_long_mode(lv.label.LONG.WRAP)
-            system_init_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+            poweron_img = lv.img(system_init_screen)
+            poweron_img.set_size(80,80)
+            poweron_img.set_pos(24,24)
+            poweron_img.set_src("U:/static/AI_MAIN_ICON.png")
+            # screen_slider_img.add_flag(lv.obj.FLAG.CLICKABLE)
+            poweron_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # system_init_label = lv.label(system_init_screen)
+            # system_init_label.set_pos(0, 50)
+            # system_init_label.set_size(128, 20)
+            # system_init_label.set_text("WELCOME")
+            # system_init_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # system_init_label.set_long_mode(lv.label.LONG.WRAP)
+            # system_init_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
             self.meta = system_init_screen
         self.system_init_timer_count = 0
         self.system_init_timer.start(1000, 1, self.system_init_timer_cb)
 
     def system_init_timer_cb(self, *args):
         EventMesh.publish("system_sleep_rest")#防止黑屏
-        self.system_init_timer_count += 1
-        if self.system_init_timer_count > 4:
-            self.system_init_timer_count = 1
-        if system_init_screen != None:
-
-            system_init_label_str = "系统初始化中"
-            if self.system_init_timer_count == 1:
-                system_init_label.set_text("系统初始化中.")
-            elif self.system_init_timer_count == 2:
-                system_init_label.set_text("系统初始化中..")
-            elif self.system_init_timer_count == 3:
-                system_init_label.set_text("系统初始化中...")
-            else:
-                system_init_label.set_text("系统初始化中....")
+        # self.system_init_timer_count += 1
+        # if self.system_init_timer_count > 4:
+        #     self.system_init_timer_count = 1
+        # if system_init_screen != None:
+
+        #     system_init_label_str = "系统初始化中"
+        #     if self.system_init_timer_count == 1:
+        #         system_init_label.set_text("系统初始化中.")
+        #     elif self.system_init_timer_count == 2:
+        #         system_init_label.set_text("系统初始化中..")
+        #     elif self.system_init_timer_count == 3:
+        #         system_init_label.set_text("系统初始化中...")
+        #     else:
+        #         system_init_label.set_text("系统初始化中....")
 
     def Close(self):
        self.system_init_timer.stop()
@@ -7057,28 +7638,52 @@ class classMgrPopupScreen(Screen):#上课禁用时间界面
 
 # -------------------------------------------down screen----------------------------------------------------------
 down_show_screen = lv.obj()
-print("restart_screen")
+print("down_show_screen")
 down_show_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
+
+down_show_bright_imgbtn_1 = lv.btn(down_show_screen)
+down_show_bright_imgbtn_1.set_pos(int(0),80)
+down_show_bright_imgbtn_1.set_size(44,48)
+down_show_bright_imgbtn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+down_show_bright_imgbtn_1.add_style(style_screen_btn_1_main_main_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+down_show_bright_imgbtn_1.add_flag(lv.obj.FLAG.CLICKABLE)
+
+
 down_show_bright_img = lv.img(down_show_screen)#亮度
 down_show_bright_img.set_size(25, 25)
 down_show_bright_img.set_pos(13, 90)
 down_show_bright_img.set_src("U:/static/menu_bright.png")
-down_show_bright_img.add_flag(lv.obj.FLAG.CLICKABLE)
+# down_show_bright_img.add_flag(lv.obj.FLAG.CLICKABLE)
 down_show_bright_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
+
+down_show_volume_imgbtn_1 = lv.btn(down_show_screen)
+down_show_volume_imgbtn_1.set_pos(int(44),80)
+down_show_volume_imgbtn_1.set_size(37,48)
+down_show_volume_imgbtn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+down_show_volume_imgbtn_1.add_style(style_screen_btn_1_main_main_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+down_show_volume_imgbtn_1.add_flag(lv.obj.FLAG.CLICKABLE)
+
 down_show_volume_img = lv.img(down_show_screen)#音量
 down_show_volume_img.set_size(25, 25)
 down_show_volume_img.set_pos(13+25+13, 90)
 down_show_volume_img.set_src("U:/static/menu_volume.png")
-down_show_volume_img.add_flag(lv.obj.FLAG.CLICKABLE)
+# down_show_volume_img.add_flag(lv.obj.FLAG.CLICKABLE)
 down_show_volume_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
+down_show_setting_imgbtn_1 = lv.btn(down_show_screen)
+down_show_setting_imgbtn_1.set_pos(int(81),80)
+down_show_setting_imgbtn_1.set_size(47,48)
+down_show_setting_imgbtn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+down_show_setting_imgbtn_1.add_style(style_screen_btn_1_main_main_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+down_show_setting_imgbtn_1.add_flag(lv.obj.FLAG.CLICKABLE)
+
 down_show_setting_img = lv.img(down_show_screen)#设置
 down_show_setting_img.set_size(25, 25)
 down_show_setting_img.set_pos(13+25+13+25+13, 90)
 down_show_setting_img.set_src("U:/static/ui_setting.png")
-down_show_setting_img.add_flag(lv.obj.FLAG.CLICKABLE)
+# down_show_setting_img.add_flag(lv.obj.FLAG.CLICKABLE)
 down_show_setting_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 
@@ -7148,131 +7753,6 @@ down_show_date_span.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 down_show_date_span.set_text("%02d/%02d 星期%s"%(date1,date2,get_week(week)))
 down_show_date_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-# volum_bar_1 = lv.bar(down_show_screen)
-# volum_bar_1.set_pos(int(10),int(65))
-# volum_bar_1.set_size(108,15)
-# volum_bar_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-# volum_bar_1.set_style_anim_time(1000, 0)
-# volum_bar_1.set_mode(lv.bar.MODE.NORMAL)
-# volum_bar_1.set_value(100, lv.ANIM.OFF)
-# volum_bar_1.add_flag(lv.obj.FLAG.HIDDEN)
-# # create style style_screen_bar_1_main_main_default
-# style_screen_bar_1_main_main_default = lv.style_t()
-# style_screen_bar_1_main_main_default.init()
-# style_screen_bar_1_main_main_default.set_radius(10)
-# style_screen_bar_1_main_main_default.set_bg_color(lv.color_make(0x00,0x00,0x00))
-# style_screen_bar_1_main_main_default.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6))
-# style_screen_bar_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_bar_1_main_main_default.set_bg_opa(60)
-
-# # add style for screen_bar_1
-# volum_bar_1.add_style(style_screen_bar_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-# # create style style_screen_bar_1_main_indicator_default
-# style_screen_bar_1_main_indicator_default = lv.style_t()
-# style_screen_bar_1_main_indicator_default.init()
-# style_screen_bar_1_main_indicator_default.set_radius(10)
-# style_screen_bar_1_main_indicator_default.set_bg_color(lv.color_make(0x80,0x80,0x80))
-# style_screen_bar_1_main_indicator_default.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6))
-# style_screen_bar_1_main_indicator_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_bar_1_main_indicator_default.set_bg_opa(255)
-
-# # add style for screen_bar_1
-# volum_bar_1.add_style(style_screen_bar_1_main_indicator_default, lv.PART.INDICATOR|lv.STATE.DEFAULT)
-
-# volum_slider_1 = lv.slider(down_show_screen)
-# volum_slider_1.set_pos(int(19),int(70))
-# volum_slider_1.set_size(90,5)
-# volum_slider_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-# volum_slider_1.set_range(0, 100)
-# volum_slider_1.set_value(0, False)
-# volum_slider_1.add_flag(lv.obj.FLAG.HIDDEN)
-# create style style_screen_slider_1_main_main_default
-# style_screen_slider_1_main_main_default = lv.style_t()
-# style_screen_slider_1_main_main_default.init()
-# style_screen_slider_1_main_main_default.set_radius(30)
-# style_screen_slider_1_main_main_default.set_bg_color(lv.color_make(237,30,121))
-# style_screen_slider_1_main_main_default.set_bg_grad_color(lv.color_make(237,30,121))
-# style_screen_slider_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_slider_1_main_main_default.set_bg_opa(0)
-# style_screen_slider_1_main_main_default.set_outline_color(lv.color_make(237,30,121))
-# style_screen_slider_1_main_main_default.set_outline_width(0)
-# style_screen_slider_1_main_main_default.set_outline_opa(0)
-
-# # add style for screen_slider_1
-# volum_slider_1.add_style(style_screen_slider_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-# create style style_screen_slider_1_main_indicator_default
-# style_screen_volum_slider_1_main_indicator_default = lv.style_t()
-# style_screen_volum_slider_1_main_indicator_default.init()
-# style_screen_volum_slider_1_main_indicator_default.set_radius(30)
-# style_screen_volum_slider_1_main_indicator_default.set_bg_color(lv.color_make(237,30,121))
-# style_screen_volum_slider_1_main_indicator_default.set_bg_grad_color(lv.color_make(237,30,121))
-# style_screen_volum_slider_1_main_indicator_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_volum_slider_1_main_indicator_default.set_bg_opa(255)
-
-# # add style for screen_slider_1
-# volum_slider_1.add_style(style_screen_volum_slider_1_main_indicator_default, lv.PART.INDICATOR|lv.STATE.DEFAULT)
-
-# # create style style_screen_slider_1_main_knob_default
-# style_screen_volum_slider_1_main_knob_default = lv.style_t()
-# style_screen_volum_slider_1_main_knob_default.init()
-# style_screen_volum_slider_1_main_knob_default.set_radius(30)
-# style_screen_volum_slider_1_main_knob_default.set_bg_color(lv.color_make(237,30,121))
-# style_screen_volum_slider_1_main_knob_default.set_bg_grad_color(lv.color_make(237,30,121))
-# style_screen_volum_slider_1_main_knob_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_volum_slider_1_main_knob_default.set_bg_opa(255)
-
-# # add style for screen_slider_1
-# volum_slider_1.add_style(style_screen_volum_slider_1_main_knob_default, lv.PART.KNOB|lv.STATE.DEFAULT)
-
-
-
-# brightress_slider_1 = lv.slider(down_show_screen)
-# brightress_slider_1.set_pos(int(19),int(70))
-# brightress_slider_1.set_size(90,5)
-# brightress_slider_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-# brightress_slider_1.set_range(0, 100)
-# brightress_slider_1.set_value(0, False)
-# brightress_slider_1.add_flag(lv.obj.FLAG.HIDDEN)
-# create style style_screen_slider_1_main_main_default
-# style_screen_slider_1_main_main_default = lv.style_t()
-# style_screen_slider_1_main_main_default.init()
-# style_screen_slider_1_main_main_default.set_radius(30)
-# style_screen_slider_1_main_main_default.set_bg_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_main_default.set_bg_grad_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_slider_1_main_main_default.set_bg_opa(0)
-# style_screen_slider_1_main_main_default.set_outline_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_main_default.set_outline_width(0)
-# style_screen_slider_1_main_main_default.set_outline_opa(0)
-
-# # add style for screen_slider_1
-# brightress_slider_1.add_style(style_screen_slider_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-# # create style style_screen_slider_1_main_indicator_default
-# style_screen_slider_1_main_indicator_default = lv.style_t()
-# style_screen_slider_1_main_indicator_default.init()
-# style_screen_slider_1_main_indicator_default.set_radius(30)
-# style_screen_slider_1_main_indicator_default.set_bg_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_indicator_default.set_bg_grad_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_indicator_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_slider_1_main_indicator_default.set_bg_opa(255)
-
-# # add style for screen_slider_1
-# brightress_slider_1.add_style(style_screen_slider_1_main_indicator_default, lv.PART.INDICATOR|lv.STATE.DEFAULT)
-
-# # create style style_screen_slider_1_main_knob_default
-# style_screen_slider_1_main_knob_default = lv.style_t()
-# style_screen_slider_1_main_knob_default.init()
-# style_screen_slider_1_main_knob_default.set_radius(30)
-# style_screen_slider_1_main_knob_default.set_bg_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_knob_default.set_bg_grad_color(lv.color_make(247,147,30))
-# style_screen_slider_1_main_knob_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-# style_screen_slider_1_main_knob_default.set_bg_opa(255)
-
-# # add style for screen_slider_1
-# brightress_slider_1.add_style(style_screen_slider_1_main_knob_default, lv.PART.KNOB|lv.STATE.DEFAULT)
 
 class down_Screen(Screen):#下滑界面
     NAME = "down_screen"
@@ -7287,38 +7767,54 @@ class down_Screen(Screen):#下滑界面
         # brightress_slider_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.change_bright(e)), lv.EVENT.RELEASED, None)
         # volum_slider_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.save_choice(e)), lv.EVENT.VALUE_CHANGED, None)
         # volum_slider_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.save_choice(e)), lv.EVENT.RELEASED, None)
+        down_show_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"void")), lv.EVENT.GESTURE, None)
+        down_show_bright_imgbtn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"brightness")), lv.EVENT.SHORT_CLICKED, None)
+        down_show_volume_imgbtn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"totalvolume")), lv.EVENT.SHORT_CLICKED, None)
+        down_show_setting_imgbtn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"setting")), lv.EVENT.SHORT_CLICKED, None)
 
-        down_show_bright_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"brightness")), lv.EVENT.SHORT_CLICKED, None)
-        down_show_volume_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"totalvolume")), lv.EVENT.SHORT_CLICKED, None)
-        down_show_setting_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"setting")), lv.EVENT.SHORT_CLICKED, None)
-
-        down_show_bright_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"brightness")), lv.EVENT.PRESSING, None)
-        down_show_volume_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"totalvolume")), lv.EVENT.PRESSING, None)
-        down_show_setting_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"setting")), lv.EVENT.PRESSING, None)
+        # down_show_bright_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"brightness")), lv.EVENT.PRESSING, None)
+        # down_show_volume_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"totalvolume")), lv.EVENT.PRESSING, None)
+        # down_show_setting_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,"setting")), lv.EVENT.PRESSING, None)
 
     def img_cb(self,e,msg):
         code = e.get_code()
         indev = lv.indev_get_act()
         lv.indev_t.wait_release(indev)
         dir = lv.indev_t.get_gesture_dir(indev)
-        # LV_DIR_TOP
         if code == lv.EVENT.GESTURE:
             if dir == lv.DIR.BOTTOM:
-                EventMesh.publish("load_screen", {"screen": "main_menu"})
-
+                pass
+                # EventMesh.publish("watch_top_show")
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+            elif dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
         elif  code == lv.EVENT.SHORT_CLICKED:
-            if msg == "brightness":
-                # volum_slider_1.add_flag(lv.obj.FLAG.HIDDEN)
-                # brightress_slider_1.clear_flag(lv.obj.FLAG.HIDDEN)
-                EventMesh.publish("load_screen", {"screen": "brightness"})
-            elif msg == "totalvolume":
-                # brightress_slider_1.add_flag(lv.obj.FLAG.HIDDEN)
-                # volum_slider_1.clear_flag(lv.obj.FLAG.HIDDEN)
-                EventMesh.publish("load_screen", {"screen": "totalvolume"})
-            else:
-                if msg == 'setting':
+            if msg != "void":
+                if msg == "brightness":
+                    EventMesh.publish("load_screen", {"screen": "brightness"})
+                elif msg == "totalvolume":
+                    EventMesh.publish("load_screen", {"screen": "totalvolume"})
+                elif msg == 'setting':
                     EventMesh.publish("load_screen", {"screen": "setting"})
-                    pass
+    # def img_cb(self,e,msg):
+    #     code = e.get_code()
+    #     indev = lv.indev_get_act()
+    #     lv.indev_t.wait_release(indev)
+    #     dir = lv.indev_t.get_gesture_dir(indev)
+    #     # LV_DIR_TOP
+    #     if code == lv.EVENT.GESTURE:
+    #         if dir == lv.DIR.BOTTOM:
+    #             EventMesh.publish("load_screen", {"screen": "main_menu"})
+    #         elif dir == lv.DIR.RIGHT:
+    #             pass
+    #     elif  code == lv.EVENT.SHORT_CLICKED:
+    #         if msg == "brightness":
+    #             EventMesh.publish("load_screen", {"screen": "brightness"})
+    #         elif msg == "totalvolume":
+    #             EventMesh.publish("load_screen", {"screen": "totalvolume"})
+    #         elif msg == 'setting':
+    #             EventMesh.publish("load_screen", {"screen": "setting"})
 
        
     
@@ -7505,2141 +8001,23 @@ class up_Screen(Screen):#上滑界面
         EventMesh.publish("watch_top_show")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
-camera_popup_screen = None
-camera_popup_label = None
-camera_img_test = None
-def camCapturecallback(result_list):
-    print("camCapturecallback",result_list)
-    if result_list[0] == 0:#保存成功
-        file = str(result_list[1])
-        tmp = file.split('/')[3]
-        tmp = tmp.split("_camera")[0]
-        time = int(tmp)
-        album_data = int(EventMesh.publish("get_camera_num"))
-        if album_data >= 1:
-            album_data=1
-        print("album_data",album_data)
-        EventMesh.publish("set_camera_num",album_data+1)
-        EventMesh.publish("save_album_succ",1)
-        pass
-    pass
-dec = camera.camCapture(0,240,320,1,128,128)
-dec.callback(camCapturecallback)
-
-camera_full_popup_screen = None
-camera_full_label_popup_screen = None
-class cameraFullScreen(Screen):#相册已满
-    #
-    NAME = "camera_full"
-    
+
+rrestor_confirm_n_screen = None
+rrestor_confirm_n_screen_label = None
+
+#
+class restore_confirmScreen(Screen):
+    NAME = "restore_confirm"
     def __init__(self):
         super().__init__()
         self.meta = None
         self.meta_type = "popup"
+        self.count = 0
+        self.timer1 = osTimer()
+        self.timer2 = osTimer()
+        self.timer3 = osTimer()
 
-
-    def initialization(self):
-        global camera_full_popup_screen ,camera_full_label_popup_screen
-        
-        
-        if camera_full_popup_screen == None:
-            camera_full_popup_screen = lv.obj()
-            print("camera_full")
-            camera_full_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            camera_full_label_popup_screen = lv.label(camera_full_popup_screen)
-            camera_full_label_popup_screen.set_pos(0, 50)
-            camera_full_label_popup_screen.set_size(128, 40)
-            camera_full_label_popup_screen.set_text("相册已满,删除即可拍照")
-            camera_full_label_popup_screen.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            camera_full_label_popup_screen.set_long_mode(lv.label.LONG.WRAP)
-            camera_full_label_popup_screen.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            self.meta = camera_full_popup_screen
-
-
-    def done_click(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-   
-            
-    def done_return(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-delete_album_popup_screen = None
-delete_album_label_popup_screen = None
-class deletealbumScreen(Screen):#删除图片
-    #
-    NAME = "delete_album"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.meta_type = "popup"
-
-
-    def initialization(self):
-        global delete_album_popup_screen ,delete_album_label_popup_screen
-        
-        
-        if delete_album_popup_screen == None:
-            delete_album_popup_screen = lv.obj()
-            print("delete_album_popup_screen")
-            delete_album_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            delete_album_label_popup_screen = lv.label(delete_album_popup_screen)
-            delete_album_label_popup_screen.set_pos(0, 50)
-            delete_album_label_popup_screen.set_size(128, 40)
-            delete_album_label_popup_screen.set_text("删除成功")
-            delete_album_label_popup_screen.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            delete_album_label_popup_screen.set_long_mode(lv.label.LONG.WRAP)
-            delete_album_label_popup_screen.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            self.meta = delete_album_popup_screen
-
-
-    def done_click(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-   
-            
-    def done_return(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        EventMesh.publish("return_prev_screen")
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-import jrtc
-class cameraScreen(Screen):#相机拍照二级界面
-    #
-    NAME = "camera"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.preview1 = None
-        self.timer = osTimer()
-        self.timer2 = osTimer()
-        self.timer3 = osTimer()
-        self.camera_num = 0
-        EventMesh.subscribe("save_album_succ",self.save_album_succ)
-
-    def initialization(self):
-        global camera_popup_screen ,camera_popup_label,camera_img_test
-        # dec = camera.camCapture(0,240,320,1,128,128)
-        # dec.callback(camCapturecallback)
-        state = dec.open()
-        dec.set_cam_angle(0)
-        if camera_popup_screen == None:
-            camera_popup_screen = lv.obj()
-            print("camera_popup_screen")
-            camera_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            
-            camera_img_test = lv.img(camera_popup_screen)
-                # img_test.set_src("U:/hang_up.png")
-            ret = dec.set_img(camera_img_test)
-            
-            camera_img_test.align(lv.ALIGN.CENTER, 0, 0)
-            camera_img_test.set_size(128,128)
-            
-        
-            camera_camera_btn = lv.img(camera_popup_screen)
-            camera_camera_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_btn.set_pos(48, 90)
-            camera_camera_btn.set_size(30,30)
-            camera_camera_btn.set_src("U:/static/camera_btn.png")
-            # camera_camera_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_camera_album_btn = lv.img(camera_popup_screen)
-            camera_camera_album_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_album_btn.set_pos(100, 10)
-            camera_camera_album_btn.set_size(20,20)
-            camera_camera_album_btn.set_src("U:/static/camera_album_btn.png")
-            # camera_camera_album_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_album_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_camera_return_btn = lv.img(camera_popup_screen)
-            camera_camera_return_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_return_btn.set_pos(0, 10)
-            camera_camera_return_btn.set_size(18,18)
-            camera_camera_return_btn.set_src("U:/static/RED_RETURN_PNG.png")
-            # camera_camera_return_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_album_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_camera_return_btn_label = lv.label(camera_popup_screen)
-            camera_camera_return_btn_label.set_pos(0, 0)
-            camera_camera_return_btn_label.set_size(40, 40)
-            camera_camera_return_btn_label.set_text(" ")
-            camera_camera_return_btn_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_return_btn_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_return_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_camera_album_btn_label = lv.label(camera_popup_screen)
-            camera_camera_album_btn_label.set_pos(80, 0)
-            camera_camera_album_btn_label.set_size(48, 40)
-            camera_camera_album_btn_label.set_text(" ")
-            camera_camera_album_btn_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_album_btn_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_album_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_camera_btn_label = lv.label(camera_popup_screen)
-            camera_camera_btn_label.set_pos(40, 88)
-            camera_camera_btn_label.set_size(50, 40)
-            camera_camera_btn_label.set_text(" ")
-            camera_camera_btn_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_camera_btn_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.camera_click(e)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_popup_label = lv.label(camera_popup_screen)
-            camera_popup_label.set_pos(0, 40)
-            camera_popup_label.set_size(128, 20)
-            camera_popup_label.set_text("保存成功")
-            camera_popup_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            camera_popup_label.set_long_mode(lv.label.LONG.WRAP)
-            camera_popup_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            camera_popup_label.add_flag(lv.obj.FLAG.HIDDEN)
-
-            self.meta = camera_popup_screen
-
-        
-
-        album_data = EventMesh.publish("get_camera_num")
-        if int(album_data) >= 1:#相册已满
-            # EventMesh.publish("load_screen", {"screen": "camera_full"})
-            pass
-        if camera_popup_label != None:
-            camera_popup_label.add_flag(lv.obj.FLAG.HIDDEN)
-        self.timer.start(1*1000,1,self.fun)
-
-    def save_album_succ(self,event,msg):
-        global camera_popup_label
-        if camera_popup_label != None:
-            if msg == 1:
-                camera_popup_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            else:
-                camera_popup_label.add_flag(lv.obj.FLAG.HIDDEN)
-
-        self.timer3.start(1*2000,0,self.save_suc_album)#延迟1s保存图片
-        pass
-
-    def fun(self,*argc):
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-
-    def camera_click(self,e):
-        self.timer3.stop()
-        EventMesh.publish("save_album_succ",2)
-        album_data = EventMesh.publish("get_camera_num")
-        if album_data != None:
-            if int(album_data) >= 1:#相册已满
-                EventMesh.publish("load_screen", {"screen": "camera_full"})
-                return
-        self.timer2.start(1*1000,0,self.save_album)#延迟1s保存图片
-
-    def camera_album_click(self,e):
-        EventMesh.publish("load_screen", {"screen": "camera_album"})
-
-    def camera_return_click(self,e):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-    def Close(self):
-        self.timer.stop()
-        self.timer2.stop()
-        self.timer3.stop()
-        # dec.remove_img()
-        print("close camera!!!!!!!")
-        state = dec.close()
-
-    def save_suc_album(self,*argc):
-        EventMesh.publish("save_album_succ",2)
-    # def done_click(self):
-    #     self.timer2.start(1*1000,0,self.save_album)#延迟1s保存图片
-    #     pass
-    def save_album(self,*argc):
-        album_data = EventMesh.publish("get_camera_num")
-        if int(album_data) <= 1:
-            date_tmp = utime.localtime()
-            time_tmp = utime.mktime(date_tmp)
-            dec.start(128,128, "static/album/1_camera")
-        else:
-            EventMesh.publish("load_screen", {"screen": "camera_full"})
-            
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-
-
-camera_album_popup_screen = None
-camera_album_popup_label = None
-camera_album_popup_img = None
-imgbt_contanier = None
-camera_album_popup_img1 = None
-camera_album_popup_img2 = None
-camera_album_popup_img3 = None
-camera_album_popup_img4 = None
-camera_album_popup_img5 = None
-class cameraalbumScreen(Screen):#相册
-    #
-    NAME = "camera_album"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-
-    def initialization(self):
-        global camera_album_popup_screen ,camera_album_popup_label,camera_album_popup_img1,camera_album_popup_img2,camera_album_popup_img3,camera_album_popup_img4,camera_album_popup_img5
-        
-        if camera_album_popup_screen == None:
-            camera_album_popup_screen = lv.obj()
-            print("camera_album_popup_screen")
-            camera_album_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            camera_album_popup_label = lv.label(camera_album_popup_screen)
-            camera_album_popup_label.set_pos(0, 60)
-            camera_album_popup_label.set_size(128, 20)
-            camera_album_popup_label.set_text("还没有照片")
-            camera_album_popup_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            camera_album_popup_label.set_long_mode(lv.label.LONG.WRAP)
-            camera_album_popup_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-
-            camera_album_popup_img1 = lv.img(camera_album_popup_screen)
-            camera_album_popup_img1.set_pos(0, 0)
-            camera_album_popup_img1.set_size(128, 128)
-            
-            # camera_album_popup_img1.add_flag(lv.obj.FLAG.HIDDEN)
-            # camera_album_popup_img1.add_flag(lv.obj.FLAG.CLICKABLE)
-            # # camera_album_popup_img1.set_zoom(256)
-            # camera_album_popup_img1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.click_album(e,0)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_album_popup_img2 = lv.img(camera_album_popup_screen)
-            camera_album_popup_img2.set_pos(51, 100)
-            camera_album_popup_img2.set_size(25, 25)
-            camera_album_popup_img2.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_album_popup_img2.add_event_cb(lambda e: EventMesh.callback_wrapper(self.click_album(e,0)), lv.EVENT.SHORT_CLICKED, None)
-
-            camera_album_popup_img3 = lv.img(camera_album_popup_screen)
-            camera_album_popup_img3.set_pos(0, 10)
-            camera_album_popup_img3.set_size(18,18)
-            camera_album_popup_img3.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_album_popup_img3.set_src("U:/static/RED_RETURN_PNG.png")
-            camera_album_popup_img3.add_event_cb(lambda e: EventMesh.callback_wrapper(self.click_album(e,1)), lv.EVENT.SHORT_CLICKED, None)
-
-            self.meta = camera_album_popup_screen
-        read_album = 0
-        read_album = EventMesh.publish("get_camera_num")
-        print("read_album",read_album)
-        if int(read_album) != 0:
-            camera_album_popup_img1.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_album_popup_img1.set_src("U:/static/album/1_camera.jpg") #'U:/6_camera.jpeg'"U:/static/album/1_camera.jpg"
-            camera_album_popup_img2.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_album_popup_img2.set_src("U:/static/album_delete.png")
-            camera_album_popup_label.add_flag(lv.obj.FLAG.HIDDEN)
-        else:
-            camera_album_popup_img1.add_flag(lv.obj.FLAG.HIDDEN)
-            camera_album_popup_img2.add_flag(lv.obj.FLAG.HIDDEN)
-            camera_album_popup_label.clear_flag(lv.obj.FLAG.HIDDEN)
-        
-    
-    def click_album(self,e,i):
-        if i == 0:
-            check_img = ql_fs.path_exists("/usr/static/album/1_camera.jpg")
-            if check_img == True :#图片存在
-                uos.remove("/usr/static/album/1_camera.jpg")#删除单张图片
-                album_data = int(EventMesh.publish("get_camera_num"))
-
-                EventMesh.publish("set_camera_num",album_data-1)
-
-                EventMesh.publish("load_screen", {"screen": "delete_album"})
-                return
-        
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-        # read_album = {}
-        # read_album = EventMesh.publish("get_camera_num")
-        # if len(read_album) != 0 and i < len(read_album):
-        #     sort_new = {}
-        #     sort_new = sorted(read_album.keys())
-        #     key = sort_new[i]
-        #     value = int(read_album[key]["timeSec"])
-        #     self.meta_info = value
-        #     print(self.meta_info,i)
-        #     EventMesh.publish("load_screen", {"screen": "album_preview","meta": self.meta_info})#点击进入相册预览大图显示
-        # print(i)
-        pass
-
-    def Close(self):
-        pass
-
-    def done_click(self):
-        
-        pass
-
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-album_preview_popup_screen = None
-album_preview_popup_img = None
-album_preview_popup_delet_con_label = None
-album_preview_popup_delet_con_label = None
-album_preview_popup_delet_label = None
-class albumPreviewScreen(Screen):#点击预览
-    #
-    NAME = "album_preview"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-
-    def initialization(self):
-        global album_preview_popup_screen ,album_preview_popup_delet_label,album_preview_popup_img,album_preview_popup_delet_can_label,album_preview_popup_delet_con_label
-        
-        if album_preview_popup_screen == None:
-            album_preview_popup_screen = lv.obj()
-            print("album_preview_popup_screen")
-            album_preview_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-
-            album_preview_popup_img = lv.img(album_preview_popup_screen)
-            album_preview_popup_img.set_pos(0, 0)
-            album_preview_popup_img.set_size(120,120)
-            # album_preview_popup_img.set_zoom(400)
-
-            album_preview_popup_delet_label = lv.label(album_preview_popup_screen)
-            album_preview_popup_delet_label.set_pos(0, 65)
-            album_preview_popup_delet_label.set_size(128, 20)
-            album_preview_popup_delet_label.set_text("是否删除")
-            album_preview_popup_delet_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            album_preview_popup_delet_label.set_long_mode(lv.label.LONG.WRAP)
-            album_preview_popup_delet_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-
-            album_preview_popup_delet_con_label = lv.label(album_preview_popup_screen)
-            album_preview_popup_delet_con_label.set_pos(0, 95)
-            album_preview_popup_delet_con_label.set_size(64, 33)
-            album_preview_popup_delet_con_label.set_text("确定")
-            album_preview_popup_delet_con_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            album_preview_popup_delet_con_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            album_preview_popup_delet_con_label.set_long_mode(lv.label.LONG.WRAP)
-            album_preview_popup_delet_con_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-
-
-            album_preview_popup_delet_can_label = lv.label(album_preview_popup_screen)
-            album_preview_popup_delet_can_label.set_pos(64, 95)
-            album_preview_popup_delet_can_label.set_size(64, 33)
-            album_preview_popup_delet_can_label.set_text("取消")
-            album_preview_popup_delet_can_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            album_preview_popup_delet_can_label.set_long_mode(lv.label.LONG.WRAP)
-            album_preview_popup_delet_can_label.add_flag(lv.obj.FLAG.CLICKABLE)
-            album_preview_popup_delet_can_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-
-            self.meta = album_preview_popup_screen
-        album_num_tmp = None
-        album_num_tmp = int(self.meta_info)
-        print(album_num_tmp)
-        album_preview_popup_delet_can_label.add_event_cb(lambda e:EventMesh.callback_wrapper(self.cancel_pop(e)),lv.EVENT.SHORT_CLICKED,None)
-        album_preview_popup_delet_con_label.add_event_cb(lambda e:EventMesh.callback_wrapper(self.confirm_pop(e)),lv.EVENT.SHORT_CLICKED,None)
-        
-        album_preview_popup_img.set_src("U:/static/album/%d_camera.jpg"%(album_num_tmp))#'U:/6_camera.jpeg'
-
-    def cancel_pop(self,e):#取消删除
-        EventMesh.publish("load_screen", {"screen": "main_menu"})#点击回到相册界面
-        pass
-
-    def confirm_pop(self,e):#确认删除
-        # album_num = int(self.meta_info.split(':')[1])
-        # album_num_tmp = None
-        # album_num_tmp = int(self.meta_info)
-        # print(album_num_tmp)
-       
-        # check_img = ql_fs.path_exists("/usr/static/album/%d_camera.jpg"%(album_num_tmp))
-        # if check_img == True :#图片存在
-        #     uos.remove("/usr/static/album/%d_camera.jpg"%(album_num_tmp))#删除单张图片
-        #     read_album = {}
-        #     read_album = EventMesh.publish("get_camera_num")#删除的同时把数据部分也清掉
-        #     print("img is exit1",read_album)
-        #     if read_album != {}:
-        #         key_tmp = album_num_tmp
-        #         del read_album[key_tmp]#删除内容
-        #         EventMesh.publish("set_camera_num",read_album)
-        #     print("img is exit2",read_album)
-        #     pass
-        # else:#图片不存在
-        #     print("img is not exit")
-        #     pass
-        EventMesh.publish("load_screen", {"screen": "camera_album"})#点击回到相册界面
-        pass
-
-    def Close(self):
-        pass
-
-    def done_click(self):
-        pass
-
-    def done_return(self):
-       
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-        
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-voice_answer_screen = None
-voice_answer_label = None
-voice_answer_btn1 = None
-voice_answer_btn_label1 = None
-class VdieoVoiceScreen(Screen):#语音接听画面
-    #
-    NAME = "voice_answer"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.timer = osTimer()
-        self.meta_type = "popup"
-        self.count = 0
-
-    def initialization(self):
-        global voice_answer_screen ,video_answer_btn_label1
-        self.count = 0
-        if voice_answer_screen == None:
-            voice_answer_screen = lv.obj()
-            print("voice_answer_screen")
-            voice_answer_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_answer_btn_label1 = lv.label(voice_answer_screen)
-            video_answer_btn_label1.set_pos(0, 50)
-            video_answer_btn_label1.set_text("正在接听中...")
-            video_answer_btn_label1.set_size(128, 40)
-            video_answer_btn_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_answer_btn_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            self.meta = voice_answer_screen
-        EventMesh.publish("set_UI_high_priority", 1)
-        self.timer.start(1*1000,1,self.fun)
-
-    def fun(self,*argc):
-        call_state = jrtc.get_state()
-        if call_state == 5:
-            self.timer.stop()
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish("load_screen", {"screen": "voiceing"})
-            return
-        if call_state == 0:
-            call_id = str(EventMesh.publish("get_vedio_call_id"))#
-            meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-            call_type = int(EventMesh.publish("get_vedio_call_type"))#
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-            EventMesh.publish("load_screen", {"screen": "main_menu"})
-            return
-        # print("voiceing_answer call_state",call_state)
-        self.count+=1
-        if self.count >= 20:
-            
-            self.timer.stop()
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish("close_jrtc_event")
-            EventMesh.publish("load_screen", {"screen": "main_menu"})
-            
-            return
-
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-
-
-    def Close(self):
-        self.timer.stop()
-
-    def done_return(self):
-        pass
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-
-
-camera_voice_answer_second_label = None
-camera_voice_answer_screen = None
-camera_voice_answer_label = None
-camera_voice_answer_btn = None
-camera_voice_answer_btn_label =None
-
-class VoiceShowScreen(Screen):#正在语音通话中
-    #
-    NAME = "voiceing"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.preview1 = None
-        self.timer = osTimer()
-        self.statu_open = -1
-        self.show_label = 0
-        self.second_count = 0
-        self.time_out = 0
-        self.meta_type = "popup"
-        EventMesh.subscribe("set_dev_end_video",self.set_dev_end_video)
-        EventMesh.subscribe("get_dev_end_video",self.get_dev_end_video)
-
-
-    def initialization(self):
-        global camera_voice_answer_screen,camera_voice_answer_second_label ,camera_voice_answer_btn_label,camera_voice_answer_label,camera_voice_answer_btn
-        if camera_voice_answer_screen == None:
-            camera_voice_answer_screen = lv.obj()
-            print("camera_voice_answer_screen")
-            camera_voice_answer_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-
-            camera_voice_answer_label = lv.label(camera_voice_answer_screen)
-            camera_voice_answer_label.set_pos(0, 20)
-            camera_voice_answer_label.set_text("正在通话中...")
-            camera_voice_answer_label.set_size(128, 40)
-            camera_voice_answer_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            camera_voice_answer_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            camera_voice_answer_second_label = lv.label(camera_voice_answer_screen)
-            camera_voice_answer_second_label.set_pos(0, 50)
-            camera_voice_answer_second_label.set_text(" ")
-            camera_voice_answer_second_label.set_size(128, 40)
-            camera_voice_answer_second_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            camera_voice_answer_second_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            camera_voice_answer_btn = lv.img(camera_voice_answer_screen)
-            camera_voice_answer_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_voice_answer_btn.set_pos(48, 90)
-            camera_voice_answer_btn.set_size(32,32)
-            camera_voice_answer_btn.set_src("U:/static/hang_up.png")
-
-            camera_voice_answer_btn_label = lv.label(camera_voice_answer_screen)
-            camera_voice_answer_btn_label.set_pos(18, 50)
-            camera_voice_answer_btn_label.set_text(" ")
-            camera_voice_answer_btn_label.set_size(90, 78)
-            camera_voice_answer_btn_label.add_flag(lv.obj.FLAG.CLICKABLE)
-
-            camera_voice_answer_btn_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.close_cb(e)), lv.EVENT.SHORT_CLICKED, None)
-            
-            camera_voice_answer_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.close_cb(e)), lv.EVENT.SHORT_CLICKED, None)
-            
-            self.meta = camera_voice_answer_screen
-        call_state = jrtc.get_state()
-
-        self.second_count = 0
-        self.statu_open = 0
-      
-        self.time_out = 0
-        
-        EventMesh.publish("set_UI_high_priority", 1)
-        if call_state == 5:#接通
-            camera_voice_answer_label.set_text("正在通话中...")
-            camera_voice_answer_label.set_pos(0, 20)
-            camera_voice_answer_second_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_voice_answer_second_label.set_text("00:00")
-            camera_voice_answer_second_label.set_pos(0, 50)
-            # camera_voice_answer_btn.clear_flag(lv.obj.FLAG.HIDDEN)
-            # camera_voice_answer_btn_label.clear_flag(lv.obj.FLAG.HIDDEN)
-        else:
-            camera_voice_answer_label.set_text("正在接听中...")
-            camera_voice_answer_label.set_pos(0, 50)
-            camera_voice_answer_second_label.add_flag(lv.obj.FLAG.HIDDEN)
-            # camera_voice_answer_btn.add_flag(lv.obj.FLAG.HIDDEN)
-            # camera_voice_answer_btn_label.add_flag(lv.obj.FLAG.HIDDEN)
-        self.timer.start(1*1000,1,self.fun)
-
-
-    def close_cb(self,e):
-        self.statu_open = 1
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        EventMesh.publish("set_UI_high_priority", 0)
-        
-        EventMesh.publish("close_jrtc_event")
-        EventMesh.publish("return_prev_screen")
-    
-    def get_dev_end_video(self,event,msg):#手表挂断app
-        return self.statu_open
-
-    def set_dev_end_video(self,event,msg):#手表挂断app
-        self.statu_open = msg
-
-    def fun(self,*argc):
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-        call_state = jrtc.get_state()
-        if call_state == 5:
-            camera_voice_answer_label.set_text("正在通话中...")
-            camera_voice_answer_label.set_pos(0, 20)
-            # camera_video_answer_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_voice_answer_second_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_voice_answer_second_label.set_pos(0, 50)
-            camera_voice_answer_btn.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_voice_answer_btn_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            
-            self.second_count+=1
-            self.show_time()
-        
-        if call_state != 5:
-            self.time_out+=1
-            if self.time_out >= 60 or (call_state == 0 and self.statu_open == 0 and  self.time_out >= 5):
-                self.time_out = 0
-                self.timer.stop()
-                
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                # EventMesh.publish("load_screen", {"screen": "main_menu"})
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish("close_jrtc_event")
-                EventMesh.publish("return_prev_screen")
-                
-        
-
-        
-        
-    def show_time(self):
-
-        if self.second_count >= 99*60:
-            total_hour = self.second_count//3600#小时
-            total_min = (self.second_count%3600)//60#分钟
-            total_sec = (self.second_count%3600)%60#秒
-            camera_voice_answer_second_label.set_text("{}:{}:{}".format("%02d"%(total_hour),"%02d"%(total_min),"%02d"%(total_sec)))
-            
-        else:
-            total_min = self.second_count//60
-            total_sec = self.second_count%60
-            camera_voice_answer_second_label.set_text("{}:{}".format("%02d"%(total_min),"%02d"%(total_sec)))
-
-    def Close(self):
-        self.timer.stop()
-
-    def done_return(self):
-        pass
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-
-
-
-
-video_answer_screen = None
-video_answer_label = None
-video_answer_btn1 = None
-video_answer_btn_label1 = None
-class cameraVdieoAnswerScreen(Screen):#视频通话接听画面
-    #
-    NAME = "vedio_answer"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.timer = osTimer()
-        self.meta_type = "popup"
-        self.count = 0
-
-    def initialization(self):
-        global video_answer_screen ,video_answer_btn_label1
-        self.count = 0
-        if video_answer_screen == None:
-            video_answer_screen = lv.obj()
-            print("video_answer_screen")
-            video_answer_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_answer_btn_label1 = lv.label(video_answer_screen)
-            video_answer_btn_label1.set_pos(0, 50)
-            video_answer_btn_label1.set_text("正在接听中...")
-            video_answer_btn_label1.set_size(128, 40)
-            video_answer_btn_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_answer_btn_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            self.meta = video_answer_screen
-        EventMesh.publish("set_UI_high_priority", 1)
-        self.timer.start(1*1000,1,self.fun)
-
-    def fun(self,*argc):
-        call_state = jrtc.get_state()
-        if call_state == 5:
-            self.timer.stop()
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish("load_screen", {"screen": "vedioing"})
-            return
-        if call_state == 0:
-            call_id = str(EventMesh.publish("get_vedio_call_id"))#
-            meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-            call_type = int(EventMesh.publish("get_vedio_call_type"))#
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-            EventMesh.publish("return_prev_screen")
-            return
-        # print("vedio_answer call_state",call_state)
-        self.count+=1
-        if self.count >= 20:
-            
-            self.timer.stop()
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish("close_jrtc_event")
-            EventMesh.publish("return_prev_screen")
-            
-            return
-
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-
-
-    def Close(self):
-        self.timer.stop()
-
-    def done_return(self):
-        pass
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-camera_video_answer_screen = None
-camera_video_answer_second_label = None
-camera_video_answer_label = None
-camera_video_answer_btn = None
-camera_video_answer_btn_label = None
-video_img_test = None
-def jrtc_cb(close_sta):
-    print("jrtc callback:", close_sta)
-    if close_sta == 0 or close_sta == 1:
-        jrtc.close(0)
-
-jrtc.set_callback(jrtc_cb)
-class VedioShowScreen(Screen):#正在视频通话中
-    #
-    NAME = "vedioing"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.preview1 = None
-        self.timer = osTimer()
-        self.statu_open = -1
-        self.show_label = 0
-        self.second_count = 0
-        self.time_out = 0
-        self.jrtc_init_state = 0
-        self.meta_type = "popup"
-        EventMesh.subscribe("open_vedio_infor",self.open_vedio_infor)
-        EventMesh.subscribe("close_jrtc_event",self.close_jrtc_event)
-        EventMesh.subscribe("clear_jrtc_init_state",self.clear_jrtc_init_state)#清楚jrtcinit标志防止重复init
-        EventMesh.subscribe("get_jrtc_init_state",self.get_jrtc_init_state)#获取jrtcinit标志防止重复init
-
-    def open_vedio_infor(self,event,msg):
-        if self.jrtc_init_state == 0:
-            self.jrtc_init_state = 1
-            EventMesh.publish("set_dev_end_video",0)
-            call_id = EventMesh.publish("get_vedio_call_id")#对方的账号
-            meet_id = EventMesh.publish("get_vedio_meet_id")#共有的会议id
-            call_type = EventMesh.publish("get_vedio_call_type")#呼叫类型
-            tokens_data = EventMesh.publish("get_vedio_tokens_data")#tookens数据#云米平台不需要tokens
-
-            # jrtc.init()
-            # jrtc.config_server("119.3.54.56:1050")
-            # jrtc.config("e99697f86096a74dbf635096", "us145a", "1234567890abcdef", "")
-            # jrtc.open("us144a", "",[15,129,128,128],[15,120,240,320])
-            # jrtc.set_cam_angle(jrtc.CAM_ROTATE_180)
-
-            # data = ['6951832', '876226002021444', '1', '01lqlyqzQ4Gozdz8OJv1Mij2Y3PBq2y3+rtIA26Ge+m2QHTc/Vk=gufkGNMBiYhPjbq1tLCwtLKysLKws7a2tg==']
-            jrtc.init()
-            tokens = str(tokens_data)
-            appkey = "efe9f8800a39d96244234097"#小见
-            uid_key = "25v9C652123QL3N8"
-
-            # appkey = "249e7d505516af0a7ed44097"
-            # uid_key = "qQI4gkB9FxH8J2cb"
-            imei = EventMesh.publish(constants.EVENT.GET_IMEI)
-            oneself_id = str(imei)#自己的账号默认是imei号
-            jrtc.config(appkey,oneself_id,uid_key,tokens)#只初始化一次发起通话
-            uid = str(call_id)
-            ticket = str(meet_id)
-            
-            print("uid ",uid,ticket,oneself_id)
-            #jrtc.set_rotate(0)
-            if call_type == 0:#语音通话不需要设置参数
-                jrtc.open(uid,ticket,[],[])
-            else:
-                jrtc.open(uid,ticket,[15,129,128,128],[15,120,240,320])
-            jrtc.set_cam_angle(jrtc.CAM_ROTATE_180)
-
-
-    def close_jrtc_event(self,event,msg):
-        # print("close_jrtc_event")
-        jrtc.close(0)
-        pass
-    def clear_jrtc_init_state(self,event,msg):
-        self.jrtc_init_state = 0
-        pass
-
-    def get_jrtc_init_state(self,event,msg):
-        return self.jrtc_init_state
-        pass
-
-    def initialization(self):
-        
-        global camera_video_answer_screen,video_img_test,camera_video_answer_btn_label,camera_video_answer_label,camera_video_answer_second_label,camera_video_answer_btn,vcamera_video_answer_btn_label
-        if camera_video_answer_screen == None:
-            camera_video_answer_screen = lv.obj()
-            print("camera_video_answer_screen")
-            camera_video_answer_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_img_test = lv.img(camera_video_answer_screen)
-            ret = jrtc.set_img(video_img_test)
-            video_img_test.align(lv.ALIGN.CENTER, 0, 0)
-            video_img_test.set_size(128,128)
-        
-
-            camera_video_answer_label = lv.label(camera_video_answer_screen)
-            camera_video_answer_label.set_pos(0, 20)
-            camera_video_answer_label.set_text("正在通话中...")
-            camera_video_answer_label.set_size(128, 40)
-            camera_video_answer_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            camera_video_answer_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-
-            camera_video_answer_second_label = lv.label(camera_video_answer_screen)
-            camera_video_answer_second_label.set_pos(0, 50)
-            camera_video_answer_second_label.set_text(" ")
-            camera_video_answer_second_label.set_size(128, 40)
-            camera_video_answer_second_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            camera_video_answer_second_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            camera_video_answer_btn = lv.img(camera_video_answer_screen)
-            camera_video_answer_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-            camera_video_answer_btn.set_pos(48, 90)
-            camera_video_answer_btn.set_size(32,32)
-            camera_video_answer_btn.set_src("U:/static/hang_up.png")
-
-
-            camera_video_answer_btn_label = lv.label(camera_video_answer_screen)
-            camera_video_answer_btn_label.set_pos(18, 50)
-            camera_video_answer_btn_label.set_text(" ")
-            camera_video_answer_btn_label.set_size(90, 78)
-            camera_video_answer_btn_label.add_flag(lv.obj.FLAG.CLICKABLE)
-
-
-            camera_video_answer_btn_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.close_cb(e)), lv.EVENT.SHORT_CLICKED, None)
-            camera_video_answer_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.close_cb(e)), lv.EVENT.SHORT_CLICKED, None)
-            self.meta = camera_video_answer_screen
-        
-        call_state = jrtc.get_state()
-        self.second_count = 0
-        self.statu_open = 0
-        self.time_out = 0
-        
-        EventMesh.publish("set_UI_high_priority", 1)
-        if call_state == 5:#接通
-            camera_video_answer_label.set_text("正在通话中...")
-            camera_video_answer_label.set_pos(0, 20)
-            # camera_video_answer_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_second_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_second_label.set_text("00:00")
-            camera_video_answer_second_label.set_pos(0, 50)
-            # camera_video_answer_btn.clear_flag(lv.obj.FLAG.HIDDEN)
-            # camera_video_answer_btn_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            video_img_test.clear_flag(lv.obj.FLAG.HIDDEN)
-        else:
-            camera_video_answer_label.set_text("正在接听中...")
-            camera_video_answer_label.set_pos(0, 50)
-            # camera_video_answer_label.add_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_second_label.add_flag(lv.obj.FLAG.HIDDEN)
-            # camera_video_answer_btn.add_flag(lv.obj.FLAG.HIDDEN)
-            # camera_video_answer_btn_label.add_flag(lv.obj.FLAG.HIDDEN)
-            video_img_test.add_flag(lv.obj.FLAG.HIDDEN)
-        self.timer.start(1*1000,1,self.fun)
-
-
-    def close_cb(self,e):
-        self.statu_open = 1
-        EventMesh.publish("set_dev_end_video",1)
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("close_jrtc_event")
-        EventMesh.publish("return_prev_screen")
-        
-
-    def fun(self,*argc):
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-        call_state = jrtc.get_state()
-        if call_state == 5:
-            camera_video_answer_label.set_text("正在通话中...")
-            camera_video_answer_label.set_pos(0, 20)
-            # camera_video_answer_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_second_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_btn.clear_flag(lv.obj.FLAG.HIDDEN)
-            camera_video_answer_btn_label.clear_flag(lv.obj.FLAG.HIDDEN)
-            
-            video_img_test.clear_flag(lv.obj.FLAG.HIDDEN)
-            self.second_count+=1
-            self.show_time()
-        # print("video call_state",call_state)
-        if call_state != 5:
-            self.time_out+=1
-            if self.time_out >= 60 or (call_state == 0 and self.time_out >= 2 and self.statu_open != 1):
-                self.time_out = 0
-                self.timer.stop()
-                # print("video call_state",call_state)
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish("close_jrtc_event")
-                EventMesh.publish("return_prev_screen")
-
-        
-    def show_time(self):
-
-        if self.second_count >= 99*60:
-            total_hour = self.second_count//3600#小时
-            total_min = (self.second_count%3600)//60#分钟
-            total_sec = (self.second_count%3600)%60#秒
-            camera_video_answer_second_label.set_text("{}:{}:{}".format("%02d"%(total_hour),"%02d"%(total_min),"%02d"%(total_sec)))
-            
-        else:
-            total_min = self.second_count//60
-            total_sec = self.second_count%60
-            camera_video_answer_second_label.set_text("{}:{}".format("%02d"%(total_min),"%02d"%(total_sec)))
-            # camera_video_answer_second_label.set_text("%02d"%(total_min),"%02d"%(total_sec))
-
-    def Close(self):
-        self.timer.stop()
-
-    def done_return(self):
-        pass
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-
-    def btn1_release(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-    def btn8_press(self):
-        # EventMesh.publish("load_screen", {"screen": "main_menu"})
-        pass
-
-
-
-
-
-voice_call_screen = None
-voice_call_img = None
-voice_call_name_label = None
-voice_call_answer = None
-voice_call_hangup = None
-voice_call_label = None
-# CALL_LOG_MAX = 50
-class voiceInCallScreen(Screen):#语音通话打入中
-    NAME = "voice_incall"
-
-    def __init__(self):
-        super().__init__()
-        self.CALL_LOG_MAX = CALL_LOG_MAX
-        self.read_data = {}
-        self.meta_type = "popup"
-        self.aud = audio.Audio(0)
-        self.call_timer = osTimer()
-        self.call_timer1 = osTimer()
-        self.name = None
-        self.phonebook = {}
-        self.pro_state = 0
-        self.meta = None
-        self.timeout = 0
-        
-    def initialization(self):
-        global voice_call_screen,voice_call_img,voice_call_name_label,voice_call_answer,voice_call_hangup,voice_call_label
-        if voice_call_screen == None :
-            # -------------------------------------------vedio_call screen----------------------------------------------------------
-            voice_call_screen = lv.obj()
-            print("voice_call_screen")
-            voice_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_call_label = lv.label(voice_call_screen)
-            voice_call_label.set_pos(0, 10)
-            voice_call_label.set_text("是否接听语音通话")
-            voice_call_label.set_size(128, 40)
-            voice_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            voice_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            # vedio_call_img = lv.img(voice_call_screen)
-            # vedio_call_img.set_pos(48, 10)
-            # vedio_call_img.set_size(32, 32)
-            # vedio_call_img.set_src("U:/static/IMAGE_NOTICE_CALL.png")
-            # vedio_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_call_name_label = lv.label(voice_call_screen)
-            voice_call_name_label.set_pos(0, 50)
-            voice_call_name_label.set_text(" ")
-            voice_call_name_label.set_size(128, 40)
-            voice_call_name_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            voice_call_name_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_call_answer = lv.img(voice_call_screen)
-            voice_call_answer.set_size(32, 32)
-            voice_call_answer.add_flag(lv.obj.FLAG.CLICKABLE)
-            voice_call_answer.set_pos(84, 85)
-            voice_call_answer.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            voice_call_answer.set_src("U:/static/answer.png")
-
-            voice_call_hangup = lv.img(voice_call_screen)
-            voice_call_hangup.set_size(32, 32)
-            voice_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE)
-            voice_call_hangup.set_pos(11, 85)
-            voice_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            voice_call_hangup.set_src("U:/static/hang_up.png")
-
-            voice_call_answer.add_event_cb(lambda e: EventMesh.callback_wrapper(self.answer(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-            voice_call_hangup.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-            self.meta = voice_call_screen 
-    
-
-        EventMesh.publish("set_UI_high_priority", 1)
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-
-        voice_call_name_label.set_text(call_id)
-
-
-    def post_processor_after_initialization(self):
-        global voice_call_screen,voice_call_img,voice_call_name_label,voice_call_answer,voice_call_hangup  
-        self.call_timer.start(6000, 1, self.call_timer_cb)
-        self.timeout = 0
-        self.call_timer1.start(1*1000, 1, self.get_video_state)
-        self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
-
-    def call_timer_cb(self,e):
-       self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
-
-    def get_video_state(self,e):
-        call_state = jrtc.get_state()
-        # print("vedio_incall",call_state)
-        self.timeout+=1
-        if self.timeout >= 1*60:
-            self.timeout = 0
-            self.call_timer1.stop()
-            call_id = str(EventMesh.publish("get_vedio_call_id"))#
-            meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-            call_type = int(EventMesh.publish("get_vedio_call_type"))#
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-            EventMesh.publish("return_prev_screen")
-
-    def answer(self,e):
-        self.call_timer.stop()
-        self.aud.stop() 
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("clear_jrtc_init_state")
-        EventMesh.publish("open_vedio_infor")
-        EventMesh.publish("load_screen", {"screen": "voiceing"})
-
-    def Close(self):
-        self.call_timer.stop()
-        self.call_timer1.stop()
-        self.aud.stop() 
-    
-    def hangup(self,e):
-        EventMesh.publish("set_UI_high_priority", 0)
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-
-        EventMesh.publish("return_prev_screen")
-
-    def btn1_release(self):
-        pass
-        
-    def btn8_press(self):
-        flag = EventMesh.publish("get_lcd_state")
-        if flag == 1:
-            EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
-        else:
-            EventMesh.publish(constants.EVENT.SYSTEM_UP)
-        pass
-
-    def done_left_to_right(self):
-        pass
-    
-    def done_right_to_left(self):
-        pass
-
-    def done_bottom_to_top(self):
-        pass
-    
-    def done_top_to_bottom(self):
-        pass
-    
-    def done_return(self):
-        pass
-
-
-
-vedio_call_screen = None
-vedio_call_img = None
-vedio_call_name_label = None
-vedio_call_answer = None
-vedio_call_hangup = None
-vedio_call_label = None
-# CALL_LOG_MAX = 50
-class vedioCallingCallScreen(Screen):#视频通话打入中
-    NAME = "vedio_incall"
-
-    def __init__(self):
-        super().__init__()
-        self.CALL_LOG_MAX = CALL_LOG_MAX
-        self.read_data = {}
-        self.meta_type = "popup"
-        self.aud = audio.Audio(0)
-        self.call_timer = osTimer()
-        self.call_timer1 = osTimer()
-        self.name = None
-        self.phonebook = {}
-        self.pro_state = 0
-        self.meta = None
-        self.timeout = 0
-        EventMesh.subscribe("test_answer",self.test_answer)
-        
-    def initialization(self):
-        global vedio_call_screen,vedio_call_img,vedio_call_name_label,vedio_call_answer,vedio_call_hangup,vedio_call_label
-        if vedio_call_screen == None :
-            # -------------------------------------------vedio_call screen----------------------------------------------------------
-            vedio_call_screen = lv.obj()
-            print("vedio_call_screen")
-            vedio_call_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            vedio_call_label = lv.label(vedio_call_screen)
-            vedio_call_label.set_pos(0, 10)
-            vedio_call_label.set_text("是否接听视频通话")
-            vedio_call_label.set_size(128, 40)
-            vedio_call_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            vedio_call_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-            # vedio_call_img = lv.img(vedio_call_screen)
-            # vedio_call_img.set_pos(48, 10)
-            # vedio_call_img.set_size(32, 32)
-            # vedio_call_img.set_src("U:/static/IMAGE_NOTICE_CALL.png")
-            # vedio_call_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            vedio_call_name_label = lv.label(vedio_call_screen)
-            vedio_call_name_label.set_pos(0, 50)
-            vedio_call_name_label.set_text(" ")
-            vedio_call_name_label.set_size(128, 40)
-            vedio_call_name_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            vedio_call_name_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            vedio_call_answer = lv.img(vedio_call_screen)
-            vedio_call_answer.set_size(32, 32)
-            vedio_call_answer.add_flag(lv.obj.FLAG.CLICKABLE)
-            vedio_call_answer.set_pos(84, 85)
-            vedio_call_answer.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            vedio_call_answer.set_src("U:/static/answer.png")
-
-            vedio_call_hangup = lv.img(vedio_call_screen)
-            vedio_call_hangup.set_size(32, 32)
-            vedio_call_hangup.add_flag(lv.obj.FLAG.CLICKABLE)
-            vedio_call_hangup.set_pos(11, 85)
-            vedio_call_hangup.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            vedio_call_hangup.set_src("U:/static/hang_up.png")
-
-            vedio_call_answer.add_event_cb(lambda e: EventMesh.callback_wrapper(self.answer(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-            vedio_call_hangup.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-            self.meta = vedio_call_screen 
-        
-        vedio_call_label.set_text("是否接听视频通话")
-
-        EventMesh.publish("set_UI_high_priority", 1)
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-
-        vedio_call_name_label.set_text(call_id)
-
-
-    def post_processor_after_initialization(self):
-        global vedio_call_screen,vedio_call_img,vedio_call_name_label,vedio_call_answer,vedio_call_hangup  
-        self.call_timer.start(6000, 1, self.call_timer_cb)
-        self.timeout = 0
-        self.call_timer1.start(1*1000, 1, self.get_video_state)
-        self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
-
-    def call_timer_cb(self,e):
-       self.aud.play(1, 1, 'U:/static/R_CALL_mp3.mp3')  #播放来电铃声
-
-    def get_video_state(self,e):
-        call_state = jrtc.get_state()
-        # print("vedio_incall",call_state)
-        self.timeout+=1
-        if self.timeout >= 1*60:
-            self.timeout = 0
-            self.call_timer1.stop()
-            call_id = str(EventMesh.publish("get_vedio_call_id"))#
-            meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-            call_type = int(EventMesh.publish("get_vedio_call_type"))#
-            EventMesh.publish("set_UI_high_priority", 0)
-            EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-            EventMesh.publish("return_prev_screen")
-
-    def answer(self,e):
-        self.call_timer.stop()
-        self.aud.stop() 
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("clear_jrtc_init_state")
-        EventMesh.publish("open_vedio_infor")
-        EventMesh.publish("load_screen", {"screen": "vedioing"})
-    
-    def test_answer(self,event,msg):
-        self.call_timer.stop()
-        self.aud.stop() 
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("clear_jrtc_init_state")
-        EventMesh.publish("open_vedio_infor")
-        EventMesh.publish("load_screen", {"screen": "vedioing"})
-
-    def Close(self):
-        self.call_timer.stop()
-        self.call_timer1.stop()
-        self.aud.stop() 
-    
-    def hangup(self,e):
-        EventMesh.publish("set_UI_high_priority", 0)
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-
-        EventMesh.publish("return_prev_screen")
-
-    def btn1_release(self):
-        pass
-        
-    def btn8_press(self):
-        flag = EventMesh.publish("get_lcd_state")
-        if flag == 1:
-            EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
-        else:
-            EventMesh.publish(constants.EVENT.SYSTEM_UP)
-        pass
-
-    def done_left_to_right(self):
-        pass
-    
-    def done_right_to_left(self):
-        pass
-
-    def done_bottom_to_top(self):
-        pass
-    
-    def done_top_to_bottom(self):
-        pass
-    
-    def done_return(self):
-        pass
-
-
-
-
-
-video_outcall_screen = None
-video_outcall_img = None
-video_outcall_name = None
-video_outcall_hangup_imgbtn = None
-video_outcall_call = None
-video_outcall_img_test = None
-video_outcall_hangup_imgbtnlabel = None
-class videoOutCallScreen(Screen):#正在拨号中...未打出
-    NAME = "video_outcall"
-
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.meta_type = "popup"
-        self.timer1 = osTimer()
-        self.time_count = 0
-        self.second_count = 0
-        self.answer = 0
-       
-
-    def initialization(self):
-        EventMesh.publish("set_UI_high_priority", 1)
-        self.time_count = 0
-        global video_outcall_screen,video_outcall_img,video_outcall_hangup_imgbtnlabel,video_outcall_img_test,video_outcall_name ,video_outcall_call,video_outcall_hangup_imgbtn 
-        if video_outcall_screen == None:
-            video_outcall_screen = lv.obj()
-            print("video_outcall_screen")
-            video_outcall_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_outcall_img_test = lv.img(video_outcall_screen)
-            ret = jrtc.set_img(video_outcall_img_test)
-            video_outcall_img_test.align(lv.ALIGN.CENTER, 0, 0)
-            video_outcall_img_test.set_size(128,128)
-            video_outcall_img_test.add_flag(lv.obj.FLAG.HIDDEN)
-
-            video_outcall_name = lv.label(video_outcall_screen)
-            video_outcall_name.set_pos(0, 20)
-            video_outcall_name.set_size(LCD_X, 20)
-            video_outcall_name.set_text(" ")
-            video_outcall_name.set_long_mode(lv.label.LONG.DOT)
-            video_outcall_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_outcall_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_outcall_call = lv.label(video_outcall_screen)
-            video_outcall_call.set_pos(0, 50)
-            video_outcall_call.set_size(LCD_X, 40)
-            video_outcall_call.set_text("正在等待对方接听中...")
-            video_outcall_call.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_outcall_call.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_outcall_hangup_imgbtn = lv.img(video_outcall_screen)
-            video_outcall_hangup_imgbtn.set_size(32, 32)
-            video_outcall_hangup_imgbtn.set_src("U:/static/hang_up.png")
-            video_outcall_hangup_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
-            video_outcall_hangup_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            video_outcall_hangup_imgbtn.set_pos(48, 90)
-
-            video_outcall_hangup_imgbtnlabel = lv.label(video_outcall_screen)
-            video_outcall_hangup_imgbtnlabel.set_pos(18, 50)
-            video_outcall_hangup_imgbtnlabel.set_text(" ")
-            video_outcall_hangup_imgbtnlabel.set_size(90, 78)
-            video_outcall_hangup_imgbtnlabel.add_flag(lv.obj.FLAG.CLICKABLE)
-
-            video_outcall_hangup_imgbtnlabel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                    lv.EVENT.SHORT_CLICKED, None)
-            
-            video_outcall_hangup_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                    lv.EVENT.SHORT_CLICKED, None)
-            
-
-            
-            self.meta = video_outcall_screen
-        if video_outcall_name != None:
-            video_outcall_name.set_text(self.meta_info)#名称
-        
-        self.time_count = 0
-        self.second_count = 0
-        self.answer = 0
-        EventMesh.publish("set_UI_high_priority", 1)
-        call_state = jrtc.get_state()
-        # print("video_outcall",call_state)
-        if call_state == 5:
-            video_outcall_img_test.clear_flag(lv.obj.FLAG.HIDDEN)
-            video_outcall_name.set_text("正在通话中...")#
-            video_outcall_name.set_pos(0, 20)
-        else:
-            video_outcall_img_test.add_flag(lv.obj.FLAG.HIDDEN)
-            video_outcall_call.set_text("正在等待对方接听中...")
-            video_outcall_call.set_pos(0, 50)
-            video_outcall_name.set_text(self.meta_info)#名称
-            video_outcall_name.set_pos(0, 20)
-
-        self.timer1.start(1*1000,1,self.fun_cb)
-
-    def post_processor_after_initialization(self):
-        pass
-   
-    def hangup(self,e):
-        self.answer = 1
-        self.timer1.stop()
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        # EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("load_screen", {"screen": "videolist"})
-
-        pass
-    def fun_cb(self,*argc):
-        call_state = jrtc.get_state()
-        print("video_outcall",call_state)
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-        if call_state == 5:
-            video_outcall_img_test.clear_flag(lv.obj.FLAG.HIDDEN)
-            video_outcall_name.set_text("正在通话中...")#
-            video_outcall_name.set_pos(0, 20)
-            video_outcall_call.set_pos(0, 50)
-            self.second_count += 1
-            self.show_time()
-
-        if call_state != 5:#未接通 1分钟未接通挂断或者 接通后app 网络不好也主动手表挂断
-            self.time_count+=1
-            if self.time_count >= 1*60 or (call_state == 0 and self.time_count >= 2 and self.answer != 1):
-                self.time_count = 0
-                self.timer1.stop()
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                # EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish("load_screen", {"screen": "videolist"})
-
-    def show_time(self):
-
-        if self.second_count >= 99*60:
-            total_hour = self.second_count//3600#小时
-            total_min = (self.second_count%3600)//60#分钟
-            total_sec = (self.second_count%3600)%60#秒
-            video_outcall_call.set_text("{}:{}:{}".format("%02d"%(total_hour),"%02d"%(total_min),"%02d"%(total_sec)))
-            
-        else:
-            total_min = self.second_count//60
-            total_sec = self.second_count%60
-            video_outcall_call.set_text("{}:{}".format("%02d"%(total_min),"%02d"%(total_sec)))
-
-    def Close(self):
-        self.timer1.stop()
-
-    def done_return(self):
-        pass
-        #EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-    def btn1_release(self):
-        pass
-        #EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-    def btn8_press(self):
-        pass
-
-
-voice_outcall_screen = None
-voice_outcall_img = None
-voice_outcall_name = None
-voice_outcall_hangup_imgbtn = None
-voice_outcall_call = None
-voice_outcall_img_test = None
-voice_outcall_hangup_imgbtnlabel = None
-class voiceOutCallScreen(Screen):#等待对方接接听中
-    NAME = "voice_outcall"
-
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.meta_type = "popup"
-        self.timer1 = osTimer()
-        self.time_count = 0
-        self.second_count = 0
-        self.answer = 0
-       
-
-    def initialization(self):
-        EventMesh.publish("set_UI_high_priority", 1)
-        self.time_count = 0
-        global voice_outcall_screen,voice_outcall_img,voice_outcall_hangup_imgbtnlabel,voice_outcall_name ,voice_outcall_call,voice_outcall_hangup_imgbtn 
-        if voice_outcall_screen == None:
-            voice_outcall_screen = lv.obj()
-            print("voice_outcall_screen")
-            voice_outcall_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_outcall_name = lv.label(voice_outcall_screen)
-            voice_outcall_name.set_pos(0, 20)
-            voice_outcall_name.set_size(LCD_X, 20)
-            voice_outcall_name.set_text(" ")
-            voice_outcall_name.set_long_mode(lv.label.LONG.DOT)
-            voice_outcall_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            voice_outcall_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_outcall_call = lv.label(voice_outcall_screen)
-            voice_outcall_call.set_pos(0, 50)
-            voice_outcall_call.set_size(LCD_X, 40)
-            voice_outcall_call.set_text("正在等待对方接听中...")
-            voice_outcall_call.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            voice_outcall_call.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            voice_outcall_hangup_imgbtn = lv.img(voice_outcall_screen)
-            voice_outcall_hangup_imgbtn.set_size(32, 32)
-            voice_outcall_hangup_imgbtn.set_src("U:/static/hang_up.png")
-            voice_outcall_hangup_imgbtn.add_flag(lv.obj.FLAG.CLICKABLE)
-            voice_outcall_hangup_imgbtn.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            voice_outcall_hangup_imgbtn.set_pos(48, 90)
-
-            voice_outcall_hangup_imgbtnlabel = lv.label(voice_outcall_screen)
-            voice_outcall_hangup_imgbtnlabel.set_pos(18, 50)
-            voice_outcall_hangup_imgbtnlabel.set_text(" ")
-            voice_outcall_hangup_imgbtnlabel.set_size(90, 78)
-            voice_outcall_hangup_imgbtnlabel.add_flag(lv.obj.FLAG.CLICKABLE)
-
-            voice_outcall_hangup_imgbtnlabel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                    lv.EVENT.SHORT_CLICKED, None)
-            
-            voice_outcall_hangup_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.hangup(e)),
-                                    lv.EVENT.SHORT_CLICKED, None)
-            
-
-            
-            self.meta = voice_outcall_screen
-        if voice_outcall_name != None:
-            voice_outcall_name.set_text(self.meta_info)#名称
-        
-        self.time_count = 0
-        self.second_count = 0
-        self.answer =  0
-        EventMesh.publish("set_UI_high_priority", 1)
-        call_state = jrtc.get_state()
-        # print("video_outcall",call_state)
-        if call_state == 5:
-            # video_outcall_img_test.clear_flag(lv.obj.FLAG.HIDDEN)
-            voice_outcall_name.set_text("正在通话中...")#
-            voice_outcall_name.set_pos(0, 20)
-        else:
-            # video_outcall_img_test.add_flag(lv.obj.FLAG.HIDDEN)
-            voice_outcall_call.set_text("正在等待对方接听中...")
-            voice_outcall_call.set_pos(0, 50)
-            voice_outcall_name.set_text(self.meta_info)#名称
-            voice_outcall_name.set_pos(0, 20)
-
-        self.timer1.start(1*1000,1,self.fun_cb)
-
-    def post_processor_after_initialization(self):
-        pass
-   
-    def hangup(self,e):
-        self.answer = 1
-        self.timer1.stop()
-        call_id = str(EventMesh.publish("get_vedio_call_id"))#
-        meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-        call_type = int(EventMesh.publish("get_vedio_call_type"))#
-        EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        # EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-        EventMesh.publish("set_UI_high_priority", 0)
-        EventMesh.publish("load_screen", {"screen": "videolist"})
-
-        pass
-    def fun_cb(self,*argc):
-        call_state = jrtc.get_state()
-        print("voice_outcall",call_state)
-        EventMesh.publish("system_sleep_rest")#防止黑屏
-        if call_state == 5:
-            voice_outcall_name.set_text("正在通话中...")#
-            voice_outcall_name.set_pos(0, 20)
-            voice_outcall_call.set_pos(0, 50)
-            self.second_count += 1
-            self.show_time()
-            
-        if call_state != 5:
-            self.time_count+=1
-            if self.time_count >= 1*60 or (call_state == 0 and self.time_count >= 2 and self.answer != 1):
-                self.time_count = 0
-                self.timer1.stop()
-                call_id = str(EventMesh.publish("get_vedio_call_id"))#
-                meet_id = str(EventMesh.publish("get_vedio_meet_id"))#
-                call_type = int(EventMesh.publish("get_vedio_call_type"))#
-                EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                # EventMesh.publish(constants.PROTOCOL.RCALLING_SEND,[call_id,meet_id,call_type])
-                EventMesh.publish("set_UI_high_priority", 0)
-                EventMesh.publish("load_screen", {"screen": "videolist"})
-
-    def show_time(self):
-
-        if self.second_count >= 99*60:
-            total_hour = self.second_count//3600#小时
-            total_min = (self.second_count%3600)//60#分钟
-            total_sec = (self.second_count%3600)%60#秒
-            voice_outcall_call.set_text("{}:{}:{}".format("%02d"%(total_hour),"%02d"%(total_min),"%02d"%(total_sec)))
-            
-        else:
-            total_min = self.second_count//60
-            total_sec = self.second_count%60
-            voice_outcall_call.set_text("{}:{}".format("%02d"%(total_min),"%02d"%(total_sec)))
-
-    def Close(self):
-        self.timer1.stop()
-
-    def done_return(self):
-        pass
-        #EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-    def btn1_release(self):
-        pass
-        #EventMesh.publish("load_screen", {"screen": "main_menu"})
-
-    def btn8_press(self):
-        pass
-
-
-
-
-videolist_screen = None
-videolist_cont = None
-videolist_top_title = None
-videolist_none_label = None
-videolist_screen_list_screen = None
-class videolistScreen(Screen):
-    NAME = "videolist"
-
-    def __init__(self):
-        super().__init__()
-        # -------------------------------------------popup_menu screen----------------------------------------------------------
-        self.meta = None
-        self.videobook = {}
-        self.count = 0
-        self.phone_num_count = 0
-        self.phone_num = {}
-        self.name = []
-        self.check_json = 0
-        self.timer = osTimer()
-        self.videolist_detail_list = None
-        EventMesh.subscribe("video_updata_list_show", self.video_updata_list_show)
-        self.MXA_phone_num = 50 #最大显示号码个数
-        self.videolist_detail_listt_dict = []
-        self.calling_btn = []
-        self.is_sliding = 0
-
-    def post_processor_before_initialization(self):
-        data = EventMesh.publish("get_videobook_list")
-        if data != None:
-            self.check_json = data[0]
-            self.videobook = data[1]
-            self.count = 0
-
-    def initialization(self):
-        self.is_sliding = 0
-        global videolist_screen,videolist_cont,videolist_top_title,videolist_none_label,videolist_screen_list_screen
-        if videolist_screen == None:
-            videolist_screen = lv.obj()
-            print("videolist_screen")
-            videolist_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-            videolist_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            videolist_screen_list_screen = lv.obj(videolist_screen)
-            videolist_screen_list_screen.set_pos(0, 30)
-            videolist_screen_list_screen.set_size(LCD_X, LCD_Y-30)
-            videolist_screen_list_screen.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-            videolist_screen_list_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-
-            videolist_top_title = lv.label(videolist_screen)
-            videolist_top_title.set_pos(0, 5)
-            videolist_top_title.set_size(LCD_X, 20)
-            videolist_top_title.set_text("视频通话账号")
-            videolist_top_title.set_long_mode(lv.label.LONG.WRAP)
-            videolist_top_title.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            videolist_top_title.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-        
-
-            videolist_none_label = lv.label(videolist_screen)
-            videolist_none_label.set_pos(0, 60)
-            videolist_none_label.set_size(LCD_X, 60)
-            videolist_none_label.set_text("无SIM卡或未添加账号")
-            videolist_none_label.set_long_mode(lv.label.LONG.WRAP)
-            videolist_none_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            videolist_none_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            self.videolist_detail_list = lv.obj(videolist_screen_list_screen)
-            self.videolist_detail_list.set_pos(0, 0)
-            self.videolist_detail_list.set_size(LCD_X, LCD_Y-30+1)
-            self.videolist_detail_list.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
-            self.videolist_detail_list.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-            for i in range(self.MXA_phone_num):
-                contact_btn = lv.btn(self.videolist_detail_list)
-                contact_btn.add_flag(lv.obj.FLAG.CLICKABLE)
-                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)),
-                                        lv.EVENT.SHORT_CLICKED, None)
-                contact_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_cb(e)), lv.EVENT.PRESSING, None)
-                contact_btn.add_flag(lv.obj.FLAG.HIDDEN)
-                # contact_btn.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.PRESSED)
-                
-                contact_btn_label_1 = lv.label(contact_btn)
-                contact_btn_label_1.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-                contact_btn_label_2 = lv.label(contact_btn)
-                # contact_btn_label_2.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-                contact_btn_label_3 = lv.label(contact_btn)
-                contact_btn_label_3.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-                self.videolist_detail_listt_dict.append({"contact_btn":contact_btn,"contact_btn_label_1":contact_btn_label_1,"contact_btn_label_2":contact_btn_label_2,"contact_btn_label_3":contact_btn_label_3})
-            self.meta = videolist_screen
-        self.count = 0
-        self.btn_create_list_show(0)
-
-    def video_updata_list_show(self,event,msg):
-        self.post_processor_before_initialization()
-        self.timer.start(1 * 1000, 0, self.OutTime_s)
-
-    def OutTime_s(self,e):
-        self.btn_create_list_show(1)
-
-    def btn_create_list_show(self,state):
-        EventMesh.publish("publish_message_event_ui",{"func":self.btn_create_list_show_screen,"data":state})
-
-    def btn_create_list_show_screen(self,state):
-        global videolist_screen,videolist_cont,videolist_top_title,videolist_none_label,videolist_screen_list_screen
-        print("btn_create_list_show_screen!!!!!!!!!!!")
-        if videolist_screen == None:
-            return
-        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#有卡时触发sos报警 无卡时自动关机
-            self.videolist_detail_list.add_flag(lv.obj.FLAG.HIDDEN)
-            videolist_none_label.clear_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本
-        else:
-            #读取json文件中的键作为label文本;
-            if self.check_json == True and len(self.videobook) != 0:
-                self.videolist_detail_list.clear_flag(lv.obj.FLAG.HIDDEN)
-                videolist_none_label.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本
-                j =0
-                print("self.videobook sorted :{} len(self.videobook) :{}".format(sorted(self.videobook.keys()),len(self.videobook)))
-                phonebook_keys = sorted(self.videobook.keys())
-
-
-                if len(self.videobook) > self.MXA_phone_num:
-                    j = len(self.videobook) - self.MXA_phone_num
-                for i in range(self.MXA_phone_num): #字典 key value
-                    if(j >= len(self.videobook)):
-                        self.videolist_detail_listt_dict[i]["contact_btn"].add_flag(lv.obj.FLAG.HIDDEN)
-                        continue
-                    name = self.videobook[phonebook_keys[j]]
-                    key_tmp = phonebook_keys[j]
-
-                    print("name :{} key_tmp:{}".format(name,key_tmp))
-                    
-                    #contact_btn = lv.btn(self.contact_detail_list)
-                    self.videolist_detail_listt_dict[i]["contact_btn"].set_size(LCD_X,45)
-                    self.videolist_detail_listt_dict[i]["contact_btn"].set_pos(0,47*i )
-                    self.videolist_detail_listt_dict[i]["contact_btn"].set_style_bg_color(lv.color_make(0xff, 0xff, 0xff), lv.PART.MAIN | lv.STATE.DEFAULT)
-                    # add_style(style_contact_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
-                    # contact_btn.add_style(style_contact_btn_pressed, lv.PART.MAIN | lv.STATE.PRESSED)
-                    # self.contact_detail_listt_dict[i]["contact_btn"].add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling(e)),
-                    #                         lv.EVENT.SHORT_CLICKED, None)
-
-                    #contact_btn_label_1 = lv.label(contact_btn)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_1"].set_pos(0, 0)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_1"].set_size(LCD_X-15, 16)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_1"].set_text(key_tmp[4:])
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_1"].set_long_mode(lv.label.LONG.CLIP)
-                    # self.videolist_detail_listt_dict[i]["contact_btn_label_1"].set_long_mode(lv.label.LONG.DOT)
-                    # self.videolist_detail_listt_dict[i]["contact_btn_label_1"].add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-                    #contact_btn_label_2 = lv.label(contact_btn)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_2"].set_pos(0, 0)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_2"].set_size(0, 0)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_2"].set_text(key_tmp[4:])
-                    
-
-                    #contact_btn_label_3 = lv.label(contact_btn)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_3"].set_pos(0, 20)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_3"].set_size(LCD_X-15, 16)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_3"].set_text(name)
-                    self.videolist_detail_listt_dict[i]["contact_btn_label_3"].set_long_mode(lv.label.LONG.CLIP)
-                    # self.videolist_detail_listt_dict[i]["contact_btn_label_3"].add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-                    
-                    
-                    self.videolist_detail_listt_dict[i]["contact_btn"].clear_flag(lv.obj.FLAG.HIDDEN)
-                    #self.contact_detail_listt_dict[i]["contact_btn"].scroll_to_view(lv.ANIM.OFF)
-                    j+=1
-
-                    if state == 1:
-                        self.videolist_detail_listt_dict[i]["contact_btn"].scroll_to_view(lv.ANIM.OFF)  
-                
-            else:
-                if videolist_screen_list_screen != None:
-                    videolist_none_label.clear_flag(lv.obj.FLAG.HIDDEN) #显示空文本
-                if self.videolist_detail_list != None:
-                    self.videolist_detail_list.add_flag(lv.obj.FLAG.HIDDEN)#隐藏空文本
-            
-
-    def calling_cb(self,e):
-        code = e.get_code()
-        if code == lv.EVENT.PRESSING:
-            #print("PRESSING")
-            self.is_sliding += 1
-
-        elif  code == lv.EVENT.SHORT_CLICKED:
-            #utime.sleep_ms(10)
-            print("1self.is_sliding",self.is_sliding)
-            if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
-                self.is_sliding = 0
-                if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#有卡时触发sos报警 无卡时自动关机
-                    msg_text = e.get_target().get_child(1).get_text()
-                    # EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
-                    EventMesh.publish("load_screen", {"screen": "vedio_mode","meta":msg_text})
-                else:
-                    EventMesh.publish("load_screen", {"screen": "no_sim_popup_screen"})
-                
-            self.is_sliding =0
-            
-
-    def calling(self,msg_text):    
-        pass
-        # _msg = msg_text
-        # print("calling",_msg)
-        # EventMesh.publish("set_vedio_call_id", _msg)#
-        # EventMesh.publish("set_vedio_call_type", 1)#
-        # EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[1,_msg])
-        # EventMesh.publish("load_screen", {"screen": "video_outcall","meta":_msg})
-
-
-    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"})
-
-
-
-
-
-video_select_mode_screen = None
-video_select_mode_label1 = None
-video_select_mode_label2 = None
-video_select_mode_btn_label1 = None
-video_select_mode_name = None
-video_select_mode_btn =None
-video_select_mode_btn1 = None
-class videoModeScreen(Screen):#通话模式选择
-    #
-    NAME = "vedio_mode"
-    
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.timer = osTimer()
-        self.meta_type = "popup"
-        self.count = 0
-        self.is_sliding = 0
-
-    def initialization(self):
-        global video_select_mode_screen,video_select_mode_btn1,video_select_mode_btn,video_select_mode_label1,video_select_mode_label2,video_answer_btn_label1,video_select_mode_name
-        self.count = 0
-        self.is_sliding = 0
-        if video_select_mode_screen == None:
-            video_select_mode_screen = lv.obj()
-            print("video_select_mode_screen")
-            video_select_mode_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_select_mode_name = lv.label(video_select_mode_screen)
-            video_select_mode_name.set_pos(0, 20)
-            video_select_mode_name.set_text(" ")
-            video_select_mode_name.set_size(128, 40)
-            video_select_mode_name.add_flag(lv.obj.FLAG.CLICKABLE)
-            video_select_mode_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_select_mode_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_select_mode_btn = lv.btn(video_select_mode_screen)
-            video_select_mode_btn.set_pos(4, 60)
-            video_select_mode_btn.set_size(120, 26)
-            video_select_mode_btn.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
-            video_select_mode_btn.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.PRESSED)
-            video_select_mode_btn.set_style_radius(30,0)
-
-            video_select_mode_label1 = lv.label(video_select_mode_btn)
-            video_select_mode_label1.set_text("语音通话")
-            video_select_mode_label1.set_size(128, 25)
-            video_select_mode_label1.set_pos(0,5)
-            video_select_mode_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_select_mode_label1.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            # video_select_mode_label1 = lv.label(video_select_mode_screen)
-            # video_select_mode_label1.set_pos(0, 60)
-            # video_select_mode_label1.set_text("语音通话")
-            # video_select_mode_label1.set_size(128, 30)
-            # video_select_mode_label1.add_flag(lv.obj.FLAG.CLICKABLE)
-            # video_select_mode_label1.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            # video_select_mode_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            video_select_mode_btn1 = lv.btn(video_select_mode_screen)
-            video_select_mode_btn1.set_pos(4, 90)
-            video_select_mode_btn1.set_size(120, 26)
-            video_select_mode_btn1.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.DEFAULT)
-            video_select_mode_btn1.add_style(style_press_btn, lv.PART.MAIN | lv.STATE.PRESSED)
-            video_select_mode_btn1.set_style_radius(30,0)
-
-            video_select_mode_label2 = lv.label(video_select_mode_btn1)
-            video_select_mode_label2.set_text("视频通话")
-            video_select_mode_label2.set_size(128, 25)
-            video_select_mode_label2.set_pos(0,5)
-            video_select_mode_label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            video_select_mode_label2.add_style(style_font_youyuan_20_black, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            # video_select_mode_label2 = lv.label(video_select_mode_screen)
-            # video_select_mode_label2.set_pos(0, 90)
-            # video_select_mode_label2.set_text("视频通话")
-            # video_select_mode_label2.set_size(128, 38)
-            # video_select_mode_label2.add_flag(lv.obj.FLAG.CLICKABLE)
-            # video_select_mode_label2.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-            # video_select_mode_label2.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-            self.meta = video_select_mode_screen
-
-            video_select_mode_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,0)),
-                                        lv.EVENT.SHORT_CLICKED, None)
-            video_select_mode_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,0)), lv.EVENT.PRESSING, None)
-
-            video_select_mode_btn1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,1)),
-                                        lv.EVENT.SHORT_CLICKED, None)
-            video_select_mode_btn1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.calling_vedio_cb(e,1)), lv.EVENT.PRESSING, None)
-
-        if self.meta_info != None:
-            if len(str(self.meta_info)) != 0:
-                video_select_mode_name.set_text("{}".format(self.meta_info))
-            else:
-                video_select_mode_name.set_text(" ")
-        else:
-            video_select_mode_name.set_text(" ")
-
-        self.timer.start(1*1000,1,self.fun)
-        
-
-    def fun(self,*argc):
-        self.count+=1
-        if self.count <= 30:
-           EventMesh.publish("system_sleep_rest")#防止黑屏
-        else:
-           self.timer.stop()
-           EventMesh.publish("return_prev_screen") 
-        pass
-    def calling_vedio_cb(self,e,data):#视频通话
-        code = e.get_code()
-        if code == lv.EVENT.PRESSING:
-            #print("PRESSING")
-            self.is_sliding += 1
-
-        elif  code == lv.EVENT.SHORT_CLICKED:
-            #utime.sleep_ms(10)
-            print("1self.is_sliding",self.is_sliding)
-            if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
-                self.is_sliding = 0
-                if data == 1:
-                    msg_text = [self.meta_info,1]
-                    EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
-                else:
-                    msg_text = [self.meta_info,0]
-                    EventMesh.publish("publish_message_event_ui",{"func":self.calling,"data":msg_text})
-            self.is_sliding = 0
-        pass
-
-    def calling(self,msg_text):    
-        _msg = msg_text[0]
-        mode = msg_text[1]
-        print("calling",msg_text,_msg,mode)
-        if mode == 1:#0是语音 1是视频通话
-            EventMesh.publish("load_screen", {"screen": "video_outcall","meta":_msg})
-        else:
-            EventMesh.publish("load_screen", {"screen": "voice_outcall","meta":_msg})
-
-        EventMesh.publish("set_vedio_call_id", _msg)#
-        EventMesh.publish("set_vedio_call_type", mode)#
-        EventMesh.publish(constants.PROTOCOL.AGTALK_SEND,[mode,_msg])
-
-    def Close(self):
-        self.timer.stop()
-
-    def done_return(self):
-        pass
-        EventMesh.publish("return_prev_screen")
-        
-
-    def btn1_release(self):
-        EventMesh.publish("return_prev_screen")
-        pass
-
-    def btn8_press(self):
-        EventMesh.publish("return_prev_screen")
-        pass
-
-
-style_screen_calendar_1_extra_header_main_default = lv.style_t()
-style_screen_calendar_1_extra_header_main_default.init()
-style_screen_calendar_1_extra_header_main_default.set_bg_color(lv.color_make(0x21,0x95,0xf6))
-style_screen_calendar_1_extra_header_main_default.set_bg_grad_color(lv.color_make(0x21,0x95,0xf6))
-style_screen_calendar_1_extra_header_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-style_screen_calendar_1_extra_header_main_default.set_bg_opa(255)
-style_screen_calendar_1_extra_header_main_default.set_text_color(lv.color_make(0xff,0xff,0xff))
-style_screen_calendar_1_extra_header_main_default.set_text_font(lv.K01_font_16_ALL)
-
-style_screen_calendar_1_main_main_default = lv.style_t()
-style_screen_calendar_1_main_main_default.init()
-style_screen_calendar_1_main_main_default.set_radius(0)
-style_screen_calendar_1_main_main_default.set_bg_color(lv.color_make(0xff,0xff,0xff))
-style_screen_calendar_1_main_main_default.set_bg_grad_color(lv.color_make(0xff,0xff,0xff))
-style_screen_calendar_1_main_main_default.set_bg_grad_dir(lv.GRAD_DIR.NONE)
-style_screen_calendar_1_main_main_default.set_bg_opa(255)
-style_screen_calendar_1_main_main_default.set_border_color(lv.color_make(0xc0,0xc0,0xc0))
-style_screen_calendar_1_main_main_default.set_border_width(1)
-style_screen_calendar_1_main_main_default.set_border_opa(255)
-
-# add style for screen_calendar_1
-
-
-
-rrestor_confirm_n_screen = None
-rrestor_confirm_n_screen_label = None
-
-#
-class restore_confirmScreen(Screen):
-    NAME = "restore_confirm"
-    def __init__(self):
-        super().__init__()
-        self.meta = None
-        self.meta_type = "popup"
-        self.count = 0
-        self.timer1 = osTimer()
-        self.timer2 = osTimer()
-        self.timer3 = osTimer()
-
-        EventMesh.subscribe("app_factory_cb",self.app_factory_cb)
+        EventMesh.subscribe("app_factory_cb",self.app_factory_cb)
 
     def initialization(self):
         global rrestor_confirm_n_screen ,rrestor_confirm_n_screen_label  
@@ -9898,8 +8276,9 @@ class UI(object):
 
     def ui_press(self, event, key):
         screen_NAME = EventMesh.publish("get_screen_NAME")
-        if screen_NAME == "system_init":
-            return
+        if screen_NAME != None:
+            if screen_NAME == "system_init":
+                return
         self.system_sleep_timeout_rest()
         #print("ui press {}".format(event))
         if event == "done_left_to_right":
@@ -9918,8 +8297,9 @@ class UI(object):
         #     self.system_sleep_timeout_rest()
     def btn_press(self, event, key):
         screen_NAME = EventMesh.publish("get_screen_NAME")
-        if screen_NAME == "system_init":
-            return
+        if screen_NAME != None:
+            if screen_NAME == "system_init":
+                return
         print("btn_press: {}".format(event))
         #主表盘按电源键,息屏
         
@@ -9968,8 +8348,9 @@ class UI(object):
 
     def btn_release(self, event, msg):
         screen_NAME = EventMesh.publish("get_screen_NAME")
-        if screen_NAME == "system_init":
-            return
+        if screen_NAME != None:
+            if screen_NAME == "system_init":
+                return
         print("btn_release: {}".format(event))
         # if self.main_flag != 1 and self.sleep_flag == 0:
         #     self.__lcd_on()
@@ -10025,6 +8406,7 @@ class UI(object):
                 utime.sleep_ms(200)
             self.sleep_lock = 1
             self.sleep_flag = 0
+            EventMesh.publish("set_lcd_state",self.sleep_flag)
             self.PWM_backlight = PWM(PWM.PWM1, PWM.ABOVE_10US, 0, 1000)
             self.PWM_backlight.open()
             #lcd_ctrl.write(0)
@@ -10036,7 +8418,7 @@ class UI(object):
             tp_cst816.suspend()
             lcd.lcd_display_off()
             #utime.sleep_ms(80)
-            EventMesh.publish("set_lcd_state",self.sleep_flag)
+            
             self.sleep_lock = 0
             self.screen.lcd_off()
             self.system_sleep_timer.stop()
@@ -10071,7 +8453,10 @@ class UI(object):
         return self
     
     def get_screen_NAME(self, event, msg):
-        return self.screen.NAME
+        if self.screen != None:
+            return self.screen.NAME
+        else:
+            return None
     
     def load_screen_cb(self, topic, msg):
         EventMesh.publish("publish_message_event_ui",{"func":self.load_screen,"data":msg})  
@@ -10157,7 +8542,12 @@ class UI(object):
                             # print('self.screen_prev.NAME:{} self.screen_old:{}'.format(self.screen_prev.NAME,self.screen.NAME))
                             if self.screen_prev.NAME != self.screen.NAME:
                                 EventMesh.publish("add_new_screen",screen_new)#保存新的界面用作返回上一级 
-                
+                        else:
+                            if self.screen.NAME == "main_menu": #上一个为弹窗界面并且也回到主界面就清空
+                                if self.page_count > 0:
+                                    self.page_id.clear()#清空所有
+                                self.page_count = 0
+                                self.page_id = ["main_menu"]
                 if msg.get("meta"):
                     self.screen.meta_info = msg.get("meta")
                 print("load_screen:post_processor_before_initialization")
index a1ecfb2..c9f38c7 100644 (file)
@@ -158,17 +158,31 @@ watchface1_weather_unit_img.set_size(11, 11)
 watchface1_weather_unit_img.set_src("U:/static/degree.png")
 watchface1_weather_unit_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-
-
+watchface1_long_press_event_label = lv.label(Watchface1)
+watchface1_long_press_event_label.set_pos(0, 0)
+watchface1_long_press_event_label.set_size(128,128)
+watchface1_long_press_event_label.set_text(" ")
+watchface1_long_press_event_label.add_flag(lv.obj.FLAG.CLICKABLE)
 
 class WatchFace1():
     NAME = "Watchface1"
     # # #表盘1
     def __init__(self,main_menu): 
         print("Watchface1:__init__")
+        EventMesh.subscribe("updata_refresh_weather",self.updata_refresh_weather)
         self.meta = Watchface1
         Watchface1.set_parent(main_menu)#设置父控件
+        watchface1_long_press_event_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
+                                      lv.EVENT.LONG_PRESSED, None)
         
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.LONG_PRESSED: #进入表盘编辑界面
+            print("enter watchface edit!!!!!!\r\n")
+
     def initialization(self,main_menu):   
         print("Watchface1:initialization") 
         
@@ -228,6 +242,9 @@ class WatchFace1():
 
         weather_data = EventMesh.publish("get_weather_data")
         self.__weather(None,weather_data)
+    def updata_refresh_weather(self,event,msg):
+        weather_data = EventMesh.publish("get_weather_data")
+        self.__weather(None,weather_data)
 
     def __weather(self, event, msg):
         # print("weather_data",msg)
@@ -386,17 +403,30 @@ class WatchFace():
         self.watchface_list = []
         self.timer_update = osTimer()
         EventMesh.subscribe("set_change_face", self.change_face)
+        EventMesh.subscribe("update_dial_file", self.update_dial_file)
         self.PWM_backlight  = None
         read_data = EventMesh.publish("get_storage_config","watchface")
         if read_data != None:
             self.watchface_style_num = read_data
 
-
+    def update_dial_file(self,event,msg):
+        check_txt = ql_fs.path_exists("/usr/static/storage_file/aigc_dial.jpg")
+        print("update_dial_file!!!!! {}\r\n".format(check_txt))
+        if check_txt == True:
+            if watchface1_bg_img != None:
+                watchface1_bg_img.set_src("U:/static/storage_file/aigc_dial.jpg")
+        pass
     def initialization(self,main_menu):
         if self.watchface_list == [] : #第一次初始化
             self.watchface_list.append( WatchFace1(main_menu))
             # self.watchface_list.append( WatchFace2(main_menu))
         print("watchface INIT !!!!!!!!:",self.watchface_style_num)
+        check_txt = ql_fs.path_exists("/usr/static/storage_file/aigc_dial.jpg")
+        print("update_dial_file!!!!! {}\r\n".format(check_txt))
+        if check_txt == True:
+            if watchface1_bg_img != None:
+                watchface1_bg_img.set_src("U:/static/storage_file/aigc_dial.jpg")
+
         for wat in self.watchface_list:
             if wat.NAME == self.watchface_style_num :
                 self.watchface_style = wat
@@ -405,6 +435,7 @@ class WatchFace():
         self.meta = self.watchface_style.meta
         self.watchface_style.meta.clear_flag(lv.obj.FLAG.HIDDEN)#显示
         self.watchface_style.timerout_update()
+        
         self.timer_update.start(10000, 1, self.timerout_update)
 
     def timerout_update(self, *args, **kwargs):
index 4e1c9dc..bd2eb98 100644 (file)
@@ -113,28 +113,28 @@ MainMenu2_img_toolbox_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.
 MainMenu2_num+=1
 MainMenu2x+=1
 
-#加好友,暂时没有
-MainMenu2_toolbox = MainMenu2_til.add_tile(MainMenu2x, 0,   lv.DIR.ALL)
-label_text = lv.label(MainMenu2_toolbox)
-label_text.set_pos(0, 0)
-label_text.set_size(0, 0)
-label_text.set_text("{}".format(MainMenu2_num))
-MainMenu2_img_add_friends = lv.img(MainMenu2_toolbox)
-MainMenu2_img_add_friends.set_size(80,80)
-MainMenu2_img_add_friends.set_pos(24,10)
-MainMenu2_img_add_friends.set_src("U:/static/IMAGE_ONE_PAGE_FRIEND.png")
-MainMenu2_img_add_friends.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu2_img_add_friends.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-MainMenu2_img_add_friends_txt = lv.label(MainMenu2_toolbox)
-MainMenu2_img_add_friends_txt.set_pos(int(0),int(100))
-MainMenu2_img_add_friends_txt.set_size(128,20)
-MainMenu2_img_add_friends_txt.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu2_img_add_friends_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu2_img_add_friends_txt.set_text("交友")
-MainMenu2_img_add_friends_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
-MainMenu2_num+=1
-MainMenu2x+=1
+# #加好友,暂时没有
+# MainMenu2_toolbox = MainMenu2_til.add_tile(MainMenu2x, 0,   lv.DIR.ALL)
+# label_text = lv.label(MainMenu2_toolbox)
+# label_text.set_pos(0, 0)
+# label_text.set_size(0, 0)
+# label_text.set_text("{}".format(MainMenu2_num))
+# MainMenu2_img_add_friends = lv.img(MainMenu2_toolbox)
+# MainMenu2_img_add_friends.set_size(80,80)
+# MainMenu2_img_add_friends.set_pos(24,10)
+# MainMenu2_img_add_friends.set_src("U:/static/IMAGE_ONE_PAGE_FRIEND.png")
+# MainMenu2_img_add_friends.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu2_img_add_friends.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# MainMenu2_img_add_friends_txt = lv.label(MainMenu2_toolbox)
+# MainMenu2_img_add_friends_txt.set_pos(int(0),int(100))
+# MainMenu2_img_add_friends_txt.set_size(128,20)
+# MainMenu2_img_add_friends_txt.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu2_img_add_friends_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu2_img_add_friends_txt.set_text("交友")
+# MainMenu2_img_add_friends_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
+# MainMenu2_num+=1
+# MainMenu2x+=1
 
 #微聊
 MainMenu2_wechat = MainMenu2_til.add_tile(MainMenu2x, 0,   lv.DIR.ALL)
@@ -159,6 +159,31 @@ MainMenu2_img_wechat_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.S
 MainMenu2_num+=1
 MainMenu2x+=1
 
+
+#AI语音
+
+MainMenu2_ai = MainMenu2_til.add_tile(MainMenu2x, 0,   lv.DIR.ALL)
+label_text = lv.label(MainMenu2_ai)
+label_text.set_pos(0, 0)
+label_text.set_size(0, 0)
+label_text.set_text("{}".format(MainMenu2_num))
+MainMenu2_img_ai_main = lv.img(MainMenu2_ai)
+MainMenu2_img_ai_main.set_size(80,80)
+MainMenu2_img_ai_main.set_pos(24,10)
+MainMenu2_img_ai_main.set_src("U:/static/AI_MAIN_ICON.png")
+MainMenu2_img_ai_main.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu2_img_ai_main.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+MainMenu2_img_ai_main_txt = lv.label(MainMenu2_ai)
+MainMenu2_img_ai_main_txt.set_pos(int(0),int(100))
+MainMenu2_img_ai_main_txt.set_size(128,20)
+MainMenu2_img_ai_main_txt.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu2_img_ai_main_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu2_img_ai_main_txt.set_text("AI助手")
+MainMenu2_img_ai_main_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu2_num+=1
+MainMenu2x+=1
+
 #视频通话
 MainMenu2_heartrate = MainMenu2_til.add_tile(MainMenu2x, 0,   lv.DIR.ALL)
 label_text = lv.label(MainMenu2_heartrate)
@@ -183,6 +208,7 @@ MainMenu2_num+=1
 MainMenu2x+=1
 
 #表盘
+watchface_id = MainMenu2_num
 MainMenu2_Watchface = MainMenu2_til.add_tile(MainMenu2_num,0,   lv.DIR.ALL)
 label_text = lv.label(MainMenu2_Watchface)
 label_text.set_pos(0, 0)
@@ -290,6 +316,7 @@ MainMenu2x+=1
 
 
 #设置
+setting_id = MainMenu2_num
 MainMenu2_setting = MainMenu2_til.add_tile(MainMenu2x, 0,  lv.DIR.ALL)
 #MainMenu2_setting.set_tile_act(0,0,lv.ANIM.ON)
 label_text = lv.label(MainMenu2_setting)
@@ -363,29 +390,31 @@ class MainMenuScreen(Screen):
         self.watchface = WatchFace()
         self.menu_id = "0"
         print("MainMenu1:__init__")    
+        MainMenu2.add_event_cb(lambda e:EventMesh.callback_wrapper(self.img_cb(e,"void")), lv.EVENT.GESTURE, None)
         # MainMenu2_til.add_event_cb(lambda e: EventMesh.callback_wrapper(self.scroll_begin_event(e)),lv.EVENT.ALL,None)
         #lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_END, NULL);
         MainMenu2_img_phone.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "Phone")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_toolbox.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "toolbox")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_setting.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "setting")), lv.EVENT.SHORT_CLICKED, None)
-        MainMenu2_img_add_friends.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "pp_main")), lv.EVENT.SHORT_CLICKED, None)
+        # MainMenu2_img_add_friends.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "pp_main")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_camera_video.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "videolist")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_camera.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_camera_album.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera_album")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_contacts.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "contacts")), lv.EVENT.SHORT_CLICKED, None)
+        MainMenu2_img_ai_main.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "AI_success")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu2_img_wechat.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.SHORT_CLICKED, None)
         # MainMenu2_img_spo2.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "spo2")), lv.EVENT.SHORT_CLICKED, None)
         #MainMenu2_img_sms.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "popup")), lv.EVENT.SHORT_CLICKED, None)
 
-        MainMenu2_img_phone.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "Phone")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_toolbox.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "toolbox")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_setting.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "setting")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_add_friends.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "pp_main")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_camera_video.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "videolist")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_camera.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_camera_album.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera_album")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_contacts.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "contacts")), lv.EVENT.PRESSING, None)
-        MainMenu2_img_wechat.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_phone.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "Phone")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_toolbox.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "toolbox")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_setting.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "setting")), lv.EVENT.PRESSING, None)
+        # # MainMenu2_img_add_friends.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "pp_main")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_camera_video.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "videolist")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_camera.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_camera_album.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera_album")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_contacts.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "contacts")), lv.EVENT.PRESSING, None)
+        # MainMenu2_img_wechat.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.PRESSING, None)
         # MainMenu2_img_spo2.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "spo2")), lv.EVENT.SHORT_CLICKED, None)
         #MainMenu2_img_sms.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "popup")), lv.EVENT.SHORT_CLICKED, None)
         
@@ -398,7 +427,7 @@ class MainMenuScreen(Screen):
         self.watchface.initialization(MainMenu2_Watchface)
         print("self.menu_id",self.menu_id)
         if self.menu_id =="0":
-            MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF) 
+            MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF) 
         # if self.meta_info in globals() :
         #     MainMenu2_til.set_tile_id(self.meta_info[0],self.meta_info[1],lv.ANIM.OFF)    
         pass#
@@ -407,10 +436,47 @@ class MainMenuScreen(Screen):
 
 
     def watch_top_show(self, event, msg): #
-        MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF)  
+        MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF)  
         
     def img_cb(self, e, msg):
         code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            state = EventMesh.publish("get_key_board", "key_board")
+            # print("msg",type(msg),msg,state)
+            if state == 1:
+                # print("state11",state)
+                if msg == 'Phone':
+                    # print("Phone",state)
+                    EventMesh.publish("load_screen", {"screen": "keyboard_popup"})
+                    pass
+                else:
+                    if msg == "pp_main":
+                        if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未联网提示关机
+                            EventMesh.publish("load_screen", {"screen": "no_sim_popup_screen"})
+                            return
+                        else:
+                            EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+                    else:
+                        EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+                    
+            else:
+                if msg == "pp_main":
+                    if EventMesh.publish(constants.EVENT.GET_CONNECT) == 0:#未联网提示关机
+                        EventMesh.publish("load_screen", {"screen": "no_sim_popup_screen"})
+                        return
+                    else:
+                        EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+                else:
+                    EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+    def img_cb_1(self, e, msg):
+        code = e.get_code()
 
         #print("code!!!!!!!!",code,msg)
         if code == lv.EVENT.PRESSING:
@@ -464,7 +530,7 @@ class MainMenuScreen(Screen):
         self.watchface.timer_update.stop()
 
     def done_return(self):
-        MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF)
+        MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF) #返回表盘界面
        
     def btn1_release(self):
         flag = EventMesh.publish("get_lcd_state")
@@ -475,10 +541,10 @@ class MainMenuScreen(Screen):
                 id = MainMenu2_til.get_tile_act().get_child(0).get_text()
                 #if id != "0":
 
-                MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF)
+                MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF)
    
-    def return_setiing(self, event, msg):
-        MainMenu2_til.set_tile_id(7,0,lv.ANIM.OFF)
+    def return_setiing(self, event, msg): #返回设置界面
+        MainMenu2_til.set_tile_id(setting_id,0,lv.ANIM.OFF)
 
                 
         
@@ -486,31 +552,32 @@ class MainMenuScreen(Screen):
         flag = EventMesh.publish("get_lcd_state")
         if MainMenu2_til.get_tile_act() != None:
             id = MainMenu2_til.get_tile_act().get_child(0).get_text()
-            if id == "4":
+            if id == str(watchface_id):
                 if flag == 1:
                     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
                 else:
                     EventMesh.publish(constants.EVENT.SYSTEM_UP)
             else:
                 if flag == 1:
-                    MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF)
+                    MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF)
                 else:
                     EventMesh.publish(constants.EVENT.SYSTEM_UP)
         else:
             if flag == 1:
-                MainMenu2_til.set_tile_id(4,0,lv.ANIM.OFF)
+                MainMenu2_til.set_tile_id(watchface_id,0,lv.ANIM.OFF)
             else:
                 EventMesh.publish(constants.EVENT.SYSTEM_UP)
 
     def done_bottom_to_top(self):
         id = MainMenu2_til.get_tile_act().get_child(0).get_text()
-        if id == "4":
+        if id == str(watchface_id):
+            # EventMesh.publish("load_screen", {"screen": "msg_detail"})
             EventMesh.publish("load_screen", {"screen": "up_screen"})
         self.menu_id = id
 
     def done_top_to_bottom(self):
         id = MainMenu2_til.get_tile_act().get_child(0).get_text()
-        if id == "4":
+        if id == str(watchface_id):
             EventMesh.publish("load_screen", {"screen": "down_screen"})
         self.menu_id = id
     def done_left_to_right(self):
index 27787d3..be9b1b8 100644 (file)
@@ -92,7 +92,7 @@ setting_cont.add_style(setting_cont_style,lv.PART.MAIN | lv.STATE.DEFAULT)
 
 setting_imei_img_btn_1 = lv.btn(setting_cont)
 setting_imei_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_imei_img_btn_1.set_size(120,35)
+setting_imei_img_btn_1.set_size(115,35)
 setting_imei_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_imei_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_imei_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -117,7 +117,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_app_img_btn_1 = lv.btn(setting_cont)
 setting_app_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_app_img_btn_1.set_size(120,35)
+setting_app_img_btn_1.set_size(115,35)
 setting_app_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_app_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_app_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -142,7 +142,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_bright_img_btn_1 = lv.btn(setting_cont)
 setting_bright_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_bright_img_btn_1.set_size(120,35)
+setting_bright_img_btn_1.set_size(115,35)
 setting_bright_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_bright_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_bright_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -166,7 +166,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_volume_img_btn_1 = lv.btn(setting_cont)
 setting_volume_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_volume_img_btn_1.set_size(120,35)
+setting_volume_img_btn_1.set_size(115,35)
 setting_volume_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_volume_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_volume_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -191,7 +191,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_restore_img_btn_1 = lv.btn(setting_cont)
 setting_restore_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_restore_img_btn_1.set_size(120,35)
+setting_restore_img_btn_1.set_size(115,35)
 setting_restore_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_restore_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_restore_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -216,7 +216,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_poweroff_img_btn_1 = lv.btn(setting_cont)
 setting_poweroff_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_poweroff_img_btn_1.set_size(120,35)
+setting_poweroff_img_btn_1.set_size(115,35)
 setting_poweroff_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_poweroff_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_poweroff_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -244,7 +244,7 @@ setting_cont_y+=setting_cont_offset
 #重启setting_restart_img_btn_1
 setting_restart_img_btn_1 = lv.btn(setting_cont)
 setting_restart_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_restart_img_btn_1.set_size(120,35)
+setting_restart_img_btn_1.set_size(115,35)
 setting_restart_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_restart_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_restart_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -270,7 +270,7 @@ setting_cont_y+=setting_cont_offset
 
 setting_version_img_btn_1 = lv.btn(setting_cont)
 setting_version_img_btn_1.set_pos(int(0),int(setting_cont_y-5))
-setting_version_img_btn_1.set_size(120,34)
+setting_version_img_btn_1.set_size(115,34)
 setting_version_img_btn_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 setting_version_img_btn_1.add_style(style_screen_btn_1_main_main_default, lv.PART.MAIN|lv.STATE.DEFAULT)
 setting_version_img_btn_1.add_flag(lv.obj.FLAG.CLICKABLE)
@@ -333,6 +333,7 @@ class SettingScreen(Screen):
         self.is_sliding = 0
         self.is_left_sliding = 0
         self.meta = setting_screen
+        setting_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.ui_setting_cb(e,"void")), lv.EVENT.GESTURE, None)
         # setting_language.add_event_cb(lambda e: self.load_screen(e, {"screen": "language"}), lv.EVENT.SHORT_CLICKED, None)
         # setting_dialswitch_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "dialswitch")), (lv.EVENT.SHORT_CLICKED ), None)
         # setting_imei_label.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "imei")), (lv.EVENT.SHORT_CLICKED ), None)
@@ -373,44 +374,57 @@ class SettingScreen(Screen):
         # setting_language.add_event_cb(lambda e: self.load_screen(e, {"screen": "language"}), lv.EVENT.SHORT_CLICKED, None)
         # setting_dialswitch_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "dialswitch")), lv.EVENT.PRESSING, None)
         # setting_themeswitch.add_event_cb(lambda e: self.load_screen(e, {"screen": "themeswitch"}), lv.EVENT.SHORT_CLICKED, None)
-        setting_imei_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "imei")), lv.EVENT.PRESSING, None)
-        setting_app_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "app")), lv.EVENT.PRESSING, None)
-        setting_bright_img_btn_1.add_event_cb(lambda e:EventMesh.callback_wrapper( self.ui_setting_cb(e, "brightness")), lv.EVENT.PRESSING, None)
-        setting_volume_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "totalvolume")), lv.EVENT.PRESSING, None)
-        setting_restore_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "restore")), lv.EVENT.PRESSING, None)
-        setting_poweroff_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "poweroff")), lv.EVENT.PRESSING, None)
-        setting_restart_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "restart")), lv.EVENT.PRESSING, None)
-        # setting_update_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "update")), lv.EVENT.PRESSING, None)
-        setting_version_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "version")), lv.EVENT.PRESSING, None)
+        # setting_imei_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "imei")), lv.EVENT.PRESSING, None)
+        # setting_app_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "app")), lv.EVENT.PRESSING, None)
+        # setting_bright_img_btn_1.add_event_cb(lambda e:EventMesh.callback_wrapper( self.ui_setting_cb(e, "brightness")), lv.EVENT.PRESSING, None)
+        # setting_volume_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "totalvolume")), lv.EVENT.PRESSING, None)
+        # setting_restore_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "restore")), lv.EVENT.PRESSING, None)
+        # setting_poweroff_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "poweroff")), lv.EVENT.PRESSING, None)
+        # setting_restart_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "restart")), lv.EVENT.PRESSING, None)
+        # # setting_update_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "update")), lv.EVENT.PRESSING, None)
+        # setting_version_img_btn_1.add_event_cb(lambda e: EventMesh.callback_wrapper(self.ui_setting_cb(e, "version")), lv.EVENT.PRESSING, None)
    
     def initialization(self):
         self.is_left_sliding = 0
         self.is_sliding = 0
         pass
 
-    def ui_setting_cb(self, e, msg):
+    def ui_setting_cb(self,e,msg):
         code = e.get_code()
-        EventMesh.publish("publish_message_event_ui",{"func":self.ui_setting_cb_do,"data":[code,msg]})  
-    def ui_setting_cb_do(self, data):
-        #code = e.get_code()
-
-        code = data[0]
-        msg = data[1]
-
-        #print("code!!!!!!!!",code,msg)
-        if code == lv.EVENT.PRESSING:
-            #print("PRESSING")
-            self.is_sliding += 1
-
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
         elif  code == lv.EVENT.SHORT_CLICKED:
-            #utime.sleep_ms(10)
-            print("1self.is_sliding",self.is_sliding)
-            if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
-                self.is_sliding =0
-                EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
-                print("2self.is_sliding",self.is_sliding)
+            if msg != "void":
+                EventMesh.publish("load_screen",  {"screen": "{}".format(msg)})
+
+    # def ui_setting_cb(self, e, msg):
+    #     code = e.get_code()
+    #     EventMesh.publish("publish_message_event_ui",{"func":self.ui_setting_cb_do,"data":[code,msg]})  
+    # def ui_setting_cb_do(self, data):
+    #     #code = e.get_code()
+
+    #     code = data[0]
+    #     msg = data[1]
+
+    #     #print("code!!!!!!!!",code,msg)
+    #     if code == lv.EVENT.PRESSING:
+    #         #print("PRESSING")
+    #         self.is_sliding += 1
+
+    #     elif  code == lv.EVENT.SHORT_CLICKED:
+    #         #utime.sleep_ms(10)
+    #         print("1self.is_sliding",self.is_sliding)
+    #         if self.is_sliding <= 5 and self.is_sliding != 0:#如果是在滑动中则不需要点击事件
+    #             self.is_sliding =0
+    #             EventMesh.publish("load_screen", {"screen": "{}".format(msg)})
+    #             print("2self.is_sliding",self.is_sliding)
                 
-            self.is_sliding =0
+    #         self.is_sliding =0
             
     def done_return(self):
         EventMesh.publish("return_prev_screen")
@@ -910,9 +924,24 @@ class RestoreScreen(Screen):
     def __init__(self):
         super().__init__()
         self.meta = restore_screen
-        restore_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),lv.EVENT.SHORT_CLICKED, None)
-        restore_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.concel(e)),lv.EVENT.SHORT_CLICKED, None)
-        
+        restore_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),lv.EVENT.GESTURE, None)
+        restore_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),lv.EVENT.SHORT_CLICKED, None)
+        restore_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),lv.EVENT.SHORT_CLICKED, None)
+    
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                EventMesh.publish("load_screen", {"screen": "restore_confirm"})
+            elif msg == 2:
+                EventMesh.publish("return_prev_screen")
     
     def confirm(self, e):
         EventMesh.publish("load_screen", {"screen": "restore_confirm"})
@@ -968,7 +997,7 @@ restart_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 screen_slider_1 = lv.slider(restart_screen)
 screen_slider_1.set_pos(int(4),int(55))
-screen_slider_1.set_size(120,40)
+screen_slider_1.set_size(120,26)
 screen_slider_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.ON)
 screen_slider_1.set_range(0, 100)
 screen_slider_1.set_value(0, False)
@@ -1041,15 +1070,15 @@ screen_slider_1.add_style(style_screen_slider_1_main_knob_default, lv.PART.KNOB|
 
 
 screen_slider_img_bg = lv.img(restart_screen)
-screen_slider_img_bg.set_size(120,40)
-screen_slider_img_bg.set_pos(4,55)
+screen_slider_img_bg.set_size(120,26)
+screen_slider_img_bg.set_pos(5,55)
 screen_slider_img_bg.set_src("U:/static/setting_poweroff_bg.png")
 screen_slider_img_bg.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 screen_slider_img = lv.img(restart_screen)
-screen_slider_img.set_size(30,30)
-screen_slider_img.set_pos(10,65)
-screen_slider_img.set_src("U:/static/setting_power_restart.png")
+screen_slider_img.set_size(25,25)
+screen_slider_img.set_pos(6,56)
+screen_slider_img.set_src("U:/static/menu_restart.png")
 # screen_slider_img.add_flag(lv.obj.FLAG.CLICKABLE)
 screen_slider_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -1066,6 +1095,7 @@ class RestartScreen(Screen):
     def __init__(self):
         super().__init__()
         self.meta = restart_screen
+        self.timer = osTimer()
         self.old_x = 0
         # restart_confirm.add_event_cb(lambda e: EventMesh.callback_wrapper(self.confirm(e)),lv.EVENT.SHORT_CLICKED, None)
         # restart_cancel.add_event_cb(lambda e: EventMesh.callback_wrapper(self.concel(e)),lv.EVENT.SHORT_CLICKED, None)
@@ -1074,49 +1104,50 @@ class RestartScreen(Screen):
     
     def initialization(self):
         screen_slider_1.set_value(10, False)
-        screen_slider_img.set_pos(10,60)
+        screen_slider_img.set_pos(6,56)
         screen_slider_1.set_style_bg_color(lv.color_make(0x00,0x00,0x00), lv.PART.INDICATOR|lv.STATE.DEFAULT)
 
     def save_choice(self,e):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
         state_on = 0
         state_offset = 0
         code = e.get_code()
         value_slider = screen_slider_1.get_value()
         total_len = 0+value_slider
-        if total_len >= 100-7:
-            total_len = 100-7
-        if total_len <= 10:
-            total_len = 10
+        if total_len >= 100-15:
+            total_len = 100-15
+        if total_len <= 6:
+            total_len = 6
         
-        if total_len >= 100-7:
+        if total_len >= 100-15:
             screen_slider_1.set_value(100, False)
 
         if total_len >= 20:
             if total_len > 80:
-                screen_slider_img.set_pos(total_len,60)
+                screen_slider_img.set_pos(total_len,56)
             else:
-                screen_slider_img.set_pos(total_len-5,60)
+                screen_slider_img.set_pos(total_len-5,56)
         else:
-            screen_slider_img.set_pos(total_len,60)
+            screen_slider_img.set_pos(total_len,56)
         screen_slider_1.set_style_bg_color(lv.color_make(0x80,0x80,0x80), lv.PART.INDICATOR|lv.STATE.DEFAULT)
 
         # print("RELEASED save_choice!!!!!!",code,total_len,value_slider,state_offset)
         if code == lv.EVENT.RELEASED:
             value_slider = screen_slider_1.get_value()
             # print("RELEASED save_choice1111111!!!!!!",total_len,value_slider,state_on)
-            if total_len < 100-7:
+            if total_len < 100-15:
                 screen_slider_1.set_value(10, False)
-                screen_slider_img.set_pos(10,60)
+                screen_slider_img.set_pos(6,56)
                 screen_slider_1.set_style_bg_color(lv.color_make(0x00,0x00,0x00), lv.PART.INDICATOR|lv.STATE.DEFAULT)
             else:
+                screen_slider_img.set_pos(100,56)
                 screen_slider_1.set_value(100, False)
-                self.confirm(0) 
-            pass
-        
-        # print("save_choice!!!!!!",value_slider)
-        pass
-
+                self.timer.start(50,0,self.start_cb)
+                
+    def start_cb(self,*argc):
+        self.confirm(0)
     def confirm(self, e):
+        # EventMesh.publish("system_sleep_rest")#防止黑屏
         Power.powerRestart()
 
     def concel(self, e):
@@ -1248,7 +1279,7 @@ poweroff_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 poweroff_screen_slider_1 = lv.slider(poweroff_screen)
 poweroff_screen_slider_1.set_pos(int(4),int(55))
-poweroff_screen_slider_1.set_size(120,40)
+poweroff_screen_slider_1.set_size(120,26)
 poweroff_screen_slider_1.set_scrollbar_mode(lv.SCROLLBAR_MODE.ON)
 poweroff_screen_slider_1.set_range(0, 100)
 poweroff_screen_slider_1.set_value(10, False)
@@ -1274,15 +1305,15 @@ poweroff_screen_slider_1.add_style(style_screen_slider_1_main_knob_default, lv.P
 
 
 poweroff_screen_slider_img_bg = lv.img(poweroff_screen)
-poweroff_screen_slider_img_bg.set_size(120,40)
-poweroff_screen_slider_img_bg.set_pos(4,55)
+poweroff_screen_slider_img_bg.set_size(120,26)
+poweroff_screen_slider_img_bg.set_pos(5,55)
 poweroff_screen_slider_img_bg.set_src("U:/static/setting_poweroff_bg.png")
 poweroff_screen_slider_img_bg.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
 poweroff_screen_slider_img = lv.img(poweroff_screen)
-poweroff_screen_slider_img.set_size(30,30)
-poweroff_screen_slider_img.set_pos(10,65)
-poweroff_screen_slider_img.set_src("U:/static/setting_poweroff.png")
+poweroff_screen_slider_img.set_size(25,25)
+poweroff_screen_slider_img.set_pos(6,56)
+poweroff_screen_slider_img.set_src("U:/static/menu_poweroff.png")
 # screen_slider_img.add_flag(lv.obj.FLAG.CLICKABLE)
 poweroff_screen_slider_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -1309,37 +1340,40 @@ class PoweroffScreen(Screen):
     
     def initialization(self):
         poweroff_screen_slider_1.set_value(10, False)
-        poweroff_screen_slider_img.set_pos(10,60)
+        poweroff_screen_slider_img.set_pos(6,56)
         poweroff_screen_slider_1.set_style_bg_color(lv.color_make(0x00,0x00,0x00), lv.PART.INDICATOR|lv.STATE.DEFAULT)
 
     def save_choice(self,e):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
         code = e.get_code()
         value_slider = poweroff_screen_slider_1.get_value()
+        # print("save_choice!!!!!!",value_slider)
         total_len = 0+value_slider
-        if total_len >= 100-7:
-            total_len = 100-7
-        if total_len <= 10:
-            total_len = 10
+        if total_len >= 100-15:
+            total_len = 100-15
+        if total_len <= 6:
+            total_len = 6
         
-        if total_len >= 100-7:
+        if total_len >= 100-15:
             poweroff_screen_slider_1.set_value(100, False)
 
         if total_len >= 20:
             if total_len > 80:
-                poweroff_screen_slider_img.set_pos(total_len,60)
+                poweroff_screen_slider_img.set_pos(total_len,56)
             else:
-                poweroff_screen_slider_img.set_pos(total_len-5,60)
+                poweroff_screen_slider_img.set_pos(total_len-5,56)
         else:
-            poweroff_screen_slider_img.set_pos(total_len,60)
+            poweroff_screen_slider_img.set_pos(total_len,56)
         poweroff_screen_slider_1.set_style_bg_color(lv.color_make(0x80,0x80,0x80), lv.PART.INDICATOR|lv.STATE.DEFAULT)
        
         if code == lv.EVENT.RELEASED:
             value_slider = poweroff_screen_slider_1.get_value()
-            if total_len < 100-7:
+            if total_len < 100-15:
                 poweroff_screen_slider_1.set_value(10, False)
-                poweroff_screen_slider_img.set_pos(10,60)
+                poweroff_screen_slider_img.set_pos(6,56)
                 poweroff_screen_slider_1.set_style_bg_color(lv.color_make(0x00,0x00,0x00), lv.PART.INDICATOR|lv.STATE.DEFAULT)
             else:
+                poweroff_screen_slider_img.set_pos(100,56)
                 poweroff_screen_slider_1.set_value(100, False)
                 self.confirm(0) 
             pass
@@ -1352,6 +1386,7 @@ class PoweroffScreen(Screen):
         # EventMesh.publish("load_screen", {"screen": "setting"})
         
     def confirm(self, e):
+        EventMesh.publish("system_sleep_rest")#防止黑屏
         EventMesh.publish("load_screen", {"screen": "poweroff_comfirm"})   
 
     def concel(self, e):
@@ -1422,6 +1457,13 @@ poweron_screen = lv.obj()
 print("poweron_screen")
 poweron_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
+# poweron_img = lv.img(poweron_screen)
+# poweron_img.set_size(80,80)
+# poweron_img.set_pos(24,24)
+# poweron_img.set_src("U:/static/AI_MAIN_ICON.png")
+# # screen_slider_img.add_flag(lv.obj.FLAG.CLICKABLE)
+# poweron_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+
 poweron_label = lv.label(poweron_screen)
 poweron_label.set_text("WELCOME")
 poweron_label.align(lv.ALIGN.CENTER, 0, 0)
@@ -1477,70 +1519,6 @@ class PowerOnScreen(Screen):
         pass
 
 from common import Abstract
-class TimePoweroffScreen(Abstract):
-    
-
-    def __init__(self):
-        super().__init__()
-        self.power_off_flag = 0
-        self.read_data = {}
-        EventMesh.subscribe("get_time_power_off", self.get_time_power_off)
-        EventMesh.subscribe("power_off_callback", self.power_off_callback)
-        EventMesh.subscribe("set_time_power_off", self.set_time_power_off)
-
-
-    def power_off_callback(self,event,msg):
-        if self.power_off_flag == 0:
-            self.power_off_flag = 1
-            EventMesh.publish("set_time_power_off")
-            Power.powerDown()
-
-        elif self.power_off_flag == 1:
-            self.power_off_flag = 0
-            EventMesh.publish("set_time_power_off")
-            Power.powerRestart()
-            
-
-    def get_time_power_off(self,event,msg):
-        if self.power_off_flag == 0:
-            self.power_off_flag = 1
-        elif self.power_off_flag == 1:
-            self.power_off_flag = 0
-
-    def set_time_power_off(self,event,msg):
-        self.read_data = EventMesh.publish("get_storage_data")
-        if self.read_data != {}:
-            b  = str("off_on") in self.read_data().keys()
-            if b == True:
-                pass
-
-
-
-    
-    def done_return(self):
-        pass
-
-    def btn1_release(self):
-        pass
-        
-    def btn8_press(self):
-        pass
-
-class LanguageScreen(Screen):
-    NAME = "language"
-
-    def __init__(self):
-        super().__init__()
-        self.meta = language_screen
-
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "setting"})
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "setting"})
 
 
 class DialswitchScreen(Screen):
@@ -1739,7 +1717,7 @@ brightness_label1.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAU
 
 brightness_bar = lv.bar(brightness_screen)
 brightness_bar.set_pos(10, 55)
-brightness_bar.set_size(108, 12)
+brightness_bar.set_size(106, 12)
 brightness_bar.set_style_anim_time(1000, lv.PART.INDICATOR | lv.STATE.DEFAULT)
 brightness_bar.set_mode(lv.bar.MODE.NORMAL)
 brightness_bar.set_value(50, lv.ANIM.OFF)
@@ -1811,16 +1789,45 @@ class BrightnessScreen(Screen):
         self.time = 10
         self.read_data = {}
         self.meta = brightness_screen
-        brightness_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        brightness_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        
-        brightness_time_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_time_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
 
-        brightness_time_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_time_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
+        brightness_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,0)),lv.EVENT.GESTURE, None)
+        brightness_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),lv.EVENT.SHORT_CLICKED, None)
+        brightness_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),lv.EVENT.SHORT_CLICKED, None)
+        brightness_time_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,3)),lv.EVENT.SHORT_CLICKED, None)
+        brightness_time_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,4)),lv.EVENT.SHORT_CLICKED, None)
+    
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                EventMesh.publish("push_add_brightness_level")
+                self.level = EventMesh.publish("get_brightness_level")
+                # print("self.level:{}".format(self.level))
+                self.show_bar()
+            elif msg == 2:
+                EventMesh.publish("push_reduce_brightness_level")
+                self.level = EventMesh.publish("get_brightness_level")
+                self.show_bar()
+            elif msg == 3:
+                self.time+=5
+                if self.time >= 30:
+                    self.time = 30
+                EventMesh.publish("set_brightness_time",self.time)        
+                brightness_label_time_text.set_text("{}秒".format(self.time))
+            elif msg == 4:
+                if self.time > 5:
+                    self.time-=5
+                EventMesh.publish("set_brightness_time",self.time)
+                brightness_label_time_text.set_text("{}秒".format(self.time))
+                pass
+
     def initialization(self):
         self.level = EventMesh.publish("get_brightness_level")
         self.time = EventMesh.publish("get_brightness_time")
@@ -1875,155 +1882,6 @@ class BrightnessScreen(Screen):
         EventMesh.publish("watch_top_show")
         EventMesh.publish("load_screen", {"screen": "main_menu"})
 
-
-class VolumeScreen(Screen):
-    NAME = "volume"
-
-    def __init__(self):
-        super().__init__()
-        self.meta = volume_screen
-        volume_phone_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "phonering"})), lv.EVENT.SHORT_CLICKED, None)
-        volume_message_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "msgvolume"})), lv.EVENT.SHORT_CLICKED, None)
-        volume_alarm_btn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "alarmvolume"})), lv.EVENT.SHORT_CLICKED, None)
-
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "setting"})
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "setting"})
-
-
-
-class PhoneringScreen(Screen):
-    NAME = "phonering"
-
-    def __init__(self):
-        super().__init__()
-        self.level = 2
-        self.meta = phonering_screen
-        phonering_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        phonering_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        phonering_add_imgbtn.set_ext_click_area(20)
-        phonering_reduce_imgbtn.set_ext_click_area(20)
-
-    def add_level(self, e):
-        EventMesh.publish("push_add_phonering_level")
-        self.level = EventMesh.publish("get_phonering_level")
-        self.show_bar()
-
-    def reduce_level(self, e):
-        EventMesh.publish("push_reduce_phonering_level")
-        self.level = EventMesh.publish("get_phonering_level")
-        self.show_bar()
-
-    def show_bar(self):
-        phonering_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
-
-    def initialization(self):
-        self.level = EventMesh.publish("get_phonering_level")
-        self.show_bar()
-
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-    def done_left_to_right(self):
-        pass
-
-    def done_right_to_left(self):
-        pass
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-
-
-class AlarmvolumeScreen(Screen):
-    NAME = "alarmvolume"
-
-    def __init__(self):
-        super().__init__()
-        self.level = 2
-        self.meta = alarmvolume_screen
-        alarmvolume_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        alarmvolume_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-
-    def add_level(self, e):
-        EventMesh.publish("push_add_alarmvolume_level")
-        self.level = EventMesh.publish("get_alarmvolume_level")
-        self.show_bar()
-
-    def reduce_level(self, e):
-        EventMesh.publish("push_reduce_alarmvolume_level")
-        self.level = EventMesh.publish("get_alarmvolume_level")
-        self.show_bar()
-
-    def show_bar(self):
-        alarmvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
-
-    def initialization(self):
-        self.level = EventMesh.publish("get_alarmvolume_level")
-        self.show_bar()
-    
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-
-
-class MsgvolumeScreen(Screen):
-    NAME = "msgvolume"
-
-    def __init__(self):
-        super().__init__()
-        self.level = 2
-        self.meta = msgvolume_screen
-        msgvolume_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-        msgvolume_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_level(e)),
-                                     lv.EVENT.SHORT_CLICKED, None)
-
-    def add_level(self, e):
-        EventMesh.publish("push_add_msgvolume_level")
-        self.level = EventMesh.publish("get_msgvolume_level")
-        self.show_bar()
-
-    def reduce_level(self, e):
-        EventMesh.publish("push_reduce_msgvolume_level")
-        self.level = EventMesh.publish("get_msgvolume_level")
-        self.show_bar()
-
-    def show_bar(self):
-        msgvolume_bar.set_value((100 // 7) * self.level, lv.ANIM.OFF)
-
-    def initialization(self):
-        self.level = EventMesh.publish("get_msgvolume_level")
-        self.show_bar()
-    
-    def done_return(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-    def btn1_release(self):
-        EventMesh.publish("load_screen", {"screen": "main_menu"})
-        
-    def btn8_press(self):
-        EventMesh.publish("load_screen", {"screen": "volume"})
-
-
-
 #-----------------------------------------Total--volum-------------------------------
 
 volume_adjust_screen = lv.obj()
@@ -2076,15 +1934,37 @@ class totalvolumeScreen(Screen):
     def __init__(self):
         super().__init__()
         self.meta = volume_adjust_screen
-        totalvolume_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.add_volum_size(e)),
+        volume_adjust_screen.add_event_cb(lambda e:EventMesh.callback_wrapper(self.button_cb(e,0)), lv.EVENT.GESTURE, None)
+        totalvolume_add_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,1)),
                                      lv.EVENT.SHORT_CLICKED, None)
-        totalvolume_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.reduce_volum_size(e)),
+        totalvolume_reduce_imgbtn.add_event_cb(lambda e: EventMesh.callback_wrapper(self.button_cb(e,2)),
                                      lv.EVENT.SHORT_CLICKED, None)
         self.read_data = {}
         self.volum_size = 8
         self.aud = audio.Audio(0)
         # self.aud.set_pa(Pin.GPIO29)
         
+    def button_cb(self,e,msg):
+        code = e.get_code()
+        indev = lv.indev_get_act()
+        lv.indev_t.wait_release(indev)
+        dir = lv.indev_t.get_gesture_dir(indev)
+        if code == lv.EVENT.GESTURE:
+            if dir == lv.DIR.RIGHT:
+                pass
+                # EventMesh.publish("load_screen", {"screen": "main_menu"})
+        elif  code == lv.EVENT.SHORT_CLICKED:
+            if msg == 1:
+                self.volum_size+=2
+                if self.volum_size >= 11:
+                    self.volum_size = 11
+                self.show_bar(1)
+            elif msg == 2:
+                self.volum_size -= 2
+                if self.volum_size < 0:
+                    self.volum_size = 0
+                self.show_bar(1)
+
     def initialization(self):
         self.read_data = EventMesh.publish("get_storage_data")
         # print("self.read_data:{}".format(self.read_data))
@@ -2110,7 +1990,10 @@ class totalvolumeScreen(Screen):
         self.show_bar(1)
 
     def show_bar(self,msg):
-        totalvolume_bar.set_value((100 // 11) * self.volum_size, lv.ANIM.OFF)
+        value = (100 // 11) * self.volum_size
+        if value >= 99:
+            value = 100
+        totalvolume_bar.set_value(value, lv.ANIM.OFF)
         if msg == 1:
             self.aud.setVolume(self.volum_size)
             EventMesh.publish("set_volum_size",self.volum_size)
index 17f50c2..9d9e0ab 100644 (file)
@@ -41,4 +41,5 @@
 #define CONFIG_JPEG 1
 #define CONFIG_CAMERA_SAVEPHOTOS 1
 //菊风视频通话
-#define CONFIG_juphoon 1
\ No newline at end of file
+#define CONFIG_juphoon 1
+#define PROJECT_NAME_G3_K01_font 1
\ No newline at end of file
index 42b702b..0f95eb7 100644 (file)
@@ -60,7 +60,8 @@ CONFIG_LCD=y
 # CONFIG_UART_SLIP is not set
 # CONFIG_POC is not set
 #CONFIG_GH301x=y
+CONFIG_AUDIO_G711_COMPRESS=y
 CONFIG_SC7A20=y
 #菊风视频通话
 CONFIG_juphoon=y
-
+PROJECT_NAME_G3_K01_font=y
index 7e47d26..97195a8 100644 (file)
     #define MICROPY_QPY_MISC_PWM                (1)
     #define MICROPY_QPY_MISC_USB                (1)
     #define MICROPY_QPY_MISC_USBNET             (1)
+       #define MICROPY_QPY_MISC_CFG_NETLIGHT       (1)
 #endif
 
 #if MICROPY_QPY_MODULE_AUDIO
 #define MICROPY_QPY_PY_MATH                            (1)  //flash 14880 Byte
 #define MICROPY_QPY_PY_CMATH                           (0)  //flash 3136 Byte
 #define MICROPY_QPY_PY_USELECT                         (0)  //flash 1792 Byte
-#define MICROPY_QPY_PY_UCTYPES                         (1)  //flash 2816 Byte
+#define MICROPY_QPY_PY_UCTYPES                         (0)  //flash 2816 Byte
 #define MICROPY_QPY_PY_UZLIB                           (0)  //flash 3072 Byte
 #define MICROPY_QPY_PY_UASYNCIO                        (0)  //flash 2048 Byte
 #define MICROPY_QPY_PY_ENABLE_WEBSERVER                        (0)  //flash 3424 Byte
index b68136d..844215d 100644 (file)
Binary files a/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z and b/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
index 8f6db5c..5064d79 100644 (file)
Binary files a/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
index effa9a7..30b5c46 100644 (file)
Binary files a/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib and b/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
index 160f4dd..4fd01b0 100644 (file)
Binary files a/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib and b/2.sdk/project/K01/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
index b982917..d7f464a 100644 (file)
Binary files a/2.sdk/project/K01/usr/static/IMAGE_APP_QR_CODE.png and b/2.sdk/project/K01/usr/static/IMAGE_APP_QR_CODE.png differ
index 7c892e1..3e2d29b 100644 (file)
Binary files a/2.sdk/project/K01/usr/static/R_CALL_mp3.mp3 and b/2.sdk/project/K01/usr/static/R_CALL_mp3.mp3 differ
index 16457c6..b42028a 100644 (file)
Binary files a/2.sdk/project/K01/usr/static/setting_poweroff_bg.png and b/2.sdk/project/K01/usr/static/setting_poweroff_bg.png differ
index 10ac179..ad46754 100644 (file)
@@ -503,9 +503,9 @@ al_think_screen_icon.set_src("U:/static/AI/AI_THINK001.png")
 
 al_think_screen_icon.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-al_think_screen_icon1 = lv.label(AI_think_screen)
-al_think_screen_icon1.set_pos(int(4),int(95))
-al_think_screen_icon1.set_size(120,25)
+al_think_screen_icon1 = lv.label(AI_listen_screen)
+al_think_screen_icon1.set_pos(int(4),int(LCD_SIZE_H-70))
+al_think_screen_icon1.set_size(230,50)
 al_think_screen_icon1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 al_think_screen_icon1.set_text("取消")
 al_think_screen_icon1.set_long_mode(lv.label.LONG.WRAP)
@@ -693,7 +693,7 @@ class AIScreen(Screen):#AI_GUI
         self.meta = AI_screen
         # self.meta_type = "popup"
         self._1S_timer = osTimer()
-        self.Audio_buf_size = 4*1024
+        self.Audio_buf_size = 8*1024
         self.record_timer = osTimer()
         self.record = audio.Record()
         #self.record.end_callback(self.record_callback)
@@ -702,6 +702,7 @@ class AIScreen(Screen):#AI_GUI
         self.audio_play_state = 1 #音频播放完状态
         self.aud.setCallback(self.audio_cb)
         
+
         
         self.AI_TYPE = AI_TYPE_voice_chat #AI类型,AI_TYPE_voice_chat:阿里云voice_chat;AI_TYPE_BKRS:北科聚合平台
         
@@ -718,9 +719,12 @@ class AIScreen(Screen):#AI_GUI
         self.AI_client_voice_chat_recv_id = 0
         self.AI_client_voice_chat_isconnect =0
         self.record_pcm = None
+        self.play_pcm = None
         self.VC_record_thread_id = 0
         self.pingping_timerout = 0
         self.VC_websocket_stop_flasg = 0
+        self.VC_record_TYPE = 1 #0:PCM 1:AMR
+        self.VC_play_TYPE = 0 #0:mp3 1:PCM
 
         self.TTS_PRO_TYPE = 0 #TTS协议类型,=0:用长文本合成接口,=1用音频流合成接口
         self.AI_client_chat_recv_id = 0
@@ -915,14 +919,18 @@ class AIScreen(Screen):#AI_GUI
         pass
 
     def think_bt_cb(self,e):#正在思考确定按钮回调 取消播放
-        self.Close()
-        AI_no_net_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏
-        AI_listen_screen.add_flag(lv.obj.FLAG.HIDDEN)
-        AI_think_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
-        AI_connect_timerout_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
-        AI_talk_end_screen.add_flag(lv.obj.FLAG.HIDDEN) #
-        AI_not_listen_text_screen.add_flag(lv.obj.FLAG.HIDDEN) #
-        AI_talk_screen.clear_flag(lv.obj.FLAG.HIDDEN) #
+        if self.AI_TYPE == AI_TYPE_voice_chat:
+            self.AI_client_voice_chat_end_speech()
+            pass
+        else:
+            self.Close()
+            AI_no_net_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏
+            AI_listen_screen.add_flag(lv.obj.FLAG.HIDDEN)
+            AI_think_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
+            AI_connect_timerout_screen.add_flag(lv.obj.FLAG.HIDDEN) #先隐藏
+            AI_talk_end_screen.add_flag(lv.obj.FLAG.HIDDEN) #
+            AI_not_listen_text_screen.add_flag(lv.obj.FLAG.HIDDEN) #
+            AI_talk_screen.clear_flag(lv.obj.FLAG.HIDDEN) #
         
         pass
 
@@ -1072,7 +1080,7 @@ class AIScreen(Screen):#AI_GUI
                     # scroll_bottom = AI_label2.get_height()
                     AI_end_screen_list_screen2.scroll_to(0,scroll_bottom,lv.ANIM.OFF)
                 self.page_num_tmp = self.page_num
-                print("text_str_list[self.page_num]:{}".format(str_tmp+text_str_list[self.page_num]))
+                #print("text_str_list[self.page_num]:{}".format(str_tmp+text_str_list[self.page_num]))
                 #AI_end_screen_list_screen2.scroll_to_view(lv.ANIM.OFF)
                 AI_end_screen_list_screen.add_flag(lv.obj.FLAG.HIDDEN) #隐藏1
                 AI_end_screen_list_screen2.clear_flag(lv.obj.FLAG.HIDDEN) #
@@ -1091,7 +1099,7 @@ class AIScreen(Screen):#AI_GUI
                 #AI_end_screen_list_screen.scroll_to_view(lv.ANIM.OFF)
                 AI_end_screen_list_screen2.add_flag(lv.obj.FLAG.HIDDEN) #隐藏2
                 AI_end_screen_list_screen.clear_flag(lv.obj.FLAG.HIDDEN) #
-        print("page_change1:page_num:{},text_str_list len:{}".format(self.page_num,len(text_str_list)))
+        #print("page_change1:page_num:{},text_str_list len:{}".format(self.page_num,len(text_str_list)))
 
 
     def listen_end_btcb(self,e):#说话完成确定按钮回调
@@ -1353,10 +1361,18 @@ class AIScreen(Screen):#AI_GUI
         self.AI_listen_end = 1
         self.audio_play_state = 0
         if self.AI_TYPE == AI_TYPE_voice_chat:
-            if self.record_pcm != None:
-                print("talk_ars_end:record_pcm.close()!!!!!!!!!!!!!!!!!!")
-                self.record_pcm.close()
-                self.record_pcm=None
+            if self.VC_record_TYPE == 1:
+                self.record.stop()#关闭录音
+            else:
+                pass
+                if self.record_pcm != None:
+                    print("talk_ars_end:record_pcm.close()!!!!!!!!!!!!!!!!!!")
+                    try:
+                        self.record_pcm.stream_stop()
+                        self.record_pcm.close()
+                    except Exception as e:
+                        usys.print_exception(e)
+                    self.record_pcm=None
         else:
             self.record.stop()#关闭录音
             self.record_timer.stop()#关闭定时器
@@ -1458,10 +1474,7 @@ class AIScreen(Screen):#AI_GUI
             if 1:#self.audio_play_state == 0:
                 
                 if self.AI_TYPE == AI_TYPE_voice_chat:
-                    print("record_pcm.stream_start()!!!!!!!!!!!!")
-                    self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
-                    ret = self.record_pcm.stream_start()
-                    print("self.record_pcm.stream_start:ret:{}".format(ret))
+                    
                     self.AI_client_voice_chat_start_requset()#先开始对话
                     self._1S_timer.start(1000,1,self._1S_timer_cb)
                     #self.AI_client_voice_chat_speak_requset()
@@ -1608,6 +1621,7 @@ class AIScreen(Screen):#AI_GUI
         while True:
             try:
                 # 死循环接收数据
+                utime.sleep_ms(1)
                 recv_data = cli.recv()
                 if not recv_data:
                     # 服务器关闭连接或客户端关闭连接
@@ -1617,7 +1631,7 @@ class AIScreen(Screen):#AI_GUI
                     break
                 try:
                     if isinstance(recv_data, str):#返回的是字符串
-                        print("AI_client_voice_chat_recv:recv_data:{}".format(recv_data))
+                        print("VC:recv_data:{}".format(recv_data))
                         jsload_data =  ujson.loads(recv_data)
                         #print("AI_client_voice_chat_recv jsload_data = {}".format(jsload_data))
                         
@@ -1643,22 +1657,31 @@ class AIScreen(Screen):#AI_GUI
                         if jsload_data["event"]  == "RespondingContent" :#chat回答      
                         
                             payload = jsload_data["payload"]
+                            self.AI_label_str=str(payload['text'])#chat文本
+                            self.AI_client_chat_play_str=str(payload['text'])
+                            self.AI_client_tts_str_sen = str(payload['text'])
+
+                            
+
+                            
                             if(payload['finished'] == True):#chat回答 结束,开始tts
-                                self.voice_chat_state ==  VC_State_TTSStart
+                                self.voice_chat_state =  VC_State_TTSStart
                                 self.AI_client_chat_end_flag = 1
                                 pass
                             else:
+                                
                                 self.AI_client_chat_end_flag = 0
                                 self.AI_client_tts_data_len = 0
-                            self.AI_label_str=str(payload['text'])#chat文本
-                            self.AI_client_chat_play_str=str(payload['text'])
-                            self.AI_client_tts_str_sen = str(payload['text'])
-                            self.timer_out_count = 2
-                            self.think_end_result()#文本显示
+                            #utime.sleep_ms(5)
                             
                         if jsload_data["event"]  == "RespondingStarted" :#音频开始下发
+                            self.timer_out_count = 2
+                            self.think_end_result()#文本显示
+                            #self.tts_fd = open('/usr/tesr.pcm','w')
                             pass
                         if jsload_data["event"]  == "RespondingEnded" :#音频下发结束
+                            
+                            #self.tts_fd.close()
                             pass
                         elif jsload_data["event"]  == "DialogStateChanged" :#状态切换事件
                             payload = jsload_data["payload"]
@@ -1667,9 +1690,11 @@ class AIScreen(Screen):#AI_GUI
                                 self.AI_client_voice_chat_send_speech()#开始上传语音
                             if payload["state"] == "Thinking":#准备开始TTS
                                 self.voice_chat_state = VC_State_Thinking
+                                
                                 self.AI_label_str = ""
                                 self.AI_client_chat_end_flag = 0
                                 self.AI_client_tts_data_len = 0
+                                self.AI_client_tts_data_total_len = 0
                             if payload["state"] == "Responding":
                                 self.voice_chat_state = VC_State_Responding
                         elif jsload_data["event"]  == "RequestAccepted" :#请求上传语音被允许
@@ -1677,6 +1702,21 @@ class AIScreen(Screen):#AI_GUI
                             #self.AI_client_voice_chat_send_speech()#开始上传语音
                             pass
                     else:#下发音频数据
+                        #填充头
+                        #self.tts_fd.write(recv_data)
+                        #recv_data_len = len(recv_data)
+                        # data_len_b = recv_data_len.to_bytes(4,'little')#数据长度转16进制数组
+                        # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                        #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                        #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                        #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                        # h_data_b = bytes(h_data)
+                        # file_len = recv_data_len+len(h_data_b)+4+4
+                        # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                        # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                        self.AI_client_tts_data_total_len += len(recv_data)
+                        self.AI_client_tts_data_len += len(recv_data)
+                        #if self.AI_client_tts_data_total_len >10*1024:
                         self.AI_audio_queue.put([recv_data,self.AI_client_tts_str_sen])
                         print("下发音频数据:{}".format(len(recv_data)))
                 except Exception as e:
@@ -1725,18 +1765,46 @@ class AIScreen(Screen):#AI_GUI
         # except Exception as e:
         #     usys.print_exception(e)
         #record_data_queue = Queue(100)
-        #fd = open('/usr/tesr.pcm','w')
+        #fd = open('/usr/tesr.amr','w')
         #self.VC_websocket_stop_flasg  = 1
+        if self.VC_record_TYPE == 1:
+            h_data= [0x23,0x21 ,0x41 ,0x4D ,0x52 ,0x0A ]
+            h_data_b = bytes(h_data)
+            self.AI_client_voice_chat_send(h_data_b)
         while True:
             try:
                 # 死循环接收数据
                 #if self.voice_chat_state ==  VC_State_SpeechStart:
                 Record_read_buf = bytearray(self.Audio_buf_size)
-                if self.record_pcm ==None:
-                    break
-                Record_len = self.record_pcm.stream_read(Record_read_buf, self.Audio_buf_size)
-                # if Record_len < 0:
-                #     self.record_pcm.stream_start()
+                
+                Record_len = 0
+                if self.VC_record_TYPE == 0:#pcm
+                    if self.record_pcm ==None:
+                        break
+                    Record_len = self.record_pcm.stream_read(Record_read_buf, self.Audio_buf_size)
+                    if Record_len <= 0:
+                        try:
+                            if self.record_pcm != None:
+                                try:
+                                    self.record_pcm.stream_stop()
+                                    self.record_pcm.close()
+                                    self.record_pcm = None
+                                except Exception as e:
+                                    usys.print_exception(e)
+                            if self.record_pcm == None:        
+                                ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                                print("audio.Audio.PCM:ret:{}".format(ret))
+                                ret = self.record_pcm.stream_read_start()
+                                print("self.record_pcm.stream_read_start:ret:{}".format(ret))
+                        except Exception as e:
+                            usys.print_exception(e)
+                    utime.sleep_ms(100)
+                    
+                else :
+                    
+                    Record_len = self.record.stream_read(Record_read_buf, self.Audio_buf_size)
+                    utime.sleep_ms(1000)
+
                 #Record_len = 1024*2
                 print("VC_record_thread:{}".format(Record_len))
                 if Record_len > 0:
@@ -1750,7 +1818,7 @@ class AIScreen(Screen):#AI_GUI
                     self.AI_client_voice_chat_end_speech()
                     break
                 utime.sleep_ms(40)
-                if self.voice_chat_state ==  VC_State_SpeechEnd:
+                if self.voice_chat_state !=  VC_State_SpeechStart:
                     break
             except Exception as e:
                     usys.print_exception(e)
@@ -1772,17 +1840,39 @@ class AIScreen(Screen):#AI_GUI
         json_data = \
         {
             "header":{
-                "trace_id":"ailaqbo0r6o",
+                "trace_id":self.get_trace_id(),
                 "event":"Start"
                 },
             "payload":{
-                "device_id":"test_device_id",
+                "device_id":"test_device12345678_id",
                 "user_agent":"python",
                 "in_format":"pcm",
                 "out_format":"mp3",
-                "sample_rate":8000
+                "sample_rate":16000,
+                "space_time": 100
                 }
         }
+        if self.VC_play_TYPE == 1:
+            json_data["payload"]["out_format"]='pcm'
+        if self.VC_record_TYPE == 1 :
+            json_data["payload"]["in_format"]='amr'
+            json_data["payload"]["sample_rate"]=8000
+            self.record.stream_start(audio.Record.AMRWB, 8000, 60)
+            pass
+        else:
+            print("record_pcm.stream_read_start()!!!!!!!!!!!!")
+            if self.record_pcm != None:
+                try:
+                    self.record_pcm.stream_stop()
+                    self.record_pcm.close()
+                    self.record_pcm = None
+                except Exception as e:
+                    usys.print_exception(e)
+            if self.record_pcm == None:        
+                ret = self.record_pcm = audio.Audio.PCM(0,1,16000,0,1,2)
+                print("audio.Audio.PCM:ret:{}".format(ret))
+                ret = self.record_pcm.stream_read_start()
+                print("self.record_pcm.stream_read_start:ret:{}".format(ret))
         self.AI_client_voice_chat_send(ujson.dumps(json_data))
         self.voice_chat_state = VC_State_None
     #请求上传语音
@@ -2309,13 +2399,12 @@ class AIScreen(Screen):#AI_GUI
         while True:
             try:
                 if 1: #self.audio_play_state == 0:
-                    #print("AI_audio_queue_thread")
+                    print("AI_audio_queue_thread")
                     if self.play_flag == 1:
                         self.play_flag_init = 1
                         data = self.AI_audio_queue.get()
-                        
                         #self.AI_client_tts_data_len=len(data)
-                        print("audio_queue:len:{},data{} self.play_flag:{}\r\n".format(len(data[0]),data[1],self.play_flag))
+                        print("audio_queue:len:{},data{} self.play_flag:{}\r\n".format(len(data[0]),len(data[1]),self.play_flag))
                         if len(data[0]) > 1:
                             if self.TTS_PRO_TYPE == 0:
                                 if self.play_flag == 1:
@@ -2327,10 +2416,36 @@ class AIScreen(Screen):#AI_GUI
                                 # AI_label.set_text(self.AI_label_answer)
                             try:
                                 if self.play_flag == 1:
-                                    tmp= self.aud.playStream(3, data[0])#播放音频流
-                                    
-                                    if tmp != 0:
-                                        print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                    if self.VC_play_TYPE == 1:
+                                        if self.play_pcm == None:        
+                                            self.play_pcm = audio.Audio.PCM(0,1,16000,1,1,2)
+                                            self.play_pcm.setVolume(11)
+                                            ret = self.play_pcm.stream_write_start()
+                                            print("self.record_pcm.stream_write_start:ret:{}".format(ret))
+                                        write_buf = bytearray(data[0])
+                                        ret = self.play_pcm.stream_write(write_buf,len(write_buf))
+                                        #ret= self.aud.playStream(1, data[0])#播放音频流
+                                        print("play_pcm.stream_write:{}".format(ret))
+                                    else:
+                                        
+                                        tmp= self.aud.playStream(3, data[0])#播放音频流
+                                        
+                                        if tmp != 0:
+                                            print("2playStream:error tmp:{} data len:{}!!!!!!!!!!!!".format(tmp,len(data[0])))
+                                            # # #播放失败的时候填充WAV头
+                                            # data_len = len(data[0])
+                                            # data_len_b = data_len.to_bytes(4,'little')#数据长度转16进制数组
+                                            # h_data = [ 0x52 ,0x49 ,0x46 ,0x46 #,0x24 ,0x00 ,0x00 ,0x00 #文件标识、文件大小
+                                            #         ,0x57 ,0x41 ,0x56 ,0x45 ,0x66 ,0x6D ,0x74 ,0x20  #文件格式、格式块标识符
+                                            #         ,0x10 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x80 ,0x3E ,0x00 ,0x00  #格式块大小4、音频格式2、声道数2、采样率4
+                                            #         ,0x80 ,0x3E ,0x00 ,0x00 ,0x02 ,0x00 ,0x10 ,0x00 ,0x64 ,0x61 ,0x74 ,0x61]#每秒字节数4、数据块对齐2、位深度2、data4
+                                            # h_data_b = bytes(h_data)
+                                            # file_len = data_len+len(h_data_b)+4+4
+                                            # file_len_b = file_len.to_bytes(4,'little')#文件长度转16进制数组
+                                            # h_data_b = h_data_b[:4]+file_len_b+h_data_b[4:]+data_len_b
+                                            # #self.aud.playStream(2, h_data_b)#播放音频流
+                                            # tmp= self.aud.playStream(2, h_data_b+data[0])#播放音频流
+                                            # print("3playStream:tmp:{} !!!!!!!!!!!!".format(tmp))
                                     self.AI_client_tts_data_len -=len(data[0])
                                     if len(self.AI_client_chat_play_str) == 0: #播放完了
                                         self.play_end = 1
@@ -2411,9 +2526,22 @@ class AIScreen(Screen):#AI_GUI
 
         if self.record_pcm != None:
             print("Close:record_pcm.close()!!!!!!!!!!!!!!!!!!")
-            self.record_pcm.close()
+            try:
+                self.record_pcm.stream_stop()
+                self.record_pcm.close()
+            except Exception as e:
+                usys.print_exception(e)
             self.record_pcm=None
 
+        if self.play_pcm != None:
+            print("Close:play_pcm.close()!!!!!!!!!!!!!!!!!!")
+            try:
+                self.play_pcm.stream_stop()
+                self.play_pcm.close()
+            except Exception as e:
+                usys.print_exception(e)
+            self.play_pcm=None
+
         self._1S_timer.stop()
         self.AI_send_data_queue.clear()
         print("close:AI_send_data_queue:size:{}".format(self.AI_send_data_queue.size()))
index b68136d..72aae57 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/DBG.7z differ
index 5297572..016d357 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/images/firmware_base_release_pack.zip differ
index effa9a7..20faa87 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/libHeliosAPI.lib differ
index 160f4dd..6f54881 100644 (file)
Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/libraries/ql_common_api.lib differ
index 24f48cc..49b2a5a 100644 (file)
Binary files a/2.sdk/project/W8/ext/static/DIAL_PREV01.png and b/2.sdk/project/W8/ext/static/DIAL_PREV01.png differ
index c3170dc..6a7ae95 100644 (file)
Binary files a/2.sdk/project/W8/ext/static/DIAL_PREV02.png and b/2.sdk/project/W8/ext/static/DIAL_PREV02.png differ
index cb51f24..5e7e1c2 100644 (file)
Binary files a/2.sdk/project/W8/ext/static/bg.png and b/2.sdk/project/W8/ext/static/bg.png differ
index 39fce9c..4ea0dd0 100644 (file)
Binary files a/2.sdk/project/W8/images/customer_fs.bin and b/2.sdk/project/W8/images/customer_fs.bin differ
index 77a6648..a7ee356 100644 (file)
Binary files a/2.sdk/project/W8/images/ext_fs.bin and b/2.sdk/project/W8/images/ext_fs.bin differ
index 25c736d..9759dc7 100644 (file)
@@ -379,6 +379,7 @@ SRC_QSTR += \
                        source/code128_p.c \
                        source/modwlan.c\
                        source/modwlan.c \
+                       source/modmask.c \
                        source/machine_one_wire.c
 
 
index f0c940f..f615e86 100644 (file)
@@ -800,11 +800,11 @@ class AIScreen(Screen):#AI_GUI
             self.play_flag = 0
             self.aud.stopPlayStream()
             self.aud.stopAll()
-            print("talk_end_cancel_cb stop()\r\n")
+            # print("talk_end_cancel_cb stop()\r\n")
             EventMesh.publish("publish_message_event_ui",{"func":self.upload_img,"data":0})
         else:
             self.play_flag = 1
-            print("talk_end_cancel_cb start()\r\n")
+            # print("talk_end_cancel_cb start()\r\n")
             EventMesh.publish("publish_message_event_ui",{"func":self.upload_img,"data":1})
         return
     
@@ -1018,7 +1018,7 @@ class AIScreen(Screen):#AI_GUI
                 #print("最后内容,只有一页 scroll_bottom:{}".format(scroll_bottom))
                 # if(scroll_bottom>200):
                 #     scroll_bottom -= 200
-
+                print("page_change1 只有一页:\r\n")
                 AI_end_screen_list_screen.scroll_to(0,scroll_bottom,lv.ANIM.ON)
                 #AI_end_screen_list_screen.scroll_to_view(lv.ANIM.OFF)
                 AI_end_screen_list_screen2.add_flag(lv.obj.FLAG.HIDDEN) #隐藏2
@@ -1466,7 +1466,7 @@ class AIScreen(Screen):#AI_GUI
         #if self.AI_client_chat_isconnect == 0:
         # 创建客户端, debug=True输出日志, ip和端口需要自己填写, 或者是域名
         try:
-            self.AI_client_chat = uwebsocket.Client.connect('ws://118.145.158.207:80/chat/ws', debug=False)
+            self.AI_client_chat = uwebsocket.Client.connect('ws://118.145.158.207:80/chat/ws?platform=huoshan&is_bot=1', debug=False)
         except Exception as e: #网络连接异常
             usys.print_exception(e)
             print("websocket_connect_chat error!!!\r\n")
@@ -1934,7 +1934,12 @@ class AIScreen(Screen):#AI_GUI
                                     EventMesh.publish("publish_message_event_ui",{"func":self.ai_talk_end_show_text_cb,"data":0})
                                 # AI_label.set_text(self.AI_label_answer)
                             try:
-                                if self.play_flag == 1:
+                                flag = EventMesh.publish("get_lcd_state") #
+                                if flag == 0: #灭屏了不播放音频
+                                    self.aud.stopPlayStream()
+
+                                if self.play_flag == 1 and flag == 1 and AI_talk_end_screen.has_flag(lv.obj.FLAG.HIDDEN) == False:
+                                # if flag == 1:
                                     tmp= self.aud.playStream(3, data[0])#播放音频流
                                     print("出:{},{}!!!".format(len(data[0]),self.AI_client_tts_data_len))
                                     if tmp != 0:
index 8f020d6..3443007 100644 (file)
@@ -645,8 +645,8 @@ alipay_invite_bg.add_style(style_alipay_img_default, lv.PART.MAIN|lv.STATE.DEFAU
 
 #提示词
 alipay_invite_label = lv.label(alipay_invite_bg)
-alipay_invite_label.set_pos(0, 28)
-alipay_invite_label.set_size(240, 50)
+alipay_invite_label.set_pos(5, 35)
+alipay_invite_label.set_size(235, 50)
 alipay_invite_label.set_long_mode(lv.label.LONG.WRAP)
 alipay_invite_label.set_text("请家长用手机支付宝扫一扫")
 alipay_invite_label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
index 8b744ba..c14013c 100644 (file)
@@ -16,7 +16,7 @@ class BtnDevice(Abstract):
         self.__pwk_timer = osTimer()
 
         #self.keypad = machine.KeyPad(5, 5)
-        self.__PowerDownTimeOut = 3000
+        self.__PowerDownTimeOut = 500
         self.__tp = tp
         self.pwk_press = 0
         self.pwk_count = 0
@@ -193,7 +193,10 @@ class BtnDevice(Abstract):
                 self.__pwk_timer.stop()
                 self.pwk_count = 0
                 self.pwk_press = 0
-                EventMesh.publish("btn8_long_press")
+                #EventMesh.publish("btn8_long_press")
+                EventMesh.publish("publish_message_event_ui",{"func":self.AI_success_cb,"data":""}) 
+    def AI_success_cb(self, data):
+        EventMesh.publish("load_screen", {"screen": "AI_success"})
 
     def __ui_callback(self, para):
        # print("para = {}".format(para))
index f0f8f6c..710e964 100644 (file)
@@ -6,71 +6,71 @@
 """
 
 app_bin_816d = [
-0x00, 0x00, 0x00, 0x3c, 0x4d, 0x79, 
-0x02, 0x29, 0xeb, 0x75, 0x91, 0xcc, 0x75, 0x91, 0x00, 0x32, 0x32, 0x22, 0x02, 0x00, 0x03, 0x02, 
-0x2e, 0x51, 0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0x75, 0xf0, 0x09, 0xe5, 0x25, 0x02, 0x0f, 0xac, 
-0x00, 0x02, 0x30, 0xbf, 0x8f, 0x22, 0x8d, 0x23, 0x12, 0x08, 0xae, 0xe2, 0x70, 0x03, 0x02, 0x05, 
+0x00, 0x00, 0x00, 0x3c, 0x51, 0x69, 
+0x02, 0x28, 0xe4, 0x75, 0x91, 0xcc, 0x75, 0x91, 0x00, 0x32, 0x32, 0x22, 0x02, 0x00, 0x03, 0x02, 
+0x2d, 0xbd, 0x74, 0xb6, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xff, 0x22, 0x22, 
+0x00, 0x02, 0x30, 0x2a, 0x8f, 0x22, 0x8d, 0x23, 0x12, 0x08, 0xae, 0xe2, 0x70, 0x03, 0x02, 0x05, 
 0x5d, 0x12, 0x05, 0xf0, 0x12, 0x09, 0xe9, 0x50, 0x18, 0x12, 0x06, 0x39, 0x12, 0x08, 0xae, 0xe4, 
 0xf2, 0xfa, 0xa9, 0x07, 0x7b, 0xfe, 0xef, 0x24, 0x06, 0x7f, 0x06, 0x12, 0x06, 0x60, 0x02, 0x01, 
-0x5a, 0x12, 0x0a, 0xd6, 0xe2, 0x70, 0x53, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x2a, 0x12, 0x06, 0xea, 
+0x5a, 0x12, 0x0a, 0xd6, 0xe2, 0x70, 0x53, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x2a, 0x12, 0x06, 0xea, 
 0x12, 0x0a, 0x00, 0x12, 0x06, 0xe4, 0x12, 0x09, 0x6a, 0x12, 0x05, 0xf0, 0x74, 0x17, 0x93, 0x75, 
-0x34, 0x00, 0xf5, 0x35, 0xaf, 0x2b, 0xae, 0x2a, 0x12, 0x3a, 0x14, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 
-0x29, 0xae, 0x28, 0x12, 0x3a, 0x14, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0xd3, 0xef, 
+0x34, 0x00, 0xf5, 0x35, 0xaf, 0x2b, 0xae, 0x2a, 0x12, 0x35, 0x95, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 
+0x29, 0xae, 0x28, 0x12, 0x35, 0x95, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0xd3, 0xef, 
 0x95, 0x35, 0xee, 0x95, 0x34, 0x40, 0x08, 0x12, 0x0a, 0xd6, 0x74, 0x01, 0xf2, 0x80, 0x20, 0xe4, 
 0xf5, 0x28, 0xf5, 0x29, 0xf5, 0x2a, 0xf5, 0x2b, 0x80, 0x15, 0x12, 0x0a, 0x15, 0x12, 0x06, 0xea, 
-0x12, 0x0a, 0x00, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x08, 0x12, 0x06, 0xea, 0x12, 0x09, 0x6a, 0x12, 
-0x09, 0x09, 0xc0, 0x04, 0x12, 0x06, 0x7c, 0x78, 0x79, 0xe6, 0x24, 0x15, 0x12, 0x06, 0x32, 0x12, 
+0x12, 0x0a, 0x00, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x08, 0x12, 0x06, 0xea, 0x12, 0x09, 0x6a, 0x12, 
+0x09, 0x09, 0xc0, 0x04, 0x12, 0x06, 0x7c, 0x78, 0x71, 0xe6, 0x24, 0x15, 0x12, 0x06, 0x32, 0x12, 
 0x08, 0xc6, 0xd0, 0x00, 0x12, 0x0e, 0x17, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 
 0x23, 0xab, 0x07, 0xae, 0x28, 0xaf, 0x29, 0x12, 0x08, 0xc2, 0x12, 0x0e, 0x17, 0xd0, 0x03, 0xd0, 
-0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x07, 0x8d, 0x12, 0x31, 0x90, 0x8e, 0x28, 0x8f, 0x29, 0x12, 
-0x09, 0x09, 0xc0, 0x04, 0x12, 0x06, 0x7c, 0x78, 0x79, 0xe6, 0x24, 0x17, 0x12, 0x06, 0x32, 0x12, 
+0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x07, 0x8d, 0x12, 0x30, 0xfb, 0x8e, 0x28, 0x8f, 0x29, 0x12, 
+0x09, 0x09, 0xc0, 0x04, 0x12, 0x06, 0x7c, 0x78, 0x71, 0xe6, 0x24, 0x17, 0x12, 0x06, 0x32, 0x12, 
 0x08, 0xc6, 0xd0, 0x00, 0x12, 0x0e, 0x17, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xaf, 
 0x23, 0xab, 0x07, 0xae, 0x2a, 0xaf, 0x2b, 0x12, 0x08, 0xc2, 0x12, 0x0e, 0x17, 0xd0, 0x03, 0xd0, 
-0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x07, 0x8d, 0x12, 0x31, 0x90, 0x8e, 0x2a, 0x8f, 0x2b, 0x78, 
-0x79, 0xe6, 0xff, 0x24, 0x15, 0xf8, 0xe5, 0x28, 0xf2, 0x08, 0xe5, 0x29, 0xf2, 0xa8, 0x07, 0xe8, 
+0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x07, 0x8d, 0x12, 0x30, 0xfb, 0x8e, 0x2a, 0x8f, 0x2b, 0x78, 
+0x71, 0xe6, 0xff, 0x24, 0x15, 0xf8, 0xe5, 0x28, 0xf2, 0x08, 0xe5, 0x29, 0xf2, 0xa8, 0x07, 0xe8, 
 0x24, 0x17, 0xf8, 0xe5, 0x2a, 0xf2, 0x08, 0xe5, 0x2b, 0xf2, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 
-0xff, 0x12, 0x09, 0xf7, 0x9f, 0x50, 0x03, 0x02, 0x05, 0x4c, 0x78, 0x79, 0xe6, 0xfb, 0x24, 0x06, 
+0xff, 0x12, 0x09, 0xf7, 0x9f, 0x50, 0x03, 0x02, 0x05, 0x4c, 0x78, 0x71, 0xe6, 0xfb, 0x24, 0x06, 
 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xfd, 0xac, 0x06, 0xe5, 0x28, 0xa2, 0xe7, 0x13, 0xfe, 0xe5, 0x29, 
 0x12, 0x07, 0xe4, 0xa8, 0x03, 0x12, 0x0a, 0x31, 0x12, 0x0a, 0xc8, 0xd8, 0xfb, 0xff, 0x12, 0x05, 
-0xf0, 0x74, 0x01, 0x93, 0xfc, 0x74, 0x02, 0x93, 0xfd, 0x12, 0x34, 0xc0, 0x8e, 0x24, 0x8f, 0x25, 
-0x78, 0x79, 0xe6, 0xfb, 0x24, 0x08, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xfd, 0xac, 0x06, 0xe5, 0x2a, 
+0xf0, 0x74, 0x01, 0x93, 0xfc, 0x74, 0x02, 0x93, 0xfd, 0x12, 0x34, 0x28, 0x8e, 0x24, 0x8f, 0x25, 
+0x78, 0x71, 0xe6, 0xfb, 0x24, 0x08, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xfd, 0xac, 0x06, 0xe5, 0x2a, 
 0xa2, 0xe7, 0x13, 0xfe, 0xe5, 0x2b, 0x12, 0x07, 0xe4, 0xa8, 0x03, 0xe8, 0x24, 0x02, 0xf8, 0x12, 
 0x0a, 0x31, 0x12, 0x0a, 0xc8, 0xd8, 0xfb, 0xff, 0x12, 0x05, 0xf0, 0x74, 0x03, 0x93, 0xfc, 0x74, 
-0x04, 0x93, 0xfd, 0x12, 0x34, 0xc0, 0x8e, 0x26, 0x8f, 0x27, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 
-0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0x78, 0x79, 0xe6, 0xfd, 0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x9f, 
+0x04, 0x93, 0xfd, 0x12, 0x34, 0x28, 0x8e, 0x26, 0x8f, 0x27, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 
+0x24, 0x0a, 0xff, 0xe4, 0x33, 0xfe, 0x78, 0x71, 0xe6, 0xfd, 0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x9f, 
 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x50, 0x54, 0xa8, 0x05, 0xe8, 0x24, 0x15, 0x12, 0x06, 
-0x32, 0x12, 0x3a, 0x14, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 0xfd, 0x78, 0x79, 0xe6, 0xf9, 0x12, 
+0x32, 0x12, 0x35, 0x95, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 0xfd, 0x78, 0x71, 0xe6, 0xf9, 0x12, 
 0x08, 0x73, 0x24, 0x89, 0xf5, 0x82, 0xe4, 0x34, 0x00, 0x12, 0x09, 0xcb, 0xa8, 0x01, 0xe8, 0x24, 
-0x17, 0x12, 0x06, 0x32, 0x12, 0x3a, 0x14, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 0xfd, 0x78, 0x79, 
+0x17, 0x12, 0x06, 0x32, 0x12, 0x35, 0x95, 0x12, 0x05, 0xf0, 0x74, 0x1e, 0x93, 0xfd, 0x78, 0x71, 
 0xe6, 0x12, 0x08, 0x73, 0x24, 0x9d, 0xf5, 0x82, 0xe4, 0x34, 0x00, 0x12, 0x09, 0xcb, 0x75, 0x38, 
 0x00, 0x75, 0x39, 0x80, 0x75, 0x3a, 0x00, 0x75, 0x3b, 0x80, 0x02, 0x03, 0xbe, 0x12, 0x08, 0x7e, 
 0x24, 0x92, 0xf9, 0x74, 0x00, 0x35, 0xf0, 0xfa, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 
-0x78, 0x79, 0xe6, 0x24, 0x15, 0x12, 0x06, 0x32, 0x12, 0x3a, 0x14, 0xad, 0x07, 0xd0, 0x01, 0xd0, 
-0x02, 0xd0, 0x03, 0x12, 0x33, 0xe6, 0x8e, 0x34, 0x8f, 0x35, 0x12, 0x08, 0x7e, 0x24, 0xa6, 0xf9, 
-0x74, 0x00, 0x35, 0xf0, 0xfa, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x78, 0x79, 0xe6, 
-0x24, 0x17, 0x12, 0x06, 0x32, 0x12, 0x3a, 0x14, 0xad, 0x07, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 
-0x12, 0x33, 0xe6, 0x8e, 0x36, 0x8f, 0x37, 0x12, 0x0a, 0xdd, 0x40, 0x18, 0xe5, 0x35, 0xae, 0x34, 
+0x78, 0x71, 0xe6, 0x24, 0x15, 0x12, 0x06, 0x32, 0x12, 0x35, 0x95, 0xad, 0x07, 0xd0, 0x01, 0xd0, 
+0x02, 0xd0, 0x03, 0x12, 0x33, 0x50, 0x8e, 0x34, 0x8f, 0x35, 0x12, 0x08, 0x7e, 0x24, 0xa6, 0xf9, 
+0x74, 0x00, 0x35, 0xf0, 0xfa, 0x7b, 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x78, 0x71, 0xe6, 
+0x24, 0x17, 0x12, 0x06, 0x32, 0x12, 0x35, 0x95, 0xad, 0x07, 0xd0, 0x01, 0xd0, 0x02, 0xd0, 0x03, 
+0x12, 0x33, 0x50, 0x8e, 0x36, 0x8f, 0x37, 0x12, 0x0a, 0xdd, 0x40, 0x18, 0xe5, 0x35, 0xae, 0x34, 
 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xe5, 0x37, 0x24, 0x01, 0xfd, 0xe4, 
 0x35, 0x36, 0x80, 0x16, 0xe5, 0x37, 0xae, 0x36, 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 
 0xf9, 0xff, 0xe5, 0x35, 0x24, 0x01, 0xfd, 0xe4, 0x35, 0x34, 0xfc, 0x12, 0x0c, 0x7a, 0xab, 0x07, 
-0xaa, 0x06, 0x78, 0x79, 0xe6, 0xf9, 0x24, 0x0f, 0x12, 0x06, 0x32, 0x12, 0x07, 0xea, 0xef, 0x2b, 
+0xaa, 0x06, 0x78, 0x71, 0xe6, 0xf9, 0x24, 0x0f, 0x12, 0x06, 0x32, 0x12, 0x07, 0xea, 0xef, 0x2b, 
 0xff, 0xee, 0x3a, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xfb, 0xaa, 
 0x06, 0xc3, 0x94, 0x28, 0xea, 0x94, 0x00, 0x50, 0x06, 0x7a, 0x00, 0x7b, 0x28, 0x80, 0x0d, 0xd3, 
 0xeb, 0x94, 0x46, 0xea, 0x94, 0x00, 0x40, 0x04, 0x7a, 0x00, 0x7b, 0x46, 0x7c, 0x00, 0x7d, 0x0a, 
 0xaf, 0x03, 0xae, 0x02, 0x12, 0x0c, 0x68, 0xef, 0x24, 0xf0, 0xf5, 0x39, 0xee, 0x34, 0xfe, 0xf5, 
 0x38, 0xeb, 0x25, 0xe0, 0xff, 0xea, 0x33, 0xfe, 0xc3, 0x74, 0xd0, 0x9f, 0xf5, 0x3b, 0xe4, 0x9e, 
 0xf5, 0x3a, 0x12, 0x0a, 0xdd, 0x40, 0x12, 0x85, 0x38, 0x34, 0x85, 0x39, 0x35, 0x85, 0x3a, 0x38, 
-0x85, 0x3b, 0x39, 0x85, 0x34, 0x3a, 0x85, 0x35, 0x3b, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x0f, 0xf8, 
+0x85, 0x3b, 0x39, 0x85, 0x34, 0x3a, 0x85, 0x35, 0x3b, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x0f, 0xf8, 
 0xea, 0xf2, 0x08, 0xeb, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x11, 0x12, 0x06, 0x32, 0x12, 0x07, 0xea, 
 0xe5, 0x39, 0x2f, 0xff, 0xe5, 0x38, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 
-0xd8, 0xf9, 0xf5, 0x39, 0x8e, 0x38, 0x78, 0x79, 0xe6, 0xfb, 0x24, 0x13, 0x12, 0x06, 0x32, 0x12, 
+0xd8, 0xf9, 0xf5, 0x39, 0x8e, 0x38, 0x78, 0x71, 0xe6, 0xfb, 0x24, 0x13, 0x12, 0x06, 0x32, 0x12, 
 0x07, 0xea, 0xe5, 0x3b, 0x2f, 0xff, 0xe5, 0x3a, 0x3e, 0xfe, 0xef, 0x78, 0x02, 0xce, 0xc3, 0x13, 
 0xce, 0x13, 0xd8, 0xf9, 0xf5, 0x3b, 0x8e, 0x3a, 0xeb, 0x24, 0x11, 0xf8, 0xe5, 0x38, 0xf2, 0x08, 
 0xe5, 0x39, 0xf2, 0xe9, 0x24, 0x13, 0xf8, 0xe5, 0x3a, 0xf2, 0x08, 0xe5, 0x3b, 0xf2, 0x12, 0x05, 
 0x8c, 0x7c, 0x00, 0x7d, 0x02, 0x12, 0x0c, 0xcf, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0xa0, 0xd0, 
 0xe0, 0x2f, 0xf5, 0x35, 0xd0, 0xe0, 0x3e, 0xf5, 0x34, 0x12, 0x05, 0xf0, 0xae, 0x34, 0xaf, 0x35, 
 0x12, 0x08, 0xcd, 0x25, 0x35, 0xf5, 0x35, 0xee, 0x35, 0x34, 0xf5, 0x34, 0xd3, 0xe5, 0x35, 0x95, 
-0x39, 0xe5, 0x34, 0x95, 0x38, 0x40, 0x06, 0x85, 0x38, 0x34, 0x85, 0x39, 0x35, 0x78, 0x79, 0xe6, 
+0x39, 0xe5, 0x34, 0x95, 0x38, 0x40, 0x06, 0x85, 0x38, 0x34, 0x85, 0x39, 0x35, 0x78, 0x71, 0xe6, 
 0x24, 0x06, 0x12, 0x06, 0x32, 0xc3, 0xe5, 0x39, 0x95, 0x35, 0xfd, 0xe5, 0x38, 0x95, 0x34, 0xfc, 
 0x12, 0x0f, 0xbe, 0x8f, 0x2f, 0x8e, 0x2e, 0x8d, 0x2d, 0x8c, 0x2c, 0xae, 0x24, 0xaf, 0x25, 0x12, 
 0x08, 0x69, 0xae, 0x34, 0xaf, 0x35, 0x12, 0x0a, 0x9c, 0xef, 0x25, 0x2f, 0xff, 0xee, 0x35, 0x2e, 
@@ -81,7 +81,7 @@ app_bin_816d = [
 0x02, 0x12, 0x0c, 0xcf, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0x8c, 0xd0, 0xe0, 0x2f, 0xf5, 0x37, 
 0xd0, 0xe0, 0x3e, 0xf5, 0x36, 0x12, 0x05, 0xf0, 0xae, 0x36, 0xaf, 0x37, 0x12, 0x08, 0xcd, 0x25, 
 0x37, 0xf5, 0x37, 0xee, 0x35, 0x36, 0xf5, 0x36, 0xd3, 0xe5, 0x37, 0x95, 0x3b, 0xe5, 0x36, 0x95, 
-0x3a, 0x40, 0x06, 0x85, 0x3a, 0x36, 0x85, 0x3b, 0x37, 0x78, 0x79, 0xe6, 0x24, 0x08, 0x12, 0x06, 
+0x3a, 0x40, 0x06, 0x85, 0x3a, 0x36, 0x85, 0x3b, 0x37, 0x78, 0x71, 0xe6, 0x24, 0x08, 0x12, 0x06, 
 0x32, 0xc3, 0xe5, 0x3b, 0x95, 0x37, 0xfd, 0xe5, 0x3a, 0x95, 0x36, 0xfc, 0x12, 0x0f, 0xbe, 0x8f, 
 0x33, 0x8e, 0x32, 0x8d, 0x31, 0x8c, 0x30, 0xae, 0x26, 0xaf, 0x27, 0x12, 0x08, 0x69, 0xae, 0x36, 
 0xaf, 0x37, 0x12, 0x0a, 0x9c, 0xef, 0x25, 0x33, 0xff, 0xee, 0x35, 0x32, 0xfe, 0xed, 0x35, 0x31, 
@@ -89,16 +89,16 @@ app_bin_816d = [
 0x12, 0x0a, 0xa3, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0a, 0x3e, 0xc0, 0x06, 0xc0, 0x07, 0xae, 0x3a, 
 0xaf, 0x3b, 0xab, 0x07, 0xaa, 0x06, 0xe4, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0e, 0xa2, 0x8f, 0x33, 
 0x8e, 0x32, 0x8d, 0x31, 0x8c, 0x30, 0x12, 0x05, 0xf0, 0x74, 0x16, 0x93, 0xf4, 0x60, 0x2d, 0x78, 
-0x79, 0xe6, 0xff, 0x24, 0x0c, 0xf8, 0xe2, 0xb4, 0x01, 0x15, 0xa8, 0x07, 0xe5, 0x2e, 0xf2, 0x08, 
+0x71, 0xe6, 0xff, 0x24, 0x0c, 0xf8, 0xe2, 0xb4, 0x01, 0x15, 0xa8, 0x07, 0xe5, 0x2e, 0xf2, 0x08, 
 0xe5, 0x2f, 0xf2, 0x12, 0x0a, 0x23, 0xe5, 0x32, 0xf2, 0x08, 0xe5, 0x33, 0xf2, 0x80, 0x0d, 0x78, 
-0x79, 0x12, 0x06, 0xd4, 0x12, 0x0a, 0x23, 0xec, 0xf2, 0x08, 0xed, 0xf2, 0x12, 0x09, 0xf7, 0x94, 
+0x71, 0x12, 0x06, 0xd4, 0x12, 0x0a, 0x23, 0xec, 0xf2, 0x08, 0xed, 0xf2, 0x12, 0x09, 0xf7, 0x94, 
 0x14, 0x50, 0x03, 0xe2, 0x04, 0xf2, 0x12, 0x0a, 0x2a, 0x74, 0x01, 0xf2, 0x22, 0x12, 0x0a, 0x2a, 
-0xe2, 0xd3, 0x94, 0x00, 0x40, 0x03, 0xe2, 0x14, 0xf2, 0xe2, 0x70, 0x1f, 0x78, 0x79, 0xe6, 0xff, 
+0xe2, 0xd3, 0x94, 0x00, 0x40, 0x03, 0xe2, 0x14, 0xf2, 0xe2, 0x70, 0x1f, 0x78, 0x71, 0xe6, 0xff, 
 0x24, 0x0d, 0xf8, 0xe4, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x11, 0x12, 0x0a, 0xab, 0x24, 0x13, 0x12, 
-0x0a, 0xab, 0x24, 0x0f, 0xf8, 0xe4, 0xf2, 0x08, 0x74, 0x28, 0xf2, 0x22, 0x78, 0x79, 0xe6, 0x24, 
-0x09, 0xf8, 0xc3, 0xe2, 0x95, 0x27, 0xff, 0x18, 0xe2, 0x95, 0x26, 0xfe, 0x12, 0x3a, 0x14, 0x22, 
-0x78, 0x79, 0xe6, 0x24, 0x07, 0xf8, 0xc3, 0xe2, 0x95, 0x25, 0xff, 0x18, 0xe2, 0x95, 0x24, 0xfe, 
-0x12, 0x3a, 0x14, 0x22, 0xe4, 0x7b, 0x02, 0xfa, 0xf9, 0xf8, 0xaf, 0x00, 0xae, 0x00, 0xad, 0x00, 
+0x0a, 0xab, 0x24, 0x0f, 0xf8, 0xe4, 0xf2, 0x08, 0x74, 0x28, 0xf2, 0x22, 0x78, 0x71, 0xe6, 0x24, 
+0x09, 0xf8, 0xc3, 0xe2, 0x95, 0x27, 0xff, 0x18, 0xe2, 0x95, 0x26, 0xfe, 0x12, 0x35, 0x95, 0x22, 
+0x78, 0x71, 0xe6, 0x24, 0x07, 0xf8, 0xc3, 0xe2, 0x95, 0x25, 0xff, 0x18, 0xe2, 0x95, 0x24, 0xfe, 
+0x12, 0x35, 0x95, 0x22, 0xe4, 0x7b, 0x02, 0xfa, 0xf9, 0xf8, 0xaf, 0x00, 0xae, 0x00, 0xad, 0x00, 
 0xac, 0x00, 0x12, 0x0e, 0xa2, 0xef, 0x25, 0x00, 0xff, 0xee, 0x35, 0x00, 0xfe, 0xed, 0x35, 0x00, 
 0xfd, 0xec, 0x35, 0x00, 0xfc, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0x12, 0x0e, 0xa2, 
 0xef, 0x24, 0xe0, 0xfb, 0xee, 0x34, 0xff, 0xfa, 0xed, 0x34, 0xff, 0xf9, 0xec, 0x34, 0xff, 0xf8, 
@@ -106,7 +106,7 @@ app_bin_816d = [
 0xe4, 0xfc, 0xfd, 0x12, 0x0e, 0x17, 0xe4, 0x7b, 0x64, 0xfa, 0xf9, 0xf8, 0x12, 0x0e, 0xa2, 0x8f, 
 0x00, 0x8e, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xa9, 
 0x00, 0xa8, 0x00, 0xe4, 0xfc, 0xfd, 0xc3, 0x02, 0x0f, 0x4a, 0xe5, 0x2f, 0x25, 0xe0, 0x25, 0xe0, 
-0x24, 0x5f, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x22, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x0c, 0xf8, 
+0x24, 0x5f, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x22, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x0c, 0xf8, 
 0xe4, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 0x15, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0xa8, 0x07, 0xe8, 0x24, 
 0x17, 0xf8, 0xe4, 0xf2, 0x08, 0xf2, 0xfa, 0xa9, 0x07, 0x7b, 0xfe, 0xef, 0x24, 0x2a, 0x7f, 0x04, 
 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x02, 0x0b, 0xc8, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 
@@ -117,7 +117,7 @@ app_bin_816d = [
 0xe4, 0x7b, 0x64, 0xfa, 0xf9, 0xf8, 0x12, 0x0e, 0xa2, 0x8f, 0x00, 0x8e, 0x00, 0x8d, 0x00, 0x8c, 
 0x00, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0xa8, 0x00, 0xe4, 0xfc, 0xfd, 
 0xc3, 0x02, 0x0f, 0x4a, 0xe6, 0xff, 0x24, 0x2a, 0xf8, 0xe2, 0xfd, 0x08, 0xe2, 0xa8, 0x07, 0xcd, 
-0xf2, 0x08, 0xed, 0xf2, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x2c, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 
+0xf2, 0x08, 0xed, 0xf2, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x2c, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 
 0x22, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0x85, 0x00, 0x82, 0x75, 0x83, 0x00, 0xe5, 0x00, 0x12, 
 0x0c, 0x46, 0xe5, 0x00, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x43, 0xf8, 0x22, 0xef, 0x2b, 0xff, 0xee, 
 0x3a, 0xfe, 0xed, 0x39, 0xfd, 0xec, 0x38, 0xfc, 0x22, 0x7a, 0x00, 0x79, 0x01, 0x7b, 0xfe, 0x7e, 
@@ -125,7 +125,7 @@ app_bin_816d = [
 0x24, 0xff, 0xff, 0xee, 0x34, 0xff, 0xfe, 0xe4, 0xfc, 0xfd, 0x22, 0x78, 0x41, 0x7c, 0x00, 0x7d, 
 0x00, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x45, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0b, 0xc8, 0x75, 0x45, 
 0xff, 0x22, 0x93, 0xff, 0xee, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0x12, 0x0e, 0x17, 0xe4, 0x7b, 0x32, 
-0xfa, 0xf9, 0xf8, 0x12, 0x31, 0x90, 0xe5, 0x28, 0x2f, 0xf5, 0x2e, 0xe5, 0x27, 0x3e, 0xf5, 0x2d, 
+0xfa, 0xf9, 0xf8, 0x12, 0x30, 0xfb, 0xe5, 0x28, 0x2f, 0xf5, 0x2e, 0xe5, 0x27, 0x3e, 0xf5, 0x2d, 
 0xd3, 0xe5, 0x2e, 0x94, 0x00, 0xe5, 0x2d, 0x64, 0x80, 0x94, 0x80, 0x22, 0xf8, 0xe2, 0x2f, 0xf5, 
 0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 0xe5, 0x2f, 0x25, 0xe0, 0x25, 0xe0, 0x22, 0xeb, 0x7b, 0x64, 
 0x2f, 0xff, 0xea, 0x3e, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c, 0xfc, 0xe4, 0xfa, 0xf9, 0xf8, 0x22, 
@@ -145,7 +145,7 @@ app_bin_816d = [
 0xe0, 0xf9, 0x22, 0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x9d, 0xfd, 0xe4, 0x94, 0x00, 0xfc, 0xe5, 0x22, 
 0x75, 0xf0, 0x0a, 0xa4, 0x22, 0xae, 0x00, 0xaf, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0xa8, 
 0x00, 0x22, 0xe5, 0x00, 0x25, 0xe0, 0xff, 0xe5, 0x00, 0x33, 0xab, 0x07, 0xfa, 0xe4, 0xf9, 0xf8, 
-0x22, 0x7e, 0x00, 0x7a, 0x00, 0x79, 0x01, 0x7d, 0x00, 0x7b, 0xfe, 0x02, 0x0f, 0xeb, 0x78, 0x79, 
+0x22, 0x7e, 0x00, 0x7a, 0x00, 0x79, 0x01, 0x7d, 0x00, 0x7b, 0xfe, 0x02, 0x0f, 0xeb, 0x78, 0x71, 
 0xe6, 0xff, 0x24, 0x04, 0xf8, 0x22, 0xc3, 0xe5, 0x00, 0x95, 0x00, 0xff, 0xe5, 0x00, 0x95, 0x00, 
 0xfe, 0x22, 0xe4, 0xfa, 0xf9, 0xf8, 0xee, 0x33, 0x95, 0xe0, 0xfd, 0xfc, 0x22, 0x74, 0x18, 0x93, 
 0xfb, 0x7c, 0x00, 0x7d, 0x0a, 0x12, 0x0c, 0x7a, 0xad, 0x03, 0x7c, 0x00, 0x12, 0x0f, 0xbe, 0xef, 
@@ -155,32 +155,32 @@ app_bin_816d = [
 0x94, 0x00, 0xfe, 0xe4, 0xfc, 0xfd, 0x22, 0xc3, 0xe5, 0x00, 0x95, 0x00, 0xfb, 0xe5, 0x00, 0x95, 
 0x00, 0xfa, 0xe4, 0x95, 0x00, 0xf9, 0xe4, 0x95, 0x00, 0x22, 0xe5, 0x00, 0x25, 0x00, 0xff, 0xe5, 
 0x00, 0x35, 0x00, 0xfe, 0xe4, 0x35, 0x00, 0xfd, 0xe4, 0x35, 0x00, 0xfc, 0x22, 0x74, 0x03, 0x93, 
-0xfe, 0x74, 0x04, 0x93, 0xff, 0x78, 0x7a, 0xe6, 0xfd, 0x7c, 0x00, 0x02, 0x0c, 0x7a, 0x93, 0xff, 
+0xfe, 0x74, 0x04, 0x93, 0xff, 0x78, 0x72, 0xe6, 0xfd, 0x7c, 0x00, 0x02, 0x0c, 0x7a, 0x93, 0xff, 
 0xe4, 0xfc, 0xfd, 0x12, 0x0f, 0x7a, 0x12, 0x0e, 0x17, 0xe4, 0x7b, 0x02, 0xfa, 0xf9, 0xf8, 0x22, 
 0x3c, 0xfe, 0xd3, 0xe5, 0x00, 0x9f, 0xe5, 0x00, 0x9e, 0x22, 0xa8, 0x07, 0xe8, 0x24, 0x03, 0xf8, 
 0xc3, 0xe2, 0x9d, 0xf5, 0x2b, 0x18, 0xe2, 0x9c, 0xf5, 0x2a, 0x22, 0xf8, 0xe2, 0x2f, 0xf5, 0x28, 
 0x18, 0xe2, 0x3e, 0xf5, 0x27, 0x22, 0xe6, 0xff, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xef, 0x2d, 0xff, 
-0xe4, 0x3c, 0xc3, 0x13, 0xef, 0x13, 0x22, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0x22, 0x25, 0xe0, 
+0xe4, 0x3c, 0xc3, 0x13, 0xef, 0x13, 0x22, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x22, 0x25, 0xe0, 
 0x24, 0x5d, 0xf8, 0xe2, 0x22, 0x85, 0x40, 0x82, 0x85, 0x3f, 0x83, 0x75, 0xf0, 0x09, 0xe5, 0x21, 
 0x02, 0x0f, 0xac, 0x24, 0x2a, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xef, 0x22, 0xc3, 0xe5, 0x00, 0x9d, 
 0xf5, 0x00, 0xe5, 0x00, 0x9c, 0xf5, 0x00, 0xa8, 0x07, 0xe8, 0x22, 0xf5, 0x83, 0xe5, 0x82, 0x2d, 
 0xf5, 0x82, 0xe5, 0x83, 0x3c, 0xf5, 0x83, 0xef, 0xf0, 0x22, 0xf5, 0x00, 0xea, 0x3e, 0xf5, 0x00, 
 0xe9, 0x3d, 0xf5, 0x00, 0xe8, 0x3c, 0xf5, 0x00, 0x22, 0x74, 0x1e, 0x93, 0xfe, 0xa8, 0x07, 0xe8, 
-0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x9e, 0x22, 0x78, 0x79, 0xe6, 0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x22, 
+0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x9e, 0x22, 0x78, 0x71, 0xe6, 0x24, 0x0d, 0xf8, 0xe2, 0xc3, 0x22, 
 0xa8, 0x07, 0xc3, 0x08, 0xe2, 0x9d, 0xf5, 0x29, 0x18, 0xe2, 0x9c, 0xf5, 0x28, 0x22, 0x75, 0xf0, 
-0x2e, 0xa4, 0x24, 0x03, 0x22, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x06, 0x22, 0xff, 0xae, 0xf0, 0xe4, 
-0xfc, 0xfd, 0x22, 0xa8, 0x07, 0xe8, 0x24, 0x02, 0xf8, 0x22, 0x78, 0x79, 0xe6, 0x24, 0x0e, 0xf8, 
+0x2e, 0xa4, 0x24, 0x03, 0x22, 0x78, 0x71, 0xe6, 0xff, 0x24, 0x06, 0x22, 0xff, 0xae, 0xf0, 0xe4, 
+0xfc, 0xfd, 0x22, 0xa8, 0x07, 0xe8, 0x24, 0x02, 0xf8, 0x22, 0x78, 0x71, 0xe6, 0x24, 0x0e, 0xf8, 
 0x22, 0xe2, 0xfc, 0x08, 0xe2, 0x2f, 0xff, 0xee, 0x3c, 0xfe, 0xef, 0x78, 0x02, 0x22, 0xef, 0x2b, 
 0xff, 0xee, 0x3a, 0xfe, 0xe9, 0x3d, 0xfd, 0xe8, 0x3c, 0xfc, 0x22, 0xe4, 0x7f, 0x01, 0xfe, 0xfd, 
 0xfc, 0x22, 0xab, 0x00, 0xaa, 0x00, 0xa9, 0x00, 0x22, 0xc3, 0xe5, 0x00, 0x9f, 0xf5, 0x00, 0xe5, 
-0x00, 0x9e, 0xf5, 0x00, 0x22, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xfe, 0x22, 0x78, 0x66, 0x12, 
-0x0f, 0x6e, 0x78, 0x62, 0x12, 0x0f, 0x7a, 0xeb, 0x22, 0xe5, 0x31, 0x25, 0x31, 0xf5, 0x31, 0xe5, 
+0x00, 0x9e, 0xf5, 0x00, 0x22, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xfe, 0x22, 0x78, 0x5e, 0x12, 
+0x0f, 0x6e, 0x78, 0x5a, 0x12, 0x0f, 0x7a, 0xeb, 0x22, 0xe5, 0x31, 0x25, 0x31, 0xf5, 0x31, 0xe5, 
 0x30, 0x33, 0xf5, 0x30, 0x22, 0xc3, 0xe5, 0x26, 0x95, 0x28, 0xff, 0xe5, 0x25, 0x95, 0x27, 0xfe, 
 0x22, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0x75, 0xf0, 0x02, 0xe5, 0x00, 0x22, 0xf8, 0xe4, 0xfc, 0xfd, 
 0x02, 0x0e, 0x17, 0x13, 0xfb, 0xaa, 0x06, 0xe4, 0xf9, 0xf8, 0x22, 0xf8, 0xe4, 0xf2, 0x08, 0x74, 
 0x80, 0xf2, 0xa8, 0x07, 0xe8, 0x22, 0xe4, 0xfc, 0xfd, 0xeb, 0x25, 0x00, 0xff, 0xea, 0x35, 0x00, 
 0x22, 0x75, 0xf0, 0x2e, 0xa4, 0x24, 0x01, 0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0x78, 
-0x79, 0xe6, 0x24, 0x19, 0xf8, 0x22, 0x78, 0x79, 0xe6, 0x24, 0x0c, 0xf8, 0x22, 0xd3, 0xe5, 0x35, 
+0x71, 0xe6, 0x24, 0x19, 0xf8, 0x22, 0x78, 0x71, 0xe6, 0x24, 0x0c, 0xf8, 0x22, 0xd3, 0xe5, 0x35, 
 0x95, 0x37, 0xe5, 0x34, 0x95, 0x36, 0x22, 0xe2, 0x2f, 0xf5, 0x26, 0x18, 0xe2, 0x3e, 0xf5, 0x25, 
 0x22, 0x24, 0x40, 0xff, 0xe4, 0x3e, 0xfe, 0x22, 0xe7, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x46, 
 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, 0xe7, 0x09, 0xf0, 0xa3, 
@@ -264,684 +264,684 @@ app_bin_816d = [
 0xe5, 0xf0, 0x28, 0xfe, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0x22, 0xef, 0x4e, 0x60, 0x12, 0xef, 
 0x60, 0x01, 0x0e, 0xed, 0xbb, 0x01, 0x0b, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 
 0xfa, 0x22, 0x89, 0xf0, 0x50, 0x07, 0xf7, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0xbb, 0xfe, 0xfc, 
-0xf3, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0x90, 0x36, 0x03, 0x7d, 0x1f, 0x12, 0x32, 0xb1, 0xee, 
-0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x8a, 0xa0, 0x75, 0x8a, 0x0a, 0xe4, 0x90, 0x00, 0xbb, 
-0xf0, 0x90, 0x00, 0xc1, 0xe0, 0x60, 0x33, 0x14, 0x60, 0x66, 0x24, 0xfc, 0x70, 0x03, 0x02, 0x12, 
-0x1b, 0x04, 0x60, 0x03, 0x02, 0x12, 0x57, 0xe4, 0xf5, 0x18, 0x75, 0x19, 0x04, 0x78, 0x7d, 0xf6, 
-0x90, 0x36, 0x12, 0x93, 0x70, 0x0b, 0x75, 0x4d, 0x36, 0x75, 0x4e, 0x2a, 0x12, 0x3a, 0x2b, 0x8f, 
-0x18, 0x90, 0x01, 0xaa, 0xe5, 0x18, 0xf0, 0x02, 0x12, 0x57, 0xe4, 0x78, 0x7d, 0xf6, 0x12, 0x2f, 
-0x31, 0xef, 0x64, 0x01, 0x60, 0xf8, 0xaf, 0x4e, 0xae, 0x4d, 0x12, 0x20, 0x21, 0xaf, 0x4e, 0xae, 
-0x4d, 0x12, 0x34, 0x70, 0xaf, 0x4e, 0xae, 0x4d, 0x12, 0x35, 0x66, 0xe5, 0x4e, 0x24, 0x9d, 0xff, 
-0xe4, 0x35, 0x4d, 0xfe, 0x12, 0x35, 0x96, 0x12, 0x32, 0xbb, 0xa3, 0x04, 0xf0, 0x02, 0x12, 0x5c, 
-0xe4, 0xf5, 0x18, 0x78, 0x55, 0xf6, 0x90, 0x01, 0xff, 0xe0, 0xff, 0xb4, 0x01, 0x09, 0x90, 0x00, 
-0xc1, 0x74, 0x05, 0xf0, 0x02, 0x12, 0x5c, 0xef, 0xb4, 0x02, 0x0e, 0x90, 0x01, 0xc0, 0xe0, 0xb4, 
-0xca, 0x07, 0x75, 0x4b, 0x01, 0xa3, 0xe0, 0xf5, 0x4c, 0x78, 0x7d, 0x76, 0x01, 0x12, 0x32, 0xc6, 
-0x12, 0x1c, 0xec, 0x78, 0x55, 0xa6, 0x07, 0x12, 0x32, 0x95, 0x74, 0x87, 0x93, 0x70, 0x03, 0x74, 
-0x86, 0x93, 0x60, 0x1b, 0x08, 0xe6, 0xf5, 0x19, 0x08, 0xe6, 0xf5, 0x1a, 0x08, 0xe6, 0xfe, 0x08, 
-0xe6, 0xff, 0x78, 0x56, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x08, 0xa6, 0x19, 0x08, 0xa6, 0x1a, 0x7f, 
-0x5d, 0xe5, 0x4e, 0x24, 0x9d, 0xfd, 0xe4, 0x35, 0x4d, 0xfc, 0x12, 0x2b, 0xb9, 0x8f, 0x18, 0x12, 
-0x32, 0xc6, 0x75, 0x1f, 0x36, 0x75, 0x20, 0x23, 0xad, 0x18, 0x12, 0x19, 0x5d, 0x8f, 0x18, 0x78, 
-0x55, 0xe6, 0xb4, 0x02, 0x17, 0xe4, 0xf5, 0x19, 0xe5, 0x18, 0x64, 0x05, 0x60, 0x05, 0xe5, 0x18, 
-0xb4, 0x0c, 0x03, 0x43, 0x18, 0x80, 0x78, 0x55, 0xa6, 0x0a, 0x80, 0x04, 0xe4, 0x78, 0x55, 0xf6, 
-0x78, 0x5a, 0xe6, 0x70, 0x03, 0x02, 0x11, 0xce, 0xe5, 0x4b, 0x60, 0x03, 0x02, 0x11, 0xce, 0x90, 
-0x01, 0xea, 0xe0, 0xff, 0x30, 0xe2, 0x0b, 0x78, 0x85, 0xe2, 0x24, 0x01, 0xf2, 0x18, 0xe2, 0x34, 
-0x00, 0xf2, 0x78, 0x60, 0xe6, 0x60, 0x04, 0xef, 0x20, 0xe0, 0x0c, 0xe5, 0x18, 0xb4, 0xaa, 0x0f, 
-0x90, 0x01, 0xea, 0xe0, 0x30, 0xe1, 0x08, 0x90, 0x00, 0xc0, 0xe0, 0x04, 0xf0, 0x80, 0x08, 0x90, 
-0x00, 0xc0, 0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x36, 0x08, 0xe4, 0x93, 0x75, 0xf0, 0x64, 0xa4, 
-0xff, 0xd3, 0x78, 0x85, 0xe2, 0x9f, 0x18, 0xe2, 0x95, 0xf0, 0x50, 0x1b, 0x12, 0x32, 0x95, 0x74, 
-0xc0, 0x93, 0x24, 0x02, 0xff, 0xe4, 0x33, 0xfe, 0x90, 0x00, 0xc0, 0xe0, 0xd3, 0x9f, 0xee, 0x64, 
-0x80, 0xf8, 0x74, 0x80, 0x98, 0x40, 0x17, 0x12, 0x31, 0xd4, 0x7f, 0x01, 0x12, 0x3a, 0x36, 0xe4, 
-0x78, 0x5a, 0xf6, 0x78, 0x60, 0xf6, 0x78, 0x5b, 0x76, 0x04, 0x78, 0x61, 0x76, 0x04, 0x12, 0x32, 
-0xc6, 0x78, 0x55, 0xe6, 0xf5, 0x1f, 0xad, 0x18, 0x12, 0x13, 0x0a, 0x78, 0x5a, 0xe6, 0x60, 0x19, 
-0x90, 0x36, 0x06, 0x7d, 0x64, 0x12, 0x32, 0xb1, 0xc3, 0x78, 0x7f, 0xe6, 0x9f, 0x18, 0xe6, 0x9e, 
-0x50, 0x6a, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x80, 0x63, 0x90, 0x01, 0xfe, 0xe0, 0x70, 0x17, 0x78, 
-0x7f, 0xe6, 0x18, 0x46, 0x60, 0x09, 0x08, 0xe6, 0x16, 0x18, 0x70, 0x0a, 0x16, 0x80, 0x07, 0x78, 
-0x7e, 0x76, 0x00, 0x08, 0x76, 0x14, 0x12, 0x32, 0xbb, 0x80, 0x41, 0x12, 0x31, 0xd4, 0x12, 0x32, 
-0x95, 0xe4, 0x93, 0x90, 0x01, 0xcb, 0xf0, 0x90, 0x01, 0xff, 0xe0, 0xb4, 0x01, 0x2e, 0x75, 0x1e, 
-0x01, 0x75, 0x1f, 0x01, 0x75, 0x20, 0x40, 0x75, 0x21, 0x01, 0x75, 0x22, 0x01, 0x75, 0x23, 0x80, 
-0x7b, 0x01, 0x7a, 0x01, 0x79, 0xc0, 0x12, 0x1e, 0x88, 0xe4, 0x90, 0x01, 0xff, 0xf0, 0x75, 0x8a, 
-0xa0, 0x90, 0x00, 0xb8, 0xf0, 0x80, 0xd0, 0xe4, 0x90, 0x00, 0xc1, 0xf0, 0x90, 0x01, 0xe5, 0xe0, 
-0x64, 0x03, 0x60, 0x08, 0x90, 0x01, 0xb5, 0xe0, 0x64, 0x03, 0x70, 0x64, 0x90, 0x36, 0x0e, 0xe4, 
-0x93, 0xf5, 0x18, 0x12, 0x31, 0xd4, 0x7f, 0x01, 0x12, 0x34, 0x9a, 0xe5, 0x18, 0x70, 0x05, 0x90, 
-0xff, 0x11, 0x80, 0x0d, 0xe5, 0x18, 0xb4, 0x01, 0x0c, 0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 
-0xa3, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0x01, 0xb5, 0xe0, 0xb4, 0x03, 0x15, 0x90, 0xff, 0x12, 0xe0, 
-0x54, 0xe3, 0xf0, 0x90, 0xff, 0x11, 0xe0, 0x54, 0xe3, 0xf0, 0x90, 0xff, 0x10, 0xe0, 0x54, 0xe3, 
-0xf0, 0x75, 0x8f, 0x87, 0x75, 0x8e, 0xff, 0x75, 0x8d, 0x87, 0x75, 0x8c, 0xff, 0x12, 0x32, 0x9c, 
-0x75, 0x8a, 0xa0, 0xf0, 0x12, 0x35, 0x04, 0x12, 0x32, 0x9c, 0x75, 0x8a, 0xa0, 0xf0, 0x80, 0xed, 
-0x75, 0x18, 0x27, 0x75, 0x19, 0x10, 0xe5, 0x89, 0x30, 0xe7, 0x0f, 0x75, 0x89, 0x80, 0x90, 0x00, 
-0xbb, 0xe0, 0xc3, 0x94, 0xff, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x90, 0x00, 0xbb, 0xe0, 0xc3, 0x78, 
-0x7d, 0x96, 0x50, 0x15, 0xe5, 0x19, 0x15, 0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e, 0x60, 
-0x08, 0x12, 0x34, 0xe3, 0x12, 0x32, 0x9c, 0x80, 0xe1, 0x22, 0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 
-0x8d, 0x1e, 0x90, 0x01, 0xfa, 0xe0, 0xf5, 0x20, 0xe4, 0xf5, 0x21, 0x85, 0x1f, 0x1f, 0xe5, 0x1e, 
-0x60, 0x04, 0x90, 0x00, 0xc3, 0xf0, 0x7d, 0x01, 0x7f, 0x12, 0x12, 0x31, 0x4c, 0x75, 0x22, 0x01, 
-0x75, 0x23, 0x00, 0x78, 0x82, 0xe6, 0xff, 0x70, 0x0b, 0x74, 0x20, 0x25, 0x23, 0xf5, 0x23, 0xe4, 
+0xf3, 0x09, 0xdf, 0xfc, 0xa9, 0xf0, 0x22, 0x90, 0x36, 0x03, 0x7d, 0x1f, 0x12, 0x31, 0xdd, 0xee, 
+0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x8a, 0xa0, 0x75, 0x8a, 0x0a, 0xe4, 0x90, 0x00, 0xc0, 
+0xf0, 0x90, 0x00, 0xbb, 0xe0, 0x60, 0x33, 0x14, 0x60, 0x72, 0x24, 0xfc, 0x70, 0x03, 0x02, 0x12, 
+0x10, 0x04, 0x60, 0x03, 0x02, 0x12, 0x4c, 0xe4, 0xf5, 0x18, 0x75, 0x19, 0x04, 0x78, 0x75, 0xf6, 
+0x90, 0x36, 0x12, 0x93, 0x70, 0x0b, 0x75, 0x0a, 0x36, 0x75, 0x0b, 0x2a, 0x12, 0x35, 0xb6, 0x8f, 
+0x18, 0x90, 0x01, 0xaa, 0xe5, 0x18, 0xf0, 0x02, 0x12, 0x4c, 0xe4, 0x78, 0x75, 0xf6, 0x12, 0x2e, 
+0x9d, 0xef, 0x64, 0x01, 0x60, 0xf8, 0x90, 0x02, 0xb5, 0x74, 0x01, 0xf0, 0xaf, 0x0b, 0xae, 0x0a, 
+0x12, 0x25, 0x3a, 0xaf, 0x0b, 0xae, 0x0a, 0x12, 0x33, 0xda, 0xaf, 0x0b, 0xae, 0x0a, 0x12, 0x00, 
+0x1f, 0xe5, 0x0b, 0x24, 0x9d, 0xff, 0xe4, 0x35, 0x0a, 0xfe, 0x12, 0x35, 0x35, 0x12, 0x31, 0xe7, 
+0x90, 0x00, 0xb8, 0xf0, 0x90, 0x00, 0xbb, 0x04, 0xf0, 0x02, 0x12, 0x51, 0xe4, 0xf5, 0x18, 0x78, 
+0x4d, 0xf6, 0x90, 0x01, 0xff, 0xe0, 0xff, 0xb4, 0x01, 0x09, 0x90, 0x00, 0xbb, 0x74, 0x05, 0xf0, 
+0x02, 0x12, 0x51, 0xef, 0xb4, 0x02, 0x15, 0x90, 0x01, 0xc0, 0xe0, 0xb4, 0xca, 0x0e, 0x90, 0x00, 
+0xba, 0x74, 0x01, 0xf0, 0x90, 0x01, 0xc1, 0xe0, 0x90, 0x00, 0xbc, 0xf0, 0x78, 0x75, 0x76, 0x01, 
+0x12, 0x31, 0xf2, 0x12, 0x1d, 0x22, 0x78, 0x4d, 0xa6, 0x07, 0x12, 0x31, 0xc1, 0x74, 0x87, 0x93, 
+0x70, 0x03, 0x74, 0x86, 0x93, 0x60, 0x1b, 0x08, 0xe6, 0xf5, 0x19, 0x08, 0xe6, 0xf5, 0x1a, 0x08, 
+0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x78, 0x4e, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x08, 0xa6, 0x19, 0x08, 
+0xa6, 0x1a, 0x7f, 0x5d, 0xe5, 0x0b, 0x24, 0x9d, 0xfd, 0xe4, 0x35, 0x0a, 0xfc, 0x12, 0x2a, 0xb4, 
+0x8f, 0x18, 0x12, 0x31, 0xf2, 0x75, 0x1f, 0x36, 0x75, 0x20, 0x23, 0xad, 0x18, 0x12, 0x19, 0x90, 
+0x8f, 0x18, 0xe4, 0x78, 0x4d, 0xf6, 0x78, 0x52, 0xe6, 0x70, 0x03, 0x02, 0x11, 0xc3, 0x90, 0x00, 
+0xba, 0xe0, 0x70, 0x7f, 0x90, 0x01, 0xea, 0xe0, 0xff, 0x30, 0xe2, 0x0b, 0x78, 0x85, 0xe2, 0x24, 
+0x01, 0xf2, 0x18, 0xe2, 0x34, 0x00, 0xf2, 0x78, 0x58, 0xe6, 0x60, 0x04, 0xef, 0x20, 0xe0, 0x0c, 
+0xe5, 0x18, 0xb4, 0xaa, 0x0f, 0x90, 0x01, 0xea, 0xe0, 0x30, 0xe1, 0x08, 0x90, 0x00, 0xb9, 0xe0, 
+0x04, 0xf0, 0x80, 0x08, 0x90, 0x00, 0xb9, 0xe0, 0x60, 0x02, 0x14, 0xf0, 0x90, 0x36, 0x08, 0xe4, 
+0x93, 0x75, 0xf0, 0x64, 0xa4, 0xff, 0xd3, 0x78, 0x85, 0xe2, 0x9f, 0x18, 0xe2, 0x95, 0xf0, 0x50, 
+0x1b, 0x12, 0x31, 0xc1, 0x74, 0xb2, 0x93, 0x24, 0x02, 0xff, 0xe4, 0x33, 0xfe, 0x90, 0x00, 0xb9, 
+0xe0, 0xd3, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x40, 0x17, 0x12, 0x31, 0x3f, 0x7f, 
+0x01, 0x12, 0x35, 0xbc, 0xe4, 0x78, 0x52, 0xf6, 0x78, 0x58, 0xf6, 0x78, 0x53, 0x76, 0x04, 0x78, 
+0x59, 0x76, 0x04, 0x12, 0x31, 0xf2, 0x78, 0x4d, 0xe6, 0xf5, 0x1f, 0xad, 0x18, 0x12, 0x12, 0xe3, 
+0x78, 0x52, 0xe6, 0x60, 0x19, 0x90, 0x36, 0x06, 0x7d, 0x64, 0x12, 0x31, 0xdd, 0xc3, 0x78, 0x77, 
+0xe6, 0x9f, 0x18, 0xe6, 0x9e, 0x50, 0x6a, 0xa6, 0x06, 0x08, 0xa6, 0x07, 0x80, 0x63, 0x90, 0x01, 
+0xfe, 0xe0, 0x70, 0x17, 0x78, 0x77, 0xe6, 0x18, 0x46, 0x60, 0x09, 0x08, 0xe6, 0x16, 0x18, 0x70, 
+0x0a, 0x16, 0x80, 0x07, 0x78, 0x76, 0x76, 0x00, 0x08, 0x76, 0x14, 0x12, 0x31, 0xe7, 0x80, 0x41, 
+0x12, 0x31, 0x3f, 0x12, 0x31, 0xc1, 0xe4, 0x93, 0x90, 0x01, 0xcb, 0xf0, 0x90, 0x01, 0xff, 0xe0, 
+0xb4, 0x01, 0x2e, 0x75, 0x1e, 0x01, 0x75, 0x1f, 0x01, 0x75, 0x20, 0x40, 0x75, 0x21, 0x01, 0x75, 
+0x22, 0x01, 0x75, 0x23, 0x80, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0xc0, 0x12, 0x1e, 0xc0, 0xe4, 0x90, 
+0x01, 0xff, 0xf0, 0x75, 0x8a, 0xa0, 0x90, 0x00, 0xbd, 0xf0, 0x80, 0xd0, 0xe4, 0x90, 0x00, 0xbb, 
+0xf0, 0x90, 0x01, 0xe5, 0xe0, 0x64, 0x03, 0x60, 0x08, 0x90, 0x01, 0xb5, 0xe0, 0x64, 0x03, 0x70, 
+0x48, 0x12, 0x31, 0x3f, 0x7f, 0x01, 0x12, 0x34, 0xea, 0x90, 0x36, 0x0e, 0xe4, 0x93, 0xff, 0x70, 
+0x05, 0x90, 0xff, 0x11, 0x80, 0x0c, 0xef, 0xb4, 0x01, 0x0c, 0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 
+0xf0, 0xa3, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0x01, 0xb5, 0xe0, 0xb4, 0x03, 0x05, 0x7f, 0x01, 0x12, 
+0x34, 0xce, 0x75, 0x8f, 0x87, 0x75, 0x8e, 0xff, 0x75, 0x8d, 0x87, 0x75, 0x8c, 0xff, 0x12, 0x31, 
+0xc8, 0x12, 0x34, 0x6c, 0x12, 0x31, 0xc8, 0x80, 0xf5, 0x75, 0x18, 0x27, 0x75, 0x19, 0x10, 0xe5, 
+0x89, 0x30, 0xe7, 0x0f, 0x75, 0x89, 0x80, 0x90, 0x00, 0xc0, 0xe0, 0xc3, 0x94, 0xff, 0x50, 0x03, 
+0xe0, 0x04, 0xf0, 0x90, 0x00, 0xc0, 0xe0, 0xc3, 0x78, 0x75, 0x96, 0x50, 0x15, 0xe5, 0x19, 0x15, 
+0x19, 0xae, 0x18, 0x70, 0x02, 0x15, 0x18, 0x4e, 0x60, 0x08, 0x12, 0x34, 0x4b, 0x12, 0x31, 0xc8, 
+0x80, 0xe1, 0x22, 0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 0x8d, 0x1e, 0x90, 0x01, 0xfa, 0xe0, 0xf5, 
+0x20, 0xe4, 0xf5, 0x21, 0x85, 0x1f, 0x1f, 0xe5, 0x1e, 0x60, 0x04, 0x90, 0x00, 0xc7, 0xf0, 0x90, 
+0xff, 0x18, 0xe0, 0x20, 0xe3, 0x2b, 0x90, 0x00, 0xc5, 0xe0, 0x04, 0xf0, 0xe0, 0xc3, 0x94, 0x0a, 
+0x40, 0x24, 0xe4, 0xf0, 0x90, 0x36, 0x0c, 0x93, 0xff, 0x7c, 0x01, 0x7d, 0x00, 0x12, 0x32, 0x00, 
+0x90, 0x36, 0x0d, 0xe4, 0x93, 0xb4, 0x01, 0x0e, 0x90, 0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0x80, 
+0x05, 0xe4, 0x90, 0x00, 0xc5, 0xf0, 0x7d, 0x01, 0x7f, 0x12, 0x12, 0x30, 0xb7, 0x75, 0x22, 0x01, 
+0x75, 0x23, 0x00, 0x78, 0x0f, 0xe6, 0xff, 0x70, 0x0b, 0x74, 0x20, 0x25, 0x23, 0xf5, 0x23, 0xe4, 
 0x35, 0x22, 0xf5, 0x22, 0x74, 0x00, 0x2f, 0xf9, 0xe4, 0x34, 0x01, 0xfa, 0x7b, 0x01, 0xa8, 0x23, 
 0xac, 0x22, 0x7d, 0x01, 0x7e, 0x00, 0x7f, 0x20, 0x12, 0x0b, 0xc8, 0x7e, 0x00, 0x7f, 0x0b, 0x7d, 
 0xff, 0xe5, 0x23, 0x24, 0x09, 0xfb, 0xe4, 0x35, 0x22, 0xfa, 0xa9, 0x03, 0x7b, 0x01, 0x12, 0x0f, 
 0xeb, 0x05, 0x23, 0xe5, 0x23, 0xae, 0x22, 0x70, 0x02, 0x05, 0x22, 0x14, 0xf5, 0x82, 0x8e, 0x83, 
-0xe4, 0xf0, 0x12, 0x2b, 0x9e, 0x90, 0x00, 0x0a, 0x12, 0x2b, 0x5f, 0xff, 0x90, 0x00, 0x04, 0x12, 
-0x0c, 0x07, 0x2f, 0xf5, 0x21, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0xb4, 0x04, 0x09, 0x12, 0x2b, 
-0x84, 0x70, 0x04, 0x90, 0x00, 0xc2, 0xf0, 0x90, 0x00, 0xc2, 0xe0, 0x60, 0x55, 0x14, 0xf0, 0xe0, 
-0xff, 0x7e, 0x04, 0x60, 0x02, 0x7e, 0x08, 0x12, 0x2b, 0x97, 0x90, 0x00, 0x05, 0xee, 0x12, 0x0c, 
-0x46, 0xef, 0x60, 0x0b, 0x12, 0x2b, 0xa8, 0x12, 0x0d, 0x1b, 0xff, 0xae, 0xf0, 0x80, 0x10, 0x90, 
-0x00, 0xc3, 0xe0, 0xff, 0xb4, 0x05, 0x02, 0x80, 0x02, 0x7f, 0x00, 0xef, 0x7f, 0x00, 0xfe, 0x12, 
-0x2b, 0x46, 0x12, 0x2b, 0x5c, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 0x2b, 0xa8, 0x12, 0x0d, 0x1b, 0xfd, 
-0xe5, 0xf0, 0x54, 0x0f, 0xfc, 0xe4, 0x2d, 0xff, 0xee, 0x3c, 0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0x02, 
-0x15, 0x0f, 0x12, 0x2b, 0x5c, 0x70, 0x09, 0x12, 0x2b, 0x84, 0x70, 0x04, 0xe5, 0x1e, 0x60, 0x51, 
-0x12, 0x2b, 0x8a, 0x12, 0x2b, 0x46, 0x12, 0x2b, 0x5c, 0x60, 0x14, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 
-0x0d, 0x1b, 0x24, 0x00, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 0x2b, 0x21, 0x12, 0x2b, 0x68, 0x12, 
-0x2b, 0x7e, 0x60, 0x32, 0xc4, 0x54, 0xf0, 0xfe, 0x90, 0x00, 0x06, 0x12, 0x0d, 0x46, 0x24, 0x00, 
-0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 0x2b, 0x46, 0x12, 0x2b, 0x97, 0x90, 0x00, 0x08, 0x12, 0x0d, 
-0x46, 0x24, 0x00, 0xff, 0xe5, 0xf0, 0x34, 0x10, 0xfe, 0x12, 0x2b, 0x46, 0x12, 0x2b, 0x68, 0x80, 
-0x05, 0xe4, 0x90, 0x00, 0xc3, 0xf0, 0x90, 0x01, 0xfe, 0xe0, 0xd3, 0x94, 0xf0, 0x50, 0x03, 0x02, 
-0x15, 0x0f, 0x12, 0x2b, 0x9e, 0xe5, 0x1f, 0x60, 0x14, 0x12, 0x2b, 0x8c, 0x12, 0x2b, 0x46, 0x7e, 
-0x00, 0x7f, 0x08, 0x7d, 0x00, 0x12, 0x2b, 0xa8, 0x12, 0x0f, 0xeb, 0x80, 0x21, 0x12, 0x2b, 0x8a, 
-0x12, 0x2b, 0x46, 0x12, 0x2b, 0x97, 0x12, 0x0d, 0x1b, 0xff, 0xae, 0xf0, 0x12, 0x2b, 0x21, 0x90, 
-0x00, 0x06, 0x12, 0x2b, 0x3a, 0x12, 0x2b, 0x97, 0x90, 0x00, 0x08, 0x12, 0x2b, 0x40, 0x90, 0x01, 
-0x40, 0x74, 0x40, 0xf0, 0x90, 0x01, 0x60, 0x74, 0x60, 0xf0, 0x75, 0x2a, 0x01, 0x75, 0x2b, 0x41, 
-0x75, 0x28, 0x01, 0x75, 0x29, 0x61, 0xe4, 0xf5, 0x27, 0xaf, 0x27, 0x12, 0x3a, 0x3b, 0xe5, 0x2b, 
-0xfd, 0x24, 0x02, 0xf5, 0x2b, 0xe5, 0x2a, 0xfc, 0x34, 0x00, 0xf5, 0x2a, 0x12, 0x2b, 0xaf, 0xaf, 
-0x27, 0x12, 0x35, 0xe9, 0xef, 0xd3, 0x94, 0x1c, 0x40, 0x06, 0x7e, 0x0f, 0x7f, 0xff, 0x80, 0x05, 
-0xaf, 0x27, 0x12, 0x3a, 0x08, 0xe5, 0x29, 0xfd, 0x24, 0x02, 0xf5, 0x29, 0xe5, 0x28, 0xfc, 0x34, 
-0x00, 0xf5, 0x28, 0x12, 0x2b, 0xaf, 0x05, 0x27, 0xe5, 0x27, 0xc3, 0x94, 0x10, 0x40, 0xba, 0x78, 
-0x82, 0xe6, 0x7f, 0x00, 0x70, 0x02, 0x7f, 0x20, 0x78, 0x82, 0xa6, 0x07, 0xe5, 0x20, 0x20, 0xe7, 
-0x2a, 0x30, 0xe6, 0x0a, 0x12, 0x2b, 0x5c, 0x70, 0x22, 0x12, 0x2b, 0x84, 0x70, 0x1d, 0xe5, 0x20, 
-0x30, 0xe5, 0x0f, 0x12, 0x2b, 0x7e, 0xff, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0x4f, 0x54, 0x84, 
-0x70, 0x09, 0xe5, 0x20, 0x30, 0xe4, 0x0c, 0xe5, 0x1e, 0x60, 0x08, 0x90, 0x01, 0xed, 0xe0, 0xff, 
-0x12, 0x33, 0xb4, 0x22, 0x8f, 0x23, 0xef, 0x12, 0x06, 0x85, 0xe6, 0xf5, 0x2f, 0x12, 0x05, 0xf0, 
-0x12, 0x09, 0x3d, 0x8e, 0x30, 0x8f, 0x31, 0xe5, 0x2f, 0x70, 0x60, 0x75, 0x24, 0x01, 0x12, 0x0a, 
-0x79, 0xe4, 0xf5, 0x29, 0xf5, 0x2a, 0x78, 0x5f, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x5e, 0x12, 
-0x0a, 0xe7, 0x78, 0x63, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x62, 0x12, 0x09, 0x7c, 0xc3, 0x74, 
-0x09, 0x93, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0x12, 0x0a, 0x85, 0x80, 0x04, 0xae, 0x27, 0xaf, 
-0x28, 0x12, 0x08, 0x65, 0x12, 0x05, 0xef, 0x74, 0x09, 0x93, 0xfe, 0x74, 0x0a, 0x12, 0x07, 0x52, 
-0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x27, 0x8f, 0x28, 
-0x78, 0x67, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x66, 0x80, 0x72, 0x78, 0x7a, 0xe6, 0x14, 0x65, 
-0x2f, 0x70, 0x75, 0xf5, 0x24, 0x12, 0x0a, 0x79, 0x12, 0x05, 0xf0, 0x74, 0x03, 0x93, 0xf5, 0x29, 
-0x74, 0x04, 0x93, 0xf5, 0x2a, 0x12, 0x06, 0x2a, 0x12, 0x07, 0x86, 0x24, 0x5e, 0x12, 0x07, 0x7c, 
-0x24, 0x5b, 0x12, 0x06, 0x32, 0x12, 0x07, 0x86, 0x24, 0x5a, 0x12, 0x09, 0x7b, 0xc3, 0x74, 0x0b, 
-0x93, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0x12, 0x0a, 0x85, 0x80, 0x04, 0xae, 0x27, 0xaf, 0x28, 
-0x12, 0x08, 0x65, 0x12, 0x05, 0xef, 0x74, 0x0b, 0x93, 0xfe, 0x74, 0x0c, 0x12, 0x07, 0x52, 0x40, 
-0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x27, 0x8f, 0x28, 0x12, 
-0x07, 0x86, 0x24, 0x57, 0x12, 0x06, 0x32, 0x12, 0x07, 0x86, 0x24, 0x56, 0xf8, 0xe2, 0x2f, 0xf5, 
-0x2c, 0x18, 0xe2, 0x3e, 0xf5, 0x2b, 0x80, 0x79, 0xe5, 0x2f, 0xfd, 0x7c, 0x00, 0xae, 0x30, 0xaf, 
-0x31, 0x12, 0x0c, 0x68, 0xac, 0x06, 0xad, 0x07, 0xe5, 0x30, 0xc3, 0x13, 0xfe, 0xe5, 0x31, 0x13, 
-0x2d, 0xf5, 0x2a, 0xec, 0x3e, 0xf5, 0x29, 0x12, 0x07, 0x86, 0x24, 0x5b, 0x12, 0x06, 0x32, 0x12, 
-0x07, 0x86, 0x24, 0x5a, 0x12, 0x07, 0x7c, 0x24, 0x63, 0x12, 0x06, 0x32, 0x12, 0x07, 0x86, 0x24, 
-0x62, 0x12, 0x09, 0x7b, 0xd3, 0xe5, 0x26, 0x95, 0x28, 0xe5, 0x27, 0x64, 0x80, 0xf8, 0xe5, 0x25, 
-0x64, 0x80, 0x98, 0x40, 0x11, 0xe4, 0xf5, 0x24, 0x85, 0x27, 0x2b, 0x85, 0x28, 0x2c, 0x85, 0x25, 
-0x27, 0x85, 0x26, 0x28, 0x80, 0x0f, 0x75, 0x24, 0x01, 0x85, 0x25, 0x2b, 0x85, 0x26, 0x2c, 0x85, 
-0x27, 0x27, 0x85, 0x28, 0x28, 0x12, 0x06, 0x2a, 0x12, 0x07, 0x86, 0x24, 0x5e, 0xf8, 0x12, 0x0a, 
-0xe7, 0xc3, 0xe5, 0x26, 0x95, 0x2c, 0xf5, 0x26, 0xe5, 0x25, 0x95, 0x2b, 0xf5, 0x25, 0xc3, 0x64, 
-0x80, 0x94, 0x80, 0x50, 0x05, 0xe4, 0xf5, 0x25, 0xf5, 0x26, 0xc3, 0xe5, 0x28, 0x95, 0x2c, 0xf5, 
-0x28, 0xe5, 0x27, 0x95, 0x2b, 0xf5, 0x27, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0xe4, 0xf5, 
-0x27, 0xf5, 0x28, 0x85, 0x27, 0x2b, 0x85, 0x28, 0x2c, 0xae, 0x2b, 0xaf, 0x2c, 0x12, 0x08, 0xc6, 
-0xe4, 0x7b, 0x80, 0xfa, 0xf9, 0xf8, 0x12, 0x06, 0x77, 0xae, 0x30, 0xaf, 0x31, 0x12, 0x0a, 0x9d, 
-0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x26, 0x25, 0x28, 0xcf, 0xe5, 0x25, 0x35, 0x27, 0xcf, 0x24, 0x01, 
-0xcf, 0x34, 0x00, 0xab, 0x07, 0xfa, 0x33, 0x95, 0xe0, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 
-0x0e, 0xa2, 0xef, 0x12, 0x0a, 0xf1, 0xe4, 0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe4, 0x7b, 0x80, 0xfa, 
-0xf9, 0xf8, 0x12, 0x0e, 0xa2, 0x8e, 0x2b, 0x8f, 0x2c, 0xe5, 0x24, 0x60, 0x0e, 0xe5, 0x2a, 0x25, 
-0x2c, 0xf5, 0x2c, 0xe5, 0x29, 0x35, 0x2b, 0xf5, 0x2b, 0x80, 0x0d, 0xc3, 0xe5, 0x2a, 0x95, 0x2c, 
-0xf5, 0x2c, 0xe5, 0x29, 0x95, 0x2b, 0xf5, 0x2b, 0xe5, 0x23, 0x12, 0x0a, 0x0e, 0xf8, 0xe5, 0x2b, 
-0xf2, 0x08, 0xe5, 0x2c, 0xf2, 0x22, 0x43, 0xad, 0x04, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 
-0xff, 0x58, 0xf0, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0x74, 0x26, 0x93, 0xff, 0x90, 0xff, 0x48, 
-0xf0, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 0x74, 0x27, 0x93, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 
-0x40, 0x74, 0x6c, 0xf0, 0x90, 0xff, 0x57, 0x74, 0xff, 0xf0, 0x90, 0xff, 0x56, 0xe4, 0xf0, 0x90, 
-0xff, 0x5f, 0x74, 0xff, 0xf0, 0x90, 0xff, 0x5e, 0xe4, 0xf0, 0x85, 0x52, 0x82, 0x85, 0x51, 0x83, 
-0x22, 0x78, 0x6f, 0xe6, 0xff, 0x78, 0x82, 0xe2, 0xfc, 0x08, 0xe2, 0x2f, 0xf5, 0x82, 0xe4, 0x3c, 
-0xf5, 0x83, 0xe0, 0xff, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 
-0x34, 0x02, 0xf5, 0x83, 0x22, 0x78, 0x6f, 0xe6, 0xff, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x02, 
-0xf5, 0x83, 0xe0, 0x90, 0xff, 0x54, 0xf0, 0x18, 0xe6, 0x24, 0xb5, 0xf5, 0x82, 0xe4, 0x34, 0x02, 
-0xf5, 0x83, 0xe0, 0x90, 0xff, 0x5c, 0xf0, 0xef, 0xc3, 0x13, 0xff, 0xe5, 0x52, 0x24, 0x1a, 0xf5, 
-0x82, 0xe4, 0x35, 0x51, 0xf5, 0x83, 0xe5, 0x82, 0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 
-0xe4, 0x93, 0x90, 0xff, 0x55, 0xf0, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xb8, 0xf0, 0x75, 
-0x8f, 0x80, 0x75, 0x8e, 0x20, 0x75, 0x8a, 0xa0, 0xf0, 0x90, 0xff, 0x43, 0x74, 0x5f, 0xf0, 0x22, 
-0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 
-0x02, 0xf5, 0x83, 0x22, 0x90, 0xff, 0x54, 0xe0, 0x90, 0x01, 0xf0, 0xf0, 0x90, 0xff, 0x5c, 0xe0, 
-0x90, 0x01, 0xf1, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xb8, 0x22, 0xa8, 0x0f, 0xe6, 0xfd, 
-0x08, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf5, 0x82, 0x8a, 0x83, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 
-0xa4, 0x24, 0x03, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0xff, 0xfe, 0xfd, 0xfc, 0xab, 
-0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0x22, 0xab, 0x28, 0xaa, 0x29, 0xa9, 0x2a, 0x22, 0x7f, 
-0xb4, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x01, 0x02, 0x0f, 0xeb, 0x90, 0xff, 0x5e, 0xf0, 0x90, 0xff, 
-0x56, 0xe0, 0xff, 0xa3, 0xe0, 0xd3, 0x9f, 0x22, 0xce, 0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0x78, 
-0x82, 0xe2, 0xfc, 0x08, 0xe2, 0x22, 0x74, 0xb5, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 
-0x83, 0xe0, 0xff, 0xe5, 0x24, 0x22, 0x85, 0x1c, 0x82, 0x85, 0x1b, 0x83, 0xe4, 0x93, 0xff, 0x22, 
-0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0x22, 0x90, 0xff, 0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0x22, 
-0xd3, 0x74, 0x05, 0x93, 0x9f, 0x74, 0x04, 0x93, 0x9e, 0x22, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 
-0x5c, 0xf0, 0x22, 0xed, 0x25, 0x1e, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0x22, 0x90, 0xff, 0x43, 
-0x74, 0x9f, 0xf0, 0x22, 0x78, 0x81, 0xe2, 0x90, 0xff, 0x40, 0xf0, 0x22, 0x74, 0x28, 0x93, 0x90, 
-0xff, 0x55, 0xf0, 0xef, 0xc3, 0x94, 0x08, 0x22, 0xe5, 0x52, 0x24, 0x2b, 0xff, 0xe4, 0x35, 0x51, 
-0xa9, 0x07, 0x22, 0xa3, 0xe0, 0xff, 0xe5, 0x00, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0xa3, 0xe0, 
-0xff, 0xe5, 0x00, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0x90, 0x00, 0x02, 0x12, 0x0d, 0x46, 0xff, 
-0xae, 0xf0, 0x22, 0xe6, 0xff, 0xc3, 0x95, 0x00, 0xf0, 0xe5, 0x00, 0x2f, 0x22, 0x8b, 0x1b, 0x8a, 
-0x1c, 0x89, 0x1d, 0x8d, 0x1e, 0xe4, 0xf5, 0x21, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0xf5, 0x22, 
-0x90, 0x00, 0x0b, 0x12, 0x0c, 0x07, 0x60, 0x08, 0xe4, 0x78, 0x86, 0xf2, 0x90, 0x00, 0xb7, 0xf0, 
-0xe5, 0x22, 0xb4, 0x80, 0x29, 0x78, 0x86, 0x74, 0xff, 0xf2, 0x12, 0x33, 0x52, 0x90, 0x00, 0xb1, 
-0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x33, 0x63, 0x90, 0x00, 0xb3, 0xe5, 0xf0, 0xf0, 0xa3, 
-0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xe0, 0x04, 0xf0, 0x02, 0x1a, 0xf6, 0xe5, 0x22, 
-0x64, 0x08, 0x60, 0x03, 0x02, 0x1a, 0x98, 0x12, 0x33, 0x52, 0xc3, 0x90, 0x00, 0xb2, 0xe0, 0x90, 
-0x00, 0xb1, 0x12, 0x1b, 0x1b, 0x8e, 0x23, 0x8f, 0x24, 0x12, 0x33, 0x5d, 0xc3, 0x90, 0x00, 0xb4, 
-0xe0, 0x90, 0x00, 0xb3, 0x12, 0x1b, 0x1b, 0x12, 0x33, 0x4b, 0x74, 0x01, 0x93, 0xfc, 0x74, 0x02, 
-0x12, 0x33, 0x6b, 0x40, 0x0f, 0x90, 0x01, 0xec, 0xe0, 0x30, 0xe0, 0x08, 0x78, 0x86, 0xe2, 0x54, 
-0xfe, 0x12, 0x33, 0x79, 0xe5, 0x24, 0x2f, 0xfd, 0xe5, 0x23, 0x3e, 0xfc, 0x12, 0x33, 0x4b, 0x74, 
-0x05, 0x93, 0xfb, 0xd3, 0xed, 0x9b, 0xec, 0x94, 0x00, 0x40, 0x08, 0x78, 0x86, 0xe2, 0x54, 0xfc, 
-0x12, 0x33, 0x79, 0x12, 0x33, 0x4b, 0x74, 0x03, 0x93, 0xfc, 0x74, 0x04, 0x12, 0x33, 0x6b, 0x40, 
-0x13, 0x78, 0x86, 0xe2, 0x20, 0xe1, 0x04, 0xe5, 0x1e, 0x60, 0x09, 0x75, 0x21, 0x0c, 0xe4, 0x78, 
-0x86, 0xf2, 0xf5, 0x1e, 0x78, 0x86, 0xe2, 0x54, 0x3c, 0x70, 0x03, 0x02, 0x1a, 0xf6, 0x12, 0x33, 
-0x4b, 0x74, 0x06, 0x93, 0xfd, 0x7c, 0x00, 0xd3, 0xe5, 0x24, 0x9d, 0xe5, 0x23, 0x9c, 0x50, 0x09, 
-0xef, 0x9d, 0xee, 0x9c, 0x50, 0x03, 0x02, 0x1a, 0xf6, 0xd3, 0xef, 0x95, 0x24, 0xee, 0x95, 0x23, 
-0x40, 0x17, 0x12, 0x33, 0x5d, 0xd3, 0x90, 0x00, 0xb4, 0xe0, 0x9f, 0x90, 0x00, 0xb3, 0xe0, 0x95, 
-0xf0, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x01, 0x80, 0x15, 0x12, 0x33, 0x52, 0xd3, 0x90, 0x00, 0xb2, 
-0xe0, 0x9f, 0x90, 0x00, 0xb1, 0xe0, 0x95, 0xf0, 0x7f, 0x04, 0x40, 0x02, 0x7f, 0x03, 0x8f, 0x21, 
-0x78, 0x86, 0xe2, 0x54, 0xc3, 0xf2, 0x80, 0x5e, 0xe5, 0x22, 0xb4, 0x04, 0x09, 0xe4, 0x90, 0x00, 
-0xb5, 0xf0, 0xa3, 0xf0, 0x80, 0x50, 0x12, 0x33, 0x4b, 0x74, 0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 
-0xff, 0xd3, 0x90, 0x00, 0xb6, 0xe0, 0x9f, 0x90, 0x00, 0xb5, 0xe0, 0x9e, 0x50, 0x15, 0x90, 0x01, 
-0xec, 0xe0, 0x30, 0xe0, 0x0e, 0x54, 0x11, 0x64, 0x11, 0x70, 0x2b, 0x90, 0x00, 0xb7, 0xe0, 0x64, 
-0x02, 0x70, 0x23, 0x78, 0x86, 0xe2, 0xff, 0x30, 0xe0, 0x1c, 0x90, 0x00, 0xb7, 0xe0, 0xfe, 0xd3, 
-0x94, 0x02, 0x50, 0x0a, 0xee, 0x7e, 0x0b, 0xb4, 0x01, 0x02, 0x7e, 0x05, 0x8e, 0x21, 0xef, 0x54, 
-0xfe, 0x78, 0x86, 0x12, 0x33, 0x79, 0xc3, 0x90, 0x00, 0xb5, 0xe0, 0x94, 0xff, 0x50, 0x13, 0x12, 
-0x33, 0x4b, 0xe4, 0x93, 0xff, 0x90, 0x00, 0xb6, 0xe0, 0x2f, 0xf0, 0x90, 0x00, 0xb5, 0xe0, 0x34, 
-0x00, 0xf0, 0xe5, 0x1e, 0xaf, 0x1e, 0x70, 0x02, 0xaf, 0x21, 0x22, 0x9f, 0xff, 0xe0, 0x95, 0xf0, 
-0xfe, 0x12, 0x3a, 0x14, 0x22, 0x8f, 0x26, 0x8d, 0x27, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x01, 
-0xf9, 0x74, 0x02, 0x35, 0xf0, 0x75, 0x28, 0x01, 0xf5, 0x29, 0x89, 0x2a, 0x78, 0x77, 0xe6, 0x60, 
-0x01, 0x16, 0x12, 0x18, 0x98, 0x12, 0x19, 0x49, 0xe4, 0xfc, 0xfd, 0xa8, 0x04, 0xc0, 0x05, 0xc0, 
-0x06, 0xc0, 0x07, 0x12, 0x0d, 0x1b, 0xff, 0xae, 0xf0, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xc3, 
-0xef, 0x9b, 0xf5, 0x2e, 0xee, 0x9a, 0xf5, 0x2d, 0xed, 0x99, 0xf5, 0x2c, 0xec, 0x98, 0xf5, 0x2b, 
-0x12, 0x18, 0x98, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0xf5, 0x2f, 0xe4, 0xff, 0xfe, 0x12, 0x18, 
-0x8f, 0xd3, 0x12, 0x0f, 0x34, 0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 
-0x00, 0xe5, 0x26, 0x25, 0xe0, 0x24, 0x5d, 0xf8, 0xee, 0xf2, 0x08, 0xef, 0xf2, 0x78, 0x77, 0xe6, 
-0x60, 0x20, 0x90, 0x36, 0x0b, 0xe4, 0x93, 0x60, 0x03, 0x02, 0x1c, 0x97, 0x12, 0x18, 0x8b, 0xd3, 
-0x12, 0x0f, 0x34, 0x7f, 0x00, 0x40, 0x02, 0x7f, 0x01, 0xef, 0x78, 0x77, 0x56, 0x60, 0x03, 0x02, 
-0x1c, 0x97, 0xae, 0x2d, 0xaf, 0x2e, 0x12, 0x3a, 0x14, 0x12, 0x17, 0xba, 0xc3, 0x12, 0x18, 0xf1, 
-0x50, 0x11, 0xe4, 0x12, 0x18, 0x8b, 0x12, 0x0f, 0x34, 0x40, 0x04, 0x05, 0x2f, 0x80, 0x70, 0x15, 
-0x2f, 0x80, 0x6c, 0x12, 0x18, 0x98, 0x90, 0x00, 0x04, 0x12, 0x0c, 0x07, 0xff, 0x33, 0x95, 0xe0, 
-0xfe, 0xfd, 0xfc, 0xe5, 0x2e, 0x2f, 0xf5, 0x2e, 0xe5, 0x2d, 0x3e, 0xf5, 0x2d, 0xe5, 0x2c, 0x3d, 
-0xf5, 0x2c, 0xe5, 0x2b, 0x3c, 0xf5, 0x2b, 0xe4, 0x7f, 0x78, 0x12, 0x18, 0x8c, 0xd3, 0x12, 0x0f, 
-0x34, 0x40, 0x0c, 0x12, 0x18, 0x98, 0x90, 0x00, 0x02, 0xe4, 0x75, 0xf0, 0x01, 0x80, 0x1c, 0xe5, 
-0x2e, 0x24, 0x78, 0xe4, 0x35, 0x2d, 0xe4, 0x35, 0x2c, 0xfd, 0xe4, 0x35, 0x2b, 0xfc, 0x33, 0x12, 
-0x18, 0x98, 0x50, 0x10, 0x90, 0x00, 0x02, 0x74, 0xff, 0xf5, 0xf0, 0x12, 0x0d, 0x7e, 0x90, 0x00, 
-0x04, 0xe4, 0x80, 0x05, 0x90, 0x00, 0x04, 0xe5, 0x2e, 0x12, 0x0c, 0x46, 0xe4, 0xf5, 0x2f, 0x12, 
-0x17, 0xba, 0x74, 0x01, 0x93, 0xff, 0xd3, 0x64, 0x80, 0xf8, 0xe5, 0x2f, 0x64, 0x80, 0x98, 0x50, 
-0x17, 0xef, 0x33, 0x95, 0xe0, 0xfe, 0xad, 0x2f, 0xed, 0x33, 0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 
-0x3e, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x14, 0xe4, 0xf5, 0x2f, 0x12, 0x18, 0x98, 0x12, 0x0d, 
-0x1b, 0xff, 0x90, 0x00, 0x02, 0xe5, 0xf0, 0x8f, 0xf0, 0x12, 0x0d, 0xea, 0x12, 0x18, 0x98, 0x90, 
-0x00, 0x05, 0xe5, 0x2f, 0x12, 0x0c, 0x46, 0x78, 0x77, 0xe6, 0x70, 0x39, 0x12, 0x18, 0x98, 0x12, 
-0x19, 0x49, 0x90, 0x00, 0x08, 0x12, 0x0d, 0x46, 0xc3, 0x9f, 0xff, 0xe5, 0xf0, 0x9e, 0xfe, 0x12, 
-0x3a, 0x14, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x17, 0xba, 0x74, 0x04, 0x93, 0xfe, 0x74, 0x05, 0x93, 
-0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x0c, 0x68, 0xd3, 0xeb, 0x9f, 0xea, 0x9e, 0x40, 0x06, 0x78, 
-0x75, 0xe6, 0x44, 0x10, 0xf6, 0x05, 0x26, 0x74, 0x0a, 0x25, 0x2a, 0xf5, 0x2a, 0xe4, 0x35, 0x29, 
-0xf5, 0x29, 0x15, 0x27, 0xe5, 0x27, 0x60, 0x03, 0x02, 0x1b, 0x42, 0x22, 0x8b, 0x1b, 0x8a, 0x1c, 
-0x89, 0x1d, 0xe4, 0xf5, 0x1e, 0xfe, 0x7f, 0x0c, 0xfd, 0x12, 0x0f, 0xeb, 0x7f, 0x06, 0x12, 0x08, 
-0xa1, 0x7e, 0x00, 0x7f, 0x06, 0x7a, 0x00, 0x79, 0x2f, 0x12, 0x08, 0xa7, 0x78, 0x7c, 0xe6, 0x14, 
-0x60, 0x26, 0x04, 0x60, 0x03, 0x02, 0x1e, 0x81, 0xe4, 0x78, 0x7b, 0xf6, 0xff, 0x12, 0x3a, 0x36, 
-0x12, 0x22, 0xbc, 0x78, 0x75, 0xe6, 0x30, 0xe4, 0x03, 0x02, 0x1e, 0x85, 0x7f, 0x5c, 0x12, 0x08, 
-0xa1, 0x78, 0x7c, 0x76, 0x01, 0x02, 0x1e, 0x79, 0x12, 0x22, 0xbc, 0x78, 0x75, 0xe6, 0xff, 0x30, 
-0xe4, 0x07, 0xe5, 0x4b, 0x70, 0x03, 0x02, 0x1e, 0x82, 0xef, 0x20, 0xe3, 0x03, 0x02, 0x1e, 0x25, 
-0x90, 0x00, 0x87, 0xe0, 0x30, 0xe1, 0x69, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x20, 0x12, 0x27, 0x4f, 
-0xef, 0x60, 0x5d, 0xe5, 0x20, 0x60, 0x59, 0xe4, 0xf5, 0x21, 0x90, 0x00, 0x87, 0x74, 0x02, 0xf0, 
-0x78, 0x05, 0x14, 0xf2, 0x85, 0x40, 0x82, 0x85, 0x3f, 0x83, 0xe4, 0x93, 0xff, 0xe5, 0x21, 0xd3, 
-0x9f, 0x50, 0x3d, 0x74, 0x01, 0x7e, 0x00, 0xa8, 0x21, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 
-0xce, 0xd8, 0xf9, 0xff, 0xef, 0x55, 0x20, 0x60, 0x23, 0x12, 0x09, 0xa5, 0x74, 0x06, 0x93, 0xff, 
-0x74, 0x07, 0x93, 0x78, 0x01, 0xcf, 0xf2, 0x08, 0xef, 0xf2, 0x12, 0x09, 0xa5, 0x74, 0x08, 0x93, 
-0xff, 0x74, 0x09, 0x93, 0x08, 0xcf, 0xf2, 0x08, 0xef, 0xf2, 0x80, 0x04, 0x05, 0x21, 0x80, 0xb4, 
-0x90, 0x00, 0x87, 0xe0, 0x30, 0xe0, 0x54, 0x75, 0x25, 0x00, 0x75, 0x26, 0x00, 0x75, 0x27, 0x41, 
-0x75, 0x28, 0x00, 0x75, 0x29, 0x00, 0x75, 0x2a, 0x45, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x5d, 0x12, 
-0x26, 0x51, 0xe4, 0xf5, 0x1f, 0xe5, 0x1f, 0x12, 0x06, 0x85, 0xe6, 0xf4, 0x60, 0x1b, 0xe5, 0x1f, 
-0x12, 0x0a, 0xc1, 0xf9, 0xe4, 0xfa, 0x7b, 0xfe, 0xad, 0x1f, 0x12, 0x39, 0xfc, 0xe5, 0x1f, 0x75, 
-0xf0, 0x2e, 0xa4, 0x24, 0x05, 0xf8, 0x74, 0x01, 0xf2, 0x05, 0x1f, 0xe5, 0x1f, 0xc3, 0x94, 0x02, 
-0x40, 0xd3, 0x12, 0x28, 0x49, 0x90, 0x00, 0x87, 0x74, 0x01, 0xf0, 0x78, 0x75, 0xe6, 0x30, 0xe5, 
-0x04, 0x78, 0x7b, 0x76, 0x01, 0x90, 0x00, 0x87, 0xe0, 0xf5, 0x1e, 0x78, 0x79, 0x76, 0x01, 0xe4, 
-0xf5, 0x1f, 0xe5, 0x1f, 0xc3, 0x94, 0x02, 0x50, 0x19, 0x90, 0x00, 0x87, 0xe0, 0x30, 0xe0, 0x05, 
-0xaf, 0x1f, 0x12, 0x35, 0xf6, 0x12, 0x2d, 0xdb, 0x05, 0x1f, 0x78, 0x79, 0x74, 0x2e, 0x26, 0xf6, 
-0x80, 0xe0, 0xa8, 0x1d, 0xac, 0x1c, 0xad, 0x1b, 0x12, 0x07, 0x19, 0xe5, 0x1d, 0x24, 0x06, 0xf9, 
-0xe4, 0x35, 0x1c, 0xa8, 0x01, 0xfc, 0xad, 0x1b, 0x7a, 0x00, 0x79, 0x2f, 0x12, 0x07, 0x1d, 0x78, 
-0x0c, 0xe2, 0x70, 0x11, 0x78, 0x3a, 0xe2, 0x70, 0x0c, 0x90, 0x00, 0x87, 0x74, 0x03, 0xf0, 0x80, 
-0x04, 0xe4, 0x78, 0x7c, 0xf6, 0xaf, 0x1e, 0x22, 0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 0x43, 0xad, 
-0x04, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x37, 
-0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0xe4, 0xf5, 0x24, 0xf5, 0x24, 0x12, 0x32, 0xf0, 0xe5, 
-0x24, 0xc3, 0x9f, 0x50, 0x22, 0xe9, 0x24, 0x0c, 0xf9, 0xe4, 0x3a, 0x12, 0x32, 0xe1, 0xe4, 0xfd, 
-0x12, 0x34, 0x16, 0x12, 0x32, 0xd7, 0x7d, 0x08, 0x12, 0x30, 0x65, 0x12, 0x32, 0xd7, 0xe4, 0xfd, 
-0x12, 0x31, 0x4c, 0x05, 0x24, 0x80, 0xd5, 0x90, 0xff, 0x4a, 0xe4, 0xf0, 0x90, 0xff, 0x50, 0x74, 
-0x0f, 0xf0, 0x90, 0xff, 0x58, 0xe4, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43, 
-0x74, 0x9f, 0xf0, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x12, 0x0b, 0xee, 0x90, 0xff, 0x48, 0xf0, 
-0x90, 0x00, 0x01, 0x12, 0x0c, 0x07, 0x90, 0xff, 0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x0c, 0x07, 
-0x90, 0xff, 0x55, 0xf0, 0x90, 0x00, 0x03, 0x12, 0x0c, 0x07, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 
-0x5c, 0xe4, 0xf0, 0xf5, 0x24, 0x12, 0x32, 0xf0, 0xe5, 0x24, 0xc3, 0x9f, 0x50, 0x5b, 0xe4, 0xf5, 
-0x25, 0x75, 0x26, 0x64, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x03, 0x43, 0x25, 0x01, 0xe5, 0x25, 
-0x64, 0x01, 0x60, 0x03, 0xd5, 0x26, 0xed, 0x12, 0x32, 0xfe, 0x12, 0x32, 0xd7, 0x7d, 0x06, 0x12, 
-0x30, 0x65, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x12, 
-0x32, 0xd7, 0x7d, 0x08, 0x12, 0x30, 0x65, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xab, 
-0x1e, 0xe5, 0x20, 0xf9, 0x24, 0x02, 0xf5, 0x20, 0xe5, 0x1f, 0xfa, 0x34, 0x00, 0xf5, 0x1f, 0xee, 
-0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0x05, 0x24, 0x80, 0x9c, 0xe4, 0xf5, 0x24, 0x90, 0xff, 0x54, 0xf0, 
-0x75, 0x25, 0x01, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 0x12, 0x33, 0x07, 0xf5, 0x83, 0x74, 0xff, 0x12, 
-0x32, 0xd4, 0x7d, 0x07, 0x12, 0x30, 0x65, 0x90, 0xff, 0x55, 0x74, 0x64, 0xf0, 0xe4, 0xf5, 0x26, 
-0x00, 0x90, 0xff, 0x50, 0xe0, 0x30, 0xe7, 0x07, 0x05, 0x26, 0xe5, 0x26, 0xb4, 0xfa, 0xf1, 0xe5, 
-0x25, 0x24, 0x02, 0x90, 0xff, 0x55, 0xf0, 0xe4, 0xf5, 0x26, 0x00, 0x00, 0x05, 0x26, 0xe5, 0x26, 
-0xb4, 0xfa, 0xf7, 0xe4, 0xf5, 0x26, 0x90, 0xff, 0x50, 0xe0, 0x20, 0xe7, 0x09, 0x05, 0x27, 0xe5, 
-0x27, 0xd3, 0x94, 0x28, 0x50, 0x13, 0x05, 0x26, 0xe5, 0x26, 0xb4, 0x64, 0xe9, 0x12, 0x32, 0xfe, 
-0x05, 0x25, 0xe5, 0x25, 0xc3, 0x94, 0x64, 0x40, 0xc6, 0x12, 0x33, 0x07, 0x75, 0x83, 0x00, 0xe5, 
-0x25, 0x12, 0x32, 0xd4, 0x7d, 0x08, 0x12, 0x30, 0x65, 0x12, 0x32, 0xfe, 0x12, 0x32, 0xf0, 0x05, 
-0x24, 0xe5, 0x24, 0xc3, 0x9f, 0x50, 0x03, 0x02, 0x1f, 0x90, 0x90, 0xff, 0x50, 0xe4, 0xf0, 0xff, 
-0x22, 0x8e, 0x1b, 0x8f, 0x1c, 0xe4, 0x78, 0x74, 0xf6, 0x85, 0x1b, 0x51, 0x85, 0x1c, 0x52, 0xe5, 
-0x1c, 0x24, 0x2c, 0xff, 0xe4, 0x35, 0x1b, 0xfa, 0xa9, 0x07, 0x7b, 0xff, 0x78, 0x70, 0x7c, 0x00, 
-0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0b, 0xc8, 0x78, 0x82, 0x74, 0x01, 0xf2, 0x08, 0x74, 
-0xcc, 0xf2, 0x12, 0x18, 0xd6, 0x7e, 0x00, 0xe5, 0x1c, 0x24, 0x06, 0xfd, 0xe4, 0x35, 0x1b, 0xfa, 
-0xa9, 0x05, 0x7b, 0xff, 0x18, 0xe2, 0xfc, 0x08, 0xe2, 0xf8, 0x7d, 0x01, 0x12, 0x0b, 0xc8, 0x90, 
-0x01, 0xa7, 0xe0, 0xff, 0x12, 0x2f, 0x9f, 0x90, 0x00, 0xb9, 0xe0, 0x64, 0x80, 0x70, 0x04, 0xa3, 
-0xe0, 0x64, 0x75, 0x70, 0x3d, 0xf5, 0x1e, 0x12, 0x18, 0xd6, 0xe5, 0x1e, 0xc3, 0x9f, 0x50, 0x32, 
-0xe4, 0xf5, 0x1f, 0x12, 0x18, 0xbf, 0xfd, 0x25, 0x1e, 0x12, 0x17, 0xcc, 0xe5, 0x1f, 0x90, 0x3a, 
-0x3f, 0x93, 0xfe, 0xef, 0x6e, 0x60, 0x0b, 0xe5, 0x1f, 0xc3, 0x94, 0x0f, 0x50, 0x04, 0x05, 0x1f, 
-0x80, 0xe1, 0xe5, 0x1f, 0x90, 0x3a, 0x4e, 0x93, 0xff, 0x12, 0x19, 0x03, 0xef, 0xf0, 0x05, 0x1e, 
-0x80, 0xc5, 0x90, 0x00, 0xb9, 0xe0, 0x64, 0x80, 0x70, 0x04, 0xa3, 0xe0, 0x64, 0x78, 0x70, 0x26, 
-0xf5, 0x1e, 0x12, 0x18, 0xd6, 0xe5, 0x1e, 0xc3, 0x9f, 0x50, 0x1b, 0x12, 0x18, 0xbf, 0xfd, 0x25, 
-0x1e, 0x12, 0x17, 0xcc, 0x64, 0x54, 0x60, 0x04, 0xef, 0xb4, 0x56, 0x06, 0x12, 0x19, 0x03, 0x74, 
-0x15, 0xf0, 0x05, 0x1e, 0x80, 0xdc, 0x7e, 0x00, 0x7d, 0x00, 0x12, 0x18, 0x9f, 0x78, 0x81, 0x74, 
-0x09, 0xf2, 0x78, 0x72, 0xe6, 0xff, 0x20, 0xe3, 0x06, 0x78, 0x81, 0xe2, 0x44, 0x04, 0xf2, 0xef, 
-0x20, 0xe2, 0x06, 0x78, 0x81, 0xe2, 0x44, 0x20, 0xf2, 0xe4, 0x78, 0x76, 0xf6, 0x43, 0x95, 0x80, 
-0x78, 0x72, 0xe6, 0x7f, 0x00, 0x30, 0xe1, 0x02, 0x7f, 0x40, 0xef, 0x44, 0x37, 0x90, 0xff, 0x41, 
-0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0x75, 0x1d, 0x11, 0xe5, 0x1d, 0xf4, 0x60, 0x0c, 0xe4, 
-0xfd, 0xaf, 0x1d, 0x12, 0x31, 0x4c, 0xe4, 0xfd, 0x12, 0x21, 0x60, 0x75, 0x1d, 0x16, 0xe5, 0x1d, 
-0xf4, 0x60, 0x0c, 0xe4, 0xfd, 0xaf, 0x1d, 0x12, 0x31, 0x4c, 0x7d, 0x01, 0x12, 0x21, 0x60, 0x22, 
-0xaf, 0x1d, 0x12, 0x34, 0x16, 0x7d, 0x08, 0xaf, 0x1d, 0x12, 0x30, 0x65, 0x7d, 0x07, 0xaf, 0x1d, 
-0x12, 0x30, 0x65, 0x22, 0x8f, 0x23, 0xef, 0x12, 0x06, 0x85, 0xe6, 0xff, 0x70, 0x04, 0xf5, 0x24, 
-0x80, 0x18, 0x78, 0x7a, 0xe6, 0xfe, 0x14, 0xb5, 0x07, 0x09, 0xee, 0x25, 0xe0, 0x24, 0xfa, 0xf5, 
-0x24, 0x80, 0x07, 0xef, 0x25, 0xe0, 0x24, 0xfe, 0xf5, 0x24, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x61, 
-0x12, 0x06, 0x32, 0xe5, 0x24, 0x12, 0x07, 0xa0, 0xfe, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x66, 0x12, 
-0x07, 0xa4, 0xfe, 0xe4, 0xfc, 0xfd, 0x78, 0x62, 0x12, 0x0f, 0x87, 0xe5, 0x24, 0x25, 0xe0, 0x24, 
-0x63, 0x12, 0x06, 0x32, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x60, 0x12, 0x07, 0xa4, 0xfe, 0xe5, 0x24, 
-0x25, 0xe0, 0x24, 0x68, 0x12, 0x07, 0xa4, 0xfe, 0xe4, 0xfc, 0xfd, 0x78, 0x66, 0x12, 0x0f, 0x87, 
-0x12, 0x05, 0xf0, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x78, 0x66, 0x12, 0x09, 0x4e, 0x12, 0x0e, 
-0x17, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0xf0, 0x78, 0x66, 0x12, 0x08, 
-0x15, 0x12, 0x0e, 0x17, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x12, 0x07, 0x0c, 0xc0, 
-0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0xf0, 0x74, 0x05, 0x93, 0xfe, 0x74, 0x06, 
-0x78, 0x62, 0x12, 0x09, 0x4e, 0x12, 0x06, 0x77, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 
-0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x99, 0xfd, 0xec, 0x98, 0xfc, 0x78, 0x6a, 0x12, 
-0x0f, 0x87, 0x78, 0x6a, 0x12, 0x0f, 0x6e, 0xec, 0x33, 0x50, 0x0b, 0x78, 0x62, 0x12, 0x0f, 0x93, 
-0x00, 0x00, 0x00, 0x01, 0x80, 0x5b, 0x12, 0x0a, 0x6d, 0x7b, 0x02, 0x12, 0x07, 0x90, 0x12, 0x0e, 
-0xa2, 0x78, 0x6a, 0x12, 0x0f, 0x7a, 0x12, 0x07, 0x0c, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 
-0x07, 0x12, 0x0a, 0x6d, 0x2f, 0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 0xf9, 0xe8, 0x3c, 0xf8, 0xd0, 
-0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x0e, 0xa2, 0x78, 0x62, 0x12, 0x0f, 0x87, 0x12, 
-0x05, 0xf0, 0x78, 0x62, 0x12, 0x08, 0x15, 0xd3, 0x12, 0x0f, 0x4a, 0x40, 0x14, 0x12, 0x05, 0xf0, 
-0x74, 0x02, 0x93, 0x24, 0xff, 0xff, 0x74, 0x01, 0x93, 0x12, 0x07, 0x34, 0x78, 0x62, 0x12, 0x0f, 
-0x87, 0x78, 0x62, 0x12, 0x0f, 0x6e, 0xe5, 0x23, 0x12, 0x07, 0xd7, 0x22, 0xe4, 0x78, 0x75, 0xf6, 
-0x18, 0xe6, 0x14, 0x70, 0x03, 0x02, 0x23, 0x4d, 0x14, 0x70, 0x03, 0x02, 0x23, 0xc7, 0x24, 0x02, 
-0x60, 0x03, 0x02, 0x23, 0xe9, 0x12, 0x17, 0xba, 0xe4, 0x93, 0x78, 0x78, 0xf6, 0x12, 0x31, 0xd4, 
-0x12, 0x30, 0x05, 0x78, 0x70, 0xe6, 0xf5, 0x23, 0x75, 0x24, 0x20, 0x76, 0x40, 0x7e, 0x00, 0x7f, 
-0x12, 0x7d, 0x20, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0xb5, 0x12, 0x0f, 0xeb, 0xe5, 0x24, 0xd3, 0x94, 
-0x01, 0x40, 0x42, 0x12, 0x23, 0xee, 0xe5, 0x22, 0xc3, 0x78, 0x78, 0x96, 0x50, 0x2f, 0x12, 0x17, 
-0xba, 0x74, 0x02, 0x93, 0x75, 0xf0, 0xa3, 0xa4, 0xff, 0xae, 0xf0, 0x12, 0x17, 0xd5, 0xe0, 0xfc, 
-0xa3, 0xe0, 0xc3, 0x9f, 0xec, 0x9e, 0x50, 0x08, 0x12, 0x18, 0xc6, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 
-0x12, 0x18, 0xc6, 0xc3, 0x13, 0xfe, 0xef, 0x4e, 0xf0, 0x05, 0x22, 0x80, 0xc9, 0xe5, 0x24, 0xc3, 
-0x13, 0xf5, 0x24, 0x80, 0xb7, 0x78, 0x70, 0xa6, 0x23, 0x78, 0x74, 0x76, 0x01, 0x12, 0x17, 0xba, 
-0x74, 0x05, 0x93, 0x25, 0xe0, 0xf5, 0x25, 0x74, 0x04, 0x93, 0x33, 0xf5, 0x24, 0xe4, 0x78, 0x77, 
-0xf6, 0xfe, 0xfd, 0x12, 0x18, 0x9f, 0x7e, 0x00, 0x7f, 0x24, 0x7d, 0x00, 0x7b, 0xfe, 0x7a, 0x00, 
-0x79, 0x5d, 0x12, 0x0f, 0xeb, 0x75, 0x23, 0x04, 0x12, 0x31, 0xd4, 0x12, 0x23, 0xee, 0xe5, 0x22, 
-0xc3, 0x78, 0x78, 0x96, 0x50, 0x3a, 0x12, 0x17, 0xd5, 0xe0, 0xfe, 0xa3, 0xe0, 0x78, 0x02, 0xce, 
-0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x12, 0x18, 0x7b, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0x05, 
-0x12, 0x18, 0x7b, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x09, 
-0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05, 0x22, 0x80, 0xbe, 
-0xd5, 0x23, 0xb8, 0x78, 0x74, 0x76, 0x02, 0x12, 0x31, 0xd4, 0x12, 0x29, 0x1e, 0x78, 0x78, 0xe6, 
-0xfd, 0xe4, 0xff, 0x12, 0x2e, 0xc1, 0x78, 0x75, 0xe6, 0x30, 0xe1, 0x04, 0x78, 0x77, 0x76, 0x28, 
-0x78, 0x78, 0xe6, 0xfd, 0xe4, 0xff, 0x02, 0x1b, 0x25, 0xe4, 0x78, 0x74, 0xf6, 0x22, 0x12, 0x29, 
-0x1e, 0x12, 0x31, 0xd4, 0xe4, 0xf5, 0x22, 0x22, 0x8b, 0x1e, 0x8a, 0x1f, 0x89, 0x20, 0x43, 0xad, 
-0x04, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x80, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 
-0xa3, 0xe4, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x7d, 0xf0, 0x90, 0xff, 
-0x54, 0xe4, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x90, 0xff, 0x48, 0x74, 0x10, 0xf0, 0xe4, 0xf5, 0x25, 
-0xf5, 0x26, 0xf5, 0x27, 0xf5, 0x28, 0xf5, 0x24, 0xe4, 0x12, 0x35, 0x33, 0xf4, 0x60, 0x0d, 0xe4, 
-0xfd, 0x12, 0x31, 0x4c, 0x12, 0x35, 0x3b, 0x7d, 0x08, 0x12, 0x30, 0x65, 0x12, 0x35, 0x25, 0xf4, 
-0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x31, 0x4c, 0x12, 0x35, 0x25, 0x7d, 0x08, 0x12, 0x30, 0x65, 0xe4, 
-0xff, 0x00, 0x0f, 0xbf, 0xc8, 0xfb, 0x74, 0x03, 0x12, 0x35, 0x33, 0xf4, 0x60, 0x0d, 0xe4, 0xfd, 
-0x12, 0x34, 0x16, 0x12, 0x35, 0x3b, 0x7d, 0x07, 0x12, 0x30, 0x65, 0x12, 0x35, 0x25, 0xf4, 0x60, 
-0x0d, 0x7d, 0x01, 0x12, 0x34, 0x16, 0x12, 0x35, 0x25, 0x7d, 0x07, 0x12, 0x30, 0x65, 0x90, 0xff, 
-0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 
-0x40, 0x74, 0x09, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xb8, 0xf0, 0x90, 0xff, 0x43, 0xe0, 
-0x30, 0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 
-0x25, 0x26, 0xf5, 0x26, 0xee, 0x35, 0x25, 0xf5, 0x25, 0x90, 0xff, 0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 
-0x25, 0x28, 0xf5, 0x28, 0xee, 0x35, 0x27, 0xf5, 0x27, 0x05, 0x24, 0xe5, 0x24, 0xc3, 0x94, 0x04, 
-0x50, 0x03, 0x02, 0x24, 0x38, 0xe5, 0x26, 0xae, 0x25, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 
-0xd8, 0xf9, 0xff, 0xab, 0x21, 0xaa, 0x22, 0xa9, 0x23, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0xe5, 
-0x28, 0xae, 0x27, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xab, 0x21, 0xaa, 
-0x22, 0xa9, 0x23, 0x90, 0x00, 0x02, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0xea, 0x12, 0x35, 0x3b, 0xf4, 
-0x60, 0x05, 0xe4, 0xfd, 0x12, 0x30, 0x65, 0x12, 0x35, 0x25, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 
-0x30, 0x65, 0x22, 0x15, 0x0f, 0x15, 0x0f, 0x15, 0x0f, 0xa8, 0x0f, 0xa6, 0x03, 0x08, 0xa6, 0x02, 
-0x08, 0xa6, 0x01, 0x15, 0x0f, 0x12, 0x19, 0x0d, 0x78, 0x73, 0xe6, 0x7f, 0x08, 0x30, 0xe0, 0x02, 
-0x7f, 0x05, 0xa8, 0x0f, 0xa6, 0x07, 0x12, 0x17, 0xc1, 0x12, 0x18, 0x6c, 0x12, 0x0f, 0xbc, 0x78, 
-0x73, 0xe6, 0x64, 0x03, 0x78, 0x6e, 0x60, 0x08, 0x12, 0x17, 0xc3, 0x12, 0x18, 0x6c, 0x80, 0x0a, 
-0x12, 0x17, 0xc3, 0xa8, 0x0f, 0x12, 0x18, 0x70, 0x7d, 0x08, 0x12, 0x0f, 0xbc, 0x12, 0x18, 0xe0, 
-0xff, 0x78, 0x6f, 0xe6, 0x12, 0x18, 0x46, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x18, 0xe8, 0xff, 
-0x18, 0xe6, 0x12, 0x18, 0x46, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x02, 0x00, 0xe0, 0x60, 0x2e, 
-0x08, 0xe6, 0xff, 0x12, 0x17, 0xd7, 0x12, 0x18, 0x40, 0x12, 0x26, 0x43, 0x12, 0x17, 0xba, 0x12, 
-0x18, 0xf0, 0x40, 0x1a, 0x78, 0x6e, 0xe6, 0xff, 0x12, 0x17, 0xd7, 0x12, 0x18, 0x40, 0x12, 0x26, 
-0x43, 0x12, 0x17, 0xba, 0x12, 0x18, 0xf0, 0x40, 0x05, 0xe4, 0x90, 0x02, 0x00, 0xf0, 0x90, 0x02, 
-0x00, 0xe0, 0x70, 0x1b, 0x78, 0x6f, 0x06, 0x06, 0x18, 0x06, 0x06, 0x78, 0x76, 0x16, 0x78, 0x72, 
-0xe6, 0x7f, 0x00, 0x20, 0xe4, 0x02, 0x7f, 0x01, 0x90, 0x02, 0x00, 0xef, 0xf0, 0x80, 0x05, 0xe4, 
-0x90, 0x02, 0x00, 0xf0, 0x78, 0x76, 0xe6, 0x70, 0x0a, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 
-0xf0, 0x80, 0x39, 0x12, 0x17, 0xe5, 0xa8, 0x0f, 0x76, 0x64, 0x90, 0xff, 0x58, 0xe0, 0xff, 0x90, 
-0xff, 0x50, 0xe0, 0x4f, 0x30, 0xe7, 0x06, 0xa8, 0x0f, 0x16, 0xe6, 0x70, 0xed, 0x12, 0x17, 0xc1, 
-0xa8, 0x0f, 0x12, 0x18, 0x70, 0x7d, 0x06, 0x12, 0x0f, 0xbc, 0x78, 0x6e, 0x12, 0x17, 0xc3, 0xa8, 
-0x0f, 0x12, 0x18, 0x70, 0x7d, 0x06, 0x12, 0x0f, 0xbc, 0x12, 0x19, 0x14, 0xe5, 0x0f, 0x24, 0x04, 
-0xf5, 0x0f, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xc3, 0x9d, 0xff, 0xee, 0x9c, 0xfe, 0x12, 0x3a, 0x14, 
-0x22, 0x8b, 0x22, 0x8a, 0x23, 0x89, 0x24, 0x12, 0x2c, 0x4e, 0x12, 0x2c, 0xd5, 0x12, 0x32, 0x95, 
-0x74, 0x79, 0x93, 0xf5, 0x2b, 0xe4, 0xf5, 0x2c, 0x12, 0x32, 0xcd, 0x12, 0x0b, 0xee, 0x70, 0x21, 
-0x12, 0x32, 0x95, 0x74, 0x98, 0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x7f, 0x00, 0x50, 
-0x02, 0x7f, 0x01, 0x12, 0x27, 0x17, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0x7e, 0x75, 0x2c, 0x03, 0x80, 
-0x3a, 0x12, 0x32, 0xcd, 0x12, 0x0b, 0xee, 0xff, 0xe5, 0x2b, 0x14, 0x6f, 0x70, 0x2d, 0x12, 0x32, 
-0x95, 0x74, 0x99, 0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x2b, 0x50, 0x06, 0x25, 
-0xe0, 0x14, 0xff, 0x80, 0x05, 0x25, 0xe0, 0x24, 0xfe, 0xff, 0x12, 0x27, 0x17, 0xee, 0x8f, 0xf0, 
-0x12, 0x0d, 0x7e, 0xe5, 0x2b, 0x25, 0xe0, 0x24, 0xfd, 0xf5, 0x2c, 0xe5, 0x2c, 0x60, 0x47, 0x24, 
-0xff, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xab, 0x22, 0xaa, 0x23, 
-0xa9, 0x24, 0x8f, 0x82, 0xf5, 0x83, 0x12, 0x0d, 0x46, 0xff, 0xae, 0xf0, 0x75, 0xf0, 0x02, 0xe5, 
-0x2c, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x12, 0x0d, 0x46, 0x2f, 0xff, 0xee, 0x35, 0xf0, 0xfe, 
-0x12, 0x32, 0x95, 0xd3, 0x74, 0x9b, 0x93, 0x9f, 0x74, 0x9a, 0x93, 0x9e, 0x40, 0x08, 0x12, 0x32, 
-0xcd, 0x74, 0xff, 0x12, 0x0c, 0x34, 0x22, 0x8f, 0x2c, 0xaf, 0x2d, 0xef, 0x33, 0x95, 0xe0, 0xfe, 
-0x12, 0x3a, 0x14, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 
-0x82, 0x85, 0xf0, 0x83, 0x12, 0x0d, 0x46, 0xfd, 0xac, 0xf0, 0xcf, 0xcd, 0xcf, 0xce, 0xcc, 0xce, 
-0x12, 0x0c, 0x7a, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x22, 0x8b, 
-0x22, 0x8a, 0x23, 0x89, 0x24, 0xe4, 0xf5, 0x27, 0xf5, 0x0a, 0xf5, 0x25, 0xf5, 0x26, 0xf5, 0x27, 
-0x85, 0x09, 0x82, 0x85, 0x08, 0x83, 0xe4, 0x93, 0xff, 0xe5, 0x25, 0xc3, 0x9f, 0x40, 0x03, 0x02, 
-0x28, 0x16, 0x12, 0x00, 0x18, 0x74, 0x01, 0x93, 0xf5, 0x28, 0x12, 0x00, 0x12, 0x74, 0x02, 0x93, 
-0xf5, 0x29, 0x12, 0x00, 0x12, 0x74, 0x04, 0x93, 0xfc, 0x74, 0x05, 0x93, 0xfd, 0xe5, 0x28, 0x25, 
-0xe0, 0x24, 0x5d, 0xf8, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0xd3, 0x9d, 0xee, 0x9c, 0x40, 0x72, 0x7c, 
-0x00, 0x7d, 0x05, 0x12, 0x0c, 0x68, 0xe5, 0x29, 0x25, 0xe0, 0x24, 0x5e, 0xf8, 0xe2, 0x24, 0x01, 
-0xfd, 0x18, 0xe2, 0x34, 0x00, 0xfc, 0x12, 0x0c, 0x7a, 0x8e, 0x2a, 0x8f, 0x2b, 0x12, 0x00, 0x12, 
-0x74, 0x03, 0x93, 0x30, 0xe7, 0x2b, 0x54, 0x7f, 0xc3, 0x95, 0x2b, 0xff, 0xe4, 0x95, 0x2a, 0xfe, 
-0x12, 0x3a, 0x14, 0xc3, 0x74, 0x03, 0x9f, 0xee, 0x64, 0x80, 0xf8, 0x74, 0x80, 0x98, 0x40, 0x2e, 
-0xaf, 0x25, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x26, 0x80, 
-0x1d, 0x12, 0x00, 0x12, 0x74, 0x03, 0x93, 0xc3, 0x95, 0x2b, 0xe4, 0x95, 0x2a, 0x50, 0x0f, 0xaf, 
-0x25, 0x74, 0x01, 0xa8, 0x07, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0x42, 0x26, 0x75, 0x27, 
-0x01, 0x05, 0x25, 0x02, 0x27, 0x60, 0xe5, 0x26, 0x65, 0x0e, 0x60, 0x08, 0x85, 0x26, 0x0e, 0xe4, 
-0xf5, 0x0b, 0x80, 0x17, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x74, 0x1e, 0x93, 0xff, 0x05, 0x0b, 
-0xe5, 0x0b, 0xc3, 0x9f, 0x40, 0x05, 0x15, 0x0b, 0x85, 0x26, 0x0a, 0xab, 0x22, 0xaa, 0x23, 0xa9, 
-0x24, 0xe5, 0x0a, 0x12, 0x0c, 0x34, 0xaf, 0x27, 0x22, 0xe4, 0xf5, 0x22, 0xf5, 0x23, 0xff, 0xfe, 
-0x78, 0x33, 0xe2, 0x25, 0xe0, 0xfd, 0x78, 0x05, 0xe2, 0x2d, 0xfd, 0x78, 0x0b, 0xe2, 0xc4, 0x54, 
-0xf0, 0x2d, 0xfd, 0x78, 0x39, 0xe2, 0xfc, 0xc4, 0x33, 0x54, 0xe0, 0x2d, 0x24, 0xfe, 0x60, 0x1c, 
-0x24, 0xf0, 0x60, 0x18, 0x14, 0x60, 0x1d, 0x24, 0xf2, 0x60, 0x11, 0x24, 0xfe, 0x60, 0x25, 0x24, 
-0xf0, 0x60, 0x35, 0x24, 0x02, 0x70, 0x66, 0xe4, 0xfd, 0xff, 0x80, 0x1c, 0x75, 0x22, 0x00, 0x75, 
-0x23, 0x01, 0x80, 0x59, 0xe4, 0xfd, 0xff, 0x12, 0x31, 0x06, 0x8e, 0x22, 0x8f, 0x23, 0xe4, 0xfd, 
-0x7f, 0x01, 0x80, 0x0f, 0x7d, 0x01, 0x7f, 0x01, 0x12, 0x31, 0x06, 0x8e, 0x22, 0x8f, 0x23, 0x7d, 
-0x01, 0xe4, 0xff, 0x12, 0x31, 0x06, 0x80, 0x35, 0x7d, 0x01, 0x7f, 0x01, 0x12, 0x31, 0x06, 0xc0, 
-0x06, 0xc0, 0x07, 0xe4, 0xfd, 0xff, 0x12, 0x31, 0x06, 0xd0, 0xe0, 0x2f, 0xf5, 0x23, 0xd0, 0xe0, 
-0x3e, 0xf5, 0x22, 0xe4, 0xfd, 0x7f, 0x01, 0x12, 0x31, 0x06, 0xc0, 0x06, 0xc0, 0x07, 0x7d, 0x01, 
-0xe4, 0xff, 0x12, 0x31, 0x06, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0xd3, 0xe5, 0x23, 
-0x9f, 0xe5, 0x22, 0x9e, 0x40, 0x27, 0x78, 0x24, 0x7c, 0x00, 0x7d, 0x00, 0x12, 0x07, 0x19, 0x78, 
-0x01, 0x7c, 0x00, 0x7d, 0xfe, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x2f, 0x12, 0x07, 0x1f, 0x78, 0x2f, 
-0x7c, 0x00, 0x7d, 0xfe, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x12, 0x07, 0x1f, 0x22, 0x12, 0x30, 
-0x05, 0x90, 0xff, 0x4a, 0x74, 0x71, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 
-0xf0, 0x90, 0xff, 0x40, 0xe4, 0xf0, 0x12, 0x19, 0x0d, 0xe4, 0x12, 0x18, 0xfa, 0x78, 0x71, 0xe6, 
-0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x28, 0xf0, 0x90, 0xff, 0x48, 0x74, 0x02, 0xf0, 
-0x43, 0xad, 0x04, 0x12, 0x19, 0x14, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x05, 0x12, 0x34, 0xe3, 
-0x80, 0xf4, 0x12, 0x19, 0x0d, 0xe4, 0x78, 0x6f, 0xf6, 0x18, 0x76, 0x01, 0x78, 0x78, 0xe6, 0xc3, 
-0x13, 0x78, 0x76, 0xf6, 0x78, 0x71, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x18, 0xe6, 0x90, 0xff, 0x48, 
-0xf0, 0xe5, 0x4b, 0x60, 0x06, 0x90, 0xff, 0x42, 0xe5, 0x4c, 0xf0, 0x78, 0x72, 0xe6, 0x7f, 0x00, 
-0x20, 0xe4, 0x02, 0x7f, 0x01, 0x90, 0x02, 0x00, 0xef, 0xf0, 0x12, 0x17, 0xe5, 0x08, 0x12, 0x17, 
-0xc3, 0x7d, 0x06, 0x12, 0x30, 0x65, 0x78, 0x6e, 0x12, 0x17, 0xc3, 0x7d, 0x06, 0x12, 0x30, 0x65, 
-0x78, 0x81, 0xe2, 0xff, 0x90, 0xff, 0x40, 0xf0, 0x78, 0x72, 0xe6, 0x30, 0xe7, 0x26, 0x43, 0xad, 
-0x04, 0xef, 0xf0, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x05, 0x12, 0x34, 0xe3, 0x80, 0xf4, 0x7b, 
-0xff, 0x7a, 0x30, 0x79, 0x65, 0x12, 0x25, 0x33, 0x12, 0x18, 0x64, 0xf0, 0x78, 0x76, 0xe6, 0x70, 
-0xe2, 0x02, 0x31, 0xd4, 0x53, 0xad, 0xfb, 0x12, 0x19, 0x14, 0x22, 0x78, 0xff, 0xe4, 0xf6, 0xd8, 
-0xfd, 0x90, 0x00, 0x00, 0x7f, 0x00, 0x7e, 0x03, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x75, 
-0x81, 0x83, 0x75, 0xa0, 0x00, 0x02, 0x2a, 0x43, 0x02, 0x33, 0x11, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 
-0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 
-0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 
-0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 
-0x20, 0x40, 0x80, 0x90, 0x3a, 0x31, 0xe4, 0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 
-0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 
-0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 
-0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 
-0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0x90, 0x36, 0x0a, 0xe4, 0x93, 0x70, 0x05, 0x43, 
-0x90, 0x10, 0x80, 0x03, 0x53, 0x90, 0xef, 0x90, 0x36, 0x0c, 0xe4, 0x93, 0xff, 0x7c, 0x01, 0x7d, 
-0x00, 0x12, 0x32, 0x56, 0x90, 0x36, 0x0d, 0xe4, 0x93, 0xb4, 0x01, 0x07, 0x90, 0xff, 0x10, 0xe0, 
-0x44, 0x18, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0x00, 0x12, 
-0x0f, 0xeb, 0x7d, 0x01, 0x7f, 0x12, 0x12, 0x31, 0x4c, 0x7d, 0x03, 0x7f, 0x12, 0x12, 0x30, 0x65, 
-0x90, 0xff, 0x1b, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x36, 
-0x09, 0xe4, 0x93, 0x90, 0x01, 0xfa, 0xf0, 0x90, 0x36, 0x07, 0xe4, 0x93, 0x90, 0x01, 0xea, 0xf0, 
-0x90, 0x36, 0x11, 0xe4, 0x93, 0x90, 0x01, 0xed, 0xf0, 0x78, 0xa7, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 
-0xff, 0x7a, 0x36, 0x79, 0x00, 0x7e, 0x00, 0x7f, 0x03, 0x12, 0x0b, 0xc8, 0xe4, 0x90, 0x01, 0xec, 
-0xf0, 0x90, 0x01, 0xfe, 0x04, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0x00, 0xc2, 0xf0, 0xa3, 0xf0, 
-0x22, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 0xfa, 0x34, 0x00, 0xf5, 
+0xe4, 0xf0, 0x12, 0x29, 0xfe, 0x90, 0x00, 0x0a, 0x12, 0x29, 0xbf, 0xff, 0x90, 0x00, 0x04, 0x12, 
+0x0c, 0x07, 0x2f, 0xf5, 0x21, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0xb4, 0x04, 0x09, 0x12, 0x29, 
+0xce, 0x70, 0x04, 0x90, 0x00, 0xc6, 0xf0, 0x90, 0x00, 0xc6, 0xe0, 0x60, 0x4f, 0x14, 0xf0, 0xe0, 
+0xff, 0x7e, 0x04, 0x60, 0x02, 0x7e, 0x08, 0x12, 0x29, 0xea, 0x90, 0x00, 0x05, 0xee, 0x12, 0x0c, 
+0x46, 0xef, 0x60, 0x08, 0x12, 0x2a, 0x08, 0xff, 0xae, 0xf0, 0x80, 0x10, 0x90, 0x00, 0xc7, 0xe0, 
+0xff, 0xb4, 0x05, 0x02, 0x80, 0x02, 0x7f, 0x00, 0xef, 0x7f, 0x00, 0xfe, 0x12, 0x29, 0xa6, 0x12, 
+0x29, 0xbc, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 0x2a, 0x08, 0xfd, 0xe5, 0xf0, 0x54, 0x0f, 0xfc, 0xe4, 
+0x2d, 0xff, 0xee, 0x3c, 0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0x02, 0x15, 0x01, 0x12, 0x29, 0xbc, 0x70, 
+0x09, 0x12, 0x29, 0xce, 0x70, 0x04, 0xe5, 0x1e, 0x60, 0x51, 0x12, 0x29, 0xf1, 0x12, 0x29, 0xa6, 
+0x12, 0x29, 0xbc, 0x60, 0x14, 0xc4, 0x54, 0xf0, 0xfe, 0x12, 0x0d, 0x1b, 0x24, 0x00, 0xff, 0xee, 
+0x35, 0xf0, 0xfe, 0x12, 0x29, 0x81, 0x12, 0x29, 0xd4, 0x12, 0x29, 0xc8, 0x60, 0x32, 0xc4, 0x54, 
+0xf0, 0xfe, 0x90, 0x00, 0x06, 0x12, 0x0d, 0x46, 0x24, 0x00, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 
+0x29, 0xa6, 0x12, 0x29, 0xea, 0x90, 0x00, 0x08, 0x12, 0x0d, 0x46, 0x24, 0x00, 0xff, 0xe5, 0xf0, 
+0x34, 0x10, 0xfe, 0x12, 0x29, 0xa6, 0x12, 0x29, 0xd4, 0x80, 0x05, 0xe4, 0x90, 0x00, 0xc7, 0xf0, 
+0x90, 0x01, 0xfe, 0xe0, 0xd3, 0x94, 0xf0, 0x50, 0x03, 0x02, 0x15, 0x01, 0x12, 0x29, 0xfe, 0x12, 
+0x29, 0xf1, 0x12, 0x29, 0xa6, 0x12, 0x29, 0xea, 0x12, 0x0d, 0x1b, 0xff, 0xae, 0xf0, 0x12, 0x29, 
+0x81, 0x90, 0x00, 0x06, 0x12, 0x29, 0x9a, 0x12, 0x29, 0xea, 0x90, 0x00, 0x08, 0x12, 0x29, 0xa0, 
+0x90, 0x01, 0x40, 0x74, 0x40, 0xf0, 0x90, 0x01, 0x60, 0x74, 0x60, 0xf0, 0x75, 0x2a, 0x01, 0x75, 
+0x2b, 0x41, 0x75, 0x28, 0x01, 0x75, 0x29, 0x61, 0xe4, 0xf5, 0x27, 0xaf, 0x27, 0x12, 0x35, 0xc1, 
+0xe5, 0x2b, 0xfd, 0x24, 0x02, 0xf5, 0x2b, 0xe5, 0x2a, 0xfc, 0x34, 0x00, 0xf5, 0x2a, 0x12, 0x2a, 
+0x11, 0xaf, 0x27, 0x12, 0x00, 0x12, 0xef, 0xd3, 0x94, 0x1c, 0x40, 0x06, 0x7e, 0x0f, 0x7f, 0xff, 
+0x80, 0x05, 0xaf, 0x27, 0x12, 0x35, 0x89, 0xe5, 0x29, 0xfd, 0x24, 0x02, 0xf5, 0x29, 0xe5, 0x28, 
+0xfc, 0x34, 0x00, 0xf5, 0x28, 0x12, 0x2a, 0x11, 0x05, 0x27, 0xe5, 0x27, 0xc3, 0x94, 0x10, 0x40, 
+0xba, 0x12, 0x29, 0xbc, 0xff, 0x64, 0x80, 0x60, 0x12, 0xef, 0x64, 0x04, 0x60, 0x0d, 0x12, 0x29, 
+0xce, 0xff, 0x64, 0x80, 0x60, 0x05, 0xef, 0x64, 0x04, 0x70, 0x2d, 0x78, 0x0f, 0xe6, 0x70, 0x0f, 
+0x78, 0x00, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x01, 0x79, 0x20, 0xfe, 0x80, 0x14, 0x78, 
+0x0f, 0xe6, 0xb4, 0x20, 0x13, 0x78, 0x20, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x01, 0x79, 
+0x00, 0x7e, 0x00, 0x7f, 0x0f, 0x12, 0x0b, 0xc8, 0x78, 0x0f, 0xe6, 0x7f, 0x00, 0x70, 0x02, 0x7f, 
+0x20, 0x78, 0x0f, 0xa6, 0x07, 0xe5, 0x20, 0x20, 0xe7, 0x2a, 0x30, 0xe6, 0x0a, 0x12, 0x29, 0xbc, 
+0x70, 0x22, 0x12, 0x29, 0xce, 0x70, 0x1d, 0xe5, 0x20, 0x30, 0xe5, 0x0f, 0x12, 0x29, 0xc8, 0xff, 
+0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0x4f, 0x54, 0x84, 0x70, 0x09, 0xe5, 0x20, 0x30, 0xe4, 0x0c, 
+0xe5, 0x1e, 0x60, 0x08, 0x90, 0x01, 0xed, 0xe0, 0xff, 0x12, 0x33, 0x1e, 0x22, 0x8f, 0x23, 0xef, 
+0x12, 0x06, 0x85, 0xe6, 0xf5, 0x2f, 0x12, 0x05, 0xf0, 0x12, 0x09, 0x3d, 0x8e, 0x30, 0x8f, 0x31, 
+0xe5, 0x2f, 0x70, 0x60, 0x75, 0x24, 0x01, 0x12, 0x0a, 0x79, 0xe4, 0xf5, 0x29, 0xf5, 0x2a, 0x78, 
+0x5f, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 0x78, 0x5e, 0x12, 0x0a, 0xe7, 0x78, 0x63, 0xe2, 0xfe, 0x08, 
+0xe2, 0xff, 0x78, 0x62, 0x12, 0x09, 0x7c, 0xc3, 0x74, 0x09, 0x93, 0x64, 0x80, 0x94, 0x80, 0x50, 
+0x05, 0x12, 0x0a, 0x85, 0x80, 0x04, 0xae, 0x27, 0xaf, 0x28, 0x12, 0x08, 0x65, 0x12, 0x05, 0xef, 
+0x74, 0x09, 0x93, 0xfe, 0x74, 0x0a, 0x12, 0x07, 0x52, 0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 
+0x04, 0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x27, 0x8f, 0x28, 0x78, 0x67, 0xe2, 0xfe, 0x08, 0xe2, 0xff, 
+0x78, 0x66, 0x80, 0x72, 0x78, 0x72, 0xe6, 0x14, 0x65, 0x2f, 0x70, 0x75, 0xf5, 0x24, 0x12, 0x0a, 
+0x79, 0x12, 0x05, 0xf0, 0x74, 0x03, 0x93, 0xf5, 0x29, 0x74, 0x04, 0x93, 0xf5, 0x2a, 0x12, 0x06, 
+0x2a, 0x12, 0x07, 0x86, 0x24, 0x5e, 0x12, 0x07, 0x7c, 0x24, 0x5b, 0x12, 0x06, 0x32, 0x12, 0x07, 
+0x86, 0x24, 0x5a, 0x12, 0x09, 0x7b, 0xc3, 0x74, 0x0b, 0x93, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 
+0x12, 0x0a, 0x85, 0x80, 0x04, 0xae, 0x27, 0xaf, 0x28, 0x12, 0x08, 0x65, 0x12, 0x05, 0xef, 0x74, 
+0x0b, 0x93, 0xfe, 0x74, 0x0c, 0x12, 0x07, 0x52, 0x40, 0x06, 0xae, 0x2d, 0xaf, 0x2e, 0x80, 0x04, 
+0x7e, 0x00, 0x7f, 0x01, 0x8e, 0x27, 0x8f, 0x28, 0x12, 0x07, 0x86, 0x24, 0x57, 0x12, 0x06, 0x32, 
+0x12, 0x07, 0x86, 0x24, 0x56, 0xf8, 0xe2, 0x2f, 0xf5, 0x2c, 0x18, 0xe2, 0x3e, 0xf5, 0x2b, 0x80, 
+0x79, 0xe5, 0x2f, 0xfd, 0x7c, 0x00, 0xae, 0x30, 0xaf, 0x31, 0x12, 0x0c, 0x68, 0xac, 0x06, 0xad, 
+0x07, 0xe5, 0x30, 0xc3, 0x13, 0xfe, 0xe5, 0x31, 0x13, 0x2d, 0xf5, 0x2a, 0xec, 0x3e, 0xf5, 0x29, 
+0x12, 0x07, 0x86, 0x24, 0x5b, 0x12, 0x06, 0x32, 0x12, 0x07, 0x86, 0x24, 0x5a, 0x12, 0x07, 0x7c, 
+0x24, 0x63, 0x12, 0x06, 0x32, 0x12, 0x07, 0x86, 0x24, 0x62, 0x12, 0x09, 0x7b, 0xd3, 0xe5, 0x26, 
+0x95, 0x28, 0xe5, 0x27, 0x64, 0x80, 0xf8, 0xe5, 0x25, 0x64, 0x80, 0x98, 0x40, 0x11, 0xe4, 0xf5, 
+0x24, 0x85, 0x27, 0x2b, 0x85, 0x28, 0x2c, 0x85, 0x25, 0x27, 0x85, 0x26, 0x28, 0x80, 0x0f, 0x75, 
+0x24, 0x01, 0x85, 0x25, 0x2b, 0x85, 0x26, 0x2c, 0x85, 0x27, 0x27, 0x85, 0x28, 0x28, 0x12, 0x06, 
+0x2a, 0x12, 0x07, 0x86, 0x24, 0x5e, 0xf8, 0x12, 0x0a, 0xe7, 0xc3, 0xe5, 0x26, 0x95, 0x2c, 0xf5, 
+0x26, 0xe5, 0x25, 0x95, 0x2b, 0xf5, 0x25, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0xe4, 0xf5, 
+0x25, 0xf5, 0x26, 0xc3, 0xe5, 0x28, 0x95, 0x2c, 0xf5, 0x28, 0xe5, 0x27, 0x95, 0x2b, 0xf5, 0x27, 
+0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x05, 0xe4, 0xf5, 0x27, 0xf5, 0x28, 0x85, 0x27, 0x2b, 0x85, 
+0x28, 0x2c, 0xae, 0x2b, 0xaf, 0x2c, 0x12, 0x08, 0xc6, 0xe4, 0x7b, 0x80, 0xfa, 0xf9, 0xf8, 0x12, 
+0x06, 0x77, 0xae, 0x30, 0xaf, 0x31, 0x12, 0x0a, 0x9d, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x26, 0x25, 
+0x28, 0xcf, 0xe5, 0x25, 0x35, 0x27, 0xcf, 0x24, 0x01, 0xcf, 0x34, 0x00, 0xab, 0x07, 0xfa, 0x33, 
+0x95, 0xe0, 0xf9, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0x12, 0x0e, 0xa2, 0xef, 0x12, 0x0a, 0xf1, 0xe4, 
+0x3d, 0xfd, 0xe4, 0x3c, 0xfc, 0xe4, 0x7b, 0x80, 0xfa, 0xf9, 0xf8, 0x12, 0x0e, 0xa2, 0x8e, 0x2b, 
+0x8f, 0x2c, 0xe5, 0x24, 0x60, 0x0e, 0xe5, 0x2a, 0x25, 0x2c, 0xf5, 0x2c, 0xe5, 0x29, 0x35, 0x2b, 
+0xf5, 0x2b, 0x80, 0x0d, 0xc3, 0xe5, 0x2a, 0x95, 0x2c, 0xf5, 0x2c, 0xe5, 0x29, 0x95, 0x2b, 0xf5, 
+0x2b, 0xe5, 0x23, 0x12, 0x0a, 0x0e, 0xf8, 0xe5, 0x2b, 0xf2, 0x08, 0xe5, 0x2c, 0xf2, 0x22, 0x43, 
+0xad, 0x04, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x85, 0x0d, 0x82, 0x85, 
+0x0c, 0x83, 0x74, 0x26, 0x93, 0xff, 0x90, 0xff, 0x48, 0xf0, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 
+0x74, 0x27, 0x93, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x6c, 0xf0, 0x90, 0xff, 0x57, 
+0x74, 0xff, 0xf0, 0x90, 0xff, 0x56, 0xe4, 0xf0, 0x90, 0xff, 0x5f, 0x74, 0xff, 0xf0, 0x90, 0xff, 
+0x5e, 0xe4, 0xf0, 0x85, 0x0d, 0x82, 0x85, 0x0c, 0x83, 0x22, 0x78, 0x67, 0xe6, 0xff, 0x78, 0x82, 
+0xe2, 0xfc, 0x08, 0xe2, 0x2f, 0xf5, 0x82, 0xe4, 0x3c, 0xf5, 0x83, 0xe0, 0x22, 0xe5, 0x22, 0x75, 
+0xf0, 0x0a, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0x78, 0x67, 0xe6, 
+0xff, 0x24, 0xb6, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x90, 0xff, 0x54, 0xf0, 0x18, 
+0xe6, 0x24, 0xb6, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0x90, 0xff, 0x5c, 0xf0, 0xef, 
+0xc3, 0x13, 0xff, 0xe5, 0x0d, 0x24, 0x1a, 0xf5, 0x82, 0xe4, 0x35, 0x0c, 0xf5, 0x83, 0xe5, 0x82, 
+0x2f, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 0x90, 0xff, 0x55, 0xf0, 0x22, 0x75, 
+0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xbd, 0xf0, 0x75, 0x8f, 0x80, 0x75, 0x8e, 0x20, 0x75, 0x8a, 0xa0, 
+0xf0, 0x90, 0xff, 0x43, 0x74, 0x5f, 0xf0, 0x22, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xef, 0x75, 0xf0, 
+0x0a, 0xa4, 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0x22, 0x90, 0xff, 0x54, 0xe0, 
+0x90, 0x01, 0xf0, 0xf0, 0x90, 0xff, 0x5c, 0xe0, 0x90, 0x01, 0xf1, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 
+0x90, 0x00, 0xbd, 0x22, 0xff, 0xa8, 0x0e, 0x08, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf5, 0x82, 0x8a, 
+0x83, 0x22, 0xe5, 0x22, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x03, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 
+0x83, 0x22, 0xff, 0xfe, 0xfd, 0xfc, 0xab, 0x2e, 0xaa, 0x2d, 0xa9, 0x2c, 0xa8, 0x2b, 0x22, 0x78, 
+0x82, 0xe2, 0xfa, 0x08, 0xe2, 0xfb, 0x25, 0x1e, 0xf5, 0x82, 0xe4, 0x3a, 0xf5, 0x83, 0x22, 0xab, 
+0x28, 0xaa, 0x29, 0xa9, 0x2a, 0x22, 0x7f, 0xb4, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0x01, 0x02, 0x0f, 
+0xeb, 0x90, 0xff, 0x5e, 0xf0, 0x90, 0xff, 0x56, 0xe0, 0xff, 0xa3, 0xe0, 0xd3, 0x9f, 0x22, 0xce, 
+0xa2, 0xe7, 0x13, 0xce, 0x13, 0x22, 0x74, 0xb6, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 
+0x83, 0xe0, 0xff, 0xe5, 0x24, 0x22, 0x90, 0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0x22, 0x90, 0xff, 
+0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0x22, 0xd3, 0x74, 0x05, 0x93, 0x9f, 0x74, 0x04, 0x93, 0x9e, 0x22, 
+0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x22, 0x78, 0x82, 0xe2, 0xfc, 0x08, 0xe2, 0x22, 
+0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x22, 0x78, 0x81, 0xe2, 0x90, 0xff, 0x40, 0xf0, 0x22, 0x74, 
+0x28, 0x93, 0x90, 0xff, 0x55, 0xf0, 0xef, 0xc3, 0x94, 0x08, 0x22, 0xe5, 0x0d, 0x24, 0x2b, 0xff, 
+0xe4, 0x35, 0x0c, 0xa9, 0x07, 0x22, 0xa3, 0xe0, 0xff, 0xe5, 0x00, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 
+0x22, 0xa3, 0xe0, 0xff, 0xe5, 0x00, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0x90, 0x00, 0x02, 0x12, 
+0x0d, 0x46, 0xff, 0xae, 0xf0, 0x22, 0xe6, 0xff, 0xc3, 0x95, 0x00, 0xf0, 0xe5, 0x00, 0x2f, 0x22, 
+0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 0x8d, 0x1e, 0xe4, 0xf5, 0x21, 0x90, 0x00, 0x05, 0x12, 0x0c, 
+0x07, 0xf5, 0x22, 0x90, 0x00, 0x0b, 0x12, 0x0c, 0x07, 0x60, 0x08, 0xe4, 0x78, 0x86, 0xf2, 0x90, 
+0x00, 0xb7, 0xf0, 0xe5, 0x22, 0xb4, 0x80, 0x29, 0x78, 0x86, 0x74, 0xff, 0xf2, 0x12, 0x32, 0xbc, 
+0x90, 0x00, 0xb1, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x32, 0xcd, 0x90, 0x00, 0xb3, 0xe5, 
+0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0xa3, 0xf0, 0xa3, 0xe0, 0x04, 0xf0, 0x02, 0x1b, 
+0x2c, 0xe5, 0x22, 0x64, 0x08, 0x60, 0x03, 0x02, 0x1a, 0xce, 0x12, 0x32, 0xbc, 0xc3, 0x90, 0x00, 
+0xb2, 0xe0, 0x90, 0x00, 0xb1, 0x12, 0x1b, 0x51, 0x8e, 0x23, 0x8f, 0x24, 0x12, 0x32, 0xc7, 0xc3, 
+0x90, 0x00, 0xb4, 0xe0, 0x90, 0x00, 0xb3, 0x12, 0x1b, 0x51, 0x12, 0x32, 0xb5, 0x74, 0x01, 0x93, 
+0xfc, 0x74, 0x02, 0x12, 0x32, 0xd5, 0x40, 0x0f, 0x90, 0x01, 0xec, 0xe0, 0x30, 0xe0, 0x08, 0x78, 
+0x86, 0xe2, 0x54, 0xfe, 0x12, 0x32, 0xe3, 0xe5, 0x24, 0x2f, 0xfd, 0xe5, 0x23, 0x3e, 0xfc, 0x12, 
+0x32, 0xb5, 0x74, 0x05, 0x93, 0xfb, 0xd3, 0xed, 0x9b, 0xec, 0x94, 0x00, 0x40, 0x08, 0x78, 0x86, 
+0xe2, 0x54, 0xfc, 0x12, 0x32, 0xe3, 0x12, 0x32, 0xb5, 0x74, 0x03, 0x93, 0xfc, 0x74, 0x04, 0x12, 
+0x32, 0xd5, 0x40, 0x17, 0x78, 0x86, 0xe2, 0x20, 0xe1, 0x04, 0xe5, 0x1e, 0x60, 0x0d, 0x75, 0x21, 
+0x0c, 0xe4, 0x78, 0x86, 0xf2, 0xf5, 0x1e, 0x90, 0x00, 0xb7, 0xf0, 0x78, 0x86, 0xe2, 0x54, 0x3c, 
+0x70, 0x03, 0x02, 0x1b, 0x2c, 0x12, 0x32, 0xb5, 0x74, 0x06, 0x93, 0xfd, 0x7c, 0x00, 0xd3, 0xe5, 
+0x24, 0x9d, 0xe5, 0x23, 0x9c, 0x50, 0x09, 0xef, 0x9d, 0xee, 0x9c, 0x50, 0x03, 0x02, 0x1b, 0x2c, 
+0xd3, 0xef, 0x95, 0x24, 0xee, 0x95, 0x23, 0x40, 0x17, 0x12, 0x32, 0xc7, 0xd3, 0x90, 0x00, 0xb4, 
+0xe0, 0x9f, 0x90, 0x00, 0xb3, 0xe0, 0x95, 0xf0, 0x7f, 0x02, 0x40, 0x02, 0x7f, 0x01, 0x80, 0x15, 
+0x12, 0x32, 0xbc, 0xd3, 0x90, 0x00, 0xb2, 0xe0, 0x9f, 0x90, 0x00, 0xb1, 0xe0, 0x95, 0xf0, 0x7f, 
+0x04, 0x40, 0x02, 0x7f, 0x03, 0x8f, 0x21, 0x78, 0x86, 0xe2, 0x54, 0xc3, 0x80, 0x5b, 0xe5, 0x22, 
+0xb4, 0x04, 0x09, 0xe4, 0x90, 0x00, 0xb5, 0xf0, 0xa3, 0xf0, 0x80, 0x50, 0x12, 0x32, 0xb5, 0x74, 
+0x01, 0x93, 0xfe, 0x74, 0x02, 0x93, 0xff, 0xd3, 0x90, 0x00, 0xb6, 0xe0, 0x9f, 0x90, 0x00, 0xb5, 
+0xe0, 0x9e, 0x50, 0x15, 0x90, 0x01, 0xec, 0xe0, 0x30, 0xe0, 0x0e, 0x54, 0x11, 0x64, 0x11, 0x70, 
+0x2b, 0x90, 0x00, 0xb7, 0xe0, 0x64, 0x02, 0x70, 0x23, 0x78, 0x86, 0xe2, 0xff, 0x30, 0xe0, 0x1c, 
+0x90, 0x00, 0xb7, 0xe0, 0xfe, 0xd3, 0x94, 0x02, 0x50, 0x0a, 0xee, 0x7e, 0x0b, 0xb4, 0x01, 0x02, 
+0x7e, 0x05, 0x8e, 0x21, 0xef, 0x54, 0xfe, 0x78, 0x86, 0x12, 0x32, 0xe3, 0xc3, 0x90, 0x00, 0xb5, 
+0xe0, 0x94, 0xff, 0x50, 0x13, 0x12, 0x32, 0xb5, 0xe4, 0x93, 0xff, 0x90, 0x00, 0xb6, 0xe0, 0x2f, 
+0xf0, 0x90, 0x00, 0xb5, 0xe0, 0x34, 0x00, 0xf0, 0xe5, 0x1e, 0xaf, 0x1e, 0x70, 0x02, 0xaf, 0x21, 
+0x22, 0x9f, 0xff, 0xe0, 0x95, 0xf0, 0xfe, 0x12, 0x35, 0x95, 0x22, 0x8f, 0x26, 0x8d, 0x27, 0xef, 
+0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x01, 0xf9, 0x74, 0x02, 0x35, 0xf0, 0x75, 0x28, 0x01, 0xf5, 0x29, 
+0x89, 0x2a, 0x78, 0x6f, 0xe6, 0x60, 0x01, 0x16, 0x12, 0x18, 0xdf, 0x12, 0x19, 0x7c, 0xe4, 0xfc, 
+0xfd, 0xa8, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0d, 0x1b, 0xff, 0xae, 0xf0, 0xd0, 
+0x03, 0xd0, 0x02, 0xd0, 0x01, 0xc3, 0xef, 0x9b, 0xf5, 0x2e, 0xee, 0x9a, 0xf5, 0x2d, 0xed, 0x99, 
+0xf5, 0x2c, 0xec, 0x98, 0xf5, 0x2b, 0x12, 0x18, 0xdf, 0x90, 0x00, 0x05, 0x12, 0x0c, 0x07, 0xf5, 
+0x2f, 0xe4, 0xff, 0xfe, 0x12, 0x18, 0xc6, 0xd3, 0x12, 0x0f, 0x34, 0x40, 0x06, 0xae, 0x2d, 0xaf, 
+0x2e, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xe5, 0x26, 0x25, 0xe0, 0x24, 0x5d, 0xf8, 0xee, 0xf2, 
+0x08, 0xef, 0xf2, 0x78, 0x6f, 0xe6, 0x60, 0x20, 0x90, 0x36, 0x0b, 0xe4, 0x93, 0x60, 0x03, 0x02, 
+0x1c, 0xcd, 0x12, 0x18, 0xc2, 0xd3, 0x12, 0x0f, 0x34, 0x7f, 0x00, 0x40, 0x02, 0x7f, 0x01, 0xef, 
+0x78, 0x6f, 0x56, 0x60, 0x03, 0x02, 0x1c, 0xcd, 0xae, 0x2d, 0xaf, 0x2e, 0x12, 0x35, 0x95, 0x12, 
+0x17, 0xf3, 0xc3, 0x12, 0x19, 0x27, 0x50, 0x11, 0xe4, 0x12, 0x18, 0xc2, 0x12, 0x0f, 0x34, 0x40, 
+0x04, 0x05, 0x2f, 0x80, 0x70, 0x15, 0x2f, 0x80, 0x6c, 0x12, 0x18, 0xdf, 0x90, 0x00, 0x04, 0x12, 
+0x0c, 0x07, 0xff, 0x33, 0x95, 0xe0, 0xfe, 0xfd, 0xfc, 0xe5, 0x2e, 0x2f, 0xf5, 0x2e, 0xe5, 0x2d, 
+0x3e, 0xf5, 0x2d, 0xe5, 0x2c, 0x3d, 0xf5, 0x2c, 0xe5, 0x2b, 0x3c, 0xf5, 0x2b, 0xe4, 0x7f, 0x78, 
+0x12, 0x18, 0xc3, 0xd3, 0x12, 0x0f, 0x34, 0x40, 0x0c, 0x12, 0x18, 0xdf, 0x90, 0x00, 0x02, 0xe4, 
+0x75, 0xf0, 0x01, 0x80, 0x1c, 0xe5, 0x2e, 0x24, 0x78, 0xe4, 0x35, 0x2d, 0xe4, 0x35, 0x2c, 0xfd, 
+0xe4, 0x35, 0x2b, 0xfc, 0x33, 0x12, 0x18, 0xdf, 0x50, 0x10, 0x90, 0x00, 0x02, 0x74, 0xff, 0xf5, 
+0xf0, 0x12, 0x0d, 0x7e, 0x90, 0x00, 0x04, 0xe4, 0x80, 0x05, 0x90, 0x00, 0x04, 0xe5, 0x2e, 0x12, 
+0x0c, 0x46, 0xe4, 0xf5, 0x2f, 0x12, 0x17, 0xf3, 0x74, 0x01, 0x93, 0xff, 0xd3, 0x64, 0x80, 0xf8, 
+0xe5, 0x2f, 0x64, 0x80, 0x98, 0x50, 0x17, 0xef, 0x33, 0x95, 0xe0, 0xfe, 0xad, 0x2f, 0xed, 0x33, 
+0x95, 0xe0, 0xfc, 0xed, 0x2f, 0xec, 0x3e, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x50, 0x14, 0xe4, 0xf5, 
+0x2f, 0x12, 0x18, 0xdf, 0x12, 0x0d, 0x1b, 0xff, 0x90, 0x00, 0x02, 0xe5, 0xf0, 0x8f, 0xf0, 0x12, 
+0x0d, 0xea, 0x12, 0x18, 0xdf, 0x90, 0x00, 0x05, 0xe5, 0x2f, 0x12, 0x0c, 0x46, 0x78, 0x6f, 0xe6, 
+0x70, 0x39, 0x12, 0x18, 0xdf, 0x12, 0x19, 0x7c, 0x90, 0x00, 0x08, 0x12, 0x0d, 0x46, 0xc3, 0x9f, 
+0xff, 0xe5, 0xf0, 0x9e, 0xfe, 0x12, 0x35, 0x95, 0xaa, 0x06, 0xab, 0x07, 0x12, 0x17, 0xf3, 0x74, 
+0x04, 0x93, 0xfe, 0x74, 0x05, 0x93, 0xff, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x0c, 0x68, 0xd3, 0xeb, 
+0x9f, 0xea, 0x9e, 0x40, 0x06, 0x78, 0x6d, 0xe6, 0x44, 0x10, 0xf6, 0x05, 0x26, 0x74, 0x0a, 0x25, 
+0x2a, 0xf5, 0x2a, 0xe4, 0x35, 0x29, 0xf5, 0x29, 0x15, 0x27, 0xe5, 0x27, 0x60, 0x03, 0x02, 0x1b, 
+0x78, 0x22, 0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 0xe4, 0xf5, 0x1e, 0xfe, 0x7f, 0x0c, 0xfd, 0x12, 
+0x0f, 0xeb, 0x7f, 0x06, 0x12, 0x08, 0xa1, 0x7e, 0x00, 0x7f, 0x06, 0x7a, 0x00, 0x79, 0x2f, 0x12, 
+0x08, 0xa7, 0x78, 0x74, 0xe6, 0x14, 0x60, 0x26, 0x04, 0x60, 0x03, 0x02, 0x1e, 0xb9, 0xe4, 0x78, 
+0x73, 0xf6, 0xff, 0x12, 0x35, 0xbc, 0x12, 0x21, 0xa1, 0x78, 0x6d, 0xe6, 0x30, 0xe4, 0x03, 0x02, 
+0x1e, 0xbd, 0x7f, 0x5c, 0x12, 0x08, 0xa1, 0x78, 0x74, 0x76, 0x01, 0x02, 0x1e, 0xb1, 0x12, 0x21, 
+0xa1, 0x78, 0x6d, 0xe6, 0xff, 0x30, 0xe4, 0x09, 0x90, 0x00, 0xba, 0xe0, 0x70, 0x03, 0x02, 0x1e, 
+0xba, 0xef, 0x20, 0xe3, 0x03, 0x02, 0x1e, 0x5d, 0x90, 0x00, 0x87, 0xe0, 0x30, 0xe1, 0x69, 0x7b, 
+0x00, 0x7a, 0x00, 0x79, 0x20, 0x12, 0x35, 0xc5, 0xef, 0x60, 0x5d, 0xe5, 0x20, 0x60, 0x59, 0xe4, 
+0xf5, 0x21, 0x90, 0x00, 0x87, 0x74, 0x02, 0xf0, 0x78, 0x05, 0x14, 0xf2, 0x85, 0x40, 0x82, 0x85, 
+0x3f, 0x83, 0xe4, 0x93, 0xff, 0xe5, 0x21, 0xd3, 0x9f, 0x50, 0x3d, 0x74, 0x01, 0x7e, 0x00, 0xa8, 
+0x21, 0x08, 0x80, 0x05, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0xef, 0x55, 0x20, 0x60, 
+0x23, 0x12, 0x09, 0xa5, 0x74, 0x06, 0x93, 0xff, 0x74, 0x07, 0x93, 0x78, 0x01, 0xcf, 0xf2, 0x08, 
+0xef, 0xf2, 0x12, 0x09, 0xa5, 0x74, 0x08, 0x93, 0xff, 0x74, 0x09, 0x93, 0x08, 0xcf, 0xf2, 0x08, 
+0xef, 0xf2, 0x80, 0x04, 0x05, 0x21, 0x80, 0xb4, 0x90, 0x00, 0x87, 0xe0, 0x30, 0xe0, 0x54, 0x75, 
+0x25, 0x00, 0x75, 0x26, 0x00, 0x75, 0x27, 0x41, 0x75, 0x28, 0x00, 0x75, 0x29, 0x00, 0x75, 0x2a, 
+0x45, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x5d, 0x12, 0x26, 0x3e, 0xe4, 0xf5, 0x1f, 0xe5, 0x1f, 0x12, 
+0x06, 0x85, 0xe6, 0xf4, 0x60, 0x1b, 0xe5, 0x1f, 0x12, 0x0a, 0xc1, 0xf9, 0xe4, 0xfa, 0x7b, 0xfe, 
+0xad, 0x1f, 0x12, 0x35, 0x7d, 0xe5, 0x1f, 0x75, 0xf0, 0x2e, 0xa4, 0x24, 0x05, 0xf8, 0x74, 0x01, 
+0xf2, 0x05, 0x1f, 0xe5, 0x1f, 0xc3, 0x94, 0x02, 0x40, 0xd3, 0x12, 0x27, 0x3c, 0x90, 0x00, 0x87, 
+0x74, 0x01, 0xf0, 0x78, 0x6d, 0xe6, 0x30, 0xe5, 0x04, 0x78, 0x73, 0x76, 0x01, 0x90, 0x00, 0x87, 
+0xe0, 0xf5, 0x1e, 0x78, 0x71, 0x76, 0x01, 0xe4, 0xf5, 0x1f, 0xe5, 0x1f, 0xc3, 0x94, 0x02, 0x50, 
+0x19, 0x90, 0x00, 0x87, 0xe0, 0x30, 0xe0, 0x05, 0xaf, 0x1f, 0x12, 0x35, 0xac, 0x12, 0x2c, 0xd6, 
+0x05, 0x1f, 0x78, 0x71, 0x74, 0x2e, 0x26, 0xf6, 0x80, 0xe0, 0xa8, 0x1d, 0xac, 0x1c, 0xad, 0x1b, 
+0x12, 0x07, 0x19, 0xe5, 0x1d, 0x24, 0x06, 0xf9, 0xe4, 0x35, 0x1c, 0xa8, 0x01, 0xfc, 0xad, 0x1b, 
+0x7a, 0x00, 0x79, 0x2f, 0x12, 0x07, 0x1d, 0x78, 0x0c, 0xe2, 0x70, 0x11, 0x78, 0x3a, 0xe2, 0x70, 
+0x0c, 0x90, 0x00, 0x87, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xe4, 0x78, 0x74, 0xf6, 0xaf, 0x1e, 0x22, 
+0x8b, 0x1b, 0x8a, 0x1c, 0x89, 0x1d, 0x43, 0xad, 0x04, 0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 
+0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x37, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 0xe4, 
+0xf5, 0x24, 0xf5, 0x24, 0x12, 0x32, 0x5a, 0xe5, 0x24, 0xc3, 0x9f, 0x50, 0x22, 0xe9, 0x24, 0x0c, 
+0xf9, 0xe4, 0x3a, 0x12, 0x32, 0x4b, 0xe4, 0xfd, 0x12, 0x33, 0x80, 0x12, 0x32, 0x41, 0x7d, 0x08, 
+0x12, 0x2f, 0xd0, 0x12, 0x32, 0x41, 0xe4, 0xfd, 0x12, 0x30, 0xb7, 0x05, 0x24, 0x80, 0xd5, 0x90, 
+0xff, 0x4a, 0xe4, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 0x90, 0xff, 0x58, 0xe4, 0xf0, 0x90, 
+0xff, 0x40, 0x74, 0x08, 0xf0, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 
+0x1d, 0x12, 0x0b, 0xee, 0x90, 0xff, 0x48, 0xf0, 0x90, 0x00, 0x01, 0x12, 0x0c, 0x07, 0x90, 0xff, 
+0x42, 0xf0, 0x90, 0x00, 0x02, 0x12, 0x0c, 0x07, 0x90, 0xff, 0x55, 0xf0, 0x90, 0x00, 0x03, 0x12, 
+0x0c, 0x07, 0x90, 0xff, 0x54, 0xf0, 0x90, 0xff, 0x5c, 0xe4, 0xf0, 0xf5, 0x24, 0x12, 0x32, 0x5a, 
+0xe5, 0x24, 0xc3, 0x9f, 0x50, 0x5b, 0xe4, 0xf5, 0x25, 0x75, 0x26, 0x64, 0x90, 0xff, 0x50, 0xe0, 
+0x20, 0xe7, 0x03, 0x43, 0x25, 0x01, 0xe5, 0x25, 0x64, 0x01, 0x60, 0x03, 0xd5, 0x26, 0xed, 0x12, 
+0x32, 0x68, 0x12, 0x32, 0x41, 0x7d, 0x06, 0x12, 0x2f, 0xd0, 0x90, 0xff, 0x40, 0x74, 0x29, 0xf0, 
+0x90, 0xff, 0x40, 0xe0, 0x20, 0xe0, 0xf9, 0x12, 0x32, 0x41, 0x7d, 0x08, 0x12, 0x2f, 0xd0, 0x90, 
+0xff, 0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xab, 0x1e, 0xe5, 0x20, 0xf9, 0x24, 0x02, 0xf5, 0x20, 
+0xe5, 0x1f, 0xfa, 0x34, 0x00, 0xf5, 0x1f, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0x05, 0x24, 0x80, 
+0x9c, 0xe4, 0xf5, 0x24, 0x90, 0xff, 0x54, 0xf0, 0x75, 0x25, 0x01, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 
+0x12, 0x32, 0x71, 0xf5, 0x83, 0x74, 0xff, 0x12, 0x32, 0x3e, 0x7d, 0x07, 0x12, 0x2f, 0xd0, 0x90, 
+0xff, 0x55, 0x74, 0x64, 0xf0, 0xe4, 0xf5, 0x26, 0x00, 0x90, 0xff, 0x50, 0xe0, 0x30, 0xe7, 0x07, 
+0x05, 0x26, 0xe5, 0x26, 0xb4, 0xfa, 0xf1, 0xe5, 0x25, 0x24, 0x02, 0x90, 0xff, 0x55, 0xf0, 0xe4, 
+0xf5, 0x26, 0x00, 0x00, 0x05, 0x26, 0xe5, 0x26, 0xb4, 0xfa, 0xf7, 0xe4, 0xf5, 0x26, 0x90, 0xff, 
+0x50, 0xe0, 0x20, 0xe7, 0x09, 0x05, 0x27, 0xe5, 0x27, 0xd3, 0x94, 0x28, 0x50, 0x13, 0x05, 0x26, 
+0xe5, 0x26, 0xb4, 0x64, 0xe9, 0x12, 0x32, 0x68, 0x05, 0x25, 0xe5, 0x25, 0xc3, 0x94, 0x64, 0x40, 
+0xc6, 0x12, 0x32, 0x71, 0x75, 0x83, 0x00, 0xe5, 0x25, 0x12, 0x32, 0x3e, 0x7d, 0x08, 0x12, 0x2f, 
+0xd0, 0x12, 0x32, 0x68, 0x12, 0x32, 0x5a, 0x05, 0x24, 0xe5, 0x24, 0xc3, 0x9f, 0x50, 0x03, 0x02, 
+0x1f, 0xc8, 0x90, 0xff, 0x50, 0xe4, 0xf0, 0xff, 0x22, 0x8f, 0x23, 0xef, 0x12, 0x06, 0x85, 0xe6, 
+0xff, 0x70, 0x04, 0xf5, 0x24, 0x80, 0x18, 0x78, 0x72, 0xe6, 0xfe, 0x14, 0xb5, 0x07, 0x09, 0xee, 
+0x25, 0xe0, 0x24, 0xfa, 0xf5, 0x24, 0x80, 0x07, 0xef, 0x25, 0xe0, 0x24, 0xfe, 0xf5, 0x24, 0xe5, 
+0x24, 0x25, 0xe0, 0x24, 0x61, 0x12, 0x06, 0x32, 0xe5, 0x24, 0x12, 0x07, 0xa0, 0xfe, 0xe5, 0x24, 
+0x25, 0xe0, 0x24, 0x66, 0x12, 0x07, 0xa4, 0xfe, 0xe4, 0xfc, 0xfd, 0x78, 0x5a, 0x12, 0x0f, 0x87, 
+0xe5, 0x24, 0x25, 0xe0, 0x24, 0x63, 0x12, 0x06, 0x32, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x60, 0x12, 
+0x07, 0xa4, 0xfe, 0xe5, 0x24, 0x25, 0xe0, 0x24, 0x68, 0x12, 0x07, 0xa4, 0xfe, 0xe4, 0xfc, 0xfd, 
+0x78, 0x5e, 0x12, 0x0f, 0x87, 0x12, 0x05, 0xf0, 0x74, 0x07, 0x93, 0xfe, 0x74, 0x08, 0x78, 0x5e, 
+0x12, 0x09, 0x4e, 0x12, 0x0e, 0x17, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 
+0xf0, 0x78, 0x5e, 0x12, 0x08, 0x15, 0x12, 0x0e, 0x17, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 
+0x00, 0x12, 0x07, 0x0c, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x05, 0xf0, 0x74, 
+0x05, 0x93, 0xfe, 0x74, 0x06, 0x78, 0x5a, 0x12, 0x09, 0x4e, 0x12, 0x06, 0x77, 0xd0, 0x07, 0xd0, 
+0x06, 0xd0, 0x05, 0xd0, 0x04, 0xc3, 0xef, 0x9b, 0xff, 0xee, 0x9a, 0xfe, 0xed, 0x99, 0xfd, 0xec, 
+0x98, 0xfc, 0x78, 0x62, 0x12, 0x0f, 0x87, 0x78, 0x62, 0x12, 0x0f, 0x6e, 0xec, 0x33, 0x50, 0x0b, 
+0x78, 0x5a, 0x12, 0x0f, 0x93, 0x00, 0x00, 0x00, 0x01, 0x80, 0x5b, 0x12, 0x0a, 0x6d, 0x7b, 0x02, 
+0x12, 0x07, 0x90, 0x12, 0x0e, 0xa2, 0x78, 0x62, 0x12, 0x0f, 0x7a, 0x12, 0x07, 0x0c, 0xc0, 0x04, 
+0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x0a, 0x6d, 0x2f, 0xfb, 0xea, 0x3e, 0xfa, 0xe9, 0x3d, 
+0xf9, 0xe8, 0x3c, 0xf8, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0x12, 0x0e, 0xa2, 0x78, 
+0x5a, 0x12, 0x0f, 0x87, 0x12, 0x05, 0xf0, 0x78, 0x5a, 0x12, 0x08, 0x15, 0xd3, 0x12, 0x0f, 0x4a, 
+0x40, 0x14, 0x12, 0x05, 0xf0, 0x74, 0x02, 0x93, 0x24, 0xff, 0xff, 0x74, 0x01, 0x93, 0x12, 0x07, 
+0x34, 0x78, 0x5a, 0x12, 0x0f, 0x87, 0x78, 0x5a, 0x12, 0x0f, 0x6e, 0xe5, 0x23, 0x12, 0x07, 0xd7, 
+0x22, 0xe4, 0x78, 0x6d, 0xf6, 0x18, 0xe6, 0x14, 0x70, 0x03, 0x02, 0x22, 0x32, 0x14, 0x70, 0x03, 
+0x02, 0x22, 0xac, 0x24, 0x02, 0x60, 0x03, 0x02, 0x22, 0xce, 0x12, 0x17, 0xf3, 0xe4, 0x93, 0x78, 
+0x70, 0xf6, 0x12, 0x31, 0x3f, 0x12, 0x2f, 0x71, 0x78, 0x68, 0xe6, 0xf5, 0x23, 0x75, 0x24, 0x20, 
+0x76, 0x40, 0x7e, 0x00, 0x7f, 0x12, 0x7d, 0x20, 0x7b, 0x01, 0x7a, 0x02, 0x79, 0xb6, 0x12, 0x0f, 
+0xeb, 0xe5, 0x24, 0xd3, 0x94, 0x01, 0x40, 0x42, 0x12, 0x22, 0xd3, 0xe5, 0x22, 0xc3, 0x78, 0x70, 
+0x96, 0x50, 0x2f, 0x12, 0x17, 0xf3, 0x74, 0x02, 0x93, 0x75, 0xf0, 0xa3, 0xa4, 0xff, 0xae, 0xf0, 
+0x12, 0x18, 0x0d, 0xe0, 0xfc, 0xa3, 0xe0, 0xc3, 0x9f, 0xec, 0x9e, 0x50, 0x08, 0x12, 0x19, 0x06, 
+0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x12, 0x19, 0x06, 0xc3, 0x13, 0xfe, 0xef, 0x4e, 0xf0, 0x05, 0x22, 
+0x80, 0xc9, 0xe5, 0x24, 0xc3, 0x13, 0xf5, 0x24, 0x80, 0xb7, 0x78, 0x68, 0xa6, 0x23, 0x78, 0x6c, 
+0x76, 0x01, 0x12, 0x17, 0xf3, 0x74, 0x05, 0x93, 0x25, 0xe0, 0xf5, 0x25, 0x74, 0x04, 0x93, 0x33, 
+0xf5, 0x24, 0xe4, 0x78, 0x6f, 0xf6, 0xfe, 0xfd, 0x12, 0x18, 0xe6, 0x7e, 0x00, 0x7f, 0x24, 0x7d, 
+0x00, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x5d, 0x12, 0x0f, 0xeb, 0x75, 0x23, 0x04, 0x12, 0x31, 0x3f, 
+0x12, 0x22, 0xd3, 0xe5, 0x22, 0xc3, 0x78, 0x70, 0x96, 0x50, 0x3a, 0x12, 0x18, 0x0d, 0xe0, 0xfe, 
+0xa3, 0xe0, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0x12, 0x18, 0xb2, 0xee, 
+0x8f, 0xf0, 0x12, 0x0d, 0x05, 0x12, 0x18, 0xb2, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x22, 0x75, 
+0xf0, 0x0a, 0xa4, 0x24, 0x09, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xee, 0xf0, 0xa3, 0xef, 
+0xf0, 0x05, 0x22, 0x80, 0xbe, 0xd5, 0x23, 0xb8, 0x78, 0x6c, 0x76, 0x02, 0x12, 0x31, 0x3f, 0x12, 
+0x28, 0x11, 0x78, 0x70, 0xe6, 0xfd, 0xe4, 0xff, 0x12, 0x2e, 0x2d, 0x78, 0x6d, 0xe6, 0x30, 0xe1, 
+0x04, 0x78, 0x6f, 0x76, 0x28, 0x78, 0x70, 0xe6, 0xfd, 0xe4, 0xff, 0x02, 0x1b, 0x5b, 0xe4, 0x78, 
+0x6c, 0xf6, 0x22, 0x12, 0x28, 0x11, 0x12, 0x31, 0x3f, 0xe4, 0xf5, 0x22, 0x22, 0x8b, 0x1e, 0x8a, 
+0x1f, 0x89, 0x20, 0x43, 0xad, 0x04, 0x43, 0x95, 0x80, 0x90, 0xff, 0x41, 0x74, 0x80, 0xf0, 0x90, 
+0xff, 0x49, 0x74, 0x0d, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xff, 0x42, 0x04, 0xf0, 0x90, 0xff, 0x55, 
+0x74, 0x7d, 0xf0, 0x90, 0xff, 0x54, 0xe4, 0xf0, 0x90, 0xff, 0x5c, 0xf0, 0x90, 0xff, 0x48, 0x74, 
+0x10, 0xf0, 0xe4, 0xf5, 0x25, 0xf5, 0x26, 0xf5, 0x27, 0xf5, 0x28, 0xf5, 0x24, 0xe4, 0x12, 0x34, 
+0x9b, 0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x30, 0xb7, 0x12, 0x34, 0xa3, 0x7d, 0x08, 0x12, 0x2f, 
+0xd0, 0x12, 0x34, 0x8d, 0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x30, 0xb7, 0x12, 0x34, 0x8d, 0x7d, 
+0x08, 0x12, 0x2f, 0xd0, 0xe4, 0xff, 0x00, 0x0f, 0xbf, 0xc8, 0xfb, 0x74, 0x03, 0x12, 0x34, 0x9b, 
+0xf4, 0x60, 0x0d, 0xe4, 0xfd, 0x12, 0x33, 0x80, 0x12, 0x34, 0xa3, 0x7d, 0x07, 0x12, 0x2f, 0xd0, 
+0x12, 0x34, 0x8d, 0xf4, 0x60, 0x0d, 0x7d, 0x01, 0x12, 0x33, 0x80, 0x12, 0x34, 0x8d, 0x7d, 0x07, 
+0x12, 0x2f, 0xd0, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x07, 0xf0, 0x90, 
+0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0x74, 0x09, 0xf0, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xbd, 
+0xf0, 0x90, 0xff, 0x43, 0xe0, 0x30, 0xe4, 0xf9, 0x90, 0xff, 0x43, 0x74, 0x9f, 0xf0, 0x90, 0xff, 
+0x52, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x26, 0xf5, 0x26, 0xee, 0x35, 0x25, 0xf5, 0x25, 0x90, 0xff, 
+0x5a, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x28, 0xf5, 0x28, 0xee, 0x35, 0x27, 0xf5, 0x27, 0x05, 0x24, 
+0xe5, 0x24, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x02, 0x23, 0x1d, 0xe5, 0x26, 0xae, 0x25, 0x78, 0x02, 
+0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xab, 0x21, 0xaa, 0x22, 0xa9, 0x23, 0xee, 0x8f, 
+0xf0, 0x12, 0x0d, 0xcb, 0xe5, 0x28, 0xae, 0x27, 0x78, 0x02, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 
+0xf9, 0xff, 0xab, 0x21, 0xaa, 0x22, 0xa9, 0x23, 0x90, 0x00, 0x02, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 
+0xea, 0x12, 0x34, 0xa3, 0xf4, 0x60, 0x05, 0xe4, 0xfd, 0x12, 0x2f, 0xd0, 0x12, 0x34, 0x8d, 0xf4, 
+0x60, 0x05, 0xe4, 0xfd, 0x12, 0x2f, 0xd0, 0x22, 0x15, 0x0e, 0x15, 0x0e, 0x15, 0x0e, 0xa8, 0x0e, 
+0xa6, 0x03, 0x08, 0xa6, 0x02, 0x08, 0xa6, 0x01, 0x15, 0x0e, 0x12, 0x19, 0x40, 0x78, 0x6b, 0xe6, 
+0x7f, 0x08, 0x30, 0xe0, 0x02, 0x7f, 0x05, 0xa8, 0x0e, 0xa6, 0x07, 0x12, 0x17, 0xfa, 0xff, 0xa8, 
+0x0e, 0xe6, 0xfd, 0x12, 0x18, 0xa7, 0x12, 0x0f, 0xbc, 0x78, 0x6b, 0xe6, 0x64, 0x03, 0x78, 0x66, 
+0x60, 0x0d, 0x12, 0x17, 0xfc, 0xff, 0xa8, 0x0e, 0xe6, 0xfd, 0x12, 0x18, 0xa7, 0x80, 0x08, 0x12, 
+0x17, 0xfc, 0x12, 0x18, 0xa4, 0x7d, 0x08, 0x12, 0x0f, 0xbc, 0x12, 0x19, 0x16, 0xff, 0x78, 0x67, 
+0xe6, 0x12, 0x18, 0x7e, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x19, 0x1e, 0xff, 0x18, 0xe6, 0x12, 
+0x18, 0x7e, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x02, 0x00, 0xe0, 0x60, 0x2e, 0x08, 0xe6, 0xff, 
+0x12, 0x18, 0x0f, 0x12, 0x18, 0x78, 0x12, 0x25, 0x2c, 0x12, 0x17, 0xf3, 0x12, 0x19, 0x26, 0x40, 
+0x1a, 0x78, 0x66, 0xe6, 0xff, 0x12, 0x18, 0x0f, 0x12, 0x18, 0x78, 0x12, 0x25, 0x2c, 0x12, 0x17, 
+0xf3, 0x12, 0x19, 0x26, 0x40, 0x05, 0xe4, 0x90, 0x02, 0x00, 0xf0, 0x90, 0x02, 0x00, 0xe0, 0x70, 
+0x1b, 0x78, 0x67, 0x06, 0x06, 0x18, 0x06, 0x06, 0x78, 0x6e, 0x16, 0x78, 0x6a, 0xe6, 0x7f, 0x00, 
+0x20, 0xe4, 0x02, 0x7f, 0x01, 0x90, 0x02, 0x00, 0xef, 0xf0, 0x80, 0x05, 0xe4, 0x90, 0x02, 0x00, 
+0xf0, 0x78, 0x6e, 0xe6, 0x70, 0x0a, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0x80, 0x35, 
+0x12, 0x18, 0x1d, 0xa8, 0x0e, 0x76, 0x64, 0x90, 0xff, 0x58, 0xe0, 0xff, 0x90, 0xff, 0x50, 0xe0, 
+0x4f, 0x30, 0xe7, 0x06, 0xa8, 0x0e, 0x16, 0xe6, 0x70, 0xed, 0x12, 0x17, 0xfa, 0x12, 0x18, 0xa4, 
+0x7d, 0x06, 0x12, 0x0f, 0xbc, 0x78, 0x66, 0x12, 0x17, 0xfc, 0x12, 0x18, 0xa4, 0x7d, 0x06, 0x12, 
+0x0f, 0xbc, 0x12, 0x19, 0x47, 0xe5, 0x0e, 0x24, 0x04, 0xf5, 0x0e, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 
+0xc3, 0x9d, 0xff, 0xee, 0x9c, 0xfe, 0x12, 0x35, 0x95, 0x22, 0x8e, 0x1b, 0x8f, 0x1c, 0xe4, 0x78, 
+0x6c, 0xf6, 0x85, 0x1b, 0x0c, 0x85, 0x1c, 0x0d, 0xe5, 0x1c, 0x24, 0x2c, 0xff, 0xe4, 0x35, 0x1b, 
+0xfa, 0xa9, 0x07, 0x7b, 0xff, 0x78, 0x68, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x04, 0x12, 
+0x0b, 0xc8, 0x78, 0x82, 0x74, 0x01, 0xf2, 0x08, 0x74, 0xcc, 0xf2, 0x85, 0x1c, 0x82, 0x85, 0x1b, 
+0x83, 0xe4, 0x93, 0xff, 0x7e, 0x00, 0xe5, 0x1c, 0x24, 0x06, 0xfd, 0xe4, 0x35, 0x1b, 0xfa, 0xa9, 
+0x05, 0x7b, 0xff, 0x18, 0xe2, 0xfc, 0x08, 0xe2, 0xf8, 0x7d, 0x01, 0x12, 0x0b, 0xc8, 0x90, 0x01, 
+0xa7, 0xe0, 0xff, 0x12, 0x2f, 0x0b, 0x90, 0x00, 0xbe, 0xe0, 0x64, 0x80, 0x70, 0x04, 0xa3, 0xe0, 
+0x64, 0x75, 0x70, 0x44, 0xff, 0x85, 0x1c, 0x82, 0x85, 0x1b, 0x83, 0xe4, 0x93, 0xfe, 0xef, 0xc3, 
+0x9e, 0x50, 0x35, 0xe4, 0xf5, 0x1d, 0x12, 0x19, 0x39, 0xfd, 0x12, 0x18, 0x04, 0xfe, 0xe5, 0x1d, 
+0x90, 0x35, 0xc8, 0x93, 0xfb, 0xee, 0x6b, 0x60, 0x0b, 0xe5, 0x1d, 0xc3, 0x94, 0x0f, 0x50, 0x04, 
+0x05, 0x1d, 0x80, 0xe2, 0xe5, 0x1d, 0x90, 0x35, 0xd7, 0x93, 0xfe, 0xed, 0x2f, 0xf5, 0x82, 0xe4, 
+0x3c, 0xf5, 0x83, 0xee, 0xf0, 0x0f, 0x80, 0xbd, 0xaf, 0x1c, 0xae, 0x1b, 0x12, 0x2d, 0x4c, 0x7e, 
+0x00, 0x7d, 0x00, 0x12, 0x18, 0xe6, 0x78, 0x81, 0x74, 0x09, 0xf2, 0x78, 0x6a, 0xe6, 0xff, 0x20, 
+0xe3, 0x06, 0x78, 0x81, 0xe2, 0x44, 0x04, 0xf2, 0xef, 0x20, 0xe2, 0x06, 0x78, 0x81, 0xe2, 0x44, 
+0x20, 0xf2, 0xe4, 0x78, 0x6e, 0xf6, 0x43, 0x95, 0x80, 0x78, 0x6a, 0xe6, 0x7f, 0x00, 0x30, 0xe1, 
+0x02, 0x7f, 0x40, 0xef, 0x44, 0x37, 0x90, 0xff, 0x41, 0xf0, 0x90, 0xff, 0x49, 0x74, 0x0d, 0xf0, 
+0xe4, 0xfd, 0x7f, 0x11, 0x12, 0x34, 0x04, 0x7d, 0x01, 0x7f, 0x16, 0x02, 0x34, 0x04, 0x8b, 0x22, 
+0x8a, 0x23, 0x89, 0x24, 0x12, 0x2b, 0x49, 0x12, 0x2b, 0xd0, 0x12, 0x31, 0xc1, 0x74, 0x79, 0x93, 
+0xf5, 0x2b, 0xe4, 0xf5, 0x2c, 0x12, 0x31, 0xf9, 0x12, 0x0b, 0xee, 0x70, 0x21, 0x12, 0x31, 0xc1, 
+0x74, 0x98, 0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0x7f, 0x00, 0x50, 0x02, 0x7f, 0x01, 
+0x12, 0x27, 0x04, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0x7e, 0x75, 0x2c, 0x03, 0x80, 0x3a, 0x12, 0x31, 
+0xf9, 0x12, 0x0b, 0xee, 0xff, 0xe5, 0x2b, 0x14, 0x6f, 0x70, 0x2d, 0x12, 0x31, 0xc1, 0x74, 0x99, 
+0x93, 0xf5, 0x2d, 0xc3, 0x64, 0x80, 0x94, 0x80, 0xe5, 0x2b, 0x50, 0x06, 0x25, 0xe0, 0x14, 0xff, 
+0x80, 0x05, 0x25, 0xe0, 0x24, 0xfe, 0xff, 0x12, 0x27, 0x04, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0x7e, 
+0xe5, 0x2b, 0x25, 0xe0, 0x24, 0xfd, 0xf5, 0x2c, 0xe5, 0x2c, 0x60, 0x47, 0x24, 0xff, 0xff, 0xe4, 
+0x34, 0xff, 0xfe, 0xef, 0x25, 0xe0, 0xff, 0xee, 0x33, 0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x8f, 
+0x82, 0xf5, 0x83, 0x12, 0x0d, 0x46, 0xff, 0xae, 0xf0, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 
+0x82, 0x85, 0xf0, 0x83, 0x12, 0x0d, 0x46, 0x2f, 0xff, 0xee, 0x35, 0xf0, 0xfe, 0x12, 0x31, 0xc1, 
+0xd3, 0x74, 0x9b, 0x93, 0x9f, 0x74, 0x9a, 0x93, 0x9e, 0x40, 0x08, 0x12, 0x31, 0xf9, 0x74, 0xff, 
+0x12, 0x0c, 0x34, 0x22, 0x8f, 0x2c, 0xaf, 0x2d, 0xef, 0x33, 0x95, 0xe0, 0xfe, 0x12, 0x35, 0x95, 
+0xab, 0x22, 0xaa, 0x23, 0xa9, 0x24, 0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 
+0x83, 0x12, 0x0d, 0x46, 0xfd, 0xac, 0xf0, 0xcf, 0xcd, 0xcf, 0xce, 0xcc, 0xce, 0x12, 0x0c, 0x7a, 
+0x75, 0xf0, 0x02, 0xe5, 0x2c, 0xa4, 0xf5, 0x82, 0x85, 0xf0, 0x83, 0x22, 0xe4, 0xf5, 0x22, 0xf5, 
+0x23, 0xff, 0xfe, 0x78, 0x33, 0xe2, 0x25, 0xe0, 0xfd, 0x78, 0x05, 0xe2, 0x2d, 0xfd, 0x78, 0x0b, 
+0xe2, 0xc4, 0x54, 0xf0, 0x2d, 0xfd, 0x78, 0x39, 0xe2, 0xfc, 0xc4, 0x33, 0x54, 0xe0, 0x2d, 0x24, 
+0xfe, 0x60, 0x1c, 0x24, 0xf0, 0x60, 0x18, 0x14, 0x60, 0x1d, 0x24, 0xf2, 0x60, 0x11, 0x24, 0xfe, 
+0x60, 0x25, 0x24, 0xf0, 0x60, 0x35, 0x24, 0x02, 0x70, 0x66, 0xe4, 0xfd, 0xff, 0x80, 0x1c, 0x75, 
+0x22, 0x00, 0x75, 0x23, 0x01, 0x80, 0x59, 0xe4, 0xfd, 0xff, 0x12, 0x30, 0x71, 0x8e, 0x22, 0x8f, 
+0x23, 0xe4, 0xfd, 0x7f, 0x01, 0x80, 0x0f, 0x7d, 0x01, 0x7f, 0x01, 0x12, 0x30, 0x71, 0x8e, 0x22, 
+0x8f, 0x23, 0x7d, 0x01, 0xe4, 0xff, 0x12, 0x30, 0x71, 0x80, 0x35, 0x7d, 0x01, 0x7f, 0x01, 0x12, 
+0x30, 0x71, 0xc0, 0x06, 0xc0, 0x07, 0xe4, 0xfd, 0xff, 0x12, 0x30, 0x71, 0xd0, 0xe0, 0x2f, 0xf5, 
+0x23, 0xd0, 0xe0, 0x3e, 0xf5, 0x22, 0xe4, 0xfd, 0x7f, 0x01, 0x12, 0x30, 0x71, 0xc0, 0x06, 0xc0, 
+0x07, 0x7d, 0x01, 0xe4, 0xff, 0x12, 0x30, 0x71, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 
+0xd3, 0xe5, 0x23, 0x9f, 0xe5, 0x22, 0x9e, 0x40, 0x27, 0x78, 0x24, 0x7c, 0x00, 0x7d, 0x00, 0x12, 
+0x07, 0x19, 0x78, 0x01, 0x7c, 0x00, 0x7d, 0xfe, 0x7b, 0xfe, 0x7a, 0x00, 0x79, 0x2f, 0x12, 0x07, 
+0x1f, 0x78, 0x2f, 0x7c, 0x00, 0x7d, 0xfe, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x12, 0x07, 0x1f, 
+0x22, 0x12, 0x2f, 0x71, 0x90, 0xff, 0x4a, 0x74, 0x71, 0xf0, 0x90, 0xff, 0x50, 0x74, 0x0f, 0xf0, 
+0x90, 0xff, 0x58, 0xf0, 0x90, 0xff, 0x40, 0xe4, 0xf0, 0x12, 0x19, 0x40, 0xe4, 0x12, 0x19, 0x30, 
+0x78, 0x69, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x90, 0xff, 0x55, 0x74, 0x28, 0xf0, 0x90, 0xff, 0x48, 
+0x74, 0x02, 0xf0, 0x43, 0xad, 0x04, 0x12, 0x19, 0x47, 0x90, 0xff, 0x43, 0xe0, 0x20, 0xe4, 0x05, 
+0x12, 0x34, 0x4b, 0x80, 0xf4, 0x12, 0x19, 0x40, 0xe4, 0x78, 0x67, 0xf6, 0x18, 0x76, 0x01, 0x78, 
+0x70, 0xe6, 0xc3, 0x13, 0x78, 0x6e, 0xf6, 0x78, 0x69, 0xe6, 0x90, 0xff, 0x42, 0xf0, 0x18, 0xe6, 
+0x90, 0xff, 0x48, 0xf0, 0x90, 0x00, 0xba, 0xe0, 0x60, 0x08, 0x90, 0x00, 0xbc, 0xe0, 0x90, 0xff, 
+0x42, 0xf0, 0x78, 0x6a, 0xe6, 0x7f, 0x00, 0x20, 0xe4, 0x02, 0x7f, 0x01, 0x90, 0x02, 0x00, 0xef, 
+0xf0, 0x12, 0x18, 0x1d, 0x08, 0x12, 0x17, 0xfc, 0xff, 0x7d, 0x06, 0x12, 0x2f, 0xd0, 0x78, 0x66, 
+0x12, 0x17, 0xfc, 0xff, 0x7d, 0x06, 0x12, 0x2f, 0xd0, 0x78, 0x81, 0xe2, 0xff, 0x90, 0xff, 0x40, 
+0xf0, 0x78, 0x6a, 0xe6, 0x30, 0xe7, 0x26, 0x43, 0xad, 0x04, 0xef, 0xf0, 0x90, 0xff, 0x43, 0xe0, 
+0x20, 0xe4, 0x05, 0x12, 0x34, 0x4b, 0x80, 0xf4, 0x7b, 0xff, 0x7a, 0x2f, 0x79, 0xd0, 0x12, 0x24, 
+0x18, 0x12, 0x18, 0x9c, 0xf0, 0x78, 0x6e, 0xe6, 0x70, 0xe2, 0x02, 0x31, 0x3f, 0x53, 0xad, 0xfb, 
+0x12, 0x19, 0x47, 0x22, 0x78, 0xff, 0xe4, 0xf6, 0xd8, 0xfd, 0x90, 0x00, 0x00, 0x7f, 0x00, 0x7e, 
+0x03, 0xe4, 0xf0, 0xa3, 0xdf, 0xfc, 0xde, 0xfa, 0x75, 0x81, 0x7a, 0x75, 0xa0, 0x00, 0x02, 0x29, 
+0x3c, 0x02, 0x32, 0x7b, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 
+0xf2, 0x08, 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 
+0x33, 0xc4, 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 
+0xdf, 0xe4, 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x35, 0x5f, 0xe4, 
+0x7e, 0x01, 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 
+0x93, 0xa3, 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 
+0xa3, 0xfa, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 
+0xca, 0xf0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 
+0xbe, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 0xfa, 0x34, 0x00, 0xf5, 
 0x25, 0xee, 0x8f, 0xf0, 0x12, 0x0d, 0xcb, 0x90, 0x00, 0x02, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 
 0x12, 0x0d, 0x46, 0xff, 0xae, 0xf0, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 
 0x25, 0xfa, 0x34, 0x00, 0xf5, 0x25, 0xee, 0x8f, 0xf0, 0x02, 0x0d, 0xcb, 0x90, 0x00, 0x05, 0xab, 
-0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x02, 0x0c, 0x07, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 
-0x26, 0xe5, 0x25, 0xfa, 0x34, 0x00, 0xf5, 0x25, 0xe4, 0xf5, 0xf0, 0x02, 0x0d, 0xcb, 0xab, 0x1b, 
-0xaa, 0x1c, 0xa9, 0x1d, 0x90, 0x00, 0x0b, 0x02, 0x0c, 0x07, 0xe5, 0x1e, 0xfe, 0x7c, 0x00, 0xe4, 
-0x25, 0x21, 0xff, 0xec, 0x3e, 0xfe, 0x22, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x22, 0x75, 0x24, 
-0x01, 0x85, 0x22, 0x25, 0x85, 0x23, 0x26, 0x22, 0xab, 0x24, 0xaa, 0x25, 0xa9, 0x26, 0x22, 0x8d, 
-0x82, 0x8c, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22, 0x8f, 0x1b, 0x8c, 0x1c, 0x8d, 0x1d, 0xe4, 
-0xff, 0x79, 0x01, 0xe4, 0xf5, 0x1e, 0xfe, 0x12, 0x39, 0xef, 0xe5, 0x82, 0x2e, 0xf5, 0x82, 0xe4, 
-0x35, 0x83, 0xf5, 0x83, 0xe4, 0x93, 0x25, 0xe0, 0x25, 0x1b, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 
-0x12, 0x39, 0xef, 0x74, 0x04, 0x93, 0xfa, 0x74, 0x05, 0x93, 0xfb, 0xc3, 0xed, 0x9b, 0xec, 0x9a, 
-0x40, 0x02, 0x05, 0x1e, 0x0e, 0xbe, 0x04, 0xcf, 0x12, 0x39, 0xef, 0x74, 0x06, 0x93, 0xfd, 0xe5, 
-0x1e, 0xc3, 0x9d, 0x50, 0x04, 0xe4, 0xf9, 0x80, 0x04, 0x0f, 0xbf, 0x05, 0xb6, 0x90, 0x00, 0xc5, 
-0xe0, 0xb5, 0x01, 0x07, 0xe4, 0x90, 0x00, 0xc4, 0xf0, 0x80, 0x28, 0x90, 0x00, 0xc4, 0xe0, 0x04, 
-0xf0, 0x85, 0x1d, 0x82, 0x85, 0x1c, 0x83, 0x74, 0x23, 0x93, 0xff, 0x90, 0x00, 0xc4, 0xe0, 0xfd, 
-0x33, 0x95, 0xe0, 0xfc, 0xd3, 0xed, 0x9f, 0x74, 0x80, 0xf8, 0x6c, 0x98, 0x40, 0x05, 0xe4, 0xf0, 
-0xa3, 0xe9, 0xf0, 0x90, 0x00, 0xc5, 0xe0, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0xaa, 0x22, 0xe4, 0x78, 
-0x62, 0xf6, 0x08, 0xf6, 0xfe, 0xfb, 0x12, 0x08, 0x00, 0xf9, 0xf5, 0x30, 0xf5, 0x2e, 0x75, 0x2f, 
-0xff, 0x78, 0x7a, 0xe6, 0xff, 0xe9, 0xc3, 0x9f, 0x50, 0x63, 0xe9, 0x12, 0x06, 0x2c, 0xe9, 0x25, 
-0xe0, 0x25, 0xe0, 0x24, 0x5e, 0xf8, 0xe2, 0x2f, 0xf5, 0x32, 0x18, 0xe2, 0x3e, 0xf5, 0x31, 0x12, 
-0x09, 0x97, 0x74, 0x04, 0x93, 0xfe, 0x74, 0x05, 0x93, 0xff, 0x78, 0x62, 0xe6, 0xfc, 0x08, 0xe6, 
-0xfd, 0xef, 0x2d, 0xfb, 0xee, 0x3c, 0xfa, 0xd3, 0xe5, 0x32, 0x9b, 0xe5, 0x31, 0x9a, 0x40, 0x06, 
-0x75, 0x30, 0x01, 0x18, 0x80, 0x1d, 0xe5, 0x32, 0x2f, 0xff, 0xe5, 0x31, 0x3e, 0xfe, 0xd3, 0xed, 
-0x9f, 0xec, 0x9e, 0x40, 0x15, 0xe5, 0x30, 0x60, 0x08, 0xe4, 0xf5, 0x30, 0x12, 0x32, 0x15, 0x05, 
-0x2e, 0x78, 0x62, 0xa6, 0x31, 0x08, 0xa6, 0x32, 0x89, 0x2f, 0x09, 0x80, 0x94, 0xe5, 0x30, 0x60, 
-0x03, 0x12, 0x32, 0x15, 0x22, 0xe4, 0xfb, 0xeb, 0x12, 0x06, 0x85, 0xe6, 0xfa, 0xf4, 0x60, 0x67, 
-0xea, 0x70, 0x0c, 0x12, 0x05, 0xf0, 0x74, 0x11, 0x93, 0xf5, 0x2e, 0x74, 0x12, 0x80, 0x1d, 0x78, 
-0x7a, 0xe6, 0x14, 0xb5, 0x02, 0x0c, 0x12, 0x05, 0xf0, 0x74, 0x13, 0x93, 0xf5, 0x2e, 0x74, 0x14, 
-0x80, 0x0a, 0x12, 0x05, 0xf0, 0x74, 0x0f, 0x93, 0xf5, 0x2e, 0x74, 0x10, 0x93, 0xf5, 0x2f, 0x78, 
-0x0c, 0xe2, 0x70, 0x05, 0x78, 0x3a, 0xe2, 0x60, 0x14, 0xe5, 0x2f, 0x25, 0xe0, 0xff, 0xe5, 0x2e, 
-0x33, 0xfe, 0x7c, 0x00, 0x7d, 0x03, 0x12, 0x0c, 0x7a, 0x8e, 0x2e, 0x8f, 0x2f, 0xea, 0x12, 0x06, 
-0x2c, 0xea, 0x25, 0xe0, 0x12, 0x07, 0xa0, 0xfe, 0xc3, 0xef, 0x95, 0x2f, 0xee, 0x95, 0x2e, 0x50, 
-0x06, 0xeb, 0x12, 0x06, 0x85, 0x76, 0xff, 0x0b, 0xeb, 0x64, 0x02, 0x70, 0x8a, 0xe5, 0x41, 0xb4, 
-0xff, 0x08, 0xe5, 0x45, 0xf4, 0x60, 0x03, 0x12, 0x07, 0x3b, 0x22, 0xef, 0x54, 0x07, 0xfe, 0x74, 
-0x01, 0xa8, 0x06, 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf9, 0xf4, 0xfe, 0xef, 0x54, 0xf0, 
-0xf5, 0x3e, 0x64, 0x10, 0x70, 0x1e, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x90, 0xff, 0x12, 0xed, 0x30, 
-0xe2, 0x05, 0xe0, 0x49, 0xf0, 0x80, 0x03, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x14, 
-0x15, 0x83, 0x80, 0x10, 0xe5, 0x3e, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xfb, 0xe4, 0x34, 0xff, 
-0xf5, 0x83, 0x8b, 0x82, 0xed, 0x24, 0xfb, 0x60, 0x14, 0x14, 0x60, 0x20, 0x24, 0xfe, 0x70, 0x2a, 
-0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x1e, 0x15, 0x83, 0x80, 0x1a, 0xe0, 0x5e, 0xf0, 
-0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x49, 0xf0, 0x22, 0xe0, 0x49, 0xf0, 0xe5, 
-0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x5e, 0xf0, 0x22, 0xe4, 0xf5, 0x22, 0x12, 0x08, 
-0xae, 0xe2, 0x60, 0x11, 0xa8, 0x07, 0xe8, 0x24, 0x0a, 0xf8, 0xe2, 0x7f, 0x80, 0x60, 0x02, 0x7f, 
-0x08, 0x8f, 0x22, 0x80, 0x19, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x0a, 0xf8, 0xe2, 0x60, 0x0f, 0xa8, 
-0x07, 0xe8, 0x24, 0x0e, 0xf8, 0xe2, 0x7f, 0x04, 0x60, 0x02, 0x7f, 0x08, 0x8f, 0x22, 0xe5, 0x22, 
-0xb4, 0x04, 0x1f, 0x12, 0x0a, 0x15, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xc0, 0x01, 0xa9, 0x07, 0xa8, 
-0x01, 0x7c, 0x00, 0x7d, 0xfe, 0xd0, 0x01, 0x12, 0x07, 0x1f, 0x78, 0x79, 0xe6, 0x24, 0x04, 0xf8, 
-0xe4, 0xf2, 0x78, 0x79, 0xe6, 0xff, 0x24, 0x05, 0xf8, 0xe5, 0x22, 0xf2, 0x7a, 0x00, 0xa9, 0x07, 
-0x7b, 0xfe, 0xef, 0x24, 0x06, 0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x0b, 
-0xc8, 0xc0, 0xe0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x78, 0x53, 0xa6, 0xa3, 
-0x08, 0xa6, 0xa6, 0x75, 0xa3, 0x08, 0xe6, 0xff, 0x30, 0xe4, 0x07, 0x75, 0xd1, 0xdf, 0x78, 0x81, 
-0x76, 0x00, 0x78, 0x53, 0xe6, 0x30, 0xe0, 0x40, 0xef, 0x20, 0xe0, 0x39, 0x78, 0x81, 0xe6, 0xff, 
-0x70, 0x18, 0x90, 0x02, 0xf8, 0xe0, 0xfe, 0xf5, 0xd6, 0x18, 0xee, 0xf6, 0xc3, 0x94, 0x10, 0x50, 
-0x24, 0x78, 0x82, 0xe6, 0x25, 0xd6, 0xf5, 0xd6, 0x80, 0x1b, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 
-0x34, 0x02, 0xf5, 0x83, 0xe0, 0xff, 0x78, 0x80, 0xe6, 0x06, 0x25, 0x50, 0xf5, 0x82, 0xe4, 0x35, 
-0x4f, 0xf5, 0x83, 0xef, 0xf0, 0x78, 0x81, 0x06, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 
-0x32, 0xab, 0x07, 0xaa, 0x05, 0xe4, 0x78, 0x75, 0xf6, 0xeb, 0x12, 0x17, 0xd7, 0xe0, 0xf5, 0x28, 
-0xa3, 0xe0, 0xf5, 0x29, 0x78, 0x70, 0xe6, 0x75, 0x26, 0x00, 0xf5, 0x27, 0xae, 0x26, 0xff, 0x7c, 
-0x00, 0x7d, 0xfc, 0x12, 0x0c, 0x68, 0xd3, 0xe5, 0x29, 0x9f, 0xe5, 0x28, 0x9e, 0x40, 0x06, 0x78, 
-0x75, 0xe6, 0x44, 0x20, 0xf6, 0x12, 0x17, 0xba, 0x74, 0x05, 0x93, 0x25, 0xe0, 0xf5, 0x29, 0x74, 
-0x04, 0x93, 0x33, 0xf5, 0x28, 0xeb, 0x12, 0x18, 0x7d, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x29, 0xff, 
-0xe5, 0x28, 0x3e, 0xfe, 0xeb, 0x12, 0x17, 0xd7, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 
-0x40, 0x09, 0x78, 0x75, 0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0xf6, 0x0b, 0x1a, 0xea, 0x70, 0x99, 
-0x22, 0xe4, 0xf5, 0x1b, 0x78, 0x1c, 0x7c, 0x00, 0xfd, 0x7b, 0xff, 0x7a, 0x3a, 0x79, 0x65, 0xfe, 
-0x7f, 0x02, 0x12, 0x0b, 0xc8, 0x75, 0x21, 0x01, 0x75, 0x22, 0x00, 0x75, 0x23, 0xbc, 0x7b, 0x00, 
-0x7a, 0x00, 0x79, 0x1c, 0x12, 0x23, 0xf8, 0xe5, 0x1c, 0xf4, 0x60, 0x14, 0x90, 0x00, 0xbc, 0x12, 
-0x32, 0xa5, 0x40, 0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x40, 0x03, 0x75, 0x1b, 0x01, 
-0xe5, 0x1d, 0xf4, 0x60, 0x14, 0x90, 0x00, 0xbe, 0x12, 0x32, 0xa5, 0x40, 0x09, 0xd3, 0xef, 0x94, 
-0xb8, 0xee, 0x94, 0x0b, 0x40, 0x03, 0x75, 0x1b, 0x01, 0x78, 0xb0, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 
-0x01, 0x7a, 0x00, 0x79, 0xbc, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0b, 0xc8, 0xaf, 0x1b, 0x22, 0xad, 
-0x07, 0x7f, 0x3a, 0x12, 0x35, 0x80, 0x90, 0x00, 0xb9, 0xe4, 0xf0, 0xa3, 0xef, 0xf0, 0x7f, 0x3b, 
-0x12, 0x35, 0x80, 0xef, 0xfb, 0x7a, 0x00, 0x90, 0x00, 0xba, 0xe0, 0xfe, 0xe4, 0x2b, 0xff, 0xea, 
-0x3e, 0x90, 0x00, 0xb9, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0xb9, 0xe0, 0xb4, 0x80, 0x08, 0xa3, 
-0xe0, 0xb4, 0x67, 0x03, 0xbd, 0xb6, 0xf1, 0x90, 0x00, 0xb9, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x64, 
-0x77, 0x70, 0x03, 0xee, 0x64, 0x80, 0x60, 0x06, 0xbe, 0x80, 0x08, 0xbf, 0x78, 0x05, 0xed, 0x64, 
-0xb5, 0x60, 0xe4, 0x90, 0x00, 0xb9, 0xe0, 0xb4, 0x80, 0x0a, 0xa3, 0xe0, 0xb4, 0x78, 0x05, 0xed, 
-0x64, 0xb8, 0x60, 0xef, 0x22, 0x78, 0x73, 0xe6, 0x30, 0xe0, 0x08, 0x75, 0x27, 0x05, 0x75, 0x28, 
-0x01, 0x80, 0x06, 0x75, 0x27, 0x08, 0xe4, 0xf5, 0x28, 0xe4, 0xf5, 0x26, 0xe5, 0x26, 0xc3, 0x78, 
-0x78, 0x96, 0x50, 0x40, 0x12, 0x18, 0xbf, 0x25, 0x26, 0x12, 0x19, 0x06, 0xe0, 0xf5, 0x29, 0xe5, 
-0x26, 0x54, 0x01, 0xfd, 0xaf, 0x29, 0x12, 0x34, 0x16, 0xad, 0x28, 0xaf, 0x29, 0x12, 0x31, 0x4c, 
-0xad, 0x27, 0xaf, 0x29, 0x12, 0x30, 0x65, 0x78, 0x73, 0xe6, 0xb4, 0x03, 0x13, 0xe5, 0x26, 0x30, 
-0xe0, 0x0e, 0xe4, 0xfd, 0xaf, 0x29, 0x12, 0x31, 0x4c, 0x7d, 0x08, 0xaf, 0x29, 0x12, 0x30, 0x65, 
-0x05, 0x26, 0x80, 0xb8, 0x22, 0xef, 0x54, 0x07, 0x90, 0x3a, 0x5d, 0x93, 0xfe, 0xf4, 0xf9, 0xef, 
-0x54, 0xf0, 0xff, 0x64, 0x10, 0x60, 0x11, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf5, 0x82, 
-0xe4, 0x34, 0xff, 0xfa, 0xab, 0x82, 0x80, 0x1a, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x7a, 0xff, 0x7b, 
-0x12, 0xed, 0x30, 0xe2, 0x05, 0x12, 0x35, 0x56, 0x80, 0x03, 0x12, 0x35, 0x5e, 0xeb, 0x1b, 0x70, 
-0x01, 0x1a, 0xed, 0x30, 0xe1, 0x05, 0x12, 0x35, 0x56, 0x80, 0x03, 0x12, 0x35, 0x5e, 0xeb, 0x1b, 
-0x70, 0x01, 0x1a, 0xed, 0x30, 0xe0, 0x04, 0x12, 0x35, 0x56, 0x22, 0x12, 0x35, 0x5e, 0x22, 0xc0, 
-0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 
-0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x19, 0x0d, 0x12, 
-0x00, 0x0a, 0x7b, 0xff, 0x7a, 0x2d, 0x79, 0x5b, 0x12, 0x25, 0x33, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 
-0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 
-0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x8f, 0x2a, 0x8d, 0x2b, 0xe5, 0x2b, 0x75, 0xf0, 0x2e, 0xa4, 
-0x24, 0x09, 0x12, 0x06, 0x32, 0xe5, 0x2a, 0x12, 0x0a, 0x0e, 0x12, 0x31, 0x3d, 0xc0, 0x06, 0xc0, 
-0x07, 0xe5, 0x2b, 0x75, 0xf0, 0x2e, 0xa4, 0x24, 0x07, 0x12, 0x06, 0x32, 0xe5, 0x2a, 0x12, 0x0a, 
-0xc1, 0x12, 0x31, 0x3d, 0xd0, 0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x22, 0xf8, 0xe2, 0xfc, 
-0x08, 0xe2, 0xc3, 0x9f, 0xff, 0xec, 0x9e, 0xfe, 0x12, 0x3a, 0x14, 0x22, 0x12, 0x35, 0x46, 0x60, 
-0x3e, 0xee, 0x64, 0x01, 0x70, 0x18, 0xed, 0x60, 0x07, 0x78, 0x83, 0xe6, 0x4c, 0xf6, 0x80, 0x06, 
-0xec, 0xf4, 0x78, 0x83, 0x56, 0xf6, 0x78, 0x83, 0xe6, 0x90, 0xff, 0x18, 0xf0, 0x22, 0xaf, 0x06, 
-0xef, 0x75, 0xf0, 0x04, 0xa4, 0x24, 0x12, 0xff, 0xe5, 0xf0, 0x34, 0xff, 0x8f, 0x82, 0xf5, 0x83, 
-0xed, 0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 
-0xc2, 0xd5, 0xe8, 0x30, 0xe7, 0x0f, 0xb2, 0xd5, 0xe4, 0xc3, 0x9b, 0xfb, 0xe4, 0x9a, 0xfa, 0xe4, 
-0x99, 0xf9, 0xe4, 0x98, 0xf8, 0xec, 0x30, 0xe7, 0x17, 0xb2, 0xd5, 0x12, 0x31, 0xc6, 0x12, 0x0e, 
-0xa2, 0xe4, 0xc3, 0x9b, 0xfb, 0xe4, 0x9a, 0xfa, 0xe4, 0x99, 0xf9, 0xe4, 0x98, 0xf8, 0x80, 0x03, 
-0x12, 0x0e, 0xa2, 0x30, 0xd5, 0x0d, 0xe4, 0xc3, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0xe4, 0x9d, 0xfd, 
-0xe4, 0x9c, 0xfc, 0x22, 0x78, 0x76, 0xe6, 0xf5, 0x26, 0x78, 0x76, 0xe6, 0x60, 0x13, 0x12, 0x34, 
-0xe3, 0xe5, 0x26, 0x78, 0x76, 0x66, 0x60, 0xf1, 0xe6, 0xf5, 0x26, 0x12, 0x18, 0x64, 0xf0, 0x80, 
-0xe8, 0xe4, 0xf5, 0x26, 0xe5, 0x26, 0xc3, 0x78, 0x78, 0x96, 0x50, 0x18, 0xe5, 0x26, 0x12, 0x18, 
-0x46, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xe5, 0x26, 0x12, 0x17, 0xd7, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 
-0x05, 0x26, 0x80, 0xe0, 0x22, 0x78, 0x62, 0xe6, 0xfa, 0x08, 0xe6, 0xfb, 0xad, 0x2f, 0xaf, 0x2e, 
-0xef, 0xc3, 0x94, 0x02, 0x50, 0x10, 0xef, 0x12, 0x06, 0x85, 0xa6, 0x05, 0xef, 0x12, 0x07, 0x04, 
-0xa6, 0x02, 0x08, 0xa6, 0x03, 0x22, 0xd3, 0xeb, 0x95, 0x44, 0xea, 0x95, 0x43, 0x40, 0x07, 0x8d, 
-0x41, 0x8a, 0x43, 0x8b, 0x44, 0x22, 0xd3, 0xeb, 0x95, 0x48, 0xea, 0x95, 0x47, 0x40, 0x06, 0x8d, 
-0x45, 0x8a, 0x47, 0x8b, 0x48, 0x22, 0x8c, 0x4f, 0x8d, 0x50, 0x12, 0x35, 0xb5, 0x44, 0x18, 0x12, 
-0x35, 0xac, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, 0xf0, 
-0x75, 0xa3, 0x08, 0xef, 0x44, 0x80, 0xf5, 0xa1, 0x75, 0xa6, 0x28, 0x75, 0xa2, 0xc1, 0xaf, 0x50, 
-0x85, 0x4f, 0xd7, 0x8f, 0xd6, 0x75, 0xd5, 0x02, 0x75, 0xd4, 0xf8, 0x75, 0xd2, 0x01, 0x75, 0xd1, 
-0xdf, 0x53, 0xac, 0xef, 0x22, 0x85, 0x4e, 0x82, 0x85, 0x4d, 0x83, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 
-0x90, 0x00, 0xb8, 0xf0, 0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x78, 0xee, 0x94, 0x00, 
-0x22, 0xe4, 0x93, 0xff, 0x7e, 0x00, 0x7c, 0x00, 0x02, 0x0c, 0x68, 0xe4, 0x78, 0x84, 0xf2, 0x08, 
-0xf2, 0x90, 0x00, 0xc0, 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x56, 0x22, 0xab, 0x25, 0xaa, 
-0x26, 0xa9, 0x27, 0x22, 0x12, 0x0c, 0x46, 0xab, 0x1b, 0xe5, 0x1d, 0x24, 0x0c, 0xf9, 0xe4, 0x35, 
-0x1c, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 0x24, 0xf9, 0xee, 0x3a, 0xfa, 0x12, 0x0b, 0xee, 0xff, 0x22, 
-0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x90, 0x00, 0x0b, 0x12, 0x0c, 0x07, 0xff, 0x22, 0x75, 0x8a, 
-0xa0, 0xe4, 0x90, 0x00, 0xb8, 0xf0, 0x22, 0xab, 0x21, 0xaa, 0x22, 0xa9, 0x23, 0x85, 0x24, 0x82, 
-0x22, 0xc2, 0xaf, 0x12, 0x34, 0x45, 0xe5, 0x9b, 0xb4, 0x5a, 0x16, 0xe5, 0x9a, 0xb4, 0xa5, 0x11, 
-0xe5, 0x99, 0xb4, 0xf0, 0x0c, 0xe5, 0x98, 0xb4, 0x0f, 0x07, 0x90, 0xff, 0x85, 0xe0, 0x44, 0x20, 
-0xf0, 0x75, 0x8a, 0x0a, 0xd2, 0xaf, 0x7f, 0x0a, 0x12, 0x33, 0x80, 0x12, 0x35, 0xc1, 0x12, 0x10, 
-0x17, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xb8, 0xf0, 0x80, 0xf3, 0x85, 0x20, 0x82, 0x85, 0x1f, 
-0x83, 0x22, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x12, 0x0d, 0x1b, 0xff, 0x22, 0xab, 0x1b, 0xaa, 
-0x1c, 0xa9, 0x1d, 0x90, 0x00, 0x02, 0x12, 0x0d, 0x46, 0xff, 0x22, 0x93, 0xfd, 0xd3, 0x90, 0x00, 
-0xb6, 0xe0, 0x9d, 0x90, 0x00, 0xb5, 0xe0, 0x9c, 0x22, 0xf2, 0xe4, 0x90, 0x00, 0xb7, 0xf0, 0x22, 
-0xe4, 0x90, 0x00, 0xb8, 0xf0, 0x90, 0x00, 0xbb, 0xf0, 0xef, 0x70, 0x0e, 0x75, 0x88, 0x08, 0xf5, 
-0x8d, 0xf5, 0x8c, 0xf5, 0x8f, 0xf5, 0x8e, 0xf5, 0x88, 0x22, 0x75, 0x88, 0x08, 0xe4, 0xf5, 0x8d, 
-0xf5, 0x8c, 0xef, 0x75, 0xf0, 0x20, 0xa4, 0xff, 0xe5, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 
-0x75, 0x88, 0xa0, 0x22, 0x8f, 0x2c, 0xe4, 0xfd, 0x7f, 0x12, 0x12, 0x31, 0x4c, 0xaf, 0x2c, 0x15, 
-0x2c, 0xef, 0x60, 0x1b, 0x75, 0xb1, 0x11, 0x75, 0xb4, 0x63, 0x75, 0xb0, 0x0d, 0xe5, 0xb1, 0x20, 
-0xe0, 0x05, 0x12, 0x34, 0xe3, 0x80, 0xf6, 0xe4, 0xf5, 0xb0, 0x75, 0xb1, 0x01, 0x80, 0xde, 0x7d, 
-0x01, 0x7f, 0x12, 0x02, 0x31, 0x4c, 0xe4, 0xf5, 0x3c, 0xf5, 0x3d, 0xff, 0x12, 0x0b, 0xee, 0x25, 
-0x3d, 0xf5, 0x3d, 0xe4, 0x35, 0x3c, 0xf5, 0x3c, 0x90, 0xff, 0xff, 0x12, 0x0c, 0x07, 0x12, 0x0c, 
-0x34, 0x74, 0xff, 0x29, 0xf9, 0x74, 0xff, 0x3a, 0xfa, 0x0f, 0xbf, 0x09, 0xdf, 0xed, 0x12, 0x0c, 
-0x34, 0xae, 0x3c, 0xaf, 0x3d, 0x22, 0x12, 0x35, 0x46, 0x60, 0x29, 0x90, 0xff, 0x13, 0xee, 0xd3, 
-0x94, 0x03, 0x40, 0x11, 0xaf, 0x06, 0xef, 0x75, 0xf0, 0x04, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 
-0xf0, 0x35, 0x83, 0xf5, 0x83, 0xed, 0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 
-0xfe, 0xef, 0x5e, 0xf0, 0x22, 0x75, 0x9b, 0x5a, 0x75, 0x9a, 0xa5, 0x75, 0x99, 0xf0, 0x75, 0x98, 
-0x0f, 0x75, 0xac, 0xff, 0x75, 0xad, 0xff, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74, 0xc0, 0xf0, 
-0x90, 0xff, 0x01, 0x74, 0x01, 0xf0, 0x75, 0x95, 0xf1, 0xe4, 0xf5, 0x96, 0x75, 0x97, 0xc7, 0x22, 
-0xe4, 0x78, 0x7c, 0xf6, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x79, 0x93, 0x78, 0x7a, 0xf6, 0xef, 0x24, 
-0x79, 0xf5, 0x4a, 0xe4, 0x3e, 0xf5, 0x49, 0xef, 0x24, 0x30, 0xf5, 0x40, 0xe4, 0x3e, 0xf5, 0x3f, 
-0x78, 0x00, 0xe2, 0x54, 0xfe, 0xf2, 0x54, 0xfb, 0xf2, 0x22, 0xef, 0x60, 0x0f, 0x43, 0xac, 0x10, 
-0x12, 0x35, 0xb5, 0x54, 0xe7, 0x12, 0x35, 0xac, 0xe4, 0xf5, 0xa2, 0x22, 0x12, 0x35, 0xad, 0xa3, 
-0xe0, 0x44, 0x18, 0xf0, 0xa3, 0xe0, 0x54, 0xe7, 0xf0, 0x75, 0xa2, 0xc1, 0x53, 0xac, 0xef, 0x22, 
-0xc3, 0xef, 0x94, 0x01, 0xee, 0x64, 0x80, 0x94, 0x80, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 
-0x11, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x0a, 0xed, 0x24, 0xff, 0xff, 0xec, 0x34, 0xff, 0xfe, 
-0x80, 0x00, 0x22, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x3a, 0x20, 0x50, 0x03, 0xe0, 0x04, 0xf0, 
-0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x3a, 0x20, 0x50, 0x03, 
-0xe0, 0x04, 0xf0, 0x22, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x3a, 0x20, 0x50, 0x03, 0xe0, 0x04, 
-0xf0, 0x75, 0x91, 0xc3, 0xe4, 0xf5, 0x91, 0xe5, 0x89, 0x30, 0xe7, 0x08, 0x12, 0x3a, 0x20, 0x50, 
-0x03, 0xe0, 0x04, 0xf0, 0x22, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x90, 0x00, 0x01, 0x12, 0x0c, 
-0x07, 0xff, 0x22, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x58, 0xf0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 
-0x20, 0x12, 0x0b, 0xee, 0xff, 0x22, 0xef, 0x54, 0x07, 0x90, 0x3a, 0x5d, 0x93, 0xfc, 0xef, 0xc4, 
-0x54, 0x0f, 0xfe, 0xef, 0xf4, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe0, 0x4e, 0xf0, 0x22, 0x8b, 0x82, 
-0x8a, 0x83, 0xe0, 0x59, 0xf0, 0x22, 0xef, 0x24, 0x79, 0xf5, 0x0d, 0xe4, 0x3e, 0xf5, 0x0c, 0xef, 
-0x24, 0x30, 0xf5, 0x09, 0xe4, 0x3e, 0xf5, 0x08, 0xe4, 0xf5, 0x0b, 0xf5, 0x0e, 0xf5, 0x0a, 0x22, 
-0x90, 0xff, 0x00, 0x74, 0x02, 0xf0, 0x90, 0xff, 0x04, 0xe4, 0xf0, 0x90, 0xff, 0x03, 0xef, 0xf0, 
-0x90, 0xff, 0x07, 0xe0, 0xff, 0x22, 0xe4, 0x90, 0x00, 0xc5, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0x74, 
-0x23, 0x93, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x00, 0xc4, 0xf0, 0x22, 0xf0, 0x90, 0xff, 0x10, 
-0xe0, 0x54, 0xe7, 0xf0, 0x22, 0x90, 0xff, 0x12, 0xe0, 0x54, 0xe7, 0xf0, 0x90, 0xff, 0x11, 0xe0, 
-0x22, 0x12, 0x2a, 0x88, 0x78, 0x7e, 0x76, 0x00, 0x08, 0x76, 0x28, 0x90, 0x00, 0xc1, 0x74, 0x04, 
-0xf0, 0xe4, 0xf5, 0x4b, 0x22, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 
-0x02, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x22, 0x74, 0xb5, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 
-0x02, 0xf5, 0x83, 0xe0, 0xff, 0x22, 0x12, 0x32, 0x95, 0x74, 0x9c, 0x93, 0xfd, 0x02, 0x00, 0x24, 
-0xb6, 0x48, 0x01, 0x0a, 0x14, 0x01, 0x02, 0x05, 0x3c, 0x70, 0x00, 0x00, 0x15, 0x01, 0x02, 0x01, 
+0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x02, 0x0c, 0x07, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x90, 0x00, 
+0x0b, 0x02, 0x0c, 0x07, 0xab, 0x24, 0xe5, 0x26, 0xf9, 0x24, 0x02, 0xf5, 0x26, 0xe5, 0x25, 0xfa, 
+0x34, 0x00, 0xf5, 0x25, 0xe4, 0xf5, 0xf0, 0x02, 0x0d, 0xcb, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 
+0x22, 0xe5, 0x1e, 0xfe, 0x7c, 0x00, 0xe4, 0x25, 0x21, 0xff, 0xec, 0x3e, 0xfe, 0x22, 0x75, 0x24, 
+0x01, 0x85, 0x22, 0x25, 0x85, 0x23, 0x26, 0x22, 0xab, 0x24, 0xaa, 0x25, 0xa9, 0x26, 0x02, 0x0d, 
+0x1b, 0x8d, 0x82, 0x8c, 0x83, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x22, 0x90, 0x36, 0x0a, 0xe4, 0x93, 
+0x70, 0x05, 0x43, 0x90, 0x10, 0x80, 0x03, 0x53, 0x90, 0xef, 0x90, 0x36, 0x0c, 0xe4, 0x93, 0xff, 
+0x7c, 0x01, 0x7d, 0x00, 0x12, 0x32, 0x00, 0x90, 0x36, 0x0d, 0xe4, 0x93, 0xb4, 0x01, 0x07, 0x90, 
+0xff, 0x10, 0xe0, 0x44, 0x18, 0xf0, 0x7e, 0x01, 0x7f, 0x00, 0x7d, 0x00, 0x7b, 0x01, 0x7a, 0x01, 
+0x79, 0x00, 0x12, 0x0f, 0xeb, 0x7d, 0x01, 0x7f, 0x12, 0x12, 0x30, 0xb7, 0x7d, 0x03, 0x7f, 0x12, 
+0x12, 0x2f, 0xd0, 0x90, 0xff, 0x1b, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0xff, 0x14, 0xe0, 0x44, 0x04, 
+0xf0, 0x90, 0x36, 0x09, 0xe4, 0x93, 0x90, 0x01, 0xfa, 0xf0, 0x90, 0x36, 0x07, 0xe4, 0x93, 0x90, 
+0x01, 0xea, 0xf0, 0x90, 0x36, 0x11, 0xe4, 0x93, 0x90, 0x01, 0xed, 0xf0, 0x78, 0xa7, 0x7c, 0x01, 
+0x7d, 0x01, 0x7b, 0xff, 0x7a, 0x36, 0x79, 0x00, 0x7e, 0x00, 0x7f, 0x03, 0x12, 0x0b, 0xc8, 0xe4, 
+0x90, 0x01, 0xec, 0xf0, 0x90, 0x01, 0xfe, 0x04, 0xf0, 0xe4, 0x78, 0x0f, 0xf6, 0x90, 0x00, 0xc6, 
+0xf0, 0xa3, 0xf0, 0x22, 0x8f, 0x1b, 0x8c, 0x1c, 0x8d, 0x1d, 0xe4, 0xff, 0x79, 0x01, 0xe4, 0xf5, 
+0x1e, 0xfe, 0x12, 0x35, 0x70, 0xe5, 0x82, 0x2e, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0xe4, 
+0x93, 0x25, 0xe0, 0x25, 0x1b, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xfd, 0x12, 0x35, 0x70, 0x74, 0x04, 
+0x93, 0xfa, 0x74, 0x05, 0x93, 0xfb, 0xc3, 0xed, 0x9b, 0xec, 0x9a, 0x40, 0x02, 0x05, 0x1e, 0x0e, 
+0xbe, 0x04, 0xcf, 0x12, 0x35, 0x70, 0x74, 0x06, 0x93, 0xfd, 0xe5, 0x1e, 0xc3, 0x9d, 0x50, 0x04, 
+0xe4, 0xf9, 0x80, 0x04, 0x0f, 0xbf, 0x03, 0xb6, 0x90, 0x00, 0xc9, 0xe0, 0xb5, 0x01, 0x07, 0xe4, 
+0x90, 0x00, 0xc8, 0xf0, 0x80, 0x28, 0x90, 0x00, 0xc8, 0xe0, 0x04, 0xf0, 0x85, 0x1d, 0x82, 0x85, 
+0x1c, 0x83, 0x74, 0x15, 0x93, 0xff, 0x90, 0x00, 0xc8, 0xe0, 0xfd, 0x33, 0x95, 0xe0, 0xfc, 0xd3, 
+0xed, 0x9f, 0x74, 0x80, 0xf8, 0x6c, 0x98, 0x40, 0x05, 0xe4, 0xf0, 0xa3, 0xe9, 0xf0, 0x90, 0x00, 
+0xc9, 0xe0, 0x7f, 0x00, 0x60, 0x02, 0x7f, 0xaa, 0x22, 0xe4, 0x78, 0x5a, 0xf6, 0x08, 0xf6, 0xfe, 
+0xfb, 0x12, 0x08, 0x00, 0xf9, 0xf5, 0x30, 0xf5, 0x2e, 0x75, 0x2f, 0xff, 0x78, 0x72, 0xe6, 0xff, 
+0xe9, 0xc3, 0x9f, 0x50, 0x63, 0xe9, 0x12, 0x06, 0x2c, 0xe9, 0x25, 0xe0, 0x25, 0xe0, 0x24, 0x5e, 
+0xf8, 0xe2, 0x2f, 0xf5, 0x32, 0x18, 0xe2, 0x3e, 0xf5, 0x31, 0x12, 0x09, 0x97, 0x74, 0x04, 0x93, 
+0xfe, 0x74, 0x05, 0x93, 0xff, 0x78, 0x5a, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0xef, 0x2d, 0xfb, 0xee, 
+0x3c, 0xfa, 0xd3, 0xe5, 0x32, 0x9b, 0xe5, 0x31, 0x9a, 0x40, 0x06, 0x75, 0x30, 0x01, 0x18, 0x80, 
+0x1d, 0xe5, 0x32, 0x2f, 0xff, 0xe5, 0x31, 0x3e, 0xfe, 0xd3, 0xed, 0x9f, 0xec, 0x9e, 0x40, 0x15, 
+0xe5, 0x30, 0x60, 0x08, 0xe4, 0xf5, 0x30, 0x12, 0x31, 0x80, 0x05, 0x2e, 0x78, 0x5a, 0xa6, 0x31, 
+0x08, 0xa6, 0x32, 0x89, 0x2f, 0x09, 0x80, 0x94, 0xe5, 0x30, 0x60, 0x03, 0x12, 0x31, 0x80, 0x22, 
+0xe4, 0xfb, 0xeb, 0x12, 0x06, 0x85, 0xe6, 0xfa, 0xf4, 0x60, 0x67, 0xea, 0x70, 0x0c, 0x12, 0x05, 
+0xf0, 0x74, 0x11, 0x93, 0xf5, 0x2e, 0x74, 0x12, 0x80, 0x1d, 0x78, 0x72, 0xe6, 0x14, 0xb5, 0x02, 
+0x0c, 0x12, 0x05, 0xf0, 0x74, 0x13, 0x93, 0xf5, 0x2e, 0x74, 0x14, 0x80, 0x0a, 0x12, 0x05, 0xf0, 
+0x74, 0x0f, 0x93, 0xf5, 0x2e, 0x74, 0x10, 0x93, 0xf5, 0x2f, 0x78, 0x0c, 0xe2, 0x70, 0x05, 0x78, 
+0x3a, 0xe2, 0x60, 0x14, 0xe5, 0x2f, 0x25, 0xe0, 0xff, 0xe5, 0x2e, 0x33, 0xfe, 0x7c, 0x00, 0x7d, 
+0x03, 0x12, 0x0c, 0x7a, 0x8e, 0x2e, 0x8f, 0x2f, 0xea, 0x12, 0x06, 0x2c, 0xea, 0x25, 0xe0, 0x12, 
+0x07, 0xa0, 0xfe, 0xc3, 0xef, 0x95, 0x2f, 0xee, 0x95, 0x2e, 0x50, 0x06, 0xeb, 0x12, 0x06, 0x85, 
+0x76, 0xff, 0x0b, 0xeb, 0x64, 0x02, 0x70, 0x8a, 0xe5, 0x41, 0xb4, 0xff, 0x08, 0xe5, 0x45, 0xf4, 
+0x60, 0x03, 0x12, 0x07, 0x3b, 0x22, 0xef, 0x54, 0x07, 0xfe, 0x74, 0x01, 0xa8, 0x06, 0x08, 0x80, 
+0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xf9, 0xf4, 0xfe, 0xef, 0x54, 0xf0, 0xf5, 0x3e, 0x64, 0x10, 0x70, 
+0x1e, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x90, 0xff, 0x12, 0xed, 0x30, 0xe2, 0x05, 0xe0, 0x49, 0xf0, 
+0x80, 0x03, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x14, 0x15, 0x83, 0x80, 0x10, 0xe5, 
+0x3e, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xfb, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x8b, 0x82, 0xed, 
+0x24, 0xfb, 0x60, 0x14, 0x14, 0x60, 0x20, 0x24, 0xfe, 0x70, 0x2a, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 
+0x15, 0x82, 0x70, 0x1e, 0x15, 0x83, 0x80, 0x1a, 0xe0, 0x5e, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 
+0x02, 0x15, 0x83, 0xe0, 0x49, 0xf0, 0x22, 0xe0, 0x49, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 
+0x15, 0x83, 0xe0, 0x5e, 0xf0, 0x22, 0xe4, 0xf5, 0x22, 0x12, 0x08, 0xae, 0xe2, 0x60, 0x11, 0xa8, 
+0x07, 0xe8, 0x24, 0x0a, 0xf8, 0xe2, 0x7f, 0x80, 0x60, 0x02, 0x7f, 0x08, 0x8f, 0x22, 0x80, 0x19, 
+0x78, 0x71, 0xe6, 0xff, 0x24, 0x0a, 0xf8, 0xe2, 0x60, 0x0f, 0xa8, 0x07, 0xe8, 0x24, 0x0e, 0xf8, 
+0xe2, 0x7f, 0x04, 0x60, 0x02, 0x7f, 0x08, 0x8f, 0x22, 0xe5, 0x22, 0xb4, 0x04, 0x1f, 0x12, 0x0a, 
+0x15, 0xf9, 0x7a, 0x00, 0x7b, 0xfe, 0xc0, 0x01, 0xa9, 0x07, 0xa8, 0x01, 0x7c, 0x00, 0x7d, 0xfe, 
+0xd0, 0x01, 0x12, 0x07, 0x1f, 0x78, 0x71, 0xe6, 0x24, 0x04, 0xf8, 0xe4, 0xf2, 0x78, 0x71, 0xe6, 
+0xff, 0x24, 0x05, 0xf8, 0xe5, 0x22, 0xf2, 0x7a, 0x00, 0xa9, 0x07, 0x7b, 0xfe, 0xef, 0x24, 0x06, 
+0xf8, 0x7c, 0x00, 0x7d, 0xfe, 0x7e, 0x00, 0x7f, 0x06, 0x02, 0x0b, 0xc8, 0x90, 0x02, 0xb5, 0xe0, 
+0x60, 0x6a, 0x90, 0x00, 0xbe, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x64, 0x78, 0x70, 0x03, 0xec, 0x64, 
+0x80, 0x60, 0x0a, 0xed, 0x64, 0x77, 0x70, 0x03, 0xec, 0x64, 0x80, 0x70, 0x4f, 0xe4, 0xf5, 0x1e, 
+0xf5, 0x1e, 0x8f, 0x82, 0x8e, 0x83, 0xe4, 0x93, 0xfd, 0xe5, 0x1e, 0xc3, 0x9d, 0x50, 0x3d, 0x12, 
+0x18, 0xcf, 0xe0, 0xfd, 0x64, 0x10, 0x60, 0x09, 0xed, 0x64, 0x55, 0x60, 0x04, 0xed, 0xb4, 0x17, 
+0x07, 0xeb, 0x12, 0x18, 0xd6, 0x74, 0x15, 0xf0, 0x12, 0x18, 0xcf, 0xe0, 0xfd, 0x64, 0x54, 0x60, 
+0x04, 0xed, 0xb4, 0x56, 0x13, 0x90, 0x00, 0xbe, 0xe0, 0xb4, 0x80, 0x0c, 0xa3, 0xe0, 0xb4, 0x78, 
+0x07, 0xeb, 0x12, 0x18, 0xd6, 0x74, 0x15, 0xf0, 0x05, 0x1e, 0x80, 0xb6, 0x22, 0xc0, 0xe0, 0xc0, 
+0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0x78, 0x4b, 0xa6, 0xa3, 0x08, 0xa6, 0xa6, 0x75, 
+0xa3, 0x08, 0xe6, 0xff, 0x30, 0xe4, 0x07, 0x75, 0xd1, 0xdf, 0x78, 0x79, 0x76, 0x00, 0x78, 0x4b, 
+0xe6, 0x30, 0xe0, 0x40, 0xef, 0x20, 0xe0, 0x39, 0x78, 0x79, 0xe6, 0xff, 0x70, 0x18, 0x90, 0x02, 
+0xf8, 0xe0, 0xfe, 0xf5, 0xd6, 0x18, 0xee, 0xf6, 0xc3, 0x94, 0x10, 0x50, 0x24, 0x78, 0x0f, 0xe6, 
+0x25, 0xd6, 0xf5, 0xd6, 0x80, 0x1b, 0x74, 0xf8, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 
+0xe0, 0xff, 0x78, 0x78, 0xe6, 0x06, 0x25, 0x09, 0xf5, 0x82, 0xe4, 0x35, 0x08, 0xf5, 0x83, 0xef, 
+0xf0, 0x78, 0x79, 0x06, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xe0, 0x32, 0xab, 0x07, 0xaa, 
+0x05, 0xe4, 0x78, 0x6d, 0xf6, 0xeb, 0x12, 0x18, 0x0f, 0xe0, 0xf5, 0x28, 0xa3, 0xe0, 0xf5, 0x29, 
+0x78, 0x68, 0xe6, 0x75, 0x26, 0x00, 0xf5, 0x27, 0xae, 0x26, 0xff, 0x7c, 0x00, 0x7d, 0xfc, 0x12, 
+0x0c, 0x68, 0xd3, 0xe5, 0x29, 0x9f, 0xe5, 0x28, 0x9e, 0x40, 0x06, 0x78, 0x6d, 0xe6, 0x44, 0x20, 
+0xf6, 0x12, 0x17, 0xf3, 0x74, 0x05, 0x93, 0x25, 0xe0, 0xf5, 0x29, 0x74, 0x04, 0x93, 0x33, 0xf5, 
+0x28, 0xeb, 0x12, 0x18, 0xb4, 0xe0, 0xfe, 0xa3, 0xe0, 0x25, 0x29, 0xff, 0xe5, 0x28, 0x3e, 0xfe, 
+0xeb, 0x12, 0x18, 0x0f, 0xe0, 0xfc, 0xa3, 0xe0, 0xd3, 0x9f, 0xec, 0x9e, 0x40, 0x09, 0x78, 0x6d, 
+0xe6, 0x44, 0x02, 0xf6, 0x44, 0x08, 0xf6, 0x0b, 0x1a, 0xea, 0x70, 0x99, 0x22, 0xe4, 0xf5, 0x1b, 
+0x78, 0x1c, 0x7c, 0x00, 0xfd, 0x7b, 0xff, 0x7a, 0x35, 0x79, 0xee, 0xfe, 0x7f, 0x02, 0x12, 0x0b, 
+0xc8, 0x75, 0x21, 0x01, 0x75, 0x22, 0x00, 0x75, 0x23, 0xc1, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x1c, 
+0x12, 0x22, 0xdd, 0xe5, 0x1c, 0xf4, 0x60, 0x14, 0x90, 0x00, 0xc1, 0x12, 0x31, 0xd1, 0x40, 0x09, 
+0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 0x40, 0x03, 0x75, 0x1b, 0x01, 0xe5, 0x1d, 0xf4, 0x60, 
+0x14, 0x90, 0x00, 0xc3, 0x12, 0x31, 0xd1, 0x40, 0x09, 0xd3, 0xef, 0x94, 0xb8, 0xee, 0x94, 0x0b, 
+0x40, 0x03, 0x75, 0x1b, 0x01, 0x78, 0xb0, 0x7c, 0x01, 0x7d, 0x01, 0x7b, 0x01, 0x7a, 0x00, 0x79, 
+0xc1, 0x7e, 0x00, 0x7f, 0x04, 0x12, 0x0b, 0xc8, 0xaf, 0x1b, 0x22, 0xad, 0x07, 0x7f, 0x3a, 0x12, 
+0x35, 0x1f, 0x90, 0x00, 0xbe, 0xe4, 0xf0, 0xa3, 0xef, 0xf0, 0x7f, 0x3b, 0x12, 0x35, 0x1f, 0xef, 
+0xfb, 0x7a, 0x00, 0x90, 0x00, 0xbf, 0xe0, 0xfe, 0xe4, 0x2b, 0xff, 0xea, 0x3e, 0x90, 0x00, 0xbe, 
+0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0xbe, 0xe0, 0xb4, 0x80, 0x08, 0xa3, 0xe0, 0xb4, 0x67, 0x03, 
+0xbd, 0xb6, 0xf1, 0x90, 0x00, 0xbe, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x64, 0x77, 0x70, 0x03, 0xee, 
+0x64, 0x80, 0x60, 0x06, 0xbe, 0x80, 0x08, 0xbf, 0x78, 0x05, 0xed, 0x64, 0xb5, 0x60, 0xe4, 0x90, 
+0x00, 0xbe, 0xe0, 0xb4, 0x80, 0x0a, 0xa3, 0xe0, 0xb4, 0x78, 0x05, 0xed, 0x64, 0xb8, 0x60, 0xef, 
+0x22, 0x78, 0x6b, 0xe6, 0x30, 0xe0, 0x08, 0x75, 0x27, 0x05, 0x75, 0x28, 0x01, 0x80, 0x06, 0x75, 
+0x27, 0x08, 0xe4, 0xf5, 0x28, 0xe4, 0xf5, 0x26, 0xe5, 0x26, 0xc3, 0x78, 0x70, 0x96, 0x50, 0x3f, 
+0x12, 0x19, 0x39, 0x25, 0x26, 0x12, 0x18, 0x05, 0xf5, 0x29, 0xe5, 0x26, 0x54, 0x01, 0xfd, 0xaf, 
+0x29, 0x12, 0x33, 0x80, 0xad, 0x28, 0xaf, 0x29, 0x12, 0x30, 0xb7, 0xad, 0x27, 0xaf, 0x29, 0x12, 
+0x2f, 0xd0, 0x78, 0x6b, 0xe6, 0xb4, 0x03, 0x13, 0xe5, 0x26, 0x30, 0xe0, 0x0e, 0xe4, 0xfd, 0xaf, 
+0x29, 0x12, 0x30, 0xb7, 0x7d, 0x08, 0xaf, 0x29, 0x12, 0x2f, 0xd0, 0x05, 0x26, 0x80, 0xb9, 0x22, 
+0xef, 0x54, 0x07, 0x90, 0x35, 0xe6, 0x93, 0xfe, 0xf4, 0xf9, 0xef, 0x54, 0xf0, 0xff, 0x64, 0x10, 
+0x60, 0x11, 0xef, 0x13, 0x13, 0x54, 0x3f, 0x24, 0x11, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xfa, 0xab, 
+0x82, 0x80, 0x1a, 0xbd, 0x08, 0x02, 0x7d, 0x02, 0x7a, 0xff, 0x7b, 0x12, 0xed, 0x30, 0xe2, 0x05, 
+0x12, 0x34, 0xbe, 0x80, 0x03, 0x12, 0x34, 0xc6, 0xeb, 0x1b, 0x70, 0x01, 0x1a, 0xed, 0x30, 0xe1, 
+0x05, 0x12, 0x34, 0xbe, 0x80, 0x03, 0x12, 0x34, 0xc6, 0xeb, 0x1b, 0x70, 0x01, 0x1a, 0xed, 0x30, 
+0xe0, 0x04, 0x12, 0x34, 0xbe, 0x22, 0x12, 0x34, 0xc6, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 
+0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 
+0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x12, 0x19, 0x40, 0x12, 0x00, 0x0a, 0x7b, 0xff, 0x7a, 
+0x2c, 0x79, 0x56, 0x12, 0x24, 0x18, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 
+0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 
+0x32, 0x8f, 0x2a, 0x8d, 0x2b, 0xe5, 0x2b, 0x75, 0xf0, 0x2e, 0xa4, 0x24, 0x09, 0x12, 0x06, 0x32, 
+0xe5, 0x2a, 0x12, 0x0a, 0x0e, 0x12, 0x30, 0xa8, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x2b, 0x75, 0xf0, 
+0x2e, 0xa4, 0x24, 0x07, 0x12, 0x06, 0x32, 0xe5, 0x2a, 0x12, 0x0a, 0xc1, 0x12, 0x30, 0xa8, 0xd0, 
+0xe0, 0x2f, 0xff, 0xd0, 0xe0, 0x3e, 0xfe, 0x22, 0xf8, 0xe2, 0xfc, 0x08, 0xe2, 0xc3, 0x9f, 0xff, 
+0xec, 0x9e, 0xfe, 0x12, 0x35, 0x95, 0x22, 0x12, 0x34, 0xae, 0x60, 0x3e, 0xee, 0x64, 0x01, 0x70, 
+0x18, 0xed, 0x60, 0x07, 0x78, 0x7a, 0xe6, 0x4c, 0xf6, 0x80, 0x06, 0xec, 0xf4, 0x78, 0x7a, 0x56, 
+0xf6, 0x78, 0x7a, 0xe6, 0x90, 0xff, 0x18, 0xf0, 0x22, 0xaf, 0x06, 0xef, 0x75, 0xf0, 0x04, 0xa4, 
+0x24, 0x12, 0xff, 0xe5, 0xf0, 0x34, 0xff, 0x8f, 0x82, 0xf5, 0x83, 0xed, 0x60, 0x04, 0xe0, 0x4c, 
+0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0xc2, 0xd5, 0xe8, 0x30, 0xe7, 
+0x0f, 0xb2, 0xd5, 0xe4, 0xc3, 0x9b, 0xfb, 0xe4, 0x9a, 0xfa, 0xe4, 0x99, 0xf9, 0xe4, 0x98, 0xf8, 
+0xec, 0x30, 0xe7, 0x17, 0xb2, 0xd5, 0x12, 0x31, 0x31, 0x12, 0x0e, 0xa2, 0xe4, 0xc3, 0x9b, 0xfb, 
+0xe4, 0x9a, 0xfa, 0xe4, 0x99, 0xf9, 0xe4, 0x98, 0xf8, 0x80, 0x03, 0x12, 0x0e, 0xa2, 0x30, 0xd5, 
+0x0d, 0xe4, 0xc3, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0xe4, 0x9d, 0xfd, 0xe4, 0x9c, 0xfc, 0x22, 0x78, 
+0x6e, 0xe6, 0xf5, 0x26, 0x78, 0x6e, 0xe6, 0x60, 0x13, 0x12, 0x34, 0x4b, 0xe5, 0x26, 0x78, 0x6e, 
+0x66, 0x60, 0xf1, 0xe6, 0xf5, 0x26, 0x12, 0x18, 0x9c, 0xf0, 0x80, 0xe8, 0xe4, 0xf5, 0x26, 0xe5, 
+0x26, 0xc3, 0x78, 0x70, 0x96, 0x50, 0x18, 0xe5, 0x26, 0x12, 0x18, 0x7e, 0xe0, 0xfe, 0xa3, 0xe0, 
+0xff, 0xe5, 0x26, 0x12, 0x18, 0x0f, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x05, 0x26, 0x80, 0xe0, 0x22, 
+0x78, 0x5a, 0xe6, 0xfa, 0x08, 0xe6, 0xfb, 0xad, 0x2f, 0xaf, 0x2e, 0xef, 0xc3, 0x94, 0x02, 0x50, 
+0x10, 0xef, 0x12, 0x06, 0x85, 0xa6, 0x05, 0xef, 0x12, 0x07, 0x04, 0xa6, 0x02, 0x08, 0xa6, 0x03, 
+0x22, 0xd3, 0xeb, 0x95, 0x44, 0xea, 0x95, 0x43, 0x40, 0x07, 0x8d, 0x41, 0x8a, 0x43, 0x8b, 0x44, 
+0x22, 0xd3, 0xeb, 0x95, 0x48, 0xea, 0x95, 0x47, 0x40, 0x06, 0x8d, 0x45, 0x8a, 0x47, 0x8b, 0x48, 
+0x22, 0x85, 0x0b, 0x82, 0x85, 0x0a, 0x83, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xbd, 0xf0, 
+0x22, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xc3, 0x94, 0x78, 0xee, 0x94, 0x00, 0x22, 0xe4, 0x93, 0xff, 
+0x7e, 0x00, 0x7c, 0x00, 0x02, 0x0c, 0x68, 0xe4, 0x78, 0x84, 0xf2, 0x08, 0xf2, 0x90, 0x00, 0xb9, 
+0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4e, 0x22, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x22, 
+0xae, 0x07, 0x8c, 0x08, 0x8d, 0x09, 0xe4, 0xff, 0x12, 0x34, 0xce, 0x90, 0xff, 0x14, 0xe0, 0x44, 
+0x18, 0xf0, 0x90, 0xff, 0x1b, 0xe0, 0x44, 0x18, 0xf0, 0x75, 0xa3, 0x08, 0xee, 0x44, 0x80, 0xf5, 
+0xa1, 0x75, 0xa6, 0x28, 0x75, 0xa2, 0xc1, 0xaf, 0x09, 0x85, 0x08, 0xd7, 0x8f, 0xd6, 0x75, 0xd5, 
+0x02, 0x75, 0xd4, 0xf8, 0x75, 0xd2, 0x01, 0x75, 0xd1, 0xdf, 0x53, 0xac, 0xef, 0x22, 0x12, 0x0c, 
+0x46, 0xab, 0x1b, 0xe5, 0x1d, 0x24, 0x0c, 0xf9, 0xe4, 0x35, 0x1c, 0xfa, 0x7e, 0x00, 0xe9, 0x25, 
+0x24, 0xf9, 0xee, 0x3a, 0xfa, 0x12, 0x0b, 0xee, 0xff, 0x22, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 
+0x90, 0x00, 0x0b, 0x12, 0x0c, 0x07, 0xff, 0x22, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 0x00, 0xbd, 0xf0, 
+0x22, 0xab, 0x21, 0xaa, 0x22, 0xa9, 0x23, 0x85, 0x24, 0x82, 0x22, 0xc2, 0xaf, 0x12, 0x33, 0xaf, 
+0xe5, 0x9b, 0xb4, 0x5a, 0x16, 0xe5, 0x9a, 0xb4, 0xa5, 0x11, 0xe5, 0x99, 0xb4, 0xf0, 0x0c, 0xe5, 
+0x98, 0xb4, 0x0f, 0x07, 0x90, 0xff, 0x85, 0xe0, 0x44, 0x20, 0xf0, 0x75, 0x8a, 0x0a, 0xd2, 0xaf, 
+0x7f, 0x0a, 0x12, 0x32, 0xea, 0x12, 0x35, 0x05, 0x12, 0x10, 0x17, 0x75, 0x8a, 0xa0, 0xe4, 0x90, 
+0x00, 0xbd, 0xf0, 0x80, 0xf3, 0x85, 0x20, 0x82, 0x85, 0x1f, 0x83, 0x22, 0xab, 0x1b, 0xaa, 0x1c, 
+0xa9, 0x1d, 0x12, 0x0d, 0x1b, 0xff, 0x22, 0xab, 0x1b, 0xaa, 0x1c, 0xa9, 0x1d, 0x90, 0x00, 0x02, 
+0x12, 0x0d, 0x46, 0xff, 0x22, 0x93, 0xfd, 0xd3, 0x90, 0x00, 0xb6, 0xe0, 0x9d, 0x90, 0x00, 0xb5, 
+0xe0, 0x9c, 0x22, 0xf2, 0xe4, 0x90, 0x00, 0xb7, 0xf0, 0x22, 0xe4, 0x90, 0x00, 0xbd, 0xf0, 0x90, 
+0x00, 0xc0, 0xf0, 0xef, 0x70, 0x0e, 0x75, 0x88, 0x08, 0xf5, 0x8d, 0xf5, 0x8c, 0xf5, 0x8f, 0xf5, 
+0x8e, 0xf5, 0x88, 0x22, 0x75, 0x88, 0x08, 0xe4, 0xf5, 0x8d, 0xf5, 0x8c, 0xef, 0x75, 0xf0, 0x20, 
+0xa4, 0xff, 0xe5, 0xf0, 0x44, 0x80, 0xf5, 0x8f, 0x8f, 0x8e, 0x75, 0x88, 0xa0, 0x22, 0x8f, 0x2c, 
+0xe4, 0xfd, 0x7f, 0x12, 0x12, 0x30, 0xb7, 0xaf, 0x2c, 0x15, 0x2c, 0xef, 0x60, 0x1b, 0x75, 0xb1, 
+0x11, 0x75, 0xb4, 0x63, 0x75, 0xb0, 0x0d, 0xe5, 0xb1, 0x20, 0xe0, 0x05, 0x12, 0x34, 0x4b, 0x80, 
+0xf6, 0xe4, 0xf5, 0xb0, 0x75, 0xb1, 0x01, 0x80, 0xde, 0x7d, 0x01, 0x7f, 0x12, 0x02, 0x30, 0xb7, 
+0xe4, 0xf5, 0x3c, 0xf5, 0x3d, 0xff, 0x12, 0x0b, 0xee, 0x25, 0x3d, 0xf5, 0x3d, 0xe4, 0x35, 0x3c, 
+0xf5, 0x3c, 0x90, 0xff, 0xff, 0x12, 0x0c, 0x07, 0x12, 0x0c, 0x34, 0x74, 0xff, 0x29, 0xf9, 0x74, 
+0xff, 0x3a, 0xfa, 0x0f, 0xbf, 0x09, 0xdf, 0xed, 0x12, 0x0c, 0x34, 0xae, 0x3c, 0xaf, 0x3d, 0x22, 
+0x12, 0x34, 0xae, 0x60, 0x29, 0x90, 0xff, 0x13, 0xee, 0xd3, 0x94, 0x03, 0x40, 0x11, 0xaf, 0x06, 
+0xef, 0x75, 0xf0, 0x04, 0xa4, 0x25, 0x82, 0xf5, 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0xed, 
+0x60, 0x04, 0xe0, 0x4c, 0xf0, 0x22, 0xe0, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x5e, 0xf0, 0x22, 0x75, 
+0x9b, 0x5a, 0x75, 0x9a, 0xa5, 0x75, 0x99, 0xf0, 0x75, 0x98, 0x0f, 0x75, 0xac, 0xff, 0x75, 0xad, 
+0xff, 0x90, 0xff, 0x88, 0x74, 0x40, 0xf0, 0x74, 0xc0, 0xf0, 0x90, 0xff, 0x01, 0x74, 0x01, 0xf0, 
+0x75, 0x95, 0xf1, 0xe4, 0xf5, 0x96, 0x75, 0x97, 0xc7, 0x22, 0xe4, 0x78, 0x74, 0xf6, 0x8f, 0x82, 
+0x8e, 0x83, 0x74, 0x79, 0x93, 0x78, 0x72, 0xf6, 0xef, 0x24, 0x79, 0xf5, 0x4a, 0xe4, 0x3e, 0xf5, 
+0x49, 0xef, 0x24, 0x30, 0xf5, 0x40, 0xe4, 0x3e, 0xf5, 0x3f, 0x78, 0x00, 0xe2, 0x54, 0xfe, 0xf2, 
+0x54, 0xfb, 0xf2, 0x22, 0x8f, 0x1e, 0x8d, 0x1f, 0xe5, 0x1e, 0xf4, 0x60, 0x1a, 0xe4, 0xfd, 0x12, 
+0x30, 0xb7, 0xad, 0x1f, 0xaf, 0x1e, 0x12, 0x33, 0x80, 0x7d, 0x08, 0xaf, 0x1e, 0x12, 0x2f, 0xd0, 
+0x7d, 0x07, 0xaf, 0x1e, 0x12, 0x2f, 0xd0, 0x22, 0xc3, 0xef, 0x94, 0x01, 0xee, 0x64, 0x80, 0x94, 
+0x80, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x11, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x0a, 
+0xed, 0x24, 0xff, 0xff, 0xec, 0x34, 0xff, 0xfe, 0x80, 0x00, 0x22, 0xe5, 0x89, 0x30, 0xe7, 0x08, 
+0x12, 0x35, 0xa1, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x75, 0x91, 0xc1, 0xe4, 0xf5, 0x91, 0xe5, 0x89, 
+0x30, 0xe7, 0x08, 0x12, 0x35, 0xa1, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x22, 0xe5, 0x89, 0x30, 0xe7, 
+0x08, 0x12, 0x35, 0xa1, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x75, 0x91, 0xc3, 0xe4, 0xf5, 0x91, 0xe5, 
+0x89, 0x30, 0xe7, 0x08, 0x12, 0x35, 0xa1, 0x50, 0x03, 0xe0, 0x04, 0xf0, 0x22, 0xab, 0x1e, 0xaa, 
+0x1f, 0xa9, 0x20, 0x90, 0x00, 0x01, 0x12, 0x0c, 0x07, 0xff, 0x22, 0x90, 0xff, 0x50, 0xf0, 0x90, 
+0xff, 0x58, 0xf0, 0xab, 0x1e, 0xaa, 0x1f, 0xa9, 0x20, 0x12, 0x0b, 0xee, 0xff, 0x22, 0xef, 0x54, 
+0x07, 0x90, 0x35, 0xe6, 0x93, 0xfc, 0xef, 0xc4, 0x54, 0x0f, 0xfe, 0xef, 0xf4, 0x22, 0x8b, 0x82, 
+0x8a, 0x83, 0xe0, 0x4e, 0xf0, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe0, 0x59, 0xf0, 0x22, 0x90, 0xff, 
+0x10, 0xe0, 0x54, 0xe7, 0xf0, 0xa3, 0xe0, 0x44, 0x18, 0xf0, 0xa3, 0xe0, 0x54, 0xe7, 0xf0, 0xef, 
+0x60, 0x07, 0x90, 0xff, 0x11, 0xe0, 0x54, 0xe7, 0xf0, 0x22, 0xef, 0x60, 0x0c, 0x43, 0xac, 0x10, 
+0x7f, 0x01, 0x12, 0x34, 0xce, 0xe4, 0xf5, 0xa2, 0x22, 0xe4, 0xff, 0x12, 0x34, 0xce, 0x75, 0xa2, 
+0xc1, 0x53, 0xac, 0xef, 0x22, 0x12, 0x2a, 0x1b, 0x78, 0x76, 0x76, 0x00, 0x08, 0x76, 0x28, 0x90, 
+0x00, 0xbb, 0x74, 0x04, 0xf0, 0xe4, 0x90, 0x00, 0xba, 0xf0, 0x90, 0x02, 0xb5, 0xf0, 0x22, 0x90, 
+0xff, 0x00, 0x74, 0x02, 0xf0, 0x90, 0xff, 0x04, 0xe4, 0xf0, 0x90, 0xff, 0x03, 0xef, 0xf0, 0x90, 
+0xff, 0x07, 0xe0, 0xff, 0x22, 0xe4, 0x90, 0x00, 0xc9, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0x74, 0x15, 
+0x93, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0x00, 0xc8, 0xf0, 0x22, 0xef, 0x75, 0xf0, 0x0a, 0xa4, 
+0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0x02, 0xf5, 0x83, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x22, 0x41, 
+0x00, 0xb9, 0x00, 0x41, 0x00, 0xb8, 0x00, 0x41, 0x00, 0xc5, 0x00, 0x41, 0x02, 0xb5, 0x00, 0x00, 
+0x85, 0x1d, 0x82, 0x85, 0x1c, 0x83, 0x75, 0xf0, 0x07, 0xef, 0x02, 0x0f, 0xac, 0x8d, 0x22, 0xaf, 
+0x22, 0x12, 0x20, 0x59, 0xaf, 0x22, 0x02, 0x15, 0x8d, 0xef, 0x25, 0xe0, 0x24, 0x5d, 0xf8, 0xe2, 
+0xfe, 0x08, 0xe2, 0xff, 0x22, 0xee, 0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 
+0x22, 0x75, 0x89, 0x80, 0x90, 0x00, 0xc0, 0xe0, 0xc3, 0x94, 0xff, 0x22, 0x12, 0x31, 0xc1, 0x74, 
+0x9c, 0x93, 0xfd, 0x02, 0x00, 0x24, 0x7f, 0x30, 0x12, 0x35, 0x1f, 0x22, 0x78, 0x6c, 0xa6, 0x07, 
+0x22, 0x12, 0x35, 0x4b, 0x22, 0x7f, 0x00, 0x22, 0x11, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 
+0x56, 0x46, 0x45, 0x44, 0x43, 0x17, 0x16, 0x11, 0x40, 0x41, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 
+0x46, 0x45, 0x44, 0x43, 0x42, 0x16, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x11, 0x16, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0xb6, 0x37, 0x01, 0x0a, 0x14, 0x01, 0x02, 0x05, 0x3c, 0x70, 0x00, 0x00, 0x15, 0x01, 0x02, 0x01, 
 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 
 0x00, 0x00, 0x03, 0x0a, 0x00, 0xc8, 0x03, 0xe8, 0x0f, 0x1e, 0x0a, 0x10, 0x3c, 0x01, 0x00, 0x50, 
-0x43, 0x51, 0x44, 0x52, 0x45, 0x53, 0x46, 0x54, 0x56, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x23, 0x23, 0x23, 0x23, 0x23, 0x19, 0x23, 0x23, 0x23, 0x23, 0x00, 0x28, 
-0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x78, 0x3a, 0x90, 0x00, 0x01, 0x0a, 0x0a, 0x85, 0x00, 0x96, 
-0x02, 0x6c, 0x02, 0x6c, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 
+0x51, 0x43, 0x52, 0x44, 0x53, 0x45, 0x54, 0x46, 0x55, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x28, 
+0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x82, 0x35, 0x90, 0x00, 0x00, 0x08, 0x08, 0x85, 0x00, 0xc8, 
+0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 
 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 
 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 
 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 
-0x28, 0x02, 0x58, 0x05, 0x00, 0xf0, 0x01, 0x18, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 
+0x28, 0x02, 0x58, 0x05, 0x00, 0xf0, 0x01, 0x18, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc8, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x00, 0x00, 
 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x1e, 0x02, 0x03, 0x07, 0x06, 0x00, 0xc8, 0x04, 0x00, 0x01, 
-0x08, 0x09, 0x00, 0xc8, 0x04, 0x02, 0x03, 0x07, 0x06, 0x00, 0xc8, 0x04, 0x02, 0x03, 0x07, 0x06, 
-0x00, 0xc8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x10, 0x3c, 0x01, 0x00, 
-0x50, 0x44, 0x41, 0x45, 0x51, 0x46, 0x52, 0x56, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x00, 
-0x28, 0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 0x85, 0x00, 
-0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 
-0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 
-0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 
-0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 
-0x00, 0x28, 0x02, 0x58, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 0x00, 
-0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 0x00, 
-0x01, 0x06, 0x07, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x05, 
-0x04, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x10, 0x3c, 0x01, 
-0x00, 0x50, 0x44, 0x41, 0x45, 0x51, 0x46, 0x52, 0x56, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 
-0x00, 0x28, 0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 0x85, 
-0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 
-0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 
-0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 
-0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 
-0xc8, 0x00, 0x28, 0x02, 0x58, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 0x00, 
-0x00, 0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 
-0x00, 0x01, 0x06, 0x07, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 0x02, 0x03, 
-0x05, 0x04, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x10, 0x3c, 
-0x01, 0x00, 0x50, 0x44, 0x41, 0x45, 0x51, 0x46, 0x52, 0x56, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 
-0x1e, 0x00, 0x28, 0x05, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x64, 0x1e, 0x90, 0x01, 0x00, 0x08, 0x08, 
-0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 
-0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 
-0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 
-0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 
-0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x04, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x46, 0x00, 0x46, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 0x04, 
-0x00, 0x00, 0x00, 0x00, 0x02, 0x64, 0x9c, 0x00, 0x0a, 0x14, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 
-0x04, 0x00, 0x01, 0x06, 0x07, 0x01, 0x2c, 0x04, 0x02, 0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 0x02, 
-0x03, 0x05, 0x04, 0x01, 0x2c, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0e, 0x10, 
-0x3c, 0x01, 0x00, 0x64, 0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43, 
-0x17, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 
-0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0x22, 0x90, 0x00, 0x00, 0x08, 
-0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 
-0x58, 0x0a, 0x02, 0x85, 0x00, 0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 
-0x14, 0x02, 0x58, 0x09, 0x09, 0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x0a, 0x02, 0x85, 0x00, 
-0xc8, 0x00, 0x3c, 0x02, 0x58, 0x08, 0x08, 0x85, 0x00, 0xc8, 0x00, 0x14, 0x02, 0x58, 0x09, 0x09, 
-0x85, 0x00, 0xc8, 0x00, 0x28, 0x02, 0x58, 0x07, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x01, 0x2c, 0x05, 0x01, 0x0a, 0x01, 
-0x04, 0x00, 0x00, 0x00, 0x00, 0x02, 0x08, 0xfa, 0x00, 0x64, 0x14, 0x02, 0x03, 0x0b, 0x0a, 0x00, 
-0xc8, 0x04, 0x00, 0x01, 0x0c, 0x0d, 0x00, 0x96, 0x04, 0x02, 0x03, 0x0b, 0x0a, 0x00, 0xc8, 0x04, 
-0x02, 0x03, 0x0b, 0x0a, 0x00, 0xc8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x85, 
-0x1d, 0x82, 0x85, 0x1c, 0x83, 0x75, 0xf0, 0x07, 0xef, 0x02, 0x0f, 0xac, 0x8d, 0x22, 0xaf, 0x22, 
-0x12, 0x21, 0x74, 0xaf, 0x22, 0x02, 0x15, 0x54, 0xef, 0x25, 0xe0, 0x24, 0x5d, 0xf8, 0xe2, 0xfe, 
-0x08, 0xe2, 0xff, 0x22, 0xee, 0x30, 0xe7, 0x07, 0xc3, 0xe4, 0x9f, 0xff, 0xe4, 0x9e, 0xfe, 0x22, 
-0x75, 0x89, 0x80, 0x90, 0x00, 0xbb, 0xe0, 0xc3, 0x94, 0xff, 0x22, 0x7f, 0x30, 0x12, 0x35, 0x80, 
-0x22, 0x41, 0x00, 0xc0, 0x00, 0x00, 0x78, 0x74, 0xa6, 0x07, 0x22, 0x12, 0x35, 0xd5, 0x22, 0x11, 
-0x10, 0x41, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x46, 0x45, 0x44, 0x43, 0x17, 0x16, 0x11, 0x40, 
-0x41, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x46, 0x45, 0x44, 0x43, 0x42, 0x16, 0x01, 0x02, 0x04, 
-0x08, 0x10, 0x20, 0x40, 0x80, 0x11, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x08, 0x09, 0x00, 0xc8, 0x04, 0x02, 0x03, 0x07, 0x06, 0x00, 0xc8, 0x04, 0x05, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
@@ -966,7 +966,8 @@ app_bin_816d = [
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-0xb6, 0x02, 0x40, 0x52, 0x48, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x79,
+0xb6, 0x02, 0x41, 0x01, 0x37, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x69, 
+ 
 ]
 
 #endif /*CAPACITIVE_HYNITRON_CST816D_UPDATE_H__*/
index 194c0ac..c821dae 100644 (file)
@@ -206,16 +206,14 @@ def main_init():
     #AI
     
     try:
-        # from usr.ai import AIScreen
-
-        import ai
+        from usr.ai_XSZN import AIScreen
         # ui.add_screen(ai.AIScreen())
         # ui.add_screen(ai.AINoSimScreen())
         # ui.add_screen(ai.AITalkScreen())
         # ui.add_screen(ai.AIListenScreen())
         # ui.add_screen(ai.AIThinkScreen())
         ##############################################
-        ui.add_screen(ai.AIScreen())
+        ui.add_screen(AIScreen())
         # ui.add_screen(AINoSimScreen())
         # ui.add_screen(AITalkScreen())
         # ui.add_screen(AIListenScreen())
@@ -223,6 +221,19 @@ def main_init():
  
     except Exception as e:
         usys.print_exception(e)
+        try:
+            from ext.ai_XSZN import AIScreen
+            
+            ui.add_screen(AIScreen())
+        
+ 
+        except Exception as e:
+            usys.print_exception(e)
+            try:
+                import ai
+                ui.add_screen(ai.AIScreen())
+            except Exception as e:
+                usys.print_exception(e)
     #print("init6:{}".format(utime.localtime()))
     try:
         #视频通话,相机
index 9a87633..a3b57cc 100644 (file)
@@ -1755,7 +1755,7 @@ class DeviceInfoManager(Abstract):
 
         
         self.normal_alarm() 
-
+        EventMesh.publish("get_class_in_time_page")
 
     #普通闹钟
     def normal_alarm(self):
@@ -3800,7 +3800,14 @@ class setclassTimeManager(Abstract):#设置上课禁用时间
     def get_class_time(self, event, msg):
         
         return self.class_buf
-    
+    def is_all_zero(self,msg):
+        if msg == []:
+            return False
+        for num in msg:
+            if num != 0:
+                return False
+
+        return True
     def get_cur_class_time_state(self, event, msg):
         data = RTC().datetime()
         hour = data[4]#当前小时
@@ -3813,7 +3820,7 @@ class setclassTimeManager(Abstract):#设置上课禁用时间
         cur_hour = hour
         cur_min = min
         cur_total_min = cur_hour*60+cur_min
-        #print("cur_total_min",cur_total_min)
+        # print("cur_total_min",cur_total_min)
 
         start_time1 = 0
         end_time1 = 0
@@ -3874,40 +3881,135 @@ class setclassTimeManager(Abstract):#设置上课禁用时间
             week2_state = 0
             week3_state = 0
             week4_state = 0
-            # print("end_time1 ",start_time1,end_time1,start_time2,end_time2,start_time3,end_time3,start_time4,end_time4)
-            for i in range(0,7):
-                if ((cur_week in week1) and enable1 == 1):
-                    week1_state = 1
-                if ((cur_week in week2) and enable2 == 1):
-                    week2_state = 1
-                
-                if ((cur_week in week3) and enable3 == 1):
-                    week3_state = 1
-                
-                if ((cur_week in week4) and enable4 == 1):
-                    week4_state = 1
-
-                if ((cur_week in week1) and enable1 == 1) or ((cur_week in week2) and enable2 == 1) or\
-                    ((cur_week in week3) and enable3 == 1) or ((cur_week in week4) and enable4 == 1):
-                    if  enable1 == 1 or enable2 == 1 or enable3 == 1 or enable4 == 1:
-                        if week1 != [] or week2 != [] or week3 != [] or week4 != []:
-                            if (end_time1 > start_time1  and  enable1 == 1 and week1_state == 1) or (end_time2 > start_time2 and  enable2 == 1 and week2_state == 1) or\
-                            (end_time3 > start_time3 and  enable3 == 1 and week3_state == 1) or (end_time4 > start_time4 and  enable4 == 1 and week4_state == 1):
-                                if (cur_total_min <= end_time1 and cur_total_min >= start_time1 and enable1 == 1) or (cur_total_min <= end_time2 and cur_total_min >= start_time2 and enable2 == 1) or\
-                                    (cur_total_min <= end_time3 and cur_total_min >= start_time3 and enable3 == 1) or (cur_total_min <= end_time4 and cur_total_min >= start_time4 and enable3 == 1):
-                                    self.class_state = 1
-                                    print("class_in1")
-                                    break
-                            else:#开始时间小于结束时间属于垮天 9:00 -7:00 7*60 6:00
-
-                                # print("end_time1!!!!!!!!!",start_time1,end_time1,start_time2,end_time2,start_time3,end_time3,start_time4,end_time4)
-                                if (((end_time1 >= cur_total_min or cur_total_min >= start_time1) and enable1 == 1 and week1_state == 1)or \
-                                    ((end_time2 >= cur_total_min or cur_total_min >= start_time2) and enable2 == 1 and week2_state == 1) or\
-                                    ((end_time3 >= cur_total_min or cur_total_min >= start_time3) and enable3 == 1 and week3_state == 1) or \
-                                    ((end_time4 >= cur_total_min or cur_total_min >= start_time4) and enable4 == 1 and week4_state == 1)):
+            #单次生效
+            
+            if (enable1 == 1 and week1 == [])or (enable2 == 1 and week2 == []) or (enable3 == 1 and week3 == []) or (enable4 == 1 and week4 == []):
+                if (enable1 == 1 and week1 == []):
+                    # one class_in1 end_time1 = 180+1440  start_time1 = 240 cur_total_min = 10*60+1440 = 1440+600=2040 1400-240 = 1200+3*60 = 1380 
+                    print("one class_in1 {} {} {}\r\n".format(end_time1,start_time1,cur_total_min))
+                    if end_time1 > start_time1: #开始时间是否小于结束时间
+                        if cur_total_min <= end_time1 and cur_total_min >= start_time1:
+                            self.class_state = 1
+                            print("one class_in1")
+                        else:
+                            #重新把数据写到config
+                            self.class_buf["0"]["enable"] = 0
+                            with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                                ujson.dump(self.class_buf,fd)
+                            print("one class_in1 self.class_buf:{}\r\n".format(self.class_buf))
+                    # else: #5:00 - 2:00
+                    #     #结束时间大于当前时间  当前时间大于开始时间 当前时间小于结束时间
+                    #     end_time1+=24*60
+                    #     start = 24*60-start_time1 
+
+
+                    #     if (end_time1 >= cur_total_min or cur_total_min >= start_time1):
+                    #         self.class_state = 1
+                    #         pass
+                    #     else:
+                    #         self.class_buf["0"]["enable"] = 0
+                    #         with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                    #             ujson.dump(self.class_buf,fd)
+                    #         print("two class_in1 self.class_buf:{}\r\n".format(self.class_buf))
+                            
+                if (enable2 == 1 and week2 == []):
+                    if end_time2 > start_time2: #开始时间是否小于结束时间
+                        if cur_total_min <= end_time2 and cur_total_min >= start_time2:
+                            self.class_state = 1
+                            print("one class_in2")
+                        else:
+                            #重新把数据写到config
+                            self.class_buf["1"]["enable"] = 0
+                            with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                                ujson.dump(self.class_buf,fd)
+                            print("one class_in2 self.class_buf:{}\r\n".format(self.class_buf))
+                    # else:
+                    #     #结束时间大于当前时间  当前时间大于开始时间 当前时间小于结束时间
+                    #     if (end_time2 >= cur_total_min or cur_total_min >= start_time2):
+                    #         self.class_state = 1
+                    #         pass
+                    #     else:
+                    #         self.class_buf["1"]["enable"] = 0
+                    #         with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                    #             ujson.dump(self.class_buf,fd)
+                    #         print("two class_in2 self.class_buf:{}\r\n".format(self.class_buf))
+                if (enable3 == 1 and week3 == []):
+                    if end_time3 > start_time3: #开始时间是否小于结束时间
+                        if cur_total_min <= end_time3 and cur_total_min >= start_time3:
+                            self.class_state = 1
+                            print("one class_in2")
+                        else:
+                            #重新把数据写到config
+                            self.class_buf["2"]["enable"] = 0
+                            with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                                ujson.dump(self.class_buf,fd)
+                            print("one class_in3 self.class_buf:{}\r\n".format(self.class_buf))
+                    # else:
+                    #     #结束时间大于当前时间  当前时间大于开始时间 当前时间小于结束时间
+                    #     if (end_time3 >= cur_total_min or cur_total_min >= start_time3):
+                    #         self.class_state = 1
+                    #         pass
+                    #     else:
+                    #         self.class_buf["2"]["enable"] = 0
+                    #         with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                    #             ujson.dump(self.class_buf,fd)
+                    #         print("two class_in3 self.class_buf:{}\r\n".format(self.class_buf))
+                if (enable4 == 1 and week4 == []):
+                    if end_time4 > start_time4: #开始时间是否小于结束时间
+                        if cur_total_min <= end_time4 and cur_total_min >= start_time4:
+                            self.class_state = 1
+                            print("one class_in4")
+                        else:
+                            #重新把数据写到config
+                            self.class_buf["3"]["enable"] = 0
+                            with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                                ujson.dump(self.class_buf,fd)
+                            print("one class_in4 self.class_buf:{}\r\n".format(self.class_buf))
+                    # else:
+                    #     #结束时间大于当前时间  当前时间大于开始时间 当前时间小于结束时间
+                    #     if (end_time4 >= cur_total_min or cur_total_min >= start_time4):
+                    #         self.class_state = 1
+                    #         pass
+                    #     else:
+                    #         self.class_buf["3"]["enable"] = 0
+                    #         with open("/ext/static/storage_file/class_msg.json", 'w+',encoding='utf-8') as fd:
+                    #             ujson.dump(self.class_buf,fd)
+                    #         print("two class_in4 self.class_buf:{}\r\n".format(self.class_buf))
+
+            if self.class_state == 0:
+                for i in range(0,7) :
+                    if ((cur_week in week1) and enable1 == 1):
+                        week1_state = 1
+                    if ((cur_week in week2) and enable2 == 1):
+                        week2_state = 1
+                    
+                    if ((cur_week in week3) and enable3 == 1):
+                        week3_state = 1
+                    
+                    if ((cur_week in week4) and enable4 == 1):
+                        week4_state = 1
+
+                    if ((cur_week in week1) and enable1 == 1) or ((cur_week in week2) and enable2 == 1) or\
+                        ((cur_week in week3) and enable3 == 1) or ((cur_week in week4) and enable4 == 1):
+                        if  enable1 == 1 or enable2 == 1 or enable3 == 1 or enable4 == 1:
+                            if week1 != [] or week2 != [] or week3 != [] or week4 != []:
+                                if (end_time1 > start_time1  and  enable1 == 1 and week1_state == 1) or (end_time2 > start_time2 and  enable2 == 1 and week2_state == 1) or\
+                                (end_time3 > start_time3 and  enable3 == 1 and week3_state == 1) or (end_time4 > start_time4 and  enable4 == 1 and week4_state == 1):
+                                    if (cur_total_min <= end_time1 and cur_total_min >= start_time1 and enable1 == 1) or (cur_total_min <= end_time2 and cur_total_min >= start_time2 and enable2 == 1) or\
+                                        (cur_total_min <= end_time3 and cur_total_min >= start_time3 and enable3 == 1) or (cur_total_min <= end_time4 and cur_total_min >= start_time4 and enable3 == 1):
                                         self.class_state = 1
-                                        print("class_in2")
+                                        print("class_in1")
                                         break
+                                else:#开始时间小于结束时间属于垮天 9:00 -7:00 7*60 6:00
+                                    pass
+                                    # # print("end_time1!!!!!!!!!",start_time1,end_time1,start_time2,end_time2,start_time3,end_time3,start_time4,end_time4)
+                                    # if (((end_time1 >= cur_total_min or cur_total_min >= start_time1) and enable1 == 1 and week1_state == 1)or \
+                                    #     ((end_time2 >= cur_total_min or cur_total_min >= start_time2) and enable2 == 1 and week2_state == 1) or\
+                                    #     ((end_time3 >= cur_total_min or cur_total_min >= start_time3) and enable3 == 1 and week3_state == 1) or \
+                                    #     ((end_time4 >= cur_total_min or cur_total_min >= start_time4) and enable4 == 1 and week4_state == 1)):
+                                    #         self.class_state = 1
+                                    #         print("class_in2")
+                                    #         break
 
 
         return self.class_state
index e30d068..cf3c3b6 100644 (file)
@@ -1853,20 +1853,20 @@ class DialingNoPlayPopupScreen(Screen):#正在拨号中...未打出
             dialing_popup_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             dialing_popup_img = lv.img(dialing_popup_screen)
-            dialing_popup_img.set_pos(80, 20)
+            dialing_popup_img.set_pos(80, 10)
             dialing_popup_img.set_size(64, 64)
             dialing_popup_img.set_src("E:/static/IMAGE_NOTICE_CALL.png")
             dialing_popup_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             dialing_popup_name = lv.label(dialing_popup_screen)
-            dialing_popup_name.set_pos(0, 110)
+            dialing_popup_name.set_pos(0, 90)
             dialing_popup_name.set_size(LCD_SIZE_W, 50)
             dialing_popup_name.set_text(" ")
             dialing_popup_name.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
             dialing_popup_name.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT)
 
             dialing_popup_call = lv.label(dialing_popup_screen)
-            dialing_popup_call.set_pos(0, 170)
+            dialing_popup_call.set_pos(0, 150)
             dialing_popup_call.set_size(LCD_SIZE_W, 50)
             dialing_popup_call.set_text("正在拨号中")
             dialing_popup_call.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
@@ -2972,22 +2972,22 @@ class ToolboxScreen(Screen):
             toolbox_cont.set_size(LCD_SIZE_W, LCD_SIZE_H-50)
             toolbox_cont.add_style(toolbox_cont_style,lv.PART.MAIN | lv.STATE.DEFAULT)
 
+            #计步
+            # toolbox_step_bg_img = lv.img(toolbox_cont)
+            # toolbox_step_bg_img.set_pos(0, tool_set_y)
+            # toolbox_step_bg_img.set_size(TOOL_BG_ICON_W_SIZE, TOOL_BG_ICON_H_SIZE)
+            # toolbox_step_bg_img.add_flag(lv.obj.FLAG.CLICKABLE)
+            # toolbox_step_bg_img.set_src("E:/static/list_bg.png")
+            # toolbox_step_bg_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-            toolbox_step_bg_img = lv.img(toolbox_cont)
-            toolbox_step_bg_img.set_pos(0, tool_set_y)
-            toolbox_step_bg_img.set_size(TOOL_BG_ICON_W_SIZE, TOOL_BG_ICON_H_SIZE)
-            toolbox_step_bg_img.add_flag(lv.obj.FLAG.CLICKABLE)
-            toolbox_step_bg_img.set_src("E:/static/list_bg.png")
-            toolbox_step_bg_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-
-            toolbox_step_img = lv.img(toolbox_cont)
-            toolbox_step_img.set_pos(8, tool_set_y+6)
-            toolbox_step_img.set_size(TOOL_ICON_W_SIZE, TOOL_ICON_H_SIZE)
-            # toolbox_step_img.add_flag(lv.obj.FLAG.CLICKABLE)
-            toolbox_step_img.set_src("E:/static/tool/IMAGE_SECMENU_STEP.png")
-            toolbox_step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
-            tool_set_y+=TOOL_ICON_OFFSET_SIZE
+            # toolbox_step_img = lv.img(toolbox_cont)
+            # toolbox_step_img.set_pos(8, tool_set_y+6)
+            # toolbox_step_img.set_size(TOOL_ICON_W_SIZE, TOOL_ICON_H_SIZE)
+            # # toolbox_step_img.add_flag(lv.obj.FLAG.CLICKABLE)
+            # toolbox_step_img.set_src("E:/static/tool/IMAGE_SECMENU_STEP.png")
+            # toolbox_step_img.add_style(style_img, lv.PART.MAIN | lv.STATE.DEFAULT)
+            # tool_set_y+=TOOL_ICON_OFFSET_SIZE
 
             toolbox_weather_bg_img = lv.img(toolbox_cont)
             toolbox_weather_bg_img.set_pos(0, tool_set_y)
@@ -3062,7 +3062,7 @@ class ToolboxScreen(Screen):
 
             toolbox_screen.add_event_cb(lambda e: EventMesh.callback_wrapper(self.tool_cb(e, "void")), lv.EVENT.GESTURE, None)
 
-            toolbox_step_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.tool_cb(e, "step")), lv.EVENT.SHORT_CLICKED, None)
+            # toolbox_step_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.tool_cb(e, "step")), lv.EVENT.SHORT_CLICKED, None)
             toolbox_weather_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.tool_cb(e, "weather")), lv.EVENT.SHORT_CLICKED, None)
             toolbox_alarm_bg_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.tool_cb(e, "clk_list")), lv.EVENT.SHORT_CLICKED, None)
             # toolbox_sms_img.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "popup"})), lv.EVENT.CLICKED, None)
index bea231d..b93814a 100644 (file)
@@ -166,7 +166,7 @@ watchface1_step_span.set_size(240-142, 30)
 watchface1_step_span.set_align(lv.TEXT_ALIGN.LEFT)
 watchface1_step_span.set_text("0")
 watchface1_step_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT)
-
+watchface1_step_span.add_flag(lv.obj.FLAG.HIDDEN)
 
 
 # watchface1_HB_span = lv.label(Watchface1)
@@ -182,7 +182,7 @@ watchface1_HB_span.set_size(115, 30)
 watchface1_HB_span.set_text("0")
 watchface1_HB_span.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 watchface1_HB_span.add_style(style_font_youyuan_28, lv.PART.MAIN | lv.STATE.DEFAULT)
-
+watchface1_HB_span.add_flag(lv.obj.FLAG.HIDDEN)
 
 watchface1_SPO2_span = lv.label(Watchface1)
 watchface1_SPO2_span.set_pos(110, 235)
@@ -190,7 +190,7 @@ watchface1_SPO2_span.set_size(120, 30)
 watchface1_SPO2_span.set_text("0")
 watchface1_SPO2_span.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 watchface1_SPO2_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT)
-
+watchface1_SPO2_span.add_flag(lv.obj.FLAG.HIDDEN)
 
 class WatchFace1():
     NAME = "Watchface1"
@@ -463,6 +463,7 @@ watchface2_step_img.set_size(26,21)
 watchface2_step_img.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
 watchface2_step_img.set_src("U:/static/step.png")
 watchface2_step_img.add_style(style_watchface_img_default, lv.PART.MAIN|lv.STATE.DEFAULT)
+watchface2_step_img.add_flag(lv.obj.FLAG.HIDDEN)
 
 watchface2_step_txt = lv.label(Watchface2)
 watchface2_step_txt.set_pos(125, 250)
@@ -470,6 +471,7 @@ watchface2_step_txt.set_size(80, 30)
 watchface2_step_txt.set_align(lv.TEXT_ALIGN.LEFT)
 watchface2_step_txt.set_text("0")
 watchface2_step_txt.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAULT)
+watchface2_step_txt.add_flag(lv.obj.FLAG.HIDDEN)
 
 Watchface2_label_edit = lv.label(Watchface2)
 Watchface2_label_edit.set_pos(0, 0)
index 1fc41a8..67977e0 100644 (file)
@@ -427,7 +427,7 @@ MainMenu1_img_contacts = lv.img(MainMenu1_one)
 # MainMenu1_img_contacts.set_size(THEME1_ICON_X,THEME1_ICON_X)
 MainMenu1_img_contacts.set_size(240,282)
 MainMenu1_img_contacts.set_pos(0,0)
-MainMenu1_img_contacts.set_src("U:/static/theme1/THEME1_CONTACTS.png")
+MainMenu1_img_contacts.set_src("U:/static/theme1/theme1_1.png")
 # MainMenu1_img_contacts.add_flag(lv.obj.FLAG.CLICKABLE)
 MainMenu1_img_contacts.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -569,50 +569,60 @@ label_text.set_text("{}".format(MainMenu1_num))
 MainMenu1_img_wechat = lv.img(MainMenu1_three)
 MainMenu1_img_wechat.set_size(240,282)
 MainMenu1_img_wechat.set_pos(0,0)
-MainMenu1_img_wechat.set_src("U:/static/theme1/THEME1_WECHAT.png")
+MainMenu1_img_wechat.set_src("U:/static/theme1/theme1_2.png")
 # MainMenu1_img_wechat.add_flag(lv.obj.FLAG.CLICKABLE)
 MainMenu1_img_wechat.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
-# MainMenu1_img_health_text = lv.label(MainMenu1_three)
-# MainMenu1_img_health_text.set_pos(MAIN1_ICON_X,MAIN1_ICON_Y+5)
-# MainMenu1_img_health_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-# MainMenu1_img_health_text.add_flag(lv.obj.FLAG.CLICKABLE)
-# MainMenu1_img_health_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-# MainMenu1_img_health_text.set_text(" ")
-# MainMenu1_img_health_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
 
-MainMenu1_img_ai_text = lv.label(MainMenu1_three)
-MainMenu1_img_ai_text.set_pos(MAIN1_ICON_X*2,MAIN1_ICON_Y+5)
-MainMenu1_img_ai_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_ai_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_ai_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_ai_text.set_text(" ")
-MainMenu1_img_ai_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_img_picture_text = lv.label(MainMenu1_three)
+MainMenu1_img_picture_text.set_pos(MAIN1_ICON_X*2,MAIN1_ICON_Y+5)
+MainMenu1_img_picture_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_picture_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_picture_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_picture_text.set_text(" ")
+MainMenu1_img_picture_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
+# MainMenu1_img_ai_text = lv.label(MainMenu1_three)
+# MainMenu1_img_ai_text.set_pos(MAIN1_ICON_X*2,MAIN1_ICON_Y+5)
+# MainMenu1_img_ai_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+# MainMenu1_img_ai_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_ai_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_ai_text.set_text(" ")
+# MainMenu1_img_ai_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-MainMenu1_img_wechat_text = lv.label(MainMenu1_three)
-MainMenu1_img_wechat_text.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
-MainMenu1_img_wechat_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_wechat_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_wechat_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_wechat_text.set_text(" ")
-MainMenu1_img_wechat_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-# MainMenu1_img_alarm= lv.img(MainMenu1_three)
-# MainMenu1_img_alarm.set_size(THEME1_ICON_X,THEME1_ICON_Y)
-# MainMenu1_img_alarm.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
-# MainMenu1_img_alarm.set_src("U:/static/theme1/THEME1_ALARM.png")
-# MainMenu1_img_alarm.add_flag(lv.obj.FLAG.CLICKABLE)
-# MainMenu1_img_alarm.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-MainMenu1_img_alarm_text = lv.label(MainMenu1_three)
-MainMenu1_img_alarm_text.set_pos(MAIN1_ICON_X,140+5)
-MainMenu1_img_alarm_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_alarm_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_alarm_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_alarm_text.set_text(" ")
-MainMenu1_img_alarm_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+MainMenu1_img_video_text = lv.label(MainMenu1_three)
+MainMenu1_img_video_text.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
+MainMenu1_img_video_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_video_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_video_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_video_text.set_text(" ")
+MainMenu1_img_video_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+# MainMenu1_img_wechat_text = lv.label(MainMenu1_three)
+# MainMenu1_img_wechat_text.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
+# MainMenu1_img_wechat_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+# MainMenu1_img_wechat_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_wechat_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_wechat_text.set_text(" ")
+# MainMenu1_img_wechat_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+MainMenu1_img_alipay_text = lv.label(MainMenu1_three)
+MainMenu1_img_alipay_text.set_pos(MAIN1_ICON_X,140+5)
+MainMenu1_img_alipay_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_alipay_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_alipay_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_alipay_text.set_text(" ")
+MainMenu1_img_alipay_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+# MainMenu1_img_alarm_text = lv.label(MainMenu1_three)
+# MainMenu1_img_alarm_text.set_pos(MAIN1_ICON_X,140+5)
+# MainMenu1_img_alarm_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+# MainMenu1_img_alarm_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_alarm_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_alarm_text.set_text(" ")
+# MainMenu1_img_alarm_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
 MainMenu1_img_camera_text = lv.label(MainMenu1_three)
 MainMenu1_img_camera_text.set_pos(MAIN1_ICON_X*2+85,140+5)
@@ -634,7 +644,7 @@ label_text.set_text("{}".format(MainMenu1_num))
 MainMenu1_img_toolbox = lv.img(MainMenu1_four)
 MainMenu1_img_toolbox.set_size(240,282)
 MainMenu1_img_toolbox.set_pos(0,0)
-MainMenu1_img_toolbox.set_src("U:/static/theme1/THEME1_CAMERA.png")
+MainMenu1_img_toolbox.set_src("U:/static/theme1/theme1_3.png")
 # MainMenu1_img_toolbox.add_flag(lv.obj.FLAG.CLICKABLE)
 MainMenu1_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
 
@@ -646,91 +656,91 @@ MainMenu1_img_toolbox.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.ST
 # MainMenu1_img_camera_text.set_text(" ")
 # MainMenu1_img_camera_text.add_style(style_font_youyuan_20, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-MainMenu1_img_picture_text = lv.label(MainMenu1_four)
-MainMenu1_img_picture_text.set_pos(int(MAIN1_ICON_X),int(MAIN1_ICON_Y+5))
-MainMenu1_img_picture_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_picture_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_picture_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_picture_text.set_text(" ")
-MainMenu1_img_picture_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-MainMenu1_img_video_text = lv.label(MainMenu1_four)
-MainMenu1_img_video_text.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
-MainMenu1_img_video_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_video_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_video_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_video_text.set_text(" ")
-MainMenu1_img_video_text.add_style(style_font_youyuan_20, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-MainMenu1_img_alipay_text = lv.label(MainMenu1_four)
-MainMenu1_img_alipay_text.set_pos(MAIN1_ICON_X,140+5)
-MainMenu1_img_alipay_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
-MainMenu1_img_alipay_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_alipay_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_alipay_text.set_text(" ")
-MainMenu1_img_alipay_text.add_style(style_font_youyuan_20, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-MainMenu1_img_stopwatch_text = lv.label(MainMenu1_four)
-MainMenu1_img_stopwatch_text.set_pos(MAIN1_ICON_X*2+85,140+5)
-MainMenu1_img_stopwatch_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
-MainMenu1_img_stopwatch_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_stopwatch_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_stopwatch_text.set_text(" ")
-MainMenu1_img_stopwatch_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_img_ai_text = lv.label(MainMenu1_four)
+MainMenu1_img_ai_text.set_pos(int(MAIN1_ICON_X),int(MAIN1_ICON_Y+5))
+MainMenu1_img_ai_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_ai_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_ai_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_ai_text.set_text(" ")
+MainMenu1_img_ai_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-MainMenu1_num+=1
-MainMenu1x+=1
-#工具箱 设置 
-MainMenu1_setting = MainMenu1_til.add_tile(MainMenu1x, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
-label_text = lv.label(MainMenu1_setting)
-label_text.set_pos(0, LCD_SIZE_H)
-label_text.set_size(0, 0)
-label_text.set_text("{}".format(MainMenu1_num))
+MainMenu1_img_wechat_text = lv.label(MainMenu1_four)
+MainMenu1_img_wechat_text.set_pos(MAIN1_ICON_X*2+85,MAIN1_ICON_Y+5)
+MainMenu1_img_wechat_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_wechat_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_wechat_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_wechat_text.set_text(" ")
+MainMenu1_img_wechat_text.add_style(style_font_youyuan_20, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-MainMenu1_img_setting = lv.img(MainMenu1_setting)
-MainMenu1_img_setting.set_size(240,282)
-MainMenu1_img_setting.set_pos(0,0)
-MainMenu1_img_setting.set_src("U:/static/theme1/THEME1_SETING.png")
-# MainMenu1_img_setting.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
-
-# MainMenu1_img_stopwatch_text = lv.label(MainMenu1_setting)
-# MainMenu1_img_stopwatch_text.set_pos(MAIN1_ICON_X,MAIN1_ICON_Y+5)
-# MainMenu1_img_stopwatch_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
-# MainMenu1_img_stopwatch_text.add_flag(lv.obj.FLAG.CLICKABLE)
-# MainMenu1_img_stopwatch_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-# MainMenu1_img_stopwatch_text.set_text(" ")
-# MainMenu1_img_stopwatch_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-
-MainMenu1_img_countdown_text = lv.label(MainMenu1_setting)
-MainMenu1_img_countdown_text.set_pos(MAIN1_ICON_X,MAIN1_ICON_Y+5)
-MainMenu1_img_countdown_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
-MainMenu1_img_countdown_text.add_flag(lv.obj.FLAG.CLICKABLE)
-MainMenu1_img_countdown_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
-MainMenu1_img_countdown_text.set_text(" ")
-MainMenu1_img_countdown_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
-
-MainMenu1_img_toolbox_text = lv.label(MainMenu1_setting)
-MainMenu1_img_toolbox_text.set_pos(int(MAIN1_ICON_X*2+85),int(MAIN1_ICON_Y+5))
+MainMenu1_img_toolbox_text = lv.label(MainMenu1_four)
+MainMenu1_img_toolbox_text.set_pos(MAIN1_ICON_X,140+5)
 MainMenu1_img_toolbox_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
 MainMenu1_img_toolbox_text.add_flag(lv.obj.FLAG.CLICKABLE)
 MainMenu1_img_toolbox_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 MainMenu1_img_toolbox_text.set_text(" ")
-MainMenu1_img_toolbox_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_img_toolbox_text.add_style(style_font_youyuan_20, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-MainMenu1_img_setting_text = lv.label(MainMenu1_setting)
-MainMenu1_img_setting_text.set_pos(int(MAIN1_ICON_X),int(140+5))
-MainMenu1_img_setting_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+MainMenu1_img_setting_text = lv.label(MainMenu1_four)
+MainMenu1_img_setting_text.set_pos(MAIN1_ICON_X*2+85,140+5)
+MainMenu1_img_setting_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
 MainMenu1_img_setting_text.add_flag(lv.obj.FLAG.CLICKABLE)
 MainMenu1_img_setting_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
 MainMenu1_img_setting_text.set_text(" ")
 MainMenu1_img_setting_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
 
-
-
 MainMenu1_num+=1
 MainMenu1x+=1
+# #工具箱 设置 
+# MainMenu1_setting = MainMenu1_til.add_tile(MainMenu1x, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+# label_text = lv.label(MainMenu1_setting)
+# label_text.set_pos(0, LCD_SIZE_H)
+# label_text.set_size(0, 0)
+# label_text.set_text("{}".format(MainMenu1_num))
+
+# MainMenu1_img_setting = lv.img(MainMenu1_setting)
+# MainMenu1_img_setting.set_size(240,282)
+# MainMenu1_img_setting.set_pos(0,0)
+# MainMenu1_img_setting.set_src("U:/static/theme1/THEME1_SETING.png")
+# # MainMenu1_img_setting.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_setting.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+# # MainMenu1_img_stopwatch_text = lv.label(MainMenu1_setting)
+# # MainMenu1_img_stopwatch_text.set_pos(MAIN1_ICON_X,MAIN1_ICON_Y+5)
+# # MainMenu1_img_stopwatch_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
+# # MainMenu1_img_stopwatch_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# # MainMenu1_img_stopwatch_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# # MainMenu1_img_stopwatch_text.set_text(" ")
+# # MainMenu1_img_stopwatch_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+
+# MainMenu1_img_countdown_text = lv.label(MainMenu1_setting)
+# MainMenu1_img_countdown_text.set_pos(MAIN1_ICON_X,MAIN1_ICON_Y+5)
+# MainMenu1_img_countdown_text.set_size(THEME1_ICON_X,THEME1_ICON_Y)
+# MainMenu1_img_countdown_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_countdown_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_countdown_text.set_text(" ")
+# MainMenu1_img_countdown_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+# MainMenu1_img_toolbox_text = lv.label(MainMenu1_setting)
+# MainMenu1_img_toolbox_text.set_pos(int(MAIN1_ICON_X*2+85),int(MAIN1_ICON_Y+5))
+# MainMenu1_img_toolbox_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+# MainMenu1_img_toolbox_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_toolbox_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_toolbox_text.set_text(" ")
+# MainMenu1_img_toolbox_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+# MainMenu1_img_setting_text = lv.label(MainMenu1_setting)
+# MainMenu1_img_setting_text.set_pos(int(MAIN1_ICON_X),int(140+5))
+# MainMenu1_img_setting_text.set_size(THEME1_ICON_X,THEME1_ICON_X)
+# MainMenu1_img_setting_text.add_flag(lv.obj.FLAG.CLICKABLE)
+# MainMenu1_img_setting_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+# MainMenu1_img_setting_text.set_text(" ")
+# MainMenu1_img_setting_text.add_style(style_font_youyuan_20_black, lv.PART.MAIN|lv.STATE.DEFAULT)
+
+
+
+# MainMenu1_num+=1
+# MainMenu1x+=1
 
 #主菜单风格2,单页
 class MainMenuScreen(Screen):
@@ -785,14 +795,14 @@ class MainMenuScreen(Screen):
         MainMenu1_img_wechat_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu1_img_wechat_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.PRESSING, None)
 
-        MainMenu1_img_alarm_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "clk_list")), lv.EVENT.SHORT_CLICKED, None)
-        MainMenu1_img_alarm_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "clk_list")), lv.EVENT.PRESSING, None)
+        # MainMenu1_img_alarm_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "clk_list")), lv.EVENT.SHORT_CLICKED, None)
+        # MainMenu1_img_alarm_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "clk_list")), lv.EVENT.PRESSING, None)
 
-        MainMenu1_img_stopwatch_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "stopwatch")), lv.EVENT.SHORT_CLICKED, None)
-        MainMenu1_img_stopwatch_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "stopwatch")), lv.EVENT.PRESSING, None)
+        # MainMenu1_img_stopwatch_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "stopwatch")), lv.EVENT.SHORT_CLICKED, None)
+        # MainMenu1_img_stopwatch_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "stopwatch")), lv.EVENT.PRESSING, None)
 
-        MainMenu1_img_countdown_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "countdown")), lv.EVENT.SHORT_CLICKED, None)
-        MainMenu1_img_countdown_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "countdown")), lv.EVENT.PRESSING, None)
+        # MainMenu1_img_countdown_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "countdown")), lv.EVENT.SHORT_CLICKED, None)
+        # MainMenu1_img_countdown_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "countdown")), lv.EVENT.PRESSING, None)
         
         MainMenu1_img_camera_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera")), lv.EVENT.SHORT_CLICKED, None)
         MainMenu1_img_camera_text.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "camera")), lv.EVENT.PRESSING, None)
index 727cd26..ac602bd 100644 (file)
 #define MICROPY_QPY_PERSISTENT_CODE_LOAD        (1)  //flash 2048 Byte
 #define MICROPY_QPY_EMIT_XTENSAWIN              (0)  //flash 19776 Byte
 #define MICROPY_QPY_MODULE_VFS_THREADSAFE       (1)
-#define MICROPY_QPY_GC_HEAP_SIZE       (1000 * 1024)
+#define MICROPY_QPY_GC_HEAP_SIZE       (1200 * 1024)
 #endif
\ No newline at end of file
index 26f2105..7cb8c5e 100644 (file)
Binary files a/2.sdk/project/W8/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip and b/2.sdk/project/W8/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip differ
index d632447..bf20669 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef __APP_LINK_START_ADDR_H__
 #define __APP_LINK_START_ADDR_H__
 
-#define APP_LINK_START_ADDR  0x80592000
-#define APP_FLASH_MAX_SIZE 0x1D0000
+#define APP_LINK_START_ADDR  0x8058A000
+#define APP_FLASH_MAX_SIZE 0x1D8000
 
 #define APP_RAM_START 0x7E3E0000
 #define APP_RAM_MAX_SIZE 0x180000