#ifndef LAP_H
#define LAP_H

/****************************************************************************
 * Labor Automation Protocol
 *
 */

#include <inttypes.h>


/****************************************************************************
 * Types
 */

// "inherits" from can_message
typedef struct {
	can_addr addr_src;
	can_addr addr_dst;
	can_port port_src;
	can_port port_dst;
	unsigned char dlc;
	unsigned char cmd;
	uint16_t index;
	uint16_t size;
	uint16_t address;
} sdo_message;

// "inherits" from can_message
typedef struct{
	can_addr addr_src;
	can_addr addr_dst;
	can_port port_src;
	can_port port_dst;
	unsigned char dlc;
	unsigned char cmd;
	unsigned char data[7];
} pdo_message;

/****************************************************************************
 * Known ports and services
 */

typedef enum { PORT_MGT=0x30, PORT_LAMPE=0x20, PORT_SDO=0x15, PORT_SDO_DATA=0x16, PORT_LAPD=0x18,
		PORT_BORG=0x23, PORT_MOOD=0x17, PORT_REMOTE=0x21, PORT_GATE=0x22, PORT_CHUCK=0x26 }  ports;

typedef enum { FKT_MGT_PING=0x00, FKT_MGT_PONG=0x01,
		FKT_MGT_RESET=0x02, FKT_MGT_AWAKE=0x03, FKT_MGT_TIMEREQUEST=0x04, FKT_MGT_TIMEREPLY=0x05 }	lap_mgt_fkts;

typedef enum { FKT_LAMPE_SET=0x00, FKT_LAMPE_SETMASK=0x01,
		FKT_LAMPE_SETDELAY=0x02, FKT_LAMPE_ADD=0x03 }			lap_lampe_fkts;

typedef enum { FKT_BORG_INFO=0x00, FKT_BORG_MODE=0x01, FKT_BORG_SCROLLTEXT_RESET=0x02,
		FKT_BORG_SCROLLTEXT_APPEND=0x03 } lap_borg_fkts;

typedef enum { FKT_ONOFF_INFO=0, FKT_ONOFF_SET=1, FKT_ONOFF_GET=2,
        } lap_lapd_fkts;

typedef enum { FKT_MOOD_INFO=0x00, FKT_MOOD_GET=0x01, FKT_MOOD_SET=0x02, FKT_MOOD_ONOFF=0x03} lap_mood_fkts;
#define SDO_CMD_READ 		0x20
#define SDO_CMD_REPLY 		0x21
#define SDO_CMD_INFO 		0x22
#define SDO_CMD_READ_BLK	0x40
#define SDO_CMD_READ_BLK_ACK	0x41
#define SDO_CMD_WRITE_BLK	0x48
#define SDO_CMD_WRITE_BLK_ACK	0x49


#define SDO_CMD_ERROR_INDEX 	0x80

#define SDO_TYPE_UINT8_RO	 0x00
#define SDO_TYPE_UINT8_RW	 0x01
#define SDO_TYPE_UINT16_RO 	 0x04
#define SDO_TYPE_UINT16_RW 	 0x05
#define SDO_TYPE_UINT32_RO 	 0x08
#define SDO_TYPE_UINT32_RW  	 0x09
#define SDO_TYPE_STRING_RO	 0x80
#define SDO_TYPE_STRING_RW	 0x81
#define SDO_TYPE_STRING_WO	 0x82


/****************************************************************************
 * STUBS: LAP Core Services
 */

// send ping to dst
void lap_ping( can_addr dst );

// send reset request to dst
void lap_reset( can_addr dst );

#ifdef LAP_TIME_EXTENSION
//variables to save the last received hours and  minutes
extern uint8_t lap_time_h, lap_time_m, lap_time_update;
#endif

/**
 * ServiceDataObject routinen
 *
unsigned char *sdo_readbuf(sdo_message *first_message,
		unsigned char length, unsigned char *actuallength);

unsigned char sdo_sendbuf(sdo_message *fst_msg, unsigned char *buf, unsigned char len);
unsigned char sdo_sendbuf_nb(sdo_message *fst_msg, unsigned char *buf, unsigned char len);

*/
/////////////////////////////////////////////////////////////////////////////
/* Usage

while(1) {
	lap_message msg = lap_rcvpacket();
	switch( msg->fkt_id ) {
	case FKT_BLA:
		unsigned char length = data[0]

		data

		char *buf = lap_read(msg, length);
		if ( !buf ) continue;

		// interpret buffer
}
*/

#endif