Согласующее устройство (LC) на ARDUINO

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

По нормальному есть объект FT897D (так называется библиотека)

Это не библиотека, это срань гассподня.  Давай тебе другую запилим, с краплёными картами и неразборчивыми бл.дями.  Типа такого чонить: 

dtsFT897D.h


// Не совсем трезвый аффтар DetSimen сентябрь 2020 
//
#pragma once

#include <Arduino.h>
#include <SoftwareSerial.h>


const bool ON = true;
const bool OFF = false;


#pragma pack(push,1)

struct FT897DCommand {    // буфер команд
	union {
		struct {
			uint8_t Byte0;
			uint8_t Byte1;
			uint8_t Byte2;
			uint8_t Byte3;
		};
		uint8_t AsBytes[4];
	};
	uint8_t Command;
};

const uint8_t COMMAND_SIZE = sizeof(FT897DCommand);

#pragma pack(pop)

enum class OperatingMode : uint8_t {
	LSB = 0x00,
	USB = 0x01,
	CW  = 0x02,
	CWR = 0x03,
	AM  = 0x04,
	FM  = 0x08,
	DIG = 0x0A,
	PKT = 0x0C,
	FMN = 0x88
};

const uint8_t CMD_LOCK_ON	= 0x00;		// блокировка вкл/выкл
const uint8_t CMD_LOCK_OFF	= 0x80;

const uint8_t CMD_PTT_ON	= 0x08;		// тангента вкл/выкл
const uint8_t CMD_PTT_OFF	= 0x88;

const uint8_t CMD_SET_OPERATING_MODE = 0x07;

const uint8_t CMD_CLAR_ON	= 0x05;  // Подстройка частоты (ON | OFF)
const uint8_t CMD_CLAR_OFF	= 0x85;

const uint8_t CMD_SET_MAIN_FREQ = 0x01; // установка частоты PLL




class dtsFT897D {
protected:
	SoftwareSerial& FPort;
	FT897DCommand   FCommand;

	dtsFT897D() = delete;
	dtsFT897D(dtsFT897D& rvalue) = delete;

	void ClearCmdBuffer(void);   // Очищает(обнуляет) буфер комманд. Для внутреннего использования.

	void SendCommand(void) const; // Посылает 5 байт команд и данных в устройство

public:
	dtsFT897D(SoftwareSerial& ASerialPort); // конструктор. Принимает ранее созданный SoftwareSerial
    
	void Init(const uint32_t ABaudRate = 9600); // инициализация класса

	void SetLock(const bool AValue);  // AValue == (ON | OFF)  блокировка вкл/выкл

	void SetPTT(const bool AValue);   // AValue == (ON | OFF)  тангента вкл/выкл

	void SetMode(const OperatingMode AMode = OperatingMode::CW); // по умолчанию рабочий режим - ключ

	void SetCLAR(const bool AValue);  // AValue == (ON | OFF)  подстройка частоты вкл/выкл

	void SetMainFreq(const float AMainFreq); // Установка частоты в понятных цифрах, например 14.1234 MHz

};

dtsFT897D.cpp

 

#include "dtsFT897D.h"

void dtsFT897D::ClearCmdBuffer(void)
{
	memset(&FCommand, 0, COMMAND_SIZE);
}

void dtsFT897D::SendCommand(void) const
{
		FPort.write((uint8_t *)(&FCommand), COMMAND_SIZE);
}

void dtsFT897D::Init(const uint32_t ABaudRate)
{
	FPort.begin(ABaudRate);    // настроить скорость Software порта. По умолчанию == 9600
	delay(20);
	SetMode();                 // после инициализации переключить рабочий режим на ключ (по умолчанию)
}

void dtsFT897D::SetLock(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_LOCK_ON : CMD_LOCK_OFF;
	SendCommand();
}

void dtsFT897D::SetPTT(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_PTT_ON : CMD_PTT_OFF;
	SendCommand();

}

