C06S心率调试,编码器调试
authorp15692025051 <846603105@qq.com>
Fri, 3 Nov 2023 08:19:33 +0000 (16:19 +0800)
committerp15692025051 <846603105@qq.com>
Fri, 3 Nov 2023 08:19:33 +0000 (16:19 +0800)
22 files changed:
2.sdk/Helios_SDK/components/HX3918/hx3918.h
2.sdk/Helios_SDK/components/HX3918/hx3918_hrs_agc.c
2.sdk/Helios_SDK/components/HX3918/hx3918_prox.c
2.sdk/Helios_SDK/components/HX3918/hx3918_prox.h
2.sdk/Helios_SDK/components/HX3918/hx3918_spo2_agc.c
2.sdk/Helios_SDK/services/microPython/microPython.mk
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/modHsensor_HX3918.c
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.c [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.h [new file with mode: 0644]
2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/mpconfigport.h
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/Makefile
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/appFactoryMode.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/btn_device_ec800m.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/main_1.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/mgr.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/ui.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/ui_WatchFaceScreen.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/ui_main_menu.py
2.sdk/project/C06S/sdk/services/microPython/ports/quectel/core/ui_setting.py
2.sdk/project/C06S/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_VOLTE/config/mpconfigboard.h

index 39bfd53..79feaf2 100644 (file)
@@ -3,7 +3,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include "helios_debug.h"
-#define HX3918_DEBUG  0
+#define HX3918_DEBUG  1
 #if HX3918_DEBUG == 1
 #define HX3918_LOG(msg, ...)      custom_log("HX3918", msg, ##__VA_ARGS__)
 #else
index 45b2e5d..9596320 100644 (file)
@@ -188,6 +188,10 @@ void hx3918_hrs_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r
     hx3918_delay(5);
     hx3918_write_reg(0x4d, 0x00);   //release
     hx3918_delay(5);
+ #ifdef SAR_ALG_LIB
+    hx3918_prox_reg_init();
+#endif
+
     read_fifo_first_flg = 1;
 }
 
@@ -683,15 +687,16 @@ uint8_t hx3918_hrs_read(ppg_sensor_data_t * s_dat)
     int32_t *PPG_buf =  &(s_dat->green_data[0]);
     int32_t *ir_buf =  &(s_dat->ir_data[0]);
     int32_t *s_buf =  &(s_dat->s_buf[0]);
-    s_dat->green_cur =  calReg.led_cur;
     //int32_t *sar_lp_data  = &s_dat->sar_data;
     int32_t ps_data[4]= {0};
     int32_t ps_green_data = 0;
     uint8_t data_count = 0;
+       uint8_t i=0;
 
+    s_dat->green_cur =  calReg.led_cur;
     if (!s_ppg_state || s_cal_state)
     {
-        return NULL;
+        return 0;
     }
 
     read_data_packet(ps_data);
@@ -700,7 +705,7 @@ uint8_t hx3918_hrs_read(ppg_sensor_data_t * s_dat)
     data_count = hx3918_read_fifo_data(s_buf,2,1);
     s_dat->count =  data_count;
        HX3918_LOG("hx3918_hrs_read data_count:%d\r\n   ",data_count);
-    for (uint8_t i=0; i<data_count; i++)
+    for ( i=0; i<data_count; i++)
     {
         PPG_src_data = s_buf[i*2+1];
         Ir_src_data = s_buf[i*2];
index a1ca1f5..8db2d3a 100644 (file)
@@ -75,6 +75,7 @@ uint32_t fds_write[4] = {0}; //写flash的变量, flash里面分别记录
 
 
 static uint8_t data_updata_ready = 0;
+static uint8_t data_convert_ready = 0;
 uint8_t  is_factory_mode = 0;    // 产测模式, 用来读取整机对空时OFFSET和对空的nv_base值;
 uint8_t  is_offset_manual = 0;    // = 0自动校准模式, 用来读取整机对空时OFFSET和对空的nv_base值;
 static bool cap_enable = true;
@@ -184,9 +185,9 @@ static int16_t readlp_after_writeoffset(int16_t offset,uint8_t chx_offset)
 {
     int16_t lpout;
     hx3918_write_offset(offset,chx_offset);
-    hx3918_delay(52);
+    hx3918_delay(32);
     lpout = hx3918_read_diff_lp(chx_offset);
-    hx3918_delay(53);
+    hx3918_delay(33);
     lpout = hx3918_read_diff_lp(chx_offset);
     return lpout;
 }
@@ -222,11 +223,14 @@ uint16_t  hx3918_read_offset(uint8_t chx_offset)
                 recordoffset = mid-1;
             }
             cnt ++;
+            if(cnt > 20)
+                break;
+            HX3918_LOG(" hx3918_read_offset cnt=%d,recordoffset =%d writeoffset=%d\r\n",cnt,recordoffset,writeoffset);
         }
         else
         {
             offset = mid;
-            TYHX_LOG(" final ch=%d,offset =%d lp=%d\r\n",chx_offset,offset,lp);
+            HX3918_LOG(" final ch=%d,offset =%d lp=%d\r\n",chx_offset,offset,lp);
             break;
         }
         //TYHX_LOG(" ch=%d,lp =%d,writeoffset=%d,recordoffset=%d\r\n",chx_offset,lp,writeoffset,recordoffset);
@@ -317,6 +321,7 @@ bool hx3918_prox_reg_init(void)
 {
     bool write_ok = true;
                data_updata_ready = 0;
+               data_convert_ready = 0;
 //prf 默认25HZ
 //    if (hx3918_chip_id != PROX_CHIPID)
 //    {
@@ -332,12 +337,12 @@ bool hx3918_prox_reg_init(void)
 
 #ifdef INDEPENDDENT_CH //
     write_ok &= hx3918_write_reg(0x55,0x0C);   //CS1->CH0
-       write_ok &= hx3918_write_reg(0x55,0x03);   //CS0->CH0
+       write_ok &= hx3918_write_reg(0x57,0x03);   //CS0->CH1
                
                
 //    write_ok &= hx3918_write_reg(0x57,0x30);   //CS2->CH1    
 //             write_ok &= hx3918_write_reg(0x57,0x03);   //CS0->CH1
-                 write_ok &= hx3918_write_reg(0x57,0x0c);   //CS1->CH1
+                 //write_ok &= hx3918_write_reg(0x57,0x0c);   //CS1->CH1
                
 #elif defined(DIFFERENCE_CH) //?????????????¨, ???????·??
 //    write_ok &= hx3918_write_reg(0x55,0x2c);   //CS1->CH0[P],CS2->CH0[N]
@@ -456,7 +461,7 @@ uint8_t hx3918_report_prox_status(void)
                        data_updata_ready = 0;
                }
                
-               if (data_updata_ready == 1&& (glp[0] != gbl[0]))
+               if (data_convert_ready == 1&& (glp[0] != gbl[0]))
                {
                        if (is_offset_manual == 0)
                        {
@@ -467,22 +472,22 @@ uint8_t hx3918_report_prox_status(void)
                                gdiff[0] = glp[0]- nv_base_data[0];
                        }
                        gdiff[1] = glp[1]- gbl[1];
-                       
+                       data_updata_ready = 1;
                        hx3918_update_min_nv_data(gbl[0]);
                }
                
                if ((glp[0] == gbl[0]) && (glp[0] != 0) && is_offset_manual ==1)
                {
-                       if (data_updata_ready == 0)
+                       if (data_convert_ready == 0)
                        {
                                // 恢复寄存器
                                hx3918_write_reg(0x9c,0x07); // lp_out_delta_bypass
                                //hx3918_write_reg(0x85,0x0f); // prox_int_high_num_i2c
                                //hx3918_write_reg(0xa3,0xff); //lp_out_delta_thres_ch1[7:0]
                                //hx3918_write_reg(0xa4,0x0f); // lp_out_delta_thres_ch1[11:8]
-                               hx3918_write_reg(0x70,0x99); // RA_UP_ALP_1_0_CFG
-                               data_updata_ready = 1;
-                               HX3918_LOG("data_updata_ready == 1\r\n");
+                               hx3918_write_reg(0x70,0x00); // RA_UP_ALP_1_0_CFG
+                               data_convert_ready = 1;
+                               TYHX_LOG("data_convert_ready == 1\r\n");
                        }
                }
                if(gdiff[0]>sar_wear_thres)
