Simple USBHost WebCam test program
Dependencies: F401RE-USBHost mbed
Fork of KL46Z-USBHostC270_example by
WebカメラからJPEG画像を読み取るテストプログラムです。
使い方はKL46Z-USBHostC270_exampleと同じです。
動作確認カメラ: Logitech C270, Logitech C210, Logitech Q200R(Qcam Orbit AF), LifeCam VX-500
main.cpp@0:a72d9b047d8d, 2014-01-27 (annotated)
- Committer:
- va009039
- Date:
- Mon Jan 27 11:07:34 2014 +0000
- Revision:
- 0:a72d9b047d8d
- Child:
- 1:22304b8f8395
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:a72d9b047d8d | 1 | #include "USBHostC270.h" |
va009039 | 0:a72d9b047d8d | 2 | RawSerial pc(USBTX, USBRX); |
va009039 | 0:a72d9b047d8d | 3 | DigitalOut led1(LED_GREEN); |
va009039 | 0:a72d9b047d8d | 4 | DigitalOut led2(LED_RED); |
va009039 | 0:a72d9b047d8d | 5 | #define LED_OFF 1 |
va009039 | 0:a72d9b047d8d | 6 | #define LED_ON 0 |
va009039 | 0:a72d9b047d8d | 7 | |
va009039 | 0:a72d9b047d8d | 8 | #if defined(TARGET_KL46Z) |
va009039 | 0:a72d9b047d8d | 9 | uint8_t image_buf[1024*24]; |
va009039 | 0:a72d9b047d8d | 10 | #elif defined(TARGET_KL25Z) |
va009039 | 0:a72d9b047d8d | 11 | uint8_t image_buf[1024*12]; |
va009039 | 0:a72d9b047d8d | 12 | #endif |
va009039 | 0:a72d9b047d8d | 13 | |
va009039 | 0:a72d9b047d8d | 14 | int main() { |
va009039 | 0:a72d9b047d8d | 15 | pc.baud(9600); |
va009039 | 0:a72d9b047d8d | 16 | led1 = led2 = LED_OFF; |
va009039 | 0:a72d9b047d8d | 17 | |
va009039 | 0:a72d9b047d8d | 18 | // Logitech C270 |
va009039 | 0:a72d9b047d8d | 19 | USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_320x240, _5FPS); |
va009039 | 0:a72d9b047d8d | 20 | |
va009039 | 0:a72d9b047d8d | 21 | int pos = 0; |
va009039 | 0:a72d9b047d8d | 22 | int size = 0; |
va009039 | 0:a72d9b047d8d | 23 | Timer t; |
va009039 | 0:a72d9b047d8d | 24 | for(int seq = 0;;) { |
va009039 | 0:a72d9b047d8d | 25 | int c = -1; |
va009039 | 0:a72d9b047d8d | 26 | if (pc.readable()) { |
va009039 | 0:a72d9b047d8d | 27 | c = pc.getc(); |
va009039 | 0:a72d9b047d8d | 28 | } |
va009039 | 0:a72d9b047d8d | 29 | switch(seq) { |
va009039 | 0:a72d9b047d8d | 30 | case 0: |
va009039 | 0:a72d9b047d8d | 31 | pc.printf("\nReady, please download JPEG using XMODEM from FRDM-KL46Z.\n"); |
va009039 | 0:a72d9b047d8d | 32 | t.start(); |
va009039 | 0:a72d9b047d8d | 33 | seq++; |
va009039 | 0:a72d9b047d8d | 34 | break; |
va009039 | 0:a72d9b047d8d | 35 | case 1: |
va009039 | 0:a72d9b047d8d | 36 | if (c == 0x15) { // NAK |
va009039 | 0:a72d9b047d8d | 37 | size = cam->readJPEG(image_buf, sizeof(image_buf)); |
va009039 | 0:a72d9b047d8d | 38 | pos = 0; |
va009039 | 0:a72d9b047d8d | 39 | seq++; |
va009039 | 0:a72d9b047d8d | 40 | } |
va009039 | 0:a72d9b047d8d | 41 | break; |
va009039 | 0:a72d9b047d8d | 42 | case 2: |
va009039 | 0:a72d9b047d8d | 43 | if (pos >= size) { |
va009039 | 0:a72d9b047d8d | 44 | pc.putc(0x04); // EOT |
va009039 | 0:a72d9b047d8d | 45 | } else { |
va009039 | 0:a72d9b047d8d | 46 | pc.putc(0x01); // SOH |
va009039 | 0:a72d9b047d8d | 47 | uint8_t block = pos/128 + 1; |
va009039 | 0:a72d9b047d8d | 48 | pc.putc(block); |
va009039 | 0:a72d9b047d8d | 49 | pc.putc(block ^ 0xff); |
va009039 | 0:a72d9b047d8d | 50 | uint8_t checksum = 0x00; |
va009039 | 0:a72d9b047d8d | 51 | for(int i = 0; i < 128; i++) { |
va009039 | 0:a72d9b047d8d | 52 | uint8_t c = image_buf[pos + i]; |
va009039 | 0:a72d9b047d8d | 53 | checksum += c; |
va009039 | 0:a72d9b047d8d | 54 | pc.putc(c); |
va009039 | 0:a72d9b047d8d | 55 | } |
va009039 | 0:a72d9b047d8d | 56 | pc.putc(checksum); |
va009039 | 0:a72d9b047d8d | 57 | } |
va009039 | 0:a72d9b047d8d | 58 | seq++; |
va009039 | 0:a72d9b047d8d | 59 | t.reset(); |
va009039 | 0:a72d9b047d8d | 60 | led2 = !led2; |
va009039 | 0:a72d9b047d8d | 61 | break; |
va009039 | 0:a72d9b047d8d | 62 | case 3: |
va009039 | 0:a72d9b047d8d | 63 | if (c == 0x06) { // ACK |
va009039 | 0:a72d9b047d8d | 64 | if (pos >= size) { |
va009039 | 0:a72d9b047d8d | 65 | seq = 0; |
va009039 | 0:a72d9b047d8d | 66 | } else { |
va009039 | 0:a72d9b047d8d | 67 | pos += 128; |
va009039 | 0:a72d9b047d8d | 68 | seq--; |
va009039 | 0:a72d9b047d8d | 69 | } |
va009039 | 0:a72d9b047d8d | 70 | } |
va009039 | 0:a72d9b047d8d | 71 | break; |
va009039 | 0:a72d9b047d8d | 72 | } |
va009039 | 0:a72d9b047d8d | 73 | if (t.read_ms() > 15*1000) { // timeout |
va009039 | 0:a72d9b047d8d | 74 | t.reset(); |
va009039 | 0:a72d9b047d8d | 75 | seq = 0; |
va009039 | 0:a72d9b047d8d | 76 | } |
va009039 | 0:a72d9b047d8d | 77 | cam->poll(); |
va009039 | 0:a72d9b047d8d | 78 | } |
va009039 | 0:a72d9b047d8d | 79 | } |