]> rtime.felk.cvut.cz Git - orte.git/blob - orte/java/src/org/ocera/orte/types/RecvInfo.java
2baddba6d64ccc23b88dde5d6c96f1bedece8fe0
[orte.git] / orte / java / src / org / ocera / orte / types / RecvInfo.java
1 /* RecvInfo.java */
2
3 /**
4  * Class RecvInfo.
5  *
6  * @author Lukas Pokorny (lukas_pokorny@centrum.cz)
7  * @author CTU FEE Prague - Department of Control Engineering (dce.felk.cvut.cz)
8  * @author Project ORTE - OCERA Real Time Ethernet (www.ocera.org)
9  * @author dedication to Kj
10  * @version 0.1
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  * GNU General Public License for more details.
21  *
22  */
23
24 package org.ocera.orte.types;
25
26 import java.nio.ByteBuffer;
27 import java.nio.ByteOrder;
28
29 public class RecvInfo
30 {
31
32   private ByteBuffer      info_buffer;
33   
34   /*      Helper buffer structure (all 32-bit integers):
35    *       [0]  sizeof(ORTERecvInfo),
36    *       [1]  sizeof(ORTERecvStatus),
37    *       [2]  sizeof(char*),
38    *       [3]  offsetof(ORTERecvInfo,status),
39    *       [4]  offsetof(ORTERecvInfo,topic),
40    *       [5]  offsetof(ORTERecvInfo,type),
41    *       [6]  offsetof(ORTERecvInfo,senderGUID),
42    *       [7]  offsetof(ORTERecvInfo,localTimeReceived),
43    *       [8]  offsetof(ORTERecvInfo,remoteTimePublished),
44    *       [9]  offsetof(ORTERecvInfo,sn),
45    *     [10]  offsetof(GUID_RTPS,hid),
46    *     [11]  offsetof(GUID_RTPS,aid),
47    *     [12]  offsetof(GUID_RTPS,oid),
48    *     [13]  offsetof(NtpTime,seconds),
49    *     [14]  offsetof(NtpTime,fraction),
50    *     [15]  offsetof(SequenceNumber,high),
51    *     [16]  offsetof(SequenceNumber,low)
52    */
53   private ByteBuffer      helper_buffer;
54
55   public RecvInfo()
56   {
57         //System.out.println(":j: instance of RecvInfo created..");
58     this.helper_buffer = ByteBuffer.allocateDirect(17*Integer.SIZE/8);
59     this.helper_buffer.order(ByteOrder.nativeOrder());
60     this.c_helper(helper_buffer);
61
62     this.info_buffer = ByteBuffer.allocateDirect(helper_buffer.getInt(0));
63     this.info_buffer.order(ByteOrder.nativeOrder());
64   }
65
66
67   public byte getRecvStatus()
68   {
69     byte ret_val;
70     
71     switch(helper_buffer.getInt(Integer.SIZE/8)) {
72       case 4:
73         ret_val = (byte) info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*3/8));
74         break;
75       case 1:
76         ret_val = info_buffer.get(helper_buffer.getInt(Integer.SIZE*3/8));
77         break;
78       case 2:
79         ret_val = (byte) info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*3/8));
80         break;
81       case 8:
82         ret_val = (byte) info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*3/8));
83         break;
84     default:
85         System.out.println("j: ORTERecvStatus of unknown size!");
86         return -1;
87     }
88
89     return ret_val;
90   }
91
92   public String getTopic()
93   {
94     long topic_pointer;
95     
96     switch(helper_buffer.getInt(Integer.SIZE*2/8)) {
97       case 4:
98         topic_pointer = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*4/8));
99         break;
100       case 8:
101         topic_pointer = info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*4/8));
102         break;
103       case 1:
104         topic_pointer = info_buffer.get(helper_buffer.getInt(Integer.SIZE*4/8));
105         break;
106       case 2:
107         topic_pointer = info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*4/8));
108         break;
109       default:
110         return null;
111     }
112     
113     return get_string(topic_pointer);
114   }
115
116   public String getTypeName()
117   {
118     long type_pointer;
119     
120     switch(helper_buffer.getInt(Integer.SIZE*2/8)) {
121       case 4:
122         type_pointer = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*5/8));
123         break;
124       case 8:
125         type_pointer = info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*5/8));
126         break;
127       case 1:
128         type_pointer = info_buffer.get(helper_buffer.getInt(Integer.SIZE*5/8));
129         break;
130       case 2:
131         type_pointer = info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*5/8));
132         break;
133       default:
134         return null;
135     }
136     
137     return get_string(type_pointer);
138   }
139
140   public GUID_RTPS getSenderGuid()
141   {
142     long hostId   = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*10/8)) & 0xffffffffL;
143     long appId    = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*11/8)) & 0xffffffffL;
144     long objectId = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*12/8)) & 0xffffffffL;
145     
146     
147     return new GUID_RTPS(hostId, appId, objectId);
148   }
149
150   public NtpTime getLocalTimeRecv()
151   {
152     int  seconds  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*13/8));
153     long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL;
154
155     return new NtpTime(seconds, fraction);
156   }
157
158   public NtpTime getRemoteTimePub()
159   {
160     int  seconds  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*13/8));
161     long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL;
162
163     return new NtpTime(seconds, fraction);
164   }
165
166   public SequenceNumber getSeqNumber()
167   {
168     int high = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*15/8));
169     long low  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*16/8));
170
171     return new SequenceNumber(high, low);
172   }
173
174   /** only for test purposes */
175   public void print()
176   {
177           System.out.println(":j: RecvInfo:");
178           System.out.println(":j:    recvStatus: " + this.getRecvStatus());
179           System.out.println(":j:         topic: " + this.getTopic()); 
180           System.out.println(":j:          type: " + this.getTypeName()); 
181       System.out.println(":j:    senderGuid: " + this.getSenderGuid()); 
182       System.out.println(":j: localTimerecv: " + this.getLocalTimeRecv()); 
183       System.out.println(":j: remoteTimePub: " + this.getRemoteTimePub()); 
184     System.out.println(":j:         seqNr: " + this.getSeqNumber().getDecimal());       
185   }
186   
187   public ByteBuffer getBuffer()
188   {
189     return this.info_buffer;
190   }
191   
192   /* NATIVE FUNCTIONS */
193   
194   private native String get_string(long string_pointer);
195   private native void c_helper(ByteBuffer buffer);
196   
197 }