@@ -710,7 +715,7 @@ bool hx3918_prox_factory_init(void)
     for (i = 0; i<5; i++)
     {
         hx3918_chip_id = hx3918_check_device_id();
-        TYHX_LOG(" power restart ,prox device_id is : 0x%.2x !\r\n", hx3918_chip_id);
+        HX3918_LOG(" power restart ,prox device_id is : 0x%.2x !\r\n", hx3918_chip_id);
         if (hx3918_chip_id == PROX_CHIPID)
         {
                                                hx3918_write_reg(0x18,0x40);    //prf =100HZ
@@ -722,7 +727,7 @@ bool hx3918_prox_factory_init(void)
                
     if(hx3918_chip_id != PROX_CHIPID)
     {
-        TYHX_LOG("no proximity device\r\n");
+        HX3918_LOG("no proximity device\r\n");
         hx3918_power_down();
     }
     return ret;
@@ -769,13 +774,15 @@ void hx3918_prox_factory_hanging_cali(void)
     // int16_t lp[2] = {0};
     //uint8_t device_id = 0x00;
                is_offset_manual = 0;
+    HX3918_LOG("hx3918_prox_factory_hanging_cali0\n");
     hx3918_prox_factory_init();
+    HX3918_LOG("hx3918_prox_factory_hanging_cali1\n");
     hx3918_delay(50);//delay 100ms
-
+    HX3918_LOG("hx3918_prox_factory_hanging_cali2\n");
     prox_factory_offset0 = hx3918_read_offset(WEAR_CH);
     prox_factory_offset1 = hx3918_read_offset(REF_CH);
 
-
+    HX3918_LOG("hx3918_prox_factory_hanging_cali3\n");
     prox_factory_lp[0] = hx3918_read_diff_lp(WEAR_CH);
     prox_factory_lp[1] = hx3918_read_diff_lp(REF_CH);
 
@@ -792,7 +799,7 @@ void hx3918_prox_factory_hanging_cali(void)
     nv_wear_offset[1] = prox_factory_offset1;
     nv_base_data[0] = prox_factory_lp[0];
     nv_base_data[1] = prox_factory_lp[1];
-    HX3918_LOG("base0,base1=    %d  %d\r\n", glp[0],glp[1]);
+    HX3918_LOG("base0,base1=    %d  %d\r\n", prox_factory_lp[0],prox_factory_lp[1]);
 
 #ifdef DIFFERENCE_CH
     //将差分数据读到的OFFSET, NV_BASE记录到FLASH里面, 校准存储把自学习的记录也需要清掉重新计算
index 6069fdd..9882344 100644 (file)
@@ -77,8 +77,6 @@
 #define READ_DEVATION        845
 #elif defined(FULL375PF)
 #define READ_DEVATION        560
-#elif defined(FULL375PF)
-#define READ_DEVATION        420
 #elif defined(FULL50PF)
 #define READ_DEVATION        420
 #endif
index 03e0109..523f1f9 100644 (file)
@@ -188,7 +188,10 @@ void hx3918_spo2_ppg_init(void) //2023 3918
     hx3918_delay(5);
     hx3918_write_reg(0X4d,0X00);  //release
     hx3918_delay(5);
-       
+
+#ifdef SAR_ALG_LIB
+    hx3918_prox_reg_init();
+#endif
     read_fifo_first_flg = 1;
 
 }
@@ -271,6 +274,15 @@ bool hx3918_spo2_check_wear(int32_t infrared_data)
             return true;
         }
     }
+               else{
+                       
+                               if (spo2_wear_status == MSG_SPO2_INIT )
+                               {
+                                       spo2_wear_status = MSG_SPO2_NO_WEAR;
+                                       spo2_wear_status_pre = MSG_SPO2_NO_WEAR;
+                               }
+               }
+               
     return false;
 }
 
@@ -766,24 +778,25 @@ uint8_t hx3918_spo2_read(ppg_sensor_data_t * s_dat)
     int32_t Green_src_data;
     int32_t Amb_data;
     bool recal = false;
+uint8_t i=0;
     int32_t *green_buf = &(s_dat->green_data[0]);
     int32_t *red_buf =  &(s_dat->red_data[0]);
     int32_t *ir_buf =  &(s_dat->ir_data[0]);
     int32_t *s_buf =  &(s_dat->s_buf[0]);
     //int32_t *sar_lp_data  = &s_dat->sar_data;
+    uint8_t data_count = 0;
     s_dat->green_cur = calReg.green_cur;
     s_dat->red_cur =  calReg.red_cur;
     s_dat->ir_cur =  calReg.ir_cur;
-    uint8_t data_count = 0;
     if (!s_ppg_state || s_cal_state)
     {
-        return NULL;
+        return 0;
     }
     data_count = hx3918_read_fifo_data(s_buf,4,1);
     //*sar_lp_data = hx3918_read_sar_data();
     s_dat->count =  data_count;
-       TYHX_LOG("\r\n spo2  ir data:   ");
-    for (uint8_t i=0; i<data_count; i++)
+
+    for ( i=0; i<data_count; i++)
     {
         Amb_data = s_buf[i*4];
         Green_src_data = s_buf[i*4+2];
@@ -799,7 +812,7 @@ uint8_t hx3918_spo2_read(ppg_sensor_data_t * s_dat)
                        TYHX_LOG("spo2  unwear data %d\r\n:     ",calReg.ir_idac);
             if(hx3918_spo2_check_unwear())
             {
-                return NULL;
+                return 0;
             }
         }
         else
@@ -807,7 +820,7 @@ uint8_t hx3918_spo2_read(ppg_sensor_data_t * s_dat)
                TYHX_LOG("spo2  check wear data %d\r\n: ",Ir_src_data-Amb_data);
             if(hx3918_spo2_check_wear(Ir_src_data-Amb_data))
             {
-                return NULL;
+                return 0;
             }
         }
         
index 62ac9a9..962b470 100644 (file)
@@ -262,6 +262,7 @@ QPY_SRCS = \
         ports/quectel/core/source/modHsensor.c \
         ports/quectel/core/source/modHsensor_GH3018.c \
         ports/quectel/core/source/modHsensor_HX3918.c \
+        ports/quectel/core/source/modgpio_encoder.c \
         ports/quectel/core/source/modVideoCall.c \
         ports/quectel/core/source/modVideoCall_juphoon.c \
         ports/quectel/core/source/modrsa.c \
index 10b913d..800d8f0 100644 (file)
@@ -427,6 +427,15 @@ void qpy_callback_deal_thread(void * args_in)
                     mp_sched_schedule_ex(&cb_msg->callback,  mp_obj_new_int(cb_msg->state));
                                }
                 break;
+            #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:
                                {
index fb282a5..62d78e7 100644 (file)
@@ -75,6 +75,9 @@ enum {
 #endif
     CALLBACK_TYPE_ID_TP,
     CALLBACK_TYPE_ID_Gsensor,
+#if MICROPY_QPY_MODULE_GPIO_ENCODER
+    CALLBACK_TYPE_ID_ENCODER,
+#endif
 #if MICROPY_QPY_MODULE_BT
        CALLBACK_TYPE_ID_BT,
 #endif
@@ -121,7 +124,10 @@ typedef struct{
     uint8_t state;
     c_callback_t callback;
 }st_CallBack_Gsensor;
-
+typedef struct{
+    uint32_t spin_direct;
+    c_callback_t callback;
+}st_CallBack_Encoder;
 typedef struct{
     uint8_t pin_no;
     uint8_t edge;
index a4aba30..c28ceec 100644 (file)
@@ -414,7 +414,9 @@ void HX3918_test(uint32_t mode)
                // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
                // Helios_msleep(20);
                // hx3918_init(WEAR_MODE);//打开佩戴检测
+               HX3918_LOG("HX3918_test: hx3918_prox_factory_hanging_cali\r\n");
                #ifdef  SAR_ALG_LIB
+               //hx3918_prox_init();
                hx3918_prox_factory_hanging_cali();
                #endif
        }
@@ -488,10 +490,18 @@ void HX3918_close(void)
 }
 void HX3918_restart(void)
 {
+       // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW);
+       // Helios_msleep(50);
+       // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
+       // Helios_msleep(50);
+
        Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW);
-       Helios_msleep(50);
+       Helios_msleep(10);
        Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH);
