]> rtime.felk.cvut.cz Git - orte.git/blob - orte/java/src/org/ocera/orte/types/RecvInfo.java
JORTE: make helper buffer static
[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   static ByteBuffer      helper_buffer;
54
55   static {
56     helper_buffer = ByteBuffer.allocateDirect(17*Integer.SIZE/8);
57     helper_buffer.order(ByteOrder.nativeOrder());
58     c_helper(helper_buffer);
59   }
60
61   public RecvInfo()
62   {
63         //System.out.println(":j: instance of RecvInfo created..");
64     this.info_buffer = ByteBuffer.allocateDirect(helper_buffer.getInt(0));
65     this.info_buffer.order(ByteOrder.nativeOrder());
66   }
67
68
69   public byte getRecvStatus()
70   {
71     byte ret_val;
72     
73     switch(helper_buffer.getInt(Integer.SIZE/8)) {
74       case 4:
75         ret_val = (byte) info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*3/8));
76         break;
77       case 1:
78         ret_val = info_buffer.get(helper_buffer.getInt(Integer.SIZE*3/8));
79         break;
80       case 2:
81         ret_val = (byte) info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*3/8));
82         break;
83       case 8:
84         ret_val = (byte) info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*3/8));
85         break;
86     default:
87         System.out.println("j: ORTERecvStatus of unknown size!");
88         return -1;
89     }
90
91     return ret_val;
92   }
93
94   public String getTopic()
95   {
96     long topic_pointer;
97     
98     switch(helper_buffer.getInt(Integer.SIZE*2/8)) {
99       case 4:
100         topic_pointer = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*4/8));
101         break;
102       case 8:
103         topic_pointer = info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*4/8));
104         break;
105       case 1:
106         topic_pointer = info_buffer.get(helper_buffer.getInt(Integer.SIZE*4/8));
107         break;
108       case 2:
109         topic_pointer = info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*4/8));
110         break;
111       default:
112         return null;
113     }
114     
115     return get_string(topic_pointer);
116   }
117
118   public String getTypeName()
119   {
120     long type_pointer;
121     
122     switch(helper_buffer.getInt(Integer.SIZE*2/8)) {
123       case 4:
124         type_pointer = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*5/8));
125         break;
126       case 8:
127         type_pointer = info_buffer.getLong(helper_buffer.getInt(Integer.SIZE*5/8));
128         break;
129       case 1:
130         type_pointer = info_buffer.get(helper_buffer.getInt(Integer.SIZE*5/8));
131         break;
132       case 2:
133         type_pointer = info_buffer.getShort(helper_buffer.getInt(Integer.SIZE*5/8));
134         break;
135       default:
136         return null;
137     }
138     
139     return get_string(type_pointer);
140   }
141
142   public GUID_RTPS getSenderGuid()
143   {
144     long hostId   = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*10/8)) & 0xffffffffL;
145     long appId    = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*11/8)) & 0xffffffffL;
146     long objectId = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*6/8)+helper_buffer.getInt(Integer.SIZE*12/8)) & 0xffffffffL;
147     
148     
149     return new GUID_RTPS(hostId, appId, objectId);
150   }
151
152   public NtpTime getLocalTimeRecv()
153   {
154     int  seconds  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*13/8));
155     long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*7/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL;
156
157     return new NtpTime(seconds, fraction);
158   }
159
160   public NtpTime getRemoteTimePub()
161   {
162     int  seconds  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*13/8));
163     long fraction = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*8/8)+helper_buffer.getInt(Integer.SIZE*14/8)) & 0xffffffffL;
164
165     return new NtpTime(seconds, fraction);
166   }
167
168   public SequenceNumber getSeqNumber()
169   {
170     int high = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*15/8));
171     long low  = info_buffer.getInt(helper_buffer.getInt(Integer.SIZE*9/8)+helper_buffer.getInt(Integer.SIZE*16/8));
172
173     return new SequenceNumber(high, low);
174   }
175
176   /** only for test purposes */
177   public void print()
178   {
179           System.out.println(":j: RecvInfo:");
180           System.out.println(":j:    recvStatus: " + this.getRecvStatus());
181           System.out.println(":j:         topic: " + this.getTopic()); 
182           System.out.println(":j:          type: " + this.getTypeName()); 
183       System.out.println(":j:    senderGuid: " + this.getSenderGuid()); 
184       System.out.println(":j: localTimerecv: " + this.getLocalTimeRecv()); 
185       System.out.println(":j: remoteTimePub: " + this.getRemoteTimePub()); 
186     System.out.println(":j:         seqNr: " + this.getSeqNumber().getDecimal());       
187   }
188   
189   public ByteBuffer getBuffer()
190   {
191     return this.info_buffer;
192   }
193   
194   /* NATIVE FUNCTIONS */
195   
196   static native String get_string(long string_pointer);
197   static native void c_helper(ByteBuffer buffer);
198   
199 }