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)

... mais il faut encore que je m'améliore sur la programmation en PureBasic
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 ? ! ?

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...

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

) : 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é
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)
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é

) 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
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)