-       Helios_msleep(50);
+       Helios_GPIO_SetLevel(31, HELIOS_LVL_LOW);
+       Helios_msleep(20);
+       Helios_GPIO_SetLevel(31, HELIOS_LVL_HIGH);
+       Helios_msleep(20);
 }
 //关闭hsensor
 STATIC mp_obj_t mp_HX3918_close(mp_obj_t self_in)
diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.c
new file mode 100644 (file)
index 0000000..89ca406
--- /dev/null
@@ -0,0 +1,240 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "obj.h"
+#include "runtime.h"
+#include "mperrno.h"
+
+#include "mpconfigboard.h"
+#if MICROPY_QPY_MODULE_GPIO_ENCODER
+
+#include "helios_debug.h"
+#include "helios_extint.h"
+#include "helios_gpio.h"
+#include "modgpio_encoder.h"
+#include "callbackdeal.h"
+
+#define HELIOS_ENCODER_LOG(msg, ...)      custom_log("gpio codec", msg, ##__VA_ARGS__)
+
+#define STEP_RIGHT 1
+#define STEP_LEFT  2
+
+
+char first_line = 0;      //第一次跳变的线(A 0r B)
+char first_line_edge = 0; //跳边沿
+int gpio_a = 0;
+int gpio_b = 0;
+int step1_switch = 0;
+static c_callback_t *usr_callback = NULL;
+static c_callback_t cb = {0};
+
+/* 定义encoder_obj_t结构体 */
+typedef struct _encoder_obj_t
+{
+    mp_obj_base_t base;   //定义的对象结构体要包含该成员
+}encoder_obj_t;
+
+void knob_line_A_detection(void)
+{
+    step1_switch = 0;
+    if (Helios_GPIO_GetLevel(gpio_a) == 0) //A线产生下降沿
+    {
+        if (first_line == 'B')
+        {
+            if (first_line_edge == 0)
+            {
+                first_line = 0;
+                //先B下降沿,然后A下降沿,判断为逆时针转动一次
+                step1_switch = STEP_RIGHT;
+            }
+            else
+            {
+                //先B上升沿,然后A下降沿,判断为顺时针转动一次
+                first_line = 0;
+                step1_switch = STEP_LEFT;
+            }
+        }
+        else
+        {
+            //首次A下降沿
+            first_line = 'A';
+            first_line_edge = 0;
+        }
+    }
+    else //A线产生上升沿
+    {
+        if (first_line == 'B')
+        {
+            if (first_line_edge == 0)
+            {
+                //先B下降沿,然后A上升沿,判断为顺时针转动一次
+                first_line = 0;
+                step1_switch = STEP_LEFT;
+            }
+            else
+            {
+                first_line = 0;
+                //先B上升沿,然后A上升沿,判断为逆时针转动一次
+                step1_switch = STEP_RIGHT;
+            }
+        }
+        else
+        {
+            //首次A上升沿
+            first_line = 'A';
+            first_line_edge = 1;
+        }
+    }
+    if (usr_callback && step1_switch) {
+        st_CallBack_Encoder *encoder_int = malloc(sizeof(st_CallBack_Encoder));
+        if(NULL != encoder_int) { 
+            encoder_int->spin_direct = step1_switch;
+            encoder_int->callback = cb;
+            qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_ENCODER, encoder_int);
+        }
+    }
+    Helios_ExtInt_Enable((Helios_GPIONum)gpio_a);
+}
+
+void knob_line_B_detection(void)
+{
+    step1_switch = 0;
+    if (Helios_GPIO_GetLevel(gpio_b) == 0) //B线产生下降沿
+    {
+        if (first_line == 'A')
+        {
+            if (first_line_edge == 0)
+            {
+                first_line = 0;
+                //先A下降沿,然后B下降沿,判断为顺时针转动一次
+                step1_switch = STEP_LEFT;
+            }
+            else
+            {
+                //先A上升沿,然后B下降沿,判断为逆时针转动一次
+                first_line = 0;
+                step1_switch = STEP_RIGHT;
+            }
+        }
+        else
+        {
+            //首次B上升沿
+            first_line = 'B';
+            first_line_edge = 0;
+        }
+    }
+    else //B线产生上升沿
+    {
+        if (first_line == 'A')
+        {
+            if (first_line_edge == 0)
+            {
+                //先A下降沿,然后B上升沿,判断为逆时针转动一次
+                first_line = 0;
+                step1_switch = STEP_RIGHT;
+            }
+            else
+            {
+                first_line = 0;
+                //先A上升沿,然后B上升沿,判断为顺时针转动一次
+                step1_switch = STEP_LEFT;
+            }
+        }
+        else
+        {
+            //首次B上升沿
+            first_line = 'B';
+            first_line_edge = 1;
+        }
+    }
+    
+    if (usr_callback && step1_switch) {
+        st_CallBack_Encoder *encoder_int = malloc(sizeof(st_CallBack_Encoder));
+        if(NULL != encoder_int) { 
+            encoder_int->spin_direct = step1_switch;
+            encoder_int->callback = cb;
+            qpy_send_msg_to_callback_deal_thread(CALLBACK_TYPE_ID_ENCODER, encoder_int);
+        }
+    }
+    
+    Helios_ExtInt_Enable((Helios_GPIONum)gpio_b);
+}
+
+
+mp_obj_t encoder_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
+    enum { ARG_pin_A, ARG_pin_B};
+    static const mp_arg_t allowed_args[] = {
+               { MP_QSTR_pin_A, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
+               { MP_QSTR_pin_B, 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);
+
+       int pin_a = args[ARG_pin_A].u_int;
+       int pin_b = args[ARG_pin_B].u_int;
+    int ret=-1;
+    gpio_a = pin_a;
+    gpio_b = pin_b;
+    encoder_obj_t *self = m_new_obj_with_finaliser(encoder_obj_t);
+    self->base.type = &encoder_type;
+    HELIOS_ENCODER_LOG("encoder_make_new start!!!,a:%d,b:%d", gpio_a, gpio_b);
+       // init extint A
+       Helios_ExtIntStruct extint_struct = {0};
+       extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
+       extint_struct.gpio_edge = HELIOS_EDGE_BOTH;
+       extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
+       extint_struct.gpio_pull = HELIOS_PULL_UP;
+       extint_struct.eint_cb = NULL;
+       extint_struct.wakeup_eint_cb = knob_line_A_detection;
+       if(0 != Helios_ExtInt_Init((Helios_GPIONum)pin_a,  &extint_struct)) {
+               mp_raise_ValueError("Interrupt initialization failed");
+       }
+       Helios_ExtInt_Enable((Helios_GPIONum)pin_a);
+
+    // init extint B
+       extint_struct.gpio_trigger = HELIOS_EDGE_TRIGGER;
+       extint_struct.gpio_edge = HELIOS_EDGE_BOTH;
+       extint_struct.gpio_debounce = HELIOS_DEBOUNCE_EN;
+       extint_struct.gpio_pull = HELIOS_PULL_UP;
+       extint_struct.eint_cb = NULL;
+       extint_struct.wakeup_eint_cb = knob_line_B_detection;
+       if(0 != Helios_ExtInt_Init((Helios_GPIONum)pin_b,  &extint_struct)) {
+               mp_raise_ValueError("Interrupt initialization failed");
+       }
+       Helios_ExtInt_Enable((Helios_GPIONum)pin_b);
+
+       return MP_OBJ_FROM_PTR(self);
+}
+
+STATIC mp_obj_t set_callback(mp_obj_t self_in, const mp_obj_t handler)
+{
+    usr_callback = &cb;
+    mp_sched_schedule_callback_register(usr_callback, handler);
+
+    return mp_obj_new_int(1);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(set_callback_obj, set_callback);
+
+
+/* 定义type的本地字典 */
+STATIC const mp_rom_map_elem_t encoder_locals_dict_table[] = {
+       { MP_OBJ_NEW_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_encoder) },
+    { MP_ROM_QSTR(MP_QSTR_set_callback), MP_ROM_PTR(&set_callback_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(encoder_locals_dict, encoder_locals_dict_table);
+
+/* 定义mp_obj_type_t类型的结构体;注意这里和定义module使用的类型是不一样的 */
+const mp_obj_type_t encoder_type = {
+    .base={ &mp_type_type }, 
+    .name = MP_QSTR_ENCODER, //type类的name属性是放在这里定义,而不是放在DICT中
+    .make_new = encoder_make_new, //添加的make new属性
+    .locals_dict = (mp_obj_dict_t*)&encoder_locals_dict, //注册encoder_locals_dict
+};
+
+
+
+#endif /* MICROPY_QPY_MODULE_GPIO_ENCODER */
+
diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.h b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modgpio_encoder.h
new file mode 100644 (file)
index 0000000..31b438e
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * 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 MICROPY_INCLUDED_ENCODER_H
+#define MICROPY_INCLUDED_ENCODER_H
+
+#include "helios_os.h"
+
+#include <stdint.h>
+
+
+#endif // MICROPY_INCLUDED_ENCODER_H
+
index 82f311e..e8cddda 100644 (file)
@@ -707,6 +707,12 @@ extern const struct _mp_obj_module_t mp_module_Gsensor;
 #else
 #define MICROPY_PORT_BUILTIN_MODULES_Gsensor
 #endif
+#if MICROPY_QPY_MODULE_GPIO_ENCODER
+extern const struct _mp_obj_type_t encoder_type;
+#define MICROPY_PORT_BUILTIN_MODULES_ENCODER           { MP_OBJ_NEW_QSTR(MP_QSTR_encoder), (mp_obj_t)&encoder_type},
+#else
+#define MICROPY_PORT_BUILTIN_MODULES_ENCODER
+#endif
 
 #if 1 //MICROPY_QPY_MODULE_Hsensor
 extern const struct _mp_obj_module_t mp_module_Hsensor;
@@ -786,6 +792,7 @@ extern const struct _mp_obj_module_t mp_module_network;
                MICROPY_PORT_BUILTIN_MODULES_ALIPAY \
                MICROPY_PORT_BUILTIN_MODULES_G729 \
                MICROPY_PORT_BUILTIN_MODULES_Gsensor \
+               MICROPY_PORT_BUILTIN_MODULES_ENCODER \
                MICROPY_PORT_BUILTIN_MODULES_Hsensor \
                MICROPY_PORT_BUILTIN_MODULES_VideoCall \
                MICROPY_PORT_BUILTIN_MODULES_code128\
index 7b20a27..b86010e 100644 (file)
@@ -357,6 +357,7 @@ SRC_QSTR += \
                        source/modHsensor.c \
                        source/modHsensor_GH3018.c \
                        source/modHsensor_HX3918.c \
+                       source/modgpio_encoder.c \
                        source/modrsa.c \
                        source/utils_crc32.c \
                        source/http_parser.c \
index 10b43b4..dc498cc 100644 (file)
@@ -345,7 +345,7 @@ class FactoryModeHsensorTestScreen(Screen):
         print("打开校准模式")
         self.Hsensor.set_sar(1)
         self.Hsensor.open_test(255) #打开校准模式
-        utime.sleep_ms(500)
+        utime.sleep_ms(1000)
         self.Hsensor.open_heart()
         self.hsensorTest_timer_count = 5
 
@@ -375,7 +375,8 @@ class FactoryModeHsensorTestScreen(Screen):
                 self.hsensorTest_timer_count -= 1
                 if self.hsensorTest_timer_count == 0:
                     self.Hsensor.close() 
-                    self.Hsensor.init();   
+                    utime.sleep_ms(500)
+                    self.Hsensor.init() 
 
     def Close(self):
         self.hsensorTest_timer.stop()
index 8ecb715..a78c30e 100644 (file)
@@ -5,7 +5,10 @@ from misc import PowerKey
 import EventMesh
 from machine import Pin
 from machine import ExtInt
+import utime
 import constants
+import encoder
+
 class BtnDevice(Abstract):
 
     def __init__(self, tp=None):
@@ -20,13 +23,18 @@ class BtnDevice(Abstract):
         self.GPIO41_status = 0
         self.powerKey_status = 0
         self.Coder_timer = osTimer()
-        #self.Coder_data_str_1 = ""
+        self.Coder_timer_count = 0
+        self.Coder_data_str_1 = ""
         self.Coder_data_str_2 = ""
 
         self.Coder_IO_tmp = 0
         self.Coder_data_tmp = []
         self.Coder_data1 = []
-
+        self.start_timer_a = 0
+        self.start_timer_b = 0
+        self.start_timer_flag = 0
+        self.tmp_a = 1
+        self.tmp_b = 1
     def post_processor_after_instantiation(self):
         # self.keypad.init()
         # self.keypad.set_callback(self.key_callback)
@@ -37,6 +45,8 @@ class BtnDevice(Abstract):
         self.extint = ExtInt(ExtInt.GPIO41, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.pwk_extint_cb)
         self.extint.enable()
 
+        # self.coder = encoder(Pin.GPIO22,Pin.GPIO21)
+        # self.coder.set_callback(self.Coder_cb)
         self.Coder_A = ExtInt(ExtInt.GPIO22, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, self.Coder_cb)
         self.Coder_A.enable()
 
@@ -53,30 +63,54 @@ class BtnDevice(Abstract):
         
         
     def Coder_cb(self,args):
-        if self.Coder_data_str_2 == "":
+        #print("Coder_cb {}".format(args))
+        self.Coder_timer_count = 0
+        if self.start_timer_flag == 0:
             #self.Coder_timer.stop()
-            self.Coder_timer.start(1000, 1, self.Coder_timer_cb)
+            #self.Coder_data_str_2 = "11"
+            self.start_timer_flag = 1
+            self.Coder_timer_count = 0
+            self.Coder_timer.start(100, 1, self.Coder_timer_cb)
         rest_flag = 0
-        # data_tmp = ""
-        # if args[0] == 21:
-        #     data_tmp = "B{},".format(args[1])
-        # elif args[0] == 22:
-        #     data_tmp = "A{},".format(args[1])
-        # self.Coder_data_str_1+=data_tmp
+        data_tmp = ""
+        if args[0] == 21:
+            # if self.Coder_B.read_level() == 1:
+            #     self.start_timer_b = utime.ticks_us()
+            # else :
+            diff = utime.ticks_diff(utime.ticks_us(), self.start_timer_b)
+            self.start_timer_b = utime.ticks_us() 
+            if diff > 8000 :#and diff <200000:
+                data_tmp = "B:{} {} {}\n".format(args[1],diff//1000,self.Coder_B.read_level())
+            else :
+                return 
+        elif args[0] == 22:
+            #if self.Coder_A.read_level() == 1:
+            
+            diff = utime.ticks_diff(utime.ticks_us(), self.start_timer_a)
+            self.start_timer_a = utime.ticks_us() 
+            if diff > 8000 :#and diff <200000:
+                data_tmp = "A:{} {} {}\n".format(args[1],diff//1000,self.Coder_A.read_level())
+            else :
+                return 
+        #self.Coder_data_str_1+=data_tmp
         if self.Coder_IO_tmp != 0 :
-            if self.Coder_IO_tmp != args[0]:
+            if self.Coder_IO_tmp != args[0] :#上一个中断io和当前中断io不一样
                 
                 if self.Coder_data1 == []:
                     self.Coder_data1 = self.Coder_data_tmp
                     if self.Coder_data1[0] == 22 and self.Coder_data1[1] == 1:
-                        #self.Coder_data_str_1 += "-左滑"
+                        #self.Coder_data_str_1 += "-上滑\n"
                         self.Coder_data_str_2+="上滑 "
-                        EventMesh.publish("done_UP")
+                        flag = EventMesh.publish("get_lcd_state")
+                        if flag == 1:
+                            EventMesh.publish("done_UP")
                         #rest_flag = 1
                     elif self.Coder_data1[0] == 21 and self.Coder_data1[1] == 1 :
-                        #self.Coder_data_str_1 += "-右滑"
+                        #self.Coder_data_str_1 += "-下滑\n"
                         self.Coder_data_str_2+="下滑 "
-                        EventMesh.publish("done_DOWN")
+                        flag = EventMesh.publish("get_lcd_state")
+                        if flag == 1:
+                            EventMesh.publish("done_DOWN")
                     else:
                         rest_flag = 1
                 elif args[0] != self.Coder_data1[0] and args[1] == 0:#分段
@@ -85,24 +119,51 @@ class BtnDevice(Abstract):
                     #self.Coder_data_str_1+="分段"
                     rest_flag = 1
                     
-        if rest_flag == 1 :
+        if rest_flag == 1 :#判断完有效清数据
             self.Coder_data1 = []    
             self.Coder_IO_tmp = 0
         else :
+            
             self.Coder_IO_tmp = args[0]
             self.Coder_data_tmp =args
        
 
     def Coder_timer_cb(self, *args):
-        #print("Coder1:{}".format(self.Coder_data_str_1))
-        print("Coder2:{}".format(self.Coder_data_str_2))
-
-        #self.Coder_data_str_1 = ""
-        self.Coder_data_str_2 = ""
-        self.Coder_data1 = []    
-        self.Coder_IO_tmp = 0
-        self.Coder_timer.stop()
+        # tmp = self.Coder_A.read_level()
+        # data_tmp = ""
+        # if self.tmp_a != tmp :
+        #     if self.start_timer_a != 0:
+        #         data_tmp = "A{} {},".format(self.tmp_a,self.start_timer_a*6)
+        #     self.start_timer_a = 0
+        # else:
+        #     self.start_timer_a += 1
+        # self.tmp_a = tmp
+
+        # tmp = self.Coder_B.read_level()
+        # if self.tmp_b != tmp :
+        #     if self.start_timer_b != 0:
+        #         data_tmp = "B{} {},".format(self.tmp_b,self.start_timer_b*6)
+        #     self.start_timer_b = 0
+        # else:
+        #     self.start_timer_b += 1
+        # self.tmp_b = tmp
+        # self.Coder_data_str_1+=data_tmp
 
+        self.Coder_timer_count += 1
+        if self.Coder_timer_count > 4:
+            #print("Coder1:\n{}".format(self.Coder_data_str_1))
+            print("Coder2:\n{}".format(self.Coder_data_str_2))
+            self.Coder_timer_count = 0
+            self.Coder_data_str_1 = ""
+            self.Coder_data_str_2 = ""
+            self.Coder_data1 = []    
+            self.Coder_IO_tmp = 0
+            self.start_timer_b = 0
+            self.start_timer_a = 0
+            self.tmp_a = 1
+            self.tmp_b = 1
+            self.Coder_timer.stop()
+            self.start_timer_flag=0
     def pwk_extint_cb(self,args):
         #print('### interrupt  {} '.format(args)) # args[0]:gpio号 args[1]:上升沿或下降沿
         
index 1fdd2df..68ba3ff 100644 (file)
@@ -1,60 +1,2 @@
-import sms
-import atcmd
-import net
-import machine
-import usys
-resp=bytearray(50)
-# atcmd.sendSync('AT+log=52,1\r\n',resp,'',200)
-# print("AT+log=52,1:{}".format(resp))
-from common import Abstract
-class App(object):
-    def __init__(self):
-        self.managers = []
-
-    def append_manager(self, manager):
-        try:
-            if isinstance(manager, Abstract):
-                manager.post_processor_after_instantiation()
-                self.managers.append(manager)
-        except Exception as e:
-                    usys.print_exception(e)
-        return self
-
-    def start(self):
-        try:
-            for manager in self.managers:
-                manager.post_processor_before_initialization()
-                manager.initialization()
-                manager.post_processor_after_initialization()
-        except Exception as e:
-                    usys.print_exception(e)
-
-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__':
-    
-    from ui_main_menu import MainMenuScreen
-    # from ui_WatchFaceScreen import WatchFaceScreen
-    
-    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()) 
-    
-   
-
+import main_init 
+main_init.main_init()
\ No newline at end of file
index 0eea018..b9b089e 100644 (file)
@@ -2163,10 +2163,10 @@ class LocationManager(Abstract):
                         rmc_data = quecgnss.get_rmc()
                         gga_data = quecgnss.get_gga()
                         vtg_data = quecgnss.get_vtg()
-                        print("gsv:{}".format(quecgnss.get_gsv()))
-                        print("gga:{}".format(quecgnss.get_gga()))
-                        print("rmc:{}".format(quecgnss.get_rmc()))
-                        print("vtg:{}".format(quecgnss.get_vtg())) 
+                        # print("gsv:{}".format(quecgnss.get_gsv()))
+                        # print("gga:{}".format(quecgnss.get_gga()))
+                        # print("rmc:{}".format(quecgnss.get_rmc()))
+                        # print("vtg:{}".format(quecgnss.get_vtg())) 
                         for i in range(len(gsv_data)) :
                             
                             if i % 2 == 0:
index b196f05..7c9271d 100644 (file)
@@ -7233,6 +7233,8 @@ class UI(object):
         self.system_sleep_timeout_rest()
 
     def ui_press(self, event, key):
+        EventMesh.publish("publish_message_event_ui",{"func":self.ui_press_do,"data":event}) 
+    def ui_press_do(self, event):    
         screen_NAME = EventMesh.publish("get_screen_NAME")
         if screen_NAME == "system_init":
             return
@@ -7256,7 +7258,10 @@ class UI(object):
             self.screen.done_UP()
         # if event == "done_press":
         #     self.system_sleep_timeout_rest()
+
     def btn_press(self, event, key):
+        EventMesh.publish("publish_message_event_ui",{"func":self.btn_press_do,"data":event}) 
+    def btn_press_do(self, event):
         screen_NAME = EventMesh.publish("get_screen_NAME")
         if screen_NAME == "system_init":
             return
@@ -7264,8 +7269,6 @@ class UI(object):
         #主表盘按电源键,息屏
         
         #息屏状态按按钮都亮屏
-        
-        
         if self.main_flag != 1 and self.sleep_flag == 0:
             if event == "btn8_long_press":
                 if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1:#有卡时触发sos报警 无卡时自动关机
index fb0130a..6dbc5fb 100644 (file)
@@ -188,14 +188,15 @@ watchface1_SPO2_span.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFA
 class WatchFace1():
     NAME = "Watchface1"
     # # #表盘1
-    def __init__(self,main_menu): 
+    def __init__(self): 
         print("Watchface1:__init__")
         self.meta = Watchface1
+    def set_parent(self,main_menu):
         Watchface1.set_parent(main_menu)#设置父控件
         
-    def initialization(self,main_menu):   
+    def initialization(self):   
         print("Watchface1:initialization") 
-        
+        #Watchface1.set_parent(main_menu)#设置父控件
         #获取信号
         signal = EventMesh.publish("screen_get_sig")
         if signal:
@@ -449,14 +450,15 @@ watchface2_step_txt.add_style(style_font_youyuan_28, lv.PART.MAIN|lv.STATE.DEFAU
 class WatchFace2():
     NAME = "Watchface2"
     # # #表盘2
-    def __init__(self,main_menu): 
+    def __init__(self): 
         print("Watchface2:__init__")
         self.meta = Watchface2
-        Watchface2.set_parent(main_menu)#设置父控件 
-
-    def initialization(self,main_menu):  
+    def set_parent(self,main_menu):
+        Watchface1.set_parent(main_menu)#设置父控件
+        
+    def initialization(self):  
         print("Watchface2:initialization")
-         
+        #Watchface2.set_parent(main_menu)#设置父控件  
         #获取信号
         signal = EventMesh.publish("screen_get_sig")
         if signal:
@@ -593,41 +595,54 @@ class WatchFace2():
 class WatchFace():
     #NAME = "Watchface"
 
-    def __init__(self):
+    def __init__(self,main_menu):
         #表盘
         self.meta = None
         self.watchface_style_num = "Watchface1"
         self.watchface_list = []
+        self.watchface_style = None
         self.timer_update = osTimer()
         EventMesh.subscribe("set_change_face", self.change_face)
         self.PWM_backlight  = None
         read_data = EventMesh.publish("get_storage_config","watchface")
         if read_data != None:
             self.watchface_style_num = read_data
-
-
-
-    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)
+            self.watchface_list.append( WatchFace1())
+            self.watchface_list.append( WatchFace2())
+            self.set_parent( main_menu)
+
         for wat in self.watchface_list:
             if wat.NAME == self.watchface_style_num :
                 self.watchface_style = wat
             wat.meta.add_flag(lv.obj.FLAG.HIDDEN)    #隐藏
-        self.watchface_style.initialization(main_menu)
+        self.watchface_style.initialization()
         self.meta = self.watchface_style.meta
         self.watchface_style.meta.clear_flag(lv.obj.FLAG.HIDDEN)#显示
+
+    def initialization(self):
+        
+        print("watchface INIT !!!!!!!!:",self.watchface_style_num)
+        
         self.timer_update.start(10000, 1, self.timerout_update)
 
+    def set_parent(self,main_menu):
+        Watchface1.set_parent(main_menu)#设置父控件
+        Watchface2.set_parent(main_menu)#设置父控件
+
     def timerout_update(self, *args, **kwargs):
         self.watchface_style.timerout_update()
 
     def change_face(self, event=None, msg=None):
         print("change_face :",msg)
         self.watchface_style_num = str(msg)
-
+        for wat in self.watchface_list:
+            if wat.NAME == self.watchface_style_num :
+                self.watchface_style = wat
+            wat.meta.add_flag(lv.obj.FLAG.HIDDEN)    #隐藏
+        self.watchface_style.initialization()
+        self.meta = self.watchface_style.meta
+        self.watchface_style.meta.clear_flag(lv.obj.FLAG.HIDDEN)#显示
         EventMesh.publish("load_screen", {"screen": "main_menu"})
         
     
index 4cb5244..d570acc 100644 (file)
@@ -9,7 +9,7 @@ import osTimer
 import constants
 from misc import Power
 import pm
-from ui import Screen
+from ui import Screen,style_screen
 from ui_WatchFaceScreen import WatchFace
 from lcd import LCD_SIZE_W,LCD_SIZE_H
 MAIN_ICON_SZIE = 120 #菜单界面图片的大小
@@ -50,45 +50,7 @@ style_btn.set_shadow_opa(0)
 style_btn.set_border_width(0)
 
 
-# MainMenu = lv.obj()
-# class MainMenuScreen(Screen):
-#     NAME = "main_menu"
-
-#     def __init__(self):
-#         super().__init__()
-#         #主菜单
-#         self.meta = MainMenu
-#         self.main_menu_style_num = "MainMenu2"
-
-#     def initialization(self):
-#         print("main_menu INIT !!!!!!!!")
-#         EventMesh.publish("load_screen", {"screen": self.main_menu_style_num})
-
-
-#     def post_processor_after_instantiation(self):
-#         EventMesh.subscribe("change_style", self.change_style)
-
-        
-#     def change_style(self, event=None, msg=None): #换风格
-#         self.main_menu_style_num = msg
-#         EventMesh.publish("load_screen", {"screen": self.main_menu_style_num})
-
-#     def Close(self):
-#         return
-
-
-#     def done_return(self):
-#         EventMesh.publish("load_screen", {"screen": "Watchface"})
-       
-#     def btn1_release(self):
-#         EventMesh.publish("load_screen", {"screen": "Watchface"})
-        
-#     def btn8_press(self):
-#         EventMesh.publish("load_screen", {"screen": "Watchface"})
-
-
-
-    
+MainMenu = lv.obj() 
 
 style_font_youyuan_font_60 = lv.style_t()
 style_font_youyuan_font_60.init()
@@ -96,7 +58,11 @@ style_font_youyuan_font_60.set_text_color(lv.color_make(0xFF, 0xFF, 0xFF))
 style_font_youyuan_font_60.set_text_font(lv.font_60_main_menu)
 MainMenu2x = 0
 MainMenu2_num = 0
-MainMenu2 = lv.obj()
+MainMenu2 = lv.obj(MainMenu)
+MainMenu2.set_size(LCD_SIZE_W,LCD_SIZE_H)
+#MainMenu1.set_pos(0,0)
+MainMenu2.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+MainMenu2.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
 print("MainMenu2")
 MainMenu2_til = lv.tileview(MainMenu2)
 MainMenu2_til.set_scrollbar_mode(0)
@@ -111,6 +77,7 @@ label_text = lv.label(MainMenu2_Watchface)
 label_text.set_pos(0, LCD_SIZE_W)
 label_text.set_size(0, 0)
 label_text.set_text("0")
+
 MainMenu2_num+=1
 # #支付宝
 # MainMenu2_alipay = MainMenu2_til.add_tile(MainMenu2x, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
@@ -325,21 +292,132 @@ MainMenu2x+=1
 
 
 
+################################################################################################################
+MainMenu1x = 0
+MainMenu1_num = 0
+MainMenu1 = lv.obj(MainMenu)
+MainMenu1.set_size(LCD_SIZE_W,LCD_SIZE_H)
+#MainMenu1.set_pos(0,0)
+MainMenu1.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
+MainMenu1.add_style(style_screen, lv.PART.MAIN|lv.STATE.DEFAULT)
+print("MainMenu1")
+MainMenu1_til = lv.tileview(MainMenu1)
+MainMenu1_til.set_scrollbar_mode(0)
+MainMenu1_til.set_size(240,284)
+MainMenu1_til.add_style(style_MainMenu_screen_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+#MainMenu1_til.add_flag(lv.obj.FLAG.SCROLL_ELASTIC)
+#LV_OBJ_FLAG_SCROLL_MOMENTUM
+#表盘
+MainMenu1_Watchface = MainMenu1_til.add_tile(0, 1,  lv.DIR.LEFT | lv.DIR.RIGHT)
+
+label_text = lv.label(MainMenu1_Watchface)
+label_text.set_pos(0, LCD_SIZE_W)
+label_text.set_size(0, 0)
+label_text.set_text("0")
+
+
+
+MainMenu1_num+=1
+
+#拨号盘
+MainMenu1_phone = MainMenu1_til.add_tile(MainMenu1x, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+label_text = lv.label(MainMenu1_phone)
+label_text.set_pos(0, LCD_SIZE_H)
+label_text.set_size(0, 0)
+label_text.set_text("{}".format(MainMenu1_num))
+MainMenu1_img_phone = lv.img(MainMenu1_phone)
+MainMenu1_img_phone.set_size(MAIN_ICON_SZIE,MAIN_ICON_SZIE)
+MainMenu1_img_phone.set_pos(MAIN_ICON_X,MAIN_ICON_Y)
+MainMenu1_img_phone.set_src("U:/static/IMAGE_ONE_PAGE_CALL.png")
+MainMenu1_img_phone.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_phone.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+MainMenu1_img_phone_text = lv.label(MainMenu1_phone)
+MainMenu1_img_phone_text.set_pos(int(0),int(MAIN_LABEL_Y))
+MainMenu1_img_phone_text.set_size(LCD_SIZE_W,LCD_SIZE_H-MAIN_LABEL_Y)
+MainMenu1_img_phone_text.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_phone_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_phone_text.set_text("拨号盘人")
+MainMenu1_img_phone_text.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_num+=1
+MainMenu1x+=1
+
+#通讯录
+MainMenu1_contacts = MainMenu1_til.add_tile(MainMenu1x, 0, lv.DIR.LEFT | lv.DIR.RIGHT)
+label_text = lv.label(MainMenu1_contacts)
+label_text.set_pos(0, LCD_SIZE_H)
+label_text.set_size(0, 0)
+label_text.set_text("{}".format(MainMenu1_num))
+MainMenu1_img_contacts = lv.img(MainMenu1_contacts)
+MainMenu1_img_contacts.set_size(MAIN_ICON_SZIE,MAIN_ICON_SZIE)
+MainMenu1_img_contacts.set_pos(MAIN_ICON_X,MAIN_ICON_Y)
+MainMenu1_img_contacts.set_src("U:/static/IMAGE_ONE_PAGE_CONTACTS.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)
+
+MainMenu1_img_contacts_txt = lv.label(MainMenu1_contacts)
+MainMenu1_img_contacts_txt.set_pos(int(0),int(MAIN_LABEL_Y))
+MainMenu1_img_contacts_txt.set_size(LCD_SIZE_W,LCD_SIZE_H-MAIN_LABEL_Y)
+MainMenu1_img_contacts_txt.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_contacts_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_contacts_txt.set_text("联系人拨")
+MainMenu1_img_contacts_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_num+=1
+MainMenu1x+=1
 
+#短信
+MainMenu1_SMS = MainMenu1_til.add_tile(MainMenu1x, 0,  lv.DIR.LEFT | lv.DIR.RIGHT)
+label_text = lv.label(MainMenu1_SMS)
+label_text.set_pos(0, LCD_SIZE_H)
+label_text.set_size(0, 0)
+label_text.set_text("{}".format(MainMenu1_num))
+MainMenu1_img_sms = lv.img(MainMenu1_SMS)
+MainMenu1_img_sms.set_size(MAIN_ICON_SZIE,MAIN_ICON_SZIE)
+MainMenu1_img_sms.set_pos(MAIN_ICON_X,MAIN_ICON_Y)
+MainMenu1_img_sms.set_src("U:/static/IMAGE_ONE_PAGE_SMS.png")
+MainMenu1_img_sms.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_sms.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT)
+
+MainMenu1_img_sms_txt = lv.label(MainMenu1_SMS)
+MainMenu1_img_sms_txt.set_pos(int(0),int(MAIN_LABEL_Y))
+MainMenu1_img_sms_txt.set_size(LCD_SIZE_W,LCD_SIZE_H-MAIN_LABEL_Y)
+MainMenu1_img_sms_txt.add_flag(lv.obj.FLAG.CLICKABLE)
+MainMenu1_img_sms_txt.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
+MainMenu1_img_sms_txt.set_text("短信")
+MainMenu1_img_sms_txt.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT)
+MainMenu1_num+=1
+MainMenu1x+=1
 
 
 #主菜单风格2,单页
 class MainMenuScreen(Screen):
     NAME = "main_menu"
     def __init__(self): 
-        self.meta = MainMenu2
-        self.watchface = WatchFace()
+        self.meta = MainMenu
+        self.MainMenu_Watchface = None
+        self.MainMenu_til = None
+        self.MainMenu_num = None
+        self.watchface = None
+        self.set_mainmenu(msg = "2")
+        
+        self.watchface = WatchFace(self.MainMenu_Watchface )
+
+        read_data = EventMesh.publish("get_storage_config","MainMenu")
+        if read_data != None:
+            self.set_mainmenu(msg = [read_data,0])
+        EventMesh.subscribe("set_mainmenu", self.set_mainmenu)    
         self.menu_id = "0"
         self.menu_new_id = "255"
         self.menu_old_id = "255"
         self.is_sliding = 0
         self.scroll_begin_event_count = 0
         self.menu_action = 0 # =1左滑  =2右划
+        ###1
+        MainMenu1_til.add_event_cb(lambda e: EventMesh.callback_wrapper(self.scroll_begin_event_cb(e)),lv.EVENT.SCROLL_END,None)
+        #lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_END, NULL);
+        MainMenu1_img_phone.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "Phone")), lv.EVENT.CLICKED, None)
+        MainMenu1_img_phone.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e,  "Phone")), lv.EVENT.PRESSING, None)
+        ##2
         print("MainMenu1:__init__")    
         MainMenu2_til.add_event_cb(lambda e: EventMesh.callback_wrapper(self.scroll_begin_event_cb(e)),lv.EVENT.SCROLL_END,None)
         #lv_obj_add_event_cb(lv_tabview_get_content(tabview), scroll_begin_event, LV_EVENT_SCROLL_END, NULL);
