OSD на ATmega1281

Syberian

Сергей, подскажите, как переназначить вывод MCI вместо окна в какую-нибудь переменную типа TImage?
Написал плеер, выковыривающий телеметрию из видео. Видео воспроизводится через TMediaPlayer, в котором в качестве Display можно назначить только оконный элемент: форму, панель, кнопку… Все бы хорошо, но если окно закрыто другим окошком или свернуто, информацию с кадра считать невозможно.

msv

Вроде для MCI нужно передавать HWND окна для отображения. Вероятно по этому TMediaPlayer.Display может быть только наследник от TWinControl, имеющий свойство Handle- по сути HWND. Конечно всех возможностей MCI не помню, но вполне может оказаться, что эта задача нерешаема…
Есть повод окунуться в DirectShow 😃, там эта задача легко решается. Даже можно не писать свой фильтр, пользовать готовый SampleGrabber.

Syberian

ага, там черт ногу сломит.
Нашел такой код:

#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, попробую его.

msv

Олег, имхо все эти библиотеки (в тч. MCI) по сути софтовые интерфейсы к этому. А зачем нам посредники? 😃 Конечно реальное приложение будет посложнее, вместо RenderFile придется свой граф собирать, но Intelligent Connect сделает всю самую сложную работу.
//-------------------------------------
Обновление FPVcap_1.2(beta). Исправлен тексты сообщений о ошибках, и вылеты на исключения при отсутствии железки захвата. Никаких принципиальных изменений.

28 days later
Vlado

Special… в свете последних достижений MSV сделал антенку для DX приложений на диапазон 400МГц. Измереный gain ~ 7dB, КНД порядка 9dB, ну и на модельке диполь с gain 2-5dB. ИМХО довольно перспективно, на какую сотню другую км потянет, обенно если тракт профессиональный, от какой либо р.станции:)

ubd

А чертёжик антенны можно?

ну и на модельке диполь с gain 2-5dB

И на самолете, обычный четверть волновый диполь?
Разве есть разница между, просто штырьком четверть волны?
И как определили 2-5 db.

И ещё вопрос, поляризация какая подразумевается?

msv

А я во какой коаксиал на 434 забабахал:

Подробности здесь.
Сверхзадача была уменьшить объемные габариты классической GP с тремя противовесами, торчащими во все стороны, для удобства хранения транспортировки.
-----
Самым неудобным моментом системы сейчас является привязка проводом пульта к передатчику, установленному на крыше авто… Может есть какие дешевенькие RF-модули желательно на 2.4 обеспечивающие уверенный цифровой линк до 15-20м? Интерфес… не знаю… UART что-ли…

Vlado
ubd:

А чертёжик антенны можно?

И на самолете, обычный четверть волновый диполь?
Разве есть разница между, просто штырьком четверть волны?
И как определили 2-5 db.

И ещё вопрос, поляризация какая подразумевается?

я подразумевал 3/4 ( 5/8 ) диполь у того гейн поболее а штырь на 400МГц нужна крыша ( пара кв метров ) в качестве противовеса иначе не работает. У штыря импеданс (36 + j20) Ом главное отмерить и прилепить к крыше по центру.
Поляризация ессно линейная.

msv

Имхо 5/8 имеет скромные 2-3db по сравнению с GP только в узком секторе. Зато на вполне “ходовых” углах возвышения имеет жуткие провалы…

Vlado
msv:

Имхо 5/8 имеет скромные 2-3db по сравнению с GP только в узком секторе. Зато на вполне “ходовых” углах возвышения имеет жуткие провалы…

Я собственно считал, как вариант 5/8 диполь, изогнутый буквой V. Он имеет вполне цивильную диаграмму, типо серпа, перекрывающую всю нижнюю полусферу а gein там около 5-6 dBi получается. Но это так, для коллекции. А провалы характерны для монопля ( штырь ) без противоеса.

msv
Vlado:

… изогнутый буквой V…

Хотелось бы ммана-модельку… Там бы и ДН поглядел…

dollop

Добрый вечер.
Извините, что встреваю в дискуссию, но уже голова квадратная.
Решил повторить проект Сергея. Собрал ОСД, но что-то не заладилось у меня совсем 😦
Мега после 3-5 включений перестает видится программатором (isp). Кажется слетают фьюзы, потому что фьюз-доктор в режиме параллельного программирования мегу поднимает. У меня последовательность действий такая:

  1. Подключаю isp программатор
  2. Заливаю бутлоадер
  3. Ставлю фьюзы на внешний кварц и бутлоадер, а также brownout protection
  4. Подключаюсь к ногам 28, 29 меги при помощи кабеля USB-UART
  5. Пытаюсь при помощи MegaLoad залить прошивку - выбираю hex и ставлю скорость 38400
  6. Как только MegaLoad пишет, что Waiting for device - подаю питание на ОСД. Ничего не происходит. Зеленый светодиод моргает.
  7. После пары-пятерки передергиваний питания саетодиод не мигает.
  8. Мегу считать/записать при помощи isp программатора невозможно. Подключаю фьюз доктор, сброшу фьюзы и все по-новой.
    Вот такая история на тему как я провел субботу 😃

UPD.
Залил просто хекс без бутлоадера. К конфигуратору коннектится, пока все пишет и читает.

msv

