Просмотр исходного кода

change: mlx90640的内存改成动态malloc

Wendal Chen 3 лет назад
Родитель
Сommit
61966b0e5b
1 измененных файлов с 68 добавлено и 26 удалено
  1. 68 26
      components/mlx90640-library/luat_lib_mlx90640.c

+ 68 - 26
components/mlx90640-library/luat_lib_mlx90640.c

@@ -37,9 +37,18 @@ static luat_lcd_conf_t* lcd_conf;
 #define RAW_DATA_W 32
 #define RAW_DATA_H 24
 #define RAW_DATA_SIZE RAW_DATA_W*RAW_DATA_H
-static uint16_t eeMLX90640[832];
-static float mlx90640To[RAW_DATA_SIZE];
-static uint16_t frame[834];
+typedef struct mlx_ctx
+{
+    uint16_t eeMLX90640[832];
+    float mlx90640To[RAW_DATA_SIZE];
+    uint16_t frame[834];
+}mlx_ctx_t;
+
+static mlx_ctx_t* ctx = NULL;
+
+// static uint16_t eeMLX90640[832];
+// static float mlx90640To[RAW_DATA_SIZE];
+// static uint16_t frame[834];
 static float emissivity=0.95;
 static int status;
 static float vdd;
@@ -114,34 +123,43 @@ static int l_mlx90640_init(lua_State *L){
     mlx90640_i2c_speed = luaL_optinteger(L, 2 , 1);
     mlx90640_refresh_rate = luaL_optinteger(L, 3 , 3);
     lcd_conf = luat_lcd_get_default();
+
+    if (ctx == NULL) {
+        ctx = luat_heap_malloc(sizeof(mlx_ctx_t));
+        if (ctx == NULL) {
+            LLOGE("out of memory when malloc mlx_ctx_t");
+            return 0;
+        }
+    }
+
     MLX90640_I2CInit();
     mlx90640 = (paramsMLX90640*)luat_heap_malloc(sizeof(paramsMLX90640));
     MLX90640_SetRefreshRate(MLX90640_ADDR, mlx90640_refresh_rate);
     MLX90640_SetChessMode(MLX90640_ADDR);
-	status = MLX90640_DumpEE(MLX90640_ADDR, eeMLX90640);
+	status = MLX90640_DumpEE(MLX90640_ADDR, ctx->eeMLX90640);
 	if (status != 0){
         LLOGW("load system parameters error with code:%d",status);
         return 0;
     }
-	status = MLX90640_ExtractParameters(eeMLX90640, mlx90640);
+	status = MLX90640_ExtractParameters(ctx->eeMLX90640, mlx90640);
 	if (status != 0) {
         LLOGW("Parameter extraction failed with error code:%d",status);
         return 0;
     }
     //初始化后此处先读帧,去掉初始化后一些错误数据
     for (size_t i = 0; i < 3; i++){
-        int status = MLX90640_GetFrameData(MLX90640_ADDR, frame);
+        int status = MLX90640_GetFrameData(MLX90640_ADDR, ctx->frame);
         if (status < 0){
             LLOGD("GetFrame Error: %d",status);
             return 0;
         }
-        vdd = MLX90640_GetVdd(frame, mlx90640);
-        Ta = MLX90640_GetTa(frame, mlx90640);
-        MLX90640_CalculateTo(frame, mlx90640, emissivity , Ta - TA_SHIFT, mlx90640To);
-        MLX90640_BadPixelsCorrection(mlx90640->brokenPixels, mlx90640To, 1, mlx90640);
-        MLX90640_BadPixelsCorrection(mlx90640->outlierPixels, mlx90640To, 1, mlx90640);
-        lua_pushboolean(L, 1);
+        vdd = MLX90640_GetVdd(ctx->frame, mlx90640);
+        Ta = MLX90640_GetTa(ctx->frame, mlx90640);
+        MLX90640_CalculateTo(ctx->frame, mlx90640, emissivity , Ta - TA_SHIFT, ctx->mlx90640To);
+        MLX90640_BadPixelsCorrection(mlx90640->brokenPixels, ctx->mlx90640To, 1, mlx90640);
+        MLX90640_BadPixelsCorrection(mlx90640->outlierPixels, ctx->mlx90640To, 1, mlx90640);
     }
+    lua_pushboolean(L, 1);
     return 1;
 }
 