@@ -368,14 +446,55 @@ class MainMenuScreen(Screen):
         #MainMenu2_img_alipay.add_event_cb(lambda e: img_cb(e, "Watchface_set"), lv.EVENT.CLICKED, None)
         
     def initialization(self):
-        self.watchface.initialization(MainMenu2_Watchface)
+
+        self.watchface.initialization()
         self.is_sliding = 0
         if self.menu_id =="0":
-            MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF) 
+            self.MainMenu_til.set_tile_id(0,1,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)    
+        #     self.MainMenu_til.set_tile_id(self.meta_info[0],self.meta_info[1],lv.ANIM.OFF)    
         pass#
-    
+
+    #切换菜单风格
+    def set_mainmenu(self, event=None, msg=None):
+        if self.watchface != None:
+            self.watchface.Close()
+        MainMenu2.add_flag(lv.obj.FLAG.HIDDEN)#隐藏菜单
+        MainMenu1.add_flag(lv.obj.FLAG.HIDDEN)
+        if msg[0] == "2":
+            MainMenu2.clear_flag(lv.obj.FLAG.HIDDEN)#显示菜单
+            self.MainMenu_Watchface = MainMenu2_Watchface
+            self.MainMenu_til = MainMenu2_til
+            self.MainMenu_num = MainMenu2_num
+            # self.watchface = MainMenu2_watchface
+            print("set_mainmenu2")
+        elif msg[0] == "1":
+            MainMenu1.clear_flag(lv.obj.FLAG.HIDDEN)
+            self.MainMenu_Watchface = MainMenu1_Watchface
+            self.MainMenu_til = MainMenu1_til
+            self.MainMenu_num = MainMenu1_num
+            #self.watchface = MainMenu1_watchface
+            print("set_mainmenu1")
+        else :
+            MainMenu1.clear_flag(lv.obj.FLAG.HIDDEN)
+            self.MainMenu_Watchface = MainMenu1_Watchface
+            self.MainMenu_til = MainMenu1_til
+            self.MainMenu_num = MainMenu1_num
+            #self.watchface = MainMenu1_watchface
+            msg[0] = "1"
+
+        EventMesh.publish("set_storage_config",["MainMenu",msg[0]])
+        if self.watchface != None:
+            self.watchface.set_parent(self.MainMenu_Watchface)#切换父对象,比较危险
+            self.watchface.initialization() 
+        self.menu_id = "0"
+        if len (msg ) >= 2:
+            if msg[1] != 0 :
+                #EventMesh.publish("load_screen", {"screen": "setting"})
+                EventMesh.publish("load_screen", {"screen": "main_menu"})
+        #self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF) 
+        #self.initialization()
+        self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF) 
     def scroll_begin_event_cb(self, e):
         pass
     #     EventMesh.publish("publish_message_event_ui",{"func":self.scroll_begin_event,"data":0})
