@Override
 public SensorData toProtoSensor() {
   SensorData.Builder sdb = SensorData.newBuilder();
   sdb.setRecordTime(getTimestamp());
   sdb.addValueFloat(getGyrX());
   sdb.addValueFloat(getGyrY());
   sdb.addValueFloat(getGyrZ());
   return sdb.build();
 }
 public SensorDescGyroscope(SensorData sensorData) {
   super(sensorData);
   this.gyrX = sensorData.getValueFloat(0);
   this.gyrY = sensorData.getValueFloat(1);
   this.gyrZ = sensorData.getValueFloat(2);
 }
  @Override
  public void run() {
    InputStream is;
    try {
      is = socket.getInputStream();
      boolean connected = true;
      while (connected) {
        connected &= !socket.isClosed();
        try {
          // Parse
          SensorUpload su = SensorUpload.parseDelimitedFrom(is);
          if (su != null) {
            long huuid = su.getHuuid();
            long luuid = su.getLuuid();

            byte[] uuid = UUID.toByteArray(huuid, luuid);

            long sensorId = su.getSensorId();
            System.out.println(sensorId);
            long uploadTime = su.getUploadTime();
            List<SensorData> sensorValues = su.getSensorValuesList();

            // TODO, audit data, correct data timestamps?

            // Insert into the Database
            try {
              // Insert transaction
              PreparedStatement transactstmt = sqlse.getTransactionInsertStatement(connection);
              transactstmt.setBytes(1, uuid);
              transactstmt.setLong(2, uploadTime);
              transactstmt.execute();
              transactstmt.close();

              // Insert data
              PreparedStatement datastmt = sqlse.getSensorInsertStatement(connection, sensorId);

              if (datastmt != null) {
                List<Integer> types = sqlse.getArgumentExpectation(sensorId);

                for (SensorData sd : sensorValues) {
                  try {
                    datastmt.setBytes(1, uuid);
                    datastmt.setLong(2, sd.getRecordTime());

                    Iterator<Boolean> iterBool = sd.getValueBoolList().iterator();
                    Iterator<Integer> iterInteger = sd.getValueInt32List().iterator();
                    Iterator<Long> iterLong = sd.getValueInt64List().iterator();
                    Iterator<Float> iterFloat = sd.getValueFloatList().iterator();
                    Iterator<Double> iterDouble = sd.getValueDoubleList().iterator();
                    Iterator<String> iterString = sd.getValueStringList().iterator();

                    int counter = 3;
                    for (Integer type : types) {
                      switch (type) {
                        case SqlSetup.TYPE_BOOL:
                          datastmt.setBoolean(counter, iterBool.next());
                          break;
                        case SqlSetup.TYPE_INT32:
                          datastmt.setInt(counter, iterInteger.next());
                          break;
                        case SqlSetup.TYPE_INT64:
                          datastmt.setLong(counter, iterLong.next());
                          break;
                        case SqlSetup.TYPE_FLOAT:
                          datastmt.setFloat(counter, iterFloat.next());
                          break;
                        case SqlSetup.TYPE_DOUBLE:
                          datastmt.setDouble(counter, iterDouble.next());
                          break;
                        case SqlSetup.TYPE_STRING:
                          datastmt.setString(counter, iterString.next());
                          break;
                        default:
                          break;
                      }
                      counter++;
                    }
                    datastmt.addBatch();
                  } catch (NoSuchElementException e) {
                    Log.getInstance()
                        .append(Log.FLAG_WARNING, "Sensor data type mismatch with database");
                  }
                }
                // Add sensor data to the database
                datastmt.executeBatch();
                datastmt.close();
              }
            } catch (SQLException e) {
              Log.getInstance()
                  .append(Log.FLAG_WARNING, "Submitting sensor data chunk to database failed");
            }
          } else {
            connected = false;
          }
        } catch (IOException e) {
          Log.getInstance().append(Log.FLAG_WARNING, "Parsing protobuf SensorUpload failed");
          connected = false;
        }
      }
    } catch (IOException e) {
      Log.getInstance().append(Log.FLAG_WARNING, "Opening data stream from socket failed");
    } catch (Exception e) {
      Log.getInstance().append(Log.FLAG_WARNING, "Generic error");
    } finally {
      cleanup();
    }
  }