Przeglądaj źródła

add:貌似越界了...

Dozingfiretruck 3 lat temu
rodzic
commit
88cdad309a
1 zmienionych plików z 74 dodań i 8 usunięć
  1. 74 8
      components/mlx90640-library/luat_lib_mlx90640.c

+ 74 - 8
components/mlx90640-library/luat_lib_mlx90640.c

@@ -111,7 +111,6 @@ static int l_mlx90640_init(lua_State *L){
     mlx90640_refresh_rate = luaL_optinteger(L, 3 , 3);
     lcd_conf = luat_lcd_get_default();
     MLX90640_I2CInit();
-    // luat_timer_mdelay(50);
     MLX90640_SetRefreshRate(MLX90640_ADDR, mlx90640_refresh_rate);
     MLX90640_SetChessMode(MLX90640_ADDR); 
 	status = MLX90640_DumpEE(MLX90640_ADDR, eeMLX90640);
@@ -124,8 +123,8 @@ static int l_mlx90640_init(lua_State *L){
         LLOGW("Parameter extraction failed with error code:%d",status);
         return 0;
     }
-    //初始化后此处先读两帧,去掉初始化后一些错误数据
-    for (size_t i = 0; i < 2; i++){
+    //初始化后此处先读帧,去掉初始化后一些错误数据
+    for (size_t i = 0; i < 3; i++){
         int status = MLX90640_GetFrameData(MLX90640_ADDR, frame);
         if (status < 0){
             LLOGD("GetFrame Error: %d",status);
@@ -266,8 +265,8 @@ int luat_interpolation(float *src, float *dst) {
 @return bool 成功返回true,否则返回false
 */
 static int l_mlx90640_draw2lcd(lua_State *L) {
-    // luat_color_t line[32];
-    luat_color_t line[320];
+    luat_color_t line[32];
+    // luat_color_t line[64];
     // TODO 还得插值
 
     if (lcd_conf == NULL) {
@@ -292,13 +291,80 @@ static int l_mlx90640_draw2lcd(lua_State *L) {
     {
         for (size_t x = 0; x < 160; x++)
         {
-            int i = y*120 + x;
-            line[x] = camColors[tempto255(dst[i])];
+            // int i = y*120 + x;
+            float t = dst[y*120 + x];
+            if (t<MINTEMP) t=MINTEMP;
+            if (t>MAXTEMP) t=MAXTEMP;
+            
+            uint8_t colorIndex = (uint8_t)round(map(t, MINTEMP, MAXTEMP, 0, 255));
+            colorIndex = constrain(colorIndex, 0, 255);
+            line[x] = color_swap(camColors[colorIndex]);
+
+            // line[x] = camColors[tempto255(dst[i])];
         }
         luat_lcd_draw(lcd_conf, 0, y, 159, y, line);
     }
+
+    uint8_t TEST_DATA2[1536]; 
+    uint8_t TEST_DATA[768] ; 
+    for (size_t i = 0; i < 768; i++){
+        float t = mlx90640To[i];
+        if (t<MINTEMP) t=MINTEMP;
+        if (t>MAXTEMP) t=MAXTEMP;
+        
+        uint8_t colorIndex = (uint8_t)round(map(t, MINTEMP, MAXTEMP, 0, 255));
+        colorIndex = constrain(colorIndex, 0, 255);
+        TEST_DATA[i] = colorIndex;
+    }
+
+    int w1 = 32;
+    int h1 = 24;
+    int w2 = w1*2;
+    int h2 = h1*2;
+
+    for (size_t y = 0; y < h1; y++){
+        for (size_t x = 0; x < w1; x++){
+            TEST_DATA2[y*2*w2+x*2] = TEST_DATA[y*w1+x];
+            if (x == w1 - 1){
+                TEST_DATA2[y*2*w2+x*2+1] = (uint8_t)(TEST_DATA2[y*2*w2+x*2]*2-TEST_DATA2[y*2*w2+x*2-1]);
+                if (y == h1 - 1){
+                    TEST_DATA2[(y*2+1)*w2+x*2] = (uint8_t)(TEST_DATA2[y*2*w1+x*2]*2-TEST_DATA2[(y*2-1)*w1+x*2]);
+                }else{
+                    TEST_DATA2[(y*2+1)*w2+x*2] = (uint8_t)round((TEST_DATA[y*w1+x]+TEST_DATA[(y+1)*w1+x])/2);
+                }
+            }else{
+                TEST_DATA2[y*2*w2+x*2+1] = (uint8_t)round((TEST_DATA[y*w1+x]+TEST_DATA[y*w1+x+1])/2);
+                if (y == h1 - 1){
+                    TEST_DATA2[(y*2+1)*w2+x*2] = (uint8_t)(TEST_DATA2[y*2*w1+x*2]*2-TEST_DATA2[(y*2-1)*w1+x*2]);
+                }else{
+                    TEST_DATA2[(y*2+1)*w2+x*2] = (uint8_t)round((TEST_DATA[y*w1+x]+TEST_DATA[(y+1)*w1+x])/2);
+                }
+            }
+        }
+    }
+
+    for (size_t y = 0; y < h1; y++){
+        for (size_t x = 0; x < w1; x++){
+            if ((x == w1 - 1) && (y == h1 - 1)){
+                TEST_DATA2[(y+1)*2*w2+x*2+1] = (uint8_t)round((TEST_DATA2[(y+1)*2*w2+x*2]+TEST_DATA2[y*2*w2+x*2+1])/2);
+            }else if (y == h1 - 1){
+                TEST_DATA2[(y+1)*2*w2+x*2+1] = (uint8_t)round((TEST_DATA2[(y+1)*2*w2+x*2]+TEST_DATA2[(y+1)*2*w2+x*2+2])/2);
+            }else{
+                TEST_DATA2[(y+1)*2*w2+x*2+1] = (uint8_t)round((TEST_DATA2[y*2*w2+x*2+1]+TEST_DATA2[(y+2)*2*w2+x*2+1])/2);
+            }
+        }
+    }
+
+    for (size_t y = 0; y < h2; y++){
+        for (size_t x = 0; x < w2; x++){
+            line[x] = color_swap(camColors[TEST_DATA2[y*w2 + x]]);
+        }
+        luat_lcd_draw(lcd_conf, 0, y, w2-1, y, line);
+    }
+
 #else
-    for (size_t y = 0; y < 768/32; y++)
+
+    for (size_t y = 0; y < 24; y++)
     {
         for (size_t x = 0; x < 32; x++)
         {