92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
|
#include <stdint.h>
|
||
|
#include <iostream>
|
||
|
#include <cstring>
|
||
|
#include <fstream>
|
||
|
#include <chrono>
|
||
|
#include <thread>
|
||
|
#include <math.h>
|
||
|
#include "src/headers/MLX90640_API.h"
|
||
|
#include "mlx90640.hpp"
|
||
|
|
||
|
|
||
|
|
||
|
namespace pimoroni {
|
||
|
MLX90640::MLX90640_Error MLX90640::setup(int fps){
|
||
|
MLX90640_I2CConfigure(i2c_instance);
|
||
|
//MLX90640_SetDeviceMode(i2c_address, 0);
|
||
|
//MLX90640_SetSubPageRepeat(i2c_address, 0);
|
||
|
|
||
|
switch(fps){
|
||
|
case 1:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b001);
|
||
|
break;
|
||
|
case 2:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b010);
|
||
|
break;
|
||
|
case 4:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b011);
|
||
|
break;
|
||
|
case 8:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b100);
|
||
|
break;
|
||
|
case 16:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b101);
|
||
|
if(i2c_instance->get_baudrate() < 1000000) {
|
||
|
return INVALID_BAUDRATE;
|
||
|
}
|
||
|
break;
|
||
|
case 32:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b110);
|
||
|
if(i2c_instance->get_baudrate() < 1000000) {
|
||
|
return INVALID_BAUDRATE;
|
||
|
}
|
||
|
break;
|
||
|
case 64:
|
||
|
MLX90640_SetRefreshRate(i2c_address, 0b111);
|
||
|
if(i2c_instance->get_baudrate() < 1000000) {
|
||
|
return INVALID_BAUDRATE;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
#ifdef DEBUG
|
||
|
printf("Unsupported framerate: %d", fps);
|
||
|
#endif
|
||
|
return INVALID_FPS;
|
||
|
}
|
||
|
//MLX90640_SetChessMode(i2c_address);
|
||
|
MLX90640_SetInterleavedMode(i2c_address);
|
||
|
//MLX90640_SetResolution(i2c_address, 0);
|
||
|
MLX90640_DumpEE(i2c_address, eeMLX90640);
|
||
|
MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
|
||
|
|
||
|
return OK;
|
||
|
}
|
||
|
|
||
|
int MLX90640::get_image(void){
|
||
|
MLX90640_I2CConfigure(i2c_instance);
|
||
|
|
||
|
MLX90640_GetFrameData(i2c_address, frame0);
|
||
|
sleep_us(1000);
|
||
|
MLX90640_GetFrameData(i2c_address, frame1);
|
||
|
|
||
|
MLX90640_GetImage(frame0, &mlx90640, mlx90640To);
|
||
|
MLX90640_GetImage(frame1, &mlx90640, mlx90640To);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int MLX90640::get_frame(void){
|
||
|
MLX90640_I2CConfigure(i2c_instance);
|
||
|
|
||
|
MLX90640_GetFrameData(i2c_address, frame0);
|
||
|
sleep_us(1000);
|
||
|
MLX90640_GetFrameData(i2c_address, frame1);
|
||
|
|
||
|
int tr0 = MLX90640_GetTa(frame0, &mlx90640) - reflected_temperature;
|
||
|
MLX90640_CalculateTo(frame0, &mlx90640, emissivity, tr0, mlx90640To);
|
||
|
int tr1 = MLX90640_GetTa(frame1, &mlx90640) - reflected_temperature;
|
||
|
MLX90640_CalculateTo(frame1, &mlx90640, emissivity, tr1, mlx90640To);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
}
|