#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#include "modbus.h"

#define SLAVE_1         0x01
#define DEFAULT_BAUD    57600L
#define TOTAL_COILS     32

int main(int argc, char* argv[])
{
    int ret;
    int reg_addr;
    int value;
    uint16_t dest;

    char buff[32];
    modbus_param_t mb_param;
    long baud;

    if ( argc < 4 )
    {
        printf("Usage: wr_reg port address reg [baud]\n");
        printf("Default baud is %ld\n\n", DEFAULT_BAUD);
        printf("Examples:\n");
        printf("./wr_reg ttyS0 0x1FF 0x01     #for Linux\n");
        printf("./wr_reg com1 0x1FF 0x01      #for Cygwin\n");
        printf("\n");
        printf("./wr_reg ttyS0 0xFF 0x01 9600 #for Linux with non default baud\n");
        return -1;
    }

    /* set device name */
    sprintf(buff, "/dev/%s", argv[1]);

    /* get reg address */
    reg_addr = (int)strtol(argv[2], NULL, 16);

    /* get reg value */
    value = (int)strtol(argv[3], NULL, 16);
    
    baud = DEFAULT_BAUD;
    if ( argc == 5 )
    {
        baud = atol(argv[4]);
        switch ( baud )
        {
            case 9600:   break;
            case 19200:  break;
            case 38400:  break;
            case 57600:  break;
            case 115200: break;
            default: 
                printf("Invalid baud: %ld\n", baud);
                printf("Supported bauds: 9600, 19200, 38400, 57600, 115200\n");
                return -1;
        }
    }

    modbus_init_rtu(&mb_param, buff, baud, "none", 8, 1);

    if (modbus_connect(&mb_param) == -1) 
    {
        printf("ERROR Connection failed\n");
        exit(1);
    }
    
    /* read the holding register */
    printf("preset_single_register(ID 0x01, ADDRESS 0x%04X, VALUE 0x%04X,): ", 
           reg_addr, value);
    
    ret = preset_single_register(&mb_param, SLAVE_1, (reg_addr - 1), value);

    if ( ret != 1 ) 
    {
        printf("FAILED\n");
        exit(1);
    }
        
    printf("OK\n");
    
    printf("ADDRESS 0x%04X, REG 0x%04X\n", reg_addr, value);
 
    return 0;
}
