]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/liborte/RTPSHeader.c
updated email address - petr@smoliku.cz
[orte.git] / orte / liborte / RTPSHeader.c
index 1a035b3199590400506a6d662d57591c5001d4b4..48c6649e8453fee2c01d347ff747014cc3c28cd8 100644 (file)
@@ -2,9 +2,19 @@
  *  $Id: RTPSHeader.c,v 0.0.0.1  2003/08/21 
  *
  *  DEBUG:  section 40          Operations with header of RTPS
- *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
  *
- *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
+ *  -------------------------------------------------------------------  
+ *                                ORTE                                 
+ *                      Open Real-Time Ethernet                       
+ *                                                                    
+ *                      Copyright (C) 2001-2006                       
+ *  Department of Control Engineering FEE CTU Prague, Czech Republic  
+ *                      http://dce.felk.cvut.cz                       
+ *                      http://www.ocera.org                          
+ *                                                                    
+ *  Author:             Petr Smolik    petr@smoliku.cz             
+ *  Advisor:            Pavel Pisa                                   
+ *  Project Responsible: Zdenek Hanzalek                              
  *  --------------------------------------------------------------------
  *
  *  This program is free software; you can redistribute it and/or modify
  *  
  */ 
 
-#include "orte.h"
+#include "orte_all.h"
 
 /**********************************************************************************/
-int16_t
-RTPSHeaderCreate(uint8_t *msg,HostId hid,AppId aid) {
-  msg[0]='R';msg[1]='T'; msg[2]='P'; msg[3]='S';
-  //Protocol version
-  PROTOCOL_VERSION_1_0((*((ProtocolVersion*)(msg+4))));
+int
+RTPSHeaderCreate(CDR_Codec *cdrCodec,HostId hid,AppId aid) {
+  CDR_Endianness  data_endian;
+  ProtocolVersion pv;
+  VendorId vid;
+
+  CDR_put_octet(cdrCodec,'R');
+  CDR_put_octet(cdrCodec,'T');
+  CDR_put_octet(cdrCodec,'P');
+  CDR_put_octet(cdrCodec,'S');
+
+  /* Protocol version */
+  PROTOCOL_VERSION_1_0(pv);
+  CDR_put_octet(cdrCodec,pv.major);
+  CDR_put_octet(cdrCodec,pv.minor);
+
   //Vendor id
-  VENDOR_ID_UNKNOWN((*((VendorId*)(msg+6))));
-  //HID
-  conv_u32(&hid,0);
-  *((HostId*)(msg+8))=hid;
-  //AID
-  conv_u32(&aid,0);
-  *((AppId*)(msg+12))=aid;
+  VENDOR_ID_UNKNOWN(vid);
+  CDR_put_octet(cdrCodec,vid.major);
+  CDR_put_octet(cdrCodec,vid.minor);
+
+  /* next data are sent in big endianing */
+  data_endian=cdrCodec->data_endian;
+  cdrCodec->data_endian=FLAG_BIG_ENDIAN;
+
+  /* Host Id */
+  CDR_put_ulong(cdrCodec,hid);
+
+  /* App Id */
+  CDR_put_ulong(cdrCodec,aid);
+
+  cdrCodec->data_endian=data_endian;
+
   return 16;
 } 
 /**********************************************************************************/
-int16_t
-RTPSHeaderCheck(uint8_t *msg,int32_t len,MessageInterpret *mi) {
-  if (len<16) return -1;                          /* message is too small */
-  if (msg[0]!='R') return -2;                     /* header is invalid */
-  if (msg[1]!='T') return -2;                     /* header is invalid */
-  if (msg[2]!='P') return -2;                     /* header is invalid */
-  if (msg[3]!='S') return -2;                     /* header is invalid */
-  mi->sourceVersion=*((ProtocolVersion*)(msg+4)); /* ProtocolVersion */
-  mi->sourceVendorId=*((VendorId*)(msg+6));       /* Vendor Id */
-  mi->sourceHostId=*((HostId*)(msg+8));           /* Host Id */
-  conv_u32(&mi->sourceHostId,0);
-  mi->sourceAppId=*((AppId*)(msg+12));            /* App Id */
-  conv_u32(&mi->sourceAppId,0);
-  mi->haveTimestamp=ORTE_FALSE;                   /* false */
+int
+RTPSHeaderCheck(CDR_Codec *cdrCodec,int32_t len,MessageInterpret *mi) {
+  CDR_Endianness  data_endian;
+  CORBA_octet c;
+
+  if (len<16) return -1;                            /* message is too small */
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&c);
+  if (c!='R') return -2;                            /* header is invalid */
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&c);
+  if (c!='T') return -2;                            
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&c);
+  if (c!='P') return -2;                            
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&c);
+  if (c!='S') return -2;                            
+
+  /* Protocol Version */
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&mi->sourceVersion.major);
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&mi->sourceVersion.minor);
+
+   /* Vendor Id */
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&mi->sourceVendorId.major);
+  CDR_get_octet(cdrCodec, (CORBA_octet *)&mi->sourceVendorId.minor);
+
+  /* next data are sent in big endianing */
+  data_endian=cdrCodec->data_endian;
+  cdrCodec->data_endian=FLAG_BIG_ENDIAN;
+
+  /* Host Id */
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&mi->sourceHostId);
+
+  /* App Id */
+  CDR_get_ulong(cdrCodec, (CORBA_unsigned_long *)&mi->sourceAppId);
+
+  cdrCodec->data_endian=data_endian;
+
+  mi->haveTimestamp=ORTE_FALSE;                     /* false */
   return 0;
 }