From b3cbfec97b0e6afd9869876fd99ce16c3e743b82 Mon Sep 17 00:00:00 2001 From: Alexey 'Cluster' Avdyukhin Date: Thu, 26 Sep 2013 21:00:21 +0400 Subject: CLUNET moved to another folder... --- Makefile | 26 ++--- bits.h | 10 -- clunet.c | 326 -------------------------------------------------------- clunet.h | 223 -------------------------------------- clunet_config.h | 2 +- 5 files changed, 15 insertions(+), 572 deletions(-) delete mode 100644 bits.h delete mode 100644 clunet.c delete mode 100644 clunet.h diff --git a/Makefile b/Makefile index e46d8c5..78c9c05 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,15 @@ PRG = intercom -OBJ = intercom.o ff.o diskio.o rtc.o clunet.o sound.o transfer.o +OBJ = intercom.o ff.o diskio.o rtc.o sound.o transfer.o clunet.o +CLUNET_DEVICE_ID = 7 #LFUSE = E4 #LFUSE = FF #HFUSE = D9 #MCU_PROGRAMMER = m8 -CLUNET_FLASHER = D:/Soft/Soft/ClunetFlasher/clunetflasher.exe -//CLUNET_IP = 127.0.0.1 +CLUNET_PATH = ../clunet +CLUNET_FLASHER = D:/Soft/Soft/clunetflasher/clunetflasher.exe CLUNET_IP = 10.13.0.254 CLUNET_PORT = 10009 -CLUNET_DEVICE_ID = 7 #MCU_TARGET = at90s2313 #MCU_TARGET = at90s2333 @@ -44,7 +44,7 @@ MCU_TARGET = atmega64 #MCU_TARGET = atmega6450 #MCU_TARGET = atmega649 #MCU_TARGET = atmega6490 -#MCU_TARGET = atmega16 +#MCU_TARGET = atmega8 #MCU_TARGET = atmega8515 #MCU_TARGET = atmega8535 #MCU_TARGET = atmega88 @@ -62,7 +62,11 @@ MCU_TARGET = atmega64 OPTIMIZE = -O2 DEFS = -LIBS = +LIBS = + +program: hex + $(CLUNET_FLASHER) $(CLUNET_IP) $(CLUNET_PORT) $(CLUNET_DEVICE_ID) $(PRG).hex +# avrdude -V -p $(MCU_PROGRAMMER) -c avrisp2 -P usb -U flash:w:$(PRG).hex -U lfuse:w:0x$(LFUSE):m -U hfuse:w:0x$(HFUSE):m # You should not have to change anything below here. @@ -70,7 +74,7 @@ CC = avr-gcc # Override is only needed by avr-lib build system. -override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) +override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) -I. -I$(CLUNET_PATH) override LDFLAGS = -Wl,-Map,$(PRG).map OBJCOPY = avr-objcopy @@ -78,6 +82,9 @@ OBJDUMP = avr-objdump all: $(PRG).elf lst text eeprom +clunet.o: + $(CC) $(CFLAGS) -c -o $@ $^ $(CLUNET_PATH)/clunet.c + $(PRG).elf: $(OBJ) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) @@ -150,8 +157,3 @@ pdf: $(PRG).pdf %.png: %.fig $(FIG2DEV) -L png $< $@ - -program: hex - $(CLUNET_FLASHER) $(CLUNET_IP) $(CLUNET_PORT) $(CLUNET_DEVICE_ID) $(PRG).hex -# avrdude -V -p $(MCU_PROGRAMMER) -c avrisp2 -P usb -U flash:w:$(PRG).hex -U lfuse:w:0x$(LFUSE):m -U hfuse:w:0x$(HFUSE):m - diff --git a/bits.h b/bits.h deleted file mode 100644 index 55a99aa..0000000 --- a/bits.h +++ /dev/null @@ -1,10 +0,0 @@ -#define set(reg,value) reg |= (value) -#define unset(reg,value) reg &= ~(value) -#define set_bit(reg,value) reg |= (_BV(value)) -#define set_bit2(reg,value1,value2) reg |= (_BV(value1) | _BV(value2)) -#define set_bit3(reg,value1,value2,value3) reg |= (_BV(value1) | _BV(value2) | _BV(value3)) -#define set_bit4(reg,value1,value2,value3,value4) reg |= (_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4)) -#define unset_bit(reg,value) reg &= ~(_BV(value)) -#define unset_bit2(reg,value1,value2) reg &= ~(_BV(value1) | _BV(value2)) -#define unset_bit3(reg,value1,value2,value3) reg &= ~(_BV(value1) | _BV(value2) | _BV(value3)) -#define unset_bit4(reg,value1,value2,value3,value4) reg &= ~(_BV(value1) | _BV(value2) | _BV(value3) | _BV(value4)) diff --git a/clunet.c b/clunet.c deleted file mode 100644 index 1c00e58..0000000 --- a/clunet.c +++ /dev/null @@ -1,326 +0,0 @@ -/* Name: clunet.c - * Project: CLUNET network driver - * Author: Alexey Avdyukhin - * Creation Date: 2013-09-09 - * License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - */ - - -#include "defines.h" -#include "clunet_config.h" -#include "bits.h" -#include "clunet.h" -#include -#include - -void (*on_data_received)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) = 0; -void (*on_data_received_sniff)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) = 0; - -volatile unsigned char clunetSendingState = CLUNET_SENDING_STATE_IDLE; -volatile unsigned short int clunetSendingDataLength; -volatile unsigned char clunetSendingCurrentByte; -volatile unsigned char clunetSendingCurrentBit; -volatile unsigned char clunetReadingState = CLUNET_READING_STATE_IDLE; -volatile unsigned char clunetReadingCurrentByte; -volatile unsigned char clunetReadingCurrentBit; -volatile unsigned char clunetCurrentPrio; - -volatile unsigned char clunetReceivingState = 0; -//volatile unsigned char clunetReceivingPrio = 0; -volatile unsigned char clunetTimerStart = 0; -volatile unsigned char clunetTimerPeriods = 0; - -volatile char dataToSend[CLUNET_SEND_BUFFER_SIZE]; -volatile char dataToRead[CLUNET_READ_BUFFER_SIZE]; - -char check_crc(char* data, unsigned char size) -{ - uint8_t crc=0; - uint8_t i,j; - for (i=0; i>= 1; - if (mix) - crc ^= 0x8C; - - inbyte >>= 1; - } - } - return crc; -} - -ISR(CLUNET_TIMER_COMP_VECTOR) -{ - unsigned char now = CLUNET_TIMER_REG; // Запоминаем текущее время - - switch (clunetSendingState) - { - case CLUNET_SENDING_STATE_PREINIT: // Нужно подождать перед отправкой - CLUNET_TIMER_REG_OCR = now + CLUNET_T; - clunetSendingState = CLUNET_SENDING_STATE_INIT; // Начинаем следующую фазу - return; - case CLUNET_SENDING_STATE_STOP: // Завершение передачи, но надо ещё подождать - CLUNET_SEND_0; // Отпускаем линию - CLUNET_TIMER_REG_OCR = now + CLUNET_T; - clunetSendingState = CLUNET_SENDING_STATE_DONE; - return; - case CLUNET_SENDING_STATE_DONE: // Завершение передачи - CLUNET_DISABLE_TIMER_COMP; // Выключаем таймер-сравнение - clunetSendingState = CLUNET_SENDING_STATE_IDLE; // Ставим флаг, что передатчик свободен - return; - } - - if (/*!((clunetReadingState == CLUNET_READING_STATE_DATA) && // Если мы сейчас не [получаем данные - (clunetCurrentPrio > clunetReceivingPrio) // И приоритет получаемых данных не ниже - && (clunetSendingState == CLUNET_SENDING_STATE_INIT)) // И мы не пытаемся начать инициализацию] - &&*/ (!CLUNET_SENDING && CLUNET_READING)) // То идёт проверка на конфликт. Если мы линию не держим, но она уже занята - { - CLUNET_DISABLE_TIMER_COMP; // Выключаем таймер-сравнение - clunetSendingState = CLUNET_SENDING_STATE_WAITING_LINE; // Переходим в режим ожидания линии - return; // И умолкаем - } - - CLUNET_SEND_INVERT; // Сразу инвртируем значение сигнала, у нас это запланировано - - if (!CLUNET_SENDING) // Если мы отпустили линию... - { - CLUNET_TIMER_REG_OCR = now + CLUNET_T; // То вернёмся в это прерывание через CLUNET_T единиц времени - return; - } - switch (clunetSendingState) - { - case CLUNET_SENDING_STATE_INIT: // Инициализация - CLUNET_TIMER_REG_OCR = now + CLUNET_INIT_T; - clunetSendingState = CLUNET_SENDING_STATE_PRIO1; // Начинаем следующую фазу - return; - case CLUNET_SENDING_STATE_PRIO1: // Фаза передачи приоритета, старший бит - if ((clunetCurrentPrio-1) & 2) // Если 1, то ждём 3T, а если 0, то 1T - CLUNET_TIMER_REG_OCR = now + CLUNET_1_T; - else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T; - clunetSendingState = CLUNET_SENDING_STATE_PRIO2; - return; - case CLUNET_SENDING_STATE_PRIO2: // Фаза передачи приоритета, младший бит - if ((clunetCurrentPrio-1) & 1) // Если 1, то ждём 3T, а если 0, то 1T - CLUNET_TIMER_REG_OCR = now + CLUNET_1_T; - else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T; - clunetSendingState = CLUNET_SENDING_STATE_DATA; - return; - case CLUNET_SENDING_STATE_DATA: // Фаза передачи данных - if (dataToSend[clunetSendingCurrentByte] & (1 << clunetSendingCurrentBit)) // Если 1, то ждём 3T, а если 0, то 1T - CLUNET_TIMER_REG_OCR = now + CLUNET_1_T; - else CLUNET_TIMER_REG_OCR = now + CLUNET_0_T; - clunetSendingCurrentBit++; // Переходим к следующему биту - if (clunetSendingCurrentBit >= 8) - { - clunetSendingCurrentBit = 0; - clunetSendingCurrentByte++; - } - if (clunetSendingCurrentByte >= clunetSendingDataLength) // Данные закончились - { - clunetSendingState = CLUNET_SENDING_STATE_STOP; // Следующая фаза - } - return; - } -} - - -void clunet_start_send() -{ - CLUNET_SEND_0; - if (clunetSendingState != CLUNET_SENDING_STATE_PREINIT) // Если не нужна пауза... - clunetSendingState = CLUNET_SENDING_STATE_INIT; // Инициализация передачи - clunetSendingCurrentByte = clunetSendingCurrentBit = 0; // Обнуляем счётчик - CLUNET_TIMER_REG_OCR = CLUNET_TIMER_REG+CLUNET_T; // Планируем таймер, обычно почему-то прерывание срабатывает сразу - CLUNET_ENABLE_TIMER_COMP; // Включаем прерывание таймера-сравнения -} - -void clunet_send(unsigned char address, unsigned char prio, unsigned char command, char* data, unsigned char size) -{ - if (CLUNET_OFFSET_DATA+size+1 > CLUNET_SEND_BUFFER_SIZE) return; // Не хватает буфера - CLUNET_DISABLE_TIMER_COMP;CLUNET_SEND_0; // Прерываем текущую передачу, если есть такая - // Заполняем переменные - if (clunetSendingState != CLUNET_SENDING_STATE_PREINIT) - clunetSendingState = CLUNET_SENDING_STATE_IDLE; - clunetCurrentPrio = prio; - dataToSend[CLUNET_OFFSET_SRC_ADDRESS] = CLUNET_DEVICE_ID; - dataToSend[CLUNET_OFFSET_DST_ADDRESS] = address; - dataToSend[CLUNET_OFFSET_COMMAND] = command; - dataToSend[CLUNET_OFFSET_SIZE] = size; - unsigned char i; - for (i = 0; i < size; i++) - dataToSend[CLUNET_OFFSET_DATA+i] = data[i]; - dataToSend[CLUNET_OFFSET_DATA+size] = check_crc((char*)dataToSend, CLUNET_OFFSET_DATA+size); - clunetSendingDataLength = CLUNET_OFFSET_DATA + size + 1; - if ( - (clunetReadingState == CLUNET_READING_STATE_IDLE) // Если мы ничего не получаем в данный момент, то посылаем сразу -// || ((clunetReadingState == CLUNET_READING_STATE_DATA) && (prio > clunetReceivingPrio)) // Либо если получаем, но с более низким приоритетом - ) - clunet_start_send(); // Запускаем передачу сразу - else clunetSendingState = CLUNET_SENDING_STATE_WAITING_LINE; // Иначе ждём линию -} - -inline void clunet_data_received(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size) -{ - if (on_data_received_sniff) - (*on_data_received_sniff)(src_address, dst_address, command, data, size); - - if (src_address == CLUNET_DEVICE_ID) return; // Игнорируем сообщения от самого себя! - - if ((dst_address != CLUNET_DEVICE_ID) && - (dst_address != CLUNET_BROADCAST_ADDRESS)) return; // Игнорируем сообщения не для нас - - if (command == CLUNET_COMMAND_REBOOT) // Просто ребут. И да, ребутнуть себя мы можем - { - cli(); - set_bit(WDTCR, WDE); - while(1); - } - - if ((clunetSendingState == CLUNET_SENDING_STATE_IDLE) || (clunetCurrentPrio <= CLUNET_PRIORITY_MESSAGE)) - { - if (command == CLUNET_COMMAND_DISCOVERY) // Ответ на поиск устройств - { -#ifdef CLUNET_DEVICE_NAME - char buf[] = CLUNET_DEVICE_NAME; - int len = 0; while(buf[len]) len++; - clunetSendingState = CLUNET_SENDING_STATE_PREINIT; - clunet_send(src_address, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_DISCOVERY_RESPONSE, buf, len); -#else - clunetSendingState = CLUNET_SENDING_STATE_PREINIT; - clunet_send(src_address, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_DISCOVERY_RESPONSE, 0, 0); -#endif - } - else if (command == CLUNET_COMMAND_PING) // Ответ на пинг - { - clunetSendingState = CLUNET_SENDING_STATE_PREINIT; - clunet_send(src_address, CLUNET_PRIORITY_COMMAND, CLUNET_COMMAND_PING_REPLY, data, size); - } - } - - if (on_data_received) - (*on_data_received)(src_address, dst_address, command, data, size); - - if ((clunetSendingState == CLUNET_SENDING_STATE_WAITING_LINE) && !CLUNET_READING) // Если есть неотосланные данные, шлём, линия освободилась - { - clunetSendingState = CLUNET_SENDING_STATE_PREINIT; - clunet_start_send(); - } -} - -ISR(CLUNET_TIMER_OVF_VECTOR) -{ - if (clunetTimerPeriods < 3) - clunetTimerPeriods++; - else // Слишком долго нет сигнала, сброс и отключение прерывания - { - CLUNET_SEND_0; // А вдруг мы забыли линию отжать? Хотя по идее не должно... - clunetReadingState = CLUNET_READING_STATE_IDLE; - if ((clunetSendingState == CLUNET_SENDING_STATE_IDLE) && (!CLUNET_READING)) - CLUNET_DISABLE_TIMER_OVF; - if ((clunetSendingState == CLUNET_SENDING_STATE_WAITING_LINE) && (!CLUNET_READING)) // Если есть неотосланные данные, шлём, линия освободилась - clunet_start_send(); - } -} - - -ISR(CLUNET_INT_VECTOR) -{ - unsigned char time = (unsigned char)((CLUNET_TIMER_REG-clunetTimerStart) & 0xFF); - if (!CLUNET_READING) // Линию отпустило - { - CLUNET_ENABLE_TIMER_OVF; - if (time >= (CLUNET_INIT_T+CLUNET_1_T)/2) // Если кто-то долго жмёт линию, это инициализация - { - clunetReadingState = CLUNET_READING_STATE_PRIO1; - } - else switch (clunetReadingState) // А если не долго, то смотрим на этап - { - case CLUNET_READING_STATE_PRIO1: // Получение приоритета, клиенту он не нужен - /* - if (time > (CLUNET_0_T+CLUNET_1_T)/2) - clunetReceivingPrio = 3; - else clunetReceivingPrio = 1; - */ - clunetReadingState = CLUNET_READING_STATE_PRIO2; - break; - case CLUNET_READING_STATE_PRIO2: // Получение приоритета, клиенту он не нужен - /* - if (time > (CLUNET_0_T+CLUNET_1_T)/2) - clunetReceivingPrio++; - */ - clunetReadingState = CLUNET_READING_STATE_DATA; - clunetReadingCurrentByte = 0; - clunetReadingCurrentBit = 0; - dataToRead[0] = 0; - break; - case CLUNET_READING_STATE_DATA: // Чтение всех данных - if (time > (CLUNET_0_T+CLUNET_1_T)/2) - dataToRead[clunetReadingCurrentByte] |= (1 << clunetReadingCurrentBit); - clunetReadingCurrentBit++; - if (clunetReadingCurrentBit >= 8) // Переходим к следующему байту - { - clunetReadingCurrentByte++; - clunetReadingCurrentBit = 0; - if (clunetReadingCurrentByte < CLUNET_READ_BUFFER_SIZE) - dataToRead[clunetReadingCurrentByte] = 0; - else // Если буфер закончился - { - clunetReadingState = CLUNET_READING_STATE_IDLE; - return; - } - } - if ((clunetReadingCurrentByte > CLUNET_OFFSET_SIZE) && (clunetReadingCurrentByte > dataToRead[CLUNET_OFFSET_SIZE]+CLUNET_OFFSET_DATA)) - { - // Получили данные полностью, ура! - clunetReadingState = CLUNET_READING_STATE_IDLE; - char crc = check_crc((char*)dataToRead,clunetReadingCurrentByte); // Проверяем CRC - if (crc == 0) - clunet_data_received(dataToRead[CLUNET_OFFSET_SRC_ADDRESS], dataToRead[CLUNET_OFFSET_DST_ADDRESS], dataToRead[CLUNET_OFFSET_COMMAND], (char*)(dataToRead+CLUNET_OFFSET_DATA), dataToRead[CLUNET_OFFSET_SIZE]); - } - break; - } - } - else - { - clunetTimerStart = CLUNET_TIMER_REG; - clunetTimerPeriods = 0; - CLUNET_ENABLE_TIMER_OVF; - } -} - -void clunet_init() -{ - sei(); - CLUNET_SEND_INIT; - CLUNET_READ_INIT; - CLUNET_TIMER_INIT; - CLUNET_INIT_INT; -#ifdef CLUNET_ENABLE_INT - CLUNET_ENABLE_INT; -#warning CLUNET_ENABLE_INT is deprecated -#endif - char reset_source = MCUCSR; - clunet_send(CLUNET_BROADCAST_ADDRESS, CLUNET_PRIORITY_MESSAGE, CLUNET_COMMAND_BOOT_COMPLETED, &reset_source, 1); - MCUCSR = 0; -} - -int clunet_ready_to_send() // Возвращает 0, если готов к передаче, иначе приоритет текущей задачи -{ - if (clunetSendingState == CLUNET_SENDING_STATE_IDLE) return 0; - return clunetCurrentPrio; -} - -void clunet_set_on_data_received(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)) -{ - on_data_received = f; -} - -void clunet_set_on_data_received_sniff(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)) -{ - on_data_received_sniff = f; -} - diff --git a/clunet.h b/clunet.h deleted file mode 100644 index 5869611..0000000 --- a/clunet.h +++ /dev/null @@ -1,223 +0,0 @@ -/* Name: clunet.h - * Project: CLUNET network driver - * Author: Alexey Avdyukhin - * Creation Date: 2013-09-09 - * License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE - */ - -#ifndef __clunet_h_included__ -#define __clunet_h_included__ - -#include "bits.h" -#include "clunet_config.h" - -#define CLUNET_SENDING_STATE_IDLE 0 -#define CLUNET_SENDING_STATE_INIT 1 -#define CLUNET_SENDING_STATE_PRIO1 2 -#define CLUNET_SENDING_STATE_PRIO2 3 -#define CLUNET_SENDING_STATE_DATA 4 -#define CLUNET_SENDING_STATE_WAITING_LINE 6 -#define CLUNET_SENDING_STATE_PREINIT 7 -#define CLUNET_SENDING_STATE_STOP 8 -#define CLUNET_SENDING_STATE_DONE 9 - -#define CLUNET_READING_STATE_IDLE 0 -#define CLUNET_READING_STATE_INIT 1 -#define CLUNET_READING_STATE_PRIO1 2 -#define CLUNET_READING_STATE_PRIO2 3 -#define CLUNET_READING_STATE_HEADER 4 -#define CLUNET_READING_STATE_DATA 5 - -#define CLUNET_OFFSET_SRC_ADDRESS 0 -#define CLUNET_OFFSET_DST_ADDRESS 1 -#define CLUNET_OFFSET_COMMAND 2 -#define CLUNET_OFFSET_SIZE 3 -#define CLUNET_OFFSET_DATA 4 -#define CLUNET_BROADCAST_ADDRESS 0xFF - -#define CLUNET_COMMAND_DISCOVERY 0x00 -/* Поиск других устройств, параметров нет */ - -#define CLUNET_COMMAND_DISCOVERY_RESPONSE 0x01 -/* Ответ устройств на поиск, в качестве параметра - название устройства (текст) */ - -#define CLUNET_COMMAND_BOOT_CONTROL 0x02 -/* Работа с загрузчиком. Данные - субкоманда. -<-0 - загрузчик запущен -->1 - перейти в режим обновления прошивки -<-2 - подтверждение перехода, плюс два байта - размер страницы -->3 запись прошивки, 4 байта - адрес, всё остальное - данные (равные размеру страницы) -<-4 блок прошивки записан -->5 выход из режима прошивки */ - -#define CLUNET_COMMAND_REBOOT 0x03 -/* Перезагружает устройство в загрузчик. */ - -#define CLUNET_COMMAND_BOOT_COMPLETED 0x04 -/* Посылается устройством после инициализации библиотеки, сообщает об успешной загрузке устройства. Параметр - содержимое MCU регистра, говорящее о причине перезагрузки. */ - -#define CLUNET_COMMAND_DOOR_INFO 0x05 -/*Информация об открытии двери. -0 - закрыта -1 - открыта -2 - тревога */ - -#define CLUNET_COMMAND_DEVICE_POWER_INFO_REQUEST 0x06 -/* Запрашивает информацию о состоянии выключателей */ - -#define CLUNET_COMMAND_DEVICE_POWER_INFO 0x07 -/* Состояние выключателей. Параметр - битовая маска состояния выключателей. */ - -#define CLUNET_COMMAND_DEVICE_POWER_COMMAND 0x08 -/* Включает/выключает выключатели. Параметр - битовая маска. Для света 0xFE - убавить свет, а 0xFF - прибавить. */ - -#define CLUNET_COMMAND_SET_TIMER 0x09 -/* Установка таймера. Параметр - кол-во секунд (два байта) */ - -#define CLUNET_COMMAND_RC_BUTTON_PRESSED 0x0A -/* Нажата кнопка на пульте. Первый байт - тип кода, далее - номер кнопки. -На данный момент 01 - самый популярный стандарт (Sony вроде?) длина кода кнопки - 4 байта. -02 - удержание кнопки его же. */ - -#define CLUNET_COMMAND_RC_BUTTON_PRESSED_RAW 0x0B -/* Недекодированные данные о нажатой кнопке на пульте для нестандартных пультов. Идут пачками по 4 байта. 2 из которых - длительность сигнала и 2 - длительность его отсутствия в 0.032 долях миллисекунды. (1/8000000*256 сек) */ - -#define CLUNET_COMMAND_RC_BUTTON_SEND 0x0C -/* Заэмулировать кнопку пульта. Формат данных аналогичен CLUNET_COMMAND_RC_BUTTON_PRESSED, плюс в конце опциональный байт длительности удержания кнопки (кол-во дополнительных сигналов), для Sony это ~30мс */ - -#define CLUNET_COMMAND_RC_BUTTON_SEND_RAW 0x0D -/* Заэмулировать кнопку пульта на основе сырых данных. Формат данных аналогичен CLUNET_COMMAND_RC_BUTTON_PRESSED_RAW. */ - -#define CLUNET_COMMAND_LIGHT_LEVEL 0x0E -/* Сообщает об уровне освещения. Параметр - 2 байта (0x0000 - 0x1FFF, где 0x1FFF - 0 вольт между фотодиодом и землёй, а 0x0000 - 5 вольт). */ - -#define CLUNET_COMMAND_ONEWIRE_START_SEARCH 0x0F -/* Запуск поиска 1-wire устройств, данные пустые. */ - -#define CLUNET_COMMAND_ONEWIRE_DEVICE_FOUND 0x10 -/* Сообщает о найденном 1-wire устройсте. Данные - 8 байт, включающие тип устройства, серийный номер и CRC. */ - -#define CLUNET_COMMAND_TEMPERATURE 0x11 -/* Сообщает о температуре. 1 байт - тип устройства, 6 - серийник, 2 - температура в формате устройства (смотреть на тип, чтобы декодировать!) */ - -#define CLUNET_COMMAND_TIME 0x12 -/* Сообщает время. Шесть байт - часы, минуты, секунды, год (от 1900), месяц (от 0), день (от 1) */ - -#define CLUNET_COMMAND_WHEEL 0x13 -/* Сообщает обороты колеса мыши, первый байт - ID колеса, далее два байта - обороты */ - -#define CLUNET_COMMAND_VOLTAGE 0x14 -/* Сообщает напряжение на батарейке, первый байт - ID устройства, далее два байта - вольтаж, где 0x3FF = 5.12 */ - -#define CLUNET_COMMAND_MOTION 0x15 -/* Сообщает, что в помещении есть движение, первый байт - ID датчика/камеры */ - -#define CLUNET_COMMAND_INTERCOM_RING 0x16 -/* Звонок в домофон */ - -#define CLUNET_COMMAND_INTERCOM_MESSAGE 0x17 -/* Новое сообщение на автоответчике домофона, в данных 4 байта - номер сообщения */ - -#define CLUNET_COMMAND_INTERCOM_MODE_REQUEST 0x18 -/* Запрашивает режим работы домофона */ - -#define CLUNET_COMMAND_INTERCOM_MODE_INFO 0x19 -/* Сообщает режим работы домофона, первый байт - постоянный режим, второй - временный */ - -#define CLUNET_COMMAND_INTERCOM_MODE_SET 0x1A -/* Задаёт режим работы домофона, первый байт - постоянный режим (или 0xFF, чтобы не трогать), второй - временный (опционально) */ - -#define CLUNET_COMMAND_INTERCOM_RECORD_REQUEST 0x1B -/* Запрашивает запись у домофона, подтверждает доставку или завершает передачу - Если 4 байта, то это номер запрашиваемой записи - Если 1 байт, то 1 в случае подтверждения получения пакета, 0 - завершение передачи */ - -#define CLUNET_COMMAND_INTERCOM_RECORD_DATA 0x1C -/* Передаёт кусок записи с автоответчика. Первые 4 байта - номер записи, далее 4 байта - смещение от начала файла, всё далее - данные из файла */ - -#define CLUNET_COMMAND_PING 0xFE -/* Пинг, на эту команду устройство должно ответить следующей командой, возвратив весь буфер */ - -#define CLUNET_COMMAND_PING_REPLY 0xFF -/* Ответ на пинг, в данных то, что было прислано в предыдущей команде */ - -#define CLUNET_PRIORITY_NOTICE 1 -/* Приоритет пакета 1 - неважное уведомление, которое вообще может быть потеряно без последствий */ - -#define CLUNET_PRIORITY_INFO 2 -/* Приоритет пакета 2 - какая-то информация, не очень важная */ - -#define CLUNET_PRIORITY_MESSAGE 3 -/* Приоритет пакета 3 - сообщение с какой-то важной информацией */ - -#define CLUNET_PRIORITY_COMMAND 4 -/* Приоритет пакета 4 - команда, на которую нужно сразу отреагировать */ - -#ifndef CLUNET_T -#define CLUNET_T ((F_CPU / CLUNET_TIMER_PRESCALER) / 15625) -#endif -#if CLUNET_T < 8 -# error Timer frequency is too small, increase CPU frequency or decrease timer prescaler -#endif -#if CLUNET_T > 24 -# error Timer frequency is too big, decrease CPU frequency or increase timer prescaler -#endif - -#define CLUNET_0_T (CLUNET_T) -#define CLUNET_1_T (3*CLUNET_T) -#define CLUNET_INIT_T (10*CLUNET_T) - -#define CLUNET_CONCAT(a, b) a ## b -#define CLUNET_OUTPORT(name) CLUNET_CONCAT(PORT, name) -#define CLUNET_INPORT(name) CLUNET_CONCAT(PIN, name) -#define CLUNET_DDRPORT(name) CLUNET_CONCAT(DDR, name) - -#ifndef CLUNET_WRITE_TRANSISTOR -# define CLUNET_SEND_1 CLUNET_DDRPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN) -# define CLUNET_SEND_0 CLUNET_DDRPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN) -# define CLUNET_SENDING (CLUNET_DDRPORT(CLUNET_WRITE_PORT) & (1 << CLUNET_WRITE_PIN)) -# define CLUNET_SEND_INVERT CLUNET_DDRPORT(CLUNET_WRITE_PORT) ^= (1 << CLUNET_WRITE_PIN) -# define CLUNET_SEND_INIT { CLUNET_OUTPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN); CLUNET_SEND_0; } -#else -# define CLUNET_SEND_1 CLUNET_OUTPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN) -# define CLUNET_SEND_0 CLUNET_OUTPORT(CLUNET_WRITE_PORT) &= ~(1 << CLUNET_WRITE_PIN) -# define CLUNET_SENDING (CLUNET_OUTPORT(CLUNET_WRITE_PORT) & (1 << CLUNET_WRITE_PIN)) -# define CLUNET_SEND_INVERT CLUNET_OUTPORT(CLUNET_WRITE_PORT) ^= (1 << CLUNET_WRITE_PIN) -# define CLUNET_SEND_INIT { CLUNET_DDRPORT(CLUNET_WRITE_PORT) |= (1 << CLUNET_WRITE_PIN); CLUNET_SEND_0; } -#endif - -#define CLUNET_READ_INIT { CLUNET_DDRPORT(CLUNET_READ_PORT) &= ~(1 << CLUNET_READ_PIN); CLUNET_OUTPORT(CLUNET_READ_PORT) |= (1 << CLUNET_READ_PIN); } -#define CLUNET_READING (!(CLUNET_INPORT(CLUNET_READ_PORT) & (1 << CLUNET_READ_PIN))) - -#ifndef CLUNET_SEND_BUFFER_SIZE -# error CLUNET_SEND_BUFFER_SIZE is not defined -#endif -#ifndef CLUNET_READ_BUFFER_SIZE -# error CLUNET_READ_BUFFER_SIZE is not defined -#endif -#if CLUNET_SEND_BUFFER_SIZE > 255 -# error CLUNET_SEND_BUFFER_SIZE must be <= 255 -#endif -#if CLUNET_READ_BUFFER_SIZE > 255 -# error CLUNET_READ_BUFFER_SIZE must be <= 255 -#endif - -// Инициализация -void clunet_init(); - -// Отправка пакета -void clunet_send(unsigned char address, unsigned char prio, unsigned char command, char* data, unsigned char size); - -// Возвращает 0, если готов к передаче, иначе приоритет текущей задачи -int clunet_ready_to_send(); - -// Установка функций, которые вызываются при получении пакетов -// Эта - получает пакеты, которые адресованы нам -void clunet_set_on_data_received(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)); - -// А эта - абсолютно все, которые ходят по сети, включая наши -void clunet_set_on_data_received_sniff(void (*f)(unsigned char src_address, unsigned char dst_address, unsigned char command, char* data, unsigned char size)); - -char check_crc(char* data, unsigned char size); - -#endif diff --git a/clunet_config.h b/clunet_config.h index d630c2b..594cea9 100644 --- a/clunet_config.h +++ b/clunet_config.h @@ -5,7 +5,7 @@ * License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE */ - #ifndef __clunet_config_h_included__ +#ifndef __clunet_config_h_included__ #define __clunet_config_h_included__ // Адрес устройства (0-255) -- cgit v1.2.3