void main(void) { startup_board(); start_thread(&service_thread, service, 0, stack, sizeof(stack)); start_cdc_service(); set_cdc_timeout(10); while (1) { yield_thread((condition_t)has_cdc_connection, 0); debug("connected\n"); while (has_cdc_connection()) { static u8_t buffer[1024]; const u32_t count = read_cdc_data(buffer, sizeof(buffer)); if (count) { write_cdc_data(buffer, count); debug("%m\n", buffer, count); } } debug("disconnected\n"); } }
void main(void) { startup_board(); start_thread(&service_thread, service, 0, stack, sizeof(stack)); start_hid_service(); while (1) { yield_thread((condition_t)has_hid_connection, 0); debug("connected\n"); while (has_hid_connection()) { press(0x04); press(0x05); press(0x06); sleep(250); move(0, -100); sleep(250); move(-100, 0); sleep(250); move(0, 100); sleep(250); move(100, 0); sleep(200); } debug("disconnected\n"); } }
static void service(void *data) { WASTE(data); while (1) { yield_thread((condition_t)has_cdc_line_coding, 0); const struct line_coding *coding = get_cdc_line_coding(); debug("baudrate: %d, data %d, parity %d, stop %d\n", coding->baud_rate, coding->data_bits, coding->parity_type, coding->stop_bits); } }
static int test_write(directory_t* tmpdir) { iothread_t iothr = iothread_FREE; file_t file = file_FREE; memblock_t mblock[10] = { memblock_FREE }; memblock_t readbuf = memblock_FREE; iotask_t iotask_buffer[lengthof(mblock)]; iotask_t* iotask[lengthof(mblock)]; eventcount_t counter = eventcount_INIT; // prepare0 TEST(0 == init_iothread(&iothr)); memset(iotask_buffer, 0, sizeof(iotask_buffer)); for (unsigned i = 0; i < lengthof(iotask); ++i) { iotask[i] = &iotask_buffer[i]; } // fill write buffer for (size_t i = 0, val = 0; i < lengthof(mblock); ++i) { TEST(0 == ALLOC_PAGECACHE(pagesize_1MB, &mblock[i])); for (size_t off = 0; off < mblock[i].size/sizeof(uint32_t); ++off, ++val) { ((uint32_t*)mblock[i].addr)[off] = (uint32_t) val; } } // alloc read buffer TEST(0 == ALLOC_PAGECACHE(pagesize_1MB, &readbuf)); memset(readbuf.addr, 0, readbuf.size); // TEST insertiotask_iothread: writep (forward) static_assert((lengthof(iotask)-1) % 3 == 0, "full range 1..lengthof(iotask)"); for (unsigned nrio = 1; nrio <= lengthof(iotask); nrio += 3) { // prepare TEST(0 == initcreate_file(&file, "testwrite", tmpdir)); for (size_t i = 0; i < nrio; ++i) { initwritep_iotask(iotask[i], io_file(file), mblock[i].size, mblock[i].addr, (off_t) (i*mblock[0].size), &counter); } // test insertiotask_iothread(&iothr, (uint8_t) nrio, &iotask[0]); // check for (unsigned i = 0; i < nrio; ++i) { // wait for ready counter while (iostate_QUEUED == read_atomicint(&iotask[i]->state)) { wait_eventcount(&counter,0); } // check iotask TEST(0 == compare_iotask(iotask[i], 0, mblock[i].size, iostate_OK, ioop_WRITE, io_file(file), (off_t) (i*mblock[0].size), mblock[i].addr, mblock[i].size, &counter)); // check written bytes TEST((int)readbuf.size == pread(io_file(file), readbuf.addr, readbuf.size, iotask[i]->offset)); for (size_t vi = 0, val = (size_t)iotask[i]->offset/sizeof(uint32_t); vi < readbuf.size/sizeof(uint32_t); ++vi, ++val) { TEST(val == ((uint32_t*)readbuf.addr)[vi]); } // reset iotask[i]->bytesrw = 0; } // check file position (offset) not changed TEST(0 == lseek(io_file(file), 0, SEEK_CUR)); // reset TEST(0 == free_iochannel(&file)); TEST(0 == removefile_directory(tmpdir, "testwrite")); counter.nrevents = 0; } // TEST insertiotask_iothread: writep (backward) static_assert((lengthof(iotask)-1) % 3 == 0, "full range 1..lengthof(iotask)"); for (unsigned nrio = 1; nrio <= lengthof(iotask); nrio += 3) { // prepare TEST(0 == initcreate_file(&file, "testwrite", tmpdir)); for (unsigned i = 0; i < nrio; ++i) { initwritep_iotask(iotask[i], io_file(file), mblock[i].size, mblock[i].addr, (off_t)((nrio-1-i)*mblock[0].size), &counter); } // test insertiotask_iothread(&iothr, (uint8_t) nrio, &iotask[0]); // check for (unsigned i = 0; i < nrio; ++i) { // wait for ready counter while (iostate_QUEUED == read_atomicint(&iotask[i]->state)) { wait_eventcount(&counter,0); } // check iotask TEST(0 == compare_iotask(iotask[i], 0, mblock[i].size, iostate_OK, ioop_WRITE, io_file(file), (off_t) ((nrio-1-i)*mblock[0].size), mblock[i].addr, mblock[i].size, &counter)); // check written bytes TEST((int)readbuf.size == pread(io_file(file), readbuf.addr, readbuf.size, iotask[i]->offset)); for (size_t vi = 0, val = i*mblock[0].size/sizeof(uint32_t); vi < readbuf.size/sizeof(uint32_t); ++vi, ++val) { TEST(val == ((uint32_t*)readbuf.addr)[vi]); } // reset iotask[i]->bytesrw = 0; } // check file position (offset) not changed TEST(0 == lseek(io_file(file), 0, SEEK_CUR)); // reset TEST(0 == free_iochannel(&file)); TEST(0 == removefile_directory(tmpdir, "testwrite")); counter.nrevents = 0; } // TEST insertiotask_iothread: write // prepare TEST(0 == initcreate_file(&file, "testwrite", tmpdir)); for (unsigned i = 0; i < lengthof(iotask); ++i) { initwrite_iotask(iotask[i], io_file(file), mblock[i].size, mblock[i].addr, 0); } // test insertiotask_iothread(&iothr, lengthof(iotask), &iotask[0]); // check for (unsigned i = 0; i < lengthof(iotask); ++i) { // wait for ready counter for (int w = 0; w < 500000; ++w) { if (iostate_QUEUED != read_atomicint(&iotask[i]->state)) break; yield_thread(); } // check iotask TEST(0 == compare_iotask(iotask[i], 0, mblock[i].size, iostate_OK, ioop_WRITE, io_file(file), -1, mblock[i].addr, mblock[i].size, 0)); // check written bytes TEST((int)readbuf.size == pread(io_file(file), readbuf.addr, readbuf.size, (off_t)(i*mblock[0].size))); for (size_t vi = 0, val = (i*mblock[0].size)/sizeof(uint32_t); vi < readbuf.size/sizeof(uint32_t); ++vi, ++val) { TEST(val == ((uint32_t*)readbuf.addr)[vi]); } // reset iotask[i]->bytesrw = 0; } // check file position (offset) changed TEST((off_t)(lengthof(mblock)*mblock[0].size) == lseek(io_file(file), 0, SEEK_CUR)); // reset TEST(0 == free_iochannel(&file)); TEST(0 == removefile_directory(tmpdir, "testwrite")); // reset0 TEST(0 == free_iothread(&iothr)); TEST(0 == free_eventcount(&counter)); for (unsigned i = 0; i < lengthof(mblock); ++i) { TEST(0 == RELEASE_PAGECACHE(&mblock[i])); } TEST(0 == RELEASE_PAGECACHE(&readbuf)); return 0; ONERR: free_iothread(&iothr); free_eventcount(&counter); free_iochannel(&file); for (unsigned i = 0; i < lengthof(mblock); ++i) { RELEASE_PAGECACHE(&mblock[i]); } RELEASE_PAGECACHE(&readbuf); removefile_directory(tmpdir, "testwrite"); return EINVAL; }