void dtsFT897D::SetMode(const OperatingMode AMode)
{
	ClearCmdBuffer();
	FCommand.Byte0 = static_cast<uint8_t>(AMode);
	FCommand.Command = CMD_SET_OPERATING_MODE;
	SendCommand();
}

void dtsFT897D::SetCLAR(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_CLAR_ON : CMD_CLAR_OFF;
	SendCommand();
}

void dtsFT897D::SetMainFreq(const float AMainFreq)
{
	const uint8_t BUFFER_LENGTH = 11;
	static char OutStr[BUFFER_LENGTH+1];

	memset(OutStr, '0', BUFFER_LENGTH);
	OutStr[BUFFER_LENGTH] = 0x00;

	const uint32_t MAX_FREQUENCY = 99999999;
	uint32_t WorkFreq = round(AMainFreq * 1000000);
	if (WorkFreq > MAX_FREQUENCY) WorkFreq = MAX_FREQUENCY;

	char* ptr = &OutStr[2];
	if (AMainFreq > 10.0) ptr--;
	if (AMainFreq > 100.0) ptr--;

	ltoa(WorkFreq, ptr, 10);

	ClearCmdBuffer();

	uint8_t *cmdptr = &FCommand.AsBytes[0];
	uint8_t index = 0;

	for (uint8_t i = 0; i < 4; ++i) {
		cmdptr[i] = ((OutStr[index] - '0') << 4) | (OutStr[index + 1] - '0');
		index += 2;
	}

	FCommand.Command = CMD_SET_MAIN_FREQ;

	SendCommand();
}

dtsFT897D::dtsFT897D(SoftwareSerial& ASerialPort) : FPort(ASerialPort)
{
	ClearCmdBuffer();
}

использование 

/*
 Name:		Test_FT897D.ino
 Created:	25.09.2020 7:06:13
 Author:	DtS
*/

#include <SoftwareSerial.h>
#include "dtsFT897D.h"

SoftwareSerial RadioPort(8,7);

dtsFT897D Radio(RadioPort);

void setup() {
	Radio.Init(9600);
	Radio.SetMainFreq(14.256);
	

}


void loop() {
}

Дальше продолжать, или нуёнах?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

По нормальному есть объект FT897D (так называется библиотека)

Это не библиотека, это срань гассподня.  Давай тебе другую запилим, с краплёными картами и неразборчивыми бл.дями.  Типа такого чонить: 

dtsFT897D.h


// Не совсем трезвый аффтар DetSimen сентябрь 2020 
//
#pragma once

#include <Arduino.h>
#include <SoftwareSerial.h>


const bool ON = true;
const bool OFF = false;


#pragma pack(push,1)

struct FT897DCommand {    // буфер команд
	union {
		struct {
			uint8_t Byte0;
			uint8_t Byte1;
			uint8_t Byte2;
			uint8_t Byte3;
		};
		uint8_t AsBytes[4];
	};
	uint8_t Command;
};

const uint8_t COMMAND_SIZE = sizeof(FT897DCommand);

#pragma pack(pop)

enum class OperatingMode : uint8_t {
	LSB = 0x00,
	USB = 0x01,
	CW  = 0x02,
	CWR = 0x03,
	AM  = 0x04,
	FM  = 0x08,
	DIG = 0x0A,
	PKT = 0x0C,
	FMN = 0x88
};

const uint8_t CMD_LOCK_ON	= 0x00;		// блокировка вкл/выкл
const uint8_t CMD_LOCK_OFF	= 0x80;

const uint8_t CMD_PTT_ON	= 0x08;		// тангента вкл/выкл
const uint8_t CMD_PTT_OFF	= 0x88;

const uint8_t CMD_SET_OPERATING_MODE = 0x07;

const uint8_t CMD_CLAR_ON	= 0x05;  // Подстройка частоты (ON | OFF)
const uint8_t CMD_CLAR_OFF	= 0x85;

const uint8_t CMD_SET_MAIN_FREQ = 0x01; // установка частоты PLL




