int main() { int fd = obd_open(OBD_PORT); int avr_fd = avr_open(AVR_PORT); FILE* timelog = open_timing_log(); int RPM = 0; int speed = 0; time_t start, end; obd_setup(fd); printf("Beginning read cycle...\n"); while (true) { start = time(0); RPM = get_rpm(fd); end = time(0); log_time(timelog, end - start); speed = get_speed(fd); if ((RPM != -1) && (speed != -1)) { send_to_avr(avr_fd, speed, RPM); printf("RPM: %d\nSpeed: %d\n", RPM, speed); } //flush buffers just in case tcflush(fd, TCIOFLUSH); } return 0; }
void show_serial_number(struct sg_io_hdr *hdr) { unsigned char *buffer = hdr->dxferp; int i; printf("serial number: "); for (i=0x80, } #endif #define SENSE_LEN 32 #define BLOCK_LEN 1 unsigned char sense_buffer[SENSE_LEN]; unsigned char data_buffer[BLOCK_LEN*256]; void test_execute_Inquiry(char * path, int evpd, int page_code) { struct sg_io_hdr * p_hdr = init_io_hdr(); set_xfer_data(p_hdr, data_buffer, BLOCK_LEN*256); set_sense_data(p_hdr, sense_buffer, SENSE_LEN); int status = 0; int fd = open(path, O_RDWR); if (fd>0) { status = execute_Inquiry(fd, page_code, evpd, p_hdr); printf("the return status is %d\n", status); if (status!=0) { show_sense_buffer(p_hdr); } else{ show_vendor(p_hdr); show_product(p_hdr); show_product_rev(p_hdr); show_xfer_data(p_hdr); } } else { printf("failed to open sg file %s\n", path); } close(fd); destroy_io_hdr(p_hdr); } void test_cmds(char *path, int evpd, int page_code) { struct sg_io_hdr * p_hdr = init_io_hdr(); set_xfer_data(p_hdr, data_buffer, BLOCK_LEN*256); set_sense_data(p_hdr, sense_buffer, SENSE_LEN); int status = 0; int fd = open(path, O_RDWR); if (fd>0) { status = execute_Inquiry(fd, page_code, evpd, p_hdr); printf("the return status is %d\n", status); //show_sense_buffer(p_hdr); show_xfer_data(p_hdr); } else { printf("failed to open sg file %s\n", path); } close(fd); destroy_io_hdr(p_hdr); } void get_rpm(char *path, int evpd, int page_code) { struct sg_io_hdr * p_hdr = init_io_hdr(); set_xfer_data(p_hdr, data_buffer, BLOCK_LEN*256); set_sense_data(p_hdr, sense_buffer, SENSE_LEN); int status = 0; unsigned char *xfer; int pdt, rpm; int fd = open(path, O_RDWR); if (fd>0) { status = execute_Inquiry(fd, page_code, evpd, p_hdr); printf("the return status is %d\n", status); //show_sense_buffer(p_hdr); //show_xfer_data(p_hdr); // 参考代码 sg3_utils: sg_vpd.c : decode_b1_vpd() xfer = p_hdr->dxferp; pdt = (int)xfer[0]; switch (pdt) { case 0: if (p_hdr->dxfer_len < 64) { printf("xfer is too short!\n"); } else { rpm = (xfer[4]<<8) | xfer[5]; printf("rpm of %s: %d rpm\n", path, rpm); } break; default: printf("unknown pdt\n"); break; } } else { printf("failed to open sg file %s\n", path); } close(fd); destroy_io_hdr(p_hdr); } int main(int argc, char * argv[]) { //test_execute_Inquiry(argv[1], 0, 0); //test_cmds(argv[1], 1, 0x86); get_rpm(argv[1], 1, 0xb1); // rpm // tested: // 0x80,0x83 return 0; }
static int get_attrs(disk_t *diskp, int fd, char *opath, nvlist_t *attrs) { if (diskp->removable) { struct dk_minfo minfo; if (nvlist_add_boolean(attrs, DM_REMOVABLE) != 0) { return (ENOMEM); } /* Make sure media is inserted and spun up. */ if (fd >= 0 && media_read_info(fd, &minfo)) { if (nvlist_add_boolean(attrs, DM_LOADED) != 0) { return (ENOMEM); } } /* can't tell diff between dead & no media on removable drives */ if (nvlist_add_uint32(attrs, DM_STATUS, DM_DISK_UP) != 0) { return (ENOMEM); } get_drive_type(diskp, fd); } else { struct dk_minfo minfo; /* check if the fixed drive is up or not */ if (fd >= 0 && media_read_info(fd, &minfo)) { if (nvlist_add_uint32(attrs, DM_STATUS, DM_DISK_UP) != 0) { return (ENOMEM); } } else { if (nvlist_add_uint32(attrs, DM_STATUS, DM_DISK_DOWN) != 0) { return (ENOMEM); } } get_drive_type(diskp, fd); } if (nvlist_add_uint32(attrs, DM_DRVTYPE, diskp->drv_type) != 0) { return (ENOMEM); } if (diskp->product_id != NULL) { if (nvlist_add_string(attrs, DM_PRODUCT_ID, diskp->product_id) != 0) { return (ENOMEM); } } if (diskp->vendor_id != NULL) { if (nvlist_add_string(attrs, DM_VENDOR_ID, diskp->vendor_id) != 0) { return (ENOMEM); } } if (diskp->sync_speed != -1) { if (nvlist_add_uint32(attrs, DM_SYNC_SPEED, diskp->sync_speed) != 0) { return (ENOMEM); } } if (diskp->wide == 1) { if (nvlist_add_boolean(attrs, DM_WIDE) != 0) { return (ENOMEM); } } if (diskp->rpm == 0) { diskp->rpm = get_rpm(diskp, fd); } if (diskp->rpm > 0) { if (nvlist_add_uint32(attrs, DM_RPM, diskp->rpm) != 0) { return (ENOMEM); } } if (diskp->aliases != NULL && diskp->aliases->cluster) { if (nvlist_add_boolean(attrs, DM_CLUSTERED) != 0) { return (ENOMEM); } } if (strlen(opath) > 0) { if (nvlist_add_string(attrs, DM_OPATH, opath) != 0) { return (ENOMEM); } } if (diskp->solid_state < 0) { diskp->solid_state = get_solidstate(diskp, fd); } if (diskp->solid_state > 0) { if (nvlist_add_boolean(attrs, DM_SOLIDSTATE) != 0) { return (ENOMEM); } } return (0); }