Константин, без паники! 😃

  1. На всякий скачайте последнее обновление OSD.rar, разархивируйте.
  2. Программатором залейте в OSD cvmegaload.hex и установите фузы согласно fuse.JPG.
  3. Запустите OSDcnf.exe. Выберете порт вашего USB-UART, нажмите Open.
  4. Подключите USB-UART вместо GPS-модуля ( к 28,29 ногам меги). Питание OSD отключено!
  5. Нажмите кнопка Flash, выберите файл osd.hex.
  6. В течении ~5сек(не помню точно, но без того чтобы кофейку попить), пока статус “Ready from target”, включите питание OSD.
  7. Несколько секунд наслаждайтесь процессом загрузки прошивки.

В принципе загрузка через бутлоадер сделана для возможности заливать прошивку прямо в поле, с ноута, без программатора (чем неоднократно пользовался). А так, конечно, можно сразу залить osd.hex сразу программатором, не заливая предварительно бутлоадер (только скорректировать фузы…)…

Удачи!
ЗЫ О! уже догадались сразу залить… 😃

dollop

Сергей, спасибо!
С таким порядком действий все работает в лучшем виде. GPS (mtk3329) нашелся сразу. Красотища, и плавненько вся анимация. Не налюбуюсь. Теперь жду когда приедет IMU и погоду.
Сергей, а подробнее про кнопки расскажите, пожалуйста.
S1 - если подержать секунды две - моргнет красный светодиод и запишется позиция home. А если подержать еще секунды две, то красный светодиод моргнет два раза и кажется тоже запишется home. Что-то со временем еще происходит 😃 Получалось его запустить на счет
Назначение S2 не выявил.

msv

Отлично! Теперь стоит пройти процедуру калибровок… Вещь неприятная, благо ее надо сделать только один раз.
Ну и проверить PPM, честно говоря в последних прошивках даже не проверял, пользуюсь только LRS.
Если будут вопросы, конечно спрашивайте.
По кнопкам: одна кнопка пока чисто для отладки, не заморачивайтесь.
Вторая, все правильно:

  • нажатие до 1 мигания -уточнение home (позиция, высота, итп). У меня такой ритуал запуска: после того как все включил, проверил, наловил спутники, похожу с моделью вокруг машины ( заодно проверяю работу антенного трекера… ). Затем ложу модель на несколько сек и смотрю насколько ушло показания расстояние до база, высота. Значения могут сильно отличаться от 0 (GPS уточнил высоту и положение), и если это так, жму кнопку до одного мигания- ура, опять все нолях…
  • продолжать держать до двух миганий- режим “продолжения полета”. Тут такая штука…
    АП определяет момент взлета после увеличения GPS-скорости больше минимальной (по конфигурации) и поднимает флаг- “Полет”. По этому флагу начинает работать таймер полетного времени. Если после этого скорость GPS станет равна 0, АП считает что самолет приземлился и записывает автоматом в eeprom значения таймера полетного времени, пройденное растояние и (главное!) количество съеденных мАч. Естественно отключаю батарею, прихожу в себя… Затем, если решу сделать еще полет на том-же акке, есть смысл при уточнении home подержать кнопку подольше и к текущему расходу акка, времени полета и пройденному пути будут добавлены значения из eeprom. Те система считает это продолжением полета и будет показывать реальное состояние батареи. А в конце полета можно оценить сколько км и сколько мин пролетели на одном акке, даже с промежуточными посадками.
Denn
msv:

-----
Самым неудобным моментом системы сейчас является привязка проводом пульта к передатчику, установленному на крыше авто… Может есть какие дешевенькие RF-модули желательно на 2.4 обеспечивающие уверенный цифровой линк до 15-20м? Интерфес… не знаю… UART что-ли…

Посмотрите на www.ebay.com/itm/…/251120188388 , есть разные варианты исполнения, но лучше использовать м/сх с + - nRF24L01+

Есть форум по ней - kazus.ru/forums/showthread.php?t=19992&page=1
Успехов!!!

varvar
msv:

Тут как раз и обновление поспело: FPVCap 1.1(beta)… Со “спасибами” не торопитесь, все-таки сыровато наверное…

Слишком старое сообщение - мое спасибо не подоспело 😃 Пришел новый китайский изикап - дорогая вещь, 6 баксов платил, однако 😃 С предыдущим прекрасно справлялся StkATVAp - тоже программа безо всяких плюшек. Новый не переварила. Ваша программа успешно переварила их по очереди - правда, когда перетыкаешь платки - информация берется из ini файла про старый модуль и приходится все перенастраивать, настройки на старый, соответственно, пропадают.
Но это так, к слову - а программа чем проще и меньше ресурсов кушать изволит - тем лучше.
То, что ini лежит на виду, а не зарыт в реестре - еще один громадный плюс.
Давным давно пользуюсь чьей-то Quick Start Menu - программа, которая работает под Windows размером 20кбайт (не мега или гига!) - это правильная программа.

Может, в FPV ветке напишите про нее (про свою, конечно, а не QSM) - то в одном, то в другом месте возникают у людей вопросы, на которые Ваши программа - отличный ответ. Сюда-то большинство народа не заглядывает.

Vlado

Там бы и ДН поглядел…

Под серпом я подразумевал такую диаграмму и конструкцию.
Два луча по 5/8 лямбды , вмесле диполь длинее лямбды.

Vlado

Тут еще… раз пaшла такая пьянка, в предверии праздников, реж последний огурец. Тут может и почитателям стакан о в. Раз стаканчик, два стаканчик а в результате OMNI на 2.5Гига, Ку ~ 4dB.

ubd

Начал паять IMU Сергея. Посмотрим что получитсья…

dollop

Аналогично. Со дня на день получаю 9DOF. Думаю, то ли платку свою разводить под IMU, то ли попросить у Сергея. Сколько думал, уже б свою сделал, но пока отсутствие в руках датчиков останавливает 😃