/* * Copyright (c) 2005 University of Utah and the Flux Group. * * {{{EMULAB-LICENSE * * This file is part of the Emulab network testbed software. * * This file is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at * your option) any later version. * * This file is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public * License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this file. If not, see . * * }}} */ #include "config.h" #define DEBUG #include #include #include #include #include #include #include "mtp.h" int main(int argc, char *argv[]) { static struct mtp_control mc = { 42, MTP_PP_ERROR_MALLOC, "I've come undone" }; static struct robot_config rcr[3] = { { 1, "node1" }, { 2, "node2" }, { 3, "node3" }, }; static struct mtp_config_rmc mcr = { 3, rcr, { 10.1, 20.2 } }; static struct robot_config rcv[3] = { { 4, "vnode4" }, { 5, "vnode5" }, { 6, "vnode6" }, }; static struct mtp_config_vmc mcv = { 3, rcv }; static struct mtp_request_position mrp = { 4 }; static struct mtp_update_position mup = { 3, { 5, 25, 0.44, 20.5 }, MTP_POSITION_STATUS_IDLE }; static struct mtp_request_id mri = { 169, { 3.1, 20.2, 69.5, 20.5 } }; static struct mtp_update_id mui = { 30, 2 }; static struct mtp_command_goto mcg = { 5, 3, { 2.2, 13.3, 73.4, 500.04 }, }; static struct mtp_command_goto mcs = { 4, 2, }; static struct mtp_wiggle_request mwr = { 4, 1, }; static struct mtp_wiggle_status mws = { 4, 4, }; int fd, retval = EXIT_SUCCESS; if ((fd = open("mtp_stream.dat", O_CREAT | O_TRUNC | O_RDWR, 0666)) < 0) { perror("Could not open 'mtp_stream.dat'?"); } else { struct mtp_packet *mp; int lpc; assert(mp = mtp_make_packet(MTP_CONTROL_ERROR, MTP_ROLE_EMC, &mc)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_CONFIG_RMC, MTP_ROLE_RMC, &mcr)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_CONFIG_VMC, MTP_ROLE_VMC, &mcv)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_REQUEST_POSITION, MTP_ROLE_VMC, &mrp)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_UPDATE_POSITION, MTP_ROLE_VMC, &mup)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_REQUEST_ID, MTP_ROLE_VMC, &mri)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_UPDATE_ID, MTP_ROLE_VMC, &mui)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_COMMAND_GOTO, MTP_ROLE_VMC, &mcg)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_COMMAND_STOP, MTP_ROLE_VMC, &mcs)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_WIGGLE_REQUEST, MTP_ROLE_VMC, &mwr)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); assert(mp = mtp_make_packet(MTP_WIGGLE_REQUEST, MTP_ROLE_VMC, &mws)); assert(mtp_send_packet(fd,mp) == MTP_PP_SUCCESS); lseek(fd,0,SEEK_SET); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_CONTROL_ERROR); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_EMC); assert(mp->data.control->id == mc.id); assert(mp->data.control->code == mc.code); assert(strcmp(mp->data.control->msg, mc.msg) == 0); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_CONFIG_RMC); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_RMC); assert(mp->data.config_rmc->num_robots == mcr.num_robots); assert(mp->data.config_rmc->box.horizontal == mcr.box.horizontal); assert(mp->data.config_rmc->box.vertical == mcr.box.vertical); for (lpc = 0; lpc < mcr.num_robots; lpc++) { assert(mp->data.config_rmc->robots[lpc].id == mcr.robots[lpc].id); assert(strcmp(mp->data.config_rmc->robots[lpc].hostname, mcr.robots[lpc].hostname) == 0); } assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_CONFIG_VMC); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.config_vmc->num_robots == mcv.num_robots); for (lpc = 0; lpc < mcv.num_robots; lpc++) { assert(mp->data.config_vmc->robots[lpc].id == mcv.robots[lpc].id); assert(strcmp(mp->data.config_vmc->robots[lpc].hostname, mcv.robots[lpc].hostname) == 0); } assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_REQUEST_POSITION); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.request_position->robot_id == mrp.robot_id); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_UPDATE_POSITION); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.update_position->robot_id == mup.robot_id); assert(mp->data.update_position->position.x == mup.position.x); assert(mp->data.update_position->position.y == mup.position.y); assert(mp->data.update_position->position.theta == mup.position.theta); assert(mp->data.update_position->position.timestamp == mup.position.timestamp); assert(mp->data.update_position->status == mup.status); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_REQUEST_ID); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.request_id->position.x == mri.position.x); assert(mp->data.request_id->position.y == mri.position.y); assert(mp->data.request_id->position.theta == mri.position.theta); assert(mp->data.request_id->position.timestamp == mri.position.timestamp); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_UPDATE_ID); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.update_id->robot_id == mui.robot_id); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_COMMAND_GOTO); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.command_goto->command_id == mcg.command_id); assert(mp->data.command_goto->robot_id == mcg.robot_id); assert(mp->data.command_goto->position.x == mcg.position.x); assert(mp->data.command_goto->position.y == mcg.position.y); assert(mp->data.command_goto->position.theta == mcg.position.theta); assert(mp->data.command_goto->position.timestamp == mcg.position.timestamp); assert(mtp_receive_packet(fd,&mp) == MTP_PP_SUCCESS); assert(mp->opcode == MTP_COMMAND_STOP); assert(mp->version == MTP_VERSION); assert(mp->role == MTP_ROLE_VMC); assert(mp->data.command_goto->command_id == mcs.command_id); assert(mp->data.command_goto->robot_id == mcs.robot_id); close(fd); fd = -1; } return retval; }