package com.o3dr.services.android.lib.drone.companion.solo; import android.os.Parcel; import android.util.SparseArray; import com.o3dr.android.client.utils.TxPowerComplianceCountries; import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerMode.ControllerMode; import com.o3dr.services.android.lib.drone.companion.solo.controller.SoloControllerUnits.ControllerUnit; import com.o3dr.services.android.lib.drone.companion.solo.tlv.SoloButtonSetting; import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVMessageParser; import com.o3dr.services.android.lib.drone.companion.solo.tlv.TLVPacket; import com.o3dr.services.android.lib.drone.property.DroneAttribute; import java.nio.ByteBuffer; import java.util.List; /** * Stores state information for the sololink companion computer. * Created by Fredia Huya-Kouadio on 7/10/15. */ public class SoloState implements DroneAttribute { private String wifiSsid; private String wifiPassword; private String controllerVersion; private String controllerFirmwareVersion; private String vehicleVersion; private String autopilotVersion; private String gimbalVersion; private String txPowerCompliantCountry; private SparseArray<SoloButtonSetting> buttonSettings; @ControllerMode private int controllerMode; @ControllerUnit private String controllerUnit; public SoloState(){} public SoloState(String autopilotVersion, String controllerFirmwareVersion, String controllerVersion, String vehicleVersion, String wifiPassword, String wifiSsid, String txPowerCompliantCountry, SparseArray<SoloButtonSetting> buttonSettings, String gimbalVersion, @ControllerMode int controllerMode, @ControllerUnit String controllerUnit) { this.autopilotVersion = autopilotVersion; this.controllerFirmwareVersion = controllerFirmwareVersion; this.controllerVersion = controllerVersion; this.vehicleVersion = vehicleVersion; this.wifiPassword = wifiPassword; this.wifiSsid = wifiSsid; this.txPowerCompliantCountry = txPowerCompliantCountry; this.buttonSettings = buttonSettings; this.gimbalVersion = gimbalVersion; this.controllerMode = controllerMode; this.controllerUnit = controllerUnit; } public String getAutopilotVersion() { return autopilotVersion; } public String getControllerFirmwareVersion() { return controllerFirmwareVersion; } public String getControllerVersion() { return controllerVersion; } @ControllerMode public int getControllerMode(){ return controllerMode; } public String getVehicleVersion() { return vehicleVersion; } public String getWifiPassword() { return wifiPassword; } public String getWifiSsid() { return wifiSsid; } private boolean isEUTxPowerCompliant() { return !TxPowerComplianceCountries.getDefaultCountry().name().equals(txPowerCompliantCountry); } public String getTxPowerCompliantCountry() { return txPowerCompliantCountry; } public SoloButtonSetting getButtonSetting(int buttonType){ return buttonSettings.get(buttonType); } public String getGimbalVersion(){ return gimbalVersion; } @ControllerUnit public String getControllerUnit(){ return controllerUnit; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.wifiSsid); dest.writeString(this.wifiPassword); dest.writeString(this.controllerVersion); dest.writeString(this.controllerFirmwareVersion); dest.writeString(this.vehicleVersion); dest.writeString(this.autopilotVersion); dest.writeByte(isEUTxPowerCompliant() ? (byte) 1 : (byte) 0); final int buttonCount = buttonSettings.size(); dest.writeInt(buttonCount); for(int i = 0; i < buttonCount; i++){ final SoloButtonSetting buttonSetting = buttonSettings.valueAt(i); if(buttonSetting == null){ dest.writeInt(0); continue; } final byte[] buttonData = buttonSetting.toBytes(); dest.writeInt(buttonData.length); dest.writeByteArray(buttonData); } dest.writeString(this.gimbalVersion); dest.writeInt(this.controllerMode); dest.writeString(this.controllerUnit); dest.writeString(txPowerCompliantCountry); } protected SoloState(Parcel in) { this.wifiSsid = in.readString(); this.wifiPassword = in.readString(); this.controllerVersion = in.readString(); this.controllerFirmwareVersion = in.readString(); this.vehicleVersion = in.readString(); this.autopilotVersion = in.readString(); //Throw away byte that was added to ensure backwards compatibility in.readByte(); final int buttonCount = in.readInt(); this.buttonSettings = new SparseArray<>(buttonCount); for(int i = 0; i < buttonCount; i++){ final int dataSize = in.readInt(); if(dataSize == 0) continue; final ByteBuffer dataBuffer = ByteBuffer.allocate(dataSize); in.readByteArray(dataBuffer.array()); final List<TLVPacket> buttonsList = TLVMessageParser.parseTLVPacket(dataBuffer); if(!buttonsList.isEmpty()){ for(TLVPacket tlvPacket : buttonsList){ if(tlvPacket instanceof SoloButtonSetting) { final SoloButtonSetting button = (SoloButtonSetting) tlvPacket; buttonSettings.put(button.getButton(), button); } } } } this.gimbalVersion = in.readString(); @ControllerMode final int tempMode = in.readInt(); this.controllerMode = tempMode; @ControllerUnit final String tempUnit = in.readString(); this.controllerUnit = tempUnit; this.txPowerCompliantCountry = in.readString(); } public static final Creator<SoloState> CREATOR = new Creator<SoloState>() { public SoloState createFromParcel(Parcel source) { return new SoloState(source); } public SoloState[] newArray(int size) { return new SoloState[size]; } }; }