Nowe posty

xx Touchpad po pewnym losowym czasie przestaje reagować (3)
Wczoraj o 23:21:26
xx Automat/scrypt do uruchamiania bootowalnego USB (0)
Wczoraj o 22:15:41
xx Zdalne polaczenie z posrednikiem pod Ubuntu bez GUI (2)
Wczoraj o 20:59:31
xx Uprawnienia (1)
Wczoraj o 14:10:38
xx bład krytyczny na dysku, dysk jest w LVM (2)
2019-04-19, 06:38:20
xx Przekierowanie na bezpieczną stronę z SSL (1)
2019-04-16, 19:52:43
xx bootloader (4)
2019-04-13, 18:31:03
xx Ubuntu i Bluetooth (1)
2019-04-12, 10:12:18
clip Opera - odtwarzanie niektórych filmów nie działa (1)
2019-04-12, 00:41:50
xx Xubuntu i VirtualBox (2)
2019-04-11, 23:24:54

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości -

Strony: [1]
1
C/C++ / format obrazu firewire a video4linux
« dnia: 2012-03-01, 16:02:31 »
Działa, dzięki!
/* YUV2 (YUYV, YUV422) to RGB */
typedef struct
{
  char red;
  char green;
  char blue;
//char alpha;
} artifact;
/* artifact is the name of structure, pixel will be the name of the variable */

artifact YUV_to_Bitmap(int y,int u,int v)
{
   int r,g,b;
   artifact pixel;

   pixel.red =   0;
   pixel.green = 0;
   pixel.blue =  0;
// pixel.alpha = 0;

   // u and v are +-0.5
   u -= 128;
   v -= 128;

   // Conversion
   r = y + 1.370705 * v;
   g = y - 0.698001 * v - 0.337633 * u;
   b = y + 1.732446 * u;
/*
   r = y + 1.402 * v;
   g = y - 0.344 * u - 0.714 * v;
   b = y + 1.772 * u;
*/

/*
   y -= 16;
   r = 1.164 * y + 1.596 * v;
   g = 1.164 * y - 0.392 * u - 0.813 * v;
   b = 1.164 * y + 2.017 * u;
*/
   // Clamp to <0, 1> range
   if (r < 0) r = 0;
   if (g < 0) g = 0;
   if (b < 0) b = 0;
   if (r > 255) r = 255;
   if (g > 255) g = 255;
   if (b > 255) b = 255;

   pixel.red =   r;
   pixel.green = g;
   pixel.blue =  b;
// pixel.alpha = 0;

   return(pixel);
}

void yuyv2rgb (unsigned char *src, unsigned char *dest, unsigned long long int NumPixels)
{
artifact rgb1;
artifact rgb2;
  /* Poprawic bo nieelegancko */
  // register int i = (NumPixels + ( NumPixels >> 1 ))*4/3-1;
  /* Juz lepiej */
  register int i = (NumPixels << 1 )-1;                 /* 614400 Bytes in 640×480 YUYV frame */
  register int j = NumPixels + ( NumPixels << 1 )-1;    /* 921600 Bytes in 640×480 RGB frame */
  int y1, y2, u, v;
  int r, g, b;

  while (i > 0)
  {
    u  = (unsigned char) src[i--];
    y1 = (unsigned char) src[i--];
    v  = (unsigned char) src[i--];
    y2 = (unsigned char) src[i--];

   rgb1 = YUV_to_Bitmap(y1,u,v);
    dest[j--] = rgb1.red;
    dest[j--] = rgb1.green;
    dest[j--] = rgb1.blue;
   rgb2 = YUV_to_Bitmap(y2,u,v);
    dest[j--] = rgb2.red;
    dest[j--] = rgb2.green;
    dest[j--] = rgb2.blue;
  }
}

void v4lFrame_to_RGBIplImage(void *FirewireFrame, IplImage *OpenCV_image)
{
  yuyv2rgb((unsigned char *)FirewireFrame, (unsigned char *)OpenCV_image->imageData, 640*480);
}
Przy okazji dopisałem funkcję konwertującą obraz w formacie YUYV (bezpośrednio, bez konwersji do RGB) do jednokanałowego obrazu w skali szarości. Funkcja pobiera ramkę w formacie YUYV, przeskakuje bajty zawierające informacje o kolorze, a zapisuje tylko te z informacją o jasności:
/* YUV2 (YUYV, YUV422) to grayscale */
void yuyv2grey(unsigned char *src, /*IplImage *OpenCV_image*/unsigned char *dest, unsigned long long int NumPixels)
{
  register int i = (NumPixels <<1)-1;   /* 614400 Bytes in 640×480 YUYV frame */
  register int j = NumPixels-1;         /* 307200 Bytes in 640×480 grayscale frame */

  while (i > 0)
  {
  /*u  - we are skipping this byte */ src[i--];
  /*y1 - we are copying this byte */ dest[j--] = (unsigned char) src[i--];
  /*v  - we are skipping this byte */ src[i--];
  /*y2 - we are copying this byte */ dest[j--] = (unsigned char) src[i--];
  }
}

