module VPCD_Types {

/* VPCD/VPICC Types, implementing the protocol used by vpcd/vpicc of
 * vsmartcard.git by Frank Morgner.
 */

import from General_Types all;
import from Osmocom_Types all;

type enumerated VPCD_CtrlCmd {
	VPCD_CTRL_OFF	(0),
	VPCD_CTRL_ON	(1),
	VPCD_CTRL_RESET (2),
	VPCD_CTRL_ATR	(4)
} with { variant "FIELDLENGTH(8)" };

type union VPCD_MsgUnion {
	VPCD_CtrlCmd	ctrl,
	octetstring	data
};

type record VPCD_PDU {
	uint16_t 	len,
	VPCD_MsgUnion	u
} with {
	variant (len) "LENGTHTO(u)"
	variant (u) "CROSSTAG(
			ctrl,	len = 1;
			data,	OTHERWISE)"
};


template (value) VPCD_PDU ts_VPCD_CTRL(template (value) VPCD_CtrlCmd cmd) := {
	len := 0, // overwritten
	u := {
		ctrl := cmd
	}
}
template (value) VPCD_PDU ts_VPCD_CTRL_OFF := ts_VPCD_CTRL(VPCD_CTRL_OFF);
template (value) VPCD_PDU ts_VPCD_CTRL_ON := ts_VPCD_CTRL(VPCD_CTRL_ON);
template (value) VPCD_PDU ts_VPCD_CTRL_RESET := ts_VPCD_CTRL(VPCD_CTRL_RESET);
template (value) VPCD_PDU ts_VPCD_CTRL_ATR := ts_VPCD_CTRL(VPCD_CTRL_ATR);
template (value) VPCD_PDU ts_VPCD_DATA(template (value) octetstring data) := {
	len := 0, //overwritten
	u := {
		data := data
	}
}

template (present) VPCD_PDU tr_VPCD_CTRL(template (present) VPCD_CtrlCmd cmd) := {
	len := ?,
	u := {
		ctrl := cmd
	}
}
template (present) VPCD_PDU tr_VPCD_CTRL_OFF := tr_VPCD_CTRL(VPCD_CTRL_OFF);
template (present) VPCD_PDU tr_VPCD_CTRL_ON := tr_VPCD_CTRL(VPCD_CTRL_ON);
template (present) VPCD_PDU tr_VPCD_CTRL_RESET := tr_VPCD_CTRL(VPCD_CTRL_RESET);
template (present) VPCD_PDU tr_VPCD_CTRL_ATR := tr_VPCD_CTRL(VPCD_CTRL_ATR);
template (present) VPCD_PDU tr_VPCD_DATA(template (present) octetstring data) := {
	len := ?,
	u := {
		data := data
	}
}

external function enc_VPCD_PDU(in VPCD_PDU msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };

external function dec_VPCD_PDU(in octetstring msg) return VPCD_PDU
	with { extension "prototype(convert) decode(RAW)" };



} with { encode "RAW" };