CameraC328

Dependents:   CameraC328_TestProgram CameraC328_Thresholding Camera_TestProgram_2015 Camera_TestProgram_2015 ... more

Committer:
shintamainjp
Date:
Thu Jul 01 10:19:49 2010 +0000
Revision:
6:4749dd1acdd1
Parent:
5:5d2088c2433c
Child:
7:d0d13822c37a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 6:4749dd1acdd1 1 /**
shintamainjp 6:4749dd1acdd1 2 * C328-7640 device driver class (Version 0.0.2)
shintamainjp 6:4749dd1acdd1 3 * Reference documents: C328-7640 User Manual v3.0 2004.8.19
shintamainjp 6:4749dd1acdd1 4 *
shintamainjp 6:4749dd1acdd1 5 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
shintamainjp 6:4749dd1acdd1 6 * http://shinta.main.jp/
shintamainjp 6:4749dd1acdd1 7 */
shintamainjp 6:4749dd1acdd1 8
shintamainjp 6:4749dd1acdd1 9 #include "mbed.h"
shintamainjp 6:4749dd1acdd1 10
shintamainjp 6:4749dd1acdd1 11 #ifndef _CAMERA_C328_H_
shintamainjp 6:4749dd1acdd1 12 #define _CAMERA_C328_H_
shintamainjp 6:4749dd1acdd1 13
shintamainjp 6:4749dd1acdd1 14 /** C328-7640 Device Driver Class.
shintamainjp 6:4749dd1acdd1 15 *
shintamainjp 6:4749dd1acdd1 16 * @code
shintamainjp 6:4749dd1acdd1 17 * #include "mbed.h"
shintamainjp 6:4749dd1acdd1 18 * #include "CameraC328.h"
shintamainjp 6:4749dd1acdd1 19 *
shintamainjp 6:4749dd1acdd1 20 * CameraC328 camera(p9, p10, CameraC328::Baud57600);
shintamainjp 6:4749dd1acdd1 21 *
shintamainjp 6:4749dd1acdd1 22 * const int IMG_X = 80;
shintamainjp 6:4749dd1acdd1 23 * const int IMG_Y = 60;
shintamainjp 6:4749dd1acdd1 24 * char buf[IMG_X * IMG_Y * 2];
shintamainjp 6:4749dd1acdd1 25 *
shintamainjp 6:4749dd1acdd1 26 * void uncompressed_callback(size_t done, size_t total, char c) {
shintamainjp 6:4749dd1acdd1 27 * buf[done - 1] = c;
shintamainjp 6:4749dd1acdd1 28 * }
shintamainjp 6:4749dd1acdd1 29 *
shintamainjp 6:4749dd1acdd1 30 * void jpeg_callback(char *buf, size_t siz) {
shintamainjp 6:4749dd1acdd1 31 * for (int i = 0; i < (int)siz; i++) {
shintamainjp 6:4749dd1acdd1 32 * fprintf(fp_jpeg, "%c", buf[i]);
shintamainjp 6:4749dd1acdd1 33 * }
shintamainjp 6:4749dd1acdd1 34 * }
shintamainjp 6:4749dd1acdd1 35 *
shintamainjp 6:4749dd1acdd1 36 * void test_uncompressed_snapshot_picture(void) {
shintamainjp 6:4749dd1acdd1 37 * CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 6:4749dd1acdd1 38 *
shintamainjp 6:4749dd1acdd1 39 * err = camera.sync();
shintamainjp 6:4749dd1acdd1 40 * err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
shintamainjp 6:4749dd1acdd1 41 * err = camera.getUncompressedSnapshotPicture(uncompressed_callback);
shintamainjp 6:4749dd1acdd1 42 *
shintamainjp 6:4749dd1acdd1 43 * snprintf(fname, sizeof(fname), "/fs/ucss.ppm");
shintamainjp 6:4749dd1acdd1 44 * FILE *fp = fopen(fname, "w");
shintamainjp 6:4749dd1acdd1 45 * fprintf(fp, "P3\n");
shintamainjp 6:4749dd1acdd1 46 fprintf(fp, "%d %d\n", IMG_X, IMG_Y);
shintamainjp 6:4749dd1acdd1 47 fprintf(fp, "%d\n", 255);
shintamainjp 6:4749dd1acdd1 48 for (int y = 0; y < IMG_Y; y++) {
shintamainjp 6:4749dd1acdd1 49 for (int x = 0; x < IMG_X; x++) {
shintamainjp 6:4749dd1acdd1 50 int adrofs = y * (IMG_X * 2) + (x * 2);
shintamainjp 6:4749dd1acdd1 51 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
shintamainjp 6:4749dd1acdd1 52 uint8_t r = ((dat >> 11) & 0x1f) << 3;
shintamainjp 6:4749dd1acdd1 53 uint8_t g = ((dat >> 5) & 0x3f) << 2;
shintamainjp 6:4749dd1acdd1 54 uint8_t b = ((dat >> 0) & 0x1f) << 3;
shintamainjp 6:4749dd1acdd1 55 fprintf(fp,"%d %d %d\n", r, g, b);
shintamainjp 6:4749dd1acdd1 56 }
shintamainjp 6:4749dd1acdd1 57 }
shintamainjp 6:4749dd1acdd1 58 fclose(fp);
shintamainjp 6:4749dd1acdd1 59 }
shintamainjp 6:4749dd1acdd1 60
shintamainjp 6:4749dd1acdd1 61 void test_uncompressed_preview_picture(void) {
shintamainjp 6:4749dd1acdd1 62 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 6:4749dd1acdd1 63
shintamainjp 6:4749dd1acdd1 64 err = camera.init(CameraC328::Color16bit, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
shintamainjp 6:4749dd1acdd1 65 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 66 serial.printf("[ OK ] : CameraC328::init\n");
shintamainjp 6:4749dd1acdd1 67 } else {
shintamainjp 6:4749dd1acdd1 68 serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 69 }
shintamainjp 6:4749dd1acdd1 70
shintamainjp 6:4749dd1acdd1 71 for (int i = 0; i < 10; i++) {
shintamainjp 6:4749dd1acdd1 72 err = camera.getUncompressedPreviewPicture(uncompressed_callback);
shintamainjp 6:4749dd1acdd1 73 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 74 serial.printf("[ OK ] : CameraC328::getUncompressedPreviewPicture\n");
shintamainjp 6:4749dd1acdd1 75 } else {
shintamainjp 6:4749dd1acdd1 76 serial.printf("[FAIL] : CameraC328::getUncompressedPreviewPicture (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 77 }
shintamainjp 6:4749dd1acdd1 78
shintamainjp 6:4749dd1acdd1 79 char fname[64];
shintamainjp 6:4749dd1acdd1 80 snprintf(fname, sizeof(fname), "/fs/ucpv%04d.ppm", i);
shintamainjp 6:4749dd1acdd1 81 FILE *fp = fopen(fname, "w");
shintamainjp 6:4749dd1acdd1 82 fprintf(fp, "P3\n");
shintamainjp 6:4749dd1acdd1 83 fprintf(fp, "%d %d\n", IMG_X, IMG_Y);
shintamainjp 6:4749dd1acdd1 84 fprintf(fp, "%d\n", 255);
shintamainjp 6:4749dd1acdd1 85 for (int y = 0; y < IMG_Y; y++) {
shintamainjp 6:4749dd1acdd1 86 for (int x = 0; x < IMG_X; x++) {
shintamainjp 6:4749dd1acdd1 87 int adrofs = y * (IMG_X * 2) + (x * 2);
shintamainjp 6:4749dd1acdd1 88 uint16_t dat = (buf[adrofs + 0] << 8) | (buf[adrofs + 1] << 0);
shintamainjp 6:4749dd1acdd1 89 uint8_t r = ((dat >> 11) & 0x1f) << 3;
shintamainjp 6:4749dd1acdd1 90 uint8_t g = ((dat >> 5) & 0x3f) << 2;
shintamainjp 6:4749dd1acdd1 91 uint8_t b = ((dat >> 0) & 0x1f) << 3;
shintamainjp 6:4749dd1acdd1 92 fprintf(fp,"%d %d %d\n", r, g, b);
shintamainjp 6:4749dd1acdd1 93 }
shintamainjp 6:4749dd1acdd1 94 }
shintamainjp 6:4749dd1acdd1 95 fclose(fp);
shintamainjp 6:4749dd1acdd1 96 }
shintamainjp 6:4749dd1acdd1 97 }
shintamainjp 6:4749dd1acdd1 98
shintamainjp 6:4749dd1acdd1 99 void test_jpeg_snapshot_picture(void) {
shintamainjp 6:4749dd1acdd1 100 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 6:4749dd1acdd1 101
shintamainjp 6:4749dd1acdd1 102 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
shintamainjp 6:4749dd1acdd1 103 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 104 serial.printf("[ OK ] : CameraC328::init\n");
shintamainjp 6:4749dd1acdd1 105 } else {
shintamainjp 6:4749dd1acdd1 106 serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 107 }
shintamainjp 6:4749dd1acdd1 108
shintamainjp 6:4749dd1acdd1 109 for (int i = 0; i < 10; i++) {
shintamainjp 6:4749dd1acdd1 110 char fname[64];
shintamainjp 6:4749dd1acdd1 111 snprintf(fname, sizeof(fname), "/fs/jpss%04d.jpg", i);
shintamainjp 6:4749dd1acdd1 112 fp_jpeg = fopen(fname, "w");
shintamainjp 6:4749dd1acdd1 113
shintamainjp 6:4749dd1acdd1 114 err = camera.getJpegSnapshotPicture(jpeg_callback);
shintamainjp 6:4749dd1acdd1 115 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 116 serial.printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
shintamainjp 6:4749dd1acdd1 117 } else {
shintamainjp 6:4749dd1acdd1 118 serial.printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 119 }
shintamainjp 6:4749dd1acdd1 120
shintamainjp 6:4749dd1acdd1 121 fclose(fp_jpeg);
shintamainjp 6:4749dd1acdd1 122 }
shintamainjp 6:4749dd1acdd1 123 }
shintamainjp 6:4749dd1acdd1 124
shintamainjp 6:4749dd1acdd1 125 void test_jpeg_preview_picture(void) {
shintamainjp 6:4749dd1acdd1 126 CameraC328::ErrorNumber err = CameraC328::NoError;
shintamainjp 6:4749dd1acdd1 127
shintamainjp 6:4749dd1acdd1 128 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
shintamainjp 6:4749dd1acdd1 129 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 130 serial.printf("[ OK ] : CameraC328::init\n");
shintamainjp 6:4749dd1acdd1 131 } else {
shintamainjp 6:4749dd1acdd1 132 serial.printf("[FAIL] : CameraC328::init (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 133 }
shintamainjp 6:4749dd1acdd1 134
shintamainjp 6:4749dd1acdd1 135 for (int i = 0; i < 10; i++) {
shintamainjp 6:4749dd1acdd1 136 char fname[64];
shintamainjp 6:4749dd1acdd1 137 snprintf(fname, sizeof(fname), "/fs/jppv%04d.jpg", i);
shintamainjp 6:4749dd1acdd1 138 fp_jpeg = fopen(fname, "w");
shintamainjp 6:4749dd1acdd1 139
shintamainjp 6:4749dd1acdd1 140 err = camera.getJpegPreviewPicture(jpeg_callback);
shintamainjp 6:4749dd1acdd1 141 if (CameraC328::NoError == err) {
shintamainjp 6:4749dd1acdd1 142 serial.printf("[ OK ] : CameraC328::getJpegPreviewPicture\n");
shintamainjp 6:4749dd1acdd1 143 } else {
shintamainjp 6:4749dd1acdd1 144 serial.printf("[FAIL] : CameraC328::getJpegPreviewPicture (Error=%02X)\n", (int)err);
shintamainjp 6:4749dd1acdd1 145 }
shintamainjp 6:4749dd1acdd1 146
shintamainjp 6:4749dd1acdd1 147 fclose(fp_jpeg);
shintamainjp 6:4749dd1acdd1 148 }
shintamainjp 6:4749dd1acdd1 149 }
shintamainjp 6:4749dd1acdd1 150
shintamainjp 6:4749dd1acdd1 151 int main() {
shintamainjp 6:4749dd1acdd1 152 serial.baud(19200);
shintamainjp 6:4749dd1acdd1 153 serial.printf("\n");
shintamainjp 6:4749dd1acdd1 154 serial.printf("==========\n");
shintamainjp 6:4749dd1acdd1 155 serial.printf("CameraC328\n");
shintamainjp 6:4749dd1acdd1 156 serial.printf("==========\n");
shintamainjp 6:4749dd1acdd1 157
shintamainjp 6:4749dd1acdd1 158 sync();
shintamainjp 6:4749dd1acdd1 159 test_uncompressed_snapshot_picture();
shintamainjp 6:4749dd1acdd1 160 test_uncompressed_preview_picture();
shintamainjp 6:4749dd1acdd1 161 test_jpeg_preview_picture();
shintamainjp 6:4749dd1acdd1 162 test_jpeg_snapshot_picture();
shintamainjp 6:4749dd1acdd1 163 }
shintamainjp 6:4749dd1acdd1 164 */
shintamainjp 6:4749dd1acdd1 165 class CameraC328 {
shintamainjp 6:4749dd1acdd1 166 public:
shintamainjp 6:4749dd1acdd1 167
shintamainjp 6:4749dd1acdd1 168 /**
shintamainjp 6:4749dd1acdd1 169 * Color type
shintamainjp 6:4749dd1acdd1 170 */
shintamainjp 6:4749dd1acdd1 171 enum ColorType {
shintamainjp 6:4749dd1acdd1 172 GrayScale2bit = 0x01, // 2bit for Y only
shintamainjp 6:4749dd1acdd1 173 GrayScale4bit = 0x02, // 4bit for Y only
shintamainjp 6:4749dd1acdd1 174 GrayScale8bit = 0x03, // 8bit for Y only
shintamainjp 6:4749dd1acdd1 175 Color12bit = 0x05, // 444 (RGB)
shintamainjp 6:4749dd1acdd1 176 Color16bit = 0x06, // 565 (RGB)
shintamainjp 6:4749dd1acdd1 177 Jpeg = 0x07
shintamainjp 6:4749dd1acdd1 178 };
shintamainjp 6:4749dd1acdd1 179
shintamainjp 6:4749dd1acdd1 180 enum RawResolution {
shintamainjp 6:4749dd1acdd1 181 RawResolution80x60 = 0x01,
shintamainjp 6:4749dd1acdd1 182 RawResolution160x120 = 0x03
shintamainjp 6:4749dd1acdd1 183 };
shintamainjp 6:4749dd1acdd1 184
shintamainjp 6:4749dd1acdd1 185 enum JpegResolution {
shintamainjp 6:4749dd1acdd1 186 JpegResolution80x64 = 0x01,
shintamainjp 6:4749dd1acdd1 187 JpegResolution160x128 = 0x03,
shintamainjp 6:4749dd1acdd1 188 JpegResolution320x240 = 0x05,
shintamainjp 6:4749dd1acdd1 189 JpegResolution640x480 = 0x07
shintamainjp 6:4749dd1acdd1 190 };
shintamainjp 6:4749dd1acdd1 191
shintamainjp 6:4749dd1acdd1 192 enum ErrorNumber {
shintamainjp 6:4749dd1acdd1 193 NoError = 0x00,
shintamainjp 6:4749dd1acdd1 194 PictureTypeError = 0x01,
shintamainjp 6:4749dd1acdd1 195 PictureUpScale = 0x02,
shintamainjp 6:4749dd1acdd1 196 PictureScaleError = 0x03,
shintamainjp 6:4749dd1acdd1 197 UnexpectedReply = 0x04,
shintamainjp 6:4749dd1acdd1 198 SendPictureTimeout = 0x05,
shintamainjp 6:4749dd1acdd1 199 UnexpectedCommand = 0x06,
shintamainjp 6:4749dd1acdd1 200 SramJpegTypeError = 0x07,
shintamainjp 6:4749dd1acdd1 201 SramJpegSizeError = 0x08,
shintamainjp 6:4749dd1acdd1 202 PictureFormatError = 0x09,
shintamainjp 6:4749dd1acdd1 203 PictureSizeError = 0x0a,
shintamainjp 6:4749dd1acdd1 204 ParameterError = 0x0b,
shintamainjp 6:4749dd1acdd1 205 SendRegisterTimeout = 0x0c,
shintamainjp 6:4749dd1acdd1 206 CommandIdError = 0x0d,
shintamainjp 6:4749dd1acdd1 207 PictureNotReady = 0x0f,
shintamainjp 6:4749dd1acdd1 208 TransferPackageNumberError = 0x10,
shintamainjp 6:4749dd1acdd1 209 SetTransferPackageSizeWrong = 0x11,
shintamainjp 6:4749dd1acdd1 210 CommandHeaderError = 0xf0,
shintamainjp 6:4749dd1acdd1 211 CommandLengthError = 0xf1,
shintamainjp 6:4749dd1acdd1 212 SendPictureError = 0xf5,
shintamainjp 6:4749dd1acdd1 213 SendCommandError = 0xff
shintamainjp 6:4749dd1acdd1 214 };
shintamainjp 6:4749dd1acdd1 215
shintamainjp 6:4749dd1acdd1 216 enum PictureType {
shintamainjp 6:4749dd1acdd1 217 SnapshotPicture = 0x01,
shintamainjp 6:4749dd1acdd1 218 PreviewPicture = 0x02,
shintamainjp 6:4749dd1acdd1 219 JpegPreviewPicture = 0x05
shintamainjp 6:4749dd1acdd1 220 };
shintamainjp 6:4749dd1acdd1 221
shintamainjp 6:4749dd1acdd1 222 enum SnapshotType {
shintamainjp 6:4749dd1acdd1 223 CompressedPicture = 0x00,
shintamainjp 6:4749dd1acdd1 224 UncompressedPicture = 0x01
shintamainjp 6:4749dd1acdd1 225 };
shintamainjp 6:4749dd1acdd1 226
shintamainjp 6:4749dd1acdd1 227 enum Baud {
shintamainjp 6:4749dd1acdd1 228 Baud7200 = 7200,
shintamainjp 6:4749dd1acdd1 229 Baud9600 = 9600,
shintamainjp 6:4749dd1acdd1 230 Baud14400 = 14400,
shintamainjp 6:4749dd1acdd1 231 Baud19200 = 19200, // Default.
shintamainjp 6:4749dd1acdd1 232 Baud28800 = 28800,
shintamainjp 6:4749dd1acdd1 233 Baud38400 = 38400,
shintamainjp 6:4749dd1acdd1 234 Baud57600 = 57600,
shintamainjp 6:4749dd1acdd1 235 Baud115200 = 115200
shintamainjp 6:4749dd1acdd1 236 };
shintamainjp 6:4749dd1acdd1 237
shintamainjp 6:4749dd1acdd1 238 enum ResetType {
shintamainjp 6:4749dd1acdd1 239 ResetWholeSystem = 0x00,
shintamainjp 6:4749dd1acdd1 240 ResetStateMachines = 0x01
shintamainjp 6:4749dd1acdd1 241 };
shintamainjp 6:4749dd1acdd1 242
shintamainjp 6:4749dd1acdd1 243 enum DataType {
shintamainjp 6:4749dd1acdd1 244 DataTypeSnapshotPicture = 0x01,
shintamainjp 6:4749dd1acdd1 245 DataTypePreviewPicture = 0x02,
shintamainjp 6:4749dd1acdd1 246 DataTypeJpegPreviewPicture = 0x05
shintamainjp 6:4749dd1acdd1 247 };
shintamainjp 6:4749dd1acdd1 248
shintamainjp 6:4749dd1acdd1 249 /**
shintamainjp 6:4749dd1acdd1 250 * @param tx TX of UART.
shintamainjp 6:4749dd1acdd1 251 * @param rx RX of UART.
shintamainjp 6:4749dd1acdd1 252 * @param baud Baudrate of UART. (Default is Baud19200)
shintamainjp 6:4749dd1acdd1 253 */
shintamainjp 6:4749dd1acdd1 254 CameraC328(PinName tx, PinName rx, Baud baud = Baud19200);
shintamainjp 6:4749dd1acdd1 255
shintamainjp 6:4749dd1acdd1 256 ~CameraC328();
shintamainjp 6:4749dd1acdd1 257
shintamainjp 6:4749dd1acdd1 258 ErrorNumber sync();
shintamainjp 6:4749dd1acdd1 259 ErrorNumber init(ColorType ct, RawResolution rr, JpegResolution jr);
shintamainjp 6:4749dd1acdd1 260 ErrorNumber getUncompressedSnapshotPicture(void(*func)(size_t done, size_t total, char c));
shintamainjp 6:4749dd1acdd1 261 ErrorNumber getUncompressedPreviewPicture(void(*func)(size_t done, size_t total, char c));
shintamainjp 6:4749dd1acdd1 262 ErrorNumber getJpegSnapshotPicture(void(*func)(char *buf, size_t siz));
shintamainjp 6:4749dd1acdd1 263 ErrorNumber getJpegPreviewPicture(void(*func)(char *buf, size_t siz));
shintamainjp 6:4749dd1acdd1 264
shintamainjp 6:4749dd1acdd1 265 private:
shintamainjp 6:4749dd1acdd1 266 Serial serial;
shintamainjp 6:4749dd1acdd1 267 static const int COMMAND_LENGTH = 6;
shintamainjp 6:4749dd1acdd1 268 static const int SYNCMAX = 60;
shintamainjp 6:4749dd1acdd1 269 static const int packageSize = 512;
shintamainjp 6:4749dd1acdd1 270
shintamainjp 6:4749dd1acdd1 271 ErrorNumber sendInitial(ColorType ct, RawResolution rr, JpegResolution jr);
shintamainjp 6:4749dd1acdd1 272 ErrorNumber sendGetPicture(PictureType pt);
shintamainjp 6:4749dd1acdd1 273 ErrorNumber sendSnapshot(SnapshotType st, uint16_t skipFrames);
shintamainjp 6:4749dd1acdd1 274 ErrorNumber sendSetPackageSize(uint16_t packageSize);
shintamainjp 6:4749dd1acdd1 275 ErrorNumber sendSetBaudrate(Baud baud);
shintamainjp 6:4749dd1acdd1 276 ErrorNumber sendReset(ResetType rt, bool specialReset);
shintamainjp 6:4749dd1acdd1 277 ErrorNumber sendPowerOff();
shintamainjp 6:4749dd1acdd1 278 ErrorNumber recvData(DataType *dt, uint32_t *length);
shintamainjp 6:4749dd1acdd1 279 ErrorNumber sendSync();
shintamainjp 6:4749dd1acdd1 280 ErrorNumber recvSync();
shintamainjp 6:4749dd1acdd1 281 ErrorNumber sendAck(uint8_t commandId, uint16_t packageId);
shintamainjp 6:4749dd1acdd1 282 ErrorNumber recvAckOrNck();
shintamainjp 6:4749dd1acdd1 283
shintamainjp 6:4749dd1acdd1 284 bool sendBytes(char *buf, size_t len, int timeout_us = 20000);
shintamainjp 6:4749dd1acdd1 285 bool recvBytes(char *buf, size_t len, int timeout_us = 20000);
shintamainjp 6:4749dd1acdd1 286 bool waitRecv();
shintamainjp 6:4749dd1acdd1 287 };
shintamainjp 6:4749dd1acdd1 288
shintamainjp 6:4749dd1acdd1 289 #endif