Browse Source

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

alienwalker 7 months ago
parent
commit
add94ff27e

+ 19 - 6
components/airlink/src/task/luat_airlink_spi_slave_task.c

@@ -115,6 +115,9 @@ static void slave_irq_mode_startup(airlink_link_data_t* link) {
     gpio.pull = LUAT_GPIO_PULLUP;
     gpio.output_level = 1;
     ret = luat_gpio_open(&gpio);
+    if (ret != 0) {
+        LLOGE("IRQ模式开启失败, GPIO %d %d", gpio.pin, ret);
+    }
     // LLOGD("IRQ模式开启, GPIO %d %d", gpio.pin, ret);
     // s_irq_pin = gpio.pin;
     // is_irq_mode = 1;
@@ -124,7 +127,7 @@ static void spi_gpio_setup(void)
 {
     // LLOGD("spi_gpio_setup");
     // LLOGD("g_airlink_spi_conf %p", &g_airlink_spi_conf);
-    int ret = 0;
+    // int ret = 0;
     if (g_airlink_spi_conf.cs_pin == 0)
     {
         // if (g_airlink_spi_conf.spi_id == 0) {
@@ -195,11 +198,11 @@ __USER_FUNC_IN_RAM__ static void start_spi_trans(void) {
     airlink_queue_item_t item = {0};
     // print_tm("准备执行luat_airlink_cmd_recv_simple");
     luat_airlink_cmd_recv_simple(&item);
-    LLOGD("执行完luat_airlink_cmd_recv_simple cmd %p len %d", item.cmd, item.len);
+    // LLOGD("执行完luat_airlink_cmd_recv_simple cmd %p len %d", item.cmd, item.len);
     if (item.len > 0 && item.cmd != NULL) {
         // LLOGD("发送待传输的数据, 塞入SPI的FIFO %d", item.len);
         luat_airlink_data_pack(item.cmd, item.len, s_txbuff);
-        LLOGD("执行完luat_airlink_cmd_recv_simplecmd %p len %d --- ", item.cmd, item.len);
+        // LLOGD("执行完luat_airlink_cmd_recv_simplecmd %p len %d --- ", item.cmd, item.len);
         luat_airlink_cmd_free(item.cmd);
     }
     else {
@@ -242,6 +245,9 @@ __USER_FUNC_IN_RAM__ static void spi_slave_task(void *param)
         // print_tm("执行luat_rtos_event_recv");
 
         ret = luat_rtos_queue_recv(evt_queue, &event, sizeof(luat_event_t), LUAT_WAIT_FOREVER);
+        if (ret) {
+            // nop
+        }
         // luat_rtos_event_recv(spi_task_handle, 0, &event, NULL, LUAT_WAIT_FOREVER);
         // print_tm("执行完luat_rtos_event_recv");
         int cs_level = luat_gpio_get(AIRLINK_SPI_CS_PIN);
@@ -291,13 +297,20 @@ __USER_FUNC_IN_RAM__ static void spi_slave_task(void *param)
 void luat_airlink_start_slave(void)
 {
     LLOGE("luat_airlink_start_slave!!!");
-    if (s_txbuff)
+    if (spi_task_handle != NULL)
     {
         LLOGE("SPI从机任务已经启动过了!!!");
         return;
     }
-    s_txbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
-    s_rxbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
+    
+    if (s_rxbuff == NULL) {
+        // 分配内存
+        s_rxbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
+    }
+    if (s_txbuff == NULL) {
+        // 分配内存给s_rxbuff
+        s_txbuff = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, TEST_BUFF_SIZE);
+    }
     spi_gpio_setup();
 
     luat_rtos_queue_create(&evt_queue, 2 * 1024, sizeof(luat_event_t));

+ 12 - 4
luat/modules/luat_lib_zbuff.c

@@ -13,6 +13,14 @@
 #define LUAT_LOG_TAG "zbuff"
 #include "luat_log.h"
 
+#ifndef LUAT_CONF_ZBUFF_DEFAULT_TYPE
+#ifdef LUAT_USE_PSRAM
+#define LUAT_CONF_ZBUFF_DEFAULT_TYPE LUAT_HEAP_PSRAM
+#else
+#define LUAT_CONF_ZBUFF_DEFAULT_TYPE LUAT_HEAP_SRAM
+#endif
+#endif
+
 //在buff对象后添加数据,返回增加的字节数
 static int add_bytes(luat_zbuff_t *buff, const char *source, size_t len)
 {
@@ -97,7 +105,7 @@ static uint32_t get_framebuffer_point(luat_zbuff_t *buff,uint32_t point)
 @api zbuff.create(length,data,type)
 @int 字节数
 @any 可选参数,number时为填充数据,string时为填充字符串
-@number 可选参数,内存类型,可选:zbuff.HEAP_SRAM(内部sram,默认) zbuff.HEAP_PSRAM(外部psram) zbuff.HEAP_AUTO(自动申请,如存在psram则在psram进行申请,如不存在或失败则在sram进行申请) 注意:此项与硬件支持有关
+@number 可选参数,内存类型默认自动选择
 @return object zbuff对象,如果创建失败会返回nil
 @usage
 -- 创建zbuff
@@ -109,7 +117,7 @@ local buff = zbuff.create(1024, "123321456654") -- 创建,并填充一个已
 -- zbuff.create({width,height,bit},data,type)
 -- table 宽度、高度、色位深度
 @int 可选参数,填充数据
-@number 可选参数,内存类型,可选:zbuff.HEAP_SRAM(内部sram,默认) zbuff.HEAP_PSRAM(外部psram) zbuff.HEAP_AUTO(自动申请,如存在psram则在psram进行申请,如不存在或失败则在sram进行申请) 注意:此项与硬件支持有关
+@number 可选参数,内存类型
 @return object zbuff对象,如果创建失败会返回nil
 @usage
 -- 创建zbuff
@@ -140,9 +148,9 @@ static int l_zbuff_create(lua_State *L)
     if (buff == NULL) return 0;
 
     if (lua_isinteger(L, 3)){
-    	buff->type = luaL_optinteger(L, 3, LUAT_HEAP_SRAM);
+    	buff->type = luaL_optinteger(L, 3, LUAT_CONF_ZBUFF_DEFAULT_TYPE);
     } else {
-        buff->type = LUAT_HEAP_SRAM;
+        buff->type = LUAT_CONF_ZBUFF_DEFAULT_TYPE;
     }
     buff->addr = (uint8_t *)luat_heap_opt_malloc(buff->type,len);
     if (buff->addr == NULL){

+ 8 - 7
module/Air8000/demo/gnss/da221.lua

@@ -37,13 +37,14 @@ local z_msb_reg = 0x07 -- Z轴MSB寄存器地址
 local active_state = 0x0b -- 激活状态寄存器地址
 local active_state_data
 
-
-local function logF(...)
-    if logSwitch then
-        log.info(moduleName, ...)
-    end
-end
-
+--[[
+    获取da221的xyz轴数据
+@api da221.read_xyz()
+@return number x轴数据,number y轴数据,number z轴数据
+@usage
+    local x,y,z =  da221.read_xyz()      --读取x,y,z轴的数据
+        log.info("x", x..'g', "y", y..'g', "z", z..'g')
+]]
 function da221.read_xyz()
     -- da221是LSB在前,MSB在后,每个寄存器都是1字节数据,每次读取都是6个寄存器数据一起获取
     -- 因此直接从X轴LSB寄存器(0x02)开始连续读取6字节数据(X/Y/Z各2字节),避免出现数据撕裂问题

+ 7 - 8
module/Air8000/demo/gnss/da221gnss.lua

@@ -20,7 +20,6 @@ local function mode1_cb(tag)
     tcp.latlngfnc(rmc.lat,rmc.lng)
 end
 local function timer1()
-    log.info("timer1")
     gnss.close(gnss.DEFAULT,{tag="MODE1"})
     sys.timerStop(tid)
 end
@@ -51,19 +50,19 @@ local function gnss_fnc()
         -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
         -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
         -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
+        ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
+        ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
+        ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把agps_autoopen设置成false
+        ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
+        -- agps_autoopen=false 
     }
     gnss.setup(gnssotps)
     --1、静态/微动检测,使用场景:微振动检测、手势识别;
     --2、常规运动监测,使用场景:运动监测、车载设备;
     --3、高动态冲击检测,使用场景:碰撞检测、工业冲击
     da221.open(1)
-    -- gpio.debounce(intPin, 100)
-    -- gpio.setup(intPin, ind)
-    while true do
-       local x,y,z =  da221.read_xyz()      --读取x,y,z轴的数据
-        log.info("x", x..'g', "y", y..'g', "z", z..'g')
-        sys.wait(500)
-    end
+    gpio.debounce(intPin, 100)
+    gpio.setup(intPin, ind)
 
 end
 

+ 9 - 1
module/Air8000/demo/gnss/gnss.lua

@@ -153,6 +153,9 @@ sys.subscribe("GNSS_STATE", function(event)
     if event == "FIXED" then
         gnss.saveloc()
         tid=sys.timerLoopStart(gnss.saveloc,600000)
+        if gnss.opts.rtc==true then
+            sys.publish("NTP_UPDATE")
+        end
     elseif event == "LOSE" or event == "CLOSE" then
         -- log.info("libagps","libagps is close")
         sys.timerStop(tid)
@@ -168,7 +171,12 @@ local function _agps()
     --如果直接关闭gnss会导致gnss芯片的星历没有解析完毕,会影响下一次的定位为冷启动
     --如果对功耗有需求,需要定位快,可以每次都使用agps,不需要这句,直接屏蔽掉即可
     --代价是每次定位都会进行基站定位,
-    -- gnss.open(gnss.TIMER,{tag="libagps",val=20}) 
+    if gnss.opts.agps_autoopen~= false then
+        log.info("libagps","libagps is open")
+        gnss.open(gnss.TIMER,{tag="libagps",val=20}) 
+    else
+
+    end
     -- 判断星历时间和下载星历   
     local now = os.time()
     local agps_time = tonumber(io.readFile("/hxxt_tm") or "0") or 0

+ 5 - 0
module/Air8000/demo/gnss/lowpower.lua

@@ -33,6 +33,11 @@ local function gnss_fnc()
         -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
         -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
         -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
+         ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
+        ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
+        ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把agps_autoopen设置成false
+        ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
+        agps_autoopen=false 
     }
     gnss.setup(gnssotps)
     sys.timerLoopStart(timer1,60000)

+ 2 - 2
module/Air8000/demo/gnss/main.lua

@@ -55,10 +55,10 @@ end
 gnss=require("gnss")    
 
 
--- normal=require("normal")
+normal=require("normal")
 -- lowpower=require("lowpower")
 -- psm=require("psm")
-da221gnss=require("da221gnss")
+-- da221gnss=require("da221gnss")
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 7 - 2
module/Air8000/demo/gnss/normal.lua

@@ -7,7 +7,7 @@
 @usage
 使用Air8000核心板,外接GPS天线,起一个60s定位一次的定时器,模块60s一定位,然后定位成功获取到经纬度发送到服务器上面
 ]]
-gnss=require("gnss")
+-- gnss=require("gnss")
 tcp=require("tcp")
 
 local function mode1_cb(tag)
@@ -30,10 +30,15 @@ local function gnss_fnc()
         -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
         -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
         -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
+        ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
+        ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
+        ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把agps_autoopen设置成false
+        ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
+        -- agps_autoopen=false 
     }
     gnss.setup(gnssotps)
     sys.timerLoopStart(timer1,60000)
-    -- gnss.open(gnss.TIMERORSUC,{tag="MODE1",val=60,cb=mode1_cb})
+    gnss.open(gnss.TIMERORSUC,{tag="MODE1",val=60,cb=mode1_cb})
 end
 
 sys.taskInit(gnss_fnc)

+ 5 - 1
module/Air8000/demo/gnss/psm.lua

@@ -8,7 +8,6 @@
 使用Air8000核心板,外接GPS天线,开启定位,获取到定位发送到服务器上面,然后启动一个60s的定时器唤醒PSM+模式
 模块开启定位,然后定位成功获取到经纬度发送到服务器上面,然后进入PSM+模式,等待唤醒
 ]]
-gnss=require("gnss")
 pm.power(pm.WORK_MODE, 0) 
 local lat,lng
 
@@ -104,6 +103,11 @@ local function gnss_fnc()
         -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
         -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
         -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
+         ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
+        ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
+        ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把agps_autoopen设置成false
+        ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
+        -- agps_autoopen=false 
     }
     gnss.setup(gnssotps)
     gnss.open(gnss.TIMERORSUC,{tag="MODE1",val=60,cb=mode1_cb})

