// 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; }
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); }
// 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; }
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 */