void v4lFrame_to_grayscaleIplImage(void *FirewireFrame, IplImage *OpenCV_image)
{
  yuyv2grey((unsigned char *)FirewireFrame, (unsigned char *)OpenCV_image->imageData, 640*480);
}

2
C/C++ / format obrazu firewire a video4linux
« dnia: 2012-02-27, 22:04:02 »
Znalazłem takie specyfikacje obydwu formatów:V4L2_PIX_FMT_YUV420 i V4L2_PIX_FMT_YUYV

Będzie się to dało zrobić modyfikując ten fragment:
#define YUV2RGB(y, u, v, r, g, b)\\
  r = y + ((v*1436) >> 10);\\
  g = y - ((u*352 + v*731) >> 10);\\
  b = y + ((u*1814) >> 10);\\
  r = r < 0 ? 0 : r;\\
  g = g < 0 ? 0 : g;\\
  b = b < 0 ? 0 : b;\\
  r = r > 255 ? 255 : r;\\
  g = g > 255 ? 255 : g;\\
  b = b > 255 ? 255 : b
Czy będę też musiał coś zmieniać tutaj?
void uyyvyy2rgb (unsigned char *src, unsigned char *dest, unsigned long long int NumPixels)
{
  register int i = NumPixels + ( NumPixels >> 1 )-1;
  register int j = NumPixels + ( NumPixels << 1 )-1;
  register int y0, y1, y2, y3, u, v;
  register int r, g, b;

  while (i > 0) {
    y3 = (unsigned char) src[i--];
    y2 = (unsigned char) src[i--];
    v  = (unsigned char) src[i--] - 128;
    y1 = (unsigned char) src[i--];
    y0 = (unsigned char) src[i--];
    u  = (unsigned char) src[i--] - 128;
    YUV2RGB (y3, u, v, r, g, b);
    dest[j--] = r;
    dest[j--] = g;
    dest[j--] = b;
    YUV2RGB (y2, u, v, r, g, b);
    dest[j--] = r;
    dest[j--] = g;
    dest[j--] = b;
    YUV2RGB (y1, u, v, r, g, b);
    dest[j--] = r;
    dest[j--] = g;
    dest[j--] = b;
    YUV2RGB (y0, u, v, r, g, b);
    dest[j--] = r;
    dest[j--] = g;
    dest[j--] = b;
  }
}
Czy pierwszy dotyczy pojedynczego piksela, a drugi całej klatki czy jest to bardziej skomplikowane?

3
C/C++ / format obrazu firewire a video4linux
« dnia: 2012-02-27, 19:27:11 »
Znalazłem program cvEyeTracker dzięki któremu można przy użyciu kamery zgodnej ze standardem firewire śledzić ruch źrenicy oka i obsługiwać komputer bez użycia rąk. Program powstał dla osób sparaliżowanych, które mogą poruszać tylko gałkami ocznymi. Nie mam kamery firewire więc chciałem zmodyfikować program tak, aby współpracował z kamerą Playstation 3 Eye. Kamera ta nadaje się doskonale do tego zastosowania - zalecają ją między innymi twórcy EyeWritera (pod Windows i Mac). Powstawiałem gdzie trzeba kod z przykładowego programu do obsługi urządzeń v4l o nazwie capturer oraz wykomentowałem fragmenty dotyczące przechwytywania z urządzeń standardu IEEE1394. Niestety wyświetlany obraz jest zniekształcony. Widzę dwa czaro-białe obrazy nałożone na siebie i przesunięte o połowę szerokości, jeden w lewo, drugi w prawo. Wydaje mi się że chodzi o różnicę w kodowaniu obrazu w urządzeniach firewire i w kamerach internetowych. Proszę o pomoc w szczególności osoby, którym znane są różnice w kodowaniu pojedynczych, nieskompresowanych klatek. Kamera PS3 Eye używa standardu YUYV, każda klatka zajmuje więc 640×480×2 bajtów. Problem może leżeć gdzieś w okolicach poniższej linijki. Kiedy zmieniam typ danych drugiego parametru funkcji wygląd obrazu nieco się zmienia.
memcpy(eye_image->imageData, (char*)buffers[0].start, monobytesperimage);
Kamerę wybieramy tutaj:
open_device (&fd, "/dev/video1");
/dev/video0 to kamerka wbudowana w mojego laptopa, /dev/video1 to PS3 Eye.
Kod źródłowy po moich przeróbkach w ostatnim poście.

4
C/C++ / wczytywanie pliku konfiguracyjnego
« dnia: 2010-03-16, 16:11:02 »
Zamiast fgets dałem funkcję getline. Dziękuję chmooreckowi za cenne rady. Zamieszczam kod programu i przykładowy plik konfiguracyjny, może się komuś przyda. Program otwiera plik, wczytuje kolejno wiersze i przypisuje wartości zmiennych łańcuchowych, znakowych i liczbowych (typu int).
#include 
#include
#include

