Skip to content

Commit

Permalink
upd
Browse files Browse the repository at this point in the history
  • Loading branch information
GyverLibs committed Aug 23, 2023
1 parent f017d2d commit 3ff6865
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 155 deletions.
74 changes: 37 additions & 37 deletions src/GBUS.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,29 @@

/*
Коды статусов и ошибок (tick() и getStatus()):
0 [GBUS_IDLE] - ожидание (холостой режим)
1 [TRANSMITTING] - передача
2 [TX_OVERFLOW] - буфер переполнен
3 [TX_COMPLETE] - передача завершена
4 [RECEIVING] - приём
5 [RX_ERROR] - ошибка приёма
6 [RX_ABORT] - ошибка. Приём прерван
7 [RX_OVERFLOW] - ошибка. Буфер или пакет переполнен
8 [RX_ADDRESS_ERROR] - ошибка. Не наш адрес
9 [RX_CRC_ERROR] - ошибка. Не совпадает CRC
10 [RX_REQUEST] - успешное получение запроса
11 [RX_DATA] - успешный приём данных
12 [RX_ACK] - успешное получение подтверждения
0 [GBUS_IDLE] - ожидание (холостой режим)
1 [TRANSMITTING] - передача
2 [TX_OVERFLOW] - буфер переполнен
3 [TX_COMPLETE] - передача завершена
4 [RECEIVING] - приём
5 [RX_ERROR] - ошибка приёма
6 [RX_ABORT] - ошибка. Приём прерван
7 [RX_OVERFLOW] - ошибка. Буфер или пакет переполнен
8 [RX_ADDRESS_ERROR] - ошибка. Не наш адрес
9 [RX_CRC_ERROR] - ошибка. Не совпадает CRC
10 [RX_REQUEST] - успешное получение запроса
11 [RX_DATA] - успешный приём данных
12 [RX_ACK] - успешное получение подтверждения
*/