class dtsFT897D {
protected:
	SoftwareSerial& FPort;
	FT897DCommand   FCommand;

	dtsFT897D() = delete;
	dtsFT897D(dtsFT897D& rvalue) = delete;

	void ClearCmdBuffer(void);   // Очищает(обнуляет) буфер комманд. Для внутреннего использования.

	void SendCommand(void) const; // Посылает 5 байт команд и данных в устройство

public:
	dtsFT897D(SoftwareSerial& ASerialPort); // конструктор. Принимает ранее созданный SoftwareSerial
    
	void Init(const uint32_t ABaudRate = 9600); // инициализация класса

	void SetLock(const bool AValue);  // AValue == (ON | OFF)  блокировка вкл/выкл

	void SetPTT(const bool AValue);   // AValue == (ON | OFF)  тангента вкл/выкл

	void SetMode(const OperatingMode AMode = OperatingMode::CW); // по умолчанию рабочий режим - ключ

	void SetCLAR(const bool AValue);  // AValue == (ON | OFF)  подстройка частоты вкл/выкл

	void SetMainFreq(const float AMainFreq); // Установка частоты в понятных цифрах, например 14.1234 MHz

};

dtsFT897D.cpp

 

#include "dtsFT897D.h"

void dtsFT897D::ClearCmdBuffer(void)
{
	memset(&FCommand, 0, COMMAND_SIZE);
}

void dtsFT897D::SendCommand(void) const
{
		FPort.write((uint8_t *)(&FCommand), COMMAND_SIZE);
}

void dtsFT897D::Init(const uint32_t ABaudRate)
{
	FPort.begin(ABaudRate);    // настроить скорость Software порта. По умолчанию == 9600
	delay(20);
	SetMode();                 // после инициализации переключить рабочий режим на ключ (по умолчанию)
}

void dtsFT897D::SetLock(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_LOCK_ON : CMD_LOCK_OFF;
	SendCommand();
}

void dtsFT897D::SetPTT(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_PTT_ON : CMD_PTT_OFF;
	SendCommand();

}

void dtsFT897D::SetMode(const OperatingMode AMode)
{
	ClearCmdBuffer();
	FCommand.Byte0 = static_cast<uint8_t>(AMode);
	FCommand.Command = CMD_SET_OPERATING_MODE;
	SendCommand();
}

void dtsFT897D::SetCLAR(const bool AValue)
{
	ClearCmdBuffer();
	FCommand.Command = (AValue == ON) ? CMD_CLAR_ON : CMD_CLAR_OFF;
	SendCommand();
}

void dtsFT897D::SetMainFreq(const float AMainFreq)
{
	const uint8_t BUFFER_LENGTH = 11;
	static char OutStr[BUFFER_LENGTH+1];

	memset(OutStr, '0', BUFFER_LENGTH);
	OutStr[BUFFER_LENGTH] = 0x00;

	const uint32_t MAX_FREQUENCY = 99999999;
	uint32_t WorkFreq = round(AMainFreq * 1000000);
	if (WorkFreq > MAX_FREQUENCY) WorkFreq = MAX_FREQUENCY;

	char* ptr = &OutStr[2];
	if (AMainFreq > 10.0) ptr--;
	if (AMainFreq > 100.0) ptr--;

	ltoa(WorkFreq, ptr, 10);

	ClearCmdBuffer();

	uint8_t *cmdptr = &FCommand.AsBytes[0];
	uint8_t index = 0;

	for (uint8_t i = 0; i < 4; ++i) {
		cmdptr[i] = ((OutStr[index] - '0') << 4) | (OutStr[index + 1] - '0');
		index += 2;
	}

	FCommand.Command = CMD_SET_MAIN_FREQ;

	SendCommand();
}

dtsFT897D::dtsFT897D(SoftwareSerial& ASerialPort) : FPort(ASerialPort)
{
	ClearCmdBuffer();
}

использование 

/*
 Name:		Test_FT897D.ino
 Created:	25.09.2020 7:06:13
 Author:	DtS
*/

