bool WayPointFileWinPilot::parseLine(const TCHAR* line, const unsigned linenum, Waypoints &way_points, const RasterTerrain *terrain) { TCHAR ctemp[255]; const TCHAR *params[20]; size_t n_params; // If (end-of-file or comment) if (line[0] == '\0' || line[0] == 0x1a || _tcsstr(line, _T("**")) == line || _tcsstr(line, _T("*")) == line) // -> return without error condition return true; if (_tcslen(line) >= sizeof(ctemp) / sizeof(ctemp[0])) /* line too long for buffer */ return false; GeoPoint location; // Get fields n_params = extractParameters(line, ctemp, params, 20); if (n_params < 6) return false; // Latitude (e.g. 51:15.900N) if (!parseAngle(params[1], location.Latitude, true)) return false; // Longitude (e.g. 00715.900W) if (!parseAngle(params[2], location.Longitude, false)) return false; Waypoint new_waypoint(location); new_waypoint.FileNum = file_num; // Name (e.g. KAMPLI) if (!parseString(params[5], new_waypoint.Name)) return false; // Altitude (e.g. 458M) /// @todo configurable behaviour bool alt_ok = parseAltitude(params[3], new_waypoint.Altitude); check_altitude(new_waypoint, terrain, alt_ok); if (n_params > 6) { // Description (e.g. 119.750 Airport) parseString(params[6], new_waypoint.Comment); } // Waypoint Flags (e.g. AT) parseFlags(params[4], new_waypoint.Flags); add_waypoint(way_points, new_waypoint); return true; }
void main_game::add_waypoint_to_selection(waypoint new_waypoint) { for (auto& selected_ship : teams[0].selected_ships) { auto controller = (waypoint_controller*)selected_ship->get_controller(); if (!keyboard->is_key_down(keys::ShiftLeft)) { controller->clear_waypoints(*selected_ship); } controller->add_waypoint(*selected_ship, new_waypoint); } }
void setup_waypoints() { add_waypoint(degToRad(51.298349), degToRad(1.069928)); add_waypoint(degToRad(51.297772), degToRad(1.070301)); add_waypoint(degToRad(51.297048), degToRad(1.069866)); add_waypoint(degToRad(51.296581), degToRad(1.068332)); add_waypoint(degToRad(51.2974), degToRad(1.067618)); add_waypoint(degToRad(51.29795), degToRad(1.068573)); add_waypoint(degToRad(51.298356), degToRad(1.069871)); }
bool WayPointFileZander::parseLine(const TCHAR* line, const unsigned linenum, Waypoints &way_points, const RasterTerrain *terrain) { // If (end-of-file or comment) if (line[0] == '\0' || line[0] == 0x1a || _tcsstr(line, _T("**")) == line || _tcsstr(line, _T("*")) == line) // -> return without error condition return true; // Determine the length of the line size_t len = _tcslen(line); // If less then 34 characters -> something is wrong -> cancel if (len < 34) return false; GeoPoint location; // Latitude (Characters 13-20 // DDMMSS(N/S)) if (!parseAngle(line + 13, location.Latitude, true)) return false; // Longitude (Characters 21-29 // DDDMMSS(E/W)) if (!parseAngle(line + 21, location.Longitude, false)) return false; Waypoint new_waypoint(location); new_waypoint.FileNum = file_num; // Name (Characters 0-12) if (!parseString(line, new_waypoint.Name)) return false; // Altitude (Characters 30-34 // e.g. 1561 (in meters)) /// @todo configurable behaviour bool alt_ok = parseAltitude(line + 30, new_waypoint.Altitude); check_altitude(new_waypoint, terrain, alt_ok); // Description (Characters 35-44) if (len > 35) parseString(line + 35, new_waypoint.Comment); // Flags (Characters 45-49) if (len > 45) parseFlags(line + 45, new_waypoint.Flags); add_waypoint(way_points, new_waypoint); return true; }
static inline void MissionItem(mavlink_message_t* handle_msg) { int16_t flags; struct waypoint3D wp; mavlink_mission_item_t packet; //send_text((uint8_t*)"waypoint\r\n"); // DPRINT("mission item\r\n"); // Check if receiving waypoint if (!mavlink_flags.mavlink_receiving_waypoints) return; // decode mavlink_msg_mission_item_decode(handle_msg, &packet); if (mavlink_check_target(packet.target_system, packet.target_component)) return; DPRINT("mission item: %u\r\n", packet.seq); // check if this is the requested waypoint if (packet.seq != waypoint_request_i) return; // store waypoint //uint8_t loadAction = 0; // 0 insert in list, 1 exec now switch (packet.frame) { case MAV_FRAME_GLOBAL: { // DPRINT("FRAME_GLOBAL\r\n"); //struct waypoint3D { int32_t x; int32_t y; int16_t z; }; //struct waypointDef { struct waypoint3D loc; int16_t flags; struct waypoint3D viewpoint; }; // DPRINT("packet.x %f packet.y %f packet.z %f\r\n", packet.x, packet.y, packet.z); //tell_command.lng = 1.0e7*packet.x; //tell_command.lat = 1.0e7*packet.y; //tell_command.alt = packet.z*1.0e2; // MatrixPilot uses X & Y in reverse to QGC wp.x = packet.y * 1.0e7; wp.y = packet.x * 1.0e7; wp.z = packet.z; flags = F_ABSOLUTE; break; } case MAV_FRAME_LOCAL_NED: // local (relative to home position) { DPRINT("FRAME_LOCAL - not implemented\r\n"); //tell_command.lng = 1.0e7*ToDeg(packet.x/ //(radius_of_earth*cos(ToRad(home.lat/1.0e7)))) + home.lng; //tell_command.lat = 1.0e7*ToDeg(packet.y/radius_of_earth) + home.lat; //tell_command.alt = -packet.z*1.0e2 + home.alt; break; } } // defaults //tell_command.id = CMD_BLANK; // Currently F can be set to: F_NORMAL, or any combination of: // F_ABSOLUTE - Waypoints are Relative by default, unless F_ABSOLUTE is specified. // // F_TAKEOFF - More quickly gain altitude at takeoff. // F_INVERTED - Navigate to this waypoint with the plane upside down. (only if STABILIZE_INVERTED_FLIGHT is set to 1 in options.h) // F_HOVER - Hover the plane until reaching this waypoint. (only if STABILIZE_HOVER is set to 1 in options.h) // NOTE: while hovering, no navigation is performed, and throttle is under manual control. // F_LOITER - After reaching this waypoint, continue navigating towards this same waypoint. Repeat until leaving waypoint mode. // F_TRIGGER - Trigger an action to happen when this waypoint leg starts. (See the Trigger Action section of the options.h file.) // F_ALTITUDE_GOAL - Climb or descend to the given altitude, then continue to the next waypoint. // F_CROSS_TRACK - Navigate using cross-tracking. Best used for longer waypoint legs. // F_LAND - Navigate towards this waypoint with the throttle off. switch (packet.command) { case MAV_CMD_NAV_TAKEOFF: DPRINT("NAV_TAKEOFF\r\n"); //tell_command.id = CMD_TAKEOFF; flags |= F_TAKEOFF; break; case MAV_CMD_NAV_LAND: DPRINT("NAV_LAND\r\n"); //tell_command.id = CMD_LAND; flags |= F_LAND; break; case MAV_CMD_NAV_WAYPOINT: // DPRINT("NAV_WAYPOINT\r\n"); //tell_command.id = CMD_WAYPOINT; break; case MAV_CMD_NAV_LOITER_UNLIM: // DPRINT("NAV_LOITER\r\n"); //tell_command.id = CMD_LOITER_TIME; //tell_command.p1 = packet.param2/1.0e2; break; } // save waypoint add_waypoint(wp, flags); //set_wp_with_index(tell_command, packet.seq); // update waypoint receiving state machine //global_data.waypoint_timelast_receive = millis(); mavlink_waypoint_timeout = MAVLINK_WAYPOINT_TIMEOUT; waypoint_request_i++; if (waypoint_request_i == get(PARAM_WP_TOTAL)) { uint8_t type = 0; // ok (0), error(1) //gcs.send_text("flight plane received"); DPRINT("flight plan received\r\n"); mavlink_msg_mission_ack_send(MAVLINK_COMM_0, handle_msg->sysid, handle_msg->compid, type); mavlink_flags.mavlink_receiving_waypoints = false; // XXX ignores waypoint radius for individual waypoints, can // only set WP_RADIUS parameter // send MAVLINK_MSG_ID_MISSION_ACK ? } else { mavlink_flags.mavlink_request_specific_waypoint = 1; } }
bool WayPointFileSeeYou::parseLine(const TCHAR* line, const unsigned linenum, Waypoints &way_points, const RasterTerrain *terrain) { TCHAR ctemp[255]; const TCHAR *params[20]; size_t n_params; static unsigned iName = 0, iCode = 1, iCountry = 2; static unsigned iLatitude = 3, iLongitude = 4, iElevation = 5; static unsigned iStyle = 6, iRWDir = 7, iRWLen = 8; static unsigned iFrequency = 9, iDescription = 10; static bool ignore_following = false; // If (end-of-file or comment) if (line[0] == '\0' || line[0] == 0x1a || _tcsstr(line, _T("**")) == line || _tcsstr(line, _T("*")) == line) // -> return without error condition return true; if (_tcslen(line) >= sizeof(ctemp) / sizeof(ctemp[0])) /* line too long for buffer */ return false; // Parse first line holding field order /// @todo linenum == 0 should be the first /// (not ignored) line, not just line 0 if (linenum == 0) { // Get fields n_params = extractParameters(line, ctemp, params, 20); // Iterate through fields and save the field order for (unsigned i = 0; i < n_params; i++) { const TCHAR* value = params[i]; if (!_tcscmp(value, _T("name"))) iName = i; else if (!_tcscmp(value, _T("code"))) iCode = i; else if (!_tcscmp(value, _T("country"))) iCountry = i; else if (!_tcscmp(value, _T("lat"))) iLatitude = i; else if (!_tcscmp(value, _T("lon"))) iLongitude = i; else if (!_tcscmp(value, _T("elev"))) iElevation = i; else if (!_tcscmp(value, _T("style"))) iStyle = i; else if (!_tcscmp(value, _T("rwdir"))) iRWDir = i; else if (!_tcscmp(value, _T("rwlen"))) iRWLen = i; else if (!_tcscmp(value, _T("freq"))) iFrequency = i; else if (!_tcscmp(value, _T("desc"))) iDescription = i; } ignore_following = false; return true; } // If task marker is reached ignore all following lines if (_tcsstr(line, _T("-----Related Tasks-----")) == line) ignore_following = true; if (ignore_following) return true; // Get fields n_params = extractParameters(line, ctemp, params, 20); // Check if the basic fields are provided if (iName >= n_params) return false; if (iLatitude >= n_params) return false; if (iLongitude >= n_params) return false; GeoPoint location; // Latitude (e.g. 5115.900N) if (!parseAngle(params[iLatitude], location.Latitude, true)) return false; // Longitude (e.g. 00715.900W) if (!parseAngle(params[iLongitude], location.Longitude, false)) return false; Waypoint new_waypoint(location); new_waypoint.FileNum = file_num; // Name (e.g. "Some Turnpoint", with quotes) if (!parseString(params[iName], new_waypoint.Name)) return false; // Elevation (e.g. 458.0m) /// @todo configurable behaviour bool alt_ok = iElevation < n_params && parseAltitude(params[iElevation], new_waypoint.Altitude); check_altitude(new_waypoint, terrain, alt_ok); // Description (e.g. "Some Turnpoint", with quotes) /// @todo include frequency and rwdir/len if (iDescription < n_params) parseString(params[iDescription], new_waypoint.Comment); // Style (e.g. 5) /// @todo include peaks with peak symbols etc. if (iStyle < n_params) parseStyle(params[iStyle], new_waypoint.Flags); // If the Style attribute did not state that this is an airport if (!new_waypoint.Flags.Airport) { // -> parse the runway length fixed rwlen; // Runway length (e.g. 546.0m) if (iRWLen < n_params && parseAltitude(params[iRWLen], rwlen)) { // If runway length is between 100m and 300m -> landpoint if (rwlen > fixed(100) && rwlen <= fixed(300)) new_waypoint.Flags.LandPoint = true; // If runway length is higher then 300m -> airport if (rwlen > fixed(300)) new_waypoint.Flags.Airport = true; } } add_waypoint(way_points, new_waypoint); return true; }
bool command_executor::execute_command(HOTKEY_COMMAND command, int /*index*/) { switch(command) { case HOTKEY_CYCLE_UNITS: cycle_units(); break; case HOTKEY_CYCLE_BACK_UNITS: cycle_back_units(); break; case HOTKEY_ENDTURN: end_turn(); break; case HOTKEY_ADD_WAYPOINT: add_waypoint(); break; case HOTKEY_UNIT_HOLD_POSITION: unit_hold_position(); break; case HOTKEY_END_UNIT_TURN: end_unit_turn(); break; case HOTKEY_LEADER: goto_leader(); break; case HOTKEY_UNDO: undo(); break; case HOTKEY_REDO: redo(); break; case HOTKEY_UNIT_DESCRIPTION: unit_description(); break; case HOTKEY_RENAME_UNIT: rename_unit(); break; case HOTKEY_SAVE_GAME: save_game(); break; case HOTKEY_SAVE_REPLAY: save_replay(); break; case HOTKEY_SAVE_MAP: save_map(); break; case HOTKEY_LOAD_GAME: load_game(); break; case HOTKEY_TOGGLE_ELLIPSES: toggle_ellipses(); break; case HOTKEY_TOGGLE_GRID: toggle_grid(); break; case HOTKEY_STATUS_TABLE: status_table(); break; case HOTKEY_RECALL: recall(); break; case HOTKEY_RECRUIT: recruit(); break; case hotkey::HOTKEY_REPEAT_RECRUIT: repeat_recruit(); break; case HOTKEY_SPEAK: speak(); break; case HOTKEY_SPEAK_ALLY: whisper(); break; case HOTKEY_SPEAK_ALL: shout(); break; case HOTKEY_CREATE_UNIT: create_unit(); break; case HOTKEY_CHANGE_SIDE: change_side(); break; case HOTKEY_PREFERENCES: preferences(); break; case HOTKEY_OBJECTIVES: objectives(); break; case HOTKEY_UNIT_LIST: unit_list(); break; case HOTKEY_STATISTICS: show_statistics(); break; case HOTKEY_STOP_NETWORK: stop_network(); break; case HOTKEY_START_NETWORK: start_network(); break; case HOTKEY_LABEL_TEAM_TERRAIN: label_terrain(true); break; case HOTKEY_LABEL_TERRAIN: label_terrain(false); break; case HOTKEY_CLEAR_LABELS: clear_labels(); break; case HOTKEY_SHOW_ENEMY_MOVES: show_enemy_moves(false); break; case HOTKEY_BEST_ENEMY_MOVES: show_enemy_moves(true); break; case HOTKEY_DELAY_SHROUD: toggle_shroud_updates(); break; case HOTKEY_UPDATE_SHROUD: update_shroud_now(); break; case HOTKEY_CONTINUE_MOVE: continue_move(); break; case HOTKEY_SEARCH: search(); break; case HOTKEY_HELP: show_help(); break; case HOTKEY_CHAT_LOG: show_chat_log(); break; case HOTKEY_USER_CMD: user_command(); break; case HOTKEY_CUSTOM_CMD: custom_command(); break; case HOTKEY_AI_FORMULA: ai_formula(); break; case HOTKEY_CLEAR_MSG: clear_messages(); break; #ifdef USRCMD2 case HOTKEY_USER_CMD_2: //user_command(); user_command_2(); break; case HOTKEY_USER_CMD_3: user_command_3(); break; #endif case HOTKEY_LANGUAGE: change_language(); break; case HOTKEY_PLAY_REPLAY: play_replay(); break; case HOTKEY_RESET_REPLAY: reset_replay(); break; case HOTKEY_STOP_REPLAY: stop_replay(); break; case HOTKEY_REPLAY_NEXT_TURN: replay_next_turn(); break; case HOTKEY_REPLAY_NEXT_SIDE: replay_next_side(); break; case HOTKEY_REPLAY_SHOW_EVERYTHING: replay_show_everything(); break; case HOTKEY_REPLAY_SHOW_EACH: replay_show_each(); break; case HOTKEY_REPLAY_SHOW_TEAM1: replay_show_team1(); break; case HOTKEY_REPLAY_SKIP_ANIMATION: replay_skip_animation(); break; default: return false; } return true; }