/* * spreadspace avr utils * * * Copyright (C) 2013-2018 Christian Pointner * * This file is part of spreadspace avr utils. * * spreadspace avr utils is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * spreadspace avr utils is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with spreadspace avr utils. If not, see . */ #include #include #include #include #include #include "util.h" #include "led.h" #include "serialio.h" #include "Arduino.h" #include "PJON.h" PJON bus; void error_handler(uint8_t code, uint8_t data) { if(code == CONNECTION_LOST) { printf("Connection with device ID %d is lost.\r\n", data); } if(code == PACKETS_BUFFER_FULL) { printf("Packet buffer is full, has now a length of %d\r\n", data); printf("Possible wrong bus configuration!\r\n"); printf("higher MAX_PACKETS in PJON.h if necessary.\r\n"); } if(code == MEMORY_FULL) { printf("Packet memory allocation failed. Memory is full.\r\n"); } if(code == CONTENT_TOO_LONG) { printf("Content is too long, length: %d\r\n", data); } if(code == ID_ACQUISITION_FAIL) { printf("Can't acquire a free id %d\r\n", data); } } void recv_handler(uint8_t id, uint8_t *payload, uint8_t length) { if(length == 0) { printf("got 0 byte message from %d...\r\n", id); return; } led_on(); printf("got message(%d bytes) from %d: '", length, id); for(uint16_t i = 0; i < length; ++i) putchar(payload[i]); printf("'\r\n"); delay(30); led_off(); } void handle_cmd(uint8_t cmd) { switch(cmd) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': bus.set_id(cmd - '0'); printf("device id is now: %d\r\n", cmd - '0'); break; case 'b': bus.send(BROADCAST, "hello world", 11); break; case 's': bus.send(9, "hi!", 3); break; case '!': reset2bootloader(); break; default: printf("error\r\n"); return; } printf("ok\r\n"); } int main(void) { MCUSR &= ~(1 << WDRF); wdt_disable(); cpu_init(); led_init(); serialio_init(57600, 0); sei(); arduino_init(); bus.set_error(error_handler); bus.set_receiver(recv_handler); bus.set_pin(8); bus.begin(); for(;;) { int16_t BytesReceived = serialio_bytes_received(); while(BytesReceived > 0) { int ReceivedByte = fgetc(stdin); if(ReceivedByte != EOF) { handle_cmd(ReceivedByte); } BytesReceived--; } serialio_task(); bus.update(); bus.receive(50); } }