StringGadget not updating

Just starting out? Need help? Post your questions and find answers here.
rufusthedog
New User
New User
Posts: 7
Joined: Sat Nov 16, 2013 9:04 am

StringGadget not updating

Post by rufusthedog »

I connect to an Arduino and I have 6 analog inputs I wish to read, but only the first one updates unless I drag the window. What am I doing wrong.

Link to the video of the problem:
https://drive.google.com/file/d/1AnA7IG ... share_link

Thank you,
Bryanp

The windows form:


Code: Select all

;/ Created with PureVision64 v6.01 x64
;/ Sun, 29 Jan 2023 10:23:18
;/ by Bryan             




XIncludeFile "temerature_Constants.pb"


Procedure SizeWindowHandler()
  PVX::PVDynamic_Resize(WindowID(EventWindow())) 
EndProcedure
BindEvent(#PB_Event_SizeWindow,@SizeWindowHandler())





Procedure.i Window_Form1()
  If OpenWindow(#Window_Form1,0,0,600,312,"Temperature Program",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered|#PB_Window_Invisible)
    CreateImageMenu(#MenuBar_Form1,WindowID(#Window_Form1))
      MenuTitle("File")
      MenuItem(#MenuBar_Form1_New,"New")
      MenuBar()
      MenuItem(#MenuBar_Form1_Open,"Open")
      MenuItem(#MenuBar_Form1_Save,"Save")
      MenuBar()
      MenuItem(#MenuBar_Form1_Exit,"Exit")
      MenuTitle("Settings")
      MenuItem(#MenuBar_Form1_Comport,"Serial Port")
      ComboBoxGadget(#Gadget_Form1_ComboBox1,50,30,100,20,#PB_ComboBox_Editable)
       SetGadgetFont(#Gadget_Form1_ComboBox1,LoadFont(#Gadget_Form1_ComboBox1,"Arial",10))
      MenuTitle("Help")
      MenuItem(#MenuBar_Form1_Help,"Help")
      MenuBar()
      MenuItem(#MenuBar_Form1_About,"About")
      TextGadget( #Gadget_text_1,200,50,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_2,200,80,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_3,200,110,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_4,200,140,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_5,200,170,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_6,200,200,500,20, "Degrees C",#PB_Text_Center)
      TextGadget( #Gadget_text_7,0,10,200,20, "Serial Port Select",#PB_Text_Center)
      StringGadget(#Gadget_Form1_temp1,170,50,200,20,"")
      StringGadget(#Gadget_Form1_temp2,170,80,200,20,"")
      StringGadget(#Gadget_Form1_temp3,170,110,200,20,"")
      StringGadget(#Gadget_Form1_temp4,170,140,200,20,"")
      StringGadget(#Gadget_Form1_temp5,170,170,200,20,"")
      StringGadget(#Gadget_Form1_temp6,170,200,200,20,"")
      
      WindowBounds(#Window_Form1,WindowWidth(#Window_Form1),WindowHeight(#Window_Form1),#PB_Ignore,#PB_Ignore)
      PVX::PVDynamic_AddWindow(#Window_Form1)
      HideWindow(#Window_Form1,#False)
    ProcedureReturn WindowID(#Window_Form1)
  EndIf
EndProcedure


Constants:

Code: Select all

;/ Created with PureVision64 v6.01 x64
;/ Sun, 29 Jan 2023 10:27:45
;/ by Bryan Pollock             





XIncludeFile "C:\PureVision64\Modules\Module_PVGadgets.pbi"

;- Global Variables and Constants
Global BubbleTipStyle=0
Define EventID,MenuID,GadgetID,WindowID

;- Window Constants
Enumeration 1
  #Window_Form1
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue


;- Gadget Constants
Enumeration 1
  ;Window_Form1
  #MenuBar_Form1_TitleFile
  #MenuBar_Form1_New
  #MenuBar_Form1_Open
  #MenuBar_Form1_Save
  #MenuBar_Form1_Exit
  #MenuBar_Form1_TitleEdit
  #MenuBar_Form1_Comport
  #MenuBar_Form1_TitleHelp
  #MenuBar_Form1_Help
  #MenuBar_Form1_About
  #Gadget_text_1
  #Gadget_text_2
  #Gadget_text_3
  #Gadget_text_4
  #Gadget_text_5
  #Gadget_text_6
  #Gadget_text_7
  #Gadget_Form1_ComboBox1
  #Gadget_Form1_temp1
  #Gadget_Form1_temp2
  #Gadget_Form1_temp3
  #Gadget_Form1_temp4
  #Gadget_Form1_temp5
  #Gadget_Form1_temp6
  #SERIAL_PORT_NUM
  #SERIAL_PORT
  
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue


;- MenuBar Constants
Enumeration 1
  #MenuBar_Form1
EndEnumeration
#MenuBarIndex=#PB_Compiler_EnumerationValue

Program:

Code: Select all

;/ Created with PureVision64 v6.01 x64
;/ Sun, 29 Jan 2023 10:27:45
;/ by Bryan Pollock             


Declare GetAvailableComPorts()
Declare Read_Arduino()
Global NewList AvailableComs.s()
XIncludeFile "temerature_Constants.pb"
XIncludeFile "temerature_Windows.pb"







If Window_Form1()
  SerialPort.s = GetGadgetText(#Gadget_Form1_ComboBox1)
  Define quitForm1=0
  Repeat
    EventID  =WaitWindowEvent()
    MenuID   =EventMenu()
    GadgetID =EventGadget()
    WindowID =EventWindow()
    
    Select EventID
      Case #PB_Event_CloseWindow
        Select WindowID
          Case #Window_Form1
            quitForm1=1
        EndSelect
        
      Case #PB_Event_Menu
        Select MenuID
          Case #MenuBar_Form1_New
          Case #MenuBar_Form1_Open
          Case #MenuBar_Form1_Save
          Case #MenuBar_Form1_Exit
          Case #MenuBar_Form1_Comport
          Case #MenuBar_Form1_Help
          Case #MenuBar_Form1_About
        EndSelect
        
      Case #PB_Event_Gadget
        Select GadgetID
          Case #Gadget_Form1_ComboBox1
            GetAvailableComPorts()
            SerialPort.s = GetGadgetText(#Gadget_Form1_ComboBox1)
            If Not IsSerialPort(#SERIAL_PORT) 
              OpenSerialPort(#SERIAL_PORT, SerialPort, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
            EndIf
            ForEach AvailableComs()
              AddGadgetItem(#Gadget_Form1_ComboBox1, 0,AvailableComs())
              
            Next  
            Select EventType()
              Case #PB_EventType_Change
              Case #PB_EventType_Focus
              Case #PB_EventType_LostFocus
              Default
            EndSelect
          Case #Gadget_Form1_temp1
            Select EventType()
              Case #PB_EventType_Change
              Case #PB_EventType_Focus
              Case #PB_EventType_LostFocus
              Default
            EndSelect
          Case #Gadget_Form1_temp2
            Select EventType()
              Case #PB_EventType_Change
              Case #PB_EventType_Focus
              Case #PB_EventType_LostFocus
              Default
            EndSelect
          Case #Gadget_Form1_temp3
            Select EventType()
              Case #PB_EventType_Change
              Case #PB_EventType_Focus
              Case #PB_EventType_LostFocus
              Default
            EndSelect
          Case #Gadget_Form1_temp4
            Select EventType()
              Case #PB_EventType_Change
              Case #PB_EventType_Focus
              Case #PB_EventType_LostFocus
              Default
            EndSelect
        EndSelect
        
    EndSelect
    
    Read_Arduino()
    
    
  Until quitForm1
  CloseWindow(#Window_Form1)
EndIf
End

Procedure Read_Arduino()  
  If IsSerialPort(#SERIAL_PORT) > 0
    
    
    buffer.b
    text.s
    L.i     ;length of the text
    text=""
    Repeat  
      While AvailableSerialPortInput(#SERIAL_PORT) > 0
        
        If ReadSerialPortData(#SERIAL_PORT, @Buffer, 1)   
          
          Text = Text + Chr(Buffer) 
         
        EndIf 
      Wend   
    Until Chr(Buffer) = "e"   
    length=Len(text)
    
    text=Left(text,length)
   
        
        
        text1.s = StringField(text,1,",")
        SetGadgetText(#Gadget_Form1_temp1,text1)
        
      
        
        text2.s = StringField(text,2,",")
        SetGadgetText(#Gadget_Form1_temp2,text2)
        
      
        text3.s = StringField(text,3,",")
        SetGadgetText(#Gadget_Form1_temp3,text3)
        
      
        text4.s = StringField(text,4,",")
        SetGadgetText(#Gadget_Form1_temp4,text4)
        
      
        text5.s = StringField(text,5,",")
        SetGadgetText(#Gadget_Form1_temp5,text5)
        
      
        text6.s = StringField(text,6,",")
        SetGadgetText(#Gadget_Form1_temp6,text6)
        
      
    
  EndIf         
EndProcedure

Procedure GetAvailableComPorts()   ;this procedure scans the registry (on win) or dmesg (on linux) to find the connected com ports
  Protected hKey, lpcbName, lpName.s, a$, lType, i, j, Dmesg, Fgrep, Port.s
  
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, #KEY_QUERY_VALUE, @hKey) = #ERROR_SUCCESS
        lpName = Space(1024)
        
        Repeat
          lpcbName = 1024
          If RegEnumValue_(hKey, i, @lpName, @lpcbName, 0, 0, 0, 0) = #ERROR_SUCCESS
            a$ = Left(lpName, lpcbName)
            If a$ = ""
              Break
            EndIf
            lpcbName = 1024
            lType    = 0
            If RegQueryValueEx_(hKey, a$, 0, @lType, @lpName, @lpcbName) = #ERROR_SUCCESS
              AddElement(AvailableComs())
              AvailableComs() = lpName
            EndIf
            i + 1
          Else
            Break
          EndIf
        ForEver
        RegCloseKey_(hKey)
      EndIf
      
  CompilerEndSelect
  
EndProcedure

#include <arduino.h>
#include <math.h>
using namespace std;

const int samples = 30;
// Kevin at 0 degree C
const double Kelvin = 298.15;
// Resistor at the top of the top of the Thermistor divider for Laser Temp
const double R = 11923.00;
// Thermistor at Room
double therm = 10000.0;
//Beta from datasheet of thermistor
const double beta = 3984.0;
double thermResistance = 0.0;
const int laserTemp1 = A0;
const int laserTemp2 = A1;
const int laserTemp3 = A2;
const int laserTemp4 = A3;
const int laserTemp5 = A4;
const int laserTemp6 = A5;
//int Temp1;
//int Temp2;
//int Temp3;
//int Temp4;
//int Temp5;
//int Temp6;

// the voltage value off the laser temp resistor divider
float laserTempValue1 = 0.0;
float laserTempValue2 = 0.0;
float laserTempValue3 = 0.0;
float laserTempValue4 = 0.0;
float laserTempValue5 = 0.0;
float laserTempValue6 = 0.0;
unsigned long previousMillis = 0;
unsigned long currentTime = millis();
unsigned long previousTime = 0;
unsigned long elapsedTime = 0;
unsigned long interval = 100;
double laserTempValueinC = 0.0;
int sampling(int inputs);
double sendit(int Temp1);

void delayAdc();
void setup() {
// initialize both serial ports:
Serial.begin(115200);

}

void loop() {


sendit(laserTemp1);
//Serial.print("Temp 1: ");
Serial.print(laserTempValueinC);
Serial.print(",");

sendit(laserTemp2);
//Serial.print("Temp 2: ");
Serial.print(laserTempValueinC);
Serial.print(",");

sendit(laserTemp3);
//Serial.print("Temp 3: ");
Serial.print(laserTempValueinC);
Serial.print(",");

sendit(laserTemp4);
//Serial.print("Temp 4: ");
Serial.print(laserTempValueinC);
Serial.print(",");

sendit(laserTemp5);
//Serial.print("Temp 5: ");
Serial.print(laserTempValueinC);
Serial.print(",");

sendit(laserTemp6);
//Serial.print("Temp 6: ");
Serial.print(laserTempValueinC);
Serial.print(",");
Serial.print("e");
;

delay(50);
}

double sendit(int Tempin){
laserTempValue1 = 5.0 * sampling(Tempin) / 1023;
thermResistance = R*laserTempValue1 / ((5.0 - laserTempValue1));
laserTempValueinC = (1/(log(thermResistance/R)/beta+1/298.15))-273.15;
delay(200);
return laserTempValueinC;
}



int sampling(int inputs)
{

int i;
int sample1 = 0;

for (i = 0; i < samples; i++)
{
sample1 = sample1 + analogRead(inputs);
delayAdc();
}
sample1 = sample1 / samples;
return sample1;
}
void delayAdc()
{

previousMillis = currentTime;
if (currentTime - previousMillis >= interval)
previousMillis = currentTime;
}

[/code]
Last edited by rufusthedog on Tue Feb 14, 2023 12:35 am, edited 1 time in total.
infratec
Always Here
Always Here
Posts: 7577
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: StringGadget not updating

Post by infratec »

This listings are to complicated to follow.

Why not doing one simple program for this stuff?
And use a thread for the serial communication.

A thread where I already posted many links to examples:
viewtopic.php?p=583249
rufusthedog
New User
New User
Posts: 7
Joined: Sat Nov 16, 2013 9:04 am

Re: StringGadget not updating

Post by rufusthedog »

This listings are to complicated to follow.

Why not doing one simple program for this stuff?
And use a thread for the serial communication.

A thread where I already posted many links to examples:
viewtopic.php?p=583249
Thank you for your reply,

I will look into using threads, something new for me.
infratec
Always Here
Always Here
Posts: 7577
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: StringGadget not updating

Post by infratec »

Maybe this works (not tested)

Code: Select all

CompilerIf Not #PB_Compiler_Thread
  CompilerError "Enable thread safe in compiler options"
CompilerEndIf

EnableExplicit

#COMMaxPorts = 30

Enumeration
  #Gadget_Form1_ComboBox1
  #Gadget_text_1
  #Gadget_text_2
  #Gadget_text_3
  #Gadget_text_4
  #Gadget_text_5
  #Gadget_text_6
  #Gadget_text_7
  #Gadget_Form1_temp1
  #Gadget_Form1_temp2
  #Gadget_Form1_temp3
  #Gadget_Form1_temp4
  #Gadget_Form1_temp5
  #Gadget_Form1_temp6
EndEnumeration


Enumeration #PB_Event_FirstCustomValue
  #ComThread_Started
  #ComThread_ByteReceived
  #ComThread_LineReceived
  #ComThread_Finished
EndEnumeration


Structure ThreadParameterStructure
  Thread.i
  Semaphore.i
  Com$
  Com.i
  Receive$
  Exit.i
EndStructure



Global NewList COMUsablePorts.s()


Procedure COMGetAvailablePorts()
  
  Protected NewList COMPortNameList.s()
  Protected i.i, Directory.i, Com.i
  
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    For i = 1 To #COMMaxPorts
      AddElement(COMPortNameList())
      COMPortNameList() = "COM" + Str(i)
    Next i
  CompilerEndIf
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    Directory = ExamineDirectory(#PB_Any, "/dev", "ttyUSB*")
    If Directory
      While NextDirectoryEntry(Directory)
        AddElement(COMPortNameList())
        COMPortNameList() = "/dev/" + DirectoryEntryName(Directory)
      Wend
      FinishDirectory(Directory)
    EndIf
  CompilerEndIf
  
  CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    Directory = ExamineDirectory(#PB_Any, "/dev", "tty.usbserial*")
    If Directory
      While NextDirectoryEntry(Directory)
        AddElement(COMPortNameList())
        COMPortNameList() = "/dev/" + DirectoryEntryName(Directory)
      Wend
      FinishDirectory(Directory)
    EndIf
  CompilerEndIf
  
  ForEach COMPortNameList()
    Com = OpenSerialPort(#PB_Any, COMPortNameList(), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1, 1)
    If Com
      AddElement(COMUsablePorts())
      COMUsablePorts() = COMPortNameList()
      CloseSerialPort(Com)
    EndIf
  Next
  
  FreeList(COMPortNameList())
  
EndProcedure



Procedure ComThread(*Parameter.ThreadParameterStructure)
  
  Protected.a Byte, LastByte
  Protected.i CommaCount
  
  
  PostEvent(#ComThread_Started)
  
  *Parameter\Com = OpenSerialPort(#PB_Any, *Parameter\Com$, 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  If *Parameter\Com
    
    ;WriteSerialPortString(*Parameter\Com, #CR$ + #CR$ + #CR$)
    
    Repeat
      If AvailableSerialPortInput(*Parameter\Com)
        If ReadSerialPortData(*Parameter\Com, @Byte, 1) = 1
          *Parameter\Receive$ + Chr(Byte)
          If Byte = 'e' And LastByte = ','
            If CommaCount = 6
              PostEvent(#ComThread_LineReceived)
              WaitSemaphore(*Parameter\Semaphore)
            EndIf
            *Parameter\Receive$ = ""
            CommaCount = 0
          ElseIf Byte = ','
            CommaCount + 1
          EndIf
          LastByte = Byte
        EndIf
      Else
        Delay(10)
      EndIf
    Until *Parameter\Exit
    
    CloseSerialPort(*Parameter\Com)
    
  EndIf
  
  PostEvent(#ComThread_Finished)
  
EndProcedure






;-Main
Define.i Event, Exit, i
Define ThreadParameter.ThreadParameterStructure

COMGetAvailablePorts()



OpenWindow(0,0,0,600,312,"Temperature Program",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

TextGadget( #Gadget_text_7,50,10,100,20, "Serial Port Select")
ComboBoxGadget(#Gadget_Form1_ComboBox1,50,30,100,20)
AddGadgetItem(#Gadget_Form1_ComboBox1, -1, "")
ForEach COMUsablePorts()
  AddGadgetItem(#Gadget_Form1_ComboBox1, -1, COMUsablePorts())
Next
SetGadgetState(#Gadget_Form1_ComboBox1, 0)

StringGadget(#Gadget_Form1_temp1,170,50,200,20,"")
TextGadget(#Gadget_text_1,380,50,100,20, "Degrees C")

StringGadget(#Gadget_Form1_temp2,170,80,200,20,"")
TextGadget(#Gadget_text_2,380,80,100,20, "Degrees C")

StringGadget(#Gadget_Form1_temp3,170,110,200,20,"")
TextGadget(#Gadget_text_3,380,110,100,20, "Degrees C")

StringGadget(#Gadget_Form1_temp4,170,140,200,20,"")
TextGadget(#Gadget_text_4,380,140,100,20, "Degrees C")

StringGadget(#Gadget_Form1_temp5,170,170,200,20,"")
TextGadget(#Gadget_text_5,380,170,100,20, "Degrees C")

StringGadget(#Gadget_Form1_temp6,170,200,200,20,"")
TextGadget(#Gadget_text_6,380,200,100,20, "Degrees C")

ThreadParameter\Semaphore = CreateSemaphore()

;-MainLoop
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      Exit = #True
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Gadget_Form1_ComboBox1
          If IsThread(ThreadParameter\Thread)
            Debug "Stop"
            ThreadParameter\Exit = #True
            If WaitThread(ThreadParameter\Thread, 1000) = 0
              Debug "This should never happen"
              KillThread(ThreadParameter\Thread)
            EndIf
          EndIf
          If GetGadgetState(#Gadget_Form1_ComboBox1) > 0
            Debug "Start"
            ThreadParameter\Exit = #False
            ThreadParameter\Receive$ = ""
            ThreadParameter\Com$ = GetGadgetText(#Gadget_Form1_ComboBox1)
            ThreadParameter\Thread = CreateThread(@ComThread(), @ThreadParameter)
          EndIf
      EndSelect
      
    Case #ComThread_LineReceived
      For i = 1 To 6
        SetGadgetText(#Gadget_Form1_temp1 + i - 1, StringField(ThreadParameter\Receive$, i, ","))
      Next i
      SignalSemaphore(ThreadParameter\Semaphore)
      
  EndSelect
Until Exit

If IsThread(ThreadParameter\Thread)
  ThreadParameter\Exit = #True
  If WaitThread(ThreadParameter\Thread, 1000) = 0
    KillThread(ThreadParameter\Thread)
  EndIf
EndIf

FreeSemaphore(ThreadParameter\Semaphore)
Last edited by infratec on Fri Feb 10, 2023 8:57 am, edited 1 time in total.
rufusthedog
New User
New User
Posts: 7
Joined: Sat Nov 16, 2013 9:04 am

Re: StringGadget not updating

Post by rufusthedog »

Thank you that almost worked. I added this to it which might not be the best way but it is working now.

Code: Select all

Case #ComThread_LineReceived
      For i = 1 To 6
        Select i
            Case 1
              SetGadgetText(#Gadget_Form1_temp1, StringField(ThreadParameter\Receive$, i, ","))
            Case 2
              SetGadgetText(#Gadget_Form1_temp2, StringField(ThreadParameter\Receive$, i, ","))
            Case 3
              SetGadgetText(#Gadget_Form1_temp3, StringField(ThreadParameter\Receive$, i, ","))
            Case 4
              SetGadgetText(#Gadget_Form1_temp4, StringField(ThreadParameter\Receive$, i, ","))
            Case 5
              SetGadgetText(#Gadget_Form1_temp5, StringField(ThreadParameter\Receive$, i, ","))
            Case 6
              SetGadgetText(#Gadget_Form1_temp6, StringField(ThreadParameter\Receive$, i, ","))     
              
        EndSelect
      Next i
      SignalSemaphore(ThreadParameter\Semaphore)
infratec
Always Here
Always Here
Posts: 7577
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: StringGadget not updating

Post by infratec »

I changed my code above:

Code: Select all

Case #ComThread_LineReceived
      For i = 1 To 6
        SetGadgetText(#Gadget_Form1_temp1 + i - 1, StringField(ThreadParameter\Receive$, i, ","))
      Next i
      SignalSemaphore(ThreadParameter\Semaphore)
And added a missing initialisation:

Code: Select all

If GetGadgetState(#Gadget_Form1_ComboBox1) > 0
            Debug "Start"
            ThreadParameter\Exit = #False
            ThreadParameter\Receive$ = ""
            ThreadParameter\Com$ = GetGadgetText(#Gadget_Form1_ComboBox1)
            ThreadParameter\Thread = CreateThread(@ComThread(), @ThreadParameter)
          EndIf
rufusthedog
New User
New User
Posts: 7
Joined: Sat Nov 16, 2013 9:04 am

Re: StringGadget not updating

Post by rufusthedog »

Thank you, that is much simpler.

You seem to be the threading Deity on the forum. I imagine you are busy, but it would great if you found the time to write a tutorial on the subject.

Thanks for all your help,

Bryan
Post Reply