Infrared Control, OBEX

Do you need a registry key to do a specific task? Would you like to customize the way your PocketPC/Smartphone looks and works? This is the right place.

Moderators: Teksoft, admin

Infrared Control, OBEX

Postby radhoo » Fri Mar 23, 2007 4:37 pm

To control the Infrared state (on/off) in a similar way as in the control pannel, and to get the current state of the infrared module use the code below:

Code: Select all
//set irda service status
HRESULT OBEXIOCTL(DWORD dwIOCTL)
{
    HANDLE hService;
    BOOL fRet;
    hService = CreateFile(TEXT("OBX0:"),GENERIC_READ|GENERIC_WRITE,0,
                          NULL,OPEN_EXISTING,0,NULL);
    if (INVALID_HANDLE_VALUE == hService)
   {
      CloseHandle(hService);
      return FALSE;
   }
    fRet = DeviceIoControl(hService,dwIOCTL,0,0,0,0,NULL,0);
    CloseHandle(hService);
    return (0 == fRet)?E_FAIL:S_OK;
}

//query irda service status
DWORD OBEXQuery()
{
    HANDLE hService;
    BOOL fRet;
    DWORD dwStatus;
    hService = CreateFile(TEXT("OBX0:"),GENERIC_READ|GENERIC_WRITE,0,
                          NULL,OPEN_EXISTING,0,NULL);
    if (INVALID_HANDLE_VALUE == hService)
   {
      CloseHandle(hService);
      return FALSE;
   }
    fRet = DeviceIoControl(hService,IOCTL_SERVICE_STATUS,0,0,&dwStatus,sizeof(DWORD),0, 0);
    CloseHandle(hService);
    if(0 == fRet)
       return 0xFFFFFFFF;
   else   
      return dwStatus;
}

bool GetIRDAState()
{
   switch(OBEXQuery())
   {
      case SERVICE_STATE_SHUTTING_DOWN:
      case SERVICE_STATE_UNLOADING:
      case SERVICE_STATE_UNINITIALIZED:
      case SERVICE_STATE_OFF:
         return 0;
         break;
      
      case SERVICE_STATE_STARTING_UP:
      case SERVICE_STATE_ON:
         return 1;
         break;
      default:
         break;
   };
   return 0;
}


A short sample on how to set the states:

Code: Select all
HRESULT hr = S_OK;
               switch(OBEXQuery())
               {
               // If the IRDA is off, turn it back on.
                  case SERVICE_STATE_SHUTTING_DOWN:
                  case SERVICE_STATE_UNLOADING:
                  case SERVICE_STATE_UNINITIALIZED:
                  case SERVICE_STATE_OFF:
                     hr = OBEXIOCTL(IOCTL_SERVICE_START);
                     break;
                  // If the IRDA is on, turn it off.
                  case SERVICE_STATE_STARTING_UP:
                  case SERVICE_STATE_ON:
                     hr = OBEXIOCTL(IOCTL_SERVICE_STOP);
                     break;
                  default:
                     break;
               };
               if(FAILED(hr))
                  MessageBox( hwnd, TEXT("Setting device IOCTL failed. Please retry later."), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION);
radhoo
TEK-Insider
TEK-Insider
 
Posts: 640
Joined: Fri Mar 17, 2006 2:47 am

Postby radhoo » Fri Mar 23, 2007 4:38 pm

Another (unreliable) solution is with this registry key:

Code: Select all
void SetIrdaState(DWORD state)
{
HKEY m_hKey;
DWORD dwDisposition;
DWORD i = state;
if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("\\Software\\Microsoft\\Obex"),0,NULL,0,0,NULL,
&m_hKey, &dwDisposition) == ERROR_SUCCESS)
{
RegSetValueEx(m_hKey,TEXT("IsEnabled"),0,REG_DWORD, (BYTE*)&i,sizeof(i));
RegCloseKey(m_hKey);
}
}


Setting Infrared on/off is important for controlling the power consumption.
radhoo
TEK-Insider
TEK-Insider
 
Posts: 640
Joined: Fri Mar 17, 2006 2:47 am

Re: Infrared Control, OBEX

Postby WalterBM » Wed Jun 20, 2007 11:17 am

Hi,

thanks for that good advice.

I have a additional question to that theme.

I developed a virtual COM driver, which is implemented with a privileged signed certificate. So this driver starts at boot time. If the user wants to setup the 'real' port for the driver, I found only solutions like writing the HKLM\drivers\builtIn\virtcom\Index key in registry and doing a softreset afterwards.

To circumnavigate that softreset, I want to use your snippet to activate/deactivate the virtual Port driver.

Unfortunatelly the DeviceIOControl function reports an error (LastError = 87: invalid parameter).

So, my question is: Is this the right solution anyway to solve my problem? If yes, what can I do to get it run?

Thanks in advance

Bernd M. Walter
WalterBM
TEK-Newbie
TEK-Newbie
 
Posts: 1
Joined: Thu Mar 22, 2007 8:02 pm


Return to Developers

Who is online

Users browsing this forum: No registered users and 0 guests


cron