Example #1
0
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");
    }
}
Example #2
0
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");
    }
}
Example #3
0
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);
    }
}
Example #4
0
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;
}