int debugPutc(int c) /* returns -1 if output fails */ { chMtxLock(&debugOutLock); if (chOQGetEmptyI(&debugOutQ) > 1) { chOQPutTimeout( &debugOutQ, 0, TIME_IMMEDIATE); chOQPutTimeout( &debugOutQ, c, TIME_IMMEDIATE); }else c = -1; resumeReader(); chMtxUnlock(); return c; }
size_t debugPrint(const char *fmt, ...) /* printf style debugging output outputs a trailing newline */ { va_list ap; va_start(ap, fmt); NullStream lenStream = {&nullVmt, 0}; chvprintf((BaseSequentialStream *) &lenStream, fmt, ap); size_t len = lenStream.len; if (len) { chMtxLock(&debugOutLock); size_t qspace = chOQGetEmptyI(&debugOutQ); if (qspace) { if (len >= qspace) len = qspace - 1; //truncate string if it won't fit in queue if (len) { if (len > 255) len = 255; qStream dbgStream = {&qVmt, len}; chOQPutTimeout(&debugOutQ, len, TIME_IMMEDIATE); chvprintf((BaseSequentialStream *) &dbgStream, fmt, ap); resumeReader(); len++; } }else len=0; chMtxUnlock(); }else if (debugPutc('\n') >= 0) len=1; va_end(ap); return len; }
size_t debugPut(const uint8_t *block, size_t n) /* truncate any block > 255 bytes returns # of characters actually output (including the trailing newline) */ { if (n) { chMtxLock(&debugOutLock); size_t space = chOQGetEmptyI(&debugOutQ); if (space) { if (n >= space) n = space - 1; if (n) { if (n > 255) n = 255; chOQPutTimeout( &debugOutQ, n, TIME_IMMEDIATE); chOQWriteTimeout( &debugOutQ, block, n, TIME_IMMEDIATE); resumeReader(); n++; } }else n = 0; chMtxUnlock(); }else if (debugPutc('\n') >= 0) n = 1; return n; }
static msg_t qput(void *ip, uint8_t b) { qStream *qsp = ip; if (!qsp->space) return RDY_RESET; --qsp->space; chOQPutTimeout( &debugOutQ, b, TIME_IMMEDIATE); return RDY_OK; }
static void queues2_execute(void) { unsigned i; size_t n; /* Initial empty state */ test_assert_lock(1, chOQIsEmptyI(&oq), "not empty"); /* Queue filling */ for (i = 0; i < TEST_QUEUES_SIZE; i++) chOQPut(&oq, 'A' + i); test_assert_lock(2, chOQIsFullI(&oq), "still has space"); /* Queue emptying */ for (i = 0; i < TEST_QUEUES_SIZE; i++) { char c; chSysLock(); c = chOQGetI(&oq); chSysUnlock(); test_emit_token(c); } test_assert_lock(3, chOQIsEmptyI(&oq), "still full"); test_assert_sequence(4, "ABCD"); test_assert_lock(5, chOQGetI(&oq) == Q_EMPTY, "failed to report Q_EMPTY"); /* Writing the whole thing */ n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE * 2, TIME_IMMEDIATE); test_assert(6, n == TEST_QUEUES_SIZE, "wrong returned size"); test_assert_lock(7, chOQIsFullI(&oq), "not full"); threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread2, NULL); test_assert_lock(8, chOQGetFullI(&oq) == TEST_QUEUES_SIZE, "not empty"); test_wait_threads(); /* Testing reset */ chSysLock(); chOQResetI(&oq); chSysUnlock(); test_assert_lock(9, chOQGetFullI(&oq) == 0, "still full"); /* Partial writes */ n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); test_assert(10, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); test_assert(11, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); test_assert_lock(12, chOQIsFullI(&oq), "not full"); /* Timeout */ test_assert(13, chOQPutTimeout(&oq, 0, 10) == Q_TIMEOUT, "wrong timeout return"); }
static msg_t putt(void *ip, uint8_t b, systime_t timeout) { return chOQPutTimeout(&((BulkUSBDriver *)ip)->oqueue, b, timeout); }
static msg_t put(void *ip, uint8_t b) { return chOQPutTimeout(&((BulkUSBDriver *)ip)->oqueue, b, TIME_INFINITE); }
static msg_t thread2(void *p) { (void)p; chOQPutTimeout(&oq, 0, MS2ST(200)); return 0; }
msg_t OutQueue::putTimeout(uint8_t b, systime_t time) { return chOQPutTimeout(&oq, b, time); }