Data naar Arduino sturen via USB kabel

De usb kabel die je gebruikt om het programma in de arduino te laden kan je ook gebruiken om data door te sturen, bv vanuit Gambas.

Je moet het seriële poort object gebruiken, waarvoor je de gb.net bibliotheek importeert (Project eigenschappen, libraries).

Variabele declareren:

Public hSerial As SerialPort

Initialiseren van het object:

hSerial = New SerialPort As "hSerial"

(ps: AS "hSerial" wordt later gebruikt om te lezen van de poort)

Eigenschappen instellen:

  With hSerial
    .Clear
    .PortName = "/dev/ttyUSB0"
    .Speed = 9600 ' 4800
    .DataBits = SerialPort.Bits8
    .StopBits = SerialPort.Bits1
    .Parity = SerialPort.None
    .FlowControl = SerialPort.None
    .Clear
  End With

Poort openen:

Try hSerial.Open(3)
  If Error Then
    Print Error.Text
  Else 
    TSendTimer.Start()
  Endif 

Ik heb een timer gemaakt om gemakkelijk automatisch een aktie als een waarde uitsturen te laten uitvoeren:

Public TSendTimer As Timer
  '
  Try iNumber = getSomeValueFromDb()
  If Error Then
    Print Error.Text
  Else 
    If iNumber <> iPrevious
      doSend(iNumber)
      iPrevious = iNumber
    Else 
      ' 
    Endif 
  Endif

(in hetzelfde programma heb ik een andere timer voor het lezen van de seriële poort)

De timer aktiveert het ophalen van de gegevens van elders, bv uit een database:

getSomeValueFromDb() kan je vervanen door eender welke bewerking voor het ophalen van een waarde uit een databank, een bewerking, uitlezen van menselijke invoer, enz..

En het uisturen van de klaarstaande gegevens:


Public Sub doSend(iNumber As Integer)
'  
  Debug Now() & " Gb3 doSend > " & iNumber
  Try Write #hSerial, Str(iNumber) & gb.NewLine
  If Error Then
    Print "Gb3 Err: " & Error.Text
  Else 
    hSerial.Send()
    Inc iCounter
  Endif 

Ik hou wat tellers bij en toon in het konsole scherm de waarden die heen en weer gaan tussen de arduino en de Raspberry Pi/pc, daarom dat ik ze laat voorafgaan door “Gb3” om aan te geven wat de bron is. De inkomende data van de arduino toon ik daar immers ook.

Ontvangen via dezelfde weg

Instellen:

Public Sub setReceive()
'  
  Debug "Gb3: setReceive"
  With hSerial
    If .Status = Net.Active Then
      TTimer.Start()
      Print .DTR
      Print .DSR
      Print .Blocking
      Print .CTS
      Print .RTS
    Endif
  End With
  '
End

Lezen van seriële poort:

Public Sub hSerial_Read()
  '
  Try Read #hSerial, sIn, Lof(hSerial)
  '
End

De timer voor ontvangen van data:

Public Sub TTimer_Timer()
'
  If hSerial.Status <> Net.Active Or If sIn = "" Then 
    ' Print "Gb3: No data, or empty string.."
  Else 
    If sIn <> sPrevious
      Print "Gb3: Data received: " & sIn
      sPrevious = sIn
    Endif 
  Endif
  '
End

Sommige project broncode bestanden zijn in conflict (door git)

Probleem

Na een problematische git merge krijg ik deze melding als ik het project wil uitvoeren (run):

Sommige project broncode bestanden zijn in conflict.
Los deze eerst op indien je het project wil compileren.

Bij een aantal bestanden staat een rood uitroepteken; die bekijk ik.
In de editor krijg je de mogelijkheid naar het volgende/vorige conflict te gaan, en je oplossing te bewaren.

Ik heb al heel wat Forms en Modules aangepast, en lijk klaar te zijn.
Toch blijft de melding komen, zonder aan te geven over welke het specifiek gaat.

Ook een “zoek” in de IDE op “Broncode bestanden” en “Alle bestanden” naar de typische* codes van een merge conflict, levert geen gevonden bestanden meer op.
(* In het “probleembestand” vind je dan bv: <<< HEAD , ==== , >>> master)

Opgelost
Ik heb de merge conflict reaktie niet meer bij de hand om op te zoeken in welke bestanden er een conflict was.
Ik doe via de commandolijn een zoek in de bestanden in de directory, en daarbij kom ik uit op de verborgen project file:
.project
Die begint met :
# Gambas Project File 3.0

Daarin waren nog merge conflicten aanwezig.

Eens die opgelost zijn, eerst in git terug: git commit -am "fix merge conflicts", en het project terug openen in Gambas3.
Nu gaat de IDE weer normaal reageren, bv met overblijvende problemen als dubbele declaraties, incorrect overschreven functie in class, enz.

Make Executable: error

