double mems_get_seektime (int devno, ioreq_event *req, int checkcache, double maxtime) { mems_t *dev = getmems(req->devno); mems_sled_t *sled = mems_lbn_to_sled(dev, req->blkno); double up_time; double dn_time; tipsector_coord_set_t up; tipsector_coord_set_t dn; tipset_t tipset; // fprintf(stderr, "Entering mems_get_seektime()\n"); mems_lbn_to_position(req->blkno, sled, &up, &dn, &tipset, NULL, NULL, NULL); up_time = mems_seek_time(sled, &sled->pos, &up.servo_start, NULL, NULL, NULL, NULL); dn_time = mems_seek_time(sled, &sled->pos, &dn.servo_start, NULL, NULL, NULL, NULL); return min(up_time, dn_time); }
double mems_seek_time_seekcache (mems_sled_t *sled, coord_t *begin, coord_t *end, double *return_x_seek_time, double *return_y_seek_time, double *return_turnaround_time, int *return_turnaround_number) { struct mems_seekcache *s; int i; /* First check if value is cached */ for (i = 0; i < MEMS_SEEKCACHE; i++) { s = &sled->seekcache[i]; if (mems_equal_coords(begin, &s->begin) && mems_equal_coords(end, &s->end)) { if (return_x_seek_time) *return_x_seek_time = s->x_seek_time; if (return_y_seek_time) *return_y_seek_time = s->y_seek_time; if (return_turnaround_time) *return_turnaround_time = s->turnaround_time; if (return_turnaround_number) *return_turnaround_number = s->turnaround_number; return s->time; } } s = &sled->seekcache[sled->seekcache_next]; mems_coord_t_copy(begin, &s->begin); mems_coord_t_copy(end, &s->end); s->time = mems_seek_time(sled, &s->begin, &s->end, &s->x_seek_time, &s->y_seek_time, &s->turnaround_time, &s->turnaround_number); if (return_x_seek_time) *return_x_seek_time = s->x_seek_time; if (return_y_seek_time) *return_y_seek_time = s->y_seek_time; if (return_turnaround_time) *return_turnaround_time = s->turnaround_time; if (return_turnaround_number) *return_turnaround_number = s->turnaround_number; sled->seekcache_next++; if (sled->seekcache_next == MEMS_SEEKCACHE) sled->seekcache_next = 0; // fprintf(stderr, "mems_seek_time_seekcache:: s->time = %f\n", s->time); return s->time; }
int main(int argc, char *argv[]) { mems_t dev; coord_t begin, end; double spring_factor = 0.0; double accel; double length_nm; double velocity_nm_s; double seek_time; double seek_time_zero = 0.0; int bit_step = 10; int i; int verbose = 0; int three_dee = 0; int mathematica = 0; int transpose = 0; int hong = 0; double time_constants = 0.0; int x_pos, y_pos; begin.x_pos = 1000; begin.y_pos = 1000; //start_nm = -1; //end_nm = -1; spring_factor = 0.0; for (i = 0; i < argc; i++) { if (strcmp(argv[i], "-v") == 0) verbose = 1; if (strcmp(argv[i], "-spring") == 0) spring_factor = atof(argv[i+1]); if (strcmp(argv[i], "-step") == 0) bit_step = atoi(argv[i+1]); if (strcmp(argv[i], "-start") == 0) //start_nm = atof(argv[i+1]); if (strcmp(argv[i], "-end") == 0) //end_nm = atof(argv[i+1]); if (strcmp(argv[i], "-3d") == 0) three_dee = 1; if (strcmp(argv[i], "-num") == 0) time_constants = atof(argv[i+1]); if (strcmp(argv[i], "-x") == 0) begin.x_pos = atoi(argv[i+1]); if (strcmp(argv[i], "-y") == 0) begin.y_pos = atoi(argv[i+1]); if (strcmp(argv[i], "-math") == 0) mathematica = atoi(argv[i+1]); if (strcmp(argv[i], "-transpose") == 0) transpose = 1; if (strcmp(argv[i], "-hong") == 0) hong = 1; } accel = 746.2 * 1000000000.0; length_nm = 2000.0 * 50.0; //velocity_nm_s = 200000.0 * 50.0; velocity_nm_s = 0.0; dev.sled = malloc(sizeof(mems_sled_t)); initialize_device(&dev, spring_factor, time_constants, hong); begin.y_vel = 0; end.x_pos = 0; end.y_pos = 0; end.y_vel = 0; //fprintf(stdout, "spring_factor = %f\n", spring_factor); for(x_pos = -1000; x_pos <= 1000; x_pos += bit_step) { for(y_pos = -1000; y_pos <= 1000; y_pos += bit_step) { /* for(x_pos = 0; x_pos <= 1000; x_pos += bit_step) { for(y_pos = 0; y_pos <= 1000; y_pos += bit_step) { */ //x_pos = 1000; //y_pos = 500; if (!transpose) { end.x_pos = x_pos; end.y_pos = y_pos; } else { end.x_pos = y_pos; end.y_pos = x_pos; } if (verbose) fprintf(stdout, "main: starting a new seek (monkey)\n"); seek_time = mems_seek_time(&(dev.sled[0]), &begin, &end, NULL, NULL, NULL, NULL); spring_factor = dev.sled[0].spring_factor; dev.sled[0].spring_factor = 0.0; seek_time_zero = mems_seek_time(&(dev.sled[0]), &begin, &end, NULL, NULL, NULL, NULL); dev.sled[0].spring_factor = spring_factor; if (verbose) fprintf(stdout, "goose\n"); if (mathematica == 1) { fprintf(stdout, "%f ", seek_time); } else if (mathematica == 2) { fprintf(stdout, "%f ", (seek_time - seek_time_zero)); } else { if (!transpose) { fprintf(stdout, "%d %d %f %f %f\n", x_pos, y_pos, seek_time, seek_time_zero, (seek_time - seek_time_zero)); } else { fprintf(stdout, "%d %d %f %f %f\n", y_pos, x_pos, seek_time, seek_time_zero, (seek_time - seek_time_zero)); } /* fprintf(stdout, "%f %f %f %f\n", x_velocity_diff, x_time_diff, y_velocity_diff, y_time_diff); */ } } if (mathematica != 0) fprintf(stdout, "\n"); } free(dev.sled); return 0; }
void mems_precompute_seek_curve(mems_t *dev) { coord_t begin, end; double x_seek_time, y_seek_time; int sled_length_bits; int offset; int bit_step; int nm_step; int i; double num_time_constants = dev->sled[0].num_time_constants; int precompute_seek_count = dev->precompute_seek_count; dev->sled[0].num_time_constants = 0.0; dev->precompute_seek_count = 0; sled_length_bits = (int) (dev->sled[0].x_length_nm / dev->sled[0].bit_length_nm); bit_step = sled_length_bits / precompute_seek_count; nm_step = (sled_length_bits * dev->sled[0].bit_length_nm) / precompute_seek_count; dev->precompute_seek_distances = (int *)malloc((precompute_seek_count + 1) * sizeof(int)); dev->precompute_x_seek_times = (double *)malloc((precompute_seek_count + 1) * sizeof(double)); dev->precompute_y_seek_times = (double *)malloc((precompute_seek_count + 1) * sizeof(double)); /* printf("precompute_seek_count = %d, bit_step = %d, nm_step = %d\n", precompute_seek_count, bit_step, nm_step); */ // for(offset = 0; offset <= sled_length_bits; offset += bit_step) { for(i = 0; i < precompute_seek_count; i++) { offset = i * bit_step; // if (verbose) fprintf(stdout, "main: starting a new seek (monkey)\n"); begin.x_pos = 0; begin.y_pos = 0; begin.y_vel = 0; end.x_pos = offset; end.y_pos = 0; end.y_vel = 0; /* printf("begin = %d, end = %d\n", begin.y_vel, end.y_vel); */ x_seek_time = mems_seek_time(&(dev->sled[0]), &begin, &end, NULL, NULL, NULL, NULL); begin.x_pos = 0; begin.y_pos = 0; begin.y_vel = dev->sled[0].y_access_speed_bit_s; end.x_pos = 0; end.y_pos = offset; end.y_vel = dev->sled[0].y_access_speed_bit_s; /* printf("begin = %d, end = %d\n", begin.y_pos, end.y_pos); */ y_seek_time = mems_seek_time(&(dev->sled[0]), &begin, &end, NULL, NULL, NULL, NULL); /* fprintf(stdout, "%d, %d, %d, %f, %f\n", i, (i * nm_step), (offset * dev->sled[0].bit_length_nm), x_seek_time, y_seek_time); */ dev->precompute_seek_distances[i] = offset * dev->sled[0].bit_length_nm; dev->precompute_x_seek_times[i] = x_seek_time; dev->precompute_y_seek_times[i] = y_seek_time; /* fprintf(stdout, "%d, %d, %f, %f\n", i, (offset * dev->sled[0].bit_length_nm), dev->precompute_x_seek_times[i], dev->precompute_y_seek_times[i]); */ } begin.x_pos = 0; begin.y_pos = 0; begin.y_vel = 0; end.x_pos = sled_length_bits; end.y_pos = 0; end.y_vel = 0; x_seek_time = mems_seek_time(&(dev->sled[0]), &begin, &end, NULL, NULL, NULL, NULL); begin.x_pos = 0; begin.y_pos = 0; begin.y_vel = dev->sled[0].y_access_speed_bit_s; end.x_pos = 0; end.y_pos = sled_length_bits; end.y_vel = dev->sled[0].y_access_speed_bit_s; y_seek_time = mems_seek_time(&(dev->sled[0]), &begin, &end, NULL, NULL, NULL, NULL); dev->precompute_seek_distances[precompute_seek_count] = sled_length_bits * dev->sled[0].bit_length_nm; dev->precompute_x_seek_times[precompute_seek_count] = x_seek_time; dev->precompute_y_seek_times[precompute_seek_count] = y_seek_time; /* fprintf(stdout, "%d, %d, %d, %f, %f\n", precompute_seek_count, (precompute_seek_count * nm_step), sled_length_bits * dev->sled[0].bit_length_nm, x_seek_time, y_seek_time); */ dev->sled[0].num_time_constants = num_time_constants; dev->precompute_seek_count = precompute_seek_count; }