#include <SoftwareSerial.h>
#include "dtsFT897D.h"

SoftwareSerial RadioPort(8,7);

dtsFT897D Radio(RadioPort);

void setup() {
	Radio.Init(9600);
	Radio.SetMainFreq(14.256);
	

}


void loop() {
}

Дальше продолжать, или нуёнах?

Вот, это уже слова МУЖА )))
Это не мне, это всему радиолюбительскому сообществу...

Ещё бы и для ICOM и KENWOOD...

Как ты угадал, о каком глобальном косяке я говорю...
К девайсу может быть подключен один из аппаратов, то-есть занимать они будут один и тот же
мягкий серийный порт, при таком подходе и подключаться будет та библиотека, под которую плата
сконфигурирована до стадии компиляции...а если будут свободные пины то можно и всё что угодно,
правда мягкий серийный вроде как два экземпляра класса не комильфо, (лично не проверял)

А если сподобишься переписать, буду благодарен...(отпишу Андрюхе чтобы обещанную мне бутылочку собственно приготовленного коньяка в бочке из колотого Кавказского дуба отправил тебе, да он и сам питает к тебе щенячью сыновью любовь как видишь...так что думаю благоволит...)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Про конкретно этого Андрюху, с коньяком, не знаю. 

Буду пилить по вечерам. 

Проясни момент, страница 62 русского мануала 

То, что красным обведено, это ашыпка или нет?  P1 = 0 и при +OFFSET и при -OFFSET, так и должно быть? 

В Дедокоде разберешься? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я на github создам проект, ссылку дам, будешь качать оттудова и проверять, у мня такого трасивера нету, придётся тебе быть моими проверяющими руками

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Я на github создам проект, ссылку дам, будешь качать оттудова и проверять, у мня такого трасивера нету, придётся тебе быть моими проверяющими руками


да без проблем, их есть у меня, сейчас посмотрю английский мануал, что там

там аналогично, на CLAR стоит энкодер, то-есть команда задает максимальную частоту расстройки, вращением вправо или влево задаётся шаг расстройки, видимо до этого максимального значения...
используется экспедициями для работы на разнесённых частотах, чтобы оперативность раз в пять поднять

 

Morroc
Offline
Зарегистрирован: 24.10.2016

ua6em пишет:

К девайсу может быть подключен один из аппаратов, то-есть занимать они будут один и тот же
мягкий серийный порт, при таком подходе и подключаться будет та библиотека, под которую плата
сконфигурирована

Вот честно говоря не понимаю зачем для этого вся эта обьектная хрень и тем более зачем подобная библиотека тюнеру. Какая то красивость ради красивости.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Morroc][quote=ua6em пишет:
не понимаю зачем для этого вся эта обьектная хрень

Один объект - один тюнер.  Инкапсуляция, панимаешь... 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

если будет библиотека можно реализовать красивый выносной дисплей к этим аппаратам, он там конечно маловат, а аппарат очень распространённый, универсальный ведь, и КВ и УКВ и через спутники и цифровая связь, а коль объектно будет реализовано, можно и сплиттер замутить, принять софтовым отдать хардовым сериалом, а если использовать 328PB там два хардовых сериала, можно подключить будет и тюнер и усилитель

кстати библиотека даже в том виде рабочая, есть еще одна библиотека Кубинца, она имитирует FT-897, так вот в связке они работают, мне надо было только частоту от имитатора, всё отрабатывало как надо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

кстати библиотека даже в том виде рабочая, есть еще одна библиотека Кубинца, она имитирует FT-897, так вот в связке они работают

Дак если работают, нахрена тада новую пилить? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

сейчас посмотрю английский мануал, что там

там аналогично

Нихрена. Если -OFFSET, то P1 == 1; если +OFFSET, то P1 == 0;

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Morroc пишет:
Вот честно говоря не понимаю зачем для этого вся эта обьектная хрень

Если, как ТС сказал, у него есть еще трансиверы ICOM и KENWOOD, и, если управляются оне примерно одинаково, можно написать интерфейсный абстрактный класс, и от него унаследовать эти 3 трансивера, тогда переключать их можно лиарьно 1 кнопкой. 

Morroc
Offline
Зарегистрирован: 24.10.2016

Это уже какой то монстр получается )

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Morroc пишет:
Это уже какой то монстр получается )

