accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp
changeset 54 072a9626b290
parent 45 c6215323ad55
child 63 09d657f1ee00
--- a/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp	Tue Jul 06 15:43:30 2010 +0300
+++ b/accessoryservices/pluggeddisplay/pluggeddisplayengine/src/edidhandler.cpp	Wed Aug 18 11:03:14 2010 +0300
@@ -25,6 +25,7 @@
 #include <e32math.h>
 #include <accessoriescrkeys.h>
 #include <centralrepository.h>
+#include <sysutil.h>
 
 #include "pdeconstants.h"
 #include "tvoutconfigforhdmi.h"
@@ -542,7 +543,6 @@
 					INFO_1( "Updating the Rawdata for the Block %d...", iCurrentBlock );
 					iEdidParserPtr->UpdateRawDataL(dataBlockDes);
 					
-					iCurrentBlock++;
 					if( inbrOfExtensions >= 2 )
 						{
  						inbrOfExtensions = inbrOfExtensions - 2;
@@ -555,6 +555,7 @@
 
 				if( inbrOfExtensions )
 					{
+					iCurrentBlock++;
 					iRetryCounter = KErrNone;
 					
 					if( ReadEDIDDataL() != KErrNone )
@@ -587,12 +588,11 @@
 								}
  							}
 						}
+					TRACE_EDID_DATA( *iEdidParserPtr );
+					
+					iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
+					iRetryCounter = KErrNone;
 					}
-
-				TRACE_EDID_DATA( *iEdidParserPtr );
-				
-				iFSM.Input( EPDEIfEDIDHandler, EPDEIfEDIDHandlerEventEdidDataFetched );
-				iRetryCounter = KErrNone;
 				}
             else
                 {
@@ -637,7 +637,7 @@
 // RunL
 //------------------------------------------------------------------------------
 //
-TInt CEDIDHandler::RunError( TInt aError )
+TInt CEDIDHandler::RunError( TInt /*aError*/ )
     {
     FUNC_LOG;
     
@@ -771,7 +771,65 @@
 		}
     Mem::FillZ( ( TAny* )&aTimings.iProductName, ( sizeof( TChar ) * KProductNameChars ) );
     Mem::FillZ( ( TAny* )&aTimings.iProductDescription, ( sizeof( TChar ) * KProductDescriptorsChars ) );
-    aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown;
+    	
+    TInt err = KErrNone;
+    CDeviceTypeInformation* deviceTypeInfo = NULL;
+    TRAP(err, deviceTypeInfo = SysUtil::GetDeviceTypeInfoL());
+    
+    if(KErrNone == err)
+        {
+        #define MAX(a, b) (((a)>(b)) ? (a) : (b))
+        #define MIN(a, b) (((a)<(b)) ? (a) : (b))
+        
+        TPtrC16 bufPtrModelCode;
+        TPtrC16 bufPtrManufacturerName;
+        TUint loopCount;
+        TUint maxLen;
+        TUint maxCharsLen;
+        TUint minNameCharsLen;
+        TUint minDescritopCharsLen;
+        
+        deviceTypeInfo->GetManufacturerName(bufPtrManufacturerName);
+        deviceTypeInfo->GetModelCode(bufPtrModelCode);
+        maxLen = MAX(bufPtrModelCode.Length(),bufPtrManufacturerName.Length());
+        maxCharsLen = MAX(KProductNameChars,KProductDescriptorsChars);
+        minNameCharsLen = MIN(KProductNameChars, bufPtrModelCode.Length());
+        minDescritopCharsLen = MIN(KProductDescriptorsChars, bufPtrManufacturerName.Length());
+        
+        INFO_1( "maxLen : %d", maxLen);
+        INFO_1( "maxCharsLen : %d", maxCharsLen);
+        INFO_1( "minNameCharsLen : %d", minNameCharsLen);
+        INFO_1( "minDescritopCharsLen : %d", minDescritopCharsLen);
+        
+        for(loopCount = 0; loopCount < maxLen; loopCount++)
+            {
+            if(loopCount >= maxCharsLen)
+                {
+                        break;
+                }
+            else
+                {
+                    if(loopCount <  minNameCharsLen)
+                        {
+                        aTimings.iProductName[loopCount] = bufPtrModelCode[loopCount];
+                        INFO_1( "aTimings.iProductName : %d", aTimings.iProductName[loopCount].GetLowerCase());
+                        }
+                    if(loopCount <  minDescritopCharsLen)
+                        {
+                        aTimings.iProductDescription[loopCount] = bufPtrManufacturerName[loopCount];
+                        INFO_1( "aTimings.iProductDescription : %d", aTimings.iProductDescription[loopCount].GetLowerCase());
+                        }
+                }
+            }
+        INFO("Before Deleting Pointer deviceTypeInfo");
+        delete deviceTypeInfo;
+        INFO("After Deleting Pointer deviceTypeInfo");
+        aTimings.iSourceType = THdmiDviTimings::ESourceTypePCGeneral;
+        }
+    else
+        {
+        aTimings.iSourceType = THdmiDviTimings::ESourceTypeUnknown;
+        }
     }
 
 //------------------------------------------------------------------------------
@@ -1557,6 +1615,30 @@
 		    else // It is DVI connector
 		    {
 				TInt modecount = aHdmiConfigs.Count();
+
+				if( !modecount )
+					{
+					THdmiDviTimings timings;
+					
+					INFO( "==No EDID available from the Sink. Setting DMT 4" );
+					// No EDID data available from the sink
+					// Default VGA resolution should be selected
+					const TTimingItem* item = TimingByIndex( KDefaultDMTModeIndex, ETimingModeDMT );
+					if( item )
+						{
+						Mem::FillZ( ( TAny* )&timings, sizeof( timings ) );
+						FillHdmiDviTimings( *item, timings );
+						timings.iTvPhysicalImageAspectRatioNumerator = 4;
+						timings.iTvPhysicalImageAspectRatioDenominator = 3;
+						retVal = aHdmiConfigs.Append( timings );
+						ERROR_1( retVal, "Failed to append DMT timing: %S in array", item->iTimingName );
+						if( retVal == KErrNone )
+							{
+							modecount = 1;
+							ceaMode = EFalse;
+							}
+						}
+					}
 				
 				while( modecount-- )
 				  {