Чуток подчистил старый скетч, оставил разбор только верхнего регистра )))
/*
Простой телеграфный маяк для экспериментов
Исходный код:
Written by Nicola Salsotto IN3GJH
https://github.com/NicoVarg99
Модификация сделана:
UA6HJQ 18.11.2018 (добавлено управление радиостанцией)
UA6EM 12/04/2019 (добавлен разбор символов нижнего регистра)
UA6EM & сотоварищи 16/04/2019 (работа с EEPROM -начало,убран блокирующий delay())
Интервал между передачей:
10мин= 600000 (передача примерно 20 секунд)
5мин = 300000
3мин = 180000
2мин = 120000
*/
#include <EEPROM.h>
int eeAddress = 0; //EEPROM address to start reading from
int eeFlag = 73; // в ячейке 73 сохраняем флаг ==73, что структура сохранялась
int eeData; // сюда читаем байт из ячейки флага
struct MyBeacon {
char call_sign[20];
char loc[7];
};
MyBeacon mb = {"UA6EM", "LN14AG"}; // структура для отправки
String my_call;
String my_loc;
#define SPEED (20) //скорость в WPM
#define DOTLEN (1200/SPEED)
#define DASHLEN (4*(1200/SPEED))
//#define PAUSE (180000) //пауза между передачами маяка в милисекундах
#define PAUSE (10000) //пауза между передачами маяка в милисекундах
int txPin=10; //управление PTT
int ledPin=13; //мигать встроенным светодиодом или подключить внешний на пин 13
int tonePin=5; //выход звука
int toneFreq=800; //Частота звука (выбирайте между 800 - 1500Гц)
unsigned long old_millis;
void sendMsg(char*);
void dash();
void dot();
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(txPin, OUTPUT);
Serial.begin(115200);
old_millis = millis();
}
void loop()
{
if(millis() - old_millis >= PAUSE){
eeData = EEPROM.read(eeFlag);
if (eeData == 73){
EEPROM.get(eeAddress, mb); // получить данные из EEPROM
}
digitalWrite(txPin, HIGH);
delay(900); //txdelay - задержка после нажатия PTT
sendMsg(mb); //текст маяка - проба
delay(20);
digitalWrite(txPin, LOW);
old_millis = millis();
}
// процедура чтения порта будет тут )))
Serial.println("Введите позывной сигнал");
delay(3000);
while(Serial.available()) {
my_call = Serial.readString();
}
Serial.print("Ваш позывной - ");
Serial.println(my_call);
Serial.println();
Serial.println("Введите ваш локатор");
delay(3000);
while(Serial.available()) {
my_loc = Serial.readString();
}
Serial.print("Ваш локатор - ");
Serial.println(my_loc);
Serial.println();
// MyBeacon mb = {my_call, my_loc};
} // END
//*** передаём тире ***
void dash()
{
digitalWrite(ledPin, HIGH);
tone(tonePin, toneFreq);
delay(DASHLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
delay(DOTLEN);
}
//*** передаём точку ***
void dot()
{
digitalWrite(ledPin, HIGH) ;
tone(tonePin, toneFreq);
delay(DOTLEN);
digitalWrite(ledPin, LOW);
noTone(tonePin);
delay(DOTLEN);
}
// *** функция разбора и передачи строки ***
// void sendMsg(char *str){
// Строка для отправки сформируется внутри,
// а при выходе будет освобождена
//
void sendMsg(MyBeacon & mbStr) {
static const char middle[] = "BEACON QRA is"; // серёдка сообщения
static const int8_t sizeMiddle = strlen(middle); // длина серёдки сообщения
static const int8_t repeatCounter = 2; // сколько раз повторять позывной и ... тот хвост
//
// strSize - длина строки для отправки по sms, включая терминальный ноль.
const int8_t strSize = sizeMiddle + (strlen(mbStr.call_sign) + strlen(mbStr.loc) + 2) * repeatCounter + 1;
char str[strSize];
//
// Заполняем строку
str[0] = '\0';
for (int8_t i = 0; i < repeatCounter; i++) {
strcat(str, mbStr.call_sign);
strcat(str, " ");
}
strcat(str, middle);
for (int8_t i = 0; i < repeatCounter; i++) {
strcat(str, " ");
strcat(str, mbStr.loc); // Собрали строку текста Маяка
}
//
// Теперь отправляем строку str как там надо
//
// Serial.println(str);
// String str1 = str;
// str1.toUpperCase();
// Serial.println(str1);
delay(500);
for(int8_t i=0;i<strlen(str);i++)
{
switch (toupper(str[i])) // тут я рыбу заворачивал )))
{
case 'A':
dot();dash();break;
case 'B':
dash();dot();dot();dot();break;
case 'C':
dash();dot();dash();dot();break;
case 'D':
dash();dot();dot();break;
case 'E':
dot();break;
case 'F':
dot();dot();dash();dot();break;
case 'G':
dash();dash();dot();break;
case 'H':
dot();dot();dot();dot();break;
case 'I':
dot();dot();break;
case 'J':
dot();dash();dash();dash();break;
case 'K':
dash();dot();dash();break;
case 'L':
dot();dash();dot();dot();break;
case 'M':
dash();dash();break;
case 'N':
dash();dot();break;
case 'O':
dash();dash();dash();break;
case 'P':
dot();dash();dash();dot();break;
case 'Q':
dash();dash();dot();dash();break;
case 'R':
dot();dash();dot();break;
case 'S':
dot();dot();dot();break;
case 'T':
dash();break;
case 'U':
dot();dot();dash();break;
case 'V':
dot();dot();dot();dash();break;
case 'W':
dot();dash();dash();break;
case 'X':
dash();dot();dot();dash();break;
case 'Y':
dash();dot();dash();dash();break;
case 'Z':
dash();dash();dot();dot();break;
case ' ':
delay(DOTLEN*5);break;
case '.':
dot();dash();dot();dash();dot();dash();break;
case ',':
dash();dash();dot();dot();dash();dash();break;
case ':':
dash();dash();dash();dot();dot();break;
case '?':
dot();dot();dash();dash();dot();dot();break;
case '\'':
dot();dash();dash();dash();dash();dot();break;
case '-':
dash();dot();dot();dot();dot();dash();break;
case '/':
dash();dot();dot();dash();dot();break;
case '(':
case ')':
dash();dot();dash();dash();dot();dash();break;
case '\"':
dot();dash();dot();dot();dash();dot();break;
case '@':
dot();dash();dash();dot();dash();dot();break;
case '=':
dash();dot();dot();dot();dash();break;
case '0':
dash();dash();dash();dash();dash();break;
case '1':
dot();dash();dash();dash();dash();break;
case '2':
dot();dot();dash();dash();dash();break;
case '3':
dot();dot();dot();dash();dash();break;
case '4':
dot();dot();dot();dot();dash();break;
case '5':
dot();dot();dot();dot();dot();break;
case '6':
dash();dot();dot();dot();dot();break;
case '7':
dash();dash();dot();dot();dot();break;
case '8':
dash();dash();dash();dot();dot();break;
case '9':
dash();dash();dash();dash();dot();break;
}
delay(2*DOTLEN);
}
} // окончание функции передачи текста маяка
Да, я знаю. Вчера уже понял, когда ноут сложил, а сегодня с утра начали о формате хранения спорить, поэтому решил не спешить, а посмотреть, чем дело кончится. А вообще - надо как-то вот так:
for (uint8_t l = 0; l < 8; l++) {
uint8_t currentBit = bitRead(morseCode[i].sequence, l);
if (!sequenceStarted) {
sequenceStarted = currentBit;
continue;
}
currentBit ? dot() : dash() ;
}
Да, я знаю. Вчера уже понял, когда ноут сложил, а сегодня с утра начали о формате хранения спорить, поэтому решил не спешить, а посмотреть, чем дело кончится. А вообще - надо как-то вот так:
for (uint8_t l = 0; l < 8; l++) {
uint8_t currentBit = bitRead(morseCode[i].sequence, l);
if (!sequenceStarted) {
sequenceStarted = currentBit;
continue;
}
currentBit ? dot() : dash() ;
}
Да, заработало, еще бы поправить указатель в строке сдвигать для чтения следующего байта
brokly, ну вот смотри. в строке №4 ты берёте morseCode[i]. При этом i у тебя изменяется от 0 до длины сообщения. Тебя это не смущает? А если длина сообщения мбольше длины массива morseCode? Или меньше? Тут напутано с логикой.
brokly, ну вот смотри. в строке №4 ты берёте morseCode[i]. При этом i у тебя изменяется от 0 до длины сообщения. Тебя это не смущает? А если длина сообщения мбольше длины массива morseCode? Или меньше? Тут напутано с логикой.
Дык я и не пытался это править :) Проглядел:) Я только бред с отправкой буквы поправил :) Я туда даже не смотрел :) Там явно таблица нужна. Как ее сделать я чуток выше нарисовал.
Ну если очень надо так то наверное имеет смысл "strlen(_thePhrase)" заменить на "sizeof(morseCode)/sizeof(morseCode[0])" :)
Дет, это ему не поможет в поиске конца массива структур :)
Да. Куды я влез своими куриными мозгами. Узбагоюсь, пожалуй.
а мне и не нужен конец массива структур, мне надо писать в структуру отдельные элементы и, похоже массивы char[] в структуре тоже надо собирать посимвольно, что совсем не комильфо
а мне и не нужен конец массива структур, мне надо писать в структуру отдельные элементы и, похоже массивы char[] в структуре тоже надо собирать посимвольно, что совсем не комильфо
А раз не нужен, то и нефига его в цикле перебирать... Так мучаетесь, аж больно. Что нужно то, конкретнее, я уж готов сам написать.
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
for(int8_t i=0;i<strlen(_thePhrase);i++){ // А ВОТ ЭТО ЧТО ДЕЛАЕМ ?
Ну что же тут непонятного?
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
А мне кажется, ему другое не понравилось....
давайте заслушаем начальника транспортного цеха...
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
А то, то что я там выше нахреначил выглядит несколько по другому, там кодировка слева направо, 0-точка, 1-тире, а последняя единичка - конец. Работать будет быстрее, поскольку не перебирает все восемь бит в символе, но обработка посложнее.
А где тут программирование? Ни малехонького класса, ни завалящей лямбда-функции. Так, перестановка байт местами. Третий класс по простой бытовой логике.
Благодарю!
Чуток подчистил старый скетч, оставил разбор только верхнего регистра )))
Да, я знаю. Вчера уже понял, когда ноут сложил, а сегодня с утра начали о формате хранения спорить, поэтому решил не спешить, а посмотреть, чем дело кончится. А вообще - надо как-то вот так:
Давно это было... Откопал в архиве.
Вдруг кому пригодится. Не оптимально, но на тичеринг я не претендую.
Да, я знаю. Вчера уже понял, когда ноут сложил, а сегодня с утра начали о формате хранения спорить, поэтому решил не спешить, а посмотреть, чем дело кончится. А вообще - надо как-то вот так:
Да, заработало, еще бы поправить указатель в строке сдвигать для чтения следующего байта
Да, заработало, еще бы поправить указатель в строке сдвигать для чтения следующего байта
thePhrase++ для сдвига указателя и нужно было.
Так будет проще?
Ну, избавьтесь же Вы от букв. Зачем они Вам? Это И доп. расход памяти, И доп. расход времени на их поиск
Кстати, глянул на поиск - там у Вас вообще что-то странное написано в #105 (строки 64-79)
del
А проверять нечего, там ж очевидно ерунда написана в #112 в строках №№67-83 Вы за логикой-то проследите!
del
Может как то так (не проверял)
brokly, ну вот смотри. в строке №4 ты берёте morseCode[i]. При этом i у тебя изменяется от 0 до длины сообщения. Тебя это не смущает? А если длина сообщения мбольше длины массива morseCode? Или меньше? Тут напутано с логикой.
Брукли, там просто strlen() не пришей к кобыле хвост... Товарищ методом научного коммунизма пишет скетч. Интересно, чем это закончится.
Брукли, там просто strlen() не пришей к кобыле хвост... Товарищ методом научного коммунизма пишет скетч. Интересно, чем это закончится.
Я исправился
Сплошные костыли правда...но работает )))
brokly, ну вот смотри. в строке №4 ты берёте morseCode[i]. При этом i у тебя изменяется от 0 до длины сообщения. Тебя это не смущает? А если длина сообщения мбольше длины массива morseCode? Или меньше? Тут напутано с логикой.
Дык я и не пытался это править :) Проглядел:) Я только бред с отправкой буквы поправил :) Я туда даже не смотрел :) Там явно таблица нужна. Как ее сделать я чуток выше нарисовал.
Ну если очень надо так то наверное имеет смысл "strlen(_thePhrase)" заменить на "sizeof(morseCode)/sizeof(morseCode[0])" :)
наверное имеет смысл strlen(_thePhrase)" заменить на "sizeof(morseCode)/ sizeof(morseCode[0])" :)
Да, нет в этом никакого смысла. Имеет смысл делать таблицей, как у Вас.
Чтобы таблица была покороче, можно начинать её с нужного символа, а из элемента строки его вычитать. И всё будет по уму.
Тут ведь из-за этого цикла получается квадратичное время (длина строки Х длину таблицы). А нафига?
String::c_str()
О... да мы еще не дошли до верхней половины ASCII. Вроде как кириллица тоже морзянкой отбивается.
Там сопоставлены русским буквам англицкие, и помоему знаки добавлены и пару букв. Это будет еще кусок таблицы и все.
String::c_str()
Дет, это ему не поможет в поиске конца массива структур :)
О... да мы еще не дошли до верхней половины ASCII. Вроде как кириллица тоже морзянкой отбивается.
Для Маяка не актуально, там только латиница
Склоняюсь, что надо ставить 8 символьный дисплейчик на две строки, пару кнопок и энкодер, то-есть, полностью автономное устройство делать
Показательный пост прямо: как при отсутствии внятного ТЗ можно два дня делать получасовую работу.
String::c_str()
Дет, это ему не поможет в поиске конца массива структур :)
Да. Куды я влез своими куриными мозгами. Узбагоюсь, пожалуй.
Показательный пост прямо: как при отсутствии внятного ТЗ можно два дня делать получасовую работу.
ТЗ и скетчи вещи несовместимые, не убивай свободного художника )))
String::c_str()
Дет, это ему не поможет в поиске конца массива структур :)
Да. Куды я влез своими куриными мозгами. Узбагоюсь, пожалуй.
а мне и не нужен конец массива структур, мне надо писать в структуру отдельные элементы и, похоже массивы char[] в структуре тоже надо собирать посимвольно, что совсем не комильфо
а мне и не нужен конец массива структур, мне надо писать в структуру отдельные элементы и, похоже массивы char[] в структуре тоже надо собирать посимвольно, что совсем не комильфо
А раз не нужен, то и нефига его в цикле перебирать... Так мучаетесь, аж больно. Что нужно то, конкретнее, я уж готов сам написать.
И ни на что это не похоже... ваще.
Сделай нам красиво, Брукли.
Сделай нам красиво, Брукли.
Красиво - не смогу :(
Может это я туплю ? Ну так объясните
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
Сделай нам красиво, Брукли.
Красиво - не смогу :(
не верю ))) не может человек надевающий такие гламурные очки не сделать красиво ....
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
А мне кажется, ему другое не понравилось....
Может это я туплю ? Ну так объясните
Ну что же тут непонятного?
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
Ну что же тут непонятного?
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
Я сегодня не пил, может поэтому не понимаю ?
Сделай нам красиво, Брукли.
Красиво - не смогу :(
Может это я туплю ? Ну так объясните
там чуток по другому, а как вытащить элемент массива? tks sadman41
как ниже даже работает и буковки не пропускает
Какие же это мучения - это "наслажденье битвой жизни" )))
Евгению Петровичу не понравилось в исходном тексте, что разбор выполнен через CASE, это попытка от этого уйти, а основное - иметь возможность внесения текста с терминала и сохранение-чтение в-из EEPROM
А мне кажется, ему другое не понравилось....
давайте заслушаем начальника транспортного цеха...
Ну что же тут непонятного?
«Пока враг изучает наши карты, мы меняем ландшафт, причем вручную.
Враг теряется на незнакомой местности и переходит в полную небоеспособность.
В этом смысл. В этом наша стратегия».
Я сегодня не пил, может поэтому не понимаю ?
Тогда вот первоисточник: https://www.youtube.com/watch?v=w0vi2fL2hMg
Аааа кажись въехал.
Я правильно понял, что первая единица слева это признак начала точек с тире, а следующие биты 1-точка, 0-тире ?
Урааа !!!!
Аааа кажись въехал.
Я правильно понял, что первая единица слева это признак начала точек с тире, а следующие биты 1-точка, 0-тире ?
Урааа !!!!
я думаю да
Аааа кажись въехал.
Я правильно понял, что первая единица слева это признак начала точек с тире, а следующие биты 1-точка, 0-тире ?
Урааа !!!!
Ну да. Квон идею толкнул, я её вкодил. Не с первого раза удачно, конечно.
Так красиво ?
А то, то что я там выше нахреначил выглядит несколько по другому, там кодировка слева направо, 0-точка, 1-тире, а последняя единичка - конец. Работать будет быстрее, поскольку не перебирает все восемь бит в символе, но обработка посложнее.
Идеала-то нет. Пусть выбирает ua6em - ему же дописывать ;)
Это , да ! Я рад что он, оказывается, не мучается :) А только мучает нас :)
Это , да ! Я рад что он, оказывается, не мучается :) А только мучает нас :)
ну я то не программист, мне казалось, что для вас это - легким движением...
пытаюсь честно успевать за Вами записывать
Так более правильно:
А где тут программирование? Ни малехонького класса, ни завалящей лямбда-функции. Так, перестановка байт местами. Третий класс по простой бытовой логике.
За нами нужно не записывать, а ДОПИСЫВАТЬ :)
Да , без лямбд ни разу не программирование. Даже классов нет... А уж квоновских и подавно :)
За нами нужно не записывать, а ДОПИСЫВАТЬ :)
Да , без лямбд ни разу не программирование. Даже классов нет... А уж квоновских и подавно :)
а если получаем пробел, можно вставить задержку в 5 длительностей точек?
Заменил - гонит вообще пургу, вернул назад старую функцию
а вот так работает, но на пробеле паузы по 3 секунды
За нами нужно не записывать, а ДОПИСЫВАТЬ :)
Да , без лямбд ни разу не программирование. Даже классов нет... А уж квоновских и подавно :)
по человечески... по квоновски.ПС:http://maxima-library.org/new-books-2/bl/25465?layout=series