Skip to content

Commit

Permalink
прием от рации есть, но нужно парсить каждый тип строки
Browse files Browse the repository at this point in the history
  • Loading branch information
iamsaywhat committed Mar 12, 2020
1 parent 574e488 commit 0cac6f9
Show file tree
Hide file tree
Showing 4 changed files with 219 additions and 64 deletions.
59 changes: 56 additions & 3 deletions BUP.uvoptx
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@
<Type>0</Type>
<LineNumber>101</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134257292</Address>
<Address>134257968</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
Expand All @@ -157,6 +157,54 @@
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>237</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134255210</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>.\custom.drivers\radiostation.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>2</Number>
<Type>0</Type>
<LineNumber>218</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134252774</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>.\custom.drivers\radiostation.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>3</Number>
<Type>0</Type>
<LineNumber>241</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\custom.drivers\radiostation.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
<Ww>
Expand Down Expand Up @@ -246,6 +294,11 @@
<WinNumber>2</WinNumber>
<ItemText>SNS_position</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>2</WinNumber>
<ItemText>buffer</ItemText>
</Ww>
</WatchWindow2>
<MemoryWindow1>
<Mm>
Expand Down Expand Up @@ -291,7 +344,7 @@

<Group>
<GroupName>source</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
Expand Down Expand Up @@ -638,7 +691,7 @@
<GroupNumber>6</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<Focus>0</Focus>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
Expand Down
27 changes: 23 additions & 4 deletions custom.drivers/include/radiostation.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,39 @@ typedef __packed struct{
uint8_t index;
uint8_t address;
uint16_t lenght;
uint8_t dataType;
uint16_t dataLenght;
uint16_t crc;
}RadioBaseFrame;

typedef __packed struct{
uint8_t type;
uint16_t lenght;
uint8_t* data;
}RadioDataFrame;

typedef union {
RadioBaseFrame Struct;
uint8_t Buffer[9];
uint8_t Buffer[6];
}RadioBaseFrameType;

void sendToRadio(uint8_t *data, uint8_t size);
typedef union {
RadioDataFrame Struct;
uint8_t Buffer[7];
}RadioDataFrameType;

typedef enum{
RADIO_WRONG_CRC,
RADIO_WRONG_INDEX,
RADIO_TIMEOUT,
RADIO_SUCCES,
RADIO_FAILED,
}RadioStatus;


void Radio_send(uint8_t index, uint8_t *data, uint8_t size);


void getDeviceName(void);
void sendEmpty(void);


#endif
178 changes: 131 additions & 47 deletions custom.drivers/radiostation.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
#include "otherlib.h"
#include "crc16.h"
#include "MDR32F9Qx_uart.h"
#include <string.h>

uint8_t buffer[200];
uint8_t frameIndex = 0;

