Pages: 1 [2]   Go Down
Author Topic: [test in progress] I2C non bloccante  (Read 1719 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, ho notato.
Sono curioso di vedere il codice della lib.

Ah, a proposito. Perché invece di modificare la Wire inserendo i nuovi metodi non crei una nuova Wire, denominata Wire2 o aWire o quel che vuoi? Così da separare (al momento) la tua lib da quella di Arduino.
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perchè le modifiche non sono solo nella Wire ma anche, anzi sopratutto, nella twi. Mentre per la Wire la soluzione sarebbe quella di estendere la classe, per la TWI vedo soluzione. Certo potrei fare un lib a parte, ma visto che l'idea è di proporla come modifica ufficiale della Wire mi porto aventi col lavoro.
Tra l'altro potrei metterci dentro pure il codice contro il bug della write(0), già che ci sono..
Il codice della libreria lo trovi su github, il link è nel primo post oppure nella mia firma... quì il link diretto all'esempio che usa il codice asincrono, con le lib. https://github.com/lestofante/arduino/tree/master/asincI2Ctest2_asinc

ps. ti consiglio di imparare a usare git, per esempio nel progetto di arduino puoi vedere tutte le pull-request degli utenti per risolvere i bug; https://github.com/arduino/Arduino/pulls
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho cominciato a "spippolare" su Git. Ho anch'io un paio di repo, ho messo su la swRTC ed il leOS:
https://github.com/leomil72
Logged


0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ottimo, ho messoil wath sui tuoi repo così dovrebbe avvisarmi quando fai qualcosa.

nel frattempo sto sistemando la libreria per sostituire le chiamate asincXXX() con askXXX(), e le chiamate bloccanti che usano le funzioni Wire non blocanti al posti che chiare direttamente la twi. Ovviamente per ora l'ho rotta e quindi non la posto.

stavo però pensando a creare un sistema per mettere in coda più di una richiesta, attraverso di un array di strutture usata sia per la richiesta che per la risposta. In questo modo elimino al 100% i tempi morti, se riesco a legarmi direttamente agli interrupt... devo verificare la fattibilità, voi che ne dite?
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ottimo, ho messoil wath sui tuoi repo così dovrebbe avvisarmi quando fai qualcosa.

nel frattempo sto sistemando la libreria per sostituire le chiamate asincXXX() con askXXX(), e le chiamate bloccanti che usano le funzioni Wire non blocanti al posti che chiare direttamente la twi. Ovviamente per ora l'ho rotta e quindi non la posto.

stavo però pensando a creare un sistema per mettere in coda più di una richiesta, attraverso di un array di strutture usata sia per la richiesta che per la risposta. In questo modo elimino al 100% i tempi morti, se riesco a legarmi direttamente agli interrupt... devo verificare la fattibilità, voi che ne dite?
Che mi riservo il giudizio dopo una prova, prova che a breve non posso però condurre.... intanto massimo apprezzamento per il lavoro svolto.  smiley-wink
Logged


0
Offline Offline
Faraday Member
**
Karma: 39
Posts: 5608
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

X iscrizione
Logged

- [GUIDA] IDE1.x - Nuove Funzioni - Sketch Standalone - Bootloader - VirtualBoard
http://arduino.cc/forum/index.php/topic,88546.0.html
- [LIBRERIA] ST7032i LCD I2C Controller Library
http://arduino.cc/forum/index.php/topic,96163.0.html

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

urca è una bella botta, l'idea che ho in mente e la wire cozzano un pò, il difficile è fare in modo che la wire normale si appoggi sulle mie funzioni, in modo da dover mantenere meno codice.
partiamo dal fatto che sarà molto facile agganciarsi al
SIGNAL(TWI_vect)

tanto che l'idea base è questa:

al posto che un array di byte in ricezione ed in invio, ci saranno 2 array di strutture, tra l'altro la stessa struttura.
diamo un'occhiata:

Code:
struct request{
uint8_t address;
uint8_t length;
uint8_t indice;
uint8_t* data;
        uint8_t* stato;
};

address nel caso in cui si spedisce è l'indirizzo del destinatario, nel caso in cui si riceve è l'indirizzo del mittente.
length è la grandezza di data, ovvero dei byte che ci si attente nel caso di ricezione, e che si inviano nel caso di invio.
Indice è la parte di data utilizzata, necessità tecnica.
data è il puntatore all'array che conterrà i dati. La sua gestione (allocazione/free) è gestita dalla libreria, e quindi non sarà mai direttamente disponibile all'utente, ma sarà una sua copia.
stato indica appunto lo stato della comunicazione; in coda, in lettura/scrittura, completata, in errore.

ho pensato alle liste al posto degli array però non mi convince la pesantezza, alla fine non ci saranno quasi mai più di due o tre richieste in coda, altrimenti si è a richio di intasare la comunicazione i2c.
Invece mi intriga l'idea di creare un array unico, e capire se la richiesta è di scrittura o lettura in base ad una flag nella struttura, magari usando un bit della variabile stato.

Tra l'altro pensavo pure un'apposita chiamata per loopare all'infinito sulle richieste in array, basandomi sul fatto che tutti i sensori che ho visto fin'ora funzionano allo stesso modo (ovvero apri comunicazione, scrivi l'indirizzo del registro, chiudi comunicazione, richiedi X byte, leggi x byte). Ovviamente la struttura sarà un pò più complessa:
Code:
struct loopRequest{
        struct request response;
        uint8_t register;
        uint8_t size;
uint8_t* lastData;
};

come si può notare non fa altro che una copia dell'ultimo dato letto in lastData (null se nessun dato completo è mai arrivato); infatti visto che la nuova richiesta parte in automatico appena i dati son completi, l'utente non avrebbe mai modo di avere una lettura completa da esaminare. Da notare che la fase di copia di array da lastData ad array restituito all'utente sarà bloccante per gli interrupt, per evitare che venga copiata mezza vecchia lettura e mezza nuova.

Quindi il mio copmpito attraverso la Wire, sarà di mettere a disposizione solo 5 metodi escludendo i metodi sovracarichi:
1. askRead (valori struttura request)
2. askWrite (valori struttura request)
3. readStatus() ritorna null o una copia della struttura lettura soddisfatta
4. writeStatus() ritorna null o una copia della struttura scrittura soddisfatta
5. askLoop(valori struttura loopRequest)
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6579
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Lesto.
Hai dato uno sguardo alla libreria motate::twi? --> https://github.com/giseburt/Motate
E' non bloccante.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

esistono varie implementazioni, però nessuna facile da usare (e compatibile) con la Wire smiley
comunque appena ho un pò di tempo torno a lavorarci sopra, solo che in queste settimane ho casa libera e sono un po' occupato a far festa smiley
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 103
Posts: 6579
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tranquillo... qui nessuno ti insegue col forcone.  smiley-twist smiley-twist
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: 1 [2]   Go Up
Jump to: