Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/kernel/sampling_port.c@0:ccdea31d8eba, 2019-08-23 (annotated)
- Committer:
- gawas
- Date:
- Fri Aug 23 16:43:44 2019 +0000
- Revision:
- 0:ccdea31d8eba
init funtion;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| gawas | 0:ccdea31d8eba | 1 | #include <stdint.h> |
| gawas | 0:ccdea31d8eba | 2 | #include <stddef.h> |
| gawas | 0:ccdea31d8eba | 3 | #include <string.h> |
| gawas | 0:ccdea31d8eba | 4 | |
| gawas | 0:ccdea31d8eba | 5 | #include <apex_sampling.h> |
| gawas | 0:ccdea31d8eba | 6 | |
| gawas | 0:ccdea31d8eba | 7 | #include "ports.h" |
| gawas | 0:ccdea31d8eba | 8 | #include "../xml_data.h" |
| gawas | 0:ccdea31d8eba | 9 | #include "kernel/part_scheduler.h" |
| gawas | 0:ccdea31d8eba | 10 | |
| gawas | 0:ccdea31d8eba | 11 | |
| gawas | 0:ccdea31d8eba | 12 | void init_sampling_ports(void) |
| gawas | 0:ccdea31d8eba | 13 | { |
| gawas | 0:ccdea31d8eba | 14 | const size_t nb_channels = sizeof(connection_table) / sizeof(channel_t); |
| gawas | 0:ccdea31d8eba | 15 | for (size_t i = 0; i < nb_channels; i++) { |
| gawas | 0:ccdea31d8eba | 16 | channel_t *channel = &connection_table[i]; |
| gawas | 0:ccdea31d8eba | 17 | port_t **port_list = connection_table[i].ports; |
| gawas | 0:ccdea31d8eba | 18 | |
| gawas | 0:ccdea31d8eba | 19 | for (APEX_INTEGER n = 0; n < channel->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 20 | port_list[n]->channel_link = channel; |
| gawas | 0:ccdea31d8eba | 21 | } |
| gawas | 0:ccdea31d8eba | 22 | } |
| gawas | 0:ccdea31d8eba | 23 | } |
| gawas | 0:ccdea31d8eba | 24 | |
| gawas | 0:ccdea31d8eba | 25 | |
| gawas | 0:ccdea31d8eba | 26 | void create_sampling_port( |
| gawas | 0:ccdea31d8eba | 27 | /*in */ SAMPLING_PORT_NAME_TYPE SAMPLING_PORT_NAME, |
| gawas | 0:ccdea31d8eba | 28 | /*in */ MESSAGE_SIZE_TYPE MAX_MESSAGE_SIZE, |
| gawas | 0:ccdea31d8eba | 29 | /*in */ PORT_DIRECTION_TYPE PORT_DIRECTION, |
| gawas | 0:ccdea31d8eba | 30 | /*in */ SYSTEM_TIME_TYPE REFRESH_PERIOD, |
| gawas | 0:ccdea31d8eba | 31 | /*out*/ SAMPLING_PORT_ID_TYPE *SAMPLING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 32 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 33 | { |
| gawas | 0:ccdea31d8eba | 34 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 35 | port_t *ports = this_partition->ports; |
| gawas | 0:ccdea31d8eba | 36 | |
| gawas | 0:ccdea31d8eba | 37 | for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 38 | if (!strcmp(ports[n].portname, SAMPLING_PORT_NAME) && |
| gawas | 0:ccdea31d8eba | 39 | ports[n].s_buf.MAX_MESSAGE_SIZE == MAX_MESSAGE_SIZE && |
| gawas | 0:ccdea31d8eba | 40 | ports[n].s_buf.REFRESH_PERIOD == REFRESH_PERIOD && |
| gawas | 0:ccdea31d8eba | 41 | ports[n].s_buf.PORT_DIRECTION == PORT_DIRECTION) |
| gawas | 0:ccdea31d8eba | 42 | { |
| gawas | 0:ccdea31d8eba | 43 | ports[n].activated = true; |
| gawas | 0:ccdea31d8eba | 44 | *SAMPLING_PORT_ID = n; |
| gawas | 0:ccdea31d8eba | 45 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 46 | return; |
| gawas | 0:ccdea31d8eba | 47 | } |
| gawas | 0:ccdea31d8eba | 48 | } |
| gawas | 0:ccdea31d8eba | 49 | |
| gawas | 0:ccdea31d8eba | 50 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 51 | } |
| gawas | 0:ccdea31d8eba | 52 | |
| gawas | 0:ccdea31d8eba | 53 | |
| gawas | 0:ccdea31d8eba | 54 | void write_sampling_message( |
| gawas | 0:ccdea31d8eba | 55 | /*in */ SAMPLING_PORT_ID_TYPE SAMPLING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 56 | /*in */ MESSAGE_ADDR_TYPE MESSAGE_ADDR, /* by reference */ |
| gawas | 0:ccdea31d8eba | 57 | /*in */ MESSAGE_SIZE_TYPE LENGTH, |
| gawas | 0:ccdea31d8eba | 58 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 59 | { |
| gawas | 0:ccdea31d8eba | 60 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 61 | |
| gawas | 0:ccdea31d8eba | 62 | /* Return error if invalid SAMPLING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 63 | if (SAMPLING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 64 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 65 | return; |
| gawas | 0:ccdea31d8eba | 66 | } |
| gawas | 0:ccdea31d8eba | 67 | |
| gawas | 0:ccdea31d8eba | 68 | port_t *port = &this_partition->ports[SAMPLING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 69 | channel_t *chan = port->channel_link; |
| gawas | 0:ccdea31d8eba | 70 | |
| gawas | 0:ccdea31d8eba | 71 | /* If the message is never recieved by at least one, |
| gawas | 0:ccdea31d8eba | 72 | 'message_sent' will stay false. */ |
| gawas | 0:ccdea31d8eba | 73 | bool message_sent = false; |
| gawas | 0:ccdea31d8eba | 74 | |
| gawas | 0:ccdea31d8eba | 75 | port_t **ports = chan->ports; |
| gawas | 0:ccdea31d8eba | 76 | for (APEX_INTEGER i = 0; i < chan->nb_ports; i++) { |
| gawas | 0:ccdea31d8eba | 77 | port_t *port = ports[i]; |
| gawas | 0:ccdea31d8eba | 78 | |
| gawas | 0:ccdea31d8eba | 79 | if (port->is_queuing_port || |
| gawas | 0:ccdea31d8eba | 80 | !port->activated || |
| gawas | 0:ccdea31d8eba | 81 | !(port->s_buf.PORT_DIRECTION == DESTINATION)) |
| gawas | 0:ccdea31d8eba | 82 | { |
| gawas | 0:ccdea31d8eba | 83 | /* Not a valid destination */ |
| gawas | 0:ccdea31d8eba | 84 | continue; |
| gawas | 0:ccdea31d8eba | 85 | } |
| gawas | 0:ccdea31d8eba | 86 | |
| gawas | 0:ccdea31d8eba | 87 | if (LENGTH > port->s_buf.MAX_MESSAGE_SIZE) { |
| gawas | 0:ccdea31d8eba | 88 | /* Message too long. */ |
| gawas | 0:ccdea31d8eba | 89 | continue; |
| gawas | 0:ccdea31d8eba | 90 | } |
| gawas | 0:ccdea31d8eba | 91 | |
| gawas | 0:ccdea31d8eba | 92 | port->s_buf.MAX_MESSAGE_SIZE = LENGTH; |
| gawas | 0:ccdea31d8eba | 93 | for (int32_t i = 0; i < LENGTH; ++i) { |
| gawas | 0:ccdea31d8eba | 94 | port->s_buf.buffer[i] = ((uint8_t *)MESSAGE_ADDR)[i]; |
| gawas | 0:ccdea31d8eba | 95 | } |
| gawas | 0:ccdea31d8eba | 96 | |
| gawas | 0:ccdea31d8eba | 97 | message_sent = true; |
| gawas | 0:ccdea31d8eba | 98 | } |
| gawas | 0:ccdea31d8eba | 99 | |
| gawas | 0:ccdea31d8eba | 100 | if (message_sent) { |
| gawas | 0:ccdea31d8eba | 101 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 102 | } else { |
| gawas | 0:ccdea31d8eba | 103 | /* No destination ports */ |
| gawas | 0:ccdea31d8eba | 104 | *RETURN_CODE = NO_ACTION; |
| gawas | 0:ccdea31d8eba | 105 | } |
| gawas | 0:ccdea31d8eba | 106 | } |
| gawas | 0:ccdea31d8eba | 107 | |
| gawas | 0:ccdea31d8eba | 108 | |
| gawas | 0:ccdea31d8eba | 109 | void read_sampling_message( |
| gawas | 0:ccdea31d8eba | 110 | /*in */ SAMPLING_PORT_ID_TYPE SAMPLING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 111 | /*out*/ MESSAGE_ADDR_TYPE MESSAGE_ADDR, |
| gawas | 0:ccdea31d8eba | 112 | /*out*/ MESSAGE_SIZE_TYPE *LENGTH, |
| gawas | 0:ccdea31d8eba | 113 | /*out*/ VALIDITY_TYPE *VALIDITY, |
| gawas | 0:ccdea31d8eba | 114 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 115 | { |
| gawas | 0:ccdea31d8eba | 116 | (void)VALIDITY; |
| gawas | 0:ccdea31d8eba | 117 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 118 | |
| gawas | 0:ccdea31d8eba | 119 | /* Return error if invalid SAMPLING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 120 | if (SAMPLING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 121 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 122 | return; |
| gawas | 0:ccdea31d8eba | 123 | } |
| gawas | 0:ccdea31d8eba | 124 | |
| gawas | 0:ccdea31d8eba | 125 | port_t *port = &this_partition->ports[SAMPLING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 126 | *LENGTH = port->s_buf.MAX_MESSAGE_SIZE; |
| gawas | 0:ccdea31d8eba | 127 | for (int32_t i = 0; i < *LENGTH; i++) { |
| gawas | 0:ccdea31d8eba | 128 | MESSAGE_ADDR[i] = port->s_buf.buffer[i]; |
| gawas | 0:ccdea31d8eba | 129 | } |
| gawas | 0:ccdea31d8eba | 130 | |
| gawas | 0:ccdea31d8eba | 131 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 132 | } |
| gawas | 0:ccdea31d8eba | 133 | |
| gawas | 0:ccdea31d8eba | 134 | |
| gawas | 0:ccdea31d8eba | 135 | void get_sampling_port_id( |
| gawas | 0:ccdea31d8eba | 136 | /*in */ SAMPLING_PORT_NAME_TYPE SAMPLING_PORT_NAME, |
| gawas | 0:ccdea31d8eba | 137 | /*out*/ SAMPLING_PORT_ID_TYPE *SAMPLING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 138 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 139 | { |
| gawas | 0:ccdea31d8eba | 140 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 141 | port_t *ports = this_partition->ports; |
| gawas | 0:ccdea31d8eba | 142 | |
| gawas | 0:ccdea31d8eba | 143 | for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) { |
| gawas | 0:ccdea31d8eba | 144 | if (!strcmp(ports[n].portname, SAMPLING_PORT_NAME)) { |
| gawas | 0:ccdea31d8eba | 145 | *SAMPLING_PORT_ID = n; |
| gawas | 0:ccdea31d8eba | 146 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 147 | return; |
| gawas | 0:ccdea31d8eba | 148 | } |
| gawas | 0:ccdea31d8eba | 149 | } |
| gawas | 0:ccdea31d8eba | 150 | |
| gawas | 0:ccdea31d8eba | 151 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 152 | } |
| gawas | 0:ccdea31d8eba | 153 | |
| gawas | 0:ccdea31d8eba | 154 | |
| gawas | 0:ccdea31d8eba | 155 | void get_sampling_port_status( |
| gawas | 0:ccdea31d8eba | 156 | /*in */ SAMPLING_PORT_ID_TYPE SAMPLING_PORT_ID, |
| gawas | 0:ccdea31d8eba | 157 | /*out*/ SAMPLING_PORT_STATUS_TYPE *SAMPLING_PORT_STATUS, |
| gawas | 0:ccdea31d8eba | 158 | /*out*/ RETURN_CODE_TYPE *RETURN_CODE) |
| gawas | 0:ccdea31d8eba | 159 | { |
| gawas | 0:ccdea31d8eba | 160 | partition_t *this_partition = getActivePartition(); |
| gawas | 0:ccdea31d8eba | 161 | |
| gawas | 0:ccdea31d8eba | 162 | /* Return error if invalid SAMPLING_PORT_ID */ |
| gawas | 0:ccdea31d8eba | 163 | if (SAMPLING_PORT_ID >= this_partition->nb_ports) { |
| gawas | 0:ccdea31d8eba | 164 | *RETURN_CODE = INVALID_PARAM; |
| gawas | 0:ccdea31d8eba | 165 | return; |
| gawas | 0:ccdea31d8eba | 166 | } |
| gawas | 0:ccdea31d8eba | 167 | |
| gawas | 0:ccdea31d8eba | 168 | port_t port = this_partition->ports[SAMPLING_PORT_ID]; |
| gawas | 0:ccdea31d8eba | 169 | |
| gawas | 0:ccdea31d8eba | 170 | SAMPLING_PORT_STATUS->LAST_MSG_VALIDITY = port.s_buf.LAST_MSG_VALIDITY; |
| gawas | 0:ccdea31d8eba | 171 | SAMPLING_PORT_STATUS->REFRESH_PERIOD = port.s_buf.REFRESH_PERIOD; |
| gawas | 0:ccdea31d8eba | 172 | SAMPLING_PORT_STATUS->MAX_MESSAGE_SIZE = port.s_buf.MAX_MESSAGE_SIZE; |
| gawas | 0:ccdea31d8eba | 173 | SAMPLING_PORT_STATUS->PORT_DIRECTION = port.s_buf.PORT_DIRECTION; |
| gawas | 0:ccdea31d8eba | 174 | |
| gawas | 0:ccdea31d8eba | 175 | /* A procedure is needed for SAMPLING_PORT_STATUS->WAITING_PROCESSES */ |
| gawas | 0:ccdea31d8eba | 176 | |
| gawas | 0:ccdea31d8eba | 177 | *RETURN_CODE = NO_ERROR; |
| gawas | 0:ccdea31d8eba | 178 | } |
| gawas | 0:ccdea31d8eba | 179 |