enum DataType{
AUDIO = 2,
Expand Down Expand Up @@ -64,94 +67,175 @@ static void Radio_deinitialize (void)
static uint16_t receiveByte(MDR_UART_TypeDef* UARTx);
static int16_t sendByte (MDR_UART_TypeDef* UARTx, uint16_t byte);
static uint16_t sendFend (MDR_UART_TypeDef* UARTx);
static uint32_t swapUint16 (uint16_t value);
static uint16_t swapUint16 (uint16_t value);
static uint32_t swapUint32 (uint32_t value);
static RadioStatus Radio_receive(uint8_t index, uint8_t* data);

RadioStatus parseForDeviceName(uint8_t *data);

void sendToRadio(uint8_t *data, uint8_t size)
void Radio_send(uint8_t index, uint8_t *data, uint8_t size)
{
TimeoutType timeout;
RadioBaseFrameType radioData;
static uint8_t frameIndex = 0;
RadioBaseFrameType baseFrame;
RadioDataFrameType dataFrame;
uint16_t packetSize;
uint8_t special[2] = {0x0D, 0x0A};

Radio_initialize();

while (UART_GetFlagStatus (RADIO_UART, UART_FLAG_RXFE) != SET) /* Вычищаем FIFO от мусора и ждем пока не появится заголовок */
uint16_t i;

while (UART_GetFlagStatus (RADIO_UART, UART_FLAG_RXFE) != SET) // Вычищаем FIFO приёмника от мусора
UART_ReceiveData(RADIO_UART);

if (size == 0) // Как минимум пакет будет состоять из 6 байт
packetSize = 6;
else // Индекс, адрес, длина(4 байта) + тип данных, длина данных(3 байта)
packetSize = 11 + size; // + данные(size байт) + спецсимволы:0D,0A(2байта) + crc(2 байта)

radioData.Struct.index = frameIndex;
radioData.Struct.address = 1;
radioData.Struct.lenght = packetSize-6;
radioData.Struct.dataType = AT_COMMAND;
radioData.Struct.dataLenght = size+2;
radioData.Struct.crc = 0xFFFF;

// Для удобства отправления перевернём в big-endian
radioData.Struct.lenght = swapUint16(radioData.Struct.lenght);
radioData.Struct.dataLenght = swapUint16(radioData.Struct.dataLenght);
// Формируем базовый пакет
baseFrame.Struct.index = index;
baseFrame.Struct.address = 1;
baseFrame.Struct.lenght = packetSize-6;
baseFrame.Struct.crc = CRC16_INITIAL_FFFF;
// Пакет данных
dataFrame.Struct.type = AT_COMMAND;
dataFrame.Struct.lenght = size+2;
dataFrame.Struct.data = data;

// Радиостанция в big-endian, а мы в little-endian, поэтому перевернём поля
baseFrame.Struct.lenght = swapUint16(baseFrame.Struct.lenght);
dataFrame.Struct.lenght = swapUint16(dataFrame.Struct.lenght);

// Подсчитываем контрольную сумму
radioData.Struct.crc = Crc16(&radioData.Buffer[0], 4, radioData.Struct.crc);
// Подсчитываем контрольную сумму базовой части
baseFrame.Struct.crc = Crc16(&baseFrame.Buffer[0], 4, baseFrame.Struct.crc);
// Если данные есть, до досчитываем кс с учетом их
if(size != 0) {
radioData.Struct.crc = Crc16(&radioData.Buffer[4], 3, radioData.Struct.crc);
radioData.Struct.crc = Crc16(data, size, radioData.Struct.crc);
radioData.Struct.crc = Crc16(special, 2, radioData.Struct.crc);
baseFrame.Struct.crc = Crc16(&dataFrame.Buffer[0], 3, baseFrame.Struct.crc);
baseFrame.Struct.crc = Crc16(data, size, baseFrame.Struct.crc);
baseFrame.Struct.crc = Crc16(special, 2, baseFrame.Struct.crc);
}


radioData.Struct.crc = swapUint16(radioData.Struct.crc);
// Контрольную сумму тоже перевернем в big endian
baseFrame.Struct.crc = swapUint16(baseFrame.Struct.crc);

// Начинаем отправлять
sendFend (RADIO_UART);
for(uint16_t i = 0; i < 4; i++)
sendByte (RADIO_UART, radioData.Buffer[i]);
// Базовая часть пакета
for(i = 0; i < 4; i++)
sendByte (RADIO_UART, baseFrame.Buffer[i]);
// Пакет данных
if(size != 0) {
for(uint16_t i = 4; i < 7; i++)
sendByte (RADIO_UART, radioData.Buffer[i]);
for(uint16_t i = 0; i < size; i++)
for(i = 0; i < 3; i++)
sendByte (RADIO_UART, dataFrame.Buffer[i]);
for(i = 0; i < size; i++)
sendByte (RADIO_UART, data[i]);
for(uint16_t i = 0; i < 2; i++)
for(i = 0; i < 2; i++)
sendByte(RADIO_UART, special[i]);
}
for(uint16_t i = 7; i < 9; i++)
sendByte (RADIO_UART, radioData.Buffer[i]);
// Контрольная сумма всего пакета
for(i = 4; i < 6; i++)
sendByte (RADIO_UART, baseFrame.Buffer[i]);

// sendFend (RADIO_UART);
//sendFend (RADIO_UART);

// Дождемся пока все отправится из FIFO
setTimeout (&timeout, RADIO_FIFO_TIMEOUT);
while ((UART_GetFlagStatus (RADIO_UART, UART_FLAG_TXFE) != SET)
&& (timeoutStatus(&timeout) != TIME_IS_UP));

uint8_t temp;
for(uint16_t i = 0; i < packetSize; i++)
temp = receiveByte(RADIO_UART);

Radio_deinitialize();

frameIndex++;
}

static void receiveFromRadio(uint8_t* data)
RadioStatus Radio_receive(uint8_t index, uint8_t* data)
{

}
TimeoutType timeout;
RadioBaseFrameType baseFrame;
uint16_t crc = CRC16_INITIAL_FFFF;
uint16_t i;

setTimeout (&timeout, RADIO_RECEIVE_TIMEOUT); /* Ожидаем начало фрейма 0xC0 */
while(timeoutStatus(&timeout) != TIME_IS_UP){
if(receiveByte(RADIO_UART) == FEND)
break;
}
if(timeout.status == TIME_IS_UP) /* Если был таймаут, значит связи нет, можно отключиться */
return RADIO_TIMEOUT;

// Базовая часть пакета
for(i = 0; i < 4; i++){
baseFrame.Buffer[i] = receiveByte(RADIO_UART);
crc = Crc16(&baseFrame.Buffer[i], 1, crc);
}
baseFrame.Struct.lenght = swapUint16(baseFrame.Struct.lenght);
// Поле данных
for(i = 0; i < baseFrame.Struct.lenght; i++)
{
data[i] = receiveByte(RADIO_UART); // Целиком записываем в буфер
crc = Crc16(&data[i], 1, crc); // И пока только считаем контрольную сумму
}
// Контрольная сумма
for(i = 4; i < 6; i++)
baseFrame.Buffer[i] = receiveByte(RADIO_UART);

// Проверка контрольной суммы и индекса кадра
crc = swapUint16(crc);
if(crc != baseFrame.Struct.crc)
return RADIO_WRONG_CRC;
if(baseFrame.Struct.index != index)
return RADIO_WRONG_INDEX;

return RADIO_SUCCES;
}



