diff options
author | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-05-15 14:20:14 +0000 |
---|---|---|
committer | gdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4> | 2009-05-15 14:20:14 +0000 |
commit | 1c3d2376a653b643d40b09ba0298e0420e0e3140 (patch) | |
tree | c2e217c6c0795e6ceabe78388eb1e1b669c9cd57 /test | |
parent | 04faaf563c8c86f21ccfe85690ed6de33070e9fb (diff) | |
download | ChibiOS-1c3d2376a653b643d40b09ba0298e0420e0e3140.tar.gz ChibiOS-1c3d2376a653b643d40b09ba0298e0420e0e3140.tar.bz2 ChibiOS-1c3d2376a653b643d40b09ba0298e0420e0e3140.zip |
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@971 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'test')
-rw-r--r-- | test/testserial.c | 101 |
1 files changed, 100 insertions, 1 deletions
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 + * + * <h2>Description</h2> + * 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.<br> + * 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 }; |