Skocz do zawartości

ElektronPL_WiTu

Użytkownicy
  • Zawartość

    36
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O ElektronPL_WiTu

  • Ranga
    3/10

Ostatnio na profilu byli

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

  1. Szczerze mówiąc wydaje mi się że to będzie za dużo roboty zważywszy, że tworzenie plików z polskimi znakami w tym zegarku jest potrzebne tylko gdy za pomocą aplikacji wysyłam plik z komputera na zegarek i jeśli wyśle plik z polskimi literami to fajnie by było żeby też to tak zapisał. Ale zdecydowanie istotniejsze jest dla mnie, aby zegarek dobrze zapisywał LFN a wystarcza mi to, że poprawnie otwiera pliki i foldery z takimi znakami bo to naprawdę było sporym problemem. Na razie zadowolę się takim rozwiązaniem, że gdy wyśle plik np. "testł.txt" to zegarek zapisze to jako "testl.txt" nie jest to najlepsze rozwiązanie, ale mogę je zaakceptować. Wielkie dzięki za pomoc, bo myślę, że sam bym sobie nie poradził (choć by dlatego, że myślałem, że wartości po '\' są dziesiętne xD) I serio mam nadzieję, że to już koniec z tym i jak będę się bawił na różne sposoby zegarkiem to nie odkryje kolejnego poważnego problemu z plikami Pozdrawiam!
  2. Chociaż jak tak sobie myślę, to zamienianie tych wartości w jakikolwiek sposób może powodować właśnie takie problemy. Dobrze myślę? Poza tym jeszcze jedno pytanko bo w putChar (tak samo jak w getChar) Jest jakiś if który zapisuje wartość w 3 różne "miejsca" static void lfnPutChar(ldir_t *ldir, uint8_t i, uint16_t c) { //if(c == 65459) c=322; if (i < LDIR_NAME1_DIM) { ldir->name1[i] = c; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM)) { ldir->name2[i - LDIR_NAME1_DIM] = c; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM + LDIR_NAME2_DIM)) { ldir->name3[i - LDIR_NAME1_DIM - LDIR_NAME2_DIM] = c; } } Zupełnie nie rozumiem jak to tutaj działa, czemu to tak wygląda?
  3. Już znalazłem co powoduje ten problem - poprawiona funkcja putName. Gdy wróciłem ją do stanu sprzed modyfikacji jest ok. Tylko znowu nie mogę tworzyć plików z polskimi znakami ale jeszcze nadzieja w wykrywaniu tych ogromnych wartości...
  4. Tak wszystko się poprawnie otwiera. Tylko nie wiem co napsułem że zrobił się taki problem. Na oryginalnej bibliotece jest wszystko ok. (oczywiście bez polskich znaków ale) Bo problem dotyczy także plików bez ani jednego polskiego znaku... Najgorsze że zasadniczo proces modyfikowania tej biblioteki był identyczny jak napisałeś bo robiłem plik z polskimi znakami na kompie a potem sprawdzałem na zegarku jakie wartości daje każdy znak w nazwie. a potem zrobiłem tak aby biblioteka robiła to samo...
  5. SUPER! nie koniec problemów. Tym razem nie chodzi tu nawet to polskie znaki, choć na początku tak myślałem. Jak za pomocą funkcji open tworze plik LFN - na liście plików pokazuje się poprawna nazwa, plik się otwiera wszystko jest ok. (tak jak widać na zrzucie ekranu) Ale gdy włożyłem kartę sd do czytnika to dostałem coś takiego. co teraz zrobić? i co podejrzewać o ten problem...
  6. Zaraz spróbuje zlokalizować a jak mi się to szybko nie uda tu już użyje dej obrzydliwej metody z wykrywaniem dużych wartości static void lfnPutName(ldir_t *ldir, const char* name, size_t n) { unsigned char val; size_t k = 13*((ldir->ord & 0X1F) - 1); for (uint8_t i = 0; i < 13; i++, k++) { val=name[k]; uint16_t c = val;//k < n ? name[k] : k == n ? 0 : 0XFFFF; lfnPutChar(ldir, i, c); } } Dobra, poprawiłem. name który jest char'em był wrzucany prosto do uint16_t i dlatego był ten problem.
  7. tylko że w arduino byte domyśle jest unsigned. To jak już gdzieś w bibliotece trzeba zamienić zmienną bo 16-bitowy int właśnie domyśle jest "signed" String filename2 = ""; byte val = 0; int j = 1; while (val != 3) { val = data[j]; if (val != 3) filename2 += char(val); j++; } long current_pos = 0; byte data2[32]; SdFile myFile2; myFile2.open((directory + filename2).c_str(), FILE_WRITE | O_TRUNC);
  8. ok no działa tylko nie podoba mi się to rozwiązanie. (przykład tylko dla ł w putChar) else if(c==65459) c = 322; // ł czy mogę jakoś zrobić żeby przy tworzeniu pliku te wartości były "normalne"? tj zamiast 65459 (czyli -77) po prostu 179...
  9. dobra mam pewną poszlakę. Sprawdziłem co się zapisało gdy fname wyglądał tak: "\263.txt" czyli "ł.txt" no i ł zostało zapsiane jako numer 65459. I teraz istotna sprawa - (DEC) 179 to 'ł' tylko że dla signed byte 179 to jest -77. A 65459 to jest właśnie -77 tylko w 16 bitowym słowie.
  10. Jednak pojawił się kolejny problem. Gdy plik nie istnieje a ja wywołam funkcje open i chce zapisać plik. (W takiej sytuacji zostaje on utworzony) to pojawia się problem. Zaraz będę diagnozować co się dokładniej dzieje, ale jakieś sugestie będą na pewno pomocne. Na razie zmodyfikowałem funkcje lfnPutChar żeby działała odwrotnie do getChar ale to nie pomogło. static void lfnPutChar(ldir_t *ldir, uint8_t i, uint16_t c) { if(c==230) c = 263; // ć else if(c==179) c = 322; // ł else if(c==156) c = 347; // ś else if(c==243) c = 243; // ó else if(c==185) c = 261; // ą else if(c==234) c = 281; // ę else if(c==159) c = 378; // ź else if(c==191) c = 380; // ż else if(c==241) c = 324; // ń else if(c==198) c = 262; // Ć else if(c==163) c = 321; // Ł else if(c==140) c = 346; // Ś else if(c==211) c = 211; // Ó else if(c==165) c = 260; // Ą else if(c==202) c = 280; // Ę else if(c==143) c = 377; // Ź else if(c==175) c = 379; // Ż else if(c==209) c = 323; // Ń if (i < LDIR_NAME1_DIM) { ldir->name1[i] = c; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM)) { ldir->name2[i - LDIR_NAME1_DIM] = c; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM + LDIR_NAME2_DIM)) { ldir->name3[i - LDIR_NAME1_DIM - LDIR_NAME2_DIM] = c; } }
  11. To dobry pomysł, zaraz zmienię, dzięki EDIT: Poprawiłem, działa. static uint16_t lfnGetChar(ldir_t *ldir, uint8_t i) { uint16_t ret=0; if (i < LDIR_NAME1_DIM) { ret = ldir->name1[i]; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM)) { ret = ldir->name2[i - LDIR_NAME1_DIM]; } else if (i < (LDIR_NAME1_DIM + LDIR_NAME2_DIM + LDIR_NAME2_DIM)) { ret = ldir->name3[i - LDIR_NAME1_DIM - LDIR_NAME2_DIM]; } if(ret==263) ret = 230; // ć else if(ret==322) ret = 179; // ł else if(ret==347) ret = 156; // ś else if(ret==243) ret = 243; // ó else if(ret==261) ret = 185; // ą else if(ret==281) ret = 234; // ę else if(ret==378) ret = 159; // ź else if(ret==380) ret = 191; // ż else if(ret==324) ret = 241; // ń else if(ret==262) ret = 198; // Ć else if(ret==321) ret = 163; // Ł else if(ret==346) ret = 140; // Ś else if(ret==211) ret = 211; // Ó else if(ret==260) ret = 165; // Ą else if(ret==280) ret = 202; // Ę else if(ret==377) ret = 143; // Ź else if(ret==379) ret = 175; // Ż else if(ret==323) ret = 209; // Ń return ret; }
  12. Dobra działa. Testowo w funkcji open zrobiłem coś takiego: size_t k = 13*(ord - 1); if (k >= len) { // Not found. lfnOrd = 0; continue; } for (uint8_t i = 0; i < 13; i++) { uint16_t u = lfnGetChar(ldir, i); if(u==263) u = 230; // ć else if(u==322) u = 179; // ł else if(u==347) u = 156; // ś else if(u==243) u = 243; // ó else if(u==261) u = 185; // ą else if(u==281) u = 234; // ę else if(u==378) u = 159; // ź else if(u==380) u = 191; // ż else if(u==324) u = 241; // ń else if(u==262) u = 198; // Ć else if(u==321) u = 163; // Ł else if(u==346) u = 140; // Ś else if(u==211) u = 211; // Ó else if(u==260) u = 165; // Ą else if(u==280) u = 202; // Ę else if(u==377) u = 143; // Ź else if(u==379) u = 175; // Ż else if(u==323) u = 209; // Ń if (k == len) { if (u != 0) { // Not found. lfnOrd = 0; } break; } if (u > 255 || lfnToLower(u) != lfnToLower(fname->lfn[k++])) { // Not found. lfnOrd = 0; break; } } I teraz działają wszystkie pliki i foldery (lfn i sfn)
  13. no nie. jeśli bym do bajtu zapisał 322 to w binarce dostane coś takiego 101000010 tylko że to jest 9 bitów więc ostatni znak zostanie obcięty, wyjdzie wtedy 01000010 a to jest 'B'. więc żeby to działało trzeba by przechowywać w stringu 'ł' jako 0xb3 potem już w bibliotece zamienić sobie to na te 322.
  14. no tak ł to jest (DEC) 179 ale w UTF-8. ł w nazwie pliku jest odczytywane jako (DEC) 322 a to się w bajcie nie mieści. I jak podaje mu \263 to nie znajduje bo on żeby znaleźć to bym musiał mu napisać \502, ale to jest niemożliwe.
  15. ja myślę że najłatwiej było by przechowywać nazwy plików w UTF-8 a w funkcji open napisać kod który skonwertuje w locie kody. tylko gdzie taki skrypt napisać...
×
×
  • Utwórz nowe...