Stai visualizzando 8 post - dal 1 a 8 (di 25 totali)
  • Autore
    Post
  • #24424
    cpiga
    Partecipante

    Avete idea se sia possibile acquisire l’input di un sismografo theremino a 3 canale su Matlab? Non riesco a trovare esempi di codice per capire come iniziare ad affrintare il problema.
    Grazie anticipatamente a chiunque mi voglia dare una mano.
    Saluti
    Carlo

    #24426
    theremino
    Amministratore del forum

    Tutte le applicazioni thereminiche scrivono i valori negli Slot, quindi anche il sismografo lo fa.
    Gli Slot sono valori Float (4 byte) nel file mappato in memoria che si chiama “Theremino1”
    I “Memory mapped file” sono file del sistema Windows e tutte le loro particolarità sono ben spiegate da Microsoft.

    Per cui a questo punto il problema non è tanto nostro (del sistema theremino) ma di Mathlab.
    Se MathLab può leggere i MemoryMappedFile di Windows allora sei a posto.
    Se non li può leggere allora noi non possiamo fare nulla per aiutarlo.

    Mi spiace ma non so dirti altro su MathLab, noi utilizziamo solo applicazioni OpenSource e MathLab non lo è.

    #24428
    cpiga
    Partecipante

    Matlab supporta i MemoryMappedFile.
    I valori float come sono ordinati nel file? Sequenzialmente dallo slot 1 in poi? Potrei scrivere una serie di funzioni (da condividere) per rendere più pulito e ordinato il lavoro…
    Ok, Matlab non è opensource ma esistono cloni opensource che possono condividere il codice (octave).
    Quindi se ho capito bene.
    Leggo i primi 4byte del mapped file ed ho il segnale sullo slot1.
    Leggo i secondi 4 byte del mapped file ed ho il segnale sullo slot 2.
    Leggo i terzi 4 byte del mapped file ed ho il segnale sullo slot 3,
    Grazie mille per il sostegno.
    Ciao
    Carlo

    #24430
    cpiga
    Partecipante

    Un’altra cosa… ma il file “theremino1” dove lo trovo nel file system?

    #24432
    cpiga
    Partecipante

    Mi sembra di aver capito che “Theremino1” sia un non-persistent memory mapped file. Quindi non corrisponde ad uno specifico file nel file system. Matlab invece supporta solo i persistent memory mapped file. Quindi l’unica soluzione che mi viene in mente è scrivere un piccolo software in c# che acceda al non-persistent memory mapped file e lo copi su un persistent memory mapped file sul file sytem in un loop infinito a cui accede Matlab.
    Altri suggerimenti su altre, più eleganti, soluzioni sono graditi…
    Ciao a tutti

    #24434
    cpiga
    Partecipante

    Ho scritto questo ma non sembra funzionare:

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Threading;
    
    class Program
    {
        // Process B:
        static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Theremino1"))
                {
                    var mmf_persistent = MemoryMappedFile.CreateFromFile(@"Theremino1_persist", FileMode.Open);
                    while (true)
                    {
                        mmf_persistent = mmf;
                     }   
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run HAL first.");
            }
        }
    }

    Qualche suggerimento per metterlo apposto?

    • Questa risposta è stata modificata 10 mesi, 2 settimane fa da cpiga.
    • Questa risposta è stata modificata 10 mesi, 2 settimane fa da cpiga.
    #24437
    cpiga
    Partecipante

    Questa un’altra versione:

    using System;
    using System.IO;
    using System.IO.MemoryMappedFiles;
    using System.Threading;
    
    class Program
    {
        // Process B:
        static void Main(string[] args)
        {
            try
            {
                using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("Theremino1"))
                {
                    var mmf_persistent = MemoryMappedFile.CreateFromFile(@"Theremino1_persist", FileMode.Open, "Thermino1_persist");
                    byte[] buffer = new byte[4000];
                    int bytesRead;
                    using (MemoryMappedViewStream stream_persist = mmf.CreateViewStream())
                    {
                        BinaryWriter writer = new BinaryWriter(stream_persist);
                        using (MemoryMappedViewStream stream = mmf_persistent.CreateViewStream())
                        {
                            BinaryReader reader = new BinaryReader(stream);
                            while (true)
                            {
                                bytesRead = reader.Read(buffer, 0, buffer.Length);
                                writer.Write(buffer, 0, bytesRead);
                            }
    
                        }
    
                    }
    
      
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Memory-mapped file does not exist. Run HAL first.");
            }
        }
    }

    Ma Matlab vede sempre e solo il contenuto del file di zeri che ho scritto sul file system….

    #24439
    theremino
    Amministratore del forum

    Sul nostro sito abbiamo pubblicato molti esempi di lettura e scrittura dei MemoryMappedFile in vari linguaggi tra cui anche il C++

    Li trovi qui:
    https://www.theremino.com/downloads/foundations#easyslot

    E anche qui:
    https://www.theremino.com/downloads/foundations#mmf

    Ma c’è anche un’altra cosa che devi considerare:
    1) I MemoryMappedFile cui accedono le app a 32 bit non sono gli stessi a cui accedono la app s 64 bit (casini di Windows e di SysWow64 ecc…)
    2) Noi dobbiamo fare tutte le nostre applicazioni a 32 bit altrimenti dovremmo darle in due versioni, ma peggio ancora nessuno con i tablet e i mini pc potrebbe usarle.
    3) Di conseguenza la tua app devi compilarla a 32 bit altrimenti non vede i MMF giusti, se li crea lei al volo e legge solo zeri.

Stai visualizzando 8 post - dal 1 a 8 (di 25 totali)
  • Devi essere connesso per rispondere a questo topic.