gawaskar kanagaraj / Mbed 2 deprecated Nucleo_printf

Dependencies:   mbed

Committer:
gawas
Date:
Fri Aug 23 16:43:44 2019 +0000
Revision:
0:ccdea31d8eba
init funtion;

Who changed what in which revision?

UserRevisionLine numberNew 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_queuing.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_queuing_ports(void)
gawas 0:ccdea31d8eba 13 {
gawas 0:ccdea31d8eba 14 const size_t nb_partitions = sizeof(partitions) / sizeof(partition_t);
gawas 0:ccdea31d8eba 15 for (size_t i = 0; i < nb_partitions; ++i) {
gawas 0:ccdea31d8eba 16 port_t *ports = (port_t *)partitions[i].ports;
gawas 0:ccdea31d8eba 17
gawas 0:ccdea31d8eba 18 for (APEX_INTEGER n = 0; n < partitions[i].nb_ports; ++n) {
gawas 0:ccdea31d8eba 19 ports[n].activated = false;
gawas 0:ccdea31d8eba 20
gawas 0:ccdea31d8eba 21 if (ports[n].is_queuing_port) {
gawas 0:ccdea31d8eba 22 ports[n].q_buf.circ_buf.buffer = ports[n].q_buf.buffer;
gawas 0:ccdea31d8eba 23 ports[n].q_buf.NB_MESSAGE = 0;
gawas 0:ccdea31d8eba 24 } else {
gawas 0:ccdea31d8eba 25 /* TODO: Need to setup ports for the sampling ports as well. */
gawas 0:ccdea31d8eba 26 }
gawas 0:ccdea31d8eba 27 }
gawas 0:ccdea31d8eba 28 }
gawas 0:ccdea31d8eba 29
gawas 0:ccdea31d8eba 30 const size_t nb_channels = sizeof(connection_table) / sizeof(channel_t);
gawas 0:ccdea31d8eba 31 for (size_t i = 0; i < nb_channels; i++) {
gawas 0:ccdea31d8eba 32 channel_t *channel = &connection_table[i];
gawas 0:ccdea31d8eba 33 port_t **port_list = connection_table[i].ports;
gawas 0:ccdea31d8eba 34
gawas 0:ccdea31d8eba 35 for (APEX_INTEGER n = 0; n < channel->nb_ports; ++n) {
gawas 0:ccdea31d8eba 36 port_list[n]->channel_link = channel;
gawas 0:ccdea31d8eba 37 }
gawas 0:ccdea31d8eba 38 }
gawas 0:ccdea31d8eba 39 }
gawas 0:ccdea31d8eba 40
gawas 0:ccdea31d8eba 41
gawas 0:ccdea31d8eba 42 void create_queuing_port(
gawas 0:ccdea31d8eba 43 /*in */ QUEUING_PORT_NAME_TYPE QUEUING_PORT_NAME,
gawas 0:ccdea31d8eba 44 /*in */ MESSAGE_SIZE_TYPE MAX_MESSAGE_SIZE,
gawas 0:ccdea31d8eba 45 /*in */ MESSAGE_RANGE_TYPE MAX_NB_MESSAGE,
gawas 0:ccdea31d8eba 46 /*in */ PORT_DIRECTION_TYPE PORT_DIRECTION,
gawas 0:ccdea31d8eba 47 /*in */ QUEUING_DISCIPLINE_TYPE QUEUING_DISCIPLINE,
gawas 0:ccdea31d8eba 48 /*out*/ QUEUING_PORT_ID_TYPE *QUEUING_PORT_ID,
gawas 0:ccdea31d8eba 49 /*out*/ RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 50 {
gawas 0:ccdea31d8eba 51 (void) QUEUING_DISCIPLINE;
gawas 0:ccdea31d8eba 52
gawas 0:ccdea31d8eba 53 partition_t *this_partition = getActivePartition();
gawas 0:ccdea31d8eba 54 port_t *ports = this_partition->ports;
gawas 0:ccdea31d8eba 55
gawas 0:ccdea31d8eba 56 for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) {
gawas 0:ccdea31d8eba 57 if (!strcmp(ports[n].portname, QUEUING_PORT_NAME) &&
gawas 0:ccdea31d8eba 58 ports[n].q_buf.MAX_MESSAGE_SIZE == MAX_MESSAGE_SIZE &&
gawas 0:ccdea31d8eba 59 ports[n].q_buf.MAX_NB_MESSAGE == MAX_NB_MESSAGE &&
gawas 0:ccdea31d8eba 60 ports[n].q_buf.PORT_DIRECTION == PORT_DIRECTION)
gawas 0:ccdea31d8eba 61 {
gawas 0:ccdea31d8eba 62 ports[n].activated = true;
gawas 0:ccdea31d8eba 63 *QUEUING_PORT_ID = n;
gawas 0:ccdea31d8eba 64 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 65 return;
gawas 0:ccdea31d8eba 66 }
gawas 0:ccdea31d8eba 67 }
gawas 0:ccdea31d8eba 68
gawas 0:ccdea31d8eba 69 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 70 }
gawas 0:ccdea31d8eba 71
gawas 0:ccdea31d8eba 72
gawas 0:ccdea31d8eba 73 void send_queuing_message(
gawas 0:ccdea31d8eba 74 /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID,
gawas 0:ccdea31d8eba 75 /*in */ MESSAGE_ADDR_TYPE MESSAGE_ADDR, /* by reference */
gawas 0:ccdea31d8eba 76 /*in */ MESSAGE_SIZE_TYPE LENGTH,
gawas 0:ccdea31d8eba 77 /*in */ SYSTEM_TIME_TYPE TIME_OUT,
gawas 0:ccdea31d8eba 78 /*out*/ RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 79 {
gawas 0:ccdea31d8eba 80 (void)TIME_OUT; /* Unused parameter */
gawas 0:ccdea31d8eba 81
gawas 0:ccdea31d8eba 82 partition_t *this_partition = getActivePartition();
gawas 0:ccdea31d8eba 83
gawas 0:ccdea31d8eba 84 /* Return error if invalid QUEUING_PORT_ID */
gawas 0:ccdea31d8eba 85 if (QUEUING_PORT_ID >= this_partition->nb_ports) {
gawas 0:ccdea31d8eba 86 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 87 return;
gawas 0:ccdea31d8eba 88 }
gawas 0:ccdea31d8eba 89
gawas 0:ccdea31d8eba 90 port_t *port = &this_partition->ports[QUEUING_PORT_ID];
gawas 0:ccdea31d8eba 91 channel_t *chan = port->channel_link;
gawas 0:ccdea31d8eba 92
gawas 0:ccdea31d8eba 93 /* If the message is never recieved by at least one,
gawas 0:ccdea31d8eba 94 'message_sent' will stay false. */
gawas 0:ccdea31d8eba 95 bool message_sent = false;
gawas 0:ccdea31d8eba 96
gawas 0:ccdea31d8eba 97 port_t **ports = chan->ports;
gawas 0:ccdea31d8eba 98 for (APEX_INTEGER i = 0; i < chan->nb_ports; i++) {
gawas 0:ccdea31d8eba 99 port_t *port = ports[i];
gawas 0:ccdea31d8eba 100
gawas 0:ccdea31d8eba 101 if (!port->is_queuing_port ||
gawas 0:ccdea31d8eba 102 !port->activated ||
gawas 0:ccdea31d8eba 103 !(port->q_buf.PORT_DIRECTION == DESTINATION))
gawas 0:ccdea31d8eba 104 {
gawas 0:ccdea31d8eba 105 /* Not a valid destination */
gawas 0:ccdea31d8eba 106 continue;
gawas 0:ccdea31d8eba 107 }
gawas 0:ccdea31d8eba 108
gawas 0:ccdea31d8eba 109 if (port->q_buf.NB_MESSAGE >= port->q_buf.MAX_NB_MESSAGE) {
gawas 0:ccdea31d8eba 110 /* Too many messages in buffer. */
gawas 0:ccdea31d8eba 111 continue;
gawas 0:ccdea31d8eba 112 }
gawas 0:ccdea31d8eba 113
gawas 0:ccdea31d8eba 114 if (LENGTH > port->q_buf.MAX_MESSAGE_SIZE) {
gawas 0:ccdea31d8eba 115 /* Message too long. */
gawas 0:ccdea31d8eba 116 continue;
gawas 0:ccdea31d8eba 117 }
gawas 0:ccdea31d8eba 118
gawas 0:ccdea31d8eba 119 if (push_item(&port->q_buf.circ_buf, (uint8_t *)MESSAGE_ADDR, LENGTH)) {
gawas 0:ccdea31d8eba 120 /* We should get clear on the action to take
gawas 0:ccdea31d8eba 121 when destination buffer is full. */
gawas 0:ccdea31d8eba 122 continue;
gawas 0:ccdea31d8eba 123 }
gawas 0:ccdea31d8eba 124
gawas 0:ccdea31d8eba 125 ++port->q_buf.NB_MESSAGE;
gawas 0:ccdea31d8eba 126 message_sent = true;
gawas 0:ccdea31d8eba 127 }
gawas 0:ccdea31d8eba 128
gawas 0:ccdea31d8eba 129 if (message_sent) {
gawas 0:ccdea31d8eba 130 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 131 } else {
gawas 0:ccdea31d8eba 132 /* No destination ports */
gawas 0:ccdea31d8eba 133 *RETURN_CODE = NO_ACTION;
gawas 0:ccdea31d8eba 134 }
gawas 0:ccdea31d8eba 135 }
gawas 0:ccdea31d8eba 136
gawas 0:ccdea31d8eba 137
gawas 0:ccdea31d8eba 138 void recieve_queuing_message(
gawas 0:ccdea31d8eba 139 /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID,
gawas 0:ccdea31d8eba 140 /*in */ SYSTEM_TIME_TYPE TIME_OUT,
gawas 0:ccdea31d8eba 141 /*out*/ MESSAGE_ADDR_TYPE MESSAGE_ADDR,
gawas 0:ccdea31d8eba 142 /*out*/ MESSAGE_SIZE_TYPE *LENGTH,
gawas 0:ccdea31d8eba 143 /*out*/ RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 144 {
gawas 0:ccdea31d8eba 145 (void)TIME_OUT; /* Unused parameter */
gawas 0:ccdea31d8eba 146
gawas 0:ccdea31d8eba 147 partition_t *this_partition = getActivePartition();
gawas 0:ccdea31d8eba 148
gawas 0:ccdea31d8eba 149 /* Return error if invalid QUEUING_PORT_ID */
gawas 0:ccdea31d8eba 150 if (QUEUING_PORT_ID >= this_partition->nb_ports) {
gawas 0:ccdea31d8eba 151 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 152 return;
gawas 0:ccdea31d8eba 153 }
gawas 0:ccdea31d8eba 154
gawas 0:ccdea31d8eba 155 port_t *port = &this_partition->ports[QUEUING_PORT_ID];
gawas 0:ccdea31d8eba 156
gawas 0:ccdea31d8eba 157 if (pop_item(&port->q_buf.circ_buf, MESSAGE_ADDR, (size_t *)LENGTH)) {
gawas 0:ccdea31d8eba 158 *RETURN_CODE = NO_ACTION;
gawas 0:ccdea31d8eba 159 } else {
gawas 0:ccdea31d8eba 160 --port->q_buf.NB_MESSAGE;
gawas 0:ccdea31d8eba 161 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 162 }
gawas 0:ccdea31d8eba 163 }
gawas 0:ccdea31d8eba 164
gawas 0:ccdea31d8eba 165
gawas 0:ccdea31d8eba 166 void get_queuing_port_id(
gawas 0:ccdea31d8eba 167 /*in */ QUEUING_PORT_NAME_TYPE QUEUING_PORT_NAME,
gawas 0:ccdea31d8eba 168 /*out*/ QUEUING_PORT_ID_TYPE *QUEUING_PORT_ID,
gawas 0:ccdea31d8eba 169 /*out*/ RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 170 {
gawas 0:ccdea31d8eba 171 partition_t *this_partition = getActivePartition();
gawas 0:ccdea31d8eba 172 port_t *ports = this_partition->ports;
gawas 0:ccdea31d8eba 173
gawas 0:ccdea31d8eba 174 for (APEX_INTEGER n = 0; n < this_partition->nb_ports; ++n) {
gawas 0:ccdea31d8eba 175 if (!strcmp(ports[n].portname, QUEUING_PORT_NAME)) {
gawas 0:ccdea31d8eba 176 *QUEUING_PORT_ID = n;
gawas 0:ccdea31d8eba 177 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 178 return;
gawas 0:ccdea31d8eba 179 }
gawas 0:ccdea31d8eba 180 }
gawas 0:ccdea31d8eba 181
gawas 0:ccdea31d8eba 182 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 183 }
gawas 0:ccdea31d8eba 184
gawas 0:ccdea31d8eba 185
gawas 0:ccdea31d8eba 186 void get_queuing_port_status(
gawas 0:ccdea31d8eba 187 /*in */ QUEUING_PORT_ID_TYPE QUEUING_PORT_ID,
gawas 0:ccdea31d8eba 188 /*out*/ QUEUING_PORT_STATUS_TYPE *QUEUING_PORT_STATUS,
gawas 0:ccdea31d8eba 189 /*out*/ RETURN_CODE_TYPE *RETURN_CODE)
gawas 0:ccdea31d8eba 190 {
gawas 0:ccdea31d8eba 191 partition_t *this_partition = getActivePartition();
gawas 0:ccdea31d8eba 192
gawas 0:ccdea31d8eba 193 /* Return error if invalid QUEUING_PORT_ID */
gawas 0:ccdea31d8eba 194 if (QUEUING_PORT_ID >= this_partition->nb_ports) {
gawas 0:ccdea31d8eba 195 *RETURN_CODE = INVALID_PARAM;
gawas 0:ccdea31d8eba 196 return;
gawas 0:ccdea31d8eba 197 }
gawas 0:ccdea31d8eba 198
gawas 0:ccdea31d8eba 199 port_t port = this_partition->ports[QUEUING_PORT_ID];
gawas 0:ccdea31d8eba 200
gawas 0:ccdea31d8eba 201 QUEUING_PORT_STATUS->NB_MESSAGE = port.q_buf.NB_MESSAGE;
gawas 0:ccdea31d8eba 202 QUEUING_PORT_STATUS->MAX_NB_MESSAGE = port.q_buf.MAX_NB_MESSAGE;
gawas 0:ccdea31d8eba 203 QUEUING_PORT_STATUS->MAX_MESSAGE_SIZE = port.q_buf.MAX_MESSAGE_SIZE;
gawas 0:ccdea31d8eba 204 QUEUING_PORT_STATUS->PORT_DIRECTION = port.q_buf.PORT_DIRECTION;
gawas 0:ccdea31d8eba 205
gawas 0:ccdea31d8eba 206 /* A procedure is needed for QUEUING_PORT_STATUS->WAITING_PROCESSES */
gawas 0:ccdea31d8eba 207
gawas 0:ccdea31d8eba 208 *RETURN_CODE = NO_ERROR;
gawas 0:ccdea31d8eba 209 }
gawas 0:ccdea31d8eba 210