@@ -150,16 +168,20 @@ static int l_mlx90640_init(lua_State *L){
 @api mlx90640.feed()
 */
 static int l_mlx90640_feed(lua_State *L) {
-    int status = MLX90640_GetFrameData(MLX90640_ADDR, frame);
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
+    int status = MLX90640_GetFrameData(MLX90640_ADDR, ctx->frame);
     if (status < 0){
         LLOGD("GetFrame Error: %d",status);
         return 0;
     }
-    vdd = MLX90640_GetVdd(frame, mlx90640);
-    Ta = MLX90640_GetTa(frame, mlx90640);
-    MLX90640_CalculateTo(frame, mlx90640, emissivity , Ta - TA_SHIFT, mlx90640To);
-    MLX90640_BadPixelsCorrection(mlx90640->brokenPixels, mlx90640To, 1, mlx90640);
-    MLX90640_BadPixelsCorrection(mlx90640->outlierPixels, mlx90640To, 1, mlx90640);
+    vdd = MLX90640_GetVdd(ctx->frame, mlx90640);
+    Ta = MLX90640_GetTa(ctx->frame, mlx90640);
+    MLX90640_CalculateTo(ctx->frame, mlx90640, emissivity , Ta - TA_SHIFT, ctx->mlx90640To);
+    MLX90640_BadPixelsCorrection(mlx90640->brokenPixels, ctx->mlx90640To, 1, mlx90640);
+    MLX90640_BadPixelsCorrection(mlx90640->outlierPixels, ctx->mlx90640To, 1, mlx90640);
     lua_pushboolean(L, 1);
     return 0;
 }
@@ -170,10 +192,14 @@ static int l_mlx90640_feed(lua_State *L) {
 @return table 浮点数数据,768个像素对应的温度值
 */
 static int l_mlx90640_raw_data(lua_State *L) {
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
     lua_createtable(L, RAW_DATA_SIZE, 0);
     for (size_t i = 0; i < RAW_DATA_SIZE; i++)
     {
-        lua_pushnumber(L, mlx90640To[i]);
+        lua_pushnumber(L, ctx->mlx90640To[i]);
         lua_seti(L, -2, i + 1);
     }
     return 1;
@@ -186,7 +212,11 @@ static int l_mlx90640_raw_data(lua_State *L) {
 @return number 单点温度值
 */
 static int l_mlx90640_raw_point(lua_State *L) {
-    lua_pushnumber(L, mlx90640To[luaL_checkinteger(L, 1)]);
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
+    lua_pushnumber(L, ctx->mlx90640To[luaL_checkinteger(L, 1)]);
     return 1;
 }
 
@@ -209,10 +239,14 @@ static int l_mlx90640_ta_temp(lua_State *L) {
 static int l_mlx90640_max_temp(lua_State *L) {
     float max_temp = -40;
     uint16_t index = 0;
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
     for (size_t i = 0; i < RAW_DATA_SIZE; i++){
-        if (mlx90640To[i]>max_temp)
+        if (ctx->mlx90640To[i]>max_temp)
         {
-            max_temp = mlx90640To[i];
+            max_temp = ctx->mlx90640To[i];
             index = i;
         }
     }
@@ -230,10 +264,14 @@ static int l_mlx90640_max_temp(lua_State *L) {
 static int l_mlx90640_min_temp(lua_State *L) {
     float min_temp = 300;
     uint16_t index = 0;
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
     for (size_t i = 0; i < RAW_DATA_SIZE; i++){
-        if (mlx90640To[i]<min_temp)
+        if (ctx->mlx90640To[i]<min_temp)
         {
-            min_temp = mlx90640To[i];
+            min_temp = ctx->mlx90640To[i];
             index = i;
         }
     }
@@ -250,11 +288,15 @@ static int l_mlx90640_min_temp(lua_State *L) {
 static int l_mlx90640_average_temp(lua_State *L) {
     float temp[RAW_DATA_H] = {0};
     float temp1=0;
+    if (ctx == NULL) {
+        LLOGE("mlx90640 NOT init yet");
+        return 0;
+    }
     for (size_t j = 0; j < RAW_DATA_H; j++)
     {
         for (size_t i = 0; i < RAW_DATA_W; i++)
         {
-            temp1+=mlx90640To[i];
+            temp1 += ctx->mlx90640To[i];
         }
         temp[j]=temp1/RAW_DATA_W;
         temp1 = 0;
@@ -368,7 +410,7 @@ static int l_mlx90640_draw2lcd(lua_State *L) {
 
     uint8_t* index_data = luat_heap_malloc(RAW_DATA_SIZE);
     for (size_t i = 0; i < RAW_DATA_SIZE; i++){
-        float t = mlx90640To[i];
+        float t = ctx->mlx90640To[i];
         if (t<MINTEMP) t=MINTEMP;
         if (t>MAXTEMP) t=MAXTEMP;
         uint8_t colorIndex = (uint8_t)round(map(t, MINTEMP, MAXTEMP, 0, 255));