+ 1 - 1
module/Air8000/demo/gnss/tcp.lua

@@ -14,7 +14,7 @@ local uartid = 1 -- 根据实际设备选取不同的uartid
 local uart_rx_buff = zbuff.create(1024)     -- 串口接收到的数据
 local libnet = require "libnet"         -- libnet库,支持tcp、udp协议所用的同步阻塞接口
 local ip = "112.125.89.8"               -- 连接tcp服务器的ip地址
-local port = 42992                 -- 连接tcp服务器的端口
+local port = 42009                 -- 连接tcp服务器的端口
 local connect_state = false             -- 连接状态 true:已连接   false:未连接
 local protocol = false                  -- 通讯协议 true:UDP协议  false:TCP协议
 local ssl = false                       -- 加密传输 true:加密     false:不加密

+ 1 - 1
module/Air8000/project/整机开发板出厂工程/user/airaudio.lua

@@ -24,7 +24,7 @@ local power_time_delay = 600    -- 音频播放完毕时,PA与DAC关闭的时
 local taskName = "task_tts"
 
 local play_string = "降功耗,找合宙"
-local voice_vol = 60        -- 喇叭音量
+local voice_vol = 55        -- 喇叭音量
 local mic_vol = 80          -- 麦克风音量
 
 function audio_setup()