void sendEmpty(void)
{
TimeoutType timeout;
setTimeout (&timeout, 100);
Radio_initialize();
Radio_send(frameIndex, 0, 0);
while ((Radio_receive(frameIndex, buffer) != RADIO_SUCCES) && (timeoutStatus(&timeout) != TIME_IS_UP))
Radio_send(frameIndex, 0, 0);
Radio_deinitialize();
frameIndex++;
}
void getDeviceName(void)
{
uint8_t data[] = "ATI";
TimeoutType timeout;

setTimeout (&timeout, 100);
Radio_initialize();
Radio_send(frameIndex, data, sizeof(data)-1);
while (timeoutStatus(&timeout) != TIME_IS_UP){
if(Radio_receive(frameIndex, buffer) != RADIO_SUCCES){
Radio_send(frameIndex, 0, 0);
continue;
}
if(parseForDeviceName (buffer) != RADIO_SUCCES){
frameIndex++;
Radio_send(frameIndex, 0, 0);
continue;
}

}
memset(buffer, 0, 0x10);
Radio_deinitialize();
frameIndex++;
}

RadioStatus parseForDeviceName(uint8_t *data)
{
const char name[] = {0xD0, 0x2D, 0x31, 0x38, 0x37, 0x2D, 0xCF, 0x31, 0x0A};
RadioDataFrameType dataFrame;
dataFrame.Struct.type = data[0];
dataFrame.Struct.lenght = *((uint16_t*)(data+1));
dataFrame.Struct.data = data;
dataFrame.Struct.lenght = swapUint16(dataFrame.Struct.lenght);

if(dataFrame.Struct.type != AT_COMMAND ||
dataFrame.Struct.lenght != 0x08 ||
strncmp(name, (char*)(data+3), 8) != 0)
return RADIO_FAILED;
else
return RADIO_SUCCES;
}



Expand Down Expand Up @@ -252,7 +336,7 @@ uint16_t receiveByte(MDR_UART_TypeDef* UARTx)
}
return byte;
}
uint32_t swapUint16 (uint16_t value)
uint16_t swapUint16 (uint16_t value)
{
return (uint16_t)((value & 0x00FF) << 8 | (value & 0xFF00) >> 8);
}
Expand Down
Loading

0 comments on commit 0cac6f9

Please sign in to comment.