Это полиморфизм и все прелести разделяемого кода. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

кстати библиотека даже в том виде рабочая, есть еще одна библиотека Кубинца, она имитирует FT-897, так вот в связке они работают

Дак если работают, нахрена тада новую пилить? 

1. Да кто её досконально проверял? Там куча ошибок, первой мыслью когда находил и видел, что делается было - если они также и барышень танцуют, как код пишут, бедные их барышни, да даже элиментарное, когда инициализация физических портов идёт внутри библиотеки говорит само за себя

2. 80-90 процентов на рынке  шарманок - yaesu ft-817/ft-857/ft-897

3. по интерфейсу, можно наверно сделать абстрактный класс, так как для стыковки разной аппаратуры и ПО используется программа OMNI-RIG, она небольшая, 1.5мгб, а конфигурацию для выбора конкретной модели она берёт из ini файла, но там всё таки не всё пушисто

4. у ICOM сделано идеологически более правильно, интерфейс CI-V, физически своя передача замыкается на свой приём через диод, а также сигнал TX через резистор 470 ом - выход на общую шину, то-есть интерфейс получается однопроводный, каждый девайс имеет свой именной адрес устройства, это позволяет подцепить к общей шине до 127 разных устройств, пакет команды разной длины, но есть начальные синхронизирующие байты, тело пакета и конечный завершающий байт

5. я уже задумку под твою библиотеку намерился делать, для себя )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

сейчас посмотрю английский мануал, что там

там аналогично

Нихрена. Если -OFFSET, то P1 == 1; если +OFFSET, то P1 == 0;

где вычитал? я смотрел 847/857/897 - там как на картинке

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

DetSimen пишет:

ua6em пишет:

сейчас посмотрю английский мануал, что там

там аналогично

Нихрена. Если -OFFSET, то P1 == 1; если +OFFSET, то P1 == 0;

где вычитал? я смотрел 847/857/897 - там как на картинке

в твоём коде из сообщения #51

// set the clarifier frequency
void FT897D::clarFreq(long freq) {
	// will come back to this later
	byte clarOfst[5] = {0x00,0x00,0x00,0x00,0x00};
    if (freq >= 0 ) clarOfst[0] = 0x00;//offset > 0
	if (freq < 0 ) clarOfst[0] = 0x01; // offset < 0
	clarOfst[1] = 0x00;//default
	clarOfst[4] = CAT_CLAR_SET;//command byte

unsigned char tempWord[2];
converted = to_bcd_be(tempWord, abs(freq), 4);

for (byte i=0; i<2; i++){
clarOfst[i+2] = converted[i];
}

sendCmd(clarOfst,5);
getByte();
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

О значит канадец пользовался закрытыми для обывателя источниками )))
Да, назад дороги нет, я уже и плату придумал, библиотека будет внутри...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да, кстати, не забудь предусмотреть дублирование всего, что приходит из софтового порта на сериальный и наоборот, дуина будет забирать только то, что ей надо или это в скетче надо организовывать?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я пишу только передачу комманд трансиверу с ардуино. Если надо управлять им еще и с компа, то это не ко мне.  А вообще, напиши, не жалея слов, что ты сделать хочешь.  Можно даже внапочту. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Я пишу только передачу комманд трансиверу с ардуино. Если надо управлять им еще и с компа, то это не ко мне.  А вообще, напиши, не жалея слов, что ты сделать хочешь.  Можно даже внапочту. 

у меня есть Тюнер LDG AT-897, у него два гнезда, одно вход с трансивера, другое выход на компьютер, тюнер забирает себе с трансивера частоту, а всё остальное сквозняком, там в библиотеке есть функция приёма с трансивера, ей сейчас и пользуюсь, принимаю только частоту, но чтобы принять что-то с трансивера, его надо поросить отдать тебе это

Может пока суть дело вынесешь в исходной библиотеке инициализацию SoftwareSerial за рамки библиотеки, как у тебя сделано? Если там можно это поправить

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ага. Я то тебе предлагал переписать тока:

"Arduino library for controlling a Yaesu FT857D/FT897D radio via CAT commands."
 
уж больно хреново оно написано
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Ага. Я то тебе предлагал переписать тока:

"Arduino library for controlling a Yaesu FT857D/FT897D radio via CAT commands."
 
уж больно хреново оно написано

ну перепиши что сможешь )))
 

подскажи:
Есть библиотека работающая с сериалом к примеру YYY.
Как создать два экземпляра работающих с разными хардовыми сериальными портами?
 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в классе заводишь protected переменную, как ссылка на Serial. Создаешь до Setup два сериала, передаешь их в конструктор нужного тебе класса

HardwareSerial Serial1;
HardwareSerial Serial2;

class TRadio {
protected: 
    Serial &FPort;
public:
    TRadio(Serial &APort) { FPort=APort;};
}

TRadio Radio1(Serial1);
TRadio Radio2(Serial2);

теперь у тебя 2 экземпляра класса с разными Сериалами

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хотя, лучше использовать базовый класс (Print), тогда пофик будет, железный ты сериал пользуешь, или софтовый. 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Хотя, лучше использовать базовый класс (Print), тогда пофик будет, железный ты сериал пользуешь, или софтовый. 

какие подвижки есть, а то что-то на гитхабе всё по старому...

я тут IDE одолел, всё что правишь сливается на ГИТхаб, заодно попробовал личный развернуть,на сервере, чтобы можно было прятать свой недокод от посторонних глаз )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em пишет:

IDE одолел, всё что правишь сливается на ГИТхаб, заодно попробовал личный развернуть,на сервере, чтобы можно было прятать свой недокод от посторонних глаз )))

Внимательно слушаем инструкцию !

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

какие подвижки есть

Никаких, я пока тенпературу сбиваю народными срецтвами. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

ua6em пишет:

IDE одолел, всё что правишь сливается на ГИТхаб, заодно попробовал личный развернуть,на сервере, чтобы можно было прятать свой недокод от посторонних глаз )))

Внимательно слушаем инструкцию !

Если на GITHUB то всё просто, ставишь их клиента GitHub Desktop, он правда только 64 битный, который создаст папочку в Документах - GitHub, проекты в этой папке и будут консолидировать с твоими проектами на Gihub.

В IDE открываю скетчи в этих проектах, делаешь Commit  и Push и всё

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

какие подвижки есть

Никаких, я пока тенпературу сбиваю народными срецтвами. 

а я антибиотиками последнего поколения, как будто ты медвежьим жиром намазался и в шкуру завернулся )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Ня

ссылка не открылась, нашёл на гитхабе и форкнул, для полноты щастя я напишу файл ключевых слов и с тебя описание, привожу в вид, чтобы было как библиотека, добавил файл ключевых слов, посмотрел, не все команды реализованы, нет getMode и getFreqMode, чё так?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Это я на подумать оставил, как проще реализовать.  Еще хочу сделать софтсериал прозрачный, но пока думаю как.  Подожди дня три. 

И этта, чтоб тут форум не засирать, про все рабочие моменты пишы в электропочту.  Потом, когда отладим, выкладем здеся. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Это же рабочие моменты по созданию библиотеки, может кому интересно будет, под Линуксом ключевые слова не увиделись, версия там 1.8.13 и в примерах не отобразилось, надо добавить два файла в каталог библиотеки, и сделать два каталога src и examples, библиотеку в сырцы, пример в примеры, только в каталог с именем примера,
тогда будет работать из коробки и пример доступен в примерах

 

keywords.txt
 

