Page 1 sur 2

Programmation PureBasic et domotique Velbus

Publié : jeu. 23/juil./2009 10:01
par Golfy
Bonjour à tous,

je pense m'essayer à la domotique et j'ai choisi la marque Velbus (le fabricant est Velleman, pour ceux qui sont adeptes du fer à souder et des kits électroniques).

En gros, les modules sont plus ou moins autonomes mais ne savent pas gérer les conditions (et parfois même les états si plusieurs boutons contrôlent le même module (lampe)).

Avec un PC, Velbus founit une DLL d'analyse et de contrôle de trame du bus... alors à tout hasard : est-ce que quelqu'un du forum PureBasic aurait déjà joué avec ?

Les modules : http://www.velbus.eu/professionals/pricelist/
Le forum Velbus : http://forum.velleman.be/viewforum.php?f=13
Librairie .net (2.0) : http://forum.velleman.be/viewtopic.php?f=13&t=383

Publié : jeu. 23/juil./2009 10:39
par Progi1984
Tu auras plus de chance de faire ou d'avoir un wrapper si la dll est utilisable en C. .net étant une plate forme spéciale.

Publié : jeu. 23/juil./2009 11:07
par Golfy
C'est quoi un "wrapper" ?

Publié : jeu. 23/juil./2009 12:05
par Progi1984
Un wrapper est un fichier d'include PureBasic permettant d'appeler facilement une DLL.

Publié : jeu. 23/juil./2009 16:53
par Golfy
D'accord... ça ressemble à quoi ? as-tu un exemple d'une DLL et du fichier include associé pour que je puisse créer celui de la DLL Velbus ?
Est-ce compliqué ?
Merci.

Edit: j'ai également essayé une recherche sur le forum avec le mot "wrapper" mais je ne peux pas dire que cela m'ait bien aidé... :?

Publié : jeu. 23/juil./2009 19:09
par Progi1984
Golfy a écrit :D'accord... ça ressemble à quoi ? as-tu un exemple d'une DLL et du fichier include associé pour que je puisse créer celui de la DLL Velbus ?
Est-ce compliqué ?
Merci.

Edit: j'ai également essayé une recherche sur le forum avec le mot "wrapper" mais je ne peux pas dire que cela m'ait bien aidé... :?
Bien sur, regarde sur ce site pour voir à quoi ca ressemble : http://code.google.com/p/rwrappers/ pas mal de wrappers de ma création (pour la plupart)

As tu un header (.h) en C pour préparer l'import de la DLL ?
Compliqué, non, mais mieux vaut avoir un niveau avancé de PureBasic...

Publié : dim. 02/août/2009 9:24
par delta69
Bonjour,

Le choix de Velleman pour choix du matériel semble avoir été murement réfléchi, néanmoins, dans le même ordre d'idées, Fred a partagé un code pour les modules X10 :

http://forums.purebasic.com/english/vie ... hp?t=10575

Bon courage !

Cordialement.

Publié : lun. 03/août/2009 15:41
par Golfy
Un code en Visual Basic donne ceci :


Code : Tout sélectionner

Private Sub VelbusSerialBus_PacketReceived(ByVal source As System.Object, ByVal args As Velleman.Velbus.BusPacketIoEventArgs) Handles VelbusSerialBus.PacketReceived
        Dim IncommingData As String

        IncommingData = "Start = " & (Hex(args.Packet.STX) + Chr(13))
        IncommingData = IncommingData & "Address = " & (Hex(args.Packet.Address) & Chr(13))
        IncommingData = IncommingData & "Priority = " & (Hex(args.Packet.Priority) & Chr(13))
        IncommingData = IncommingData & "RTR = " & (args.Packet.Rtr) & Chr(13)
        IncommingData = IncommingData & "Size = " & (args.Packet.Size) & Chr(13)
        IncommingData = IncommingData & "Cmd = " & (args.Packet.Command) & Chr(13)
        IncommingData = IncommingData & "ETX = " & (Hex(args.Packet.ETX) & Chr(13))

        IncommingData = IncommingData & "Has Cmd = " & (args.Packet.HasCommand)

        MsgBox(IncommingData) 'show me the packet

End Sub
Qu'est-ce que cela peut donner en PureBasic ?
Dois-je utiliser l'instruction OpenLibrary(0, "xxxxx.dll") ?

Publié : lun. 03/août/2009 15:49
par Golfy
delta69 a écrit :Bonjour,

Le choix de Velleman pour choix du matériel semble avoir été murement réfléchi, néanmoins, dans le même ordre d'idées, Fred a partagé un code pour les modules X10 :

http://forums.purebasic.com/english/vie ... hp?t=10575

Bon courage !