Fout bij het maken van een uitvoerbaar programma: Project, Make, Executable
(Project, Maken, Uitvoeringsbestand)


cannot make executable.
gba: ERROR: Cannot create temporary archive file:/home/copyleft/gb/gb3run/MyApplication.gambas
PProject.MakeExecutable.3066

Inderdaad, als ik goed kijk probeert hij de executable te maken in de map van de gebruiker “copyleft”, terwijl ikzelf nu ingelogd ben als gebruiker “dev”. Ik moet naar (de directory) /home/dev/gb3run/MyApplication.gambas.

Ik had dit project gekopieerd van de gebruiker copyleft, waar ik het al gebruikt had. De locatie van die map is blijkbaar meekgekomen uit een of ander bestand van het project, en aangezien die ook echt bestaat valt dat in eerste instantie niet op…

Gambas3 op nieuwe openSuse 15.3

Op dit moment (24-02-2022) is er geen Officiële versie van Gambas3 voor openSUSE 15.3.

Ik neem bv Munix stable versie (er is ook een nieuwere met een git-versienummer), en bij installatie krijg ik allerlei foutmeldingen over het niet vinden van info in de repo directories voor 15.x . backports .. (?)

Daarna kan ik in Yast, Software management wel Gambas3 IDE selecteren.

Geïnstalleerde pakketten: 134
autoconf, automake, bison, bison-lang, dwz, gambas3, gambas3-dev-tools, gambas3-gb-args… (meer)

Ik controleer en zie dat de jit-compiler niet mee geïnstalleerd is, dus ik ga die extra bij installeren, en moet dan downgraden van gambas 3.16 uit munix naar 3.14 uit de gewone repo.

En zoals ik al vreesde start Gambas niet.

Terug in Yast noteer ik de fout:

