Subversion Repositories seema-scanner

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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