From 1c3d2376a653b643d40b09ba0298e0420e0e3140 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 15 May 2009 14:20:14 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@971 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/include/channels.h | 4 +- test/testserial.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/include/channels.h b/src/include/channels.h index 791572b75..a1c538f62 100644 --- a/src/include/channels.h +++ b/src/include/channels.h @@ -151,7 +151,7 @@ typedef struct { * @return A byte value from the queue or: * @retval Q_RESET if the channel associated queue (if any) was reset. */ -#define chIOGet(ip) ((ip)->vmt->m0.put(ip, TIME_INFINITE)) +#define chIOGet(ip) ((ip)->vmt->m0.get(ip, TIME_INFINITE)) /** * @brief Channel blocking byte read with timeout. @@ -168,7 +168,7 @@ typedef struct { * @retval Q_TIMEOUT if the specified time expired. * @retval Q_RESET if the channel associated queue (if any) was reset. */ -#define chIOGetTimeout(ip, timeout) ((ip)->vmt->m0.put(ip, timeout)) +#define chIOGetTimeout(ip, timeout) ((ip)->vmt->m0.get(ip, timeout)) #if CH_USE_EVENTS /** diff --git a/test/testserial.c b/test/testserial.c index 84db657ec..3144f81eb 100644 --- a/test/testserial.c +++ b/test/testserial.c @@ -51,6 +51,105 @@ #if CH_USE_SERIAL_FULLDUPLEX +#define TEST_QUEUES_SIZE 8 + +static FullDuplexDriver fdd; + +/* Loopback thread, it simulates a low level driver. The thread terminates by + sending a zero through the loopback driver.*/ +static msg_t thread1(void *p) { + + while (TRUE) { + chEvtWaitAny(1); + chSysLock(); + while (TRUE) { + msg_t b = chFDDRequestDataI(&fdd); + if (b < Q_OK) + break; + if (b == 0) { + chSchRescheduleS(); + chSysUnlock(); + return 0; + } + chFDDIncomingDataI(&fdd, (uint8_t)b); + chSchRescheduleS(); + } + chSysUnlock(); + } +} + +static void infy(void) {} + +static void onfy(void) { + + chEvtSignalI(threads[0], 1); + chSchRescheduleS(); +} + +/** + * @page test_serial_001 Loopback test + * + *

Description

+ * A sequence of characters are sent to the loopback driver and read back. The + * test is performed twice using both the direct APIs and the channels API + * implementations.
+ * The test expects to read all the characters back and in the correct + * sequence. + */ + +static char *serial1_gettest(void) { + + return "Serial driver, loopback"; +} + +static void serial1_setup(void) { + + chFDDInit(&fdd, wa[3], 8, infy, wa[4], 8, onfy); +} + +static void serial1_execute(void) { + unsigned i; + msg_t b; + + /* Loopback test using the direct APIs.*/ + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, + thread1, 0); + for (i = 0; i < 4; i++) { + chFDDPut(&fdd, 'A' + i); + b = chFDDGetTimeout(&fdd, S2ST(1)); + if (b < Q_OK) + break; + test_emit_token(b); + } + chFDDPut(&fdd, 0); + test_assert_sequence(1, "ABCD"); + test_assert(2, chFDDPutWouldBlock(&fdd) == FALSE, "output would block"); + test_assert(3, chFDDGetWouldBlock(&fdd) == TRUE, "input would not block"); + test_wait_threads(); + + /* Loopback test using the channel APIs.*/ + threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriority() + 1, + thread1, 0); + for (i = 0; i < 4; i++) { + chIOPut(&fdd, 'A' + i); + b = chIOGetTimeout(&fdd, S2ST(1)); + if (b < Q_OK) + break; + test_emit_token(b); + } + chIOPut(&fdd, 0); + test_assert_sequence(4, "ABCD"); + test_assert(5, chIOPutWouldBlock(&fdd) == FALSE, "output would block"); + test_assert(6, chIOGetWouldBlock(&fdd) == TRUE, "input would not block"); + test_wait_threads(); +} + +const struct testcase testserial1 = { + serial1_gettest, + serial1_setup, + NULL, + serial1_execute +}; #endif /* CH_USE_SERIAL_FULLDUPLEX */ /* @@ -58,7 +157,7 @@ */ const struct testcase * const patternserial[] = { #if CH_USE_SERIAL_FULLDUPLEX -// &testserial1, + &testserial1, #endif NULL }; -- cgit v1.2.3