Exemple #1
0
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;
		}
	}
}