From 7694802ab212f2a96dfc7177bf1f6db7fee69abf Mon Sep 17 00:00:00 2001 From: da-nie Date: Sat, 24 Mar 2018 11:48:01 +0300 Subject: [PATCH] Created version for Lepton 3 and Raspberry Pi. Used SPI 1! --- software/raspberrypi_lepton3_video/.gitignore | 7 + software/raspberrypi_lepton3_video/Grey.pal | Bin 0 -> 768 bytes software/raspberrypi_lepton3_video/Iron.pal | Bin 0 -> 768 bytes .../LeptonThread.cpp | 135 +++++++++++++ .../raspberrypi_lepton3_video/LeptonThread.h | 43 ++++ .../raspberrypi_lepton3_video/Lepton_I2C.cpp | 24 +++ .../raspberrypi_lepton3_video/Lepton_I2C.h | 6 + .../raspberrypi_lepton3_video/MyLabel.cpp | 16 ++ software/raspberrypi_lepton3_video/MyLabel.h | 24 +++ .../raspberrypi_lepton3_video/MyLabel.h.save | 25 +++ .../raspberrypi_lepton3_video/Palettes.cpp | 7 + software/raspberrypi_lepton3_video/Palettes.h | 8 + software/raspberrypi_lepton3_video/README.md | 26 +++ .../raspberrypi_lepton3_video/Rainbow.pal | Bin 0 -> 768 bytes software/raspberrypi_lepton3_video/SPI.cpp | 114 +++++++++++ software/raspberrypi_lepton3_video/SPI.h | 37 ++++ .../raspberrypi_lepton3_video/connected.png | Bin 0 -> 13424 bytes .../leptoncontrol.cpp | 184 ++++++++++++++++++ .../raspberrypi_lepton3_video/leptoncontrol.h | 26 +++ software/raspberrypi_lepton3_video/main.cpp | 56 ++++++ .../raspberrypi_video.pro | 30 +++ 21 files changed, 768 insertions(+) create mode 100644 software/raspberrypi_lepton3_video/.gitignore create mode 100644 software/raspberrypi_lepton3_video/Grey.pal create mode 100644 software/raspberrypi_lepton3_video/Iron.pal create mode 100644 software/raspberrypi_lepton3_video/LeptonThread.cpp create mode 100644 software/raspberrypi_lepton3_video/LeptonThread.h create mode 100644 software/raspberrypi_lepton3_video/Lepton_I2C.cpp create mode 100644 software/raspberrypi_lepton3_video/Lepton_I2C.h create mode 100644 software/raspberrypi_lepton3_video/MyLabel.cpp create mode 100644 software/raspberrypi_lepton3_video/MyLabel.h create mode 100644 software/raspberrypi_lepton3_video/MyLabel.h.save create mode 100644 software/raspberrypi_lepton3_video/Palettes.cpp create mode 100644 software/raspberrypi_lepton3_video/Palettes.h create mode 100644 software/raspberrypi_lepton3_video/README.md create mode 100644 software/raspberrypi_lepton3_video/Rainbow.pal create mode 100644 software/raspberrypi_lepton3_video/SPI.cpp create mode 100644 software/raspberrypi_lepton3_video/SPI.h create mode 100644 software/raspberrypi_lepton3_video/connected.png create mode 100644 software/raspberrypi_lepton3_video/leptoncontrol.cpp create mode 100644 software/raspberrypi_lepton3_video/leptoncontrol.h create mode 100644 software/raspberrypi_lepton3_video/main.cpp create mode 100644 software/raspberrypi_lepton3_video/raspberrypi_video.pro diff --git a/software/raspberrypi_lepton3_video/.gitignore b/software/raspberrypi_lepton3_video/.gitignore new file mode 100644 index 0000000..b5e01e7 --- /dev/null +++ b/software/raspberrypi_lepton3_video/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +Makefile +gen_objs +gen_mocs +*.o +raspberrypi_video + diff --git a/software/raspberrypi_lepton3_video/Grey.pal b/software/raspberrypi_lepton3_video/Grey.pal new file mode 100644 index 0000000000000000000000000000000000000000..ee8b9e6b17101c192048894621efc4c2e48ce742 GIT binary patch literal 768 zcmV+b1ONO0000320RjR70|NsD1Ox>I1qKEN2L}fT2nY!Y2?`1d3kwSj3=9no4Gs87#JBD85$ZI8yg!O92^}T9UdMYA0Hne zARr+jAtE9oBO@auBqSvzB_<{&CnqN;C@3i@DJm)|D=RB3EG#W8EiNuDFE1}JFfcJO zF)}hTGcz+ZG&D6eH8wUjH#avpI5;^uIXXHzJ3Bi(JUl%;Jw84@KR-V}KtMr3K|(@8 zLqkJEL_|eJMMg$OM@L6UNJvRZNlHpeOG`^kOiWEpO-@cuPft%!P*71(QBqP;Q&Uq^ zR8&<}RaRD3S65e9SXfzESz20JTU%RPTwGmUU0z;ZUteEfU|?ZkVPaxpV`F1vWMpM! zWoBk(XJ=<Cc=sHmx_sj8}~ ztE;Q5tgNlAt*)-FudlDLu&}YQv9hwVv$M0bw6wLgwYIjlx3{;rxVX8wxw^W#ySux* zyu7`=y}rJ_zrVl0z`()5!NS7A!^6YG#KgtL#m2_Q$H&LW$jHgb$;!&g%gf8m%*@Tr z&Cbrw&(F`$(9qG*(bCe=)6>(`)YR40)z;S5*VotB*x1?G+1lFL+uPgR+}z#W-QM2b z-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6?CkCB?e6aG@9*#M y@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|$`}_O+{QUj>{r>*`|NsA)Vt$YS literal 0 HcmV?d00001 diff --git a/software/raspberrypi_lepton3_video/Iron.pal b/software/raspberrypi_lepton3_video/Iron.pal new file mode 100644 index 0000000000000000000000000000000000000000..16d38041a7b51143db42cec8bd46c83b46460690 GIT binary patch literal 768 zcmWN;2~bpZ9KiAK+XGe(kI*Ek%u>eDDYc}WWGrkPatz1R^1cUB2gi$IC{)5o0zq71 z+2!#j(XHKCSqG zR(#0fI&3LAVl6sqD>`N`JZ|4|!tOj7~H@Reudwar5QmzXvY96`fc@zf1yWC2&bPu1jaRbXAC1C1$Ot MdQmMR?IMBy0A&kn-v9sr literal 0 HcmV?d00001 diff --git a/software/raspberrypi_lepton3_video/LeptonThread.cpp b/software/raspberrypi_lepton3_video/LeptonThread.cpp new file mode 100644 index 0000000..2126890 --- /dev/null +++ b/software/raspberrypi_lepton3_video/LeptonThread.cpp @@ -0,0 +1,135 @@ +#include "LeptonThread.h" + +#include "Palettes.h" +#include "SPI.h" +#include "Lepton_I2C.h" +#include +#include + +#define FPS 27; + +#define SPI_PORT_INDEX 1 +#define SPI_PORT_HANDLE spi_cs1_fd +#define SPI_READ_VOSPI_AMOUNT 59 + +LeptonThread::LeptonThread():QThread() +{ + //ôîðìèðóåì ïàëèòðó ïî-óìîë÷àíèþ + for(long n=0;n<256;n++) + { + ColorMap_R[n]=n; + ColorMap_G[n]=n; + ColorMap_B[n]=n; + } +} + +LeptonThread::~LeptonThread() +{ +} + +//---------------------------------------------------------------------------------------------------- +//çàãðóçèòü ïàëèòðó +//---------------------------------------------------------------------------------------------------- +bool LeptonThread::LoadPalette(const char *file_name) +{ + FILE *file=fopen(file_name,"rb"); + if (file==NULL) return(false); + for(long n=0;n<256;n++) + { + unsigned char r; + unsigned char g; + unsigned char b; + if (fread(&r,sizeof(unsigned char),1,file)<=0) break; + if (fread(&g,sizeof(unsigned char),1,file)<=0) break; + if (fread(&b,sizeof(unsigned char),1,file)<=0) break; + ColorMap_R[n]=r; + ColorMap_G[n]=g; + ColorMap_B[n]=b; + } + fclose(file); + return(true); +} + +void LeptonThread::CreateImage(void) +{ + unsigned short *raw14_ptr=LEPTONCONTROL_GetRAW14Ptr(); + unsigned long min=0x10000; + unsigned long max=0; + unsigned long y; + unsigned long x; + unsigned short *raw14_local_ptr; + raw14_local_ptr=raw14_ptr; + unsigned long width=LEPTON_ORIGINAL_IMAGE_WIDTH; + unsigned long height=LEPTON_ORIGINAL_IMAGE_HEIGHT; + for(y=0;ymax) max=raw14; + if (raw14255) value=255; + if (value<0) value=0; + color=qRgb(ColorMap_R[value],ColorMap_G[value],ColorMap_B[value]); + myImage.setPixel(x,y,color); + } + } +} + +void LeptonThread::run() +{ + LEPTONCONTROL_Init(); + //çàãðóæàåì ïàëèòðó + LoadPalette("./Iron.pal"); + //create the initial image + myImage=QImage(LEPTON_ORIGINAL_IMAGE_WIDTH,LEPTON_ORIGINAL_IMAGE_HEIGHT,QImage::Format_RGB888); + unsigned char buffer[VOSPI_PACKAGE_SIZE*SPI_READ_VOSPI_AMOUNT]; + //open spi port + SpiOpenPort(SPI_PORT_INDEX); + while(1) + { + while(1) + { + read(SPI_PORT_HANDLE,buffer,VOSPI_PACKAGE_SIZE); + bool first_line=false; + unsigned char *buffer_ptr=buffer; + LEPTONCONTROL_PushVoSPI(buffer_ptr,first_line); + if (first_line==true) break; + } + //read data packets from lepton over SPI + read(SPI_PORT_HANDLE,buffer,VOSPI_PACKAGE_SIZE*SPI_READ_VOSPI_AMOUNT); + unsigned char *buffer_ptr=buffer; + for(long n=0;n +#include + +#include +#include +#include +#include + +#include "leptoncontrol.h" + +class LeptonThread : public QThread +{ + Q_OBJECT; + +public: + LeptonThread(); + ~LeptonThread(); + + void run(); + bool LoadPalette(const char *file_name);//çàãðóçèòü ïàëèòðó + void CreateImage(void); + +public slots: + void performFFC(); + +signals: + void updateText(QString); + void updateImage(QImage); + +private: + + QImage myImage; + uint16_t *frameBuffer; + unsigned long ColorMap_R[256];//ïàëèòðà R + unsigned long ColorMap_G[256];//ïàëèòðà G + unsigned long ColorMap_B[256];//ïàëèòðà B + +}; + +#endif diff --git a/software/raspberrypi_lepton3_video/Lepton_I2C.cpp b/software/raspberrypi_lepton3_video/Lepton_I2C.cpp new file mode 100644 index 0000000..40c7572 --- /dev/null +++ b/software/raspberrypi_lepton3_video/Lepton_I2C.cpp @@ -0,0 +1,24 @@ +#include "Lepton_I2C.h" + +#include "leptonSDKEmb32PUB/LEPTON_SDK.h" +#include "leptonSDKEmb32PUB/LEPTON_SYS.h" +#include "leptonSDKEmb32PUB/LEPTON_Types.h" + +bool _connected; + +LEP_CAMERA_PORT_DESC_T _port; + +int lepton_connect() { + LEP_OpenPort(1, LEP_CCI_TWI, 400, &_port); + _connected = true; + return 0; +} + +void lepton_perform_ffc() { + if(!_connected) { + lepton_connect(); + } + LEP_RunSysFFCNormalization(&_port); +} + +//presumably more commands could go here if desired diff --git a/software/raspberrypi_lepton3_video/Lepton_I2C.h b/software/raspberrypi_lepton3_video/Lepton_I2C.h new file mode 100644 index 0000000..a43409e --- /dev/null +++ b/software/raspberrypi_lepton3_video/Lepton_I2C.h @@ -0,0 +1,6 @@ +#ifndef LEPTON_I2C +#define LEPTON_I2C + +void lepton_perform_ffc(); + +#endif diff --git a/software/raspberrypi_lepton3_video/MyLabel.cpp b/software/raspberrypi_lepton3_video/MyLabel.cpp new file mode 100644 index 0000000..d120aa8 --- /dev/null +++ b/software/raspberrypi_lepton3_video/MyLabel.cpp @@ -0,0 +1,16 @@ +#include "MyLabel.h" + +MyLabel::MyLabel(QWidget *parent) : QLabel(parent) +{ +} +MyLabel::~MyLabel() +{ +} + +//when the system calls setImage, we'll set the label's pixmap +void MyLabel::setImage(QImage image) { + QPixmap pixmap = QPixmap::fromImage(image); + int w = this->width(); + int h = this->height(); + setPixmap(pixmap.scaled(w, h, Qt::KeepAspectRatio)); +} diff --git a/software/raspberrypi_lepton3_video/MyLabel.h b/software/raspberrypi_lepton3_video/MyLabel.h new file mode 100644 index 0000000..2a8d083 --- /dev/null +++ b/software/raspberrypi_lepton3_video/MyLabel.h @@ -0,0 +1,24 @@ +#ifndef MYLABEL_H +#define MYLABEL_H + +#include +#include +#include + + +//we extend QLabel to give it an extra slot, setImage +//this is because we can't pass a QPixmap from our thread +//so we have to pass a QImage and turn the QImage into a QPixmap on our end + +class MyLabel : public QLabel { + Q_OBJECT; + + public: + MyLabel(QWidget *parent = 0); + ~MyLabel(); + + public slots: + void setImage(QImage); +}; + +#endif diff --git a/software/raspberrypi_lepton3_video/MyLabel.h.save b/software/raspberrypi_lepton3_video/MyLabel.h.save new file mode 100644 index 0000000..36bc09a --- /dev/null +++ b/software/raspberrypi_lepton3_video/MyLabel.h.save @@ -0,0 +1,25 @@ + +#ifndef MYLABEL_H +#define MYLABEL_H + +#include +#include +#include + + +//we extend QLabel to give it an extra slot, setImage +//this is because we can't pass a QPixmap from our thread +//so we have to pass a QImage and turn the QImage into a QPixmap on our end + +class MyLabel : public QLabel { + Q_OBJECT; + + public: + MyLabel(QWidget *parent = 0); + ~MyLabel(); + + public slots: + void setImage(QImage); +}; + +#endif diff --git a/software/raspberrypi_lepton3_video/Palettes.cpp b/software/raspberrypi_lepton3_video/Palettes.cpp new file mode 100644 index 0000000..5dd67fc --- /dev/null +++ b/software/raspberrypi_lepton3_video/Palettes.cpp @@ -0,0 +1,7 @@ +#include + +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}; + +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}; + +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}; diff --git a/software/raspberrypi_lepton3_video/Palettes.h b/software/raspberrypi_lepton3_video/Palettes.h new file mode 100644 index 0000000..ec91834 --- /dev/null +++ b/software/raspberrypi_lepton3_video/Palettes.h @@ -0,0 +1,8 @@ +#ifndef PALETTES_H +#define PALETTES_H + +extern const int colormap_rainbow[]; +extern const int colormap_grayscale[]; +extern const int colormap_ironblack[]; + +#endif diff --git a/software/raspberrypi_lepton3_video/README.md b/software/raspberrypi_lepton3_video/README.md new file mode 100644 index 0000000..af6f63f --- /dev/null +++ b/software/raspberrypi_lepton3_video/README.md @@ -0,0 +1,26 @@ +This example is meant for Raspberry Pi and Pi2 and has been tested with Raspbian. + +Enable the SPI and I2C interfaces on the Pi. + +Install the 'qt4-dev-tools' package, which allows compiling of QT applications. + +To build (will build any SDK dependencies as well): +qmake && make + +To clean: +make sdkclean && make distclean + +If you wish to run this application without using sudo, you should add the user "pi" to the usergroup "i2c". + +---- + +In order for the application to run properly, a Lepton camera must be attached in a specific way to the SPI, power, and ground pins of the Raspi's GPIO interface, as well as the I2C SDA/SCL pins: + +Lepton's GND pin should be connected to RasPi's ground. +Lepton's CS pin should be connected to RasPi's CE1 pin. +Lepton's MISO pin should be connected to RasPI's MISO pin. +Lepton's CLK pin should be connected to RasPI's SCLK pin. +Lepton's VIN pin should be connected to RasPI's 3v3 pin. +Lepton's SDA pin should be connected to RasPI's SDA pin. +Lepton's SCL pin should be connected to RasPI's SCL pin. + diff --git a/software/raspberrypi_lepton3_video/Rainbow.pal b/software/raspberrypi_lepton3_video/Rainbow.pal new file mode 100644 index 0000000000000000000000000000000000000000..963977c9f15773d2f343f6ee280d0e7b8cc6dde6 GIT binary patch literal 768 zcmV+b1ONO114;k`N&o{(00T<^155w|OaKE-00U0|15yA5RR9NA018_G4qgBgVgMFo z02yZh9BKd{Z2%*1048(*D0cuVdjKtf05OFCGKK&%hyXN+05yvMHjV%{kN`N506LWb zJ(>VNoB%wE#}I08hIBP`m(9z5rCh09VEUSjYfc z%K%)>0A9}kUeEwv(Ewo50AbSrW7Ys>*#KwS0BG9)Y1{y7-2iRh0B_#_ao+%Q-T-yo z0CwB~c-sMb*#dmn0)Ey5fz$(o&jf_c1ck~3hQ$Slzy^xB2aU1_j;sohrV5av3z41- zl9>&Yl@FDS5toD(nRpqRa~zy)BA#U^pk6JaRx_keJEuiMt2{`pHcqcFQ?V;qvnO4( zBVxB7X}KD0yBBf16?VN7d%qEY!48JQ42r}Gj>QO)#s-(j1)IqPpvwcK%mS&+0i#)db+w1mV;L;?xD@ z(*@|$2I$iU>C*=4(gy3&2kg-Y?a&DC&Is|$3G&Mc^vVkK$qMzz3iZbe_QnhM#SHku z4f($g`n?YOyAS)h5d60h{IU}Lt`q&M6aJ_a{-qWEq!s_87XP6Z|DPBCofrR`82^F=b|U|7B>!k7|79lsV<-PzDF0Y0{!%OcO)dUKFaAC;{W&uI zH8lJ&HT*3%`zJa3Av^mZJo_I!`yM^}9Xi2j$1|DKTlqmuuqmH(}n|FD_= yvYY?7p#Q(6|HG*N$E^R$um8`p|I@br*t!4OzW?0B|K7;|;mZHx%>U-j|LM?OfonGa literal 0 HcmV?d00001 diff --git a/software/raspberrypi_lepton3_video/SPI.cpp b/software/raspberrypi_lepton3_video/SPI.cpp new file mode 100644 index 0000000..026a72b --- /dev/null +++ b/software/raspberrypi_lepton3_video/SPI.cpp @@ -0,0 +1,114 @@ +#include "SPI.h" + +int spi_cs0_fd = -1; +int spi_cs1_fd = -1; + +unsigned char spi_mode = SPI_MODE_3; +unsigned char spi_bitsPerWord = 8; +//unsigned int spi_speed = 32000000; +unsigned int spi_speed; + +int SpiOpenPort (int spi_device) +{ + int status_value = -1; + int *spi_cs_fd; + + + //----- SET SPI MODE ----- + //SPI_MODE_0 (0,0) CPOL=0 (Clock Idle low level), CPHA=0 (SDO transmit/change edge active to idle) + //SPI_MODE_1 (0,1) CPOL=0 (Clock Idle low level), CPHA=1 (SDO transmit/change edge idle to active) + //SPI_MODE_2 (1,0) CPOL=1 (Clock Idle high level), CPHA=0 (SDO transmit/change edge active to idle) + //SPI_MODE_3 (1,1) CPOL=1 (Clock Idle high level), CPHA=1 (SDO transmit/change edge idle to active) + spi_mode = SPI_MODE_3; + + //----- SET BITS PER WORD ----- + spi_bitsPerWord = 8; + + //----- SET SPI BUS SPEED ----- + //spi_speed = 16000000; //1000000 = 1MHz (1uS per bit) + //spi_speed = 28000000; //1000000 = 1MHz (1uS per bit) + spi_speed = 20000000; //1000000 = 1MHz (1uS per bit) + //spi_speed = 28000000; //1000000 = 1MHz (1uS per bit) + // was 32M + + + if (spi_device) + spi_cs_fd = &spi_cs1_fd; + else + spi_cs_fd = &spi_cs0_fd; + + + if (spi_device) + *spi_cs_fd = open(std::string("/dev/spidev0.1").c_str(), O_RDWR); + else + *spi_cs_fd = open(std::string("/dev/spidev0.0").c_str(), O_RDWR); + + if (*spi_cs_fd < 0) + { + perror("Error - Could not open SPI device"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_WR_MODE, &spi_mode); + if(status_value < 0) + { + perror("Could not set SPIMode (WR)...ioctl fail"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_RD_MODE, &spi_mode); + if(status_value < 0) + { + perror("Could not set SPIMode (RD)...ioctl fail"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bitsPerWord); + if(status_value < 0) + { + perror("Could not set SPI bitsPerWord (WR)...ioctl fail"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_RD_BITS_PER_WORD, &spi_bitsPerWord); + if(status_value < 0) + { + perror("Could not set SPI bitsPerWord(RD)...ioctl fail"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed); + if(status_value < 0) + { + perror("Could not set SPI speed (WR)...ioctl fail"); + exit(1); + } + + status_value = ioctl(*spi_cs_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed); + if(status_value < 0) + { + perror("Could not set SPI speed (RD)...ioctl fail"); + exit(1); + } + return(status_value); +} + +int SpiClosePort(int spi_device) +{ + int status_value = -1; + int *spi_cs_fd; + + if (spi_device) + spi_cs_fd = &spi_cs1_fd; + else + spi_cs_fd = &spi_cs0_fd; + + + status_value = close(*spi_cs_fd); + if(status_value < 0) + { + perror("Error - Could not close SPI device"); + exit(1); + } + return(status_value); +} diff --git a/software/raspberrypi_lepton3_video/SPI.h b/software/raspberrypi_lepton3_video/SPI.h new file mode 100644 index 0000000..7d900d6 --- /dev/null +++ b/software/raspberrypi_lepton3_video/SPI.h @@ -0,0 +1,37 @@ +/* + * SPI testing utility (using spidev driver) + * + * Copyright (c) 2007 MontaVista Software, Inc. + * Copyright (c) 2007 Anton Vorontsov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License. + * + * Cross-compile with cross-gcc -I/path/to/cross-kernel/include + */ + +#ifndef SPI_H +#define SPI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern int spi_cs0_fd; +extern int spi_cs1_fd; +extern unsigned char spi_mode; +extern unsigned char spi_bitsPerWord; +extern unsigned int spi_speed; + +int SpiOpenPort(int spi_device); +int SpiClosePort(int spi_device); + +#endif diff --git a/software/raspberrypi_lepton3_video/connected.png b/software/raspberrypi_lepton3_video/connected.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef541abe5b3d27a7568ab944e2e4c631611dbaf GIT binary patch literal 13424 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 l@TIjNwhg!!#+_GK<3`btM~u_ literal 0 HcmV?d00001 diff --git a/software/raspberrypi_lepton3_video/leptoncontrol.cpp b/software/raspberrypi_lepton3_video/leptoncontrol.cpp new file mode 100644 index 0000000..376b153 --- /dev/null +++ b/software/raspberrypi_lepton3_video/leptoncontrol.cpp @@ -0,0 +1,184 @@ +#include "leptoncontrol.h" +#include + +static unsigned short RAW14Image[LEPTON_ORIGINAL_IMAGE_HEIGHT*LEPTON_ORIGINAL_IMAGE_WIDTH];//ñîáèðàåìîå èçîáðàæåíèå + +#define RESYNC_TIMEOUT 19890 +#define NO_SEGMENT -1 +#define ERROR_PACKAGE -2 + +//---------------------------------------------------------------------------------------------------- +//èíèöèàëèçàöèÿ +//---------------------------------------------------------------------------------------------------- +void LEPTONCONTROL_Init(void) +{ +} + +//---------------------------------------------------------------------------------------------------- +//âû÷èñëèòü crc +//---------------------------------------------------------------------------------------------------- +void LEPTONCONTROL_CalculateCRC(unsigned short *crc,unsigned char byte) +{ + (*crc)^=(byte<<8); + for(unsigned char n=0;n<8;n++) + { + if ((*crc)&0x8000) *crc=((*crc)<<1)^0x1021; + else (*crc)<<=1; + } +} + + +//---------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------- +long LEPTONCONTROL_ReadSegment(unsigned short *raw14_ptr,unsigned char data[VOSPI_PACKAGE_SIZE],bool &first_line) +{ + static long current_package=-1; + static long segment=-1; + long n; + first_line=false; + if ((data[0]&0x0F)==0x0F) return(NO_SEGMENT);//îòáðàñûâàåìûé ïàêåò + unsigned short crc=data[2]; + crc<<=8; + crc|=data[3]; + //ñ÷èòàåì CRC + unsigned short crc16=0; + LEPTONCONTROL_CalculateCRC(&crc16,data[0]&0x0F); + LEPTONCONTROL_CalculateCRC(&crc16,data[1]); + LEPTONCONTROL_CalculateCRC(&crc16,0); + LEPTONCONTROL_CalculateCRC(&crc16,0); + for(n=4;n>4;//íîìåð êàäðà áûâàåò òîëüêî â 20 ïàêåòå + segment=ttt; + } + if (current_package<0) return(NO_SEGMENT); + if (current_package!=package) + { + current_package=-1; + return(ERROR_PACKAGE); + } + unsigned short *raw_ptr=raw14_ptr+current_package*VOSPI_PACKAGE_LINE_SIZE/2; + for(n=0;n>4;//íîìåð êàäðà áûâàåò òîëüêî â 20 ïàêåòå + if (ttt==0) + { + CurrentPackage=0; + CurrentSegment=0; + return(false);//ëþáîé ñåãìåíò ñ íóëåâûì ttt äîëæåí áûòü ïðîèãíîðèðîâàí (â äîêóìåíòàöèè îøèáêà?) + } + //ñîáèðàåì èçîáðàæåíèå + ttt--; + if (CurrentSegment!=ttt)//íîìåð êàäðà íåâåðíûé + { + CurrentPackage=0; + CurrentSegment=0; + return(false); + } + } + if (CurrentPackage!=package)//íîìåð ñòðîêè íåâåðíûé + { + CurrentPackage=0; + CurrentSegment=0; + return(false); + } + unsigned long sub_package=(CurrentSegment*VOSPI_FRAME_HEIGHT)+CurrentPackage; + unsigned short *raw_ptr=&(RAW14Image[(sub_package>>1)*LEPTON_ORIGINAL_IMAGE_WIDTH+(sub_package&0x01)*VOSPI_FRAME_WIDTH]); + for(n=0;n + +//èñõîäíûå ðàçìåðû èçîáðàæåíèÿ (íå ïåðåâ¸ðíóòîå) +#define LEPTON_ORIGINAL_IMAGE_WIDTH 160 +#define LEPTON_ORIGINAL_IMAGE_HEIGHT 120 + +//âûñîòà êàäðà VoSPI +#define VOSPI_FRAME_HEIGHT 60 +//øèðèíà êàäðà VoSPI +#define VOSPI_FRAME_WIDTH 80 +//ðàçìåð ïàêåòà VoSPI à áàéòàõ (164 äëÿ RAW14 è 244 äëÿ RGB) +#define VOSPI_PACKAGE_SIZE 164 +//ðàçìåð ñòðîêè ïàêåòà VoSPI â áàéòàõ +#define VOSPI_PACKAGE_LINE_SIZE 160 + +#define VOSPI_SEGMENT_LINE_AMOUNT 60 + +void LEPTONCONTROL_Init(void);//èíèöèàëèçàöèÿ +void LEPTONCONTROL_CalculateCRC(unsigned short *crc,unsigned char byte);//âû÷èñëèòü crc +bool LEPTONCONTROL_PushVoSPI(unsigned char data[VOSPI_PACKAGE_SIZE],bool &first_line);//ïîäàòü äàííûå îäíîãî ïàêåòà VoSPI íà âõîä ìîäóëÿ +unsigned short *LEPTONCONTROL_GetRAW14Ptr(void);//ïîëó÷èòü óêàçàòåëü íà äàííûå ñîáðàííîãî èçîáðàæåíèÿ + +#endif diff --git a/software/raspberrypi_lepton3_video/main.cpp b/software/raspberrypi_lepton3_video/main.cpp new file mode 100644 index 0000000..57501a7 --- /dev/null +++ b/software/raspberrypi_lepton3_video/main.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "LeptonThread.h" +#include "MyLabel.h" + +int main( int argc, char **argv ) +{ + //create the app + QApplication a( argc, argv ); + + QWidget *myWidget = new QWidget; + myWidget->setGeometry(400, 300, 340, 290); + + //create an image placeholder for myLabel + //fill the top left corner with red, just bcuz + QImage myImage; + myImage = QImage(320, 240, QImage::Format_RGB888); + QRgb red = qRgb(255,0,0); + for(int i=0;i<160;i++) { + for(int j=0;j<120;j++) { + myImage.setPixel(i, j, red); + } + } + + //create a label, and set it's image to the placeholder + MyLabel myLabel(myWidget); + myLabel.setGeometry(10, 10, 320, 240); + myLabel.setPixmap(QPixmap::fromImage(myImage)); + + //create a FFC button + QPushButton *button1 = new QPushButton("Perform FFC", myWidget); + button1->setGeometry(320/2-50, 290-35, 100, 30); + + //create a thread to gather SPI data + //when the thread emits updateImage, the label should update its image accordingly + LeptonThread *thread = new LeptonThread(); + QObject::connect(thread, SIGNAL(updateImage(QImage)), &myLabel, SLOT(setImage(QImage))); + + //connect ffc button to the thread's ffc action + QObject::connect(button1, SIGNAL(clicked()), thread, SLOT(performFFC())); + thread->start(); + + myWidget->show(); + + return a.exec(); +} + diff --git a/software/raspberrypi_lepton3_video/raspberrypi_video.pro b/software/raspberrypi_lepton3_video/raspberrypi_video.pro new file mode 100644 index 0000000..f1c5a6a --- /dev/null +++ b/software/raspberrypi_lepton3_video/raspberrypi_video.pro @@ -0,0 +1,30 @@ + +TEMPLATE = app +QT += core gui +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = + +RPI_LIBS = ../raspberrypi_libs +LEPTONSDK = leptonSDKEmb32PUB + +PRE_TARGETDEPS += sdk +QMAKE_EXTRA_TARGETS += sdk sdkclean +sdk.commands = make -C $${RPI_LIBS}/$${LEPTONSDK} +sdkclean.commands = make -C $${RPI_LIBS}/$${LEPTONSDK} clean + +DEPENDPATH += . +INCLUDEPATH += . $${RPI_LIBS} + +DESTDIR=. +OBJECTS_DIR=gen_objs +MOC_DIR=gen_mocs + +HEADERS += *.h + +SOURCES += *.cpp + +unix:LIBS += -L$${RPI_LIBS}/$${LEPTONSDK}/Debug -lLEPTON_SDK + +unix:QMAKE_CLEAN += -r $(OBJECTS_DIR) $${MOC_DIR} +