MLX90620 Viewer

Dependencies:   MLX90620 mbed

main.cpp

Committer:
kunipm9
Date:
2014-04-04
Revision:
0:a2d3a9f771b8

File content as of revision 0:a2d3a9f771b8:

#include "mbed.h"
#include "MLX90620.h"

extern "C" { 
  void xsprintf (char* buff, const char* fmt, ...);
}

#define BS          0x08                    //ascii backspace
#define CR          0x0d                    //ascii CR
#define LF          0x0a                    //ascii LF
#define SP          0x20                    //ascii space
#define ESC         0x1b                    //ascii escape
#define DP          0x2e                    //ascii decimal point / period
#define ticC        0x03                    //ascii control C
#define ticX        0x18                    //ascii control X

extern "C" void mbed_reset();
int revision = 102;
int gDebug = 2;

//RawSerial pc (USBTX, USBRX);
Serial pc(USBTX, USBRX);
//UART1 PIO0_0  PIO0_4
//UART2 PIO0_1/USBRX  PIO0_6/USBTX

//I2C i2c1(P0_10, P0_11);
MLX90620 mlx(P0_10, P0_11, "mlx");            //MLX90620 register access

//RN-42 Reset
DigitalOut p1(P0_8);

//MLX90620 buffers used by MLX90620.cpp
char* EEbuf = new char[256];
char* RamCmmd = new char[8];                //holds / sends MLX90620 RAM commands
char* RamBuf = new char[128];               //0x3f words, values are 'unsigned short'

//For MLX90620
unsigned short ConfigReg = 0;               //MLX90620 configuration register
float Ta = 0.0;
double TempPxl = 0;

//Used for display of temperature and extreme values
int pixX = 0;                               //display pixel X (0-15)
int pixY = 0;                               //display pixel Y (0-3)

//Display Options
int TempC = 'C';                            //***USED BY .INI FILE  display temperatures in degrees C or F

//--------------------------------------------------------------------------------------------------------------------------------------//
//Detect I2C device chain

int i2cQty = 16;                            //number of bytes to get
char i2cData[32];                           //i2c buffer data

char buf[256];

//--------------------------------------------------------------------------------------------------------------------------------------//
// Display on PC using VT100 escape codes
int loop = 0;
bool GotAmbient = false;
bool ReFrame = false;                       //do a reframe if asked

int ShowTempsColor()
{
    ConfigReg = mlx.GetConfigReg();
    if(GotAmbient == false) {
        if((ConfigReg & 0x0100) == 0) {
            Ta = mlx.GetDieTemp();
            GotAmbient = true;
        } else {
            return(ConfigReg & 0x0100);
        }
    }
    if((ConfigReg & 0x0200) == 0) {
        loop++;
        GotAmbient = false;
        if(ReFrame == true) {
            ReFrame = false;
        }
        mlx.LoadMLXRam();
        mlx.StartMeasurement();
    }
    return(0);
}

void ShowTempsVT100()
{
    double HoldTemp = TempPxl;
    pc.puts("st\r\n");
    for(pixY = 0; pixY <= 3; pixY++) {
        for(pixX = 0; pixX < 64; pixX = pixX + 4) {
            TempPxl = mlx.CalcPixel(pixX + pixY);
            if ((TempC == 'c') || (TempC == 'C')) {
                HoldTemp = TempPxl;
            } else {
                HoldTemp = TempPxl * 9.0 / 5.0 + 32.0;
            }

//            if(HoldTemp >= 100.0) {
//                pc.printf(" %.1f  ", HoldTemp);
//            } else if((HoldTemp <= 10.0) && (HoldTemp >= 0.0)) {
//                pc.printf("  %.2f  ", HoldTemp);
//            } else if((HoldTemp >= -10.0) && (HoldTemp < 0.0)) {
//                pc.printf(" %.2f  ", HoldTemp);
//            } else if(HoldTemp < -10.0) {
//                pc.printf("%.2f  ", HoldTemp);
//            } else {
//                pc.printf(" %.2f  ", HoldTemp);
//            }
            int temp = HoldTemp * 100;
            xsprintf(buf, "%d\r\n", temp);
            pc.puts(buf);
            xsprintf(buf, "info x:%d  y:%d  %d\r\n", pixX, pixY, temp);
            pc.puts(buf);
        }
//        pc.printf("\r\n", ESC, pixY);
    }
    pc.puts("ex\r\n");
}

//--------------------------------------------------------------------------------------------------------------------------------------//
// Display Pixels in color

//--------------------------------------------------------------------------------------------------------------------------------------//

int main(void)
{
    // RN-42
    p1 = 0;
    wait_ms(300);

    LPC_SYSCON->BODCTRL |= 2;
    LPC_SYSCON->PDRUNCFG &= (0<<3);

    p1 = 1;
    wait_ms(100);
    pc.baud(115200);

    int initFail = 0;
    //load up eeprom into buffer
    if((mlx.LoadEEPROM())) {
        pc.puts("err e1\r\n");
        initFail++;
    }

    for(pixY = 0; pixY <= 3; pixY++) {
        for(pixX = 0; pixX < 64; pixX = pixX + 4) {
            int Pixel = pixY + pixX;
            if (EEbuf[Pixel + 0x80] < 100) {
                EEbuf[Pixel + 0x80] = 100;
            }
        }
    }

    //Init MLX90620
    unsigned short x = 0;
    if((mlx.SetOscTrimReg())) {
        pc.puts("er e2\r\n");
        initFail++;
    } else {
        x = mlx.GetOscTrimReg();
        xsprintf(buf, "info Osc:  0x%04x\r\n", x);
        pc.puts(buf);
    }

    if((mlx.SetConfigReg())) {
        pc.puts("err e3\r\n");
        initFail++;
    } else {
        x = mlx.GetConfigReg();
        xsprintf(buf, "info Config: 0x%04x\r\n", x);
        pc.puts(buf);
        x = mlx.GetPTATReg();
        xsprintf(buf, "info PTAT:   0x%04x\r\n", x);
        pc.puts(buf);
    }

    if((mlx.StartMeasurement())) {
        pc.puts("err e4\r\n");
        initFail++;
    }
    wait_ms(300);

    if(initFail == 0) {
        mlx.CalcTa_To();
        Ta = mlx.GetDieTemp();
        xsprintf(buf, "info Ta = %f\n\n", Ta);
        pc.puts(buf);
    } else {
        pc.puts("err e5\r\n");
    }
    ShowTempsColor();

    while (true) {
        if(!(ShowTempsColor())) {
            do {
                wait_ms(1);
            } while(ShowTempsColor() != 0);
        }
        
        for(pixY = 0; pixY <= 3; pixY++) {
            for(pixX = 0; pixX < 64; pixX = pixX + 4) {
                int Pixel = pixY + pixX;
                short VirPixelX = (RamBuf[Pixel * 2 + 1] << 8) + RamBuf[Pixel * 2];
                xsprintf(buf, "info x:%d  y:%d  ea:%d  eb:%d  ed:%d  ra:%d\r\n", pixX, pixY, EEbuf[Pixel], EEbuf[Pixel + 0x40], EEbuf[Pixel + 0x80], VirPixelX);
                pc.puts(buf);
            }
        }

        ShowTempsVT100();
        wait_ms(300);
    }
}