Skocz do zawartości

Matthew11

Użytkownicy
  • Zawartość

    46
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

Matthew11 wygrał w ostatnim dniu 14 października

Matthew11 ma najbardziej lubianą zawartość!

Reputacja

34 Bardzo dobra

O Matthew11

  • Ranga
    3/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Coś mi się tutaj nie podoba, masz w slocie on_pushButtonLedOn_clicked() lokalny obiekt QElapsedTimer i chyba także taki sam obiekt z taką samą nazwą jako członka MainWindow. Z tego pierwszego nie korzystasz bo zaraz bo wyjściu z tego slotu zostaje on niszczony. A ten który jest w drugim slocie (jako członek MW) jest tylko restartowany. Czy to tłumaczy zachowanie które opisujesz?
  2. Najprostszy przykład (projekt z szablonu Qt Console Application): #include <QCoreApplication> #include <QDebug> #include <QElapsedTimer> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QElapsedTimer timer; qDebug() << timer.elapsed(); timer.start(); int d = 0; for(int i = 0; i <100000000; i++) { d++; } qDebug() << timer.elapsed(); return a.exec(); } Wynik: -9223366942238 235 Bez widocznego kodu @szeryf bardziej nie pomogę.
  3. Strzelam, że nie uruchomiłeś timera: pewnie brakuje wywołania tej metody: start(), możesz to sprawdzić - czy timer działa prawidłowo za pomocą isValid(),.
  4. Cześć @szeryf, jak zobaczysz sobie tutaj: https://doc.qt.io/qt-5/qtimer.html#accuracy-and-timer-resolution: "The accuracy of timers depends on the underlying operating system and hardware. " "All timer types may time out later than expected if the system is busy or unable to provide the requested accuracy. In such a case of timeout overrun, Qt will emit timeout() only once, even if multiple timeouts have expired, and then will resume the original interval" To dowiesz się, że wskazania mogą oscylować, ale generalnie powinny być akceptowalne w dużej mierze aplikacji używających QTimer, natomiast myślę, że problem u Ciebie nie występuje w dokładności QTimer, tylko podejściu, które zastosowałeś: stosujesz interwał = 1ms, czyli praktycznie wykorzystujesz QTimer do granicy możliwości, co może skutkować tym, że będziesz tracił wystąpienia sygnalizowane przez timeout() - czyli timer pokaże mniejszą niż zmierzoną długość czasu niż ta którą zmierzyłeś telefonem. Wydaje mi się że do tego zadania zdecydowanie lepiej nadaje się QElapsedTimer, który działa dokładnie tak jak chcesz - czyli stoper. QElapsedTimer możesz użyć do zmierzenia czasu, a QTimer do cyklicznego (np. co 60Hz) odświeżania interfejsu. Wtedy powinieneś uzyskać dokładnie to co chcesz.
  5. Zmieniłem dwie rzeczy w kodzie @ethanak : const na constepr, reszta pozostaje identyczna: //testy1.h: extern void pinOn(void); constexpr int PIN = 7; extern void digitalWrite(int, int); // sc1.cpp #include "testy1.h" // const int PIN = 7; int main(void) { pinOn(); } Budowanie ze wsparciem dla C++11: avr-gcc -std=c++11 -Os -Wl,--gc-sections -mmcu=atmega328p -o s1.elf sc1.cpp sd1.cpp dw.cpp avr-gcc -std=c++11 -Os -Wl,--gc-sections -mmcu=atmega328p -o s2.elf sc2.cpp sd2.cpp dw.cpp avr-size s1.elf text data bss dec hex filename 188 0 0 188 bc s1.elf avr-size s2.elf text data bss dec hex filename 188 0 0 188 bc s2.elf Jak widzimy przy wykorzystaniu constexpr osiągamy ten sam plik wynikowy co przy #define. * dodatkowo, gdy wyrzucimy extern z pliku testy1.h i zadeklarujemy i zdefiniujemy const int PIN = 7; znowu otrzymamy ten sam kod wynikowy co w przypadku użycia #define ale już bez konieczności używania C++11. Dlatego preferowaną metodą definiowania stałych w C++ jest definiowanie i deklarowanie ich w jednym miejscu. Dla ciekawych możliwości nowoczesnego C++ polecam prezentację Jasona Turnera: “Rich Code for Tiny Computers: A Simple Commodore 64 Game in C++17” którą można zobaczyć na youtube.
  6. Okej, w przypadku C @ethanak ma rację - const daje nam dodatkowy bagaż. Ale w przypadku gdy nasz kod jest w C++: avr-gcc -Os -S -o k1.s k1.cpp avr-gcc -Os -S -o k2.s k2.cpp diff k1.s k2.s 1c1 < .file "k1.cpp" --- > .file "k2.cpp" * sprawdzone na $avr-gcc -v -> gcc version 5.4.0 (GCC) ** https://godbolt.org/ kompiluje .cpp - dlatego wynikowy assembler był taki sam
  7. Co możemy szybko i łatwo sprawdzić porównując wynikowy assembler obu wersji: https://godbolt.org/z/AzPxGk który dla obu wersji jest identyczny pod AVR gcc 5.4.0 (różni się jedynie wartością, którą reprezentuje `PIN` w celu odróżnienia wersji).
  8. getBytes zwraca size_t jeśli mamy być poprawni, ale przyjmuje void * buf, więc rzutujesz na void* -> getBytes(key, (void *)tablica, 10);
  9. Okej, zatem void * oznacza wskaźnik na nieokreślony typ, Ty jako programista musisz zadbać na na jaki typ ten wskaźnik będzie wskazywał wykorzystując rzutowanie - więcej info: https://pl.wikipedia.org/wiki/Pusty_typ_danych#Definiowanie_wskaźników_do_danych_nieokreślonego_typu A przykładowe pisanie do abstrakcyjnego EEPROMu może wyglądać tak (uruchom w kompilatorze C++): // Example program #include <iostream> #include <string> #include <cstring> static uint8_t eepromMemory[256]; void write(const void* source, uint8_t size, uint8_t startIndex) { memcpy((eepromMemory + startIndex), source, size); } void read(void* destination, uint8_t size, uint8_t startIndex) { memcpy(destination, eepromMemory + startIndex, size); } int main() { int8_t dataToSave[4] = {-1, 0, 1, 2}; int8_t dataFromEeprom[4]; for(uint8_t i = 0; i < 4; i++) { printf("Item to save: %d \tValue: %d\n", i, dataToSave[i]); } printf("\n"); // rzutuje dataToSave na const void* write(reinterpret_cast<const void*>(dataToSave), 4*sizeof(int8_t), 5); for(uint8_t i = 0; i < 20; i++) { printf("Item in EEPROM: %d \tValue: %d\n", i, eepromMemory[i]); } printf("\n"); // rzutuje dataFromEeprom na void* read(reinterpret_cast<void*>(dataFromEeprom), 4*sizeof(int8_t), 5); for(uint8_t i = 0; i < 4; i++) { printf("Item retrieved from EEPROM: %d \tValue: %d\n", i, dataFromEeprom[i]); } return 0; } Efekt: Item to save: 0 Value: -1 Item to save: 1 Value: 0 Item to save: 2 Value: 1 Item to save: 3 Value: 2 Item in EEPROM: 0 Value: 0 Item in EEPROM: 1 Value: 0 Item in EEPROM: 2 Value: 0 Item in EEPROM: 3 Value: 0 Item in EEPROM: 4 Value: 0 Item in EEPROM: 5 Value: 255 Item in EEPROM: 6 Value: 0 Item in EEPROM: 7 Value: 1 Item in EEPROM: 8 Value: 2 Item in EEPROM: 9 Value: 0 Item in EEPROM: 10 Value: 0 Item in EEPROM: 11 Value: 0 Item in EEPROM: 12 Value: 0 Item in EEPROM: 13 Value: 0 Item in EEPROM: 14 Value: 0 Item in EEPROM: 15 Value: 0 Item in EEPROM: 16 Value: 0 Item in EEPROM: 17 Value: 0 Item in EEPROM: 18 Value: 0 Item in EEPROM: 19 Value: 0 Item retrieved from EEPROM: 0 Value: -1 Item retrieved from EEPROM: 1 Value: 0 Item retrieved from EEPROM: 2 Value: 1 Item retrieved from EEPROM: 3 Value: 2
  10. Nie do końca rozumiem co chcesz osiągnąć. Po co chcesz zamieniać tablicę typów int8_t na ciąg bajtów - skoro twoja tablica typów int8_t jest ciągiem bajtów sama w sobie - więc masz to tak jakby w gratisie. Chyba że przez 'bajt' rozumiemy liczbę bez znaku (0 - 255), co nadal nie zmienia faktu, że tablica jest ciągiem bajtów.
  11. Okej, to może pytanie bardziej z gatunku wiedzy o składni: Zakładając, że mamy tablicę: int arr[5] = {1,2,3,4,5}; Oraz interesuje nas element o indeksie: const int idx = 2; // zwróć liczbę 3 Wypisz wszystkie możliwe sposoby na uzyskanie dostępu do wartości elementu o indeksie 2, czyli wartości = 3, korzystając z C lub C++ (bez użycia wstawek assemblerowych).
  12. Co więcej jest darmowy nawet do użytku komercyjnego (bardzo dobra opcja dla startupu): https://www.autodesk.com/campaigns/fusion-360-for-hobbyists: "Fusion 360 is free for startups generating less than $100K per year in total revenue or wholly non-commercial hobbyist users"
  13. Ślędzę wątek od samego początku i coś w tych "wątkach" mi nie gra tak jak nie gra @ethanak . @wojtekizk napisałeś kilka postów wcześniej, że nie ma żadnego problemu z blokującymi funkcjami - podałeś przykład DS18B20 - że wystarczy je wrzucić do pętli razem z pracującym tam obiektem Timers i wszytsko się ładnie wykona w zadanych interwałach niezależenie od tego czy odczyt z czujnika będzie trwał np. 750ms a my np. chcemy z f = 1kHz sterować silnikiem. No i właśnie o to zapewne chodzi @ethanak że w obecnej formie klasa Timers nie zapewni nam pożądanego efektu. Bo niema tutaj - w takiej formie jak to przedstawiasz - mowy o tych prawdziwych wątkach, tylko nieblokującym sprawdzaniu timeout'ów.
  14. @Dominik111 Cześć, nieco ponad rok temu przez kilka miesięcy rozwijałem swój projekt drona. Celowałem w średniego drona (650mm rama i do 1-2 kg uciągu). Moim głównym założeniem było wykonanie wszystkiego od zera - kontrolera lotu od zera, zdalnego sterowania, firmware dla sterowników (jedynymi gotowymi komponentami były ESC do silników). Zrobiłem do tego aplikację na Androida (kontrola w bliskim zasięgu) i kontrola w dalekim zasięgu (zrobiłem do tego też swoją własną aparaturę RC). Udało mi się doprowadzić do wzbicia drona w górę i chwilowego utrzymania stabilnej pozycji w powietrzu, ale bez większych fajerwerków. Napisałem do tego ogrom oprogramowania i to co się nauczyłem to moje, ale nie nazwałbym całokształtu sukcesem. Moje doświadczenia: zrobienie własnego drona to bardzo dobry sposób na poszerzenie własnej wiedzy - pisałem aplikacje na PC, Androida i firmware do sterowników, używałem też MATLABA, testowałem też różne filtry do fuzji odczytów z IMU. Generalnie przeszedłem przez dużo ciekawych zagadnień Złe strony: próba wykonania większości od zera niekoniecznie popłaca - lepiej niektóre komponenty wybrać spośród tych dostępnych komercyjnie. Doprowadzenie własnego kontrolera lotu do stabilnej wersji to dość ciężki orzech do zgryzienia. Miałem duże problemy z utrzymaniem stabilności. Prawdopodobnie przez kiepski moduł IMU (komercyjne kontrolery mają nawet po 3 niezależne IMU). Dlatego uważam że lepszym pomysłem było by kupienie gotowego kontrolera lotu co zaoszczędziło by mi sporo czasu i nerwów. Jeśli jesteś zainteresowany tematem to ma moim githubie znajdziesz moje wszystkie programy (do sterownika, aparatury i aplikacji czy poszczególnych modułów) jak również pełną specyfikację. Większość softu jest na bardzo liberalnych licencjach więc możesz śmiało korzystać. Chętnie pomogę jeśli będziesz miał jakieś pytania związane z tematem.
  15. @Treker @matimoto87 Panowie, może posiadacie taką wiedzę - jak wygląda sprawa z licencją tego oprogramowania w przypadku zastosowania komercyjnego?
×
×
  • Utwórz nowe...