Пример #1
0
// this sets the property of a puck to a value
osaPuck::Errno osaPuck::SetProperty( Barrett::ID propid, 
				     Barrett::Value propval,
				     bool verify){

  // empty CAN frame
  osaCANBusFrame frame;

  // pack the property ID and value in a "set" CAN frame 
  if( PackProperty( frame, Barrett::SET, propid, propval )!=osaPuck::ESUCCESS ){
    CMN_LOG_RUN_WARNING << LogPrefix() << "Failed to pack property " << propid
			<< std::endl;
    return osaPuck::EFAILURE;
  }
  
  // send the CAN frame
  if( canbus->Send( frame ) != osaCANBus::ESUCCESS ){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Failed to send the CAN frame." 
		      << std::endl;
    return osaPuck::EFAILURE;
  }
  
  // do we double check that the value was set?
  if( verify ){
    
    // If we just changed the status of the puck, give it a bit of time to
    // initialize itself
    if( propid  == Barrett::STATUS && propval == osaPuck::STATUS_READY )
      osaSleep( 1.0 );
    else
      osaSleep( 0.01 );

    // query the puck to make sure that the property is set
    Barrett::Value recvpropval = rand();
    if( GetProperty( propid, recvpropval ) != osaPuck::ESUCCESS ){
      CMN_LOG_RUN_WARNING << LogPrefix()<<"Failed to get puck property"
			  << std::endl;
      return osaPuck::EFAILURE;
    }

    if( propval != recvpropval ){
      CMN_LOG_RUN_WARNING << LogPrefix() << "Oop! Unexpected property value. " 
			  << "Expected " << propval << " got " << recvpropval
			  << std::endl;
      return osaPuck::EFAILURE;
    }

  }
  
  return osaPuck::ESUCCESS;
}
Пример #2
0
static MessageData
PackWinEntry(Display *dpy, 
	    int screen_num, MessageData data, WSMWinEntry *win_entry)
{
    int i;

    data = PackListNum(data, win_entry->num_windows);
    for (i = 0;  i < win_entry->num_windows;  i++)
      data = PackWindow(data, win_entry->windows[i]);

    data = PackListNum(data, win_entry->num_match_properties);
    for (i = 0;  i <  win_entry->num_match_properties;  i++)
      data = PackProperty(data, win_entry->match_properties[i]);

    return(data);
}
Пример #3
0
// Get a property from the puck. this sends a query to the puck and wait for
// its reply
osaPuck::Errno osaPuck::GetProperty( Barrett::ID propid,
 				     Barrett::Value& propvalue ){ 

  // empty CAN frame
  osaCANBusFrame sendframe;
    
  // pack the query in a can frame
  if( PackProperty( sendframe, Barrett::GET, propid ) != osaPuck::ESUCCESS ){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Failed to pack property" << std::endl;
    return osaPuck::EFAILURE;
  }
  
  // send the CAN frame
  if( canbus->Send( sendframe ) != osaCANBus::ESUCCESS ){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Failed to querry puck" << std::endl;
    return osaPuck::EFAILURE;
  }
  
  // empty CAN frame
  osaCANBusFrame recvframe;

  // receive the response in a CAN frame
  if( canbus->Recv( recvframe ) != osaCANBus::ESUCCESS ){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Failed to receive property"
		      << std::endl;
    return osaPuck::EFAILURE;
  }
  
  // unpack the can frame
  Barrett::ID recvpropid;
  if(UnpackCANFrame( recvframe, recvpropid, propvalue ) != osaPuck::ESUCCESS){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Failed to unpack CAN frame."
		      << std::endl;
    return osaPuck::EFAILURE;
  }

  // make sure that the property received is the one we asked for
  if( propid != recvpropid ){
    CMN_LOG_RUN_ERROR << LogPrefix() << "Oop! Unexpected property ID. "
		      << "Expected " << propid << " got " << recvpropid
		      << std::endl;
    return osaPuck::EFAILURE;
  }
  
  return osaPuck::ESUCCESS;
}
Пример #4
0
MessageData 
_WSMPackRequest(Display *dpy, int screen_num, WSMRequest *request,
		unsigned long *msg_data_len, WSMErrorCode *error)
{
    MessageData data, save;
    int i;
    long size;
    WSMWinInfo *win_info;
    WSMConfigFormatData *global_attrs, *win_attrs, *icon_attrs;

    *msg_data_len = 0;		/* default value. */

    global_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_GLOBAL_FMT);
    win_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_WINDOW_FMT);
    icon_attrs = _WSMGetConfigFormat(dpy, screen_num, WSM_ICON_FMT);

    *error = WSM_SUCCESS;

    if (_WSMRequiresConfigFormat(request->any.type) && 
	(global_attrs->num_attrs == 0) && 
	(win_attrs->num_attrs == 0) && (icon_attrs->num_attrs == 0))
    {
	*error = WSM_ERROR_NO_CONFIG_FORMAT;
	return(NULL);
    }
    if (((request->any.type == WSM_CONNECT) ||
	 (request->any.type == WSM_CONFIG_FMT)) &&
	((global_attrs->num_attrs != 0) ||
	 (win_attrs->num_attrs != 0) || (icon_attrs->num_attrs != 0)))
    {
	*error = WSM_ERROR_ALREADY_HAVE_CONFIG_FORMAT;
	return(NULL);
    }

    /* before sending extensions make sure screen_info config format
       is cleared */
    /* may want to remove this and leave it up to application writer */
    if ((request->any.type == WSM_EXTENSIONS) && 
	((global_attrs->num_attrs != 0) ||
	 (win_attrs->num_attrs != 0) || (icon_attrs->num_attrs != 0)))
      {
	_WSMClearConfigScreenInfo(dpy,screen_num);
      }
    /*
     *  Calculate the size of the request.
     */
    switch (request->any.type) {
    case WSM_CONNECT:
	size = COUNT_SIZE;
	size += sizeof(CARD8) * request->connect.num_versions;
	break;
    case WSM_EXTENSIONS:
	size = COUNT_SIZE;
	for (i = 0; i < request->extensions.num_extensions; i++) {
	    size += (strlen(request->extensions.extension_suggestions[i]) +
		     COUNT_SIZE);
	}
	break;
    case WSM_CONFIG_FMT:
	size = 0;
	break;
    case WSM_GET_STATE:
	size = sizeof(CARD32) + BOOL_SIZE;
	break;
    case WSM_SET_STATE:
	size = COUNT_SIZE;	/* The count of window info. */
	win_info = request->set_state.win_info_list;
	for (i = 0; i < request->set_state.num_win_info_list; i++,win_info++)
	    size += WinInfoSizePacked(dpy, screen_num, win_info);
	break;
    case WSM_REG_WINDOW:
	size = sizeof(CARD32);
	break;
    case WSM_WM_GET_BACKGROUND_WINDOW:
	size = sizeof(CARD16);
	break;
    case WSM_WM_SET_BACKGROUND_WINDOW:
	size = sizeof(CARD32);
	break;
    case WSM_WM_WINDOWS:
	size = sizeof(CARD32); /* flag */
	size += COUNT_SIZE;    /* prop count */
	size += request->wm_windows.num_window_properties * sizeof(Window);
	size += COUNT_SIZE;    /* num match attributes */
	for (i=0; i<request->wm_windows.num_match_attributes; i++)
	  {
	    size += COUNT_SIZE; /* num attributes */
	    size += 2 *
	            request->wm_windows.match_attributes[i]->num_attributes *
		    sizeof(WindowProperty);
	  }
	break;
    case WSM_WM_FOCUS:
	size = 0;
	break;
    case WSM_WM_POINTER:
	size = 0;
	break;
    default:
	return(NULL);
    }

    save = data = (MessageData) XtMalloc(size);

    /*
     * Fill in the message.
     */
    switch (request->any.type) {
    case WSM_CONNECT:
	data = PackListNum(data, request->connect.num_versions);
	for (i = 0; i < request->connect.num_versions; i++) 
	    data = PackCARD8(data, (CARD8) request->connect.known_versions[i]);
	break;
    case WSM_EXTENSIONS:
	data = PackListNum(data, request->extensions.num_extensions);
	for (i = 0; i < request->extensions.num_extensions; i++) 
	    data=PackString(data,request->extensions.extension_suggestions[i]);
	break;
    case WSM_CONFIG_FMT:
	break;
    case WSM_GET_STATE:
	data = PackWindow(data, request->get_state.window);
	(void) PackBoolean(data, request->get_state.diffs_allowed);
	break;
    case WSM_SET_STATE:
	win_info = request->set_state.win_info_list;
	data = PackListNum(data, request->set_state.num_win_info_list);
	for (i = 0; i < request->set_state.num_win_info_list; i++, win_info++)
	    data = PackWinInfo(dpy, screen_num, data, win_info);
	break;
    case WSM_REG_WINDOW:
	(void) PackWindow(data, request->register_window.window);
	break;
    case WSM_WM_GET_BACKGROUND_WINDOW:
	(void) PackCARD16(data, request->get_background.screen);
	break;
    case WSM_WM_SET_BACKGROUND_WINDOW:
	(void) PackWindow(data, request->set_background.window);
	break;
    case WSM_WM_WINDOWS:
	{
	  int i, j;

	  data = PackCARD32(data, request->wm_windows.location_flag);
	  data = PackListNum(data, request->wm_windows.num_window_properties);
	  for (i=0; i<request->wm_windows.num_window_properties; i++)
	    data = PackProperty(data, request->wm_windows.window_properties[i]);

	  data = PackListNum(data, request->wm_windows.num_match_attributes);
	  for (i = 0;  i < request->wm_windows.num_match_attributes;  i++)
	    {
	      AttributePair *match_attr;

	      match_attr = request->wm_windows.match_attributes[i];
	      data = PackListNum(data, match_attr->num_attributes);

	      for (j = 0;  j < match_attr->num_attributes;  j++)
		data = PackProperty(data, match_attr->allowed_attributes[j]);

	      for (j = 0;  j < match_attr->num_attributes;  j++)
		data = PackProperty(data, match_attr->prohibited_attributes[j]);
	    }
	}
	break;
    case WSM_WM_FOCUS:
	break;
    case WSM_WM_POINTER:
	break;
    default:
	break;
    }
    
    *msg_data_len = size;
    return(save);
} /* _WSMPackRequest */