Advertisement
TheGhastModding

FBT client reference impl.

Jan 12th, 2021
767
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.53 KB | None | 0 0
  1. // --- FBTClient.java --- //
  2. package tholin.motionTracker.trackerTester.driver;
  3.  
  4. import java.io.*;
  5. import java.net.*;
  6. import java.nio.ByteBuffer;
  7. import java.util.*;
  8.  
  9. import org.joml.Quaternionf;
  10.  
  11. public class FBTClient implements Runnable {
  12.    
  13.     public static final int STATUS_OK                      =  0;
  14.     public static final int CONNECTION_REFUSED_SERVER_FULL =  1;
  15.     public static final int INVALID_SERVER_RESPONSE        = -1;
  16.     public static final int RESPONSE_TIMEOUT               = -2;
  17.    
  18.     private String IP;
  19.     private int port;
  20.     private Socket socket;
  21.     private Thread t;
  22.     private List<FBTEventHandler> eventHandlers = new ArrayList<FBTEventHandler>();
  23.    
  24.     public FBTClient(String IP) throws UnknownHostException, IOException {
  25.         this(IP, 8086);
  26.     }
  27.    
  28.     public FBTClient(String IP, int port) throws UnknownHostException, IOException {
  29.         this.IP = IP;
  30.         this.port = port;
  31.     }
  32.    
  33.     @Override
  34.     public void run() {
  35.         try {
  36.             ByteBuffer buff = ByteBuffer.allocate(16);
  37.             InputStream in = socket.getInputStream();
  38.             while(true) {
  39.                 if(in.available() > 0) {
  40.                     int ID = in.read() & 0xFF;
  41.                     switch(ID) {
  42.                     case 0x07:
  43.                         for(FBTEventHandler handler:eventHandlers) handler.pingReturn();
  44.                         break;
  45.                     case 0x05:
  46.                         int disconnectCause = in.read() & 0xFF;
  47.                         for(FBTEventHandler handler:eventHandlers) handler.clientDisconnect(disconnectCause);
  48.                         socket.close();
  49.                         return;
  50.                     case 0x02:
  51.                         int crashCause = in.read() & 0xFF;
  52.                         for(FBTEventHandler handler:eventHandlers) handler.serverCrash(crashCause);
  53.                         socket.close();
  54.                         return;
  55.                     case 0x09:
  56.                         int sensorID = in.read() & 0xFF;
  57.                         int sensorError = in.read() & 0xFF;
  58.                         for(FBTEventHandler handler:eventHandlers) handler.sensorFailure(sensorID, sensorError);
  59.                         return;
  60.                     case 0x0A:
  61.                         sensorID = in.read() & 0xFF;
  62.                         for(int i = 0; i < 16; i++) {
  63.                             buff.put((byte)in.read());
  64.                         }
  65.                         buff.flip();
  66.                         Quaternionf quat = new Quaternionf();
  67.                         quat.w = buff.getFloat();
  68.                         quat.x = buff.getFloat();
  69.                         quat.y = buff.getFloat();
  70.                         quat.z = buff.getFloat();
  71.                         buff.rewind();
  72.                         for(FBTEventHandler handler:eventHandlers) handler.sensorData(sensorID, quat);
  73.                         break;
  74.                     default:    //TODO: throw exception on invalid packet ID
  75.                         break;
  76.                     }
  77.                 }
  78.                 Thread.sleep(2);
  79.             }
  80.         }catch(Exception e) {
  81.             e.printStackTrace();
  82.         }
  83.     }
  84.    
  85.     public void addEventHandler(FBTEventHandler handler) {
  86.         this.eventHandlers.add(handler);
  87.     }
  88.    
  89.     public int openConnection() throws Exception {
  90.         if(socket != null && socket.isConnected()) {
  91.             throw new Exception("Connection already established.");
  92.         }
  93.         socket = new Socket(IP, port);
  94.         t = new Thread(this);
  95.         t.start();
  96.         InputStream in = socket.getInputStream();
  97.         long startTime = System.currentTimeMillis();
  98.         while(System.currentTimeMillis() - startTime < 10000) {
  99.             if(in.available() > 0) {
  100.                 int ID = in.read() & 0xFF;
  101.                 if(ID == 0x03) {
  102.                     return STATUS_OK;
  103.                 }else if(ID == 0x04) {
  104.                     int reason = in.read() & 0xFF;
  105.                     return reason;
  106.                 }else {
  107.                     return INVALID_SERVER_RESPONSE;
  108.                 }
  109.             }
  110.         }
  111.         return RESPONSE_TIMEOUT;
  112.     }
  113.    
  114. }
  115.  
  116. // --- FBTEventHandler --- //
  117. package tholin.motionTracker.trackerTester.driver;
  118.  
  119. import org.joml.Quaternionf;
  120.  
  121. public interface FBTEventHandler {
  122.    
  123.     void pingReturn();
  124.    
  125.     void clientDisconnect(int cause);
  126.    
  127.     void serverCrash(int cause);
  128.    
  129.     void sensorFailure(int sensorID, int error);
  130.    
  131.     void sensorData(int sensorID, Quaternionf quat);
  132. }
  133.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement