#include <stdio.h>
#include "FinePix.h"
struct camera_hw {
unsigned long vendor;
unsigned long product;
char name[32];
};
static struct camera_hw cam_supp[23] = {
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_4800_PID, "Fujifilm FinePix 4800"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A202_PID, "Fujifilm FinePix A202"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A203_PID, "Fujifilm FinePix A203"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A204_PID, "Fujifilm FinePix A204"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A205_PID, "Fujifilm FinePix A205"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A210_PID, "Fujifilm FinePix A210"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A303_PID, "Fujifilm FinePix A303"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_A310_PID, "Fujifilm FinePix A310"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_F401_PID, "Fujifilm FinePix F401"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_F402_PID, "Fujifilm FinePix F402"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_F410_PID, "Fujifilm FinePix F410"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_F601_PID, "Fujifilm FinePix F601"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_F700_PID, "Fujifilm FinePix F700"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_M603_PID, "Fujifilm FinePix M603"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_S3000_PID,
"Fujifilm FinePix S3000"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_S304_PID, "Fujifilm FinePix S304"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_S5000_PID,
"Fujifilm FinePix S5000"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_S602_PID, "Fujifilm FinePix S602"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_S7000_PID,
"Fujifilm FinePix S7000"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_X1_PID,
"Fujifilm FinePix unknown model"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_X2_PID,
"Fujifilm FinePix unknown model"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_X3_PID,
"Fujifilm FinePix unknown model"},
{USB_FUJIFILM_VENDOR_ID, USB_FINEPIX_X4_PID,
"Fujifilm FinePix unknown model"},
};
FinePix::FinePix()
{
fprintf(stderr, "FinePix::FinePix()\n");
camera = NULL;
BUSBRoster::Start();
}
FinePix::~FinePix()
{
fprintf(stderr, "FinePix: ~FinePix()\n");
BUSBRoster::Stop();
}
status_t FinePix::InitCheck()
{
fprintf(stderr, "FinePix: InitCheck()\n");
if (camera != NULL)
return B_NO_ERROR;
else
return B_ERROR;
}
int FinePix::SetupCam()
{
int ret;
fprintf(stderr, "FinePix: SetupCam()\n");
camera->ControlTransfer (USB_REQTYPE_STANDARD | USB_REQTYPE_ENDPOINT_IN,
USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, 0, NULL);
unsigned char data[] = { 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 };
ret = camera->ControlTransfer(USB_REQTYPE_INTERFACE_OUT |USB_REQTYPE_CLASS ,
USB_REQUEST_GET_STATUS, 0x00, 0x00, 12, data);
fprintf(stderr,"data: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x\n",
data[0], data[1],data[2], data[3],data[4], data[5],
data[6], data[7],data[8], data[9],data[10], data[11]);
if (ret != 12) {
fprintf(stderr,"usb_control_msg failed (%d)\n", ret);
return 1;
}
unsigned char data3[MAX_BUFFER_SIZE];
ret = bulk_in->BulkTransfer(data3, MAX_BUFFER_SIZE);
fprintf(stderr,"BulkIn: %x, %x, %x, %x, %x, %x\n",
data3[0],data3[1],data3[2],data3[3],data3[4],data3[5]);
if (ret < 0) {
fprintf(stderr,"failed to read the result (%d)\n", ret);
}
camera->ControlTransfer (USB_REQTYPE_STANDARD | USB_REQTYPE_ENDPOINT_IN,
USB_REQUEST_CLEAR_FEATURE, USB_FEATURE_ENDPOINT_HALT, 0, 0, NULL);
return 0;
}
int FinePix::GetPic(uint8 *frame, int &total_size)
{
fprintf(stderr, "FinePix: GetPic()\n");
int ret;
fprintf(stderr,"request a frame\n");
unsigned char data2[] = { 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 };
ret = camera->ControlTransfer(USB_REQTYPE_INTERFACE_OUT |USB_REQTYPE_CLASS ,
USB_REQUEST_GET_STATUS, 0x00, 0x00, 12, data2);
fprintf(stderr,"data: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x\n",
data2[0], data2[1],data2[2], data2[3],data2[4], data2[5],
data2[6], data2[7],data2[8], data2[9],data2[10], data2[11]);
if (ret != 12)
{
fprintf(stderr,"usb_control_msg failed (%d)\n", ret);
return 1;
}
int offset = 0;
total_size = 0;
do
{
fprintf(stderr,"reading part of the frame\n");
ret = bulk_in->BulkTransfer(&frame[offset], MAX_BUFFER_SIZE);
fprintf(stderr,"frame: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x\n",
frame[offset+0], frame[offset+1],frame[offset+2], frame[offset+3],
frame[offset+4], frame[offset+5],frame[offset+6], frame[offset+7],
frame[offset+8], frame[offset+9],frame[offset+10], frame[offset+11]);
if (ret < 0) {
fprintf(stderr,"failed to read (%d)\n", ret);
return 1;
}
offset += ret;
total_size += ret;
if (ret != MAX_BUFFER_SIZE)
break;
} while(1);
fprintf(stderr,"this frame was %d bytes\n", total_size);
return 0;
}
status_t FinePix::DeviceAdded(BUSBDevice *dev)
{
fprintf(stderr, "FinePix: DeviceAdded()\n");
if (camera != NULL)
return B_ERROR;
int myCam = -1;
if (dev->VendorID() == USB_FUJIFILM_VENDOR_ID)
{
for (int j = 0; j < 23; j++)
{
if (cam_supp[j].product == dev->ProductID())
{
myCam = j;
break;
}
}
}
if (myCam >= 0)
{
fprintf(stderr, "Found cam: ");
fprintf(stderr, cam_supp[myCam].name);
fprintf(stderr, "\n");
if (dev->SetConfiguration(dev->ConfigurationAt(0)) == 0)
{
camera = dev;
bulk_in = 0;
int num_epoints = camera->ActiveConfiguration()->InterfaceAt(0)->CountEndpoints();
fprintf(stderr, "CountEndpoints: %d\n", num_epoints);
for (int i = 0; i < num_epoints; i++)
{
if (camera->ActiveConfiguration()->InterfaceAt(0)->EndpointAt(i)->IsBulk())
if (camera->ActiveConfiguration()->InterfaceAt(0)->EndpointAt(i)->IsInput())
bulk_in = camera->ActiveConfiguration()->InterfaceAt(0)->EndpointAt(i);
}
if (bulk_in == 0)
{
fprintf(stderr, "bad endpoint");
return B_ERROR;
}
fprintf(stderr, "Successfully set configuration!\n");
return B_OK;
}
else
return B_ERROR;
}
else
return B_ERROR;
}
void FinePix::DeviceRemoved(BUSBDevice *dev)
{
fprintf(stderr, "FinePix: DeviceRemoved()\n");
if (dev == camera)
camera = NULL;
}