char zmienna_string[20];
char zmienna_char;
int zmienna_int;
Funkcja podziel dzieli wczytane wiersze na nazwę funkcji i jej wartość.
void podziel(char* wiersz)
{  
int i= 0;
int dzielto = 0;
while (wiersz[i]!= '\\n')
  {    
  if (wiersz[i] == '=')
  {dzielto= 1;}
  i++;
  /* jeśli w wierszu występuje znak równości */
  }

if (wiersz[0] == '#')
  {dzielto= 0;
  /* jeśli wiersz NIE zaczyna się od hasza */
  }
 
if (dzielto== 1)
  {/* jeśli obydwa warunki są spełnione to funkcja dzieli wczytaną linię na nazwę zmiennej i jej wartość */
  char* zmienna= strtok (wiersz,"=");
  char* wartosc= strtok (NULL, "=");
  przytnij(wartosc);
  przypisz(zmienna, wartosc);
  }

  else
  {printf ("%s", wiersz);}/* jeśli we wczytanej linii niema znaku równości lub zaczyna się ona od hasza to jest jedynie wyświetlana */
}
Funkcja przytnij usuwa spacje i znaki tabulacji występujące przed wartością zmiennej.
void przytnij(char* wartosc)
{/* obcina spacje i znaki tabulacji na początku ciągu znaków */
if (wartosc[0] == ' ' || wartosc[0] == '\\t')
{/* jeśli pierwszym znakiem ciągu jest spacja lub znak tabulacji */
  while (wartosc[0] == ' ' || wartosc[0] == '\\t')
  {/* powtarza zagnieżdżoną pętlę dopóki nie napotka znaku innego niż spacja lub znak tabulacji */
  int i= 0;
      while (wartosc[i]!= '\\n')
      {
      wartosc[i]= wartosc[i+1];/* przypisuje i-temu znakowi wartość znaku i+1 przesuwając wiersz w lewo */
      i++;
      }
  wartosc[i-1]= '\\0';
  /* zamyka ciąg znaków */
  }
}

else
{
  int i= 0;
  while (wartosc[i]!= '\\n')
  {i++;}
  wartosc[i]= '\\0';
  /* zamyka ciąg znaków */
}
}
Funkcja przypisz przypisuje zmiennej wartość wczytaną z pliku.
void przypisz(char* zmienna, char* wartosc)
/* przypisuje zmiennej występującej w pliku konfiguracyjnym pod nazwą "zmienna" odpowiednią wartość */
/* nazwa zmiennej w kodzie programu może być identyczna z tą w pliku lub różnić się */
{
/* sprawdza kolejno czy wczytana z pliku nazwa zmiennej jest identyczna z nazwą
którejś ze zmiennych, których wartości ma przypisywać */

if (strcmp(zmienna,"zmienna_lancuchowa")==0) /* czy zmienna z pliku ma nazwę zmienna_lancuchowa */
{printf ("?");
 /* UWAGA! znak "ptaszka" wyświetlają się poprawnie tylko gdy terminal ma ustawione kodowanie UTF-8 */
 strcpy(zmienna_string, wartosc); /* przypisuje zmiennej wartość z pliku */
 printf (" %s %s\\n", zmienna, zmienna_string);} /* wyświetla nazwę zmiennej z pliku */
/*else {printf ("nie przypisuje wartości zmiennej łańcuchowej\\n");}*/

if (strcmp(zmienna,"zmienna_znakowa")==0)
{printf ("?");
 zmienna_char= wartosc[0];/* zmienna znakowa przyjmuje wartość pierwszego znaku na prawo od znaku równości (innego niż spacja czy znak tabulacji) */
 printf (" %s %c", zmienna, zmienna_char); /* wyświetla deskryptor oraz jego numer */
    if( strlen(wartosc) > 1)
    {printf (" (Uwaga! wartość w pliku ma długość %hd znaków!)", strlen(wartosc));}
 /* program ostrzega jeśli wartość zmiennej w pliku jest dłuższa niż jeden znak */
 printf ("\\n");
 /* i dopiero wtedy przechodzi do nowego wiersza */
}
/*else {printf ("nie przypisuję karty wartości zmiennej znakowej\\n");}*/

if (strcmp(zmienna,"liczba_calkowita")==0)
{printf ("?");
 zmienna_int = atoi(wartosc); /* funkcja atoi z biblioteki stdlib zamienia ciąg znaków składający się z cyfr na liczbę typu int */
 printf (" %s %hd\\n", zmienna, zmienna_int); /* wyświetla deskryptor oraz jego numer */
}
/*else {printf ("nie przypisuję wartości zmiennej liczbowej\\n");}*/


/* tutaj można wstawić przypisywanie kolejnych wartości zmiennym */
}
Funkcja wczytaj_config otwiera plik i wczytuje kolejne wiersze lub przypisuje zmiennym wartości domyślne jeśli pliku niema w katalogu z którego został uruchomiony program.
void wczytaj_config()
{
FILE *filepointer;
filepointer = fopen("./config.cfg","r");

if(filepointer == NULL)
  {
  puts("? Nie można otworzyć pliku z ustawieniami!\\nPrzypisywanie wartości domyślnych.");
  /* jeśli w katalogu z którego został uruchomiony program niema pliku konfiguracyjnego */
  /* to program przypisuje zmiennym wartości domyślne */
 
  strcpy(zmienna_string, "domyślna wartość");
  /* przypisywanie wartości zmiennej łańcuchowej */
  zmienna_char= 'N';
  /* przypisywanie wartości zmiennej typu char */
  zmienna_int= 16;
  /* przypisywanie wartości zmiennej typu int */
  }

else
  {
  printf("Otwarcie pliku z ustawieniami\\n");
  char * wiersz = NULL;
  size_t rozmiar= 0;
  ssize_t bufor;

    while ((bufor= getline(&wiersz, &rozmiar, filepointer)) != -1)
    {
    podziel(wiersz);/* wczytuje kolejne linie i wywołuje funkcję podziel */
    }
  fclose(filepointer);
  printf("Zamknięcie pliku z ustawieniami\\n");
  }
}
Przykładowa funkcja main:
int main()
{wczytaj_config();
return 0;}
Przykładowy plik config.cfg:
zmienna_lancuchowa=	/home/msuma
zmienna_znakowa= T
liczba_calkowita= 666

# po znaku równości mogą być spacje lub znaki tabulacji
# wszystko na prawo od ostatniego ostępu jest wartością
# puste linie, linie nie zawierające znaku "="
# oraz linie zaczynające się od "#" są tylko wyświetlane
# jeśli wartość zmiennej znakowej jest dłuższa niż jeden znak
# to przypisywany jest tylko pierwszy znak

5
C/C++ - GNOME/Gtk / Powtarzające się wciśnięcie klawisza
« dnia: 2010-03-14, 01:20:44 »
Nie chciałbym korzystać z tego sposobu, ale jeśli innego nie będzie to dobre i to. Najlepiej byłoby gdyby program miał bezpośredni dostęp do klawiatury, ale do tego musiałby być uruchamiany przez roota. Bardzo dobrze by było gdyby rozróżniał wciśnięcie, zwolnienie i przytrzymanie klawisza. Jeśli nie da się tego osiągnąć to zadowoliłbym się funkcją wyłączającą "Powtarzanie naciśnięcia klawisza przy jego przytrzymaniu" zaraz po uruchomieniu programu i włączającą z powrotem przed jego zamknięciem. Chyba jasno się wyraziłem.
Polecenie zmieniające częstotliwość i opóźnienie to sudo kbdrate -r 10 -d 250 (w tym przypadku 10 znaków na sekundę po 250 milisekundach od wciśnięcia klawisza). Co zrobić żeby program wykonywał je na początku i na końcu i jakie parametry wyłączają powtarzanie klawiszy całkowicie?
Czy ktoś miał kiedyś podobny problem?

6
C/C++ - GNOME/Gtk / Powtarzające się wciśnięcie klawisza
« dnia: 2010-03-13, 23:15:28 »
Z deskryptorem różnie bywa. Nawet na dwóch komputerach z tym samym systemem deskryptor się różnił. Porzuciłem to podejście bo program musiałem uruchamiać jako root.
Dopisałem zaproponowany przez Ciebie warunek, ale nic się nie zmienia. Problem w tym że klawiatura wysyła powtórzenie klawisza co kilkadziesiąt milisekund (typematic repeat rate), a GDK nie rozróżnia tych powtórzeń od prawdziwych zdarzeń naciśnięcia i zwolnienia klawisza. Pole hardware_keycode w strukturze GdkEventKey powinno zawierać cały kod klawisza generowany przez klawiaturę, ale jest on niestety identyczny dla wciśnięcia, zwolnienia i przytrzymania. Chodzi mi o tę jedną cyferkę rozróżniającą je (0, 1 lub 2). Jak się do niej dostać?
void klawisz_wcisniety(GtkWidget *widget,  GdkEventKey *event, gpointer  data)
{
/*funkcja wykonywana w momencie wciśnięcia klawisza*/
  uint klawisz;
  uint klawisz_hardware;
 
  klawisz = ((GdkEventKey*)event)->keyval;
  klawisz_hardware = ((GdkEventKey*)event)->hardware_keycode;
  GdkEventType typ_zdarzenia;  
  typ_zdarzenia = ((GdkEventKey*)event)->type;
if (typ_zdarzenia == GDK_KEY_PRESS || typ_zdarzenia == GDK_KEY_RELEASE)
{printf("klawisz wcisnięty: %8hd,%8hd\\n", klawisz, klawisz_hardware);}
/*tymczasowa funkcja wyświetlająca kody wciśniętego klawisza*/
}


void klawisz_zwolniony(GtkWidget *widget,  GdkEventKey *event, gpointer  data)
{
/*funkcja wykonywana w momencie zwolnienia klawisza*/
  uint klawisz;
  uint klawisz_hardware;
 
  klawisz = ((GdkEventKey*)event)->keyval;
  klawisz_hardware = ((GdkEventKey*)event)->hardware_keycode;
  GdkEventType typ_zdarzenia;  
  typ_zdarzenia = ((GdkEventKey*)event)->type;
if (typ_zdarzenia == GDK_KEY_PRESS || typ_zdarzenia == GDK_KEY_RELEASE)
{printf("klawisz zwolniony: %8hd,%8hd\\n", klawisz, klawisz_hardware);}
/*tymczasowa funkcja wyświetlająca kody zwolnionego klawisza*/
}

int main( int argc, char *argv[])
{
gtk_signal_connect(GTK_OBJECT(window),"key_press_event", G_CALLBACK(klawisz_wcisniety), NULL);
gtk_signal_connect(GTK_OBJECT(window),"key_release_event", G_CALLBACK(klawisz_zwolniony), NULL);
}
Próbowałem wykluczać powtarzające się pary zdarzeń zwolnienie-naciśnięcie, które mają ten sam czas wystąpienia, ale nie jest to zbyt eleganckie rozwiązanie i nie daje zadowalających rezultatów. Poza ty sprawy bardzo się skomplikują kiedy będę naciskał i puszczał kilka klawiszy jednocześnie.
Znalazłem też w: System/Preferencje/Klawiatura opcję "Powtarzanie naciśnięcia klawisza przy jego przytrzymaniu" (w systemie Ubuntu 9.10). Czy dałoby się zrobić tak żeby była ona wyłączana w momencie uruchomienia programu i włączana z powrotem przy jego zamknięciu?

7
C/C++ - GNOME/Gtk / Powtarzające się wciśnięcie klawisza
« dnia: 2010-03-12, 22:18:09 »
Piszę program z użyciem biblioteki GTK. Chciałbym żeby wykonywał pewną funkcję w momencie naciśnięcia klawisza na klawiaturze i inną w momencie zwolnienia go. Niestety GTK nie rozróżnia wciśnięcia klawisza od powtórzenia go, więc trzymając klawisz przez dłuższy czas cykl wciśnięcie-zwolnienie powtarza się wielokrotnie. Czy jest jakiś sposób na ominięcie tego problemu?
Wiem że klawiatura wysyła różne sygnały w zależności od tego czy klawisz był rzeczywiście w tym momencie wciśnięty czy tylko przytrzymany. Można to zaobserwować wykonując polecenie hexdump -x /dev/input/event1 (gdzie /dev/input/event1 to deskryptor klawiatury). Kiedy klawisz jest wciskany jedna z wyświetlanych wartości wynosi 1, kiedy jest zwalniany: 0, a kiedy przytrzymany: 2. Czy używając GTK można jakoś uzyskać dostęp do nieprzetworzonych danych wysyłanych przez klawiaturę w celu rozróżnienia tych przypadków?
Wiem też że można wysłać do układu elektronicznego klawiatury polecenie przełączające ją w tryb, w którym nie wysyła powtórzeń klawiszy (typematic repeat delay i typematic repeat rate), ale nie chciałbym korzystać z tego sposobu.

void klawisz_wcisniety(GtkWidget *widget,  GdkEventKey *event, gpointer  data)
{
/*funkcja wykonywana w momencie wciśnięcia klawisza*/
  uint klawisz;
  uint klawisz_hardware;
 
  klawisz = ((GdkEventKey*)event)->keyval;
  klawisz_hardware = ((GdkEventKey*)event)->hardware_keycode;
 
printf("klawisz wcisnięty: %8hd,%8hd\\n", klawisz, klawisz_hardware);
/*tymczasowa funkcja wyświetlająca kody wciśniętego klawisza*/
}


void klawisz_zwolniony(GtkWidget *widget,  GdkEventKey *event, gpointer  data)
{
/*funkcja wykonywana w momencie zwolnienia klawisza*/
  uint klawisz;
  uint klawisz_hardware;
 
  klawisz = ((GdkEventKey*)event)->keyval;
  klawisz_hardware = ((GdkEventKey*)event)->hardware_keycode;
 
printf("klawisz zwolniony: %8hd,%8hd\\n", klawisz, klawisz_hardware);
/*tymczasowa funkcja wyświetlająca kody zwolnionego klawisza*/
}

int main( int argc, char *argv[])
{
gtk_signal_connect(GTK_OBJECT(window),"key_press_event", G_CALLBACK(klawisz_wcisniety), NULL);
gtk_signal_connect(GTK_OBJECT(window),"key_release_event", G_CALLBACK(klawisz_zwolniony), NULL);
}

8
Jaką dystrybucję wybrać? / Bardzo słabiutki sprzęt.
« dnia: 2010-02-11, 17:20:23 »
Zaniosłem kość BIOS do przeprogramowania i zainstalowałem ją z powrotem. Nadal się nie uruchamia. Jak myślicie... czy dałoby się to odkręcić stosując metodę hot flashing?

1. Kupuję albo pożyczam drugi identyczny terminal z oryginalnym Windows CE.
2. Konfiguruję narzędzie Update do pobierania obrazu z sieci.
3. Wyjmuję BIOS przy włączonym komputerze.
4. Wkładam źle zflashowany BIOS.
5. Uruchamiam Update.
6. Wyjmuję zflashowany BIOS i wkładam go do pierwszego terminala, a ten wyjęty w punkcie trzecim z powrotem do drugiego terminala.

Czy używając programu uniflash mógłbym przeprowadzić tę operację na dowolnym komputerze?

Jak myślicie dlaczego komputer się nie uruchamia mimo że zawartość BIOSu jest (najprawdopodobniej) prawidłowa. Przepraszam za podwójnego posta, chciałem podbić temat.

9
Jaką dystrybucję wybrać? / Bardzo słabiutki sprzęt.
« dnia: 2010-02-07, 10:22:54 »
Wgrałem wskazany przez tomcia obraz podmieniwszy wcześniej plik LEO_code na odpowiedni dla mojego modelu, ale terminal się nie uruchamia. Co gorsza nie działa flashowanie przez kabel laplink. Nie rozumiem dlaczego - przecież plik biosu jest właściwy. Czy da się jeszcze coś zrobić czy zbrickowałem ten terminal?

10
Jaką dystrybucję wybrać? / Bardzo słabiutki sprzęt.
« dnia: 2010-01-28, 19:16:20 »
Serdeczne dzięki tomciu. Gdy tylko będę w domu sprawdzę ten sposób. Już podmieniłem plik BIOS-u na odpowiedni dla mojego modelu i przygotowałem pendrive z Damn Small Linux-em, pozostaje więc tylko sflashować.
Tylko jedno polecenie jest dla mnie niejasne:
./make-nk -k ../bzImage -i ../initrd.img.orig
Parametr -k wskazuje plik jądra, którego niestety nie udało mi się skompilować więc ten etap na razie pominę i użyję pliku nk.bin ze wskazanego przez Ciebie pakietu.
-k 	Kernel file (MUST be in bzImage format)
Parametr -i wskazuje ramdisk file:
-i 	Initial ramdisk file (default: none)
Czy dobrze zrozumiałem, że ten plik dołączony do nk.bin powoduje utworzenie w pamięci operacyjnej terminala ramdysk? Skąd wziąć plik initrd.img.orig, tak na przyszłość gdybym nauczył się kiedyś kompilować jądro według własnych potrzeb?

Jeszcze jedno pytanie: Jak myślicie, czy taki moduł WiFi, Bluetooth, hub USB będzie działał na tym komputerze?

11
Jaką dystrybucję wybrać? / Bardzo słabiutki sprzęt.
« dnia: 2010-01-23, 00:35:07 »
Program make-nk łączy jądro linuxa z bootloaderem. Program fwpack przygotowuje pakiet firmware-u zawierający BIOS i system operacyjny. Program xfer.exe działający pod DOS-em służy do flashowania pamięci terminala przy użyciu kabla LapLink.

12
C/C++ / wczytywanie pliku konfiguracyjnego
« dnia: 2010-01-23, 00:15:17 »
Znalazłem rozwiązanie. Okazało się że zdefiniowałem zmienne przechowujące ścieżki deskryptorów jako zmienne wskaźnikowe:
char* keyboard_descriptor;
char* joystick_descriptor;
a powinienem jako ciągi znaków:
char keyboard_descriptor[20];
char joystick_descriptor[20];
Po naprawieniu tego błędu kompilator przypomniał mi że nie mogę ot tak sobie:
keyboard_descriptor= "/dev/input/event5";
joystick_descriptor= "/dev/js0";
przypisać zmiennym typu char[20] wartości typu char*.

Musiałem więc zmienić przypisania z takich:
if (strcmp(zmienna,"deskryptor_klawiatury")==0)
{keyboard_descriptor= wartosc;}

if (strcmp(zmienna,"deskryptor_joysticka")==0)
{joystick_descriptor= wartosc;}
na takie:
if (strcmp(zmienna,"deskryptor_klawiatury")==0)
{strcpy(keyboard_descriptor, wartosc);}

if (strcmp(zmienna,"deskryptor_joysticka")==0)
{strcpy(joystick_descriptor, wartosc);}
Funkcja strcmp porównuje czy ciągi znaków są takie same. Powtarzana przy każdym wczytaniu nowego wiersza znajduje zmienne użyte w programie w tekście pliku konfiguracyjnego. Następnie funkcja strcpy przypisuje zmiennej (powyżej na przykładzie keyboard_descriptor i joystick_descriptor) wartość pobraną z pliku konfiguracyjnego.
Cały program przechwytuje zdarzenia joysticka i klawiatury (wymaga uruchomienia jako administrator). Następnie odpowiednio wychyla ramię serwomechanizmów sterowanych przez serwokontroler SK18 lub steruje obwodami elektrycznymi za pośrednictwem karty przekaźników. Ścieżki do deskryptorów tych urządzeń i inne parametry wczytuje z pliku konfiguracyjnego.

13
Jaką dystrybucję wybrać? / Bardzo słabiutki sprzęt.
« dnia: 2010-01-22, 16:05:50 »
Mam podobny problem. Kupiłem terminal Compaq T1000 typu thin client ze względu na małe zużycie energii, zasilanie napięciem 5V i chłodzenie pasywne. Niestety zainstalowanie linuxa na tym komputerze okazało się trudniejsze niż myślałem. Znalazłem stronę winterm.gaast.net na której znajdują się narzędzia służące do przygotowywania pakietów z systemem linux do zainstalowania na komputerach WYSE serii 3000. Mój Compaq jest klonem modelu 3315SE lub 3350SE. Postaram się zawrzeć w tym poście wszystko czego na razie dowiedziałem się o instalacji systemu na komputerach tego typu. Może znajdzie się ktoś z obszerną wiedzą na temat procesu uruchamiania systemu linux i budowy jego jądra, kto pomoże mi z instalacją.
Przygotowywanie pakietu z linuxem należy rozpocząć od pobrania pakietu firmware ze strony producenta czyli WYSE lub HP. Pakiet samorozpakowujący o nazwie na przykład sp20093.exe należy rozpakować pod systemem Windows lub przy pomocy Wine. Znajdują się w nim plik 441-22T1000rdp.rsp oraz folder 441-22T1000rdp. Nazwy mogą się różnić w zależności od producenta, modelu i wersji oprogramowania. W folderze znajdują się pliki params.ini, bootstrap.exe (potrzebne przy flashowaniu firmware-u z serwera FTP) oraz plik L4412251.cpq. Jest to pakiet zawierający jednocześnie BIOS oraz system operacyjny Windows CE.
Istnieją dwie metody podmiany oprogramowania.
Pierwsza polega na umieszczeniu powyższych plików na serwerze FTP i uruchomieniu na terminalu podłączonym do internetu opcji update. Niestety metoda ta ma zasadniczą wadę. Opcja update jest częścią systemu Windows CE. Możemy z niej korzystać do woli uaktualniając system do nowszych wersji. Natomiast gdy pobierzemy linuxa narzędzie update zostanie wymazane z pamięci.
Druga metoda zakłada użycie kabla typu LapLink. Należy pobrać program xfer.exe oraz przygotować plik .cpq. Obydwa pliki należy umieścić na komputerze stacjonarnym posiadającym port LPT. Komputer połączyć z terminalem przy pomocy kabla LapLink w ten sposób, że komputer stacjonarny jest serwerem (będzie udostępniał pakiet z systemem), a terminal jest klientem (będzie go pobierał). Następnie uruchamiamy komputer stacjonarny z dyskietki startowej (lub płyty bootującej z systemem DOS), przechodzimy do dysku na którym znajdują się xfer.exe oraz pakiet z systemem i uruchamiamy udostępnianie poleceniem R:\\xfer.exe L4412251.cpq. Kiedy uruchomimy terminal przyciskiem power, zacznie on pobierać nowy system z komputera stacjonarnego.
Najpierw pobierze pakiet (8Mb, 16MB lub więcej - w zależności od modelu) do pamięci operacyjnej, potem skasuje BIOS i flash, a na koniec skopiuje do nich nowe oprogramowanie i zresetuje się. Tak wygląda wgrywanie nowego firmware-u, proste prawda?
Tylko że ten firmware trzeba jeszcze przygotować! Do tego służą narzędzia autorstwa Wilmera van der Gaasta.
fwextract - Wyodrębnia pliki z pakietów .cpq.
fwpack - Pakuje pliki z linuxem do pakietów .cpq.
cs - Oblicza sumę kontrolną, która ma przekonać terminal, że pobiera oryginalne oprogramowanie.
make-nk - Łączy jądro systemu w formacie bzImage z plikiem boot, który w teorii powinien załadować resztę systemu.
Wszystkie te narzędzia są do pobrania ze strony winterm.gaast.net w dziale downloads. Ich sposób działania jest szczegółowo opisany w odpowiednich plikach readme. Jako parametry przyjmują one ścieżki do plików, które mają rozpakować lub spakować.

Pierwszym plikiem w pakiecie musi być zawsze MID_code lub LEO_code (w zależności od producenta) czyli zawartość BIOS-u. Jeśli wgramy nieodpowiednią wersję BIOS-u to komputer nie uruchomi się i nie będzie można naprawić tego błędu przez kabel LapLink! Dlatego właśnie do przygotowania pakietu z linuxem potrzebny jest oryginalny pakiet ze strony producenta. W przypadku wgrania złego BIOS-u sprzęt nie jest jeszcze do wyrzucenia. Można wgrać właściwy BIOS przy pomocy specjalnego programatora. Kolejnym plikiem, który musi znaleźć się w pakiecie jest k (po prostu k). Te dwa pliki wyodrębniamy z oryginalnego pakietu oprogramowania przy pomocy narzędzia fwextract. Opcjonalnie można dołączyć obraz poweron.bmp, który będzie wyświetlany zaraz po uruchomieniu komputera. Należy zastosować format kompresji identyczny jak w wyeksportowanej bitmapie. Plik nk.bin zawiera jądro systemu w formacie bzImage oraz bootloadera. Przygotowujemy go przy pomocy narzędzia make-nk

Jedyną znaną mi dystrybucją mieszczącą się w 8Mb pamięci jest microcore ze strony tinycorelinux.com. Bootloader podobno ładuje system z pendrive-a. Na stronie winterm.gaast.net był kiedyś specjalnie skrojony do tego celu Damn Small Linux. Niestety jeszcze nie udało mi się uruchomić systemu w ten sposób. Nie wiem na którą metodę się zdecydować. Kombinować z miniaturowymi dystrybucjami czy z uruchamianiem systemu z pendrive-a.

Będę wdzięczny jeśli ktoś podpowie mi jak zainstalować system na tym terminalu. Trudność polega na tym że nie mamy swobodnego dostępu do dysku. Plik .cpq zawiera BIOS, oraz cały system plików który ma się znaleźć w pamięci flash, przy czym plik nk.bin jest ładowany w pierwszej kolejności (szczegóły w plikach readme dostarczonych przez Wilmera).

14
C/C++ / wczytywanie pliku konfiguracyjnego
« dnia: 2010-01-22, 13:39:46 »
Piszę program, który ma wczytywać ustawienia z pliku konfiguracyjnego. Chodzi głównie o deskryptory urządzeń, które są różne na poszczególnych komputerach.
Program otwiera plik i wczytuje kolejno wiersze:
void wczytaj_config()
{
FILE *filepointer;
filepointer = fopen("config.cfg","r");
char *wiersz;
if(filepointer == NULL)
{
puts("Nie można otworzyć pliku z ustawieniami");
/* tutaj przypisać wartości domyślne */
strcpy(keyboard_descriptor, "/dev/input/event5");
strcpy(joystick_descriptor, "/dev/input/js0");

comport_relayboard= 16;
comport_sk= 0;
}

else
{printf("[OTWARCIE PLIKU CONFIG]\\n");
while (fgets(wiersz,80,filepointer) != NULL)
{podziel(wiersz);}

fclose(filepointer);
printf("[ZAMKNIĘCIE PLIKU CONFIG]\\n");
}
}
Następnie (jeśli wiersz zawiera znak równości i nie zaczyna się od hasza) funkcja podziel dzieli wczytane wiersze na nazwę zmiennej (na lewo od znaku równości) i wartość zmiennej (na prawo od znaku równości):
int podziel(char* wiersz)
{  
int i= 0;
int dzielto = 0;
while (wiersz[i]!= '\\n')
{    
if (wiersz[i] == '=')
{dzielto= 1;}
i++;
/* jeśli w wierszu występuje znak równości */
}

if (wiersz[0] == '#')
{dzielto= 0;
/* jeśli wiersz NIE zaczyna się od hasza */
}  
  if (dzielto== 1)
  {
  char* zmienna= strtok (wiersz,"=");
  char* wartosc= strtok (NULL, "=");
przytnij(wartosc);
printf ("zmienna:<%s>, wartosc:<%s>\\n",zmienna, wartosc);
przypisz(zmienna, wartosc);
}

else
{printf ("niedziel: %s", wiersz);}
}
Funkcja przytnij obcina znak przejścia do nowego wiersza na końcu wartości oraz spacje na początku (jeśli występują).
void przytnij(char* wartosc)
{
 if (wartosc[0] == ' ')
{/* sprawdza czy na początku jest spacja */
  while (wartosc[0] == ' ')
  {/* obcina pierwszy znak i przesuwa całość w lewo dopóki nie trafi na pierwszy znak inny niż spacja */
  int i= 0;
  while (wartosc[i]!= '\\n')
  {
  wartosc[i]= wartosc[i+1];
  i++;
  }
  wartosc[i-1]= '\\0';
}
}
else
{
int i= 0;
while (wartosc[i]!= '\\n')
  {i++;}
  wartosc[i]= '\\0';
/* usuwa znak końca wiersza */
}
}
Potem można wydrukować obok siebie nazwę zmiennej i jej wartość:
printf ("zmienna:<%s>, wartosc:<%s>\\n",zmienna, wartosc);
Niestety problem pojawia się w momencie przypisywania wartości pobranych z pliku odpowiednim zmiennym. Ordynarne porównanie niestety nie działa, co objaśniono tutaj:
www.linuxforums.org/forum/linux-programming-scripting/126727-fscanf-read-configuration-files-c.html
if (zmienna == "deskryptor_klawiatury")
{keyboard_descriptor= wartosc;}
Natomiat kiedy używam funkcji strcmp porównującej ciągi znaków ma miejsce inne zjawisko:
if (strcmp(zmienna,"deskryptor_klawiatury")==0)
{keyboard_descriptor= wartosc;}
Program troszkę się zagalopowuje i kończy działanie z fragmentem ostatniej linijki pliku przypisanym jako wartość zmiennej.
Czy ktoś ma jakiś pomysł? Wydaje mi się że problem leży w ostatnim fragmencie. Do linijki wyświetlającej obok siebie nazwę i wartość zmiennej wszystko jest w porządku. Problemy zaczynają się przy przypisywaniu wartości.

Cały projekt można pobrać na forum.ubuntu.pl. Nie śmiejcie się ze sposobu przechwytywania zdarzeń klawiatury. Docelowo będzie to coś bardziej cywilizowanego.

Strony: [1]