Ejemplo n.º 1
0
void twinklmsg_set_value(struct twinkl_message *msg, uint16_t chan, uint8_t value) {
	twinkl_set_value(msg, chan, value);
}
Ejemplo n.º 2
0
int main(int argc, char *argv[])
{
    int twinklsocket;

    if(argc != 3) {
        fprintf(stderr,"usage: %s hostname priority\n", argv[0]);
        exit(1);
    }

    twinklsocket = twinklsocket_open(argv[1], port);
    if(twinklsocket == -1) {
        exit(1);
    }

    struct twinkl_message msg;

    unsigned long priority;
    priority = strtoul(argv[2], NULL, 0);
    if(priority == ULONG_MAX || priority > TWINKL_LEVEL_COUNT) {
        fprintf(stderr, "Priority not in range 0..%d\n", TWINKL_LEVEL_COUNT);
        exit(1);
    }

    twinkl_init_message(&msg);
    twinkl_set_priority(&msg, priority);


    int linecount = 0;
    size_t len = 0;
    char *line = NULL;

    /*
     * Line format: <channel> : <value>
     * With arbitrary many spaces between the numbers and the colon
     * Example: "5 :   42"
     */
    while(!feof(stdin)) {

        // Try to read a line from stdin, if the line is empty send the packet
        if(getline(&line, &len, stdin) <= 1) {
            int result = twinklsocket_send(twinklsocket, &msg);
            if(result != 0) {
                printf("There was an error while sending the twinkl packet.\n");
                exit(1);
            }
            printf("Twinkl paket sent.\n");

            twinkl_init_message(&msg);
            twinkl_set_priority(&msg, priority);

            continue;
        }

        char *colon, *end;
        unsigned long chan, value;

        linecount++;

        chan = strtoul(line, &end, 0);
        if(chan == ULONG_MAX || end == line) {
            fprintf(stderr, "Invalid channel number for line %d\n", linecount);
            continue;
        }
        if(chan > TWINKL_CHANNEL_COUNT) {
            fprintf(stderr, "Channel number %lu not in range 0..%d for line %d\n",
                    chan,
                    TWINKL_CHANNEL_COUNT - 1,
                    linecount);

            continue;
        }

        colon = strchr(end, ':');
        if(colon == NULL) {
            fprintf(stderr, "Missing delimiter in line %d\n", linecount);
            continue;
        }

        // First char after the colon is value
        value = strtoul(colon + 1, &end, 0);
        if(value == ULONG_MAX || end == colon + 1) {
            fprintf(stderr, "Invalid value for line %d\n", linecount);
            continue;
        }
        if(value > 255) {
            fprintf(stderr, "Value %lu for channel %lu is not in range 1..255 in line %d\n",
                    value,
                    chan,
                    linecount);

            continue;
        }

        if(*end != '\n') {
            fprintf(stderr, "Unecessary characters after value in line %d\n", linecount);
            continue;
        }

        twinkl_set_value(&msg, chan, value);
    }

    free(line);

    twinklsocket_close(twinklsocket);
    return 0;
}