#include <SPI.h>
#define VOSPI_FRAME_SIZE (60)
#define VOSPI_PACKET_SIZE (164)
int lepton_frame_packet[VOSPI_FRAME_SIZE][VOSPI_PACKET_SIZE];
int segment_line=0;
int segment_print=0;
int package_line[VOSPI_FRAME_SIZE];
int disc_cont=0,inva_timeout=0;
void setup()
{
delay(5000);
Serial.begin(12000000);
pinMode(10, OUTPUT);
pinMode(3, INPUT);
SPI.begin();
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE3));
Serial.println("setup complete");
digitalWrite(10, HIGH);
}
void read_lepton_frame(void)
{
int i ,j;
disc_cont =0;
for(j = 0; j < (VOSPI_FRAME_SIZE); j++){
digitalWrite(10, LOW);
for (i = 0; i < (VOSPI_PACKET_SIZE); i++){
lepton_frame_packet[j][i] = SPI.transfer(0x00);
}
digitalWrite(10, HIGH);
package_line[j] = ((lepton_frame_packet[j][0] & 0x0f) <<8) | lepton_frame_packet[j][1];
if(package_line[j]>60){
disc_cont++;
if(disc_cont < 30){
j--;
}
else if(disc_cont == 20) {
inva_timeout++;
segment_line = 0;
}
}
else{
if(package_line[j] == 20){
segment_line = (lepton_frame_packet[j][0] & 0x70) >> 4;
if(segment_line == 1){
frame_flag=1;
inva_timeout=0;
}
else if(segment_line == 0 || segment_line>4){
inva_timeout++;
}
}
}
//7u sec packet delaytime
delayMicroseconds(3);
}
}
void print_lepton_frame_data(void)
{
int i,j;
Serial.write(0xFF);
Serial.write(0xFF);
Serial.write(0xFF);
Serial.write(segment_line);
for (j = 0; j < VOSPI_FRAME_SIZE; j++){
for (i = 0; i < VOSPI_PACKET_SIZE; i++){
Serial.write(lepton_frame_packet[j][i]);
}
}
}
void loop()
{
if (digitalRead(3) == HIGH){
if(inva_timeout > 20){
delay(200);
inva_timeout=0;
}
else{
read_lepton_frame();
if(segment_line>0 && segment_line<5 && disc_cont<20){
print_lepton_frame_data();
segment_line=0;
}
}
}
}