Simple USBHost WebCam test program

Dependencies:   F401RE-USBHost mbed

Fork of KL46Z-USBHostC270_example by Norimasa Okamoto

WebカメラからJPEG画像を読み取るテストプログラムです。
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認カメラ: Logitech C270, Logitech C210, Logitech Q200R(Qcam Orbit AF), LifeCam VX-500
/media/uploads/va009039/f401re-c270-1.jpg /media/uploads/va009039/k64f-c270.jpg

Committer:
va009039
Date:
Tue Jan 28 06:54:16 2014 +0000
Revision:
1:22304b8f8395
Child:
2:2a40888db9fc
support Logitech C210 Q200R, LifeCam VX-700(VX-500), Sonix Camera.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:22304b8f8395 1 // USBHostCam.cpp
va009039 1:22304b8f8395 2 #include "USBHostCam.h"
va009039 1:22304b8f8395 3
va009039 1:22304b8f8395 4 //#define CAM_DEBUG 1
va009039 1:22304b8f8395 5 #ifdef CAM_DEBUG
va009039 1:22304b8f8395 6 #define CAM_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
va009039 1:22304b8f8395 7 #else
va009039 1:22304b8f8395 8 #define CAM_DBG(...) while(0);
va009039 1:22304b8f8395 9 #endif
va009039 1:22304b8f8395 10 #define CAM_INFO(...) do{fprintf(stderr,__VA_ARGS__);}while(0);
va009039 1:22304b8f8395 11
va009039 1:22304b8f8395 12 CamInfo* getCamInfoList(); // CamInfo.cpp
va009039 1:22304b8f8395 13
va009039 1:22304b8f8395 14 USBHostCam::USBHostCam(uint8_t size, uint8_t option, CamInfo* user_caminfo)
va009039 1:22304b8f8395 15 {
va009039 1:22304b8f8395 16 CAM_DBG("size: %d, option: %d", size, option);
va009039 1:22304b8f8395 17 _caminfo_size = size;
va009039 1:22304b8f8395 18 _caminfo_option = option;
va009039 1:22304b8f8395 19 if (user_caminfo) {
va009039 1:22304b8f8395 20 CamInfoList = user_caminfo;
va009039 1:22304b8f8395 21 } else {
va009039 1:22304b8f8395 22 CamInfoList = getCamInfoList();
va009039 1:22304b8f8395 23 }
va009039 1:22304b8f8395 24 clearOnResult();
va009039 1:22304b8f8395 25 host = USBHost::getHostInst();
va009039 1:22304b8f8395 26 setup();
va009039 1:22304b8f8395 27 }
va009039 1:22304b8f8395 28
va009039 1:22304b8f8395 29 void USBHostCam::setup() {
va009039 1:22304b8f8395 30 caminfo = CamInfoList;
va009039 1:22304b8f8395 31 bool found = false;
va009039 1:22304b8f8395 32 while(caminfo->vid != 0) {
va009039 1:22304b8f8395 33 if (caminfo->vid == host->dev.vid && caminfo->pid == host->dev.pid &&
va009039 1:22304b8f8395 34 caminfo->size == _caminfo_size && caminfo->option == _caminfo_option) {
va009039 1:22304b8f8395 35 found = true;
va009039 1:22304b8f8395 36 break;
va009039 1:22304b8f8395 37 }
va009039 1:22304b8f8395 38 caminfo++;
va009039 1:22304b8f8395 39 }
va009039 1:22304b8f8395 40 if (!found) {
va009039 1:22304b8f8395 41 CAM_INFO("caminfo not found.\n");
va009039 1:22304b8f8395 42 exit(1);
va009039 1:22304b8f8395 43 }
va009039 1:22304b8f8395 44 CAM_INFO("Found: %s\n", caminfo->name);
va009039 1:22304b8f8395 45
va009039 1:22304b8f8395 46 ep_iso_in.setAddress(caminfo->en);
va009039 1:22304b8f8395 47 ep_iso_in.setSize(caminfo->mps);
va009039 1:22304b8f8395 48 uint8_t buf[26];
va009039 1:22304b8f8395 49 memset(buf, 0, sizeof(buf));
va009039 1:22304b8f8395 50 buf[2] = caminfo->formatIndex;
va009039 1:22304b8f8395 51 buf[3] = caminfo->frameIndex;
va009039 1:22304b8f8395 52 *reinterpret_cast<uint32_t*>(buf+4) = caminfo->interval;
va009039 1:22304b8f8395 53 USB_TYPE res = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, sizeof(buf));
va009039 1:22304b8f8395 54 if (res != USB_TYPE_OK) {
va009039 1:22304b8f8395 55 CAM_DBG("SET_CUR VS_COMMIT_CONTROL FAILED");
va009039 1:22304b8f8395 56 }
va009039 1:22304b8f8395 57 res = setInterfaceAlternate(1, caminfo->if_alt);
va009039 1:22304b8f8395 58 if (res != USB_TYPE_OK) {
va009039 1:22304b8f8395 59 CAM_DBG("SET_INTERFACE FAILED");
va009039 1:22304b8f8395 60 }
va009039 1:22304b8f8395 61 }
va009039 1:22304b8f8395 62
va009039 1:22304b8f8395 63 #define SEQ_READ_IDOL 0
va009039 1:22304b8f8395 64 #define SEQ_READ_EXEC 1
va009039 1:22304b8f8395 65 #define SEQ_READ_DONE 2
va009039 1:22304b8f8395 66
va009039 1:22304b8f8395 67 int USBHostCam::readJPEG(uint8_t* buf, int size, int timeout_ms) {
va009039 1:22304b8f8395 68 _buf = buf;
va009039 1:22304b8f8395 69 _pos = 0;
va009039 1:22304b8f8395 70 _size = size;
va009039 1:22304b8f8395 71 _seq = SEQ_READ_IDOL;
va009039 1:22304b8f8395 72 setOnResult(this, &USBHostCam::callback_motion_jpeg);
va009039 1:22304b8f8395 73 Timer timeout_t;
va009039 1:22304b8f8395 74 timeout_t.reset();
va009039 1:22304b8f8395 75 timeout_t.start();
va009039 1:22304b8f8395 76 while(timeout_t.read_ms() < timeout_ms && _seq != SEQ_READ_DONE) {
va009039 1:22304b8f8395 77 poll();
va009039 1:22304b8f8395 78 }
va009039 1:22304b8f8395 79 return _pos;
va009039 1:22304b8f8395 80 }
va009039 1:22304b8f8395 81
va009039 1:22304b8f8395 82 /* virtual */ void USBHostCam::outputJPEG(uint8_t c, int status) { // from decodeMJPEG
va009039 1:22304b8f8395 83 if (_seq == SEQ_READ_IDOL) {
va009039 1:22304b8f8395 84 if (status == JPEG_START) {
va009039 1:22304b8f8395 85 _pos = 0;
va009039 1:22304b8f8395 86 _seq = SEQ_READ_EXEC;
va009039 1:22304b8f8395 87 }
va009039 1:22304b8f8395 88 }
va009039 1:22304b8f8395 89 if (_seq == SEQ_READ_EXEC) {
va009039 1:22304b8f8395 90 if (_pos < _size) {
va009039 1:22304b8f8395 91 _buf[_pos++] = c;
va009039 1:22304b8f8395 92 }
va009039 1:22304b8f8395 93 if (status == JPEG_END) {
va009039 1:22304b8f8395 94 _seq = SEQ_READ_DONE;
va009039 1:22304b8f8395 95 }
va009039 1:22304b8f8395 96 }
va009039 1:22304b8f8395 97 }
va009039 1:22304b8f8395 98
va009039 1:22304b8f8395 99 void USBHostCam::callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) {
va009039 1:22304b8f8395 100 inputPacket(buf, len);
va009039 1:22304b8f8395 101 }