17 #include "EtherMACFullDuplex.h"
32 namespace TTEthernetModel {
48 if(msg->arrivedOn(
"schedulerIn")){
49 Task *task = (
Task*)msg->par(
"task").pointerValue();
55 if(msg->arrivedOn(
"syncIn")){
57 if(notification->getKind()==
SYNC){
67 ev <<
"TTEAPIApplicationBase::startApplication() not implemented" << endl;
80 event->addPar(
"task").setPointerValue(task);
82 event->setAction_time(actionTime);
83 event->setDestinationGate(gate(
"schedulerIn"));
89 tte_buffer_t *
const buf){
90 Enter_Method_Silent();
91 std::map<uint16, std::list<Buffer *> >::iterator bufferList =
buffers.find(ct_id);
92 if (bufferList !=
buffers.end())
95 std::list<Buffer*>::iterator buffer = bufferList->second.begin();
98 buf->direction= TTE_DIR_OUTPUT;
99 if(dynamic_cast<TTBuffer*>(*buffer) != NULL){
100 buf->traffic_type= TTE_TT_TRAFFIC;
102 else if(dynamic_cast<RCBuffer*>(*buffer) != NULL){
103 buf->traffic_type= TTE_CT_TRAFFIC;
106 buf->traffic_type= TTE_BG_TRAFFIC;
126 tte_buffer_t *
const buf){
127 Enter_Method_Silent();
128 Buffer *buffer =
dynamic_cast<Buffer*
>(getParentModule()->getSubmodule(
"bgOut"));
131 buf->direction= TTE_DIR_OUTPUT;
132 buf->traffic_type= TTE_BG_TRAFFIC;
145 tte_buffer_t *
const buf){
146 Enter_Method_Silent();
147 Buffer *buffer =
dynamic_cast<Buffer*
>(getParentModule()->getSubmodule(
"bgIn"));
150 buf->direction= TTE_DIR_INPUT;
151 buf->traffic_type= TTE_BG_TRAFFIC;
164 const uint16_t ct_id,
165 tte_buffer_t *
const buf){
166 Enter_Method_Silent();
167 std::map<uint16, std::list<Buffer *> >::iterator bufferList =
buffers.find(ct_id);
168 if (bufferList !=
buffers.end())
171 std::list<Buffer*>::iterator buffer = bufferList->second.begin();
174 buf->direction= TTE_DIR_INPUT;
175 if(dynamic_cast<TTBuffer*>(*buffer) != NULL){
176 buf->traffic_type= TTE_TT_TRAFFIC;
178 else if(dynamic_cast<RCBuffer*>(*buffer) != NULL){
179 buf->traffic_type= TTE_CT_TRAFFIC;
182 buf->traffic_type= TTE_BG_TRAFFIC;
202 const tte_var_id_t var_id,
203 const uint32_t var_size,
205 Enter_Method_Silent();
207 case TTE_VAR_LINK_STATUS:{
208 cModule *phy = getParentModule()->getSubmodule(
"phy", 0);
210 for(
int i=0;i<phy->getVectorSize();i++){
211 EtherMACFullDuplex *mac = (EtherMACFullDuplex*)getParentModule()->getSubmodule(
"phy", i)->getSubmodule(
"mac");
212 if(mac->gate(
"phys")->isConnected())
213 *((uint8_t*)value) = *((uint8_t*)value)<<1 | 1;
215 *((uint8_t*)value) = *((uint8_t*)value)<<1;
219 *((uint8_t*)value) = 0;
224 case TTE_VAR_CTRL_STATUS:{
225 *((uint32_t*)value) = TTE_STAT_CONFIGURED | TTE_STAT_RUNNING;
227 *((uint32_t*)value) |= TTE_STAT_SYNCHRONIZED;
231 case TTE_VAR_CTRL_COUNT:{
232 *((uint8_t*)value) = 1;
235 case TTE_VAR_CHANNEL_COUNT:{
236 cModule *phy = getParentModule()->getSubmodule(
"phy", 0);
238 *((uint8_t*)value) = phy->getVectorSize();
241 *((uint8_t*)value) = 0;
246 case TTE_VAR_TIME_RESOLUTION:{
247 cModule *scheduler = getParentModule()->getSubmodule(
"tteScheduler", -1);
249 *((tte_time_t*)value) = scheduler->par(
"tick").doubleValue();
252 *((tte_time_t*)value) = 0;
257 case TTE_VAR_API_VERSION:{
261 case TTE_VAR_THREAD_SAFE:{
263 *((uint8_t*)value) = 0;
266 case TTE_VAR_MAC_ADDRESS:{
267 uint8_t *valueArr= (uint8_t *)value;
268 cModule *phy = getParentModule()->getSubmodule(
"phy", 0);
270 EtherMACFullDuplex *mac = (EtherMACFullDuplex*)phy->getSubmodule(
"mac");
271 MACAddress macAddress = mac->getMACAddress();
273 valueArr[5] = macAddress.getAddressByte(0);
274 valueArr[4] = macAddress.getAddressByte(1);
275 valueArr[3] = macAddress.getAddressByte(2);
276 valueArr[2] = macAddress.getAddressByte(3);
277 valueArr[1] = macAddress.getAddressByte(4);
278 valueArr[0] = macAddress.getAddressByte(5);
281 valueArr[0] = valueArr[1] = valueArr[2] = valueArr[3] = valueArr[4] = valueArr[5] = 0;
287 return ETT_NOTSUPPORTED;
293 tte_frame_t *
const frame){
294 Enter_Method_Silent();
299 if(buf->traffic_type==TTE_BG_TRAFFIC){
300 priv->
frame =
new EtherFrame(
"BG-Traffic Ethernet Frame", IEEE802CTRL_DATA);
303 std::stringstream frameNameStream;
304 frameNameStream <<
"CT-ID: " << buf->ct_id;
305 std::string frameName = frameNameStream.str();
306 priv->
frame =
new CTFrame(frameName.c_str(), IEEE802CTRL_DATA);
308 priv->
frame->setByteLength(ETHER_MAC_FRAME_BYTES);
311 dest.setAddressByte(5, frame->eth_hdr.dst_mac[0]);
312 dest.setAddressByte(4, frame->eth_hdr.dst_mac[1]);
313 dest.setAddressByte(3, frame->eth_hdr.dst_mac[2]);
314 dest.setAddressByte(2, frame->eth_hdr.dst_mac[3]);
315 dest.setAddressByte(1, frame->eth_hdr.dst_mac[4]);
316 dest.setAddressByte(0, frame->eth_hdr.dst_mac[5]);
317 priv->
frame->setDest(dest);
319 src.setAddressByte(5, frame->eth_hdr.src_mac[0]);
320 src.setAddressByte(4, frame->eth_hdr.src_mac[1]);
321 src.setAddressByte(3, frame->eth_hdr.src_mac[2]);
322 src.setAddressByte(2, frame->eth_hdr.src_mac[3]);
323 src.setAddressByte(1, frame->eth_hdr.src_mac[4]);
324 src.setAddressByte(0, frame->eth_hdr.src_mac[5]);
325 priv->
frame->setSrc(src);
328 payload->setByteLength(frame->length);
330 priv->
frame->encapsulate(payload);
332 frame->data = (uint8_t*)malloc(frame->length);
335 priv->
data = frame->data;
341 tte_frame_t *
const frame,
342 tte_buf_status_t *
const status){
343 Enter_Method_Silent();
349 if(buf->traffic_type==TTE_CT_TRAFFIC){
350 frame->ct_id =
dynamic_cast<CTFrame*
>(msg)->getCtID();
352 frame->length = payload->getByteLength();
353 frame->data = (uint8_t*)malloc(payload->getByteLength());
354 priv->
data = frame->data;
355 MACAddress dest= msg->getDest();
356 frame->eth_hdr.dst_mac[0] = dest.getAddressByte(5);
357 frame->eth_hdr.dst_mac[1] = dest.getAddressByte(4);
358 frame->eth_hdr.dst_mac[2] = dest.getAddressByte(3);
359 frame->eth_hdr.dst_mac[3] = dest.getAddressByte(2);
360 frame->eth_hdr.dst_mac[4] = dest.getAddressByte(1);
361 frame->eth_hdr.dst_mac[5] = dest.getAddressByte(0);
362 MACAddress src= msg->getSrc();
363 frame->eth_hdr.src_mac[0] = src.getAddressByte(5);
364 frame->eth_hdr.src_mac[1] = src.getAddressByte(4);
365 frame->eth_hdr.src_mac[2] = src.getAddressByte(3);
366 frame->eth_hdr.src_mac[3] = src.getAddressByte(2);
367 frame->eth_hdr.src_mac[4] = src.getAddressByte(1);
368 frame->eth_hdr.src_mac[5] = src.getAddressByte(0);
371 frame->data[i] = payload->
getData(i);
381 Enter_Method_Silent();
385 for(
unsigned int i=0;i<payload->getDataArraySize();i++){
386 payload->setData(i, ((
unsigned char *)priv->
data)[i]);
390 if(priv->
buffer->gate(
"in"))
391 if(priv->
buffer->gate(
"in")->getPathStartGate())
392 if((cModule *)priv->
buffer->gate(
"in")->getPathStartGate()->getOwner())
393 if(((cModule *)priv->
buffer->gate(
"in")->getPathStartGate()->getOwner())->gate(
"in")){
394 sendDirect(priv->
frame, ((cModule *)priv->
buffer->gate(
"in")->getPathStartGate()->getOwner())->gate(
"in"));
409 Enter_Method_Silent();
424 const tte_buf_var_id_t var_id,
425 const uint32_t var_size,
426 const void *
const value){
427 Enter_Method_Silent();
430 case TTE_BUFVAR_RECEIVE_CB:{
439 case TTE_BUFVAR_TRANSMIT_CB:{
448 case TTE_BUFVAR_CB_ARG:{
463 return ETT_NOTSUPPORTED;
469 const tte_buf_var_id_t var_id,
470 const uint32_t var_size,
472 Enter_Method_Silent();
475 case TTE_BUFVAR_RECEIVE_CB:{
481 memcpy(value, &func,
sizeof(
void (*)(
void *)));
484 case TTE_BUFVAR_TRANSMIT_CB:{
490 memcpy(value, &func,
sizeof(
void (*)(
void *)));
493 case TTE_BUFVAR_CB_ARG:{
501 memcpy(value, &arg,
sizeof(
void *));
505 memcpy(value, &arg,
sizeof(
void *));
510 return ETT_NOTSUPPORTED;
516 return ETT_NOTSUPPORTED;
521 return ETT_NOTSUPPORTED;
524 extern "C" int32_t
tte_stop(
const uint8_t ctrl_id){
525 return ETT_NOTSUPPORTED;
530 return ETT_NOTSUPPORTED;
534 const tte_conf_t *
const conf){
535 return ETT_NOTSUPPORTED;
539 const tte_var_id_t var_id,
540 const uint32_t var_size,
541 const void *
const value){
542 return ETT_NOTSUPPORTED;
546 const tte_var_id_t var_id,
547 const uint32_t var_size,
551 return app->
tte_get_var(ctrl_id, var_id, var_size, value);
556 const uint16_t ct_id,
557 tte_buffer_t *
const buf){
565 const uint16_t ct_id,
566 tte_buffer_t *
const buf){
574 const uint8_t channel,
575 tte_buffer_t *
const buf){
583 const uint8_t channel,
584 tte_buffer_t *
const buf){
592 tte_frame_t *
const frame){
594 return ETT_NOTSUPPORTED;
598 tte_frame_t *
const frame,
599 tte_buf_status_t *
const status){
601 return ETT_NOTSUPPORTED;
605 tte_frame_t *
const frame,
606 tte_buf_status_t *
const status){
621 tte_frame_t *
const frame){
636 const tte_buf_var_id_t var_id,
637 const uint32_t var_size,
646 const tte_buf_var_id_t var_id,
647 const uint32_t var_size,
648 const void *
const value){
656 return ETT_NOTSUPPORTED;
660 return ETT_NOTSUPPORTED;
664 return ETT_NOTSUPPORTED;