Пример #1
0
void robot_lift (robot_t * r)
{
  if (r->x == 0 && r->y == 0) {
    robot_send(r, RESPONSE_SUCCESS, SECRET);
  }
  else {
    robot_send(r, RESPONSE_CANNOT_LIFT);
  }

  robot_destroy(r);
}
Пример #2
0
void robot_move (robot_t * r)
{
  if (r->broken_proc > 0) {
    robot_send(r, RESPONSE_BROKEN_UP);
    robot_destroy(r);
    return;
  }

  r->cnt++;

  if (r->cnt > 6) {
    r->cnt = 0;
    r->broken_proc = (rand() % 9) + 1; // choose a random processor
    robot_send(r, RESPONSE_PROC_FAILURE, r->broken_proc);
    return;
  }

  switch (r->dir) {
    case UP:
      r->y++;
      break;
    case LEFT:
      r->x--;
      break;
    case DOWN:
      r->y--;
      break;
    case RIGHT:
      r->x++;
      break;
  }

  // Got out of the town
  if (r->x < -18 || r->x > 18 || r->y < -18 || r->y > 18) {
    robot_send(r, RESPONSE_CRASH);
    robot_destroy(r);
    return;
  }

  robot_ok(r);
}
Пример #3
0
void robot_repair (robot_t * r, int proc)
{
  r->cnt = 0;

  if (proc == r->broken_proc) {
    r->broken_proc = 0;
    robot_ok(r);
  } else {
    robot_send(r, RESPONSE_PROC_OK);
    robot_destroy(r);
  }
}
Пример #4
0
static void robot_test_login(robot_t *self)
{
	uint64_t start_time;
	uint64_t start_size;
	uint64_t send_time;
	uint64_t recv_time;
	uint64_t rtt;


	robot_open_connection(self);	
	start_time = get_current_ms();
	start_size = self->total_send;

	while(g_working)
	{
		robot_proto_t req;
		robot_proto_t rsp;
		int rand_num = rand();
		uint64_t diff_ms = get_current_ms() - start_time;
		if((diff_ms > 0) && (g_config.speed))
		{
			if(((self->total_send - start_size) / diff_ms) * 1000 > g_config.speed)
			{
				goto idle;
			}
		}
		
		
		req.message_id = e_robot_login_req;
		snprintf(req.message_body.login_req.name, ROBOT_STR_LEN, "robot_%d", self->id);
		snprintf(req.message_body.login_req.pass, ROBOT_STR_LEN, "%d", rand_num);

		send_time = get_current_ms();
		if(!robot_send(self, &req))
		{
			goto error_ret;
		}

		memset(&rsp, 0, sizeof(robot_proto_t));

		if(!robot_expect(self, &rsp))
		{
			goto error_ret;
		}
		recv_time = get_current_ms();
		
		if(rsp.message_id != e_robot_login_rsp)
		{
			ERROR_PRINT("message_id mismatch.");
			exit(1);
		}
		if(strcmp(rsp.message_body.login_rsp.name, req.message_body.login_req.name) != 0)
		{
			ERROR_PRINT("name mismatch.");
			exit(1);
		}
		if(rsp.message_body.login_rsp.sid != rand_num)
		{
			ERROR_PRINT("sid mismatch.");
			exit(1);
		}
		
		rtt = recv_time - send_time;


		self->rtt_total += rtt;
		++self->rtt_count;
		if(rtt > self->rtt_max)
		{
			self->rtt_max = (uint32_t)rtt;
		}
		if(rtt < self->rtt_min)
		{
			self->rtt_min = (uint32_t)rtt;
		}
idle:
		usleep(IDLE_TIME_US);
	}
error_ret:
	robot_close_connection(self);
}
Пример #5
0
void robot_ok (robot_t * r)
{
  robot_send(r, RESPONSE_OK, r->x, r->y);
}
Пример #6
0
void robot_unknown_cmd (robot_t * r)
{
  robot_send(r, RESPONSE_UNKNOWN);
}
Пример #7
0
void robot_greet (robot_t * r)
{
  robot_send(r, RESPONSE_GREETING, r->greeting);
}