#######################################
# Syntax Coloring Map FT897D
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

dts	KEYWORD1	dts

#######################################
# Methods and Functions (KEYWORD2)
#######################################
Init	KEYWORD2
SetLock	KEYWORD2
SetPTT	KEYWORD2
SetMode	KEYWORD2
SetCLAR	KEYWORD2
SetCLARFreq	KEYWORD2
SetSplit	KEYWORD2
SetRepeaterOffsetDir	KEYWORD2
SetRepeaterOffsetFreq	KEYWORD2
SetMainFreq	KEYWORD2
ToggleVFO	KEYWORD2
SetDCSMode	KEYWORD2
SetCTCSSToneFreq	KEYWORD2
SetDCSCode	KEYWORD2
ReadRXStatus	KEYWORD2
ReadTXStatus	KEYWORD2
dtsFT897D	KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################

 library.properties

name=Yaesu FT897D CAT
version=0.01
author=Dmitry, DetSimen, <dap68@mail.com>
maintainer=Victor, UA6EM, <ua6em@yandex.ru>
sentence=Control various functions of your radio via an Arduino micro-controller a Yaesu FT-897D(817,857) radio from the CAT point of view.
paragraph=This library will  will give you basic control over  FT897D (FT-817d, FT-857d) via CAT serial commands.
category=Other
url=https://github.com/detsimen/FT879D
architectures=*

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Какта мне на стандартную IDE - пофик.  У мня в VS intellisence хаошый. :-)  Все понимает. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Какта мне на стандартную IDE - пофик.  У мня в VS intellisence хаошый. :-)  Все понимает. 

я поставил под Линукс, пока не одолел твою VS, IDE попроще будет )))
 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Короче, пока отлаживаемса, пишы на электропочту. Думаю, никому это неинтересно. :-) 

Седня уже не пишы, мы со с котом лечимся. :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Посмотри, что я не так делаю?

/*
 Name:    Test_FT897D.ino
 Created: 25.09.2020 7:06:13
 Author:  DtS
*/
float ftFreq;
#include <SoftwareSerial.h>
#include "dtsFT897D.h"

SoftwareSerial RadioPort(2,3); // RX, TX

dtsFT897D Radio(RadioPort);

void setup() {
  Serial.begin(115200);
  delay(250);
  Serial.println("Start...");
  Radio.Init(4800);
}


void loop() {
  
  ftFreq = Radio.GetFrequency();
  Serial.print("Freq = ");
  Serial.println(ftFreq);
  delay(1000);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А где ты частоту устанавливаешь сначала, чтоб ее читать потом?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

А где ты частоту устанавливаешь сначала, чтоб ее читать потом?

Я подключил ардуину к девайсу, из него читаю

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И чо выводится?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

И чо выводится?

0.00

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну так, или он не настроен, или 5 байт отдавать не хотит. Завтра поразбира

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ок!

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Значить, найди в срр файле функцию 

bool dtsFT897D::ReadLongStatus(const uint16_t ATimeoutMS)

и у ей унутре  удали или закоментируй строчку 

FPort.flush();

и пропробуй снова. 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Значить, найди в срр файле функцию 

bool dtsFT897D::ReadLongStatus(const uint16_t ATimeoutMS)

и у ей унутре  удали или закоментируй строчку 

FPort.flush();

и пропробуй снова. 

сейчас она у меня выглядит так, но ничего не изменилось, верну взад все как было, проверить, что интерфейс рабочий, дам знать
 

bool dtsFT897D::ReadLongStatus(const uint16_t ATimeoutMS)
{
	const uint8_t ANSWER_LENGTH = 5;

	ClearCmdBuffer();
	FCommand.Command = CMD_READ_LONG_STATUS;
	SendCommand();
	delay(20);
	FPort.flush();
	uint32_t now = millis();
	uint8_t* buf = (uint8_t*)(&FCommand);

	while (FPort.available() < ANSWER_LENGTH) {
		if (millis() - now > ATimeoutMS) return false;
	}

	FPort.readBytes(buf, ANSWER_LENGTH);

	return false;
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

9 строчку убери нахрен 

Я очень прошу пардону, но вот это 

19    return false;

надо заменить на 

return true; 

:)   Это я спьяну не заметил. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

9 строчку убери нахрен 

Я очень прошу пардону, но вот это 

19    return false;

надо заменить на 

return true; 

:)   Это я спьяну не заметил. 