@@ -384,18 +503,18 @@ class MainMenuScreen(Screen):
         # self.scroll_begin_event_count+=1
         
         # if self.scroll_begin_event_count == 1:
-        #     self.menu_new_id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+        #     self.menu_new_id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         #     #print("scroll_begin_event scroll_begin_event {} old_id {} new_id{}".format(self.scroll_begin_event_count,self.menu_old_id,self.menu_new_id))
         # elif self.scroll_begin_event_count == 2:
-        #     self.menu_old_id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+        #     self.menu_old_id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         #     print("scroll_begin_event menu_action {} old_id {} new_id {}".format(self.menu_action,self.menu_old_id,self.menu_new_id))
         #     self.scroll_begin_event_count = 0
         #     if self.menu_old_id == self.menu_new_id and self.menu_action == 1:
-        #         MainMenu2_til.set_tile_id(int(self.menu_old_id)-2,0,lv.ANIM.ON)
+        #         self.MainMenu_til.set_tile_id(int(self.menu_old_id)-2,0,lv.ANIM.ON)
         #         print("scroll_begin_event menu_action == 1")
         #     elif self.menu_old_id == self.menu_new_id and self.menu_action == 2:
         #         print("scroll_begin_event menu_action == 2")
-        #         MainMenu2_til.set_tile_id(int(self.menu_old_id),0,lv.ANIM.ON)
+        #         self.MainMenu_til.set_tile_id(int(self.menu_old_id),0,lv.ANIM.ON)
         #     self.menu_action = 0
         # else :
         #     self.scroll_begin_event_count = 0
