PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /*
demayer 0:6bf0743ece18 2 * Copyright (c) 2013-2017, ARM Limited, All Rights Reserved
demayer 0:6bf0743ece18 3 * SPDX-License-Identifier: Apache-2.0
demayer 0:6bf0743ece18 4 *
demayer 0:6bf0743ece18 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
demayer 0:6bf0743ece18 6 * not use this file except in compliance with the License.
demayer 0:6bf0743ece18 7 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 8 *
demayer 0:6bf0743ece18 9 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 10 *
demayer 0:6bf0743ece18 11 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
demayer 0:6bf0743ece18 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 14 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 15 * limitations under the License.
demayer 0:6bf0743ece18 16 */
demayer 0:6bf0743ece18 17
demayer 0:6bf0743ece18 18 #ifndef MBED_CONF_APP_CONNECT_STATEMENT
demayer 0:6bf0743ece18 19 #error [NOT_SUPPORTED] No network configuration found for this target.
demayer 0:6bf0743ece18 20 #endif
demayer 0:6bf0743ece18 21
demayer 0:6bf0743ece18 22 #include "mbed.h"
demayer 0:6bf0743ece18 23 #include MBED_CONF_APP_HEADER_FILE
demayer 0:6bf0743ece18 24 #include "UDPSocket.h"
demayer 0:6bf0743ece18 25 #include "greentea-client/test_env.h"
demayer 0:6bf0743ece18 26 #include "unity/unity.h"
demayer 0:6bf0743ece18 27 #include "utest.h"
demayer 0:6bf0743ece18 28
demayer 0:6bf0743ece18 29 using namespace utest::v1;
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31
demayer 0:6bf0743ece18 32 #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE
demayer 0:6bf0743ece18 33 #define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64
demayer 0:6bf0743ece18 34 #endif
demayer 0:6bf0743ece18 35
demayer 0:6bf0743ece18 36 #ifndef MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT
demayer 0:6bf0743ece18 37 #define MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT 500
demayer 0:6bf0743ece18 38 #endif
demayer 0:6bf0743ece18 39
demayer 0:6bf0743ece18 40 namespace {
demayer 0:6bf0743ece18 41 char tx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
demayer 0:6bf0743ece18 42 char rx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
demayer 0:6bf0743ece18 43 const char ASCII_MAX = '~' - ' ';
demayer 0:6bf0743ece18 44 const int ECHO_LOOPS = 16;
demayer 0:6bf0743ece18 45 char uuid[48] = {0};
demayer 0:6bf0743ece18 46 }
demayer 0:6bf0743ece18 47
demayer 0:6bf0743ece18 48 void prep_buffer(char *uuid, char *tx_buffer, size_t tx_size) {
demayer 0:6bf0743ece18 49 size_t i = 0;
demayer 0:6bf0743ece18 50
demayer 0:6bf0743ece18 51 memcpy(tx_buffer, uuid, strlen(uuid));
demayer 0:6bf0743ece18 52 i += strlen(uuid);
demayer 0:6bf0743ece18 53
demayer 0:6bf0743ece18 54 tx_buffer[i++] = ' ';
demayer 0:6bf0743ece18 55
demayer 0:6bf0743ece18 56 for (; i<tx_size; ++i) {
demayer 0:6bf0743ece18 57 tx_buffer[i] = (rand() % 10) + '0';
demayer 0:6bf0743ece18 58 }
demayer 0:6bf0743ece18 59 }
demayer 0:6bf0743ece18 60
demayer 0:6bf0743ece18 61 void test_udp_echo() {
demayer 0:6bf0743ece18 62
demayer 0:6bf0743ece18 63 NetworkInterface* net = MBED_CONF_APP_OBJECT_CONSTRUCTION;
demayer 0:6bf0743ece18 64 int err = MBED_CONF_APP_CONNECT_STATEMENT;
demayer 0:6bf0743ece18 65
demayer 0:6bf0743ece18 66 TEST_ASSERT_EQUAL(0, err);
demayer 0:6bf0743ece18 67
demayer 0:6bf0743ece18 68 if (err) {
demayer 0:6bf0743ece18 69 printf("MBED: failed to connect with an error of %d\r\n", err);
demayer 0:6bf0743ece18 70 TEST_ASSERT_EQUAL(0, err);
demayer 0:6bf0743ece18 71 }
demayer 0:6bf0743ece18 72
demayer 0:6bf0743ece18 73 printf("UDP client IP Address is %s\n", net->get_ip_address());
demayer 0:6bf0743ece18 74
demayer 0:6bf0743ece18 75 UDPSocket sock;
demayer 0:6bf0743ece18 76 sock.open(net);
demayer 0:6bf0743ece18 77 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
demayer 0:6bf0743ece18 78
demayer 0:6bf0743ece18 79 SocketAddress udp_addr(MBED_CONF_APP_ECHO_SERVER_ADDR, MBED_CONF_APP_ECHO_SERVER_PORT);
demayer 0:6bf0743ece18 80
demayer 0:6bf0743ece18 81 int success = 0;
demayer 0:6bf0743ece18 82 for (int i = 0; success < ECHO_LOOPS; i++) {
demayer 0:6bf0743ece18 83 prep_buffer(uuid, tx_buffer, sizeof(tx_buffer));
demayer 0:6bf0743ece18 84 const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
demayer 0:6bf0743ece18 85 if (ret >= 0) {
demayer 0:6bf0743ece18 86 printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer);
demayer 0:6bf0743ece18 87 } else {
demayer 0:6bf0743ece18 88 printf("[%02d] Network error %d\n", i, ret);
demayer 0:6bf0743ece18 89 continue;
demayer 0:6bf0743ece18 90 }
demayer 0:6bf0743ece18 91
demayer 0:6bf0743ece18 92 SocketAddress temp_addr;
demayer 0:6bf0743ece18 93 const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
demayer 0:6bf0743ece18 94 if (n >= 0) {
demayer 0:6bf0743ece18 95 printf("[%02d] recv %d bytes - %.*s \n", i, n, n, rx_buffer);
demayer 0:6bf0743ece18 96 } else {
demayer 0:6bf0743ece18 97 printf("[%02d] Network error %d\n", i, n);
demayer 0:6bf0743ece18 98 continue;
demayer 0:6bf0743ece18 99 }
demayer 0:6bf0743ece18 100
demayer 0:6bf0743ece18 101 if ((temp_addr == udp_addr &&
demayer 0:6bf0743ece18 102 n == sizeof(tx_buffer) &&
demayer 0:6bf0743ece18 103 memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
demayer 0:6bf0743ece18 104 success += 1;
demayer 0:6bf0743ece18 105
demayer 0:6bf0743ece18 106 printf("[%02d] success #%d\n", i, success);
demayer 0:6bf0743ece18 107 continue;
demayer 0:6bf0743ece18 108 }
demayer 0:6bf0743ece18 109
demayer 0:6bf0743ece18 110 // failed, clean out any remaining bad packets
demayer 0:6bf0743ece18 111 sock.set_timeout(0);
demayer 0:6bf0743ece18 112 while (true) {
demayer 0:6bf0743ece18 113 err = sock.recvfrom(NULL, NULL, 0);
demayer 0:6bf0743ece18 114 if (err == NSAPI_ERROR_WOULD_BLOCK) {
demayer 0:6bf0743ece18 115 break;
demayer 0:6bf0743ece18 116 }
demayer 0:6bf0743ece18 117 }
demayer 0:6bf0743ece18 118 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
demayer 0:6bf0743ece18 119 }
demayer 0:6bf0743ece18 120
demayer 0:6bf0743ece18 121 sock.close();
demayer 0:6bf0743ece18 122 net->disconnect();
demayer 0:6bf0743ece18 123 TEST_ASSERT_EQUAL(ECHO_LOOPS, success);
demayer 0:6bf0743ece18 124 }
demayer 0:6bf0743ece18 125
demayer 0:6bf0743ece18 126
demayer 0:6bf0743ece18 127 // Test setup
demayer 0:6bf0743ece18 128 utest::v1::status_t test_setup(const size_t number_of_cases) {
demayer 0:6bf0743ece18 129 GREENTEA_SETUP(240, "udp_echo");
demayer 0:6bf0743ece18 130
demayer 0:6bf0743ece18 131 // create mac address based on uuid
demayer 0:6bf0743ece18 132 uint64_t mac = 0;
demayer 0:6bf0743ece18 133 for (int i = 0; i < sizeof(uuid); i++) {
demayer 0:6bf0743ece18 134 mac += uuid[i];
demayer 0:6bf0743ece18 135 }
demayer 0:6bf0743ece18 136 //mbed_set_mac_address((const char*)mac, /*coerce control bits*/ 1);
demayer 0:6bf0743ece18 137
demayer 0:6bf0743ece18 138 return verbose_test_setup_handler(number_of_cases);
demayer 0:6bf0743ece18 139 }
demayer 0:6bf0743ece18 140
demayer 0:6bf0743ece18 141 Case cases[] = {
demayer 0:6bf0743ece18 142 Case("UDP echo", test_udp_echo),
demayer 0:6bf0743ece18 143 };
demayer 0:6bf0743ece18 144
demayer 0:6bf0743ece18 145 Specification specification(test_setup, cases);
demayer 0:6bf0743ece18 146
demayer 0:6bf0743ece18 147 int main() {
demayer 0:6bf0743ece18 148 return !Harness::run(specification);
demayer 0:6bf0743ece18 149 }