syntax = "proto2";

package org.traccar.protobuf.starlink;

// StarLink Message
message StarLink_Message {
  optional uint32 FID     = 1;				// Unit factory serial
  optional string IMEI    = 2;				// IMEI
  optional uint32 UID     = 3;  			// Unit serial
  optional uint32 AckRef  = 4;				// Ack reference number

  repeated mMessage Message = 5;
}

// Message body
message mMessage {
  optional uint64 ReferenceNumber     = 100;
  optional uint32 ReferenceNumberDiff = 101;
  optional uint32 MessageType         = 102;

  optional mWakeUp        WakeUp          = 1;
  optional mConfirmation  Confirmation    = 2;
  optional mParamResponse ParamResponse   = 3;
  optional mEventReport   EventReport     = 6;
  optional mGeoZone       GeoZone         = 10;
  optional mOutputs       Outputs         = 12;
  optional mEventConfig   EventConfig     = 14;
  optional mInputs        Inputs          = 16;
  optional mInputConfig   InputConfig     = 17;
  optional mSpeedLimit    SpeedLimit      = 27;
  optional mUnitIDChanged UnitIDChanged   = 29;
  optional mGenDeviceMsg  GenericDeviceMsg= 30;
  optional mGenDeviceFW   GenericDeviceFW = 35;
  optional mReadIButton   ReadIButton     = 42;
  optional mGetPattern    GetPattern      = 43;
  optional mMultiParam    MultiParameter  = 45;
  optional mTempConfig    TempConfig      = 52;
  optional mDeviceList    DeviceList      = 56;
  optional mTeachRemote   TeachRemote     = 58;
  optional mAuthenticate  Authenticate    = 95;
  optional mEventReport   CurrentLocation = 96;
  optional mConfigServer  ConfigServer    = 98;
}

// Wake-Up event
message mWakeUp {
  required string UnitVersion = 1;
  required string ProtocolVersion = 2;
}

// Confirmation message
message mConfirmation {
  // standard response
  required uint32 ResultCode = 1;
  optional uint32 ReferenceNumber = 2;		// confirmation by reference number
  optional uint32 MessageType = 3;		// confirmation by message type

  // parameter ack (response to command #4)
  optional uint32 ParameterAck = 4;

  // multi-parameter ack (response to command #46)
  optional uint32 ParametersChanged = 5;
  optional uint32 ParametersFailed = 6;
  repeated uint32 ParameterFailedList = 9;

  // modify list of allowed drivers (response to command #50)
  optional uint32 CodesInList = 7;
  optional uint32 EmptySlots = 8;
}

// Parameter response
message mParamResponse {
  required uint32 ParameterNumber = 1;
  required string Value = 2;
}

// Event report
message mEventReport {
  optional uint32 EID              =   1; 	// https://sweb.erm.co.il/protocol/?i=D12
  optional string EDESC            =   2; 	// https://sweb.erm.co.il/protocol/?i=D13
  optional uint32 EDT              =   3;	// https://sweb.erm.co.il/protocol/?i=D27 (seconds since 1/1/2000)
  optional sint32 EDT_Diff         =   4; 	// seconds since previous message's EDT
  optional uint32 NXT              =   5;	// https://sweb.erm.co.il/protocol/?i=D111
  optional uint32 NXTS             =  81;	// https://sweb.erm.co.il/protocol/?i=D178
  optional string ExtraData        = 254;

  optional uint32 PDT              =   6;	// https://sweb.erm.co.il/protocol/?i=D35 (seconds since 1/1/2000)
  optional sint32 PDT_Diff         =   7;	// seconds since previous message's PDT
  optional sint32 LAT              =   8;	// https://sweb.erm.co.il/protocol/?i=D49 (multiplied by 1000000)
  optional sint32 LAT_Diff         =   9; 	// difference between previous latitude (add this value to previous value)
  optional sint32 LONG             =  10;	// https://sweb.erm.co.il/protocol/?i=D57 (multiplied by 1000000)
  optional sint32 LONG_Diff        =  11;	// difference between previous longitude (add this value to previous value)
  optional sint32 ALT              =  12;	// https://sweb.erm.co.il/protocol/?i=D69 (multiplied by 10)
  optional sint32 ALT_Diff         =  13; 	// difference between previous altitude (add this value to previous value)
  optional uint32 SPD              =  14;	// https://sweb.erm.co.il/protocol/?i=D61 (multiplied by 10, in knots)
  optional uint32 SPDK             =  15;	// https://sweb.erm.co.il/protocol/?i=D62
  optional uint32 HEAD             =  16;	// https://sweb.erm.co.il/protocol/?i=D63
  optional uint32 HDOP             =  17;	// https://sweb.erm.co.il/protocol/?i=D71 (multiplied by 10)
  optional uint32 VDOP             =  18;	// https://sweb.erm.co.il/protocol/?i=D72 (multiplied by 10)
  optional uint32 PDOP             =  19;	// https://sweb.erm.co.il/protocol/?i=D70 (multiplied by 10)
  optional uint32 SAT              =  20;	// https://sweb.erm.co.il/protocol/?i=D73
  optional uint32 SATN             =  21;	// https://sweb.erm.co.il/protocol/?i=D99
  optional uint32 SATU             =  22;	// https://sweb.erm.co.il/protocol/?i=D74
  optional uint32 GSS              =  23;	// https://sweb.erm.co.il/protocol/?i=D98
  optional uint32 GSSN             =  24;	// https://sweb.erm.co.il/protocol/?i=D100
  optional uint32 FIX              =  25;	// https://sweb.erm.co.il/protocol/?i=D75
  optional uint32 LOCA             =  26;	// https://sweb.erm.co.il/protocol/?i=D126
  optional uint32 LOCS             =  79;	// https://sweb.erm.co.il/protocol/?i=D167

  optional uint32 ODO              =  27;	// https://sweb.erm.co.il/protocol/?i=D14
  optional sint32 ODO_Diff         =  28;	// difference between previous odometer (add this value to previous value)
  optional uint32 ODOD             =  29;	// https://sweb.erm.co.il/protocol/?i=D15 (multiplied by 1000)
  optional sint32 ODOD_Diff        =  30;	// difference between previous odometer (add this value to previous value)

  optional uint32 CID              =  31;	// https://sweb.erm.co.il/protocol/?i=D5
  optional uint32 LAC              =  32;	// https://sweb.erm.co.il/protocol/?i=D4
  optional uint32 CSS              =  33;	// https://sweb.erm.co.il/protocol/?i=D89
  optional sint32 CSS_Diff         =  34;	// difference between previous rx power (add this value to previous value)
  optional uint32 CTA              =  35;	// https://sweb.erm.co.il/protocol/?i=D95
  optional uint32 CCN              =  36;	// https://sweb.erm.co.il/protocol/?i=D89
  optional bool   JAM              =  37;	// https://sweb.erm.co.il/protocol/?i=D66
  optional uint32 NC               =  38;	// https://sweb.erm.co.il/protocol/?i=D94
  optional uint32 NM               =  39;	// https://sweb.erm.co.il/protocol/?i=D125
  optional uint32 NT               =  76;	// https://sweb.erm.co.il/protocol/?i=D153
  optional uint32 CU               =  77;	// https://sweb.erm.co.il/protocol/?i=D154

  optional uint32 VIN              =  40;	// https://sweb.erm.co.il/protocol/?i=D64 (multiplied by 100)
  optional sint32 VIN_Diff         =  41;	// difference between previous VIN (add this value to previous value)
  optional uint32 VBAT             =  42;	// https://sweb.erm.co.il/protocol/?i=D65 (multiplied by 100)
  optional sint32 VBAT_Diff        =  43;	// difference between previous VBAT (add this value to previous value)
  optional uint32 V3               =  44;	// https://sweb.erm.co.il/protocol/?i=D92 (multiplied by 100)
  optional sint32 V3_Diff          =  45;	// difference between previous V3 (add this value to previous value)
  optional uint32 V4               =  46;	// https://sweb.erm.co.il/protocol/?i=D93 (multiplied by 100)
  optional sint32 V4_Diff          =  47;	// difference between previous V4 (add this value to previous value)
  optional uint32 BATH             =  48;
  optional uint32 BATC             =  49;
  optional uint32 STRT             =  50;	// (multiplied by 100)
  optional sint32 TVI              =  51;	// https://sweb.erm.co.il/protocol/?i=D110 (multiplied by 10)

  optional uint32 Inputs           =  52;	// b0 = IN1/INC, b1 = IN2/IND, b2 = IN3/INE, b3 = IN4/INF
  optional uint32 DInputs          =  53;	// b0 = DI1, b1 = DI2, b2 = DI3, b3 = DI4, b4 = DI5, b5 = DI6, b6 = DI7, b7 = DI8
  optional uint32 IgnitionEngine   =  54;	// b0 = IGN, b1 = ENG, b2 = DRV
  optional uint32 Outputs          =  55;	// b0 = OUT1/OUTA, b1 = OUT2/OUTB, b2 = OUT3/OUTC, b3 = OUT4/OUTD, b4 = OUT5, b5 = OUT6, b6 = OUT7, b7 = OUT8

  optional string USER             =  56;	// https://sweb.erm.co.il/protocol/?i=D97
  optional string EDV1             =  57;	// https://sweb.erm.co.il/protocol/?i=D179
  optional string EDV2             =  58;	// https://sweb.erm.co.il/protocol/?i=D180
  optional string EDV3             =  59;	// https://sweb.erm.co.il/protocol/?i=D181
  optional string EDV4             =  60;	// https://sweb.erm.co.il/protocol/?i=D182

  optional sint32 CV1              =  61;	// https://sweb.erm.co.il/protocol/?i=D121
  optional sint32 CV2              =  62;	// https://sweb.erm.co.il/protocol/?i=D122
  optional sint32 CV3              =  63;	// https://sweb.erm.co.il/protocol/?i=D123
  optional sint32 CV4              =  64;	// https://sweb.erm.co.il/protocol/?i=D124
  optional sint32 CV5              =  82;	// https://sweb.erm.co.il/protocol/?i=D174
  optional sint32 CV6              =  83;	// https://sweb.erm.co.il/protocol/?i=D175
  optional sint32 CV7              =  84;	// https://sweb.erm.co.il/protocol/?i=D176
  optional sint32 CV8              =  85;	// https://sweb.erm.co.il/protocol/?i=D177
  optional sint32 CV9              =  86;	// https://sweb.erm.co.il/protocol/?i=D188
  optional sint32 CV10             =  87;	// https://sweb.erm.co.il/protocol/?i=D189
  optional sint32 CV11             =  88;	// https://sweb.erm.co.il/protocol/?i=D190
  optional sint32 CV12             =  89;	// https://sweb.erm.co.il/protocol/?i=D191

  optional bool   IARM             =  65;	// https://sweb.erm.co.il/protocol/?i=D7
  optional string DID              =  66;	// https://sweb.erm.co.il/protocol/?i=D101
  optional string DAL              =  67;	// https://sweb.erm.co.il/protocol/?i=D76
  optional uint32 DEST             =  68;	// https://sweb.erm.co.il/protocol/?i=D8
  optional bool   OVM              =  73;	// https://sweb.erm.co.il/protocol/?i=D150

  optional uint32 CFL              =  69;	// https://sweb.erm.co.il/protocol/?i=D26
  optional uint32 CFL2             =  80;	// https://sweb.erm.co.il/protocol/?i=D26
  optional uint32 RPM              =  70;	// https://sweb.erm.co.il/protocol/?i=D144

  optional uint32 DUR              =  71;	// https://sweb.erm.co.il/protocol/?i=D145
  optional uint32 TDUR             =  72;	// https://sweb.erm.co.il/protocol/?i=D146
  optional uint32 IDL              =  74;	// https://sweb.erm.co.il/protocol/?i=D151
  optional uint32 STP              =  75;	// https://sweb.erm.co.il/protocol/?i=D152

  repeated mEventReport_TDx TDx    =  78;	// https://sweb.erm.co.il/protocol/?i=D168
}

// Sensor data
message mEventReport_TDx {
  required uint32 SensorNumber		= 1;	// Sensor #
  optional string SensorID		= 3;	// TIx (binary)

  optional sint32 Temperature		= 4;	// TVx (multiplied by 10)
  optional uint32 Temperature_State	= 2;	// TSx

  optional uint32 Humidity		= 5;	// THx (multiplied by 10)
  optional uint32 Humidity_State	= 6;

  optional uint32 RSSI			= 7;
  optional uint32 RSSI_State		= 8;

  optional uint32 Voltage		= 9;	// mV (multiplied by 1000)
  optional uint32 Voltage_State		= 10;

  optional uint32 Light			= 11;	// percent
  optional uint32 Light_State		= 12;

  optional uint32 MagnetSwitch		= 13;
  optional uint32 MagnetSwitch_State	= 14;

  optional uint32 Accident		= 15;
  optional uint32 Button		= 16;
  optional uint32 Movement		= 17; 
}

// Geozone reqsponse
message mGeoZone {
  required uint32   ZoneNumber = 1;
  repeated mLatLong Point = 2;				// single point for radius geozone, multiple points for polygon
  optional uint32   Radius = 3;
}

// Outputs response
message mOutputs {
  required uint32 OutputBitmask = 1;
}

