Subversion Repositories seema-scanner

Rev

Blame | Last modification | View Log | RSS feed

#include "ProjectorLC3000.h"

// Additions to the LC3000 API
#include "LC3000API/lcr_packetizer.h"
ErrorCode_t LCR_CMD_DisplayPattern(LCR_PatternCount_t PtnNumber){
    /* Generate packet */
    LCR_CMD_PKT_CommandInit(LCR_CMD_PKT_TYPE_WRITE, 0x0405);
    LCR_CMD_PKT_PutInt(PtnNumber, 2);
    if(LCR_CMD_PKT_SendCommand())
        return FAIL;

    return SUCCESS;
}

#include "LC3000API/bitmap_image.hpp"

#define HandleResult(res,place) if (res!=SUCCESS) {printf("ProjectorLC3000: Error at %s (%d)\n",place,res); fflush(stdout);}

ProjectorLC3000::ProjectorLC3000(unsigned int){

    // Make connection
    res = LCR_CMD_Open();
    HandleResult(res,"LCR_CMD_Open()")

    // Set power on (if in standby)
    res = LCR_CMD_SetPowerMode(PWR_NORMAL);
    HandleResult(res,"LCR_CMD_SetPowerMode()")

    // Set LED currents to max brightness
    LCR_LEDCurrent_t ledCurrents = {255,255,255};
    res = LCR_CMD_SetLEDCurrent(&ledCurrents);
    HandleResult(res,"LCR_CMD_SetLEDCurrent()")

    // Set display settings to no rotate, no long axis flix, short axis flip
    LCR_DisplaySetting_t displaySettings = {0,0,1};
    res = LCR_CMD_SetDisplaySetting(&displaySettings);
    HandleResult(res,"LCR_CMD_SetDisplaySetting()")

    // Set trigger output settings
    LCR_CamTriggerSetting_t triggerSettings;
    triggerSettings.Enable = 1;
    triggerSettings.Source = 0;
    triggerSettings.Polarity = TRIGGER_EDGE_POS;
    triggerSettings.Delay = 0;
    triggerSettings.PulseWidth = 200; //us
    res = LCR_CMD_SetCamTriggerSetting(&triggerSettings);
    HandleResult(res,"LCR_CMD_SetCamTriggerSetting()")

    // Set default pattern sequence settings
    patternSeqSettings.BitDepth = 8;
    patternSeqSettings.NumPatterns = 1;
    patternSeqSettings.PatternType = PTN_TYPE_NORMAL;
    patternSeqSettings.InputTriggerType = TRIGGER_TYPE_SW;
    patternSeqSettings.InputTriggerDelay = 0;
    patternSeqSettings.AutoTriggerPeriod = 0;
    patternSeqSettings.ExposureTime = 16666; //us
    patternSeqSettings.LEDSelect = LED_RED;
    patternSeqSettings.Repeat = 1;
    res = LCR_CMD_SetPatternSeqSetting(&patternSeqSettings);
    HandleResult(res,"LCR_CMD_SetPatternSeqSetting()")

}

void ProjectorLC3000::setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight){

    // Set pattern count
    unsigned int nPatterns = std::max((unsigned int)patternSeqSettings.NumPatterns, patternNumber+1);
    patternSeqSettings.NumPatterns = nPatterns;
    res = LCR_CMD_SetPatternSeqSetting(&patternSeqSettings);
    HandleResult(res,"LCR_CMD_SetPatternSeqSetting()")

    // Tile texture
    char texTiled[608][684][3];
    for(unsigned int j=0; j<608; j++){
        int jIdx = j%texWidth;
        for(unsigned int i=0; i<684; i++){
            int iIdx = i%texHeight;
            texTiled[j][i][0] = tex[iIdx*texWidth*3 + jIdx*3 + 0];
            texTiled[j][i][1] = tex[iIdx*texWidth*3 + jIdx*3 + 1];
            texTiled[j][i][2] = tex[iIdx*texWidth*3 + jIdx*3 + 2];
        }
    }
    // Bitmap version of texture
    bitmap_image img(608, 684);
    for(unsigned int j=0; j<608; j++)
        for(unsigned int i=0; i<684; i++)
            img.set_pixel(j, i, texTiled[j][i][0], texTiled[j][i][1], texTiled[j][i][2]);

    // Save
    img.save_image("tex.bmp");

    // Set as pattern
    res = LCR_CMD_DefinePatternBMP(patternNumber, "tex.bmp");
    HandleResult(res,"LCR_CMD_DefinePattern()")
}

void ProjectorLC3000::displayPattern(unsigned int patternNumber){
    // Set display mode
//    res = LCR_CMD_SetDisplayMode(DISP_MODE_PTN_SEQ);
//    HandleResult(res,"LCR_CMD_SetDisplayMode()")

    res = LCR_CMD_DisplayPattern(patternNumber);
    HandleResult(res,"LCR_CMD_DisplayPattern()")
}

void ProjectorLC3000::displayTexture(const unsigned char *tex, unsigned int texWidth, unsigned int texHeight){
//    // Set display to image/static color
//    res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
//    HandleResult(res,"LCR_CMD_SetDisplayMode()")

//    // Tile texture
//    char texTiled[608][684][3];
//    for(unsigned int j=0; j<608; j++){
//        int jIdx = j%texWidth;
//        for(unsigned int i=0; i<684; i++){
//            int iIdx = i%texHeight;
//            texTiled[j][i][0] = tex[iIdx*texWidth*3 + jIdx*3 + 0];
//            texTiled[j][i][1] = tex[iIdx*texWidth*3 + jIdx*3 + 1];
//            texTiled[j][i][2] = tex[iIdx*texWidth*3 + jIdx*3 + 2];
//        }
//    }
//    // Bitmap version of texture
//    bitmap_image img(608, 684);
//    for(unsigned int j=0; j<608; j++)
//        for(unsigned int i=0; i<684; i++)
//            img.set_pixel(j, i, texTiled[j][i][0], texTiled[j][i][1], texTiled[j][i][2]);

//    // Save
//    img.save_image("tex.bmp");

//    // Display
//    res = LCR_CMD_DisplayStaticImage("tex.bmp");
//    HandleResult(res,"LCR_CMD_DisplayStaticImage()")

    patternSeqSettings.NumPatterns = 1;
    this->setPattern(0, tex, texWidth, texHeight);
    this->displayPattern(0);

}

void ProjectorLC3000::displayBlack(){
    // Set display to image/static color
    res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
    HandleResult(res,"LCR_CMD_SetDisplayMode()")

    res = LCR_CMD_DisplayStaticColor(0);
    HandleResult(res,"LCR_CMD_DisplayStaticColor()")
}

void ProjectorLC3000::displayWhite(){
    // Set display to image/static color
    res = LCR_CMD_SetDisplayMode(DISP_MODE_IMAGE);
    HandleResult(res,"LCR_CMD_SetDisplayMode()")

    res = LCR_CMD_DisplayStaticColor((255 << 16) |  (255 << 8) | (255));
    HandleResult(res,"LCR_CMD_DisplayStaticColor()")
}

void ProjectorLC3000::getScreenRes(unsigned int *nx, unsigned int *ny){
    *nx = 608;
    *ny = 684;
}

ProjectorLC3000::~ProjectorLC3000(){
    res = LCR_CMD_Close();
    HandleResult(res,"LCR_CMD_Close()")
}