syntax = "proto2";

import "arch/agat/agat.proto";
import "arch/aeslanier/aeslanier.proto";
import "arch/amiga/amiga.proto";
import "arch/apple2/apple2.proto";
import "arch/brother/brother.proto";
import "arch/c64/c64.proto";
import "arch/f85/f85.proto";
import "arch/fb100/fb100.proto";
import "arch/ibm/ibm.proto";
import "arch/macintosh/macintosh.proto";
import "arch/micropolis/micropolis.proto";
import "arch/mx/mx.proto";
import "arch/northstar/northstar.proto";
import "arch/rolandd20/rolandd20.proto";
import "arch/smaky6/smaky6.proto";
import "arch/tartu/tartu.proto";
import "arch/tids990/tids990.proto";
import "arch/victor9k/victor9k.proto";
import "arch/zilogmcz/zilogmcz.proto";
import "lib/fluxsink/fluxsink.proto";
import "lib/common.proto";

//NEXT: 33
message DecoderProto {
	optional double pulse_debounce_threshold = 1 [default = 0.30,
		(help) = "ignore pulses with intervals shorter than this, in fractions of a clock"];
	optional double bit_error_threshold = 2 [default = 0.40,
		(help) = "amount of error to tolerate in pulse timing, in fractions of a clock"];
	optional double minimum_clock_us = 4 [default = 0.75,
		(help) = "refuse to detect clocks shorter than this, to avoid false positives"];

	optional double pll_adjust = 25 [default = 0.04];
	optional double pll_phase = 26 [default = 0.60];
	optional double flux_scale = 27 [default = 1.0];

	oneof format {
		AesLanierDecoderProto aeslanier = 7;
		AgatDecoderProto agat = 28;
		AmigaDecoderProto amiga = 8;
		Apple2DecoderProto apple2 = 13;
		BrotherDecoderProto brother = 6;
		Commodore64DecoderProto c64 = 9;
		F85DecoderProto f85 = 10;
		Fb100DecoderProto fb100 = 11;
		IbmDecoderProto ibm = 5;
		MacintoshDecoderProto macintosh = 12;
		MicropolisDecoderProto micropolis = 14;
		MxDecoderProto mx = 15;
		NorthstarDecoderProto northstar = 24;
		RolandD20DecoderProto rolandd20 = 31;
		Smaky6DecoderProto smaky6 = 30;
		TartuDecoderProto tartu = 32;
		Tids990DecoderProto tids990 = 16;
		Victor9kDecoderProto victor9k = 17;
		ZilogMczDecoderProto zilogmcz = 18;
	}

	optional FluxSinkProto copy_flux_to = 19
		[(help) = "while decoding, write a copy of the flux here"];
	optional bool dump_records = 20 [default = false,
		(help) = "if set, then dump the parsed but undecoded disk records"];
	optional bool dump_sectors = 21 [default = false,
		(help) = "if set, then dump the decoded sectors to this file"];
	optional int32 retries = 22 [default = 5,
		(help) = "how many times to retry each track in the event of a read failure"];
	optional string write_csv_to = 23
		[(help) = "if set, write a CSV report of the disk state"];
	optional bool skip_unnecessary_tracks = 29 [default = true,
		(help) = "don't read tracks if we already have all necessary sectors"];
}

