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
main.cpp@8:f57dc76095f3, 2015-12-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |