int main(int argc, char **argv) { char cDiskName[] = "/dev/sg2"; int fd = open(cDiskName, O_RDWR); if (fd < 0) { printf("Open error: %s, errno=%d (%s)\n", cDiskName, errno, strerror(errno)); return 1; } if (!checkDevice(fd)) { printf("checkDevice fail\n"); return 2; } printf("init ok\n"); DataInfo_t datainfo; int last_addr = 0; DeviceState_t last_state = STATE_INVALIDxx; DI_Status_t last_status = DI_STATUS_INVALIDxx; unsigned scanned_imgs = 0; while (true) { // get state: scanning or idle DeviceState_t state = GetDeviceState(fd); if (state >= STATE_INVALIDxx || state < 0) { return 7; } if (state != last_state) { printf("DeviceState: %d => %s\n", (unsigned)state, state_lut[state]); } // get data info: new data ready or not? if (!GetDeviceDataInfo(fd, &datainfo)) { return 8; } if (datainfo.status < 0 || datainfo.status > 2) { return 9; } if (datainfo.status != last_status || datainfo.addr != last_addr) { dumpDataInfo(&datainfo); } if (datainfo.status != DI_STATUS_NOT_READY) { // there's data for us unsigned imgbufsize = datainfo.width * datainfo.height; if (datainfo.color == DI_COLOR_COLOR) { imgbufsize *= 3; } // image buffer unsigned char *imgbuf = new unsigned char[imgbufsize]; // read data bool ok = MemoryRead(fd, datainfo.addr, imgbuf, imgbufsize); if (ok) { printf("read %d bytes\n", imgbufsize); shuffleBitmap(imgbuf, imgbufsize, datainfo.width, datainfo.height, datainfo.color); int ifd; if (!scanned_imgs) { ifd = open("out.data", O_WRONLY|O_CREAT|O_TRUNC, 0644); } else { ifd = open("out.data", O_WRONLY|O_APPEND); } if (ifd) { write(ifd, imgbuf, imgbufsize); close(ifd); scanned_imgs++; } } else { printf("failed reading data\n"); } delete [] imgbuf; imgbuf = 0; } usleep(20000); last_state = state; last_status = datainfo.status; last_addr = datainfo.addr; } close(fd); printf("all ok\n"); return 0; }
/* This doesn't take a timestamp; instead, we let InputHandler::ButtonPressed figure * it out. Be sure to call InputHandler::Update() between each poll. */ void InputHandler_DInput::UpdatePolled(DIDevice &device, const RageTimer &tm) { if( device.type == device.KEYBOARD ) { unsigned char keys[256]; HRESULT hr = GetDeviceState(device.Device, 256, keys); if ( hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED ) return; if ( hr != DI_OK ) { LOG->MapLog( "UpdatePolled", hr_ssprintf(hr, "Failures on polled keyboard update") ); return; } for( int k = 0; k < 256; ++k ) { const int key = device.Inputs[k].num; ButtonPressed(DeviceInput(device.dev, key), !!(keys[k] & 0x80)); } return; } DIJOYSTATE state; HRESULT hr = GetDeviceState(device.Device, sizeof(state), &state); if ( hr == DIERR_INPUTLOST || hr == DIERR_NOTACQUIRED ) return; /* Set each known axis, button and POV. */ for(unsigned i = 0; i < device.Inputs.size(); ++i) { const input_t &in = device.Inputs[i]; const InputDevice dev = device.dev; switch(in.type) { case in.BUTTON: { DeviceInput di(dev, JOY_1 + in.num, -1, tm); ButtonPressed(di, !!state.rgbButtons[in.ofs - DIJOFS_BUTTON0]); break; } case in.AXIS: { JoystickButton neg = NUM_JOYSTICK_BUTTONS, pos = NUM_JOYSTICK_BUTTONS; int val = 0; switch(in.ofs) { case DIJOFS_X: neg = JOY_LEFT; pos = JOY_RIGHT; val = state.lX; break; case DIJOFS_Y: neg = JOY_UP; pos = JOY_DOWN; val = state.lY; break; case DIJOFS_Z: neg = JOY_Z_UP; pos = JOY_Z_DOWN; val = state.lZ; break; case DIJOFS_RX: neg = JOY_ROT_LEFT; pos = JOY_ROT_RIGHT; val = state.lRx; break; case DIJOFS_RY: neg = JOY_ROT_UP; pos = JOY_ROT_DOWN; val = state.lRy; break; case DIJOFS_RZ: neg = JOY_ROT_Z_UP; pos = JOY_ROT_Z_DOWN; val = state.lRz; break; case DIJOFS_SLIDER(0): neg = JOY_AUX_1; pos = JOY_AUX_2; val = state.rglSlider[0]; break; case DIJOFS_SLIDER(1): neg = JOY_AUX_3; pos = JOY_AUX_4; val = state.rglSlider[1]; break; default: LOG->MapLog("unknown input", "Controller '%s' is returning an unknown joystick offset, %i", device.JoystickInst.tszProductName, in.ofs ); continue; } if( neg != NUM_JOYSTICK_BUTTONS ) { float l = SCALE( int(val), 0.0f, 100.0f, 0.0f, 1.0f ); ButtonPressed(DeviceInput(dev, neg, max(-l,0), tm), val < -50); ButtonPressed(DeviceInput(dev, pos, max(+l,0), tm), val > 50); } break; } case in.HAT: if( in.num == 0 ) { const int pos = TranslatePOV(state.rgdwPOV[in.ofs - DIJOFS_POV(0)]); ButtonPressed(DeviceInput(dev, JOY_HAT_UP, -1, tm), !!(pos & HAT_UP_MASK)); ButtonPressed(DeviceInput(dev, JOY_HAT_DOWN, -1, tm), !!(pos & HAT_DOWN_MASK)); ButtonPressed(DeviceInput(dev, JOY_HAT_LEFT, -1, tm), !!(pos & HAT_LEFT_MASK)); ButtonPressed(DeviceInput(dev, JOY_HAT_RIGHT, -1, tm), !!(pos & HAT_RIGHT_MASK)); } break; } } }