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); }
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); }
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); } }
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); }
void robot_ok (robot_t * r) { robot_send(r, RESPONSE_OK, r->x, r->y); }
void robot_unknown_cmd (robot_t * r) { robot_send(r, RESPONSE_UNKNOWN); }
void robot_greet (robot_t * r) { robot_send(r, RESPONSE_GREETING, r->greeting); }