miniscope v3
Na innych stronach zamieszczonych jest kilka opisów prostych przystawek oscyloskopowych do PC. Dokumentacja większości z nich nie jest jednak dostępna do bezpośredniego pobrania. Jedną z przyczyn jest negatywna opinia zaprzyjaźnionego zakładu leczenia nerwic i zaburzeń psychicznych który przeprowadzał ankietę wśród osób które już zapoznały się z kodem źródłowym. Problemy dotyczyły w szczególności kodu źródłowego programu PC, bardziej podatnego na bałagan przez swoją objętość (niewielką, ale jednak kilkakrotnie większą niż firmware).
Przedstawiony tutaj program stanowić ma uniwersalny interfejs - "wirtualny oscyloskop" -
współpracujący z różnym sprzętem (w tym zwykłą kartą dźwiękową).
Kompilator/IDE: darmowe Turbo C++ Explorer (BDS 2006). Silnie wskazane jest zainstalowanie aktualnych poprawek
(stan na dzień 2009.10.14: rollup z Hotfix 1-10, osobne Hotfix 11, 12, 13 dostępne
na stronie http://cc.embarcadero.com/ dla zarejestrowanych
użytkowników).
Aktualizacja: niestety Turbo C++ Explorer przestał być wspierany przez producenta, niewątpliwie stanowił
konkurencję dla produktów płatnych. Nie ma obecnie legalnej drogi do zarejestrowania nowej kopii programu.
Do uruchomienia programu potrzebne mogą być
(w zależności od opcji kompilacji danej wersji)
biblioteki cc3270MT.dll i cg32.dll.
Biblioteki należy umieścić w katalogu programu lub katalogu systemowym.
Program udostępniany jest na warunkach GPL v2. Jeżeli nie odpowiadają Ci warunki tej licencji możliwe jest indywidualne uzgodnienie innej licencji.
Dokumentacja: doxygen
Tworzenie bibliotek dll - interfejsów urządzeń
- 2008.12.30 Wstępny, testowy projekt zawierający klasę interfejsową modułu
wyświetlającego (Display) i implementację (DisplayOpenGL).
W chwili obecnej wyświetlanie ograniczone jest do jednego kanału. Funkcjonalność
obejmuje skalowanie, przesuwanie przebiegu, obsługę kursorów ekranowych, wyświetlanie
widma amplitudowego. Niezależnie od skalowania wyświetlanego przebiegu rozmiar samego
wyświetlacza można zmieniać dynamicznie.
- 2009.04.01 Zarys styku program główny - biblioteka dll obsługi urządzenia.
W paczce znajduje się biblioteka wavein.dll dostarczająca próbek z urządzenia
WAVEIN / WAVE MAPPER.
miniscope_v3_0_0_2.7z - 2009.07.02 Program główny, uaktualniona biblioteka wavein.dll oraz biblioteka armscope.dll
(współpraca z prostym oscyloskopem opartym o AT91SAM7S64) wraz ze źródłami. Wersja uzupełnia
braki związane z nastawami urządzenia oraz wprowadza kilka poprawek, w tym wyeliminowanie
zużycia czasu procesora przez moduł wykresu przy braku konieczności odświeżania zawartości.
- 2009.07.18 Wersja 0.0.6:
- zapis nastaw urządzenia wejściowego; implementacja zapisu należy do samej biblioteki dll urządzenia - armscope.dll korzysta z pliku generowanego/parsowanego z użyciem JsonCpp,
- przeładowywanie bibliotek urządzeń bez potrzeby restartu.
- 2009.08.21 Wersja 0.0.7:
- FIXED: brak aktualizacji typu sprzężenia przy starcie,
- FIXED: brak aktualizacji wykresu po resetowaniu powiększenia/przesunięcia,
- FIXED: etykiety osi X wyświetlane niepoprawnie w trybie FFT przy braku danych,
- FIXED: brak aktualizacji przy zmianie czułości/próbkowania/wyzwalania (trackbars) przy pomocy klawiatury,
- dodany tryb rejestratora przebiegów wolnozmiennych,
- włączone hinty,
- dodany pasek postępu reprezentujący odebraną z urządzenia część bufora,
- armscope.dll: libusb zaktualizowane to 0.1.12.1,
- wyłączone "Use dynamic RTL" (brak zależności od cc3270MT.dll),
- kursory rysowane są "powyżej" wykresu,
- wyświetlane aktualne wartości powiększenia w osi X i Y,
- dodany timestamp w oknie "About" i build-tools\touch.exe,
- dodane Statistics.cpp/StatisticsUnit.cpp - obliczanie wartości min/max/avg,
- dodany dialog przy starcie przy braku wybranej biblioteki urządzenia wejściowego,
- dodana opcja eksportu bitmapy wykresu do pliku (menu File),
- projekt armscope.dll NIE JEST zawarty w archiwum - do ściągnięcia ze strony miniscope v2.
- 2009.09.06 Wersja 0.0.8:
- FIXED: AV przy uruchamianiu gdy biblioteka urządzenia nie została znaleziona,
- wektor danych przekazywany do obiektu klasy Display reprezentuje bezpośrednio wartości fizyczne,
- kalibracja offsetu (zera) i czułości dla każdego zakresu czułości z osobna; wymagana
obsługa funkcji przez bibliotekę urządzenia wejściowego.
- 2009.09.11 Wersja 0.0.9:
- FIXED: zbędny wiodący znak backspace w nazwie pliku przy eksporcie bitmapy gdy domyślny katalog jest nieokreślony,
- włączone ScreenSnap dla części okien,
- dodany heksagonalny toolbox dla wykresu (włączany/wyłączany środkowym przyciskiem myszy),
- wybór biblioteki urządzenia wejściowego jest wymagany, aplikacja przerywa wykonywanie przy braku biblioteki,
- startowe ładowanie biblioteki wejścia przeniesione TfrmMain::OnShow, dodane okno informujące o ładowaniu
- dodany prosty eksport danych do formatów JSON (korzysta z biblioteki json-cpp) i CSV.
- 2009.09.12 Wersja 0.0.10:
- FIXED: losowe zatrzymanie (typowo w trybie ciągłego wyzwalania przy dodatkowym dużym obciążeniu CPU); kod VCL (odczyt stanu GUI) usunięty CallbackTriggerFn,
- FFT obliczane jest tylko po otrzymaniu z urządzenia pełnej ramki z danymi.
- 2009.09.17 Dodana biblioteka hidpic.dll.
Biblioteka hidpic.dll jest raczej kolejnym obok wavein.dll projektem testowym niż użytecznym narzędziem. Źródłem danych pomiarowych może być dowolny mikrokontroler firmy Microchip na którym uruchomiony został przykład Generic HID demo z pakietu MCHPUSB 2.5.
Ze względu na to, że program demonstracyjny przesyła w raportach HID pojedyńcze próbki z przetwornika maksymalna częstotliwość próbkowania jest niższa niż 1000 Hz. Z kilku przeprowadzonych prób wynika, że już przy próbach transmisji raportów z częstotliwością 200 - 300 Hz mogą występować rozbieżności między teoretyczną i praktyczną częstotliwością próbkowania.
Projekt demonstruje wykorzystanie MinGW jako narzędzia, istotnym krokiem jest wymuszenie zmiany sposobu dekoracji nazw eksportowanych funkcji poprzez opcje linkera -Wl,--add-stdcall-alias lub -Wl,--kill-at.
Zestawienie dekoracji nazw funkcji dll przez kompilatory
Ze względu na zależność projektów zawierających biblioteki wejściowe od plików nagłówkowych programu głównego wszystkie archiwa ze źródłami powinny być rozpakowywane do tego samego katalogu.
Download: miniscope.php.
Uwaga: projekt został skompilowany przy użyciu MinGW dystrybuowanego z Code::Blocks 8.02. Użycie nowszej wersji MinGW (dystrybuowanej z C::B 10.05, 4.4.1) wymaga dodania do opcji kompilacji -fshort-enums (użycie pól enum przy deklarowaniu interfejsu nie było najlepszym rozwiązaniem). - 2009.09.23 Wersja 0.0.11
- FIXED: niepoprawnie czyszczony zoom w trybie rejestratora; uproszczone ActionZoomClearExecute,
- display: funkcja automatycznego dopasowania powiększenia dla osi Y,
- display: dodany enum E_OFFSET_ACTION,
- display: offset X pozostaje stały przy używaniu funkcji zoom dla osi Y i odwrotnie.
- 2009.10.08 Wersja 0.0.12
- FIXED: nieskuteczne ustawienia widoczności siatki wykresu dla trybu rejestratora,
- statystyki aktualizowane po odebraniu pełnej ramki danych lub gdy okno statystyk zostanie przywołane a pełna ramka danych jest już odebrana,
- okno statystyk wyświetlane dopiero po załadowaniu biblioteki urządzenia,
- statystyki: dodany pomiar częstotliwości sygnału,
- dodane ustawienie przezroczystości dla okna narzędzi wykresu; ustawienie jest ignorowane jeżeli system operacyjny nie wspiera przezroczystości (win98).
- 2009.10.20. Wersja 0.0.13
- FIXED: niepowodzenie przy kompilacji projektu jeżeli w ścieżce projektu znalazła się spacja (niepoprawna komenda Pre-Build tools), podziękowania dla Łukasza za zgłoszenie,
- FIXED: widmo sygnału wyświetlane nieprawidłowo lub nie wyświetlane kiedy liczba próbek w buforze nie była potęgą 2,
- SOLVED: wysokie użycie czasu procesora przez moduł rysujący okazało się skutkiem ubocznym użycia CodeGuard; po wyłączeniu CodeGuard użycie czasu spadło około 30-krotnie: rysowanie 14k próbek trwa 3 ms na komputerze z Pentium M @ 600 MHz + ATI R9000,
- dodane automatyczne dopasowywanie powiększenia dla osi X,
- zmienione okno logowania,
- dodany TimeCounter.h - proste narzędzie ułatwiające pomiar czasu wykonywania,
- dodana informacja o włączonym CodeGuard i dołączonych informacjach dla debuggera w oknie "O programie".
- 2009.11.14. Wersja 0.0.14
- FIXED: na niektórych komputerach na wyeksportowanej bitmapie wykresu widoczny był pusty prostokąt - pozostałość po oknie wyboru pliku do zapisu,
- FIXED: niepoprawne wyświetlanie opisu wartości czułości, częstotliwości próbkowania, niepoprawny stan widoczności dodatkowych przycisków związanych z wyzwalaniem po wystąpieniu błędu połączenia z urządzeniem przy uruchamianiu programu,
- dodana funkcja podglądu zawartości wyeksportowanych plików JSON,
- panel sterowania oscyloskopu jest nieaktywny przy braku połączenia z urządzeniem,
- wskaźnik postępu odbioru ramki jest ukrywany w czasie pomiędzy odebraniem pełnej ramki a kolejnym zdarzeniem wyzwolenia,
- zmniejszony rozmiar zajmowany na dysku przez eksportowaną bitmapę (format zmieniony na 8 bit/piksel).
- 2010.01.24 sig_test.dll - plugin generujący definiowane przez użytkownika testowe sygnały.
sig_test_dll.7z
- 2010.03.24 Wersja 0.0.15
-
Szkielet dla filtrów przetwarzających sygnał bazujący na wzorcu fabryki
(A. Alexandrescu, Modern C++ Design). Wzorzec ten w tej postaci
jest bardzo dobrze skalowalny - dodanie nowego typu filtru ogranicza się
do dodania pojedyńczego pliku cpp do projektu, nie wymaga żadnych zmian
w innych plikach.
filter.zip - zmiany w zakresie odbierania danych z biblioteki - dane są buforowane w dodatkowym kontenerze (dataOscTmp) i przekazywane do wyświetlenia (dataOsc) dopiero po zebraniu pełnej ramki lub gdy podstawowy kontener nie jest jeszcze wypełniony; zmiana użyteczna dla miniscope v2a,
- tworzenie bitmapy przy zrzutach ekranu powierzone klasie ConcreteDisplay (std::auto_ptr<Graphics::TBitmap> CreateBitmap(void)),
- FIXED nie działający zrzut ekranu do schowka i do pliku na systemach Windows Vista and 7 (podziękowania dla Jakuba Niziołka za zgłoszenie).
-
Szkielet dla filtrów przetwarzających sygnał bazujący na wzorcu fabryki
(A. Alexandrescu, Modern C++ Design). Wzorzec ten w tej postaci
jest bardzo dobrze skalowalny - dodanie nowego typu filtru ogranicza się
do dodania pojedyńczego pliku cpp do projektu, nie wymaga żadnych zmian
w innych plikach.
- 2010.04.08 Wersja 0.0.16
- FIXED brak aktualizacji wykresu po załadowaniu pliku JSON (podziękowania dla Jakuba Niziołka za zgłoszenie),
- dodana funkcja ciągłej, szybkiej rejestracji danych do pliku binarnego we własnym formacie (MS3).
Plik w tym formacie pozwala na zapis do 4 GB danych (1 G próbek - każda próbka jest zapisywana jako float).
Przy współpracy z miniscope v2a pozwala to na ciągły zapis przez 2000 s przy jego maksymalnej
szybkości próbkowania (500 kSps). Przeglądanie zawartości pliku powinno być szybkie niezależnie
od jego rozmiaru - plik posiada indeks z offsetami ramek danych a w danym momencie ładowana
jest tylko pojedyńcza ramka.
miniscope_v3_0_0_16_src.7z - 2010.05.04 Wersja 0.0.17
- FIXED: widok FFT nie aktualizowany przy zmianie widocznej ramki danych przy odczycie pliku MS3,
- FIXED: brak możliwości włączenia widoku FFT przy braku podłączonego urządzenia (przy odczycie MS3),
- FIXED: błędny opis (zawsze "Skipped (non-compatible) libraryname.dll") w logu przy błędzie załadowania/weryfikacji biblioteki urządzenia (np. gdy załadowanie biblioteki nie powiodło się z powodu nie spełnienia dodatkowej zależności od innej, nieobecnej biblioteki),
- FIXED: możliwy access overrun przy otwieraniu uszkodzonego/fałszywego pliku MS3,
- interfejs dll: ignorowane cookie wewnątrz callbacka OnLog,
- konfigurowalny limit rozmiaru pliku przy zapisie do formatu MS3 (domyślnie 100 MB, zakres od 5 MB do 4000 MB), zapis jest zatrzymywany po osiągnięciu limitu,
- dodane nieblokujące okno notyfikacji, aktualnie używane do powiadomienia o limicie rozmiaru pliku MS3,
- zakres interwału czasu dla rekordera (tryb pracy obok FFT) ograniczony do zakresu 10 ms ... 7200 s, dodany dodatkowy przycisk zatwierdzający,
- przy odczycie pliku MS3 możliwe jest równoczesne załadowanie wielu kolejnych ramek danych; wskazane ramki muszą posiadać jednakową częstotliwość próbkowania (tylko ten parametr jest sprawdzany),
- MS3: dodany komunikat "file already exists" przy wskazywaniu pliku do nagrywania.
Możliwość zapisania i załadowania dużych ilości danych ułatwia dalszy pomiar wydajności rysowania. Na moim komputerze (Pentium M @ 600 MHz + ATI R9000) rysowanie 1310720 (1,25 M) próbek zajmuje około 260 ms. Czas ten nie zależy od rozmiaru wykresu (rozmiaru okna), ale zależy dosyć silnie od szybkości procesora - przełączenie procesora na taktowanie 1,6 GHz skraca czas rysowania dwukrotnie.
miniscope_v3_0_0_17_bin.7z
miniscope_v3_0_0_17_src.7z - 2010.05.16 Wersja 0.0.18
- FIXED: problem z ograniczaniem zakresu interwału akwizycji w trybie "recorder",
- dodane narzędzie do naprawy uszkodzonych plików ms3 z brakującą sekcją footer/index; to jedyny realistyczny typ uszkodzenia który może być skutkiem przerwania (zawieszenia/zabicia) programu w trakcie zapisu.
- 2010.05.22 Wersja 0.0.19
- FIXED: możliwy wyjątek EZeroDivide przy starcie (uniemożliwijący uruchomienie programu) przy funkcji glViewport() w module DisplayOpenGL wskutek nieinicjowania zmiennych iWidth, iHeight,
- dodana informacja o wersji biblioteki przy liście Settings / ScopePlugins.
- 2010.05.26 Wersja 0.0.20
- FIXED: możliwy błąd AV przy uruchamianiu wywołany hazardem inicjalizacji obiektów statycznych (DataFilterFactory::Register() wywołane przed utworzeniem obiektu typu DataFilterFactory).
- 2010.06.25 Wersja 0.0.21
- dodana możliwość wyboru okna FFT; poszczególne okna uzupełnione są o opis dotyczący zalecanego użycia i sortowane według szerokości głównego płata (rectangular, Hamming, Hamming, Blackman-Harris, top),
- dodana możliwość ograniczenia ilości próbek używanych przy obliczaniu FFT; liczba użytych próbek jest nie większa niż największa potęga dwójki mniejsza od liczby próbek w ramce danych,
- zmienione domyślne powiększenie i przesunięcie wykresu w trybie FFT (widok na ujemną część osi amplitudy jest zbędny),
- statystyka: dodany pomiar wartości RMS.
- 2010.10.16 Prowizoryczna biblioteka współpracująca z
Bus Pirate napisana z pomocą Šikloši Janoša.
Korzysta z trybu ciągłego próbkowania tego urządzenia (~5720 Sps, próbki 10-bit unsigned).
Udostępnia jedynie ręczne wyzwalanie, inne tryby wyzwalania czy symulowanie niższej częstotliwości próbkowania
można dodać wzorując się na źródłach armscope_dma.dll. Biblioteka jest zbudowana przy użyciu
Code::Blocks 10.05 i MinGW 4.4.1, przy tworzeniu projektu od zera należy pamiętać o dodaniu do opcji kompilacji
-fshort-enums (nie było to potrzebne przy MinGW dostarczanym z C::B 8.02) i wspomnianej wcześniej dekoracji
nazw eksportowanych funkcji.
Uwaga: numer portu szeregowego (domyślnie COM3) może być zmieniony tylko przez plik konfiguracyjny, brak w tym momencie okna konfiguracji biblioteki. Plik konfiguracyjny tworzony jest w katalogu /device (katalogu w którym umieszczać należy biblioteki) przy zamykaniu programu po pierwszym uruchomieniu.
bus_pirate_dll_20101016.7z
- 2010.10.21 Bus_pirate.dll: dodane wyzwalanie zboczem i ciągły strumień próbek.
bus_pirate_dll_20101021.7z
- 2010.10.25 Bus_pirate.dll: zgłoszony problem z
zamykaniem programu. Problem zniknął po wprowadzeniu kilku zmian w kodzie dll (bus_pirate_dll_20101025.7z),
ale prawdopodobnie został tylko ukryty - zalecałbym ciągle używanie wcześniejszej wersji.