1 |
jakw |
1 |
#include "ProjectorLC3000.h"
|
|
|
2 |
|
|
|
3 |
// Additions to the LC3000 API
|
|
|
4 |
#include "LC3000API/lcr_packetizer.h"
|
|
|
5 |
ErrorCode_t LCR_CMD_DisplayPattern(LCR_PatternCount_t PtnNumber){
|
|
|
6 |
/* Generate packet */
|
|
|
7 |
LCR_CMD_PKT_CommandInit(LCR_CMD_PKT_TYPE_WRITE, 0x0405);
|
|
|
8 |
LCR_CMD_PKT_PutInt(PtnNumber, 2);
|
|
|
9 |
if(LCR_CMD_PKT_SendCommand())
|
|
|
10 |
return FAIL;
|
|
|
11 |
|
|
|
12 |
return SUCCESS;
|
|
|
13 |
}
|
|
|
14 |
|
|
|
15 |
#include "LC3000API/bitmap_image.hpp"
|
|
|
16 |
|
|
|
17 |
#define HandleResult(res,place) if (res!=SUCCESS) {printf("ProjectorLC3000: Error at %s (%d)\n",place,res); fflush(stdout);}
|
|
|
18 |
|
|
|
19 |
ProjectorLC3000::ProjectorLC3000(unsigned int){
|
|
|
20 |
|
|
|
21 |
// Make connection
|
|
|
22 |
res = LCR_CMD_Open();
|
|
|
23 |
HandleResult(res,"LCR_CMD_Open()")
|
|
|
24 |
|
|
|
25 |
// Set power on (if in standby)
|
|
|
26 |
res = LCR_CMD_SetPowerMode(PWR_NORMAL);
|
|
|
27 |
HandleResult(res,"LCR_CMD_SetPowerMode()")
|
|
|
28 |
|
|
|
29 |
// Set LED currents to max brightness
|
|
|
30 |
LCR_LEDCurrent_t ledCurrents = {255,255,255};
|
|
|
31 |
res = LCR_CMD_SetLEDCurrent(&ledCurrents);
|
|
|
32 |
HandleResult(res,"LCR_CMD_SetLEDCurrent()")
|
|
|
33 |
|
|
|
34 |
// Set display settings to no rotate, no long axis flix, short axis flip
|
|
|
35 |
LCR_DisplaySetting_t displaySettings = {0,0,1};
|
|
|
36 |
res = LCR_CMD_SetDisplaySetting(&displaySettings);
|
|
|
37 |
HandleResult(res,"LCR_CMD_SetDisplaySetting()")
|
|
|
38 |
|
|
|
39 |
// Set trigger output settings
|
|
|
40 |
LCR_CamTriggerSetting_t triggerSettings;
|
|
|
41 |
triggerSettings.Enable = 1;
|
|
|
42 |
triggerSettings.Source = 0;
|
|
|
43 |
triggerSettings.Polarity = TRIGGER_EDGE_POS;
|
|
|
44 |
triggerSettings.Delay = 0;
|
|
|
45 |
triggerSettings.PulseWidth = 200; //us
|
|
|
46 |
res = LCR_CMD_SetCamTriggerSetting(&triggerSettings);
|
|
|
47 |
HandleResult(res,"LCR_CMD_SetCamTriggerSetting()")
|
|
|
48 |
|
|
|
49 |
// Set default pattern sequence settings
|
|
|
50 |
patternSeqSettings.BitDepth = 8;
|
|
|
51 |
patternSeqSettings.NumPatterns = 1;
|
|
|
52 |
patternSeqSettings.PatternType = PTN_TYPE_NORMAL;
|
|
|
53 |
patternSeqSettings.InputTriggerType = TRIGGER_TYPE_SW;
|
|
|
54 |
patternSeqSettings.InputTriggerDelay = 0;
|
|
|
55 |
patternSeqSettings.AutoTriggerPeriod = 0;
|
|
|
56 |
patternSeqSettings.ExposureTime = 16666; //us
|
|
|
57 |
patternSeqSettings.LEDSelect = LED_RED;
|
|
|
58 |
patternSeqSettings.Repeat = 1;
|
|
|
59 |
res = LCR_CMD_SetPatternSeqSetting(&patternSeqSettings);
|
|
|
60 |
HandleResult(res,"LCR_CMD_SetPatternSeqSetting()")
|
|
|
61 |
|
|
|
62 |
}
|
|
|
63 |
|
|
|
64 |
void ProjectorLC3000::setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight){
|
|
|
65 |
|
|
|
66 |
// Set pattern count
|
|
|
67 |
unsigned int nPatterns = std::max((unsigned int)patternSeqSettings.NumPatterns, patternNumber+1);
|
|
|
68 |
patternSeqSettings.NumPatterns = nPatterns;
|
|
|
69 |
res = LCR_CMD_SetPatternSeqSetting(&patternSeqSettings);
|
|
|
70 |
HandleResult(res,"LCR_CMD_SetPatternSeqSetting()")
|
|
|
71 |
|
|
|
72 |
// Tile texture
|
|
|
73 |
char texTiled[608][684][3];
|
|
|
74 |
for(unsigned int j=0; j<608; j++){
|
|
|
75 |
int jIdx = j%texWidth;
|
|
|
76 |
for(unsigned int i=0; i<684; i++){
|
|
|
77 |
int iIdx = i%texHeight;
|
|
|
78 |
texTiled[j][i][0] = tex[iIdx*texWidth*3 + jIdx*3 + 0];
|
|
|
79 |
texTiled[j][i][1] = tex[iIdx*texWidth*3 + jIdx*3 + 1];
|
|
|
80 |
texTiled[j][i][2] = tex[iIdx*texWidth*3 + jIdx*3 + 2];
|
|
|
81 |
}
|
|
|
82 |
}
|
|
|
83 |
// Bitmap version of texture
|
|
|
84 |
bitmap_image img(608, 684);
|
|
|
85 |
for(unsigned int j=0; j<608; j++)
|
|
|
86 |
for(unsigned int i=0; i<684; i++)
|
|
|
87 |
img.set_pixel(j, i, texTiled[j][i][0], texTiled[j][i][1], texTiled[j][i][2]);
|
|
|
88 |
|
|
|
89 |
// Save
|
|
|
90 |
img.save_image("tex.bmp");
|
|
|
91 |
|
|
|
92 |
// Set as pattern
|
|
|
93 |
res = LCR_CMD_DefinePatternBMP(patternNumber, "tex.bmp");
|
|
|
94 |
HandleResult(res,"LCR_CMD_DefinePattern()")
|
|
|
95 |
}
|
|
|
96 |
|
|
|
97 |
void ProjectorLC3000::displayPattern(unsigned int patternNumber){
|
|
|
98 |
// Set display mode
|
|
|
99 |
// res = LCR_CMD_SetDisplayMode(DISP_MODE_PTN_SEQ);
|
|
|
100 |
// HandleResult(res,"LCR_CMD_SetDisplayMode()")
|
|
|
101 |
|
|
|
102 |
res = LCR_CMD_DisplayPattern(patternNumber);
|
|
|
103 |
HandleResult(res,"LCR_CMD_DisplayPattern()")
|
|
|
104 |
}
|
|
|
105 |
|
|
|
106 |
void ProjectorLC3000::displayTexture(const unsigned char *tex, unsigned int texWidth, unsigned int texHeight){
|
|
|
107 |
// // Set display to image/static color
|
|
|
108 |
// res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
|
|
|
109 |
// HandleResult(res,"LCR_CMD_SetDisplayMode()")
|
|
|
110 |
|
|
|
111 |
// // Tile texture
|
|
|
112 |
// char texTiled[608][684][3];
|
|
|
113 |
// for(unsigned int j=0; j<608; j++){
|
|
|
114 |
// int jIdx = j%texWidth;
|
|
|
115 |
// for(unsigned int i=0; i<684; i++){
|
|
|
116 |
// int iIdx = i%texHeight;
|
|
|
117 |
// texTiled[j][i][0] = tex[iIdx*texWidth*3 + jIdx*3 + 0];
|
|
|
118 |
// texTiled[j][i][1] = tex[iIdx*texWidth*3 + jIdx*3 + 1];
|
|
|
119 |
// texTiled[j][i][2] = tex[iIdx*texWidth*3 + jIdx*3 + 2];
|
|
|
120 |
// }
|
|
|
121 |
// }
|
|
|
122 |
// // Bitmap version of texture
|
|
|
123 |
// bitmap_image img(608, 684);
|
|
|
124 |
// for(unsigned int j=0; j<608; j++)
|
|
|
125 |
// for(unsigned int i=0; i<684; i++)
|
|
|
126 |
// img.set_pixel(j, i, texTiled[j][i][0], texTiled[j][i][1], texTiled[j][i][2]);
|
|
|
127 |
|
|
|
128 |
// // Save
|
|
|
129 |
// img.save_image("tex.bmp");
|
|
|
130 |
|
|
|
131 |
// // Display
|
|
|
132 |
// res = LCR_CMD_DisplayStaticImage("tex.bmp");
|
|
|
133 |
// HandleResult(res,"LCR_CMD_DisplayStaticImage()")
|
|
|
134 |
|
|
|
135 |
patternSeqSettings.NumPatterns = 1;
|
|
|
136 |
this->setPattern(0, tex, texWidth, texHeight);
|
|
|
137 |
this->displayPattern(0);
|
|
|
138 |
|
|
|
139 |
}
|
|
|
140 |
|
|
|
141 |
void ProjectorLC3000::displayBlack(){
|
|
|
142 |
// Set display to image/static color
|
|
|
143 |
res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
|
|
|
144 |
HandleResult(res,"LCR_CMD_SetDisplayMode()")
|
|
|
145 |
|
|
|
146 |
res = LCR_CMD_DisplayStaticColor(0);
|
|
|
147 |
HandleResult(res,"LCR_CMD_DisplayStaticColor()")
|
|
|
148 |
}
|
|
|
149 |
|
|
|
150 |
void ProjectorLC3000::displayWhite(){
|
|
|
151 |
// Set display to image/static color
|
|
|
152 |
res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
|
|
|
153 |
HandleResult(res,"LCR_CMD_SetDisplayMode()")
|
|
|
154 |
|
|
|
155 |
res = LCR_CMD_DisplayStaticColor((255 << 16) | (255 << 8) | (255));
|
|
|
156 |
HandleResult(res,"LCR_CMD_DisplayStaticColor()")
|
|
|
157 |
}
|
|
|
158 |
|
|
|
159 |
void ProjectorLC3000::getScreenRes(unsigned int *nx, unsigned int *ny){
|
|
|
160 |
*nx = 608;
|
|
|
161 |
*ny = 684;
|
|
|
162 |
}
|
|
|
163 |
|
|
|
164 |
ProjectorLC3000::~ProjectorLC3000(){
|
|
|
165 |
res = LCR_CMD_Close();
|
|
|
166 |
HandleResult(res,"LCR_CMD_Close()")
|
|
|
167 |
}
|
|
|
168 |
|