@@ -406,7 +525,7 @@ class MainMenuScreen(Screen):
         # if code == lv.EVENT.SCROLL_END:
         #     pass
     def watch_top_show(self, event, msg): #
-        MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF)  
+        self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF)  
         
     def img_cb(self,e,msg):
         code = e.get_code()
@@ -429,32 +548,32 @@ class MainMenuScreen(Screen):
         self.watchface.timer_update.stop()
 
     def done_return(self):
-        MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF)
+        self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF)
        
     def btn1_release(self):
         flag = EventMesh.publish("get_lcd_state")
         if flag == 0:
             EventMesh.publish(constants.EVENT.SYSTEM_UP)
         else:
-            if MainMenu2_til.get_tile_act() != None:
-                id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+            if self.MainMenu_til.get_tile_act() != None:
+                id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
                 if id != "0":
-                    MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF)
+                    self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF)
                 else:
                     EventMesh.publish("load_screen", {"screen": "alipay_open"})
     
     def return_alipay(self, event, msg):
-        MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
+        self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
 
     def return_setiing(self, event, msg):
-        MainMenu2_til.set_tile_id(7,0,lv.ANIM.OFF)
+        self.MainMenu_til.set_tile_id(7,0,lv.ANIM.OFF)
 
                 
         
     def btn8_press(self):
         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 self.MainMenu_til.get_tile_act() != None:
