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
Parent:
KL46Z-USBHostC270/USBHostC270.cpp@0:a72d9b047d8d
support Logitech C210 Q200R, LifeCam VX-700(VX-500), Sonix Camera.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:a72d9b047d8d 1 #include "USBHostC270.h"
va009039 0:a72d9b047d8d 2 //#include "dbg.h"
va009039 0:a72d9b047d8d 3
va009039 0:a72d9b047d8d 4 #define C270_DEBUG 1
va009039 0:a72d9b047d8d 5 #ifdef C270_DEBUG
va009039 0:a72d9b047d8d 6 #define C270_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
va009039 0:a72d9b047d8d 7 #else
va009039 0:a72d9b047d8d 8 #define C270_DBG(...) while(0);
va009039 0:a72d9b047d8d 9 #endif
va009039 0:a72d9b047d8d 10
va009039 0:a72d9b047d8d 11 USBHostC270::USBHostC270(int formatIndex, int frameIndex, uint32_t interval) {
va009039 0:a72d9b047d8d 12 _formatIndex = formatIndex;
va009039 0:a72d9b047d8d 13 _frameIndex = frameIndex;
va009039 0:a72d9b047d8d 14 _interval = interval;
va009039 0:a72d9b047d8d 15 clearOnResult();
va009039 0:a72d9b047d8d 16 host = USBHost::getHostInst();
va009039 0:a72d9b047d8d 17 report = &host->report;
va009039 0:a72d9b047d8d 18 setup();
va009039 0:a72d9b047d8d 19 }
va009039 0:a72d9b047d8d 20
va009039 0:a72d9b047d8d 21 void USBHostC270::setup() {
va009039 0:a72d9b047d8d 22 ep_iso_in.setAddress(C270_EN);
va009039 0:a72d9b047d8d 23 ep_iso_in.setSize(C270_MPS);
va009039 0:a72d9b047d8d 24 uint8_t buf[26];
va009039 0:a72d9b047d8d 25 memset(buf, 0, sizeof(buf));
va009039 0:a72d9b047d8d 26 buf[2] = _formatIndex;
va009039 0:a72d9b047d8d 27 buf[3] = _frameIndex;
va009039 0:a72d9b047d8d 28 *reinterpret_cast<uint32_t*>(buf+4) = _interval;
va009039 0:a72d9b047d8d 29 USB_TYPE res = Control(SET_CUR, VS_COMMIT_CONTROL, 1, buf, sizeof(buf));
va009039 0:a72d9b047d8d 30 if (res != USB_TYPE_OK) {
va009039 0:a72d9b047d8d 31 C270_DBG("SET_CUR VS_COMMIT_CONTROL FAILED");
va009039 0:a72d9b047d8d 32 }
va009039 0:a72d9b047d8d 33 res = setInterfaceAlternate(1, C270_IF_ALT); // alt=1 packet size = 192
va009039 0:a72d9b047d8d 34 if (res != USB_TYPE_OK) {
va009039 0:a72d9b047d8d 35 C270_DBG("SET_INTERFACE FAILED");
va009039 0:a72d9b047d8d 36 }
va009039 0:a72d9b047d8d 37 }
va009039 0:a72d9b047d8d 38
va009039 0:a72d9b047d8d 39 #define SEQ_READ_IDOL 0
va009039 0:a72d9b047d8d 40 #define SEQ_READ_EXEC 1
va009039 0:a72d9b047d8d 41 #define SEQ_READ_DONE 2
va009039 0:a72d9b047d8d 42
va009039 0:a72d9b047d8d 43 int USBHostC270::readJPEG(uint8_t* buf, int size, int timeout_ms) {
va009039 0:a72d9b047d8d 44 _buf = buf;
va009039 0:a72d9b047d8d 45 _pos = 0;
va009039 0:a72d9b047d8d 46 _size = size;
va009039 0:a72d9b047d8d 47 _seq = SEQ_READ_IDOL;
va009039 0:a72d9b047d8d 48 setOnResult(this, &USBHostC270::callback_motion_jpeg);
va009039 0:a72d9b047d8d 49 Timer timeout_t;
va009039 0:a72d9b047d8d 50 timeout_t.reset();
va009039 0:a72d9b047d8d 51 timeout_t.start();
va009039 0:a72d9b047d8d 52 while(timeout_t.read_ms() < timeout_ms && _seq != SEQ_READ_DONE) {
va009039 0:a72d9b047d8d 53 poll();
va009039 0:a72d9b047d8d 54 }
va009039 0:a72d9b047d8d 55 return _pos;
va009039 0:a72d9b047d8d 56 }
va009039 0:a72d9b047d8d 57
va009039 0:a72d9b047d8d 58 /* virtual */ void USBHostC270::outputJPEG(uint8_t c, int status) { // from decodeMJPEG
va009039 0:a72d9b047d8d 59 if (_seq == SEQ_READ_IDOL) {
va009039 0:a72d9b047d8d 60 if (status == JPEG_START) {
va009039 0:a72d9b047d8d 61 _pos = 0;
va009039 0:a72d9b047d8d 62 _seq = SEQ_READ_EXEC;
va009039 0:a72d9b047d8d 63 }
va009039 0:a72d9b047d8d 64 }
va009039 0:a72d9b047d8d 65 if (_seq == SEQ_READ_EXEC) {
va009039 0:a72d9b047d8d 66 if (_pos < _size) {
va009039 0:a72d9b047d8d 67 _buf[_pos++] = c;
va009039 0:a72d9b047d8d 68 }
va009039 0:a72d9b047d8d 69 if (status == JPEG_END) {
va009039 0:a72d9b047d8d 70 _seq = SEQ_READ_DONE;
va009039 0:a72d9b047d8d 71 }
va009039 0:a72d9b047d8d 72 }
va009039 0:a72d9b047d8d 73 }
va009039 0:a72d9b047d8d 74
va009039 0:a72d9b047d8d 75 void USBHostC270::callback_motion_jpeg(uint16_t frame, uint8_t* buf, int len) {
va009039 0:a72d9b047d8d 76 inputPacket(buf, len);
va009039 0:a72d9b047d8d 77 }