OSD на ATmega1281
на х86 работает и под ХР и под 7й
Ок, благодарю за оценку и тестирование.
Немного букв о своей суперписАлке…
- Несмотря на активные советы msdn использовать только VMR9, поэспериментировав, пришел к старому доброму Video Reder. Все варианты VMR, VMR7, VMR9, то не создаются на некоторых компах (может там старые DirectX, не разбирался особо), то не соединяются в графе, то еще какая фигня. Возможно я не умею их готовить, но от компа к компу, от одного устройства захвата к другому,- не угадать какой казус выйдет. Простой VR оказался самым стабильным. Может стоит дать возможность определять рендер юзеру в конфигурации, но пока не увидел в этом особого смысла.
- Для синхронизации потоков полностью доверился стандартному AviMux из DirectShow. Единственно, что там можно сделать (и конечно сделано) указать “мастером” аудио-поток. В принципе при нормальном захвате все более-менее синхронизировано, но при большом количестве дропов (увы, для нас актуально) все как-то непредсказуемо… То почти идеально сводится, то появляется не устраняемая со временем ощутимая рассинхронизация аудио и видео… Увы, простых решений пока не вижу, а писАть свой мукс пока не готов…
- Далеко не все аудио-устройства поддерживают интерфейс микшера для DirectShow. Нужно сделать интерфейс к системному микшеру с возможностью установки при запуске всех настроек, определенных в конфигурации. Это полезно и для авто-включения мониторинга звука с установлением предварительно заданных значений уровней и параметров. Надеюсь добавлю в след. версиях.
- Сознательно не стал делать возможность включения аудио-кодека. Экономии на копейки, а проблем может оказаться много (не совместимость форматов аудио/видео для avi-контейнера, рассинхронизации итп…).
- Есть и хорошая новость ( 😃 ) - прога регистрирует как положено свой граф в системе и его можно посмотреть GraphEdit и прочими подобными смотрелками (типа GraphStudio из пакета K-Lite). Весьма полезное и поучительное занятие…
Шыкарная прога ! Мега респект. Буду видео на нетбук теперь писать)))
Тут как раз и обновление поспело: FPVCap 1.1(beta)…
Со “спасибами” не торопитесь, все-таки сыровато наверное… Тем более в этом деле (куча возможных устройств с неизвестно кем писанными дровами) добиться гарантированной надежности невозможно…
Немного рекомендаций:
- Если девайс позволяет, выбрать формат для PAL 720x576 25fps YUY2 (или подобный).
- Мой любимый кодек PICVideo M-JPEG.
- Звук желательно захватывать тем же устройством, что и видео. Гораздо меньше проблем с синхронизацией.
- Для наших дел формат звука пойдет 22050Hz, 1ch, 16bps.
Еще вспомнил:
5. VideoRederer более универсален, но в некоторых случаях дает в динамике артефакты или может неоправданно грузить проц. Есть смысл тогда попробовать включить в настройках “VMR”.
6. УСБ-бишные устройства захвата могут конфликтовать с другими УСБ девайсами. Например мой PCTV начинает жутко тормозить если включить USB WiFi адаптер.
7. Audio->Playback->Enable включает софтовый мониторинг звука через DirectSound устройство. Это дополнительная нагрузка на проц и неустранимая задержка (уменьшение размера аудио-буфера приводило к зависаниям графа и даже вываливание в синий экран смерти). Если нет желания с этим (с задержками) мириться можно для аудио-мониторинга просто параллельно в выходу аудио подключить активную колонку.
Сергей, подскажите, как переназначить вывод MCI вместо окна в какую-нибудь переменную типа TImage?
Написал плеер, выковыривающий телеметрию из видео. Видео воспроизводится через TMediaPlayer, в котором в качестве Display можно назначить только оконный элемент: форму, панель, кнопку… Все бы хорошо, но если окно закрыто другим окошком или свернуто, информацию с кадра считать невозможно.
Вроде для MCI нужно передавать HWND окна для отображения. Вероятно по этому TMediaPlayer.Display может быть только наследник от TWinControl, имеющий свойство Handle- по сути HWND. Конечно всех возможностей MCI не помню, но вполне может оказаться, что эта задача нерешаема…
Есть повод окунуться в DirectShow 😃, там эта задача легко решается. Даже можно не писать свой фильтр, пользовать готовый SampleGrabber.
ага, там черт ногу сломит.
Нашел такой код:
#ifndef DIBSIZE
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
#define DIBWIDTHBYTES(bi) (DWORD)WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount)
#define _DIBSIZE(bi) (DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight)
#define DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(_DIBSIZE(bi)) : _DIBSIZE(bi))
#endif
void PlayAvi(LPCSTR pszFile, HWND hWndOutput)
{
AVIFileInit();
PAVIFILE paf;
AVIFileOpen(&paf, pszFile, OF_READ, 0);
AVIFILEINFO afi;
AVIFileInfo(paf, &afi, sizeof(AVIFILEINFO));
PAVISTREAM pas;
AVIFileGetStream(paf, &pas, streamtypeVIDEO, 0);
AVISTREAMINFO asi;
AVIStreamInfo(pas, &asi, sizeof(AVISTREAMINFO));
long nFormatSize;
AVIStreamReadFormat(pas, asi.dwStart, NULL, &nFormatSize);
BITMAPINFOHEADER* pbihIn = (BITMAPINFOHEADER*)malloc(nFormatSize);
AVIStreamReadFormat(pas, asi.dwStart, pbihIn, &nFormatSize);
BITMAPINFOHEADER bihDec;
memcpy(&bihDec, pbihIn, sizeof(BITMAPINFOHEADER));
bihDec.biCompression = BI_RGB;
bihDec.biBitCount = 24;
bihDec.biSizeImage = DIBSIZE(bihDec);
BYTE* pDecData = (BYTE*)malloc(bihDec.biSizeImage);
memset(pDecData, 0, bihDec.biSizeImage);
HIC hic = ICDecompressOpen(ICTYPE_VIDEO, pbihIn->biCompression, pbihIn, &bihDec);
ICDecompressBegin(hic, pbihIn, &bihDec);
HDC hdc = GetDC(hWndOutput);
RECT rc;
GetClientRect(hWndOutput, &rc);
HDRAWDIB hdd = DrawDibOpen();
BYTE* pInData = NULL;
long nBufSize = 0, nSampleSize = 0;
for (int nSample = asi.dwStart; nSample <= asi.dwStart + asi.dwLength; nSample++)
{
AVIStreamSampleSize(pas, nSample, &nSampleSize);
if (nSampleSize > nBufSize)
{
pInData = (BYTE*)realloc(pInData, nSampleSize);
nBufSize = nSampleSize;
}
AVIStreamRead(pas, nSample, 1, pInData, nBufSize, NULL, NULL);
ICDecompress(hic, 0, pbihIn, pInData, &bihDec, pDecData);
// ñåé÷àñ â pDecData òåêóùèé êàäð â âèäå áèòìàïêè, ðèñóåì åãî
DrawDibDraw(hdd, hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top, &bihDec, pDecData, 0, 0, bihDec.biWidth, bihDec.biHeight, 0);
Application->ProcessMessages();
}
DrawDibClose(hdd);
ReleaseDC(hWndOutput, hdc);
ICDecompressEnd(hic);
ICClose(hic);
AVIStreamRelease(pas);
AVIFileRelease(paf);
AVIFileExit();
free(pInData);
free(pDecData);
free(pbihIn);
}
При указании пути файла и хендла формы/панельки должен воспроизводить файл. Нифига, вылетает на строке ICDecompress(hic, 0, pbihIn, pInData, &bihDec, pDecData); с ексепшеном ffdshow.ax. Удалил ffdshow - дает просто черный экран.
===
еще нашел dspack, попробую его.
Олег, имхо все эти библиотеки (в тч. MCI) по сути софтовые интерфейсы к этому. А зачем нам посредники? 😃 Конечно реальное приложение будет посложнее, вместо RenderFile придется свой граф собирать, но Intelligent Connect сделает всю самую сложную работу.
//-------------------------------------
Обновление FPVcap_1.2(beta). Исправлен тексты сообщений о ошибках, и вылеты на исключения при отсутствии железки захвата. Никаких принципиальных изменений.
А чертёжик антенны можно?
ну и на модельке диполь с gain 2-5dB
И на самолете, обычный четверть волновый диполь?
Разве есть разница между, просто штырьком четверть волны?
И как определили 2-5 db.
И ещё вопрос, поляризация какая подразумевается?
А я во какой коаксиал на 434 забабахал:
Подробности здесь.
Сверхзадача была уменьшить объемные габариты классической GP с тремя противовесами, торчащими во все стороны, для удобства хранения транспортировки.
-----
Самым неудобным моментом системы сейчас является привязка проводом пульта к передатчику, установленному на крыше авто… Может есть какие дешевенькие RF-модули желательно на 2.4 обеспечивающие уверенный цифровой линк до 15-20м? Интерфес… не знаю… UART что-ли…
А чертёжик антенны можно?
И на самолете, обычный четверть волновый диполь?
Разве есть разница между, просто штырьком четверть волны?
И как определили 2-5 db.И ещё вопрос, поляризация какая подразумевается?
я подразумевал 3/4 ( 5/8 ) диполь у того гейн поболее а штырь на 400МГц нужна крыша ( пара кв метров ) в качестве противовеса иначе не работает. У штыря импеданс (36 + j20) Ом главное отмерить и прилепить к крыше по центру.
Поляризация ессно линейная.
Имхо 5/8 имеет скромные 2-3db по сравнению с GP только в узком секторе. Зато на вполне “ходовых” углах возвышения имеет жуткие провалы…
Имхо 5/8 имеет скромные 2-3db по сравнению с GP только в узком секторе. Зато на вполне “ходовых” углах возвышения имеет жуткие провалы…
Я собственно считал, как вариант 5/8 диполь, изогнутый буквой V. Он имеет вполне цивильную диаграмму, типо серпа, перекрывающую всю нижнюю полусферу а gein там около 5-6 dBi получается. Но это так, для коллекции. А провалы характерны для монопля ( штырь ) без противоеса.
… изогнутый буквой V…
Хотелось бы ммана-модельку… Там бы и ДН поглядел…
Добрый вечер.
Извините, что встреваю в дискуссию, но уже голова квадратная.
Решил повторить проект Сергея. Собрал ОСД, но что-то не заладилось у меня совсем 😦
Мега после 3-5 включений перестает видится программатором (isp). Кажется слетают фьюзы, потому что фьюз-доктор в режиме параллельного программирования мегу поднимает. У меня последовательность действий такая:
- Подключаю isp программатор
- Заливаю бутлоадер
- Ставлю фьюзы на внешний кварц и бутлоадер, а также brownout protection
- Подключаюсь к ногам 28, 29 меги при помощи кабеля USB-UART
- Пытаюсь при помощи MegaLoad залить прошивку - выбираю hex и ставлю скорость 38400
- Как только MegaLoad пишет, что Waiting for device - подаю питание на ОСД. Ничего не происходит. Зеленый светодиод моргает.
- После пары-пятерки передергиваний питания саетодиод не мигает.
- Мегу считать/записать при помощи isp программатора невозможно. Подключаю фьюз доктор, сброшу фьюзы и все по-новой.
Вот такая история на тему как я провел субботу 😃
UPD.
Залил просто хекс без бутлоадера. К конфигуратору коннектится, пока все пишет и читает.
Константин, без паники! 😃
- На всякий скачайте последнее обновление OSD.rar, разархивируйте.
- Программатором залейте в OSD cvmegaload.hex и установите фузы согласно fuse.JPG.
- Запустите OSDcnf.exe. Выберете порт вашего USB-UART, нажмите Open.
- Подключите USB-UART вместо GPS-модуля ( к 28,29 ногам меги). Питание OSD отключено!
- Нажмите кнопка Flash, выберите файл osd.hex.
- В течении ~5сек(не помню точно, но без того чтобы кофейку попить), пока статус “Ready from target”, включите питание OSD.
- Несколько секунд наслаждайтесь процессом загрузки прошивки.
В принципе загрузка через бутлоадер сделана для возможности заливать прошивку прямо в поле, с ноута, без программатора (чем неоднократно пользовался). А так, конечно, можно сразу залить osd.hex сразу программатором, не заливая предварительно бутлоадер (только скорректировать фузы…)…
Удачи!
ЗЫ О! уже догадались сразу залить… 😃
Сергей, спасибо!
С таким порядком действий все работает в лучшем виде. GPS (mtk3329) нашелся сразу. Красотища, и плавненько вся анимация. Не налюбуюсь. Теперь жду когда приедет IMU и погоду.
Сергей, а подробнее про кнопки расскажите, пожалуйста.
S1 - если подержать секунды две - моргнет красный светодиод и запишется позиция home. А если подержать еще секунды две, то красный светодиод моргнет два раза и кажется тоже запишется home. Что-то со временем еще происходит 😃 Получалось его запустить на счет
Назначение S2 не выявил.
Отлично! Теперь стоит пройти процедуру калибровок… Вещь неприятная, благо ее надо сделать только один раз.
Ну и проверить PPM, честно говоря в последних прошивках даже не проверял, пользуюсь только LRS.
Если будут вопросы, конечно спрашивайте.
По кнопкам: одна кнопка пока чисто для отладки, не заморачивайтесь.
Вторая, все правильно:
- нажатие до 1 мигания -уточнение home (позиция, высота, итп). У меня такой ритуал запуска: после того как все включил, проверил, наловил спутники, похожу с моделью вокруг машины ( заодно проверяю работу антенного трекера… ). Затем ложу модель на несколько сек и смотрю насколько ушло показания расстояние до база, высота. Значения могут сильно отличаться от 0 (GPS уточнил высоту и положение), и если это так, жму кнопку до одного мигания- ура, опять все нолях…
- продолжать держать до двух миганий- режим “продолжения полета”. Тут такая штука…
АП определяет момент взлета после увеличения GPS-скорости больше минимальной (по конфигурации) и поднимает флаг- “Полет”. По этому флагу начинает работать таймер полетного времени. Если после этого скорость GPS станет равна 0, АП считает что самолет приземлился и записывает автоматом в eeprom значения таймера полетного времени, пройденное растояние и (главное!) количество съеденных мАч. Естественно отключаю батарею, прихожу в себя… Затем, если решу сделать еще полет на том-же акке, есть смысл при уточнении home подержать кнопку подольше и к текущему расходу акка, времени полета и пройденному пути будут добавлены значения из eeprom. Те система считает это продолжением полета и будет показывать реальное состояние батареи. А в конце полета можно оценить сколько км и сколько мин пролетели на одном акке, даже с промежуточными посадками.
-----
Самым неудобным моментом системы сейчас является привязка проводом пульта к передатчику, установленному на крыше авто… Может есть какие дешевенькие RF-модули желательно на 2.4 обеспечивающие уверенный цифровой линк до 15-20м? Интерфес… не знаю… UART что-ли…
Посмотрите на www.ebay.com/itm/…/251120188388 , есть разные варианты исполнения, но лучше использовать м/сх с + - nRF24L01+
Есть форум по ней - kazus.ru/forums/showthread.php?t=19992&page=1
Успехов!!!