/*
/*
Инициализация:
GBUS объект(обработчик, адрес, размер буфера)
- обработчик: адрес объекта-обработчика интерфейса (например &Serial, &mySerial)
- адрес: адрес этого устрйоства в сети
- размер буфера: размер буфера
Список методов:
Список методов:
tick() - отправляет и принимает данные. Вызывать хотя бы каждую миллисекунду. Возвращает коды статусов, тип GBUSstatus (enum)
getStatus() - возвращает коды статусов (такие же как tick()), тип GBUSstatus (enum)
Expand All @@ -40,13 +40,13 @@
readData(дата) - выводит данные из внутреннего буфера в указанную "переменную" (переменные, массивы, структуры)
sendRequest(адрес) - отправить "запрос" по адресу получателя
gotRequest() - вернёт true, если на наш адрес пришёл запрос. Сам сбрасывается в false. Адрес отправителя можно узнать в getTXaddress()
gotRequest() - вернёт true, если на наш адрес пришёл запрос. Сам сбрасывается в false. Адрес отправителя можно узнать в getTXaddress()
getTXaddress() - возвращает адрес отправителя с последнего успешного получения данных или запроса
isBusy() - возвращает true, если линия занята. Возвращает false, если с момента последнего общения по линии прошло GBUS_BUSY_TIMEOUT миллисекунд
sendAck(адрес) - отправляет ack (ответ на запрос) по адресу
gotAck() - вернёт true, если на наш адрес пришёл ack (ответ на запрос). Сам сбрасывается в false. Адрес отправителя можно узнать в getTXaddress()
gotAck() - вернёт true, если на наш адрес пришёл ack (ответ на запрос). Сам сбрасывается в false. Адрес отправителя можно узнать в getTXaddress()
waitAck(адрес, кол-во попыток, таймаут) - ждёт ответа с указанного адреса. Если не дожидается за таймаут - отправляет ещё реквест
И так далее пока не выйдет количество попыток.
Expand All @@ -68,7 +68,7 @@
ФУНКЦИЯ БЛОКИРУЮЩАЯ
Смотри примеры call_response_ack
sendRaw(байтовый массив, размер) - отправит сырые байты (без протокола) по шине. Смотри примеры в папке raw
sendRaw(байтовый массив, размер) - отправит сырые байты (без протокола) по шине. Смотри примеры в папке raw
gotRaw() - вернёт true, были приняты какие-то данные (приём завершён успешно). Сам сбрасывается в false.
rawSize() - вернёт количество принятых байт (последний успешный приём). Иначе вернёт 0
Expand All @@ -85,7 +85,7 @@
// ============================ НАСТРОЙКИ ================================
// таймаут отправки после предыдущей активности на линии, мкс
// он же МАКСИМАЛЬНЫЙ таймаут приёма (в процессе работы пересчитывается)
#define GBUS_BUSY_TIMEOUT 50000
#define GBUS_BUSY_TIMEOUT 50000

// =======================================================================

Expand Down Expand Up @@ -152,25 +152,25 @@ class GBUS {
// 0: приём идёт
// кол-во байт: передача завершена
int readBytesAsync(uint8_t* buffer, uint8_t size) {
while (port->available()) { // пока есть данные в буфере сериал
if (!_parseFlag) { // начало приёма
_parseFlag = true; // ключ на старт
_byteCount = 0; // сбросили счетчик
_timeout = GBUS_BUSY_TIMEOUT; // сбросили таймаут
while (port->available()) { // пока есть данные в буфере сериал
if (!_parseFlag) { // начало приёма
_parseFlag = true; // ключ на старт
_byteCount = 0; // сбросили счетчик
_timeout = GBUS_BUSY_TIMEOUT; // сбросили таймаут
}
buffer[_byteCount++] = port->read();// читаем
if (_byteCount == 2) _timeout = (micros() - _tmr) * 10; // таймаут как время передачи 10 бит
if (_byteCount > size) { // буфер переполнен
if (_byteCount == 2) _timeout = (micros() - _tmr) * 10; // таймаут как время передачи 10 бит
if (_byteCount > size) { // буфер переполнен
_parseFlag = false;
return -1;
}
_tmr = micros(); // сброс таймера (идёт приём)
_tmr = micros(); // сброс таймера (идёт приём)
return 0;
}

// таймаут ожидания приёма
if (_parseFlag && micros() - _tmr >= _timeout) {
_parseFlag = false; // приём окончен
_parseFlag = false; // приём окончен
return _byteCount;
}
return -2;
Expand Down Expand Up @@ -227,22 +227,22 @@ class GBUS {
// ждать ответа (блокирующая функция)
uint8_t sendRequestAck(uint8_t to, uint8_t tries, int timeout) {
sendRequest(to);
while (tick() == GBUS_IDLE); // ждём таймаут
while (tick() != TX_COMPLETE); // ждём отправку
while (tick() == GBUS_IDLE); // ждём таймаут
while (tick() != TX_COMPLETE); // ждём отправку
uint8_t thisTry = 0;
uint32_t tmr = millis();
while (1) {
tick(); // принимаем или отправляем
if (gotData()) return ACK_DATA; // приняли дату
if (gotAck()) return ACK_ONLY; // приняли ответ
if (millis() - tmr >= timeout) { // таймаут
tick(); // принимаем или отправляем
if (gotData()) return ACK_DATA; // приняли дату
if (gotAck()) return ACK_ONLY; // приняли ответ
if (millis() - tmr >= timeout) { // таймаут
tmr = millis();
thisTry++;
if (thisTry >= tries) return ACK_ERROR; // превышено количество попыток
sendRequest(to); // снова шлём запрос
if (thisTry >= tries) return ACK_ERROR; // превышено количество попыток
sendRequest(to); // снова шлём запрос
}
}
return ACK_ERROR; // не дождались
return ACK_ERROR; // не дождались
}


Expand Down
54 changes: 27 additions & 27 deletions src/GBUSmini.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ uint8_t GBUS_send_request_ack(uint8_t pin, uint8_t to, uint8_t from, uint8_t tri
if (thisTry >= tries) return ACK_ERROR;
GBUS_send_request(pin, to, from);
}
}
}
return ACK_ERROR;
}

Expand All @@ -33,25 +33,25 @@ bool GBUS_is_busy(uint8_t pin) {
// ********************* ЧТЕНИЕ **************************
// *******************************************************
uint8_t GBUS_read_raw(uint8_t pin, uint8_t* buf, uint8_t size) {
if (!digitalRead(pin)) { // проверяем старт бит (low)
delayMicroseconds(GBUS_BIT_2); // ждём половину времени
if (!digitalRead(pin)) { // если всё ещё старт бит (low)
int8_t bitCount = 0; // счётчик битов
uint8_t byteCount = 0; // счётчик байтов
while (1) {
delayMicroseconds(GBUS_BIT-GBUS_OFFSET_READ); // ждём бит
uint8_t bit = digitalRead(pin); // читаем
if (bitCount < 8) { // передача битов даты
bitWrite(buf[byteCount], bitCount, bit); // пишем в буфер
} else if (bitCount == 8) { // стоп бит (high)
if (!bit) return 0; // ошибка стоп бита. Завершаем
byteCount++; // счётчик собранных байтов
} else if (bitCount == 9) { // старт бит (low)
if (bit) return byteCount; // не дождались старт бита. Конец приёма, возврат количества
if (byteCount >= size) return 0; // буфер переполнен. Завершаем
bitCount = -1; // костыль
if (!digitalRead(pin)) { // проверяем старт бит (low)
delayMicroseconds(GBUS_BIT_2); // ждём половину времени
if (!digitalRead(pin)) { // если всё ещё старт бит (low)
int8_t bitCount = 0; // счётчик битов
uint8_t byteCount = 0; // счётчик байтов
while (1) {
delayMicroseconds(GBUS_BIT-GBUS_OFFSET_READ); // ждём бит
uint8_t bit = digitalRead(pin); // читаем
if (bitCount < 8) { // передача битов даты
bitWrite(buf[byteCount], bitCount, bit); // пишем в буфер
} else if (bitCount == 8) { // стоп бит (high)
if (!bit) return 0; // ошибка стоп бита. Завершаем
byteCount++; // счётчик собранных байтов
} else if (bitCount == 9) { // старт бит (low)
if (bit) return byteCount; // не дождались старт бита. Конец приёма, возврат количества
if (byteCount >= size) return 0; // буфер переполнен. Завершаем
bitCount = -1; // костыль
}
bitCount++; // следующий бит
bitCount++; // следующий бит
}
}
}
Expand All @@ -61,22 +61,22 @@ uint8_t GBUS_read_raw(uint8_t pin, uint8_t* buf, uint8_t size) {

// *******************************************************
uint8_t GBUS_read(uint8_t pin, uint8_t addr, uint8_t* buf, uint8_t size) {
uint8_t buf2[size + GBUS_OFFSET]; // буфер на приём
uint8_t bytes = GBUS_read_raw(pin, buf2, (size + GBUS_OFFSET)); // принимаем, получаем количество байт посылки
if (buf2[0] == bytes && (buf2[1] == addr || buf2[1] == 255)) { // если совпало количество байт и адрес
uint8_t buf2[size + GBUS_OFFSET]; // буфер на приём
uint8_t bytes = GBUS_read_raw(pin, buf2, (size + GBUS_OFFSET)); // принимаем, получаем количество байт посылки
if (buf2[0] == bytes && (buf2[1] == addr || buf2[1] == 255)) { // если совпало количество байт и адрес
#if (GBUS_CRC == 1)
if (GBUS_crc_bytes(buf2, bytes) != 0) return 0;
#endif
for (uint8_t i = 0; i < bytes - GBUS_OFFSET; i++) buf[i] = buf2[i + 3]; // переписываем в буфер в скетче
return buf2[2]; // возвращаем адрес
for (uint8_t i = 0; i < bytes - GBUS_OFFSET; i++) buf[i] = buf2[i + 3]; // переписываем в буфер в скетче
return buf2[2]; // возвращаем адрес
}
return 0; // иначе возвращаем ошибку
return 0; // иначе возвращаем ошибку
}

// *******************************************************
// структура буфера: [0, адрес получателя, адрес отправителя, CRC]
uint8_t GBUS_read_request(uint8_t pin, uint8_t addr) {
uint8_t buf[GBUS_OFFSET];
uint8_t buf[GBUS_OFFSET];
if (GBUS_read_raw(pin, buf, GBUS_OFFSET) == GBUS_OFFSET
&& (buf[1] == addr || buf[1] == 255)
#if (GBUS_CRC == 1)
Expand All @@ -89,7 +89,7 @@ uint8_t GBUS_read_request(uint8_t pin, uint8_t addr) {
// *******************************************************
// структура буфера: [1, адрес получателя, адрес отправителя, CRC]
uint8_t GBUS_read_ack(uint8_t pin, uint8_t addr) {
uint8_t buf[GBUS_OFFSET];
uint8_t buf[GBUS_OFFSET];
if (GBUS_read_raw(pin, buf, GBUS_OFFSET) == GBUS_OFFSET
&& (buf[1] == addr || buf[1] == 255)
#if (GBUS_CRC == 1)
Expand Down
8 changes: 4 additions & 4 deletions src/GBUSmini.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
// ==================== СТАНДАРТНЫЕ НАСТРОЙКИ ======================
// могут быть изменены здесь, либо прямо в скетче при помощи дефайна ПЕРЕД ПОДКЛЮЧЕНИЕМ БИБЛИОТЕКИ
// дефайны в скетч соответственно GBUS_SPEED, GBUS_OFFSET_WRITE, GBUS_OFFSET_READ
#define GBUS_DEFAULT_SPEED 400 // скорость (baud)
#define GBUS_DEFAULT_WRITE 8 // коррекция задержки записи, мкс
#define GBUS_DEFAULT_READ 5 // коррекция задержки чтения, мкс
#define GBUSMINI_BUSY_TIMEOUT 50 // таймаут отправки после предыдущей активности на линии, мс
#define GBUS_DEFAULT_SPEED 400 // скорость (baud)
#define GBUS_DEFAULT_WRITE 8 // коррекция задержки записи, мкс
#define GBUS_DEFAULT_READ 5 // коррекция задержки чтения, мкс
#define GBUSMINI_BUSY_TIMEOUT 50 // таймаут отправки после предыдущей активности на линии, мс

// ========== ЛЁГКИЕ ФУНКЦИИ ОТПРАВКИ И ЧТЕНИЯ GBUS ==========
// По одному проводу
Expand Down
Loading

0 comments on commit 3ff6865

Please sign in to comment.