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 16:18:08 2015 +0000
Revision:
8:f57dc76095f3
Parent:
7:c0f3fc856506
Child:
9:74e00a8d537f
Working!!

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 8:f57dc76095f3 70 value = (lepton_buffer[p*BYTES_PER_PACKET+i*2+0] << 8) + lepton_buffer[p*BYTES_PER_PACKET+i*2+1];
pryd 8:f57dc76095f3 71 //pc.printf("val = %d\n",value);
pryd 7:c0f3fc856506 72 if(value > max_val) {
pryd 7:c0f3fc856506 73 max_val = value;
pryd 7:c0f3fc856506 74 }
pryd 7:c0f3fc856506 75 if(value < min_val) {
pryd 7:c0f3fc856506 76 min_val = value;
pryd 7:c0f3fc856506 77 }
Patrik Ryd 4:15c97a3e1995 78 }
Patrik Ryd 4:15c97a3e1995 79 }
pryd 8:f57dc76095f3 80
pryd 8:f57dc76095f3 81 //pc.printf("max %d, min %d\n", max_val, min_val);
pryd 7:c0f3fc856506 82
Patrik Ryd 4:15c97a3e1995 83 float diff = max_val - min_val;
Patrik Ryd 4:15c97a3e1995 84 float scale = 255/diff;
Patrik Ryd 4:15c97a3e1995 85 uint8_t r;
Patrik Ryd 4:15c97a3e1995 86 uint8_t g;
Patrik Ryd 4:15c97a3e1995 87 uint8_t b;
Patrik Ryd 4:15c97a3e1995 88
pryd 7:c0f3fc856506 89 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 90 for(i=0; i<DATA_PER_PACKET; i++) {
pryd 7:c0f3fc856506 91 if(i % DATA_PER_PACKET < 2) {
pryd 7:c0f3fc856506 92 continue;
pryd 7:c0f3fc856506 93 }
pryd 8:f57dc76095f3 94 value = (lepton_buffer[p*BYTES_PER_PACKET+i*2+0] << 8) + lepton_buffer[p*BYTES_PER_PACKET+i*2+1];
pryd 8:f57dc76095f3 95
pryd 7:c0f3fc856506 96 column = (i % DATA_PER_PACKET ) - 2;
pryd 8:f57dc76095f3 97 row = p;
pryd 8:f57dc76095f3 98 #if 1
pryd 8:f57dc76095f3 99 value = (value - min_val) * scale;
pryd 8:f57dc76095f3 100 //pc.printf("val = %d\n", value);
pryd 7:c0f3fc856506 101 r = colormap_ironblack[3*value];
pryd 7:c0f3fc856506 102 g = colormap_ironblack[3*value+1];
pryd 7:c0f3fc856506 103 b = colormap_ironblack[3*value+2];
pryd 7:c0f3fc856506 104
pryd 7:c0f3fc856506 105 lepton_image[row][column] = (0xFF << 24) | (r << 16) | (g << 8) | b;
pryd 8:f57dc76095f3 106 #else
pryd 8:f57dc76095f3 107 lepton_image[row][column] = (0xFF << 24) | (value % 255) << 16 | (value % 255) << 8 | (value % 255);
pryd 7:c0f3fc856506 108 #endif
Patrik Ryd 4:15c97a3e1995 109 }
pryd 7:c0f3fc856506 110 }
pryd 7:c0f3fc856506 111 }
Patrik Ryd 4:15c97a3e1995 112
pryd 7:c0f3fc856506 113 void dummy_image(void)
pryd 7:c0f3fc856506 114 {
pryd 7:c0f3fc856506 115 int column;
pryd 7:c0f3fc856506 116 int row;
Patrik Ryd 6:5c25567a46df 117
pryd 7:c0f3fc856506 118 for(row=0; row<80; row++) {
pryd 7:c0f3fc856506 119 for(column=0; column<60; column++) {
pryd 7:c0f3fc856506 120 lepton_image[row][column] = (0xFF << 24) | (row << 16) | (column << 8);
pryd 7:c0f3fc856506 121 }
Patrik Ryd 4:15c97a3e1995 122 }
Patrik Ryd 4:15c97a3e1995 123 }
Patrik Ryd 4:15c97a3e1995 124
Patrik Ryd 6:5c25567a46df 125 void show_image(void)
Patrik Ryd 6:5c25567a46df 126 {
Patrik Ryd 6:5c25567a46df 127 int column;
Patrik Ryd 6:5c25567a46df 128 int row;
Patrik Ryd 6:5c25567a46df 129
pryd 7:c0f3fc856506 130 for(row=0; row<80; row++) {
pryd 7:c0f3fc856506 131 for(column=0; column<60; column++) {
Patrik Ryd 6:5c25567a46df 132 lcd.SetTextColor(lepton_image[row][column]);
pryd 7:c0f3fc856506 133 lcd.FillRect(row*4, column*4, 4, 4);
Patrik Ryd 6:5c25567a46df 134 }
Patrik Ryd 6:5c25567a46df 135 }
Patrik Ryd 6:5c25567a46df 136 }
Patrik Ryd 6:5c25567a46df 137
pryd 7:c0f3fc856506 138 void dump_frame(void)
pryd 7:c0f3fc856506 139 {
pryd 7:c0f3fc856506 140 int i;
pryd 7:c0f3fc856506 141 int p;
pryd 7:c0f3fc856506 142
pryd 7:c0f3fc856506 143 for(p=0; p<PACKETS_PER_FRAME; p++) {
pryd 7:c0f3fc856506 144 pc.printf("\n\nPacket %d:\n", p);
pryd 8:f57dc76095f3 145 for(i=0; i<BYTES_PER_PACKET; i++) {
pryd 7:c0f3fc856506 146 pc.printf("%x ", lepton_buffer[p*BYTES_PER_PACKET+i]);
pryd 7:c0f3fc856506 147 }
pryd 7:c0f3fc856506 148 }
pryd 7:c0f3fc856506 149 }
Patrik Ryd 6:5c25567a46df 150
pryd 0:291e05a4e8e9 151 int main()
pryd 0:291e05a4e8e9 152 {
pryd 0:291e05a4e8e9 153 pc.printf("Alive\n");
Patrik Ryd 6:5c25567a46df 154 setup();
Patrik Ryd 6:5c25567a46df 155 pc.printf("Up...\n");
Patrik Ryd 6:5c25567a46df 156
pryd 7:c0f3fc856506 157 while(1) {
Patrik Ryd 6:5c25567a46df 158 get_frame();
pryd 8:f57dc76095f3 159 //dump_frame();
pryd 8:f57dc76095f3 160 create_image();
pryd 7:c0f3fc856506 161 //dummy_image();
Patrik Ryd 6:5c25567a46df 162 show_image();
Patrik Ryd 6:5c25567a46df 163 }
pryd 0:291e05a4e8e9 164 }