/*
 * Ymodem send routine.  Only supports 1K blocks and CRC mode.
 */

#include <string.h>
#include <stdio.h>
#include <inttypes.h>
#include "upload_backend.h"
#include "serial.h"

enum {
    SOH = 0x01,
    STX = 0x02,
    EOT = 0x04,
    ACK = 0x06,
    NAK = 0x15,
    CAN = 0x18,
};

struct ymodem_state {
    struct serial_if serial;
    unsigned int seq, blocks;
};

/*
 * Append a CRC16 to a block
 */
static void add_crc16(uint8_t * blk, int len)
{
    static const uint16_t crctab[256] = {
	0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
	0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
	0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
	0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
	0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
	0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
	0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
	0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
	0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
	0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
	0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
	0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
	0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
	0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
	0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
	0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
	0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
	0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
	0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
	0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
	0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
	0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
	0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
	0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
	0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
	0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
	0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
	0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
	0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
	0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
	0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
    };
    uint16_t crc = 0;

    while (len--)
	crc = crctab[(crc >> 8) ^ *blk++] ^ crc << 8;

    *blk++ = crc >> 8;
    *blk = crc;
}

static void send_ack(struct ymodem_state *ym, const uint8_t *blk,
		     size_t bytes);

static void send_ack_blk(struct ymodem_state *ym, uint8_t *blk)
{
    printf("Sending block %u/%u...\r", ym->seq, ym->blocks);

    blk[0] = STX;
    blk[1] = ym->seq++;
    blk[2] = ~blk[1];
    add_crc16(blk+3, 1024);

    send_ack(ym, blk, 1024+5);
}

static void send_ack(struct ymodem_state *ym, const uint8_t *blk, size_t bytes)
{
    uint8_t ack_buf;

    do {
	serial_write(&ym->serial, blk, bytes);

	do {
	    serial_read(&ym->serial, &ack_buf, 1);
	} while (ack_buf != ACK && ack_buf != NAK);
    } while (ack_buf == NAK);
}

static int upload_ymodem_write(struct upload_backend *be)
{
    static const uint8_t eot_buf = EOT;
    uint8_t ack_buf;
    uint8_t blk_buf[1024 + 5];
    struct ymodem_state ym;
    const char *buf;
    size_t len, chunk;
    const char ymodem_banner[] = "Now begin Ymodem download...\r\n";

    buf = be->outbuf;
    len = be->zbytes;

    putchar('\n');

    ym.seq = 0;
    ym.blocks = (len+1023)/1024;

    /* Initialize serial port */
    if (serial_init(&ym.serial, &be->argv[1]))
	return -1;

    /* Write banner */
    printf("Writing banner...\n");
    serial_write(&ym.serial, ymodem_banner, sizeof ymodem_banner-1);

    /* Wait for initial handshake */
    printf("Waiting for handshake...\n");
    do {
	serial_read(&ym.serial, &ack_buf, 1);
    } while (ack_buf != 'C');

    /* Send filename block */
    memset(blk_buf, 0, sizeof blk_buf);
    snprintf((char *)blk_buf+3, 1024, "%s%c%zu 0%o 0644",
	     be->argv[0], 0, be->zbytes, be->now);
    send_ack_blk(&ym, blk_buf);

    while (len) {
	chunk = len < 1024 ? len : 1024;

	memcpy(blk_buf+3, buf, chunk);
	if (chunk < 1024)
	    memset(blk_buf+3+chunk, 0x1a, 1024-chunk);

	send_ack_blk(&ym, blk_buf);
	buf += chunk;
	len -= chunk;
    }

    printf("\nSending EOT...\n");
    send_ack(&ym, &eot_buf, 1);

    printf("Waiting for handshake...\n");
    do {
	serial_read(&ym.serial, &ack_buf, 1);
    } while (ack_buf != 'C');
    ym.seq = 0;

    printf("Sending batch termination block...\n");
    memset(blk_buf+3, 0, 1024);
    send_ack_blk(&ym, blk_buf);

    printf("Cleaning up...             \n");
    serial_cleanup(&ym.serial);

    return 0;
}

struct upload_backend upload_ymodem = {
    .name       = "ymodem",
    .helpmsg    = "filename [port [speed]]",
    .minargs    = 1,
    .write      = upload_ymodem_write,
};
