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_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