Cordialement.
Merci Delta69,
si je peux faire un travail similaire, je le ferais partager à l'ensemble de la communauté (Purebasic pour les sources et tous les autres pour les EXE) 8) ... mais il faut encore que je m'améliore sur la programmation en PureBasic :oops: :( :( :(

Pour Velbus, ils n'ont pas encore beaucoup de modules mais c'est une norme filaire (bus) qui semble un peu plus robuste que la norme X10 (plutôt américaine)... qui semble atteindre ses limites (je crois qu'il doit y avoir une évolution de protocole en cours).
Ceci étant, Velbus permet d'émettre un ordre (gestion de priorité sur le bus) et d'avoir un retour de l'actionneur (ex: action en cours, etc.)

Publié : mer. 02/sept./2009 14:46
par Golfy
Golfy a écrit :Un code en Visual Basic donne ceci :


Code : Tout sélectionner

Private Sub VelbusSerialBus_PacketReceived(ByVal source As System.Object, ByVal args As Velleman.Velbus.BusPacketIoEventArgs) Handles VelbusSerialBus.PacketReceived
        Dim IncommingData As String

        IncommingData = "Start = " & (Hex(args.Packet.STX) + Chr(13))
        IncommingData = IncommingData & "Address = " & (Hex(args.Packet.Address) & Chr(13))
        IncommingData = IncommingData & "Priority = " & (Hex(args.Packet.Priority) & Chr(13))
        IncommingData = IncommingData & "RTR = " & (args.Packet.Rtr) & Chr(13)
        IncommingData = IncommingData & "Size = " & (args.Packet.Size) & Chr(13)
        IncommingData = IncommingData & "Cmd = " & (args.Packet.Command) & Chr(13)
        IncommingData = IncommingData & "ETX = " & (Hex(args.Packet.ETX) & Chr(13))

        IncommingData = IncommingData & "Has Cmd = " & (args.Packet.HasCommand)

        MsgBox(IncommingData) 'show me the packet

End Sub
Qu'est-ce que cela peut donner en PureBasic ?
Dois-je utiliser l'instruction OpenLibrary(0, "xxxxx.dll") ?
Help ? ! ? :roll:

Publié : ven. 04/sept./2009 21:01
par Golfy
J'ai également un exemple en .NET

Code : Tout sélectionner

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Velleman.Velbus;

namespace DemoAsync
{
    public partial class MainForm : Form
    {
        /* Create a new SerialBus instance */
        private SerialBus m_Bus = new SerialBus();

        public MainForm()
        {
            InitializeComponent();

            m_Bus.PacketReceived += new BusPacketIoEventHandler(PacketReceived);
            m_Bus.PacketSent += new BusPacketIoEventHandler(PacketSent);
        }

        private void btnConnect_Click(object sender, EventArgs e)
        {
            /* Connect to the specified port */
            m_Bus.PortName = cbPort.Text;
            m_Bus.Open();
        }

        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            /* Close the port */
            m_Bus.Close();
        }

        private void btnScan_Click(object sender, EventArgs e)
        {
            /* Send out module type request to each possible address. These
             * packets are useful for scanning purposes, since modules will react
             * to them. */

            Packet packet = new Packet();         // no databytes, default address
            packet.Priority = PacketPriority.Low; // low priority
            packet.Rtr = true;                    // rtr must be enabled

            for (int i = 0x02; i <= 0xFF; i++)
            {
                // loop over all possible addresses
                // and send out our scan packet
                packet.Address = (byte)i;
                m_Bus.Send(packet);
            }
        }

        private void WriteLog(string msg)
        {
            /* Since the input/output operations for asynchronous IO occur on
             * a secundary thread, we need to synchronize it with our GUI thread.
             * This is the same method as if you would use the SerialPort component */

            if (lstLog.InvokeRequired)
                lstLog.BeginInvoke(new MethodInvoker(delegate() { WriteLog(msg); }));
            else
                lstLog.Items.Add(msg);
        }

        private void PacketReceived(object source, BusPacketIoEventArgs args)
        {
            // Log read operation
            WriteLog(String.Format("Packet received from address {0}", args.Packet.Address));
        }

        public void PacketSent(object source, BusPacketIoEventArgs args)
        {
            // Log write operation
            WriteLog(String.Format("Packet sent to address {0}", args.Packet.Address));
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            m_Bus.Close(); // Be sure to clean up
        }
    }
}
Mais... :oops: je ne sais toujours pas comment transformer cela pour en faire une librairie en Purebasic.

Publié : sam. 05/sept./2009 13:50
par KarLKoX
Salut,
.Net est assez particulier, une solution serait de créer un Activex (tuto ici), le wrapper rendra publique les fonctions dont tu as besoin (et que tu auras créé pour l'occasion), c'est ça, un wrapper.
A utiliser avec Comate pour que ça fonctionne facilement avec PureBasic.

Publié : lun. 07/sept./2009 22:53
par Golfy
KarLKoX a écrit :Salut,
.Net est assez particulier, une solution serait de créer un Activex (tuto ici), le wrapper rendra publique les fonctions dont tu as besoin (et que tu auras créé pour l'occasion), c'est ça, un wrapper.
A utiliser avec Comate pour que ça fonctionne facilement avec PureBasic.
C'est de plus en plus du chinois (désolé pour KCC :lol: ) : wrapper :?: comate :?: purebasic :?: Nan ! le dernier c'est un blague.

Bon j'ai essayé ça :

Code : Tout sélectionner

Enumeration 
   #Bibliotheque
EndEnumeration
NomFichier$ = "D:\telechargement\Domotique\Velbus\VelbusLib\Velbus\bin\Release\Velleman.Velbus.dll"

IncludeFile "Common.pb"
Resultat = OpenLibrary(#Bibliotheque, NomFichier$)
Debug Resultat
Resultat = OpenLibrary(#Bibliotheque, NomFichier$)
Debug Resultat  --> OK
Debug IsLibrary(#Bibliotheque)  --> OK
Debug CountLibraryFunctions(#Bibliotheque)  --> 0 (!)
Debug ExamineLibraryFunctions(#Bibliotheque)  --> -1 (!)
Debug GetFunction(#Bibliotheque, "Velleman.Velbus.bus.SendBlocking")  --> 0 (!)
Debug GetFunction(#Bibliotheque, "bus.SendBlocking")  --> 0 (!)
Comme le montre les dernières lignes, c'est pas gagné :roll:
Pourquoi ça marche pas ??? :(

Re: Programmation PuraBasic et domotique Velbus

Publié : jeu. 10/sept./2009 22:28
par Golfy
Ca y est, j'ai enfin pu lire des valeurs (sans passer la DLL .NET) :P 8) :wink:
J'utilise la fonction OpenSerialPort et comme elle n'est pas très décrite dans le forum, je place mon code (très crade, désolé :oops: ) sur ce topic
A noter : j'utilise PureBasic 4.40 beta pour le timer windows (AddWindowTimer) car sinon, il faut bouger la souris pour que la lecture du port soit faite 8O

Code : Tout sélectionner

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
Enumeration 
	#CanalCOM
	#Timer1
EndEnumeration

Global *Buffer = AllocateMemory(30000)
IncludeFile "Common.pb"

;ConnexionID = OpenNetworkConnection("127.0.0.1", 3788)
;Debug ConnexionID

Procedure.s Hexa2(string$,longueur)
	Debug "Longueur Trame (proc Hexa2): "+ Str(longueur) + "  ["+PeekS(*Buffer)+"]"
	r$ = ""
	For t = 0 To longueur
	  a$ = Trim(Hex(PeekB(*Buffer+t) & 255))+" "
	  If Len(a$) = 2
	  	a$ = "0"+ a$
	  EndIf
		r$ = r$ + a$
	Next t
	r$ = r$ + Chr(13)+Chr(10)
	ProcedureReturn r$
EndProcedure
Procedure LecturePort()
    Resultat = AvailableSerialPortInput(#CanalCOM)
    If Resultat
    	Debug "Il a des octets à lire : "+Str(Resultat)
    	longueur = ReadSerialPortData(#CanalCOM, *Buffer, Resultat)
    	Debug "["+PeekS(*Buffer)+"] --> " + Str(longueur)
    	Commande$ = Hexa2(PeekS(*Buffer), longueur)
    	
    	SetGadgetText(#Editor_0, GetGadgetText(#Editor_0)+Commande$)
    	Debug Commande$
    EndIf
EndProcedure


If OpenSerialPort(#CanalCOM, "COM9", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
	Open_Window_0()
	If IsWindow(#WIndow_0) = 0
		CloseSerialPort(#CanalCOM)
		End
	EndIf
	AddWindowTimer(#Window_0, #Timer1, 50)
  Repeat
    EventID = WaitWindowEvent()
    	
    	;Resultat = ReceiveNetworkData(ConnexionID, *buffer, 20)
			;Debug "data"
    	;SetGadgetText(#Editor_0, Hexa2(PeekS(*Buffer)))

    If EventID = #PB_Event_Timer
      If EventTimer() = #Timer1
      	LecturePort()
			EndIf
		EndIf
				    
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 0
        	Debug "Hello"
        	; Resultat = CallFunction(#Bibliotheque, NomFonction$ [,Parametre1 [, Parametre2...]])

      EndSelect

    EndIf
  Until EventID = #PB_Event_CloseWindow
  CloseSerialPort(#CanalCOM)
Else
	MessageRequester("Erreur","Le port série n'a pas été initialisé",0)
EndIf

;CloseNetworkConnection(ConnexionID)

Re: Programmation PuraBasic et domotique Velbus

Publié : ven. 11/sept./2009 7:42
par cirederff
rajoute 20 à WaitWindowEvent() WaitWindowEvent(20) :wink: