Tak jsem chtěl udělat mezikrok od navrhovaného mezikroku s RS 485 a zkusit to jen s Arduinem bez EasyCatu.
Začalo to tím, že jsem si našel tento zdroják, ze kterého bych chtěl vycházet:
https://forum.linuxcnc.org/18-computer/ ... nc?start=0
Bohužel se mi ho nedaří zkompilovat. Nevím, zda je to tím, že je z roku 2012, nebo něco dělám blbě.
Zde je manuál pro výrobu component do halu:
http://linuxcnc.org/docs/2.8/html/hal/comp.html
(preferuji psaní HAL component v C před Pythonem, Python neumím vůbec a C alespoň trochu)
Už mám problém s bodem 2:
http://linuxcnc.org/docs/2.8/html/hal/c ... installing
Lze mi nainstalovat:
Kód: Vybrat vše
sudo apt install linuxcnc-uspace-dev
linuxcnc-uspace-dev je již nejnovější verze (1:2.8.0.57.gfaad4fa22).

ale nemůže to najít:

Pokud je linuxcnc-dev pro real-time a linuxcnc-uspace-dev pro uspace, tak to asi to ničemu nevadí.
Pal jsem bojoval s bodem 12
http://linuxcnc.org/docs/2.8/html/hal/c ... _compiling
že jsem nevěděl kde vytvořit/najít složku linuxcnc/src/hal/components složek linuxcnc je v systému více, např.:
/etc/linuxcnc/
/home/cnc/linuxcnc/
/usr/lib/linuxcnc/
/usr/share/linuxcnc/
....
Nedomluvil jsem se ani s příkazovým řádkem a find
mi to vypíše hromadu souborů s popisem:
Kód: Vybrat vše
.....
.....
.....
find: ‘/run/udisks2’: Operace zamítnuta
find: ‘/run/lightdm’: Operace zamítnuta
find: ‘/run/alsa’: Operace zamítnuta
find: ‘/run/cups/certs’: Operace zamítnuta
find: ‘/run/user/112’: Operace zamítnuta
find: ‘/run/log/journal/1872d788f9cd4a00a9107f1c30546eb0’: Operace zamítnuta
find: ‘/run/systemd/inaccessible’: Operace zamítnuta
.......
......
......
Zkoušel jsem různé varianty find, ale nic použitelného.
nakonec jsem vytvořil složku:
/usr/share/linuxcnc/src/hal/components
Je to v pohodě? Na internetu psali, lidem se stejným dotazem, že je to jedno, ale nějak se mi to nezdá. Pro kompilaci to jedno je, ale jak by pak LinuxCNC měl vědět, kde hledat nové hal_komponenty?
Pak jsem vytvořil soubor serialreceive.comp se zdrojákem viz odkaz výše a zkusil ho zkompilovat. Bohužel to nedopadlo:
Kód: Vybrat vše
cnc@LinuxCNC:/usr/share/linuxcnc/src/hal/components$ sudo halcompile --install serialreceive.comp
gcc -I/usr/include -I/usr/include/linuxcnc -URTAPI -U__MODULE__ -DULAPI -Os -o serialreceive /tmp/tmpsOLu45/serialreceive.c -Wl,-rpath,/lib -L/lib -llinuxcnchal
/tmp/tmpsOLu45/serialreceive.c: In function ‘__comp_parse_count’:
/tmp/tmpsOLu45/serialreceive.c:80:13: error: ‘count’ undeclared (first use in this function)
count = strtoul(&argv[i][6], NULL, 0);
^~~~~
/tmp/tmpsOLu45/serialreceive.c:80:13: note: each undeclared identifier is reported only once for each function it appears in
/tmp/tmpsOLu45/serialreceive.c: In function ‘__comp_parse_names’:
/tmp/tmpsOLu45/serialreceive.c:107:17: error: ‘names’ undeclared (first use in this function)
names[j] = strtok(p, ",");
^~~~~
Makefile:2: návod pro cíl „serialreceive“ selhal
make: *** [serialreceive] Chyba 1
Tak jsem začal bádat dál. Příkaz halcompile spustí Python zdroják uložený v /usr/bin/halcompile.
Tento zdroják vytvoří ze souboru *.comp soubor *.c a do něj ledacos přidá, poté se jej pokusí zkompilovat. Soubor *.c se buď při "halcompile --install" vytvoří dočasně ve složce "/tmp/tmpsOLu45/", nebo si jej můžeme vytvořit ručně do složky pomocí:
Začal jsem porovnávat soubory *.c a *.comp. Zjistil jsem, že chyby:
Kód: Vybrat vše
error: ‘count’ undeclared (first use in this function)
error: ‘names’ undeclared (first use in this function)
jsou v té části, kterou přidává zdroják /usr/bin/halcompile. Tudí to na mě budí dojem, že ve zdrojáku /usr/bin/halcompile je nějaký bug.
Chyba se objevuje v této části zdrojáku:
Kód: Vybrat vše
int __comp_parse_count(int *argc, char **argv) {
int i;
for (i = 0; i < *argc; i ++) {
if (strncmp(argv[i], "count=", 6) == 0) {
errno = 0;
count = strtoul(&argv[i][6], NULL, 0);
for (; i+1 < *argc; i ++) {
argv[i] = argv[i+1];
}
argv[i] = NULL;
(*argc)--;
if (errno == 0) {
return 1;
}
}
}
return 0;
}
int __comp_parse_names(int *argc, char **argv) {
int i;
for (i = 0; i < *argc; i ++) {
if (strncmp(argv[i], "names=", 6) == 0) {
char *p = &argv[i][6];
int j;
for (; i+1 < *argc; i ++) {
argv[i] = argv[i+1];
}
argv[i] = NULL;
(*argc)--;
for (j = 0; j < 16; j ++) {
names[j] = strtok(p, ",");
p = NULL;
if (names[j] == NULL) {
return 1;
}
}
return 1;
}
}
return 0;
}
Je divné, že jsem zkoušel kompilovat příklad constant.comp a tam to vše prošlo a vytvořilo to constant.so bez chybových hlášek. Poradí někdo jak dál?