Programmation PureBasic et domotique Velbus

Programmation d'applications complexes
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Programmation PureBasic et domotique Velbus

Message 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
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message par Golfy »

C'est quoi un "wrapper" ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Un wrapper est un fichier d'include PureBasic permettant d'appeler facilement une DLL.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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é... :?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message 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...
delta69
Messages : 12
Inscription : dim. 17/avr./2005 22:11

Message 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.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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") ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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.)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message 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.
"Qui baise trop bouffe un poil." P. Desproges
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Message 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 ??? :(
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Programmation PuraBasic et domotique Velbus

Message 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)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
cirederff
Messages : 54
Inscription : ven. 15/mai/2009 19:57

Re: Programmation PuraBasic et domotique Velbus

Message par cirederff »

rajoute 20 à WaitWindowEvent() WaitWindowEvent(20) :wink:
Répondre