Er is een fout opgetreden tijdens de initialisatie van de opslagruimte. [https-download.opensuse.org-c1bbb620|https://download.opensuse.org/repositories/SUSE:/SLE-15-SP2:/Update/pool/] Geen geldige metagegevens op de gespecificeerde URL gevonden Geschiedenis: – [https-download.opensuse.org-c1bbb620|https://download.opensuse.org/repositories/SUSE:/SLE-15-SP2:/Update/pool/] Repository type can’t be determined.

Maar ik kan wel de jit-compiler van 3.14 nog bij-installeren (dat was dan blijkbaar met het downgraden niet gebeurd), waarna Gambas3 werkt.

Gecompileerd programma start niet

Programma gecompileerd in de Gambas3 IDE, met link op desktop.

Bij klik op programma lijkt het te willen starten, maar het sluit onmiddellijk af voor je eender wat ziet.

Tip
Probeer eens vanop de commandolijn. Als je in KDE werkt en Gambas3 een link maakte op de desktop, kan je die bekijken met Kate.

kate mijnapp.desktop

In dat bestand van die link zie je hoe het programma gestart wordt in de lijn die begint met Exec=, bv:

Exec='/home/user/myPrograms/mijnapp.gambas'

Geef zelf dat commando in op de commandolijn (knip+plak) ..

user@localhost:~ ./myPrograms/mijnapp.gambas

en kijk wat de reaktie is; bv:

MMain.@init.0: #2 Connot load class 'CDataContext': Unable to load class file
MMain.@init.0

Gebruik die reaktie om in de programmeeromgeving aanpassingen te doen.

Het programma mist hier blijkbaar de klasse CDataContext.

  • Start de Gambas3 IDE en kijk of die klasse aanwezig is.
  • Mogelijk wordt ze geladen uit een “library”, dus controleer ook de libraries…

Eén van de oorzaken kan zijn dat de klasse geen “EXPORT” bevat aan het begin.

* Ps: dit geldt ook als gambas zelf niet start.

Verminderde aktiviteit (tijdelijk)

Het Covid-19 virus is ook de gambas mailinglist binnengeslopen (9/11-18/11), en zorgt er voor verminderde aktiviteit.
Een voorspoedig herstel toegewenst!

Update: na een weekje lijkt alles terug te draaien als voorheen, met een vermeerderde aktiviteit wat covid discussies betreft.
Ook wordt gesproken over het oprichten van een “stichting” om de toekomst van Gambas te ondersteunen/garanderen.

Gambas3 na update naar opensuse 15.3

Hier treedt een bekend probleem op, met de foutmelding

gbx3: unable to find startup file

als je op de commandolijn gambas3 probeert te starten.
(omdat het uit het menu niet lukt – dan krijg je schijnbaar geen reaktie).

Ga naar softwarebeheer in Yast, zoek “gambas3” en vink de nog niet geïnstalleerde onderdelen aan, bv:

gambas3-gb-gtk3, gambas3-gb-inotify, gambas3-gb-jit, gambas3-gb-media, gambas3-gb-option, gambas3-gb-report2, gambas3-gb-scanner

Vooral “gambas3-gb-jit” is belangrijk.
Installeer, en start.

Versie van je bibliotheek (Library Version)

De versie van je eigen programma en die van Gambas kennen we al, maar hoe kennen we de versies van de libraries die we gebruiken?
In de programmeeromgeving kan je die vinden in Project, Eigenschappen, Bibliotheken, maar hoe kunnen we in een lopend programma weergeven welke versie van bibliotheken er gebruikt worden?

Library versie
Voor mijn eigen libraries kan ik het oplossen door een functie te maken die het versienummer levert.
In het library project gebruik ik een bestand met de naam VERSION (volledig in hoofdletters).
Dat is ook voorzien in de IDE: vink aan bij project: “Haal uit ‘VERSION’ bestand”.

Dan maak ik een method die ik getVersion() noem en die me de versie uitleest en doorspeelt:

Return File.Load("VERSION")

Tussen de methodes van de klasse zie je nu ook getVersion() staan.

ps: In Gambas kan je die informatie vinden in het verborgen .project bestand.
Library=:supplier/SomeLib:0.2

Gebruikte Libraries
(Upd. 07-2023)

Een Gambas programma (applicatie/project) dat één of meer libraries gebruikt, is voor zijn werking afhankelijk van de versies daarvan; je moet dus te weten kunnen komen welke versies van de libraries je moet installeren om het programma goed te draaien.
Ik standaardiseer daarvoor op een bestand “Libraries.txt”, waarin ik in volgorde de libraries opsom met hun versienummer, 1 per lijn, en in volgorde van afhankelijkheid; bv DataContext gebruikt zelf RunCounter, dan:

RunCounter 0.0.1
DataContext 0.2.9

Als tijdens de ontwikkeling van het programma overgeschakeld wordt naar RunCounter 0.0.2 dan pas je in Libraries.txt deze versie aan, en dan weet je dat het de bedoeling is met die versie te werken.

Gambas3 op Tumbleweed

Op software.opensuse.org in “Zoek”: “gambas”. Dat biedt verschillende gambas3 paketten; kies IDE voor de volledige programmeeromgeving.

De officiële gambas3 is verkrijgbaar voor Leap 15.2, voor Tumbleweed is de keuze verborgen achter “experimental” en “community packages”.

  • Bij Experimental staat versie 3.14.3, en dat is exact dezelfde als in Leap 15.2, dus zo experimenteel zal die niet zijn (misschien eerder de combinatie met tumbleweed kan ik me voorstellen).
  • Bij community kanje kiezen tussen 3.15.2 op home:munix9 en 3.15.90+git.20210318… op home:munix9:unstable. Die laatste lijkt me pas experimenteel 🙂

Ik kies 3.15.2 van munix9 community, zodat ik toch een nieuwere versie heb dan de stable van openSUSE Leap 15.2, wat nu de gewone openSUSE is.
Er worden 143 packages gedownload voor gambas3.

Er komt een menu bij: Development, met daarin Gambas3.

Updates
24/05/2024
Toestand nu is:
Education (Experimental) : 3.14.3
home:Henry15ea (Community) : 3.18.1
home:munix9 (Community) : 3.19.1
1-click install, gambas.ymp, klik om te installeren.. gambas 3.19.1 is geïnstalleerd in menu Development.

23/04/2022
Ik weet niet of ik hier op hetzelfde toestel zit als bovenbeschrven installatie, maar in ieder geval, bij een update van Tumbleweed krijg ik een melding ivm Gambas:

Problem: problem with the installed gambas3-3.16.1-4.2.x86_64
Solution 1: install gambas3-3.14.3-62.14.x86_64 from vendor openSUSE-Education
replacing gambas3-3.16.1-4.2.x86_64 from vendor obs://build.opensuse.org/home:munix9
Solution 2: keep obsolete gambas3-3.16.1-4.2.x86_64

Ik wil liever de voorheen geïnstalleerde versie 3.16 behouden dan terug te gaan naar 3.14; dus ik kies voor “keep obsolete gambas3-3.16.1-4.2.x86_64″. Het probleem is dat die vraag voor alle gambas onderdelen herhaald wordt, en je dus 100 keer oplossing 2 moet kiezen, maar dat lukt dan wel.
Misschien is er iets in te stellen in het pakketbeheer, om deze gambas te behouden in ieder geval.

Tijd vergelijken, berekening met tijd

Als je een berekening moet doen met tijden, gebruik je best de ingebouwde DateDiff.

Bv. :

DateDiff(Settings["SomeTime/Start"], Time(Now()), gb.Minute) / 60

Dit geeft een negatieve waarde als tweede parameter kleiner is.

Fout is de tijd op zich proberen te vergelijken:

IF (Settings[“SomeTime/Start”] > Time(Now()))
IF (Settings[“SomeTime/Start”] > Format(Time(Now()), “hh:mm”))

Deze laatste is dubbel fout want minuten worden niet voorgesteld door mm maar door nn.

Zie ook Rekenen met tijd (dagen).