+            id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
             if id == "0":
                 if flag == 1:
                     EventMesh.publish(constants.EVENT.SYSTEM_SLEEP)
@@ -462,71 +581,71 @@ class MainMenuScreen(Screen):
                     EventMesh.publish(constants.EVENT.SYSTEM_UP)
             else:
                 if flag == 1:
-                    MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF)
+                    self.MainMenu_til.set_tile_id(0,1,lv.ANIM.OFF)
                 else:
                     EventMesh.publish(constants.EVENT.SYSTEM_UP)
         else:
             if flag == 1:
-                MainMenu2_til.set_tile_id(0,1,lv.ANIM.OFF)
+                self.MainMenu_til.set_tile_id(0,1,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()
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         if id == "0":
             EventMesh.publish("load_screen", {"screen": "call_log"})
         self.menu_id = id
 
     def done_top_to_bottom(self):
-        id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         if id == "0":
             EventMesh.publish("load_screen", {"screen": "popup"})
         self.menu_id = id
     def done_left_to_right(self):
-        id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         print("done_left_to_right:ID{} menu_id{}".format(id,self.menu_id))
         if id == "0":
-            MainMenu2_til.set_tile_id(MainMenu2_num-2,0,lv.ANIM.OFF)
+            self.MainMenu_til.set_tile_id(self.MainMenu_num-2,0,lv.ANIM.OFF)
         elif self.menu_id != '2' and id == '1':
-            MainMenu2_til.set_tile_id(MainMenu2_num-2,0,lv.ANIM.OFF) 
+            self.MainMenu_til.set_tile_id(self.MainMenu_num-2,0,lv.ANIM.OFF) 
         elif self.menu_id ==  id :
             self.menu_action = 1
         self.menu_id = id
     def done_right_to_left(self):
-        id = MainMenu2_til.get_tile_act().get_child(0).get_text()
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
         print("done_right_to_left:ID{} menu_id{}".format(id,self.menu_id))
         if id == "0":
-            MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
-        elif (self.menu_id != str(MainMenu2_num-2) ) and id == str(MainMenu2_num-1) :
-            MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
+            self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
+        elif (self.menu_id != str(self.MainMenu_num-2) ) and id == str(self.MainMenu_num-1) :
+            self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
         else :
             self.menu_action = 2
         self.menu_id = id   
     def done_DOWN(self):#下滑
-        id = MainMenu2_til.get_tile_act().get_child(0).get_text()
-        print("done_right_to_left: {} {} {}".format(id,self.menu_id,MainMenu2_num))
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
+        print("done_right_to_left: {} {} {}".format(id,self.menu_id,self.MainMenu_num))
         if id == "0":
-            MainMenu2_til.set_tile_id(MainMenu2_num-2,0,lv.ANIM.OFF)
+            self.MainMenu_til.set_tile_id(self.MainMenu_num-2,0,lv.ANIM.OFF)
         elif self.menu_id != '2' and id == '1':
-            MainMenu2_til.set_tile_id(MainMenu2_num-2,0,lv.ANIM.OFF) 
+            self.MainMenu_til.set_tile_id(self.MainMenu_num-2,0,lv.ANIM.OFF) 
         else :
             if id == "1":
-                MainMenu2_til.set_tile_id(MainMenu2_num-2,0,lv.ANIM.OFF)
+                self.MainMenu_til.set_tile_id(self.MainMenu_num-2,0,lv.ANIM.OFF)
             else :
-                MainMenu2_til.set_tile_id(int(id)-2,0,lv.ANIM.ON)
+                self.MainMenu_til.set_tile_id(int(id)-2,0,lv.ANIM.OFF)
         self.menu_id = id
     def done_UP(self):#上滑
-        id = MainMenu2_til.get_tile_act().get_child(0).get_text()
-        print("done_right_to_left: {} {} {}".format(id,self.menu_id,MainMenu2_num))
+        id = self.MainMenu_til.get_tile_act().get_child(0).get_text()
+        print("done_right_to_left: {} {} {}".format(id,self.menu_id,self.MainMenu_num))
         if id == "0":
-            MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
-        elif (self.menu_id != str(MainMenu2_num-2) ) and id == str(MainMenu2_num-1) :
-            MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
+            self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
+        elif (self.menu_id != str(self.MainMenu_num-2) ) and id == str(self.MainMenu_num-1) :
+            self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
         else :
-            if int(id) == MainMenu2_num-1 :
-                MainMenu2_til.set_tile_id(0,0,lv.ANIM.OFF)
+            if int(id) == self.MainMenu_num-1 :
+                self.MainMenu_til.set_tile_id(0,0,lv.ANIM.OFF)
             else :
-                MainMenu2_til.set_tile_id(int(id),0,lv.ANIM.ON)
+                self.MainMenu_til.set_tile_id(int(id),0,lv.ANIM.OFF)
 
         self.menu_id = id 
     def Close(self):
index 34669aa..fd72981 100644 (file)
@@ -1098,15 +1098,16 @@ class PowerOnScreen(Screen):
     def fun(self,*argc):
         EventMesh.publish("system_sleep_rest")#防止黑屏
         if self.count == 0:
-            self.aud.play(1, 1, 'E:/static/R_POWER_1.mp3')  #播放来电铃声
+            temp = Power.getVbatt()
+            if temp > 3400:#低电播放音频会导致一直复位
+                self.aud.play(1, 1, 'E:/static/R_POWER_1.mp3')  #播放来电铃声
         else:
-            play_state = EventMesh.publish("get_audio_state")#音频播放状态
-            if play_state != None:
-                if self.count >= 9:#在上一个界面在播放音频时切换界面则关闭 以免一直播放
-                    self.count = 0
-                    self.timer.stop()
-                    EventMesh.publish("load_screen", {"screen": "main_menu"})
-                    return
+            
+            if self.count >= 9:#在上一个界面在播放音频时切换界面则关闭 以免一直播放
+                self.count = 0
+                self.timer.stop()
+                EventMesh.publish("load_screen", {"screen": "main_menu"})
+                return
         self.count+=1
 
     def Close(self):
index d8f4b3e..5db3e8b 100644 (file)
@@ -54,7 +54,7 @@
 #define MICROPY_QPY_MODULE_UCRYPTOLIB       (1)
 #define MICROPY_QPY_MODULE_ALIPAY           (0)
 #define MICROPY_QPY_MODULE_VFS_THREADSAFE   (1)
-
+#define MICROPY_QPY_MODULE_GPIO_ENCODER     (1)
 #if CONFIG_MBEDTLS
     #define MICROPY_QPY_MODULE_USSL         (0)
     #define MICROPY_QPY_SSL_MBEDTLS         (1)