martedì 27 novembre 2012

MTK e udev

Su alcuni pc il mio vecchio datalogger  MTK iBlue restituisce questo errore:
~$ mtkbabel -t -p /dev/ttyUSB0 -f mytrack
ERROR: Opening serial device /dev/ttyUSB0: Permesso negato at /usr/bin/mtkbabel line 1748.
In pratica il datalogger MTK viene connesso su una porta USB (/dev/ttyUSB0) sulla quale, però, l'utente non ha i permessi necessari e, conseguentemente, il programma mtkbabel non riesce a scaricare i dati.
In prima battuta ho risolto così
sudo chmod 666 /dev/ttyUSB0
ma la soluzione è temporanea, perchè al successivo riavvio del computer il problema si ripresenta.
Occorre in qualche modo fornire a udev le informazioni necessarie per gestire il dispositivo. Cercando una soluzione ho trovato questo  link che mi ha portato ad una soluzione del problema.
Ecco la procedura che ho seguito passo a passo.
Inserire il cavo USB; datalogger in posizione LOG.
Aprire un terminale e digitare:
~$ dmesg | tail
[ 7566.896621] cp210x 6-2:1.0: device disconnected
[ 7678.240077] usb 6-2: new full-speed USB device number 6 using uhci_hcd
[ 7678.398104] usb 6-2: New USB device found, idVendor=10c4, idProduct=ea60
[ 7678.398112] usb 6-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 7678.398117] usb 6-2: Product: CP2102 USB to UART Bridge Controller
[ 7678.398122] usb 6-2: Manufacturer: Silicon Labs
[ 7678.398126] usb 6-2: SerialNumber: 0001
[ 7678.403970] cp210x 6-2:1.0: cp210x converter detected
[ 7678.516154] usb 6-2: reset full-speed USB device number 6 using uhci_hcd
[ 7678.664078] usb 6-2: cp210x converter now attached to ttyUSB0
L'ultima riga riportata dice che il dispositivo è connesso alla porta ttyUSB0; con udevadm è possibile avere più notizie:

~$ udevadm info -a -n /dev/ttyUSB0 

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="cp210x"
    ATTRS{port_number}=="0"
[... e molto altro!]
I dati che servono possono essere trovati filtrando l'output di  udevadm riportato sopra:
~$ udevadm info -a -n /dev/ttyUSB0  | grep '{serial}' |head -n1
    ATTRS{serial}=="0001"
~$ udevadm info -a -n /dev/ttyUSB0  | grep '{idVendor}' |head -n1
    ATTRS{idVendor}=="10c4"
~$ udevadm info -a -n /dev/ttyUSB0  | grep '{idProduct}' |head -n1
    ATTRS{idProduct}=="ea60"
Si può ora creare il file denominato 72-mtkdatalogger.rules nella home; questo file conterrà gli elementi trovati sopra:
ATTRS{idVendor}=="10c4",ATTRS{idProduct}=="ea60",ATTRS{serial}=="0001",MODE="0440",GROUP="plugdev"
dove MODE="0440" significa permesso di lettura per il proprietario e per il gruppo (vedere, ad esempio, la spiegazione sul comando  chmod) e GROUP="plugdev" attribuisce il dispositivo ad un gruppo del quale il proprietario fa parte.
Copiare ora il file appena creato nella directory /etc/udev/rules.d:
~$ sudo cp 72-mtkdatalogger.rules /etc/udev/rules.d/72-mtkdatalogger.rules
scollegare il dispositivo e riavviare  udev:
~$ sudo udevadm control --reload-rules
Ricollegando il dispositivo MTK (in posizione LOG) alla porta USB, non si dovrebbe più ottenere il messaggio di errore visto all'inizio (almeno... questa è stata la mia esperienza!).


giovedì 22 settembre 2011

Condividere progetti QGis tra Linux e Windows (memo)

I motivi per cui si deve (purtroppo) mantenere una partizione windows in una postazione gis sono molti e, per quanto mi riguarda, sono imposti da altri...
Capita quindi di dover usare in Windows progetti di Quantum Gis creati in Linux; per far questo vado a correggere i percorsi che puntano ai dati con una semplice linea di comando (che scrivo qui per ricordarmela):

cat nomeProgettoCreatoInLinux.qgs | sed sed 's/\/media\/windows/c:/g' > nuovoNomeProgettoInWin.qgs

Ovvio che i dati devono stare in directories che entrambi i sistemi operativi possano leggere e scrivere; inoltre il percorso di mount della partizione windows (nell'esempio: /media/windows) e la lettera ('c:') indicante il disco possono cambiare da pc a pc.
In windows  sed e cat  possono essere forniti  dalla shell di grass (nel plugin di grass in QGis) o da MinGW  (Minimalist GNU for Windows) installato insieme a grass per Windows .

mercoledì 21 settembre 2011

Riproiettare un'intera cartella di shapefiles da linea di comando (memo)

Giusto per ricordare a me stesso e, forse, ad altri: riproiettare al volo da linea di comando un'intera cartella di shapefiles:

for f in inputFolder/*shp; do 
     shp=$(basename $f)
      ogr2ogr  -s_srs '+init=epsg:32632' -t_srs '+init=epsg:4326' \
      outputFolder/${shp} $f
done

dove:
inputFolder è la cartella con gli shapefiles da riproiettare;
outputFolder quella ove verranno memorizzati gli sphapefiles risultato.

Nell'esempio si riproietta da  WGS84 UTM32N a WGS84 (gradi decimali).

Ne ho già viste decine e decine di versioni, ma quando serve non  mi ricordo mai...