// Event configuration response
message mEventConfig {
  required uint32 EventID = 1;
  required uint32 Configuration = 2;		// bitmask
}

// Inputs response
message mInputs {
  required uint32 InputBitmask = 1;
}

// Inputs configuration
message mInputConfig {
  required uint32 InputID = 1;
  required uint32 DebounceLow = 2;
  required uint32 DebounceHigh = 3;
}

// Speed limit configuration
message mSpeedLimit {
  required uint32 Number = 1;
  required bool   Active = 2;
  optional uint32 MinSpeed = 3;       // when using speed limit with minimum speed
  optional uint32 MaxSpeed = 4;       // when using speed limit with maximum speed
  required uint32 Duration = 5;
  required bool   ReportDuration = 6;
  optional bool   StartAndEnd = 7;
  optional bool   AutoTrack = 8;
  optional bool   OutputPattern = 9;
  optional uint32 Step = 10;
}

// Unit ID changed
message mUnitIDChanged {
  required uint32 FID = 1;
  required string IMEI = 2;
  required sint32 PreviousSetting = 3;
  required sint32 NewSetting = 4;
}

// Generic device message
message mGenDeviceMsg {
  required uint32 DeviceID = 1;
  required uint32 DataType = 2;
  optional string Data = 3;
}

// Generic device FW update
message mGenDeviceFW {
  optional uint32 BlockRequest = 1;
  optional uint32 Status = 2;
  optional uint32 MaxBlocks = 3;
}

// Configuration server message
message mConfigServer {
  required bool Success = 1;
}

// Read iButton
message mReadIButton {
  required string iButtonID = 1;
  optional string Data = 2;
}

// Read pattern configuration
message mGetPattern {
  required uint32 PatternID = 1;
  required string Pattern = 2;
}

// Multiple parameters response
message mMultiParam {
  repeated uint32 ParameterNumbers = 1;
  repeated string Values = 2;
}

// Temperature sensor configuration
message mTempConfig {
  required uint32 SensorCount = 1;
  repeated string SensorID = 2;
}

// Device list
message mDeviceList {
  repeated uint32 DeviceID = 1;
  repeated uint32 Version = 2;
}

// Teach remote
message mTeachRemote {
  required uint32 RuleID = 1;
  optional uint32 RemoteID = 2;
}

// Authentication message
message mAuthenticate {
  required uint32 Version = 1;
  optional string Token = 2;
  optional uint32 Key = 3;
  optional uint32 Step = 4;
  optional string Digest = 5;
}

// Point (Lat / Long)
message mLatLong {
  required sint32 Latitude  = 1;
  required sint32 Longitude = 2;
}