termocamera

Dependencies:   LCD_fonts mbed SDFileSystem UniGraphic

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "ILI9341.h"
00003 #include "math.h"        // Utile per operazione di rounding (?)   
00004 #include "Arial_9.h"  // Font display
00005 #include "SDFileSystem.h" //lib per SD
00006 
00007 
00008 Serial bt(D8, D2);      // Bluetooth interface
00009 
00010 
00011 // LEPTON
00012 SPI lepton_spi(SPI_MOSI, SPI_MISO, SPI_SCK);
00013 DigitalOut spi_cs(SPI_CS);
00014 #define VOSPI_FRAME_SIZE (164)
00015 uint8_t lepton_frame_packet[VOSPI_FRAME_SIZE];
00016 uint16_t lepton_image[60][80];
00017 int print_image_binary_state = -1;
00018 int print_image_binary_i;
00019 int print_image_binary_j;
00020 int stop =0;
00021 int save =1;
00022 int cont=0;
00023 
00024 // DISPLAY
00025 ILI9341 tft (SPI_8, 40000000,PB_15, PB_14, PB_13, D7, D6, D9, "tft"); // SPI type, SPI speed, mosi, miso, sclk, cs, reset, dc; // ILI9341 driver //20MHz
00026 char orient = 2;  // Orientazione del display
00027 
00028 //Photo Button
00029 InterruptIn button(PC_9);
00030 
00031 
00032 //Micro SD
00033 SDFileSystem sd(PC_12, PC_11, PC_10, D4, "sd");
00034 
00035 // Variabili
00036 int lost_frame_counter = 0;
00037 int last_frame_number;
00038 int frame_complete = 0;
00039 int start_image = 0;
00040 int need_resync = 0;
00041 int last_crc;
00042 int new_frame = 0;
00043 int frame_counter = 0;
00044 float minValue = 65535;
00045 float maxValue = 0;
00046 float max_p=0;
00047 int8_t errore=0;
00048 float T_image[60][80];
00049 uint8_t matrix[60][240];
00050 uint8_t matrix1[60][80];
00051 float m1;
00052 float n1;
00053 int x1,y1,x2,y2;
00054 float a0,a1,a2,a3;
00055 float Out;
00056 unsigned int color;
00057 
00058 FATFS SDFatFs;//variabili per il salvataggio FAT del'immagine su microSD
00059 FIL MyFile;
00060 FRESULT res;
00061 
00062 
00063 uint32_t  bytesread;
00064 
00065 //Colorbar per salvataggio immagine
00066 //const int colormap_rainbow[] = {1, 3, 74, 0, 3, 74, 0, 3, 75, 0, 3, 75, 0, 3, 76, 0, 3, 76, 0, 3, 77, 0, 3, 79, 0, 3, 82, 0, 5, 85, 0, 7, 88, 0, 10, 91, 0, 14, 94, 0, 19, 98, 0, 22, 100, 0, 25, 103, 0, 28, 106, 0, 32, 109, 0, 35, 112, 0, 38, 116, 0, 40, 119, 0, 42, 123, 0, 45, 128, 0, 49, 133, 0, 50, 134, 0, 51, 136, 0, 52, 137, 0, 53, 139, 0, 54, 142, 0, 55, 144, 0, 56, 145, 0, 58, 149, 0, 61, 154, 0, 63, 156, 0, 65, 159, 0, 66, 161, 0, 68, 164, 0, 69, 167, 0, 71, 170, 0, 73, 174, 0, 75, 179, 0, 76, 181, 0, 78, 184, 0, 79, 187, 0, 80, 188, 0, 81, 190, 0, 84, 194, 0, 87, 198, 0, 88, 200, 0, 90, 203, 0, 92, 205, 0, 94, 207, 0, 94, 208, 0, 95, 209, 0, 96, 210, 0, 97, 211, 0, 99, 214, 0, 102, 217, 0, 103, 218, 0, 104, 219, 0, 105, 220, 0, 107, 221, 0, 109, 223, 0, 111, 223, 0, 113, 223, 0, 115, 222, 0, 117, 221, 0, 118, 220, 1, 120, 219, 1, 122, 217, 2, 124, 216, 2, 126, 214, 3, 129, 212, 3, 131, 207, 4, 132, 205, 4, 133, 202, 4, 134, 197, 5, 136, 192, 6, 138, 185, 7, 141, 178, 8, 142, 172, 10, 144, 166, 10, 144, 162, 11, 145, 158, 12, 146, 153, 13, 147, 149, 15, 149, 140, 17, 151, 132, 22, 153, 120, 25, 154, 115, 28, 156, 109, 34, 158, 101, 40, 160, 94, 45, 162, 86, 51, 164, 79, 59, 167, 69, 67, 171, 60, 72, 173, 54, 78, 175, 48, 83, 177, 43, 89, 179, 39, 93, 181, 35, 98, 183, 31, 105, 185, 26, 109, 187, 23, 113, 188, 21, 118, 189, 19, 123, 191, 17, 128, 193, 14, 134, 195, 12, 138, 196, 10, 142, 197, 8, 146, 198, 6, 151, 200, 5, 155, 201, 4, 160, 203, 3, 164, 204, 2, 169, 205, 2, 173, 206, 1, 175, 207, 1, 178, 207, 1, 184, 208, 0, 190, 210, 0, 193, 211, 0, 196, 212, 0, 199, 212, 0, 202, 213, 1, 207, 214, 2, 212, 215, 3, 215, 214, 3, 218, 214, 3, 220, 213, 3, 222, 213, 4, 224, 212, 4, 225, 212, 5, 226, 212, 5, 229, 211, 5, 232, 211, 6, 232, 211, 6, 233, 211, 6, 234, 210, 6, 235, 210, 7, 236, 209, 7, 237, 208, 8, 239, 206, 8, 241, 204, 9, 242, 203, 9, 244, 202, 10, 244, 201, 10, 245, 200, 10, 245, 199, 11, 246, 198, 11, 247, 197, 12, 248, 194, 13, 249, 191, 14, 250, 189, 14, 251, 187, 15, 251, 185, 16, 252, 183, 17, 252, 178, 18, 253, 174, 19, 253, 171, 19, 254, 168, 20, 254, 165, 21, 254, 164, 21, 255, 163, 22, 255, 161, 22, 255, 159, 23, 255, 157, 23, 255, 155, 24, 255, 149, 25, 255, 143, 27, 255, 139, 28, 255, 135, 30, 255, 131, 31, 255, 127, 32, 255, 118, 34, 255, 110, 36, 255, 104, 37, 255, 101, 38, 255, 99, 39, 255, 93, 40, 255, 88, 42, 254, 82, 43, 254, 77, 45, 254, 69, 47, 254, 62, 49, 253, 57, 50, 253, 53, 52, 252, 49, 53, 252, 45, 55, 251, 39, 57, 251, 33, 59, 251, 32, 60, 251, 31, 60, 251, 30, 61, 251, 29, 61, 251, 28, 62, 250, 27, 63, 250, 27, 65, 249, 26, 66, 249, 26, 68, 248, 25, 70, 248, 24, 73, 247, 24, 75, 247, 25, 77, 247, 25, 79, 247, 26, 81, 247, 32, 83, 247, 35, 85, 247, 38, 86, 247, 42, 88, 247, 46, 90, 247, 50, 92, 248, 55, 94, 248, 59, 96, 248, 64, 98, 248, 72, 101, 249, 81, 104, 249, 87, 106, 250, 93, 108, 250, 95, 109, 250, 98, 110, 250, 100, 111, 251, 101, 112, 251, 102, 113, 251, 109, 117, 252, 116, 121, 252, 121, 123, 253, 126, 126, 253, 130, 128, 254, 135, 131, 254, 139, 133, 254, 144, 136, 254, 151, 140, 255, 158, 144, 255, 163, 146, 255, 168, 149, 255, 173, 152, 255, 176, 153, 255, 178, 155, 255, 184, 160, 255, 191, 165, 255, 195, 168, 255, 199, 172, 255, 203, 175, 255, 207, 179, 255, 211, 182, 255, 216, 185, 255, 218, 190, 255, 220, 196, 255, 222, 200, 255, 225, 202, 255, 227, 204, 255, 230, 206, 255, 233, 208};
00067 //const int colormap_grayscale[] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 95, 96, 96, 96, 97, 97, 97, 98, 98, 98, 99, 99, 99, 100, 100, 100, 101, 101, 101, 102, 102, 102, 103, 103, 103, 104, 104, 104, 105, 105, 105, 106, 106, 106, 107, 107, 107, 108, 108, 108, 109, 109, 109, 110, 110, 110, 111, 111, 111, 112, 112, 112, 113, 113, 113, 114, 114, 114, 115, 115, 115, 116, 116, 116, 117, 117, 117, 118, 118, 118, 119, 119, 119, 120, 120, 120, 121, 121, 121, 122, 122, 122, 123, 123, 123, 124, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, 127, 128, 128, 128, 129, 129, 129, 130, 130, 130, 131, 131, 131, 132, 132, 132, 133, 133, 133, 134, 134, 134, 135, 135, 135, 136, 136, 136, 137, 137, 137, 138, 138, 138, 139, 139, 139, 140, 140, 140, 141, 141, 141, 142, 142, 142, 143, 143, 143, 144, 144, 144, 145, 145, 145, 146, 146, 146, 147, 147, 147, 148, 148, 148, 149, 149, 149, 150, 150, 150, 151, 151, 151, 152, 152, 152, 153, 153, 153, 154, 154, 154, 155, 155, 155, 156, 156, 156, 157, 157, 157, 158, 158, 158, 159, 159, 159, 160, 160, 160, 161, 161, 161, 162, 162, 162, 163, 163, 163, 164, 164, 164, 165, 165, 165, 166, 166, 166, 167, 167, 167, 168, 168, 168, 169, 169, 169, 170, 170, 170, 171, 171, 171, 172, 172, 172, 173, 173, 173, 174, 174, 174, 175, 175, 175, 176, 176, 176, 177, 177, 177, 178, 178, 178, 179, 179, 179, 180, 180, 180, 181, 181, 181, 182, 182, 182, 183, 183, 183, 184, 184, 184, 185, 185, 185, 186, 186, 186, 187, 187, 187, 188, 188, 188, 189, 189, 189, 190, 190, 190, 191, 191, 191, 192, 192, 192, 193, 193, 193, 194, 194, 194, 195, 195, 195, 196, 196, 196, 197, 197, 197, 198, 198, 198, 199, 199, 199, 200, 200, 200, 201, 201, 201, 202, 202, 202, 203, 203, 203, 204, 204, 204, 205, 205, 205, 206, 206, 206, 207, 207, 207, 208, 208, 208, 209, 209, 209, 210, 210, 210, 211, 211, 211, 212, 212, 212, 213, 213, 213, 214, 214, 214, 215, 215, 215, 216, 216, 216, 217, 217, 217, 218, 218, 218, 219, 219, 219, 220, 220, 220, 221, 221, 221, 222, 222, 222, 223, 223, 223, 224, 224, 224, 225, 225, 225, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 229, 229, 230, 230, 230, 231, 231, 231, 232, 232, 232, 233, 233, 233, 234, 234, 234, 235, 235, 235, 236, 236, 236, 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240, 240, 241, 241, 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 245, 245, 245, 246, 246, 246, 247, 247, 247, 248, 248, 248, 249, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 253, 253, 253, 254, 254, 254, 255, 255, 255};
00068 //const int colormap_ironblack[] = {255, 255, 255, 253, 253, 253, 251, 251, 251, 249, 249, 249, 247, 247, 247, 245, 245, 245, 243, 243, 243, 241, 241, 241, 239, 239, 239, 237, 237, 237, 235, 235, 235, 233, 233, 233, 231, 231, 231, 229, 229, 229, 227, 227, 227, 225, 225, 225, 223, 223, 223, 221, 221, 221, 219, 219, 219, 217, 217, 217, 215, 215, 215, 213, 213, 213, 211, 211, 211, 209, 209, 209, 207, 207, 207, 205, 205, 205, 203, 203, 203, 201, 201, 201, 199, 199, 199, 197, 197, 197, 195, 195, 195, 193, 193, 193, 191, 191, 191, 189, 189, 189, 187, 187, 187, 185, 185, 185, 183, 183, 183, 181, 181, 181, 179, 179, 179, 177, 177, 177, 175, 175, 175, 173, 173, 173, 171, 171, 171, 169, 169, 169, 167, 167, 167, 165, 165, 165, 163, 163, 163, 161, 161, 161, 159, 159, 159, 157, 157, 157, 155, 155, 155, 153, 153, 153, 151, 151, 151, 149, 149, 149, 147, 147, 147, 145, 145, 145, 143, 143, 143, 141, 141, 141, 139, 139, 139, 137, 137, 137, 135, 135, 135, 133, 133, 133, 131, 131, 131, 129, 129, 129, 126, 126, 126, 124, 124, 124, 122, 122, 122, 120, 120, 120, 118, 118, 118, 116, 116, 116, 114, 114, 114, 112, 112, 112, 110, 110, 110, 108, 108, 108, 106, 106, 106, 104, 104, 104, 102, 102, 102, 100, 100, 100, 98, 98, 98, 96, 96, 96, 94, 94, 94, 92, 92, 92, 90, 90, 90, 88, 88, 88, 86, 86, 86, 84, 84, 84, 82, 82, 82, 80, 80, 80, 78, 78, 78, 76, 76, 76, 74, 74, 74, 72, 72, 72, 70, 70, 70, 68, 68, 68, 66, 66, 66, 64, 64, 64, 62, 62, 62, 60, 60, 60, 58, 58, 58, 56, 56, 56, 54, 54, 54, 52, 52, 52, 50, 50, 50, 48, 48, 48, 46, 46, 46, 44, 44, 44, 42, 42, 42, 40, 40, 40, 38, 38, 38, 36, 36, 36, 34, 34, 34, 32, 32, 32, 30, 30, 30, 28, 28, 28, 26, 26, 26, 24, 24, 24, 22, 22, 22, 20, 20, 20, 18, 18, 18, 16, 16, 16, 14, 14, 14, 12, 12, 12, 10, 10, 10, 8, 8, 8, 6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 0, 0, 9, 2, 0, 16, 4, 0, 24, 6, 0, 31, 8, 0, 38, 10, 0, 45, 12, 0, 53, 14, 0, 60, 17, 0, 67, 19, 0, 74, 21, 0, 82, 23, 0, 89, 25, 0, 96, 27, 0, 103, 29, 0, 111, 31, 0, 118, 36, 0, 120, 41, 0, 121, 46, 0, 122, 51, 0, 123, 56, 0, 124, 61, 0, 125, 66, 0, 126, 71, 0, 127, 76, 1, 128, 81, 1, 129, 86, 1, 130, 91, 1, 131, 96, 1, 132, 101, 1, 133, 106, 1, 134, 111, 1, 135, 116, 1, 136, 121, 1, 136, 125, 2, 137, 130, 2, 137, 135, 3, 137, 139, 3, 138, 144, 3, 138, 149, 4, 138, 153, 4, 139, 158, 5, 139, 163, 5, 139, 167, 5, 140, 172, 6, 140, 177, 6, 140, 181, 7, 141, 186, 7, 141, 189, 10, 137, 191, 13, 132, 194, 16, 127, 196, 19, 121, 198, 22, 116, 200, 25, 111, 203, 28, 106, 205, 31, 101, 207, 34, 95, 209, 37, 90, 212, 40, 85, 214, 43, 80, 216, 46, 75, 218, 49, 69, 221, 52, 64, 223, 55, 59, 224, 57, 49, 225, 60, 47, 226, 64, 44, 227, 67, 42, 228, 71, 39, 229, 74, 37, 230, 78, 34, 231, 81, 32, 231, 85, 29, 232, 88, 27, 233, 92, 24, 234, 95, 22, 235, 99, 19, 236, 102, 17, 237, 106, 14, 238, 109, 12, 239, 112, 12, 240, 116, 12, 240, 119, 12, 241, 123, 12, 241, 127, 12, 242, 130, 12, 242, 134, 12, 243, 138, 12, 243, 141, 13, 244, 145, 13, 244, 149, 13, 245, 152, 13, 245, 156, 13, 246, 160, 13, 246, 163, 13, 247, 167, 13, 247, 171, 13, 248, 175, 14, 248, 178, 15, 249, 182, 16, 249, 185, 18, 250, 189, 19, 250, 192, 20, 251, 196, 21, 251, 199, 22, 252, 203, 23, 252, 206, 24, 253, 210, 25, 253, 213, 27, 254, 217, 28, 254, 220, 29, 255, 224, 30, 255, 227, 39, 255, 229, 53, 255, 231, 67, 255, 233, 81, 255, 234, 95, 255, 236, 109, 255, 238, 123, 255, 240, 137, 255, 242, 151, 255, 244, 165, 255, 246, 179, 255, 248, 193, 255, 249, 207, 255, 251, 221, 255, 253, 235, 255, 255, 24};
00069 
00070 // Prototipi
00071 static void print_image_binary_background(void);
00072 void transfer(void);
00073 void SettaPixel(float value, int k,int s,float div,float minValue,float maxValue);
00074 void draw_colorbar(void);
00075 void Scale(float div,float min);
00076 void push_button(void);
00077 void data_save(uint16_t lepton_image [60][80]);
00078 void matrix_save(uint8_t matrix [60][240],uint8_t value, int y, int k);
00079 void save_SD(uint8_t matrix[60][240]);
00080 void calcola(void);
00081 void Colormap(float value, float div);
00082 
00083 
00084 int main()
00085 {
00086     tft.set_orientation(orient);
00087     bt.baud(115200);
00088     lepton_spi.format(8,3);
00089     lepton_spi.frequency(20000000); //20MHz
00090     spi_cs = 1;
00091     spi_cs = 0;
00092     spi_cs = 1;
00093     wait_ms(185);
00094     draw_colorbar();
00095 
00096     while(1) {
00097         spi_cs = 1;
00098         spi_cs = 0;
00099         spi_cs = 1;
00100 
00101         while(save==1) {
00102             button.fall(&push_button);
00103         }
00104 
00105 
00106 
00107         while(stop==0) {
00108 
00109             transfer(); // Recupero riga per riga l'immagine dalla LEPTON
00110 
00111         }
00112 
00113         stop=0;
00114         spi_cs = 1;
00115         spi_cs = 0;
00116         spi_cs = 1;
00117         //pc.printf("Fine1");
00118         // Converto l'immagine in temperatura (°C)
00119         for (int y =0; y < 60; y++) {
00120             for (int x = 0; x < 80; x++) {
00121                 float v=lepton_image[y][x]/100;
00122                 T_image[y][x]=floor(v);
00123                 T_image[y][x]=T_image[y][x]-273;
00124             }
00125         }
00126 
00127         minValue = 65535;
00128         maxValue = 0;
00129 
00130         // Ricerca MAX e MIN nell'immagine
00131         for (int y =0; y < 60; y++) {
00132             for (int x = 0; x < 80; x++) {
00133                 if (T_image[y][x] > maxValue) {
00134                     maxValue = T_image[y][x];
00135                 }
00136                 if (T_image[y][x] < minValue) {
00137                     minValue = T_image[y][x];
00138                 }
00139             }
00140         }
00141 
00142         if(maxValue<(80+max_p)) {
00143 
00144             max_p=maxValue;
00145             //bt.putc(minValue);
00146             //bt.putc(maxValue);
00147             float v; // delta discretizzazione dei colori
00148             v=(maxValue-minValue)/120;
00149             //wait_ms(50);
00150 
00151             wait_ms(2);
00152             // Scrive l'immagine sul display a blocchi di 3x3
00153             tft.set_orientation(orient);
00154             tft.FastWindow(true);
00155             for (int m=0; m<177; m=m+3) {
00156                 for (int n=0; n<237; n=n+3) {
00157                     m1=1.0/3*m;
00158                     n1=1.0/3*n;
00159                     x1=m1;
00160                     x2=m1+1;
00161                     y1=n1;
00162                     y2=n1+1;
00163                     calcola();
00164 
00165                     for(int i=m; i<m+3; i++) {
00166                         for(int j=n; j<n+3; j++) {
00167                             Out=a0+a1*m1+a2*n1+a3*m1*n1;
00168                             SettaPixel(Out,i,237-j,v,minValue,maxValue);
00169                             m1=m1+1.0/3;
00170                         }
00171                         m1=1.0/3*m;
00172                         n1=n1+1.0/3;
00173                     }
00174 
00175                 }
00176             }
00177             tft.FastWindow(false);
00178 
00179 
00180             Scale(v,minValue);
00181 
00182 
00183 
00184             print_image_binary_background();
00185             bt.printf("\n\r");
00186             //bt.printf("ok");
00187             data_save(lepton_image);
00188             save_SD(matrix);
00189             save=1;
00190 
00191         }
00192         // bt.printf("Fine");
00193         //}
00194         else {
00195             save=1;
00196             //lepton_spi.format(8,3);
00197             //lepton_spi.frequency(20000000); //20MHz
00198             //spi_cs = 1;
00199             // spi_cs = 0;
00200             //spi_cs = 1;
00201             //wait_ms(800);
00202         }
00203 
00204 
00205     }
00206 
00207 }
00208 
00209 // **************** Implementazione funzioni ******************
00210 
00211 // Download tramite SPI di una riga dell'immagine dalla LEPTON al Micro
00212 void transfer(void)
00213 {
00214     int i;
00215     int frame_number;
00216 
00217     spi_cs = 0;
00218     // Download dati RAW
00219     for(i=0; i<VOSPI_FRAME_SIZE; i++) {
00220         lepton_frame_packet[i] = lepton_spi.write(0x00);
00221     }
00222     spi_cs = 1;
00223     if(((lepton_frame_packet[0]&0xf) != 0x0f)) {
00224         if(lepton_frame_packet[1] == 0  ) {
00225             if(last_crc != (lepton_frame_packet[3]<<8 | lepton_frame_packet[4])) {
00226                 new_frame = 1;
00227             }
00228             last_crc = lepton_frame_packet[3]<<8 | lepton_frame_packet[4];
00229         }
00230         frame_number = lepton_frame_packet[1];
00231         // Conversione dati RAW in matrice
00232         if(frame_number < 60 ) {
00233             lost_frame_counter = 0;
00234             if(print_image_binary_state == -1) {
00235                 for(i=0; i<80; i++) {
00236                     lepton_image[frame_number][i] = (lepton_frame_packet[2*i+4] << 8 | lepton_frame_packet[2*i+5]);
00237                 }
00238             }
00239         } else {
00240             lost_frame_counter++;
00241         }
00242         if( frame_number == 59) {
00243             frame_complete = 1;
00244             last_frame_number = 0;
00245         }
00246     } else {
00247         if(last_frame_number ==0) {
00248         }
00249     }
00250     lost_frame_counter++;
00251     if(lost_frame_counter>100) {
00252         need_resync = 1;
00253         lost_frame_counter = 0;
00254     }
00255     if(need_resync) {
00256         wait_ms(185);
00257         need_resync = 0;
00258     }
00259     if(frame_complete) {
00260         if(new_frame) {
00261             frame_counter++;
00262             {
00263 
00264                 if(frame_counter%1 ==0) {
00265                     print_image_binary_state = -1;
00266                     stop=1;
00267                 }
00268             }
00269             new_frame = 0;
00270         }
00271         frame_complete = 0;
00272     }
00273 }
00274 
00275 // Utile per inviare l'immagine tramite UART o BLE
00276 static void print_image_binary_background(void)
00277 {
00278     print_image_binary_i=0;
00279     print_image_binary_j=0;
00280     while(print_image_binary_i!=60) {
00281         while(bt.writeable() == 0);
00282         bt.putc((lepton_image[print_image_binary_i][print_image_binary_j]>>8)&0xff);
00283         while(bt.writeable() == 0);
00284         bt.putc(lepton_image[print_image_binary_i][print_image_binary_j]&0xff);
00285         print_image_binary_j++;
00286         if(print_image_binary_j>=80) {
00287             print_image_binary_j=0;
00288             print_image_binary_i++;
00289             if(print_image_binary_i>=60) {
00290                 print_image_binary_state = -1;
00291                 //pc.printf("fine...");
00292                 //spi_cs=1;
00293                 //stop=1;
00294             }
00295         }
00296         //stop=0; // Da eliminare se si riattiva il while
00297     }
00298 }
00299 
00300 // Conversione da grey a color e settaggio di un pixel
00301 void SettaPixel(float value, int k,int s,float div,float minValue,float maxValue)
00302 {
00303 
00304 
00305 
00306     if( value<=1*div+minValue ) {
00307         tft.pixel(k,s,color1);
00308     } else if(value>(1*div+minValue) &  value<=2*div+minValue ) {
00309         tft.pixel(k,s,color2);
00310     } else if(value>(2*div+minValue) &  value<=3*div+minValue ) {
00311         tft.pixel(k,s,color3);
00312     } else if(value>(3*div+minValue) &  value<=4*div+minValue ) {
00313         tft.pixel(k,s,color4);
00314     } else if(value>(4*div+minValue) &  value<=5*div+minValue ) {
00315         tft.pixel(k,s,color5);
00316     } else if(value>(5*div+minValue) &  value<=6*div+minValue ) {
00317         tft.pixel(k,s,color6);
00318     } else if(value>(6*div+minValue) &  value<=7*div+minValue ) {
00319         tft.pixel(k,s,color7);
00320     } else if(value>(7*div+minValue) &  value<=8*div+minValue ) {
00321         tft.pixel(k,s,color8);
00322     } else if(value>(8*div+minValue) &  value<=9*div+minValue ) {
00323         tft.pixel(k,s,color9);
00324     } else if(value>(9*div+minValue) &  value<=10*div+minValue ) {
00325         tft.pixel(k,s,color10);
00326     } else if(value>(10*div+minValue) &  value<=11*div+minValue ) {
00327         tft.pixel(k,s,color11);
00328     } else if(value>(11*div+minValue) &  value<=12*div+minValue ) {
00329         tft.pixel(k,s,color12);
00330     } else if(value>(12*div+minValue) &  value<=13*div+minValue ) {
00331         tft.pixel(k,s,color13);
00332     } else if(value>(13*div+minValue) &  value<=14*div+minValue ) {
00333         tft.pixel(k,s,color14);
00334     } else if(value>(14*div+minValue) &  value<=15*div+minValue ) {
00335         tft.pixel(k,s,color15);
00336     } else if(value>(15*div+minValue) &  value<=16*div+minValue ) {
00337         tft.pixel(k,s,color16);
00338     } else if(value>(16*div+minValue) &  value<=17*div+minValue ) {
00339         tft.pixel(k,s,color17);
00340     } else if(value>(17*div+minValue) &  value<=18*div+minValue ) {
00341         tft.pixel(k,s,color18);
00342     } else if(value>(18*div+minValue) &  value<=19*div+minValue ) {
00343         tft.pixel(k,s,color19);
00344     } else if(value>(19*div+minValue) &  value<=20*div+minValue ) {
00345         tft.pixel(k,s,color20);
00346     } else if(value>(20*div+minValue) &  value<=21*div+minValue ) {
00347         tft.pixel(k,s,color21);
00348     } else if(value>(21*div+minValue) &  value<=22*div+minValue ) {
00349         tft.pixel(k,s,color22);
00350     } else if(value>(22*div+minValue) &  value<=23*div+minValue ) {
00351         tft.pixel(k,s,color23);
00352     } else if(value>(23*div+minValue) &  value<=24*div+minValue ) {
00353         tft.pixel(k,s,color24);
00354     } else if(value>(24*div+minValue) &  value<=25*div+minValue ) {
00355         tft.pixel(k,s,color25);
00356     } else if(value>(25*div+minValue) &  value<=26*div+minValue ) {
00357         tft.pixel(k,s,color26);
00358     } else if(value>(26*div+minValue) &  value<=27*div+minValue ) {
00359         tft.pixel(k,s,color27);
00360     } else if(value>(27*div+minValue) &  value<=28*div+minValue ) {
00361         tft.pixel(k,s,color28);
00362     } else if(value>(28*div+minValue) &  value<=29*div+minValue ) {
00363         tft.pixel(k,s,color29);
00364     } else if(value>(29*div+minValue) &  value<=30*div+minValue ) {
00365         tft.pixel(k,s,color30);
00366     } else if(value>(30*div+minValue) &  value<=31*div+minValue ) {
00367         tft.pixel(k,s,color31);
00368     } else if(value>(31*div+minValue) &  value<=32*div+minValue ) {
00369         tft.pixel(k,s,color32);
00370     } else if(value>(32*div+minValue) &  value<=33*div+minValue ) {
00371         tft.pixel(k,s,color33);
00372     } else if(value>(33*div+minValue) &  value<=34*div+minValue ) {
00373         tft.pixel(k,s,color34);
00374     } else if(value>(34*div+minValue) &  value<=35*div+minValue ) {
00375         tft.pixel(k,s,color35);
00376     } else if(value>(35*div+minValue) &  value<=36*div+minValue ) {
00377         tft.pixel(k,s,color36);
00378     } else if(value>(36*div+minValue) &  value<=37*div+minValue ) {
00379         tft.pixel(k,s,color37);
00380     } else if(value>(37*div+minValue) &  value<=38*div+minValue ) {
00381         tft.pixel(k,s,color38);
00382     } else if(value>(38*div+minValue) &  value<=39*div+minValue ) {
00383         tft.pixel(k,s,color39);
00384     } else if(value>(39*div+minValue) &  value<=40*div+minValue ) {
00385         tft.pixel(k,s,color40);
00386     } else if(value>(40*div+minValue) &  value<=41*div+minValue ) {
00387         tft.pixel(k,s,color41);
00388     } else if(value>(41*div+minValue) &  value<=42*div+minValue ) {
00389         tft.pixel(k,s,color42);
00390     } else if(value>(42*div+minValue) &  value<=43*div+minValue ) {
00391         tft.pixel(k,s,color43);
00392     } else if(value>(43*div+minValue) &  value<=44*div+minValue ) {
00393         tft.pixel(k,s,color44);
00394     } else if(value>(44*div+minValue) &  value<=45*div+minValue ) {
00395         tft.pixel(k,s,color45);
00396     } else if(value>(45*div+minValue) &  value<=46*div+minValue ) {
00397         tft.pixel(k,s,color46);
00398     } else if(value>(46*div+minValue) &  value<=47*div+minValue ) {
00399         tft.pixel(k,s,color47);
00400     } else if(value>(47*div+minValue) &  value<=48*div+minValue ) {
00401         tft.pixel(k,s,color48);
00402     } else if(value>(48*div+minValue) &  value<=49*div+minValue ) {
00403         tft.pixel(k,s,color49);
00404     } else if(value>(49*div+minValue) &  value<=50*div+minValue ) {
00405         tft.pixel(k,s,color50);
00406     } else if(value>(50*div+minValue) &  value<=51*div+minValue ) {
00407         tft.pixel(k,s,color51);
00408     } else if(value>(51*div+minValue) &  value<=52*div+minValue ) {
00409         tft.pixel(k,s,color52);
00410     } else if(value>(52*div+minValue) &  value<=53*div+minValue ) {
00411         tft.pixel(k,s,color53);
00412     } else if(value>(53*div+minValue) &  value<=54*div+minValue ) {
00413         tft.pixel(k,s,color54);
00414     } else if(value>(54*div+minValue) &  value<=55*div+minValue ) {
00415         tft.pixel(k,s,color55);
00416     } else if(value>(55*div+minValue) &  value<=56*div+minValue ) {
00417         tft.pixel(k,s,color56);
00418     } else if(value>(56*div+minValue) &  value<=57*div+minValue ) {
00419         tft.pixel(k,s,color57);
00420     } else if(value>(57*div+minValue) &  value<=58*div+minValue ) {
00421         tft.pixel(k,s,color58);
00422     } else if(value>(58*div+minValue) &  value<=59*div+minValue ) {
00423         tft.pixel(k,s,color59);
00424     } else if(value>(59*div+minValue) &  value<=60*div+minValue ) {
00425         tft.pixel(k,s,color60);
00426     } else if(value>(60*div+minValue) &  value<=61*div+minValue ) {
00427         tft.pixel(k,s,color61);
00428     } else if(value>(61*div+minValue) &  value<=62*div+minValue ) {
00429         tft.pixel(k,s,color62);
00430     } else if(value>(62*div+minValue) &  value<=63*div+minValue ) {
00431         tft.pixel(k,s,color63);
00432     } else if(value>(63*div+minValue) &  value<=64*div+minValue ) {
00433         tft.pixel(k,s,color64);
00434     } else if(value>(64*div+minValue) &  value<=65*div+minValue ) {
00435         tft.pixel(k,s,color65);
00436     } else if(value>(65*div+minValue) &  value<=66*div+minValue ) {
00437         tft.pixel(k,s,color66);
00438     } else if(value>(66*div+minValue) &  value<=67*div+minValue ) {
00439         tft.pixel(k,s,color67);
00440     } else if(value>(67*div+minValue) &  value<=68*div+minValue ) {
00441         tft.pixel(k,s,color68);
00442     } else if(value>(68*div+minValue) &  value<=69*div+minValue ) {
00443         tft.pixel(k,s,color69);
00444     } else if(value>(69*div+minValue) &  value<=70*div+minValue ) {
00445         tft.pixel(k,s,color70);
00446     } else if(value>(70*div+minValue) &  value<=71*div+minValue ) {
00447         tft.pixel(k,s,color71);
00448     } else if(value>(71*div+minValue) &  value<=72*div+minValue ) {
00449         tft.pixel(k,s,color72);
00450     } else if(value>(72*div+minValue) &  value<=73*div+minValue ) {
00451         tft.pixel(k,s,color73);
00452     } else if(value>(73*div+minValue) &  value<=74*div+minValue ) {
00453         tft.pixel(k,s,color74);
00454     } else if(value>(74*div+minValue) &  value<=75*div+minValue ) {
00455         tft.pixel(k,s,color75);
00456     } else if(value>(75*div+minValue) &  value<=76*div+minValue ) {
00457         tft.pixel(k,s,color76);
00458     } else if(value>(76*div+minValue) &  value<=77*div+minValue ) {
00459         tft.pixel(k,s,color77);
00460     } else if(value>(77*div+minValue) &  value<=78*div+minValue ) {
00461         tft.pixel(k,s,color78);
00462     } else if(value>(78*div+minValue) &  value<=79*div+minValue ) {
00463         tft.pixel(k,s,color79);
00464     } else if(value>(79*div+minValue) &  value<=80*div+minValue ) {
00465         tft.pixel(k,s,color80);
00466     } else if(value>(80*div+minValue) &  value<=81*div+minValue ) {
00467         tft.pixel(k,s,color81);
00468     } else if(value>(81*div+minValue) &  value<=82*div+minValue ) {
00469         tft.pixel(k,s,color82);
00470     } else if(value>(82*div+minValue) &  value<=83*div+minValue ) {
00471         tft.pixel(k,s,color83);
00472     } else if(value>(83*div+minValue) &  value<=84*div+minValue ) {
00473         tft.pixel(k,s,color84);
00474     } else if(value>(84*div+minValue) &  value<=85*div+minValue ) {
00475         tft.pixel(k,s,color85);
00476     } else if(value>(85*div+minValue) &  value<=86*div+minValue ) {
00477         tft.pixel(k,s,color86);
00478     } else if(value>(86*div+minValue) &  value<=87*div+minValue ) {
00479         tft.pixel(k,s,color87);
00480     } else if(value>(87*div+minValue) &  value<=88*div+minValue ) {
00481         tft.pixel(k,s,color88);
00482     } else if(value>(88*div+minValue) &  value<=89*div+minValue ) {
00483         tft.pixel(k,s,color89);
00484     } else if(value>(89*div+minValue) &  value<=90*div+minValue ) {
00485         tft.pixel(k,s,color90);
00486     } else if(value>(90*div+minValue) &  value<=91*div+minValue ) {
00487         tft.pixel(k,s,color91);
00488     } else if(value>(91*div+minValue) &  value<=92*div+minValue ) {
00489         tft.pixel(k,s,color92);
00490     } else if(value>(92*div+minValue) &  value<=93*div+minValue ) {
00491         tft.pixel(k,s,color93);
00492     } else if(value>(93*div+minValue) &  value<=94*div+minValue ) {
00493         tft.pixel(k,s,color94);
00494     } else if(value>(94*div+minValue) &  value<=95*div+minValue ) {
00495         tft.pixel(k,s,color95);
00496     } else if(value>(95*div+minValue) &  value<=96*div+minValue ) {
00497         tft.pixel(k,s,color96);
00498     } else if(value>(96*div+minValue) &  value<=97*div+minValue ) {
00499         tft.pixel(k,s,color97);
00500     } else if(value>(97*div+minValue) &  value<=98*div+minValue ) {
00501         tft.pixel(k,s,color98);
00502     } else if(value>(98*div+minValue) &  value<=99*div+minValue ) {
00503         tft.pixel(k,s,color99);
00504     } else if(value>(99*div+minValue) &  value<=100*div+minValue ) {
00505         tft.pixel(k,s,color100);
00506     } else if(value>(100*div+minValue) &  value<=101*div+minValue ) {
00507         tft.pixel(k,s,color101);
00508     } else if(value>(101*div+minValue) &  value<=102*div+minValue ) {
00509         tft.pixel(k,s,color102);
00510     } else if(value>(102*div+minValue) &  value<=103*div+minValue ) {
00511         tft.pixel(k,s,color103);
00512     } else if(value>(103*div+minValue) &  value<=104*div+minValue ) {
00513         tft.pixel(k,s,color104);
00514     } else if(value>(104*div+minValue) &  value<=105*div+minValue ) {
00515         tft.pixel(k,s,color105);
00516     } else if(value>(105*div+minValue) &  value<=106*div+minValue ) {
00517         tft.pixel(k,s,color106);
00518     } else if(value>(106*div+minValue) &  value<=107*div+minValue ) {
00519         tft.pixel(k,s,color107);
00520     } else if(value>(107*div+minValue) &  value<=108*div+minValue ) {
00521         tft.pixel(k,s,color108);
00522     } else if(value>(108*div+minValue) &  value<=109*div+minValue ) {
00523         tft.pixel(k,s,color109);
00524     } else if(value>(109*div+minValue) &  value<=110*div+minValue ) {
00525         tft.pixel(k,s,color110);
00526     } else if(value>(110*div+minValue) &  value<=111*div+minValue ) {
00527         tft.pixel(k,s,color111);
00528     } else if(value>(111*div+minValue) &  value<=112*div+minValue ) {
00529         tft.pixel(k,s,color112);
00530     } else if(value>(112*div+minValue) &  value<=113*div+minValue ) {
00531         tft.pixel(k,s,color113);
00532     } else if(value>(113*div+minValue) &  value<=114*div+minValue ) {
00533         tft.pixel(k,s,color114);
00534     } else if(value>(114*div+minValue) &  value<=115*div+minValue ) {
00535         tft.pixel(k,s,color115);
00536     } else if(value>(115*div+minValue) &  value<=116*div+minValue ) {
00537         tft.pixel(k,s,color116);
00538     } else if(value>(116*div+minValue) &  value<=117*div+minValue ) {
00539         tft.pixel(k,s,color117);
00540     } else if(value>(117*div+minValue) &  value<=118*div+minValue ) {
00541         tft.pixel(k,s,color118);
00542     } else if(value>(118*div+minValue) &  value<=119*div+minValue ) {
00543         tft.pixel(k,s,color119);
00544     } else if(value>(119*div+minValue)) {
00545         tft.pixel(k,s,color120);
00546     }
00547     tft.copy_to_lcd();
00548 }
00549 
00550 // Disegna la colorbar (Aggiungere etichette)
00551 void draw_colorbar(void)
00552 {
00553     tft.rect(1,290,180,320,White);
00554     tft.fillrect(177,291,179,318,color1);
00555     tft.fillrect(174,291,176,318,color3);
00556     tft.line(176,289,176,285,White);
00557     tft.fillrect(171,291,173,318,color5);
00558     tft.fillrect(168,291,170,318,color7);
00559     tft.fillrect(165,291,167,318,color9);
00560     tft.fillrect(162,291,164,318,color11);
00561     tft.fillrect(159,291,161,318,color13);
00562     tft.fillrect(156,291,158,318,color15);
00563     tft.line(161,289,161,285,White);
00564     tft.fillrect(153,291,155,318,color17);
00565     tft.fillrect(150,291,152,318,color19);
00566     tft.fillrect(147,291,149,318,color21);
00567     tft.fillrect(144,291,146,318,color23);
00568     tft.line(146,289,146,285,White);
00569     tft.fillrect(141,291,143,318,color25);
00570     tft.fillrect(138,291,140,318,color27);
00571     tft.fillrect(135,291,137,318,color29);
00572     tft.fillrect(132,291,134,318,color31);
00573     tft.line(131,289,131,285,White);
00574     tft.fillrect(129,291,131,318,color33);
00575     tft.fillrect(126,291,128,318,color35);
00576     tft.fillrect(123,291,125,318,color37);
00577     tft.fillrect(120,291,122,318,color39);
00578     tft.line(116,289,116,285,White);
00579     tft.fillrect(117,291,119,318,color41);
00580     tft.fillrect(114,291,116,318,color43);
00581     tft.fillrect(111,291,113,318,color45);
00582     tft.fillrect(108,291,110,318,color47);
00583     tft.fillrect(105,291,107,318,color49);
00584     tft.fillrect(102,291,104,318,color51);
00585     tft.line(101,289,101,285,White);
00586     tft.fillrect(99,291,101,318,color53);
00587     tft.fillrect(96,291,98,318,color55);
00588     tft.fillrect(93,291,95,318,color57);
00589     tft.fillrect(90,291,92,318,color59);
00590     tft.fillrect(87,291,89,318,color61);
00591     tft.line(86,289,86,285,White);
00592     tft.fillrect(84,291,86,318,color63);
00593     tft.fillrect(81,291,83,318,color65);
00594     tft.fillrect(78,291,80,318,color67);
00595     tft.fillrect(75,291,77,318,color69);
00596     tft.fillrect(72,291,74,318,color71);
00597     tft.line(71,289,71,285,White);
00598     tft.fillrect(69,291,71,318,color73);
00599     tft.fillrect(66,291,68,318,color75);
00600     tft.fillrect(63,291,65,318,color77);
00601     tft.fillrect(60,291,62,318,color79);
00602     tft.fillrect(57,291,59,318,color81);
00603     tft.line(56,289,56,285,White);
00604     tft.fillrect(54,291,56,318,color83);
00605     tft.fillrect(51,291,53,318,color85);
00606     tft.fillrect(48,291,50,318,color87);
00607     tft.fillrect(45,291,47,318,color89);
00608     tft.fillrect(42,291,44,318,color91);
00609     tft.line(41,289,41,285,White);
00610     tft.fillrect(39,291,41,318,color93);
00611     tft.fillrect(36,291,38,318,color95);
00612     tft.fillrect(33,291,35,318,color97);
00613     tft.fillrect(30,291,32,318,color99);
00614     tft.fillrect(27,291,29,318,color101);
00615     tft.line(26,289,26,285,White);
00616     tft.fillrect(24,291,26,318,color103);
00617     tft.fillrect(21,291,23,318,color105);
00618     tft.fillrect(18,291,20,318,color107);
00619     tft.fillrect(15,291,17,318,color109);
00620     tft.fillrect(12,291,14,318,color111);
00621     tft.line(11,289,11,285,White);
00622     tft.fillrect(9,291,11,318,color113);
00623     tft.fillrect(6,291,8,318,color115);
00624     tft.fillrect(2,291,5,318,color117);
00625 
00626     tft.copy_to_lcd();
00627 }
00628 
00629 //Setta i valori di temperatura corrispondenti ai colori della colorbar
00630 void Scale(float div,float min)
00631 {
00632     tft.set_font((unsigned char*) Arial_9);
00633     tft.set_orientation(1);
00634     tft.locate(35,6);
00635     tft.printf("%.2f",div*119+min);
00636     tft.locate(35,21);
00637     tft.printf("%.2f",div*111+min);
00638     tft.locate(35,36);
00639     tft.printf("%.2f",div*100+min);
00640     tft.locate(35,51);
00641     tft.printf("%.2f",div*89+min);
00642     tft.locate(35,66);
00643     tft.printf("%.2f",div*78+min);
00644     tft.locate(35,81);
00645     tft.printf("%.2f",div*67+min);
00646     tft.locate(35,96);
00647     tft.printf("%.2f",div*56+min);
00648     tft.locate(35,111);
00649     tft.printf("%.2f",div*45+min);
00650     tft.locate(35,126);
00651     tft.printf("%.2f",div*34+min);
00652     tft.locate(35,141);
00653     tft.printf("%.2f",div*23+min);
00654     tft.locate(35,156);
00655     tft.printf("%.2f",div*11+min);
00656     tft.locate(35,171);
00657     tft.printf("%.2f",div*1+min);
00658     tft.locate(100,190);
00659     tft.printf("Celsius Degree Scale");
00660 }
00661 
00662 
00663 //Funzione che rileva pressione Bottone
00664 void push_button()
00665 {
00666     save=!save;
00667 }
00668 
00669 
00670 
00671 //Funzione che estrapola i dati da salvare
00672 void data_save(uint16_t lepton_image [60][80])
00673 {
00674     // uint8_t minimo = 255;
00675     // uint8_t massimo = 0;
00676 
00677     //  for (int y =0; y < 60; y++) {
00678     //   for (int x = 0; x < 80; x++) {
00679     //     matrix1[y][x]=lepton_image[y][x]>>8;
00680     //   if (matrix1[y][x] > massimo) {
00681     //       massimo = matrix1[y][x];
00682     //   }
00683     //  if (matrix1[y][x] < minimo) {
00684     //       minimo = matrix1[y][x];
00685     //  }
00686     //}
00687     //}
00688 
00689 
00690     //bt.printf("ok");
00691     //int8_t diff = massimo - minimo;
00692     //float scale = (255 / diff);
00693 
00694     float v; // delta discretizzazione dei colori
00695     v=(maxValue-minValue)/59;
00696 
00697 
00698     int k;
00699 
00700     for (int y =0; y <60; y++) {
00701         k=0;
00702         //bt.printf("ok");
00703         for (int x = 0; x < 80; x++) {
00704             float value;
00705             value=T_image[y][x];
00706             Colormap(value,v);
00707             matrix_save(matrix,color,y,k);
00708             k=k+3;
00709         }
00710     }
00711 
00712     //bt.printf("Sono fuori dal for");
00713     //bt.printf("\n\r");
00714     //bt.printf("ok");
00715 }
00716 
00717 
00718 
00719 //Funzione che costruisce la matrice da slavare 60x240
00720 void matrix_save(uint8_t matrix [60][240],uint8_t value,int y, int k)
00721 {
00722     //const int *colormap = colormap_grayscale;
00723     matrix[y][k]=color;
00724     matrix[y][k+1]=color;
00725     matrix[y][k+2]=color;
00726 }
00727 
00728 
00729 //Funzione per il salvataggio su microSD
00730 void save_SD(uint8_t matrix[60][240])
00731 {
00732 
00733 
00734 
00735 
00736     int width=80;
00737     int height=60;
00738 
00739     unsigned long buf_stride = (((width * 4u) + 31u) & ~31u);
00740     unsigned long pic_size = buf_stride * height;
00741     f_mount(&SDFatFs, "", 0);
00742 
00743 //header
00744     uint8_t file[14] = {
00745         'B','M', // magic
00746         0,0,0,0, // size in bytes
00747         0,0, // app data
00748         0,0, // app data
00749         54,0,0,0 // start of data offset
00750     };
00751     uint8_t info[40] = {
00752         40,0,0,0, // info hd size
00753         80,0,0,0, // width
00754         60,0,0,0, // heigth
00755         1,0, // number color planes
00756         24,0, // bits per pixel
00757         0,0,0,0, // compression is none
00758         (uint8_t)(pic_size),(uint8_t)(pic_size)>>8,(uint8_t)(pic_size)>>16,(uint8_t)(pic_size)>>18, // image bits size
00759         0,0,0,0, // horz resoluition in pixel / m
00760         0,0,0,0, // vert resolutions (0x03C3 = 96 dpi, 0x0B13 = 72 dpi)
00761         0,0,0,0, // #colors in pallete
00762         0,0,0,0, // #important colors
00763     };
00764 
00765     char data[60];
00766     int num_char;
00767     cont=cont+1;
00768     num_char = sprintf(data, "termo_image_%d.bmp", cont);
00769 
00770     res=f_open(&MyFile, data,   FA_CREATE_ALWAYS| FA_WRITE );
00771     while(res!= FR_OK) {
00772         res=f_open(&MyFile, data,   FA_CREATE_ALWAYS| FA_WRITE);
00773         if(res!= FR_OK) {
00774             bt.printf("Failed to open file\n");
00775         }
00776     }
00777 
00778 
00779     res=f_write(&MyFile, (uint8_t *)file, 14, &bytesread);
00780     if(res!= FR_OK) {
00781         bt.printf("Failed to write file (file)\n");
00782     }
00783 
00784 
00785     res=f_write(&MyFile, (uint8_t *)info, 40, &bytesread);
00786     if(res!= FR_OK) {
00787         bt.printf("Failed to write file (info)\n");
00788     }
00789 
00790     res=f_write(&MyFile, (uint8_t *)matrix,14400, &bytesread);
00791     if(res!= FR_OK) {
00792         bt.printf("Failed to write file (data)\n");
00793     }
00794 
00795     f_sync(&MyFile);
00796     f_close(&MyFile);
00797     f_mount(NULL, "", 0);
00798     bt.printf("HO FINITO DI SALVARE");
00799 
00800 
00801 }
00802 
00803 
00804 
00805 void calcola(void)
00806 {
00807     a3=float(T_image[x2][y2]-T_image[x2][y2]-T_image[x1][y2]+T_image[x1][y1])/(-y1*(x2-x1)-x1*(y2-y1)+(x2*y2-x1*y1));
00808     a2=float(T_image[x1][y2]-T_image[x1][y1]-x1*(y2-y1)*a3)/((y2-y1));
00809     a1=float(T_image[x2][y1]-T_image[x1][y1]-y1*a3*(x2-x1))/(x2-x1);
00810     a0=T_image[x1][y1]-a1*x1-y1*a2-a3*x1*y1;
00811 }
00812 
00813 void Colormap(float value,float div)
00814 {
00815     if(value<=(div+minValue)) {
00816         color=0;
00817     } else if(value>(1*div+minValue) &  value<=2*div+minValue ) {
00818         color=20;
00819     } else if(value>(2*div+minValue) &  value<=3*div+minValue ) {
00820         color=24;
00821     } else if(value>(3*div+minValue) &  value<=4*div+minValue ) {
00822         color=28;
00823     } else if(value>(4*div+minValue) &  value<=5*div+minValue ) {
00824         color=32;
00825     } else if(value>(5*div+minValue) &  value<=6*div+minValue ) {
00826         color=36;
00827     } else if(value>(6*div+minValue) &  value<=7*div+minValue ) {
00828         color=40;
00829     } else if(value>(7*div+minValue) &  value<=8*div+minValue ) {
00830         color=44;
00831     } else if(value>(8*div+minValue) &  value<=9*div+minValue ) {
00832         color=48;
00833     } else if(value>(9*div+minValue) &  value<=10*div+minValue ) {
00834         color=52;
00835     } else if(value>(10*div+minValue) &  value<=11*div+minValue ) {
00836         color=56;
00837     } else if(value>(11*div+minValue) &  value<=12*div+minValue ) {
00838         color=60;
00839     } else if(value>(12*div+minValue) &  value<=13*div+minValue ) {
00840         color=64;
00841     } else if(value>(13*div+minValue) &  value<=14*div+minValue ) {
00842         color=68;
00843     } else if(value>(14*div+minValue) &  value<=15*div+minValue ) {
00844         color=72;
00845     } else if(value>(15*div+minValue) &  value<=16*div+minValue ) {
00846         color=76;
00847     } else if(value>(16*div+minValue) &  value<=17*div+minValue ) {
00848         color=80;
00849     } else if(value>(17*div+minValue) &  value<=18*div+minValue ) {
00850         color=84;
00851     } else if(value>(18*div+minValue) &  value<=19*div+minValue ) {
00852         color=88;
00853     } else if(value>(19*div+minValue) &  value<=20*div+minValue ) {
00854         color=92;
00855     } else if(value>(20*div+minValue) &  value<=21*div+minValue ) {
00856         color=96;
00857     } else if(value>(21*div+minValue) &  value<=22*div+minValue ) {
00858         color=100;
00859     } else if(value>(22*div+minValue) &  value<=23*div+minValue ) {
00860         color=104;
00861     } else if(value>(23*div+minValue) &  value<=24*div+minValue ) {
00862         color=108;
00863     } else if(value>(24*div+minValue) &  value<=25*div+minValue ) {
00864         color=112;
00865     } else if(value>(25*div+minValue) &  value<=26*div+minValue ) {
00866         color=116;
00867     } else if(value>(26*div+minValue) &  value<=27*div+minValue ) {
00868         color=120;
00869     } else if(value>(27*div+minValue) &  value<=28*div+minValue ) {
00870         color=124;
00871     } else if(value>(28*div+minValue) &  value<=29*div+minValue ) {
00872         color=128;
00873     } else if(value>(29*div+minValue) &  value<=30*div+minValue ) {
00874         color=132;
00875     } else if(value>(30*div+minValue) &  value<=31*div+minValue ) {
00876         color=136;
00877     } else if(value>(31*div+minValue) &  value<=32*div+minValue ) {
00878         color=140;
00879     } else if(value>(32*div+minValue) &  value<=33*div+minValue ) {
00880         color=144;
00881     } else if(value>(33*div+minValue) &  value<=34*div+minValue ) {
00882         color=148;
00883     } else if(value>(34*div+minValue) &  value<=35*div+minValue ) {
00884         color=152;
00885     } else if(value>(35*div+minValue) &  value<=36*div+minValue ) {
00886         color=156;
00887     } else if(value>(36*div+minValue) &  value<=37*div+minValue ) {
00888         color=160;
00889     } else if(value>(37*div+minValue) &  value<=38*div+minValue ) {
00890         color=164;
00891     } else if(value>(38*div+minValue) &  value<=39*div+minValue ) {
00892         color=168;
00893     } else if(value>(39*div+minValue) &  value<=40*div+minValue ) {
00894         color=172;
00895     } else if(value>(40*div+minValue) &  value<=41*div+minValue ) {
00896         color=176;
00897     } else if(value>(41*div+minValue) &  value<=42*div+minValue ) {
00898         color=180;
00899     } else if(value>(42*div+minValue) &  value<=43*div+minValue ) {
00900         color=184;
00901     } else if(value>(43*div+minValue) &  value<=44*div+minValue ) {
00902         color=188;
00903     } else if(value>(44*div+minValue) &  value<=45*div+minValue ) {
00904         color=192;
00905     } else if(value>(45*div+minValue) &  value<=46*div+minValue ) {
00906         color=196;
00907     } else if(value>(46*div+minValue) &  value<=47*div+minValue ) {
00908         color=200;
00909     } else if(value>(47*div+minValue) &  value<=48*div+minValue ) {
00910         color=204;
00911     } else if(value>(48*div+minValue) &  value<=49*div+minValue ) {
00912         color=208;
00913     } else if(value>(49*div+minValue) &  value<=50*div+minValue ) {
00914         color=212;
00915     } else if(value>(50*div+minValue) &  value<=51*div+minValue ) {
00916         color=216;
00917     } else if(value>(51*div+minValue) &  value<=52*div+minValue ) {
00918         color=220;
00919     } else if(value>(52*div+minValue) &  value<=53*div+minValue ) {
00920         color=224;
00921     } else if(value>(53*div+minValue) &  value<=54*div+minValue ) {
00922         color=228;
00923     } else if(value>(54*div+minValue) &  value<=55*div+minValue ) {
00924         color=232;
00925     } else if(value>(55*div+minValue) &  value<=56*div+minValue ) {
00926         color=236;
00927     } else if(value>(56*div+minValue) &  value<=57*div+minValue ) {
00928         color=240;
00929     } else if(value>(57*div+minValue) &  value<=58*div+minValue ) {
00930         color=244;
00931     } else if(value>(58*div+minValue)) {
00932         color=248;
00933     }
00934 
00935 }