/***************************************************************************/
/*                             Druckersoftware                             */
/*                    Copyright (C) Carl Valentin GmbH                     */
/***************************************************************************/

/*
 * fpgaCommands.h
 *
 *  Created on: 04.04.2022
 *      Author: preitinger
 */

#ifndef FPGASERIAL_FPGACOMMANDS_H_
#define FPGASERIAL_FPGACOMMANDS_H_

#include <linux/types.h>

#include "../KM_bit_utils.h"


// Folgendes muss exakt passen zu implementiertem Kommandoempfang im FPGA in km_commands.vhd

static uint16_t create_Init(void) {
    return 0x0000;
}

static uint16_t create_openJobApiDma(void) {
    return 0x1000;

}

static uint16_t create_closeJobApiDma(void) {
    return 0x2000;
}

static uint16_t create_uartOpen(void) {
    return 0x3000;
}

static uint16_t create_uartClose(void) {
    return 0x4000;
}

// nicht mehr als "fpga command" da ein resp ack im fpga parallel ausserhalb der km command queue verarbeitet werden muss
// da es sonst zu verklemmungen kommen kann:
//// nun nicht nur fuer rx count ack, sondern jede response in fpgaResponses.h
//static uint16_t create_resp_ack(void) {
//    return 0x5000;
//}

static uint16_t create_txBuffer(unsigned int addCount) {
    ASSERT(addCount < 16);
    return (uint16_t) (0x6000 | (addCount & 0xf));
}

static uint16_t create_drain(void) {
    return 0x7000;
}

/**
 * Diese Bits werden direkt ins Kommando codiert damit
 * fuer diese nicht ein neues ram_km-Wort benoetigt wird.
 */
static uint16_t create_uartParams_cmd(int rtsCts, bool inboundXon, bool outboundXon) {
    uint16_t res = 0x8000;
    setBits(&res, 0, rtsCts, 0, 1);
    setBits(&res, 1, inboundXon ? 1 : 0, 0, 1);
    setBits(&res, 2, outboundXon ? 1 : 0, 0, 1);
    return res;
}

static uint16_t create_stop_start_cmd(void) {
    return 0x9000;
}

static uint16_t create_throttle_unthrottle_cmd(void) {
    return 0xa000;
}

// TODO hier ggf. weitere commands als create_...(void)

////////////////////////////////////////////////////////////////////

#endif /* FPGASERIAL_FPGACOMMANDS_H_ */
