RS232 control for TVOne products
Diff: spk_tvone_mbed.cpp
- Revision:
- 23:46f42462a183
- Parent:
- 21:2260dde18dfa
- Child:
- 24:4eec37b8387e
--- a/spk_tvone_mbed.cpp Tue May 21 23:37:09 2013 +0000 +++ b/spk_tvone_mbed.cpp Tue Jun 25 02:06:35 2013 +0000 @@ -270,12 +270,19 @@ return ok ? EDID : -1; } -int SPKTVOne::getResolution() +int SPKTVOne::getResolution(int device) { - bool ok; + bool ok = false; + int32_t payload = -1; - int32_t payload = -1; - ok = readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, payload); + if (device == 0) + { + ok = readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustOutputsOutputResolution, payload); + } + else if (device == kTV1WindowIDA || device == kTV1WindowIDB) + { + ok = readCommand(0, device, kTV1FunctionAdjustWindowsSourceResolution, payload); + } return ok ? payload : -1; } @@ -360,6 +367,118 @@ return ok; } +bool SPKTVOne::getResolutionParams(int resStoreNumber, int &horizpx, int &vertpx) +{ + bool ok; + + ok = command(0, kTV1WindowIDA, kTV1FunctionAdjustResolutionImageToAdjust, resStoreNumber); + + ok = ok && readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustResolutionActiveH, horizpx); + ok = ok && readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustResolutionActiveV, vertpx); + + return ok; +} + +SPKTVOne::aspectType SPKTVOne::getAspect() +{ + aspectType aspect = aspectFit;; + + int32_t payload1 = -1; + readCommand(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, payload1); + + int32_t payload2 = -1; + readCommand(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, payload2); + + if (payload1 == payload2) + { + if (payload1 == aspectFit) aspect = aspectFit; + if (payload1 == aspectHFill) aspect = aspectSPKFill; + if (payload1 == aspectVFill) aspect = aspectSPKFill; + if (payload1 == aspect1to1) aspect = aspect1to1; + } + else if (((payload1 == aspectHFill) && (payload2 == aspectVFill)) || ((payload2 == aspectHFill) && (payload1 == aspectVFill))) + { + aspect = aspectSPKFill; + } + else + { + if (debug) debug->printf("SPKTVOne:getAspect got unknown aspect"); + } + + return aspect; +} + +bool SPKTVOne::setAspect(aspectType aspect) +{ + bool ok = true; + aspectType aspectFor1 = aspect; + aspectType aspectFor2 = aspect; + + if (aspect == aspectSPKFill) + { + int resNumberOutput = getResolution(); + int horizOutput = 0; + int vertOutput = 0; + getResolutionParams(resNumberOutput, horizOutput, vertOutput); + + if (resNumberOutput != -1) + { + float aspectOutput = (float)horizOutput / (float)vertOutput; + + int sourceForWindowA = -1; + int sourceForWindowB = -1; + readCommand(0, kTV1WindowIDA, kTV1FunctionAdjustWindowsWindowSource, sourceForWindowA); + readCommand(0, kTV1WindowIDB, kTV1FunctionAdjustWindowsWindowSource, sourceForWindowB); + + int windowForRGB1 = -1; + int windowForRGB2 = -1; + switch (sourceForWindowA) + { + case kTV1SourceRGB1: windowForRGB1 = kTV1WindowIDA; break; + case kTV1SourceRGB2: windowForRGB2 = kTV1WindowIDA; break; + } + switch (sourceForWindowB) + { + case kTV1SourceRGB1: windowForRGB1 = kTV1WindowIDB; break; + case kTV1SourceRGB2: windowForRGB2 = kTV1WindowIDB; break; + } + + if ((windowForRGB1 != -1)) + { + int resNumber1 = getResolution(windowForRGB1); + int horiz1 = 0; + int vert1 = 0; + getResolutionParams(resNumber1, horiz1, vert1); + float aspect1 = (float)horiz1 / (float)vert1; + aspectFor1 = aspectOutput > aspect1 ? aspectHFill : aspectVFill; + } + else + { + aspectFor1 = aspectHFill; + } + + if (windowForRGB2 != -1) + { + int resNumber2 = getResolution(windowForRGB2); + int horiz2 = 0; + int vert2 = 0; + getResolutionParams(resNumber2, horiz2, vert2); + float aspect2 = (float)horiz2 / (float)vert2; + aspectFor2 = aspectOutput > aspect2 ? aspectHFill : aspectVFill; + } + else + { + aspectFor2 = aspectHFill; + } + } + } + + ok = ok && command(kTV1SourceRGB1, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, aspectFor1); + ok = ok && command(kTV1SourceRGB2, kTV1WindowIDA, kTV1FunctionAdjustSourceAspectCorrect, aspectFor2); + + return ok; +} + bool SPKTVOne::set1920x480(int resStoreNumber) { bool ok;