Всё сложнее, как говорил DIMAX - "если что-то имеет теоретическую возможность не заработать. оно у тебя (то-есть меня) не заработает"  )))

Сейчас испытую в рамках связки двух ардуин, одна имитирует трансивер, другая - девайс подключенный к трансиверу (то биш твой скетч), в качестве трансивера программа и библиотека FT-857d
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Девайс оживил, есть глюк понять который я не в силах

(альтернативная твоей прошивка)

In WORK
FREQ = 29.50
FREQ = 29.50
FREQ = 50.07
FREQ = 145.50
FREQ = 434.15
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94

Резетю тюнер 
In WORK
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 3.55
FREQ = 7.08
FREQ = 10.24
FREQ = 14.15
FREQ = 18.08
FREQ = 21.02
FREQ = 24.90
FREQ = 28.02
FREQ = 29.50
FREQ = 50.07
FREQ = 145.50
FREQ = 434.15
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94

Резетю трансивер
FREQ = 1666.66
FREQ = 1.94
FREQ = 1.94
FREQ = 1.94
FREQ = 7.08
FREQ = 10.24
FREQ = 14.15
FREQ = 18.08
FREQ = 18.08
FREQ = 18.08
FREQ = 18.08


Твоя прошивка
Start...
Freq = 18.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2018.08
Freq = 2021.02
Freq = 2021.02
Freq = 2024.90
Freq = 2024.90
Freq = 2028.03
Freq = 2028.03
Freq = 2029.50
Freq = 2050.07
Freq = 2050.07

Резетю тюнер
Start...
Freq = 50.07
Freq = 2050.07
Freq = 2050.07
Freq = 2050.07
Freq = 2050.07
Freq = 2050.07
Freq = 2050.07
Freq = 2145.50
Freq = 2145.50
Freq = 2434.15
Freq = 2001.95
Freq = 2001.95
Freq = 2001.95
Freq = 2001.95
Freq = 2001.95
Freq = 0.00
Freq = 2001.95

резетю трансивер
Freq = 1.95
Freq = 1.95
Freq = 3.55
Freq = 7.08
Freq = 10.24
Freq = 14.15
Freq = 18.08
Freq = 21.02
Freq = 24.90
Freq = 28.03
Freq = 29.50
Freq = 50.07
Freq = 145.50
Freq = 434.15
Freq = 1.95
Freq = 3.55
Freq = 7.08
Freq = 10.24
Freq = 14.15
Freq = 18.08
Freq = 21.02
Freq = 24.90
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03
Freq = 28.03

И непонятно, как вывести в сериал текущий режим?

radio.GetOperatingMode();

резет платы с твоим скетчем

Start...
Freq = 14.15
Freq = 2014.15
Freq = 2014.15
Freq = 2014.15

резет платы трансивера

Freq = 0.00
Freq = 2014.15
Freq = 14.15
Freq = 14.15
Freq = 14.15
Freq = 14.15

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

говорила мне мама, не режь аппендицит по телефону... 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

И непонятно, как вывести в сериал текущий режим?

Это-то как раз проще всего. Был бы ты настоящий сталевар, даже вопроса бы не возникло :) 

void ModeToSerial(const TOperatingMode AMode) {
	switch (AMode)
	{
		case TOperatingMode::AM:
			Serial.println("AM");
			break;

		case TOperatingMode::CW:
			Serial.println("CW");
			break;
//		.
//		.
//      .
		case TOperatingMode::USB:
			Serial.println("USB");
			break;
	default:
		Serial.println("Unknown mode");
		break;
	}
}