Lepton sensor on the DISCO-F746NG board. Based on the rapberry_pi example code at https://github.com/groupgets/LeptonModule

Dependencies:   mbed-src BSP_DISCO_F746NG LCD_DISCO_F746NG

Committer:
pryd
Date:
Wed Dec 09 15:16:11 2015 +0000
Revision:
7:c0f3fc856506
Parent:
6:5c25567a46df
Child:
8:f57dc76095f3
Coffe break...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pryd 0:291e05a4e8e9 1 #include "mbed.h"
Patrik Ryd 4:15c97a3e1995 2 #include "palettes.h"
pryd 7:c0f3fc856506 3 #include "LCD_DISCO_F746NG.h"
pryd 0:291e05a4e8e9 4
Patrik Ryd 4:15c97a3e1995 5 #define BYTES_PER_PACKET (164)
Patrik Ryd 4:15c97a3e1995 6 #define DATA_PER_PACKET (BYTES_PER_PACKET/2)
Patrik Ryd 4:15c97a3e1995 7 #define PACKETS_PER_FRAME (60)
pryd 0:291e05a4e8e9 8
pryd 0:291e05a4e8e9 9 Serial pc(USBTX, USBRX);
pryd 0:291e05a4e8e9 10 SPI lepton_spi(SPI_MOSI, SPI_MISO, SPI_SCK);
pryd 0:291e05a4e8e9 11 DigitalOut spi_cs(SPI_CS);
Patrik Ryd 6:5c25567a46df 12 LCD_DISCO_F746NG lcd;
pryd 0:291e05a4e8e9 13
Patrik Ryd 4:15c97a3e1995 14 static uint8_t lepton_buffer[BYTES_PER_PACKET * PACKETS_PER_FRAME];
pryd 7:c0f3fc856506 15 static uint32_t lepton_image[80][60];
pryd 0:291e05a4e8e9 16
Patrik Ryd 2:a0eb7bff9571 17 void setup(void)
Patrik Ryd 2:a0eb7bff9571 18 {
Patrik Ryd 2:a0eb7bff9571 19 lepton_spi.format(8,3);
Patrik Ryd 2:a0eb7bff9571 20 lepton_spi.frequency(20000000);
Patrik Ryd 2:a0eb7bff9571 21 spi_cs = 1;
Patrik Ryd 2:a0eb7bff9571 22 spi_cs = 0;
Patrik Ryd 2:a0eb7bff9571 23 spi_cs = 1;
Patrik Ryd 2:a0eb7bff9571 24 wait_ms(185);
Patrik Ryd 6:5c25567a46df 25 lcd.Clear(LCD_COLOR_BLACK);
Patrik Ryd 2:a0eb7bff9571 26 }
Patrik Ryd 2:a0eb7bff9571 27
Patrik Ryd 2:a0eb7bff9571 28 void get_frame(void)
Patrik Ryd 2:a0eb7bff9571 29 {
pryd 7:c0f3fc856506 30 int p;
Patrik Ryd 4:15c97a3e1995 31 int i;
Patrik Ryd 4:15c97a3e1995 32 int packet_num;
pryd 7:c0f3fc856506 33
pryd 7:c0f3fc856506 34 spi_cs = 0;
Patrik Ryd 4:15c97a3e1995 35
Patrik Ryd 4:15c97a3e1995 36 // No error handling. Assume we don't loose any packets
pryd 7:c0f3fc856506 37 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 38 for(i=0; i<BYTES_PER_PACKET; i++) {
pryd 7:c0f3fc856506 39 lepton_buffer[p*BYTES_PER_PACKET + i] = lepton_spi.write(0x00);
Patrik Ryd 4:15c97a3e1995 40 }
pryd 7:c0f3fc856506 41 packet_num = lepton_buffer[p*BYTES_PER_PACKET + 1];
pryd 7:c0f3fc856506 42 if(packet_num != p) {
pryd 7:c0f3fc856506 43 //pc.printf("-");
pryd 7:c0f3fc856506 44 i = -1;
pryd 7:c0f3fc856506 45 p = -1;
pryd 7:c0f3fc856506 46 wait_ms(1);
pryd 7:c0f3fc856506 47 } else {
pryd 7:c0f3fc856506 48 //pc.printf("+");
Patrik Ryd 4:15c97a3e1995 49 }
Patrik Ryd 4:15c97a3e1995 50 }
Patrik Ryd 4:15c97a3e1995 51
pryd 7:c0f3fc856506 52 spi_cs = 1;
Patrik Ryd 2:a0eb7bff9571 53 }
Patrik Ryd 2:a0eb7bff9571 54
Patrik Ryd 4:15c97a3e1995 55 void create_image(void)
Patrik Ryd 4:15c97a3e1995 56 {
Patrik Ryd 4:15c97a3e1995 57 uint16_t min_val = 65535;
Patrik Ryd 4:15c97a3e1995 58 uint16_t max_val = 0;
Patrik Ryd 4:15c97a3e1995 59 uint16_t value;
Patrik Ryd 4:15c97a3e1995 60 int column;
Patrik Ryd 4:15c97a3e1995 61 int row;
Patrik Ryd 4:15c97a3e1995 62 int i;
pryd 7:c0f3fc856506 63 int p;
Patrik Ryd 4:15c97a3e1995 64
pryd 7:c0f3fc856506 65 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 66 for(i=0; i<DATA_PER_PACKET; i++) {
pryd 7:c0f3fc856506 67 if(i % DATA_PER_PACKET < 2) {
pryd 7:c0f3fc856506 68 continue;
pryd 7:c0f3fc856506 69 }
pryd 7:c0f3fc856506 70 value = lepton_buffer[p*BYTES_PER_PACKET+i*2+1] < 8 + lepton_buffer[p*BYTES_PER_PACKET+i*2+0];
pryd 7:c0f3fc856506 71 if(value > max_val) {
pryd 7:c0f3fc856506 72 max_val = value;
pryd 7:c0f3fc856506 73 }
pryd 7:c0f3fc856506 74 if(value < min_val) {
pryd 7:c0f3fc856506 75 min_val = value;
pryd 7:c0f3fc856506 76 }
Patrik Ryd 4:15c97a3e1995 77 }
Patrik Ryd 4:15c97a3e1995 78 }
pryd 7:c0f3fc856506 79
Patrik Ryd 4:15c97a3e1995 80 float diff = max_val - min_val;
Patrik Ryd 4:15c97a3e1995 81 float scale = 255/diff;
Patrik Ryd 4:15c97a3e1995 82 uint8_t r;
Patrik Ryd 4:15c97a3e1995 83 uint8_t g;
Patrik Ryd 4:15c97a3e1995 84 uint8_t b;
Patrik Ryd 4:15c97a3e1995 85
pryd 7:c0f3fc856506 86 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 87 for(i=0; i<DATA_PER_PACKET; i++) {
pryd 7:c0f3fc856506 88 if(i % DATA_PER_PACKET < 2) {
pryd 7:c0f3fc856506 89 continue;
pryd 7:c0f3fc856506 90 }
pryd 7:c0f3fc856506 91 #if 0
pryd 7:c0f3fc856506 92 value = lepton_buffer[p*BYTES_PER_PACKET+i*2+1] < 8 + lepton_buffer[p*BYTES_PER_PACKET+i*2+0];
pryd 7:c0f3fc856506 93 column = (i % DATA_PER_PACKET ) - 2;
pryd 7:c0f3fc856506 94 row = i / DATA_PER_PACKET;
pryd 7:c0f3fc856506 95
pryd 7:c0f3fc856506 96 value = (value - min_val) / scale;
pryd 7:c0f3fc856506 97 r = colormap_ironblack[3*value];
pryd 7:c0f3fc856506 98 g = colormap_ironblack[3*value+1];
pryd 7:c0f3fc856506 99 b = colormap_ironblack[3*value+2];
pryd 7:c0f3fc856506 100
pryd 7:c0f3fc856506 101 lepton_image[row][column] = (0xFF << 24) | (r << 16) | (g << 8) | b;
pryd 7:c0f3fc856506 102 #endif
pryd 7:c0f3fc856506 103 lepton_image[row][column] = (0xFF << 24) | (value % 255) << 16 | (value % 255) << 8 | (value % 255);
Patrik Ryd 4:15c97a3e1995 104 }
pryd 7:c0f3fc856506 105 }
pryd 7:c0f3fc856506 106 }
Patrik Ryd 4:15c97a3e1995 107
pryd 7:c0f3fc856506 108 void dummy_image(void)
pryd 7:c0f3fc856506 109 {
pryd 7:c0f3fc856506 110 int column;
pryd 7:c0f3fc856506 111 int row;
Patrik Ryd 6:5c25567a46df 112
pryd 7:c0f3fc856506 113 for(row=0; row<80; row++) {
pryd 7:c0f3fc856506 114 for(column=0; column<60; column++) {
pryd 7:c0f3fc856506 115 lepton_image[row][column] = (0xFF << 24) | (row << 16) | (column << 8);
pryd 7:c0f3fc856506 116 }
Patrik Ryd 4:15c97a3e1995 117 }
Patrik Ryd 4:15c97a3e1995 118 }
Patrik Ryd 4:15c97a3e1995 119
Patrik Ryd 6:5c25567a46df 120 void show_image(void)
Patrik Ryd 6:5c25567a46df 121 {
Patrik Ryd 6:5c25567a46df 122 int column;
Patrik Ryd 6:5c25567a46df 123 int row;
Patrik Ryd 6:5c25567a46df 124
pryd 7:c0f3fc856506 125 for(row=0; row<80; row++) {
pryd 7:c0f3fc856506 126 for(column=0; column<60; column++) {
Patrik Ryd 6:5c25567a46df 127 lcd.SetTextColor(lepton_image[row][column]);
pryd 7:c0f3fc856506 128 lcd.FillRect(row*4, column*4, 4, 4);
Patrik Ryd 6:5c25567a46df 129 }
Patrik Ryd 6:5c25567a46df 130 }
Patrik Ryd 6:5c25567a46df 131 }
Patrik Ryd 6:5c25567a46df 132
pryd 7:c0f3fc856506 133 void dump_frame(void)
pryd 7:c0f3fc856506 134 {
pryd 7:c0f3fc856506 135 int i;
pryd 7:c0f3fc856506 136 int p;
pryd 7:c0f3fc856506 137
pryd 7:c0f3fc856506 138 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 139 pc.printf("\n\nPacket %d:\n", p);
pryd 7:c0f3fc856506 140 for(i=0; i<DATA_PER_PACKET; i++) {
pryd 7:c0f3fc856506 141 pc.printf("%x ", lepton_buffer[p*BYTES_PER_PACKET+i]);
pryd 7:c0f3fc856506 142 }
pryd 7:c0f3fc856506 143 }
pryd 7:c0f3fc856506 144 }
Patrik Ryd 6:5c25567a46df 145
pryd 0:291e05a4e8e9 146 int main()
pryd 0:291e05a4e8e9 147 {
pryd 0:291e05a4e8e9 148 pc.printf("Alive\n");
Patrik Ryd 6:5c25567a46df 149 setup();
Patrik Ryd 6:5c25567a46df 150 pc.printf("Up...\n");
Patrik Ryd 6:5c25567a46df 151
pryd 7:c0f3fc856506 152 while(1) {
Patrik Ryd 6:5c25567a46df 153 get_frame();
pryd 7:c0f3fc856506 154 dump_frame();
pryd 7:c0f3fc856506 155 //create_image();
pryd 7:c0f3fc856506 156 //dummy_image();
Patrik Ryd 6:5c25567a46df 157 show_image();
Patrik Ryd 6:5c25567a46df 158 }
pryd 0:291e05a4e8e9 159 }