From b36eac6a9d16de164d8517a4ba2262d5c3e57e05 Mon Sep 17 00:00:00 2001 From: CWRoos Date: Wed, 17 Jul 2013 20:21:32 +0200 Subject: [PATCH] first commit --- .directory | 2 + .gambas/FMAIN | Bin 0 -> 46580 bytes .gambas/I2C | Bin 0 -> 27928 bytes .gambas/SHIFT | Bin 0 -> 5516 bytes .gambas/SPI | Bin 0 -> 4384 bytes .gitattributes | 22 + .gitignore | 215 +++++++++ .icon.png | Bin 0 -> 4435 bytes .settings | 18 + .src/FMain.class | 1145 ++++++++++++++++++++++++++++++++++++++++++++++ .src/FMain.form | 918 +++++++++++++++++++++++++++++++++++++ .src/I2C.class | 769 +++++++++++++++++++++++++++++++ .src/I2C.form | 427 +++++++++++++++++ .src/SPI.class | 77 ++++ .src/SPI.form | 73 +++ .src/Shift.class | 93 ++++ .src/Shift.form | 101 ++++ .startup | 10 + GPIO_Controll | Bin 0 -> 96010 bytes gpio.png | Bin 0 -> 2625 bytes i2c.png | Bin 0 -> 6233 bytes ledoff.png | Bin 0 -> 956 bytes ledon.png | Bin 0 -> 1172 bytes 23 files changed, 3870 insertions(+) create mode 100644 .directory create mode 100644 .gambas/FMAIN create mode 100644 .gambas/I2C create mode 100644 .gambas/SHIFT create mode 100644 .gambas/SPI create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .icon.png create mode 100644 .settings create mode 100644 .src/FMain.class create mode 100644 .src/FMain.form create mode 100644 .src/I2C.class create mode 100644 .src/I2C.form create mode 100644 .src/SPI.class create mode 100644 .src/SPI.form create mode 100644 .src/Shift.class create mode 100644 .src/Shift.form create mode 100644 .startup create mode 100644 GPIO_Controll create mode 100644 gpio.png create mode 100644 i2c.png create mode 100644 ledoff.png create mode 100644 ledon.png diff --git a/.directory b/.directory new file mode 100644 index 0000000..06dab1c --- /dev/null +++ b/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/.gambas/FMAIN b/.gambas/FMAIN new file mode 100644 index 0000000000000000000000000000000000000000..29027ddd3b5ab3713717d43ed5540e91442b1437 GIT binary patch literal 46580 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%0A9XbxpM16Sl0 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 Dh4By= literal 0 HcmV?d00001 diff --git a/.gambas/I2C b/.gambas/I2C new file mode 100644 index 0000000000000000000000000000000000000000..c1e39672f5ce5cc3fed08132248e610c5b89db11 GIT binary patch literal 27928 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 An*aa+ literal 0 HcmV?d00001 diff --git a/.gambas/SHIFT b/.gambas/SHIFT new file mode 100644 index 0000000000000000000000000000000000000000..2a78a47aa71fd05712e478b290e7bf6fef8abfda GIT binary patch literal 5516 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 IWo=F5zx4gTIRF3v literal 0 HcmV?d00001 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/.icon.png b/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..99f0e75b9c7adbec8956896931983b4726256b87 GIT binary patch literal 4435 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 graf[y, x + 1]) + Draw.Line(x * 10 + 10, 53, x * 10 + 10, 3) + Endif + Next + Draw.Line(650, graf[y, 65], 660, graf[y, 65]) + Draw.End + Endif + + End + + +Public Sub Timer1_Timer() +Dim x, y As Integer + + + For y = 0 To 7 + If (port8[y] = PIN_INPUT) + For x = 0 To 64 + graf[y, x] = graf[y, x + 1] + Next + If (digitalRead(y) = 1) + graf[y, 65] = 3 + Else + graf[y, 65] = 53 + Endif + Endif + Next + + anal(Draw0, 0) + anal(Draw1, 1) + anal(Draw2, 2) + anal(Draw3, 3) + anal(Draw4, 4) + anal(Draw5, 5) + anal(Draw6, 6) + anal(Draw7, 7) + + If (digitalRead(0) = 1) + LED0.Picture = img_ledon + Else + LED0.Picture = img_ledoff + Endif + If (digitalRead(1) = 1) + LED1.Picture = img_ledon + Else + LED1.Picture = img_ledoff + Endif + If (digitalRead(2) = 1) + LED2.Picture = img_ledon + Else + LED2.Picture = img_ledoff + Endif + If (digitalRead(3) = 1) + LED3.Picture = img_ledon + Else + LED3.Picture = img_ledoff + Endif + If (digitalRead(4) = 1) + LED4.Picture = img_ledon + Else + LED4.Picture = img_ledoff + Endif + If (digitalRead(5) = 1) + LED5.Picture = img_ledon + Else + LED5.Picture = img_ledoff + Endif + If (digitalRead(6) = 1) + LED6.Picture = img_ledon + Else + LED6.Picture = img_ledoff + Endif + If (digitalRead(7) = 1) + LED7.Picture = img_ledon + Else + LED7.Picture = img_ledoff + Endif + +End + + +Public Sub poff0_Click() + + pullUpDnControl(0, PUD_OFF) + +End + +Public Sub pup0_Click() + + pullUpDnControl(0, PUD_UP) + +End + +Public Sub pdwn0_Click() + + pullUpDnControl(0, PUD_DOWN) + +End + +Public Sub zero0_Click() + + digitalWrite(0, 0) + +End + +Public Sub plus0_Click() + + digitalWrite(0, 1) + +End + +Public Sub spwmon0_Click() + + softPwmCreate(0, spwmslid0.Value, 100) + spwmon0.Enabled = False + plus0.Enabled = False + zero0.Enabled = False + IN0.enabled = False + softone0.Enabled = False + stonesl0.Enabled = False +End + +Public Sub spwmslid0_Change() + + softPwmWrite(0, spwmslid0.Value) + pwmval0.Text = Str$(spwmslid0.Value) + +End + +Public Sub softone0_Click() + + softToneCreate(0) + spwmon0.Enabled = False + plus0.Enabled = False + zero0.Enabled = False + IN0.enabled = False + softone0.Enabled = False + spwmslid0.Enabled = False + softToneWrite(0, stonesl0.Value) + +End + +Public Sub stonesl0_Change() + + softToneWrite(0, stonesl0.Value) + stoneval0.Text = Str$(stonesl0.Value) + +End + +Public Sub IN1_Click() + + pinMode(1, PIN_INPUT) + port8[1] = PIN_INPUT + Draw1.Visible = True + poff1.Visible = True + pup1.Visible = True + pdwn1.Visible = True + zero1.Visible = False + plus1.Visible = False + spwmon1.Visible = False + spwmslid1.Visible = False + Labelpwm1.Visible = False + pwmval1.Visible = False + RadioButton1.Visible = False + RadioButton2.Visible = False + range.Visible = False + rangspin.Visible = False + divisor.Visible = False + divspin.Visible = False + End + +Public Sub OUT1_Click() + + pinMode(1, PIN_OUTPUT) + port8[1] = PIN_OUTPUT + Draw1.Visible = False + poff1.Visible = False + pup1.Visible = False + pdwn1.Visible = False + zero1.Visible = True + plus1.Visible = True + If (zero1.Value) + LED1.picture = img_ledoff + digitalWrite(1, 0) + Else + LED1.picture = img_ledon + digitalWrite(1, 1) + Endif + spwmon1.Visible = True + spwmslid1.Visible = True + Labelpwm1.Visible = True + pwmval1.Visible = True + RadioButton1.Visible = True + RadioButton2.Visible = True + range.Visible = True + rangspin.Visible = True + divisor.Visible = True + divspin.Visible = True +End + + + +Public Sub poff1_Click() + + pullUpDnControl(1, PUD_OFF) + +End + +Public Sub pup1_Click() + + pullUpDnControl(1, PUD_UP) + +End + +Public Sub pdwn1_Click() + + pullUpDnControl(1, PUD_DOWN) + +End + +Public Sub zero1_Click() + + digitalWrite(1, 0) + +End + +Public Sub plus1_Click() + + digitalWrite(1, 1) + +End + +Public Sub spwmon1_Click() +If (spwmon1.Value = True) + pinMode(1, PIN_PWM) + pwmSetRange(rangspin.Value) + pwmWrite(1, spwmslid1.Value) + pwmSetClock(divspin.Value) + pwmSetMode(PWM_MODE_BAL) +Else + pinMode(1, PIN_OUTPUT) +Endif + +End + +Public Sub spwmslid1_Change() + + pwmWrite(1, spwmslid1.Value) + pwmval1.Text = Str$(spwmslid1.Value) + +End + + +Public Sub IN2_Click() + + pinMode(2, PIN_INPUT) + port8[2] = PIN_INPUT + Draw2.Visible = True + poff2.Visible = True + pup2.Visible = True + pdwn2.Visible = True + zero2.Visible = False + plus2.Visible = False + spwmon2.Visible = False + spwmslid2.Visible = False + Labelpwm2.Visible = False + pwmval2.Visible = False + softone2.Visible = False + stonesl2.Visible = False + stoneval2.Visible = False + Labeltone2.Visible = False + + End + +Public Sub OUT2_Click() + + pinMode(2, PIN_OUTPUT) + port8[2] = PIN_OUTPUT + Draw2.Visible = False + poff2.Visible = False + pup2.Visible = False + pdwn2.Visible = False + zero2.Visible = True + plus2.Visible = True + If (zero2.Value) + LED2.picture = img_ledoff + digitalWrite(2, 0) + Else + LED2.picture = img_ledon + digitalWrite(2, 1) + Endif + spwmon2.Visible = True + spwmslid2.Visible = True + Labelpwm2.Visible = True + pwmval2.Visible = True + softone2.Visible = True + stonesl2.Visible = True + stoneval2.Visible = True + Labeltone2.Visible = True + +End + +Public Sub poff2_Click() + + pullUpDnControl(2, PUD_OFF) + +End + +Public Sub pup2_Click() + + pullUpDnControl(2, PUD_UP) + +End + +Public Sub pdwn2_Click() + + pullUpDnControl(2, PUD_DOWN) + +End + +Public Sub zero2_Click() + + digitalWrite(2, 0) + +End + +Public Sub plus2_Click() + + digitalWrite(2, 1) + +End + +Public Sub spwmon2_Click() + + softPwmCreate(2, spwmslid2.Value, 100) + spwmon2.Enabled = False + plus2.Enabled = False + zero2.Enabled = False + IN2.enabled = False + softone2.Enabled = False + stonesl2.Enabled = False +End + +Public Sub spwmslid2_Change() + + softPwmWrite(2, spwmslid2.Value) + pwmval2.Text = Str$(spwmslid2.Value) + +End + +Public Sub softone2_Click() + + softToneCreate(2) + spwmon2.Enabled = False + plus2.Enabled = False + zero2.Enabled = False + IN2.enabled = False + softone2.Enabled = False + spwmslid2.Enabled = False + softToneWrite(2, stonesl2.Value) + +End + +Public Sub stonesl2_Change() + + softToneWrite(2, stonesl2.Value) + stoneval2.Text = Str$(stonesl2.Value) + +End + +Public Sub IN3_Click() + + pinMode(3, PIN_INPUT) + port8[3] = PIN_INPUT + Draw3.Visible = True + poff3.Visible = True + pup3.Visible = True + pdwn3.Visible = True + zero3.Visible = False + plus3.Visible = False + spwmon3.Visible = False + spwmslid3.Visible = False + Labelpwm3.Visible = False + pwmval3.Visible = False + softone3.Visible = False + stonesl3.Visible = False + stoneval3.Visible = False + Labeltone3.Visible = False + + End + +Public Sub OUT3_Click() + + pinMode(3, PIN_OUTPUT) + port8[3] = PIN_OUTPUT + Draw3.Visible = False + poff3.Visible = False + pup3.Visible = False + pdwn3.Visible = False + zero3.Visible = True + plus3.Visible = True + If (zero3.Value) + LED3.picture = img_ledoff + digitalWrite(3, 0) + Else + LED3.picture = img_ledon + digitalWrite(3, 1) + Endif + spwmon3.Visible = True + spwmslid3.Visible = True + Labelpwm3.Visible = True + pwmval3.Visible = True + softone3.Visible = True + stonesl3.Visible = True + stoneval3.Visible = True + Labeltone3.Visible = True + +End + +Public Sub poff3_Click() + + pullUpDnControl(3, PUD_OFF) + +End + +Public Sub pup3_Click() + + pullUpDnControl(3, PUD_UP) + +End + +Public Sub pdwn3_Click() + + pullUpDnControl(3, PUD_DOWN) + +End + +Public Sub zero3_Click() + + digitalWrite(3, 0) + +End + +Public Sub plus3_Click() + + digitalWrite(3, 1) + +End + +Public Sub spwmon3_Click() + + softPwmCreate(3, spwmslid3.Value, 100) + spwmon3.Enabled = False + plus3.Enabled = False + zero3.Enabled = False + IN3.enabled = False + softone3.Enabled = False + stonesl3.Enabled = False +End + +Public Sub spwmslid3_Change() + + softPwmWrite(3, spwmslid3.Value) + pwmval3.Text = Str$(spwmslid3.Value) + +End + +Public Sub softone3_Click() + + softToneCreate(3) + spwmon3.Enabled = False + plus3.Enabled = False + zero3.Enabled = False + IN3.enabled = False + softone3.Enabled = False + spwmslid3.Enabled = False + softToneWrite(3, stonesl3.Value) + +End + +Public Sub stonesl3_Change() + + softToneWrite(3, stonesl3.Value) + stoneval3.Text = Str$(stonesl3.Value) + +End + +Public Sub IN4_Click() + + pinMode(4, PIN_INPUT) + port8[4] = PIN_INPUT + Draw4.Visible = True + poff4.Visible = True + pup4.Visible = True + pdwn4.Visible = True + zero4.Visible = False + plus4.Visible = False + spwmon4.Visible = False + spwmslid4.Visible = False + Labelpwm4.Visible = False + pwmval4.Visible = False + softone4.Visible = False + stonesl4.Visible = False + stoneval4.Visible = False + Labeltone4.Visible = False + + End + +Public Sub OUT4_Click() + + pinMode(4, PIN_OUTPUT) + port8[4] = PIN_OUTPUT + Draw4.Visible = False + poff4.Visible = False + pup4.Visible = False + pdwn4.Visible = False + zero4.Visible = True + plus4.Visible = True + If (zero4.Value) + LED4.picture = img_ledoff + digitalWrite(4, 0) + Else + LED4.picture = img_ledon + digitalWrite(4, 1) + Endif + spwmon4.Visible = True + spwmslid4.Visible = True + Labelpwm4.Visible = True + pwmval4.Visible = True + softone4.Visible = True + stonesl4.Visible = True + stoneval4.Visible = True + Labeltone4.Visible = True + +End + +Public Sub poff4_Click() + + pullUpDnControl(4, PUD_OFF) + +End + +Public Sub pup4_Click() + + pullUpDnControl(4, PUD_UP) + +End + +Public Sub pdwn4_Click() + + pullUpDnControl(4, PUD_DOWN) + +End + +Public Sub zero4_Click() + + digitalWrite(4, 0) + +End + +Public Sub plus4_Click() + + digitalWrite(4, 1) + +End + +Public Sub spwmon4_Click() + + softPwmCreate(4, spwmslid4.Value, 100) + spwmon4.Enabled = False + plus4.Enabled = False + zero4.Enabled = False + IN4.enabled = False + softone4.Enabled = False + stonesl4.Enabled = False +End + +Public Sub spwmslid4_Change() + + softPwmWrite(4, spwmslid4.Value) + pwmval4.Text = Str$(spwmslid4.Value) + +End + +Public Sub softone4_Click() + + softToneCreate(4) + spwmon4.Enabled = False + plus4.Enabled = False + zero4.Enabled = False + IN4.enabled = False + softone4.Enabled = False + spwmslid4.Enabled = False + softToneWrite(4, stonesl4.Value) + +End + +Public Sub stonesl4_Change() + + softToneWrite(4, stonesl4.Value) + stoneval4.Text = Str$(stonesl4.Value) + +End + +Public Sub IN5_Click() + + pinMode(5, PIN_INPUT) + port8[5] = PIN_INPUT + Draw5.Visible = True + poff5.Visible = True + pup5.Visible = True + pdwn5.Visible = True + zero5.Visible = False + plus5.Visible = False + spwmon5.Visible = False + spwmslid5.Visible = False + Labelpwm5.Visible = False + pwmval5.Visible = False + softone5.Visible = False + stonesl5.Visible = False + stoneval5.Visible = False + Labeltone5.Visible = False + + End + +Public Sub OUT5_Click() + + pinMode(5, PIN_OUTPUT) + port8[5] = PIN_OUTPUT + Draw5.Visible = False + poff5.Visible = False + pup5.Visible = False + pdwn5.Visible = False + zero5.Visible = True + plus5.Visible = True + If (zero5.Value) + LED5.picture = img_ledoff + digitalWrite(5, 0) + Else + LED5.picture = img_ledon + digitalWrite(5, 1) + Endif + spwmon5.Visible = True + spwmslid5.Visible = True + Labelpwm5.Visible = True + pwmval5.Visible = True + softone5.Visible = True + stonesl5.Visible = True + stoneval5.Visible = True + Labeltone5.Visible = True + +End + +Public Sub poff5_Click() + + pullUpDnControl(5, PUD_OFF) + +End + +Public Sub pup5_Click() + + pullUpDnControl(5, PUD_UP) + +End + +Public Sub pdwn5_Click() + + pullUpDnControl(5, PUD_DOWN) + +End + +Public Sub zero5_Click() + + digitalWrite(5, 0) + +End + +Public Sub plus5_Click() + + digitalWrite(5, 1) + +End + +Public Sub spwmon5_Click() + + softPwmCreate(5, spwmslid5.Value, 100) + spwmon5.Enabled = False + plus5.Enabled = False + zero5.Enabled = False + IN5.enabled = False + softone5.Enabled = False + stonesl5.Enabled = False +End + +Public Sub spwmslid5_Change() + + softPwmWrite(5, spwmslid5.Value) + pwmval5.Text = Str$(spwmslid5.Value) + +End + +Public Sub softone5_Click() + + softToneCreate(5) + spwmon5.Enabled = False + plus5.Enabled = False + zero5.Enabled = False + IN5.enabled = False + softone5.Enabled = False + spwmslid5.Enabled = False + softToneWrite(5, stonesl5.Value) + +End + +Public Sub stonesl5_Change() + + softToneWrite(5, stonesl5.Value) + stoneval5.Text = Str$(stonesl5.Value) + +End + +Public Sub IN6_Click() + + pinMode(6, PIN_INPUT) + port8[6] = PIN_INPUT + Draw6.Visible = True + poff6.Visible = True + pup6.Visible = True + pdwn6.Visible = True + zero6.Visible = False + plus6.Visible = False + spwmon6.Visible = False + spwmslid6.Visible = False + Labelpwm6.Visible = False + pwmval6.Visible = False + softone6.Visible = False + stonesl6.Visible = False + stoneval6.Visible = False + Labeltone6.Visible = False + + End + +Public Sub OUT6_Click() + + pinMode(6, PIN_OUTPUT) + port8[6] = PIN_OUTPUT + Draw6.Visible = False + poff6.Visible = False + pup6.Visible = False + pdwn6.Visible = False + zero6.Visible = True + plus6.Visible = True + If (zero6.Value) + LED6.picture = img_ledoff + digitalWrite(6, 0) + Else + LED6.picture = img_ledon + digitalWrite(6, 1) + Endif + spwmon6.Visible = True + spwmslid6.Visible = True + Labelpwm6.Visible = True + pwmval6.Visible = True + softone6.Visible = True + stonesl6.Visible = True + stoneval6.Visible = True + Labeltone6.Visible = True + +End + +Public Sub poff6_Click() + + pullUpDnControl(6, PUD_OFF) + +End + +Public Sub pup6_Click() + + pullUpDnControl(6, PUD_UP) + +End + +Public Sub pdwn6_Click() + + pullUpDnControl(6, PUD_DOWN) + +End + +Public Sub zero6_Click() + + digitalWrite(6, 0) + +End + +Public Sub plus6_Click() + + digitalWrite(6, 1) + +End + +Public Sub spwmon6_Click() + + softPwmCreate(6, spwmslid6.Value, 100) + spwmon6.Enabled = False + plus6.Enabled = False + zero6.Enabled = False + IN6.enabled = False + softone6.Enabled = False + stonesl6.Enabled = False +End + +Public Sub spwmslid6_Change() + + softPwmWrite(6, spwmslid6.Value) + pwmval6.Text = Str$(spwmslid6.Value) + +End + +Public Sub softone6_Click() + + softToneCreate(6) + spwmon6.Enabled = False + plus6.Enabled = False + zero6.Enabled = False + IN6.enabled = False + softone6.Enabled = False + spwmslid6.Enabled = False + softToneWrite(6, stonesl6.Value) + +End + +Public Sub stonesl6_Change() + + softToneWrite(6, stonesl6.Value) + stoneval6.Text = Str$(stonesl6.Value) + +End + +Public Sub IN7_Click() + + pinMode(7, PIN_INPUT) + port8[7] = PIN_INPUT + Draw7.Visible = True + poff7.Visible = True + pup7.Visible = True + pdwn7.Visible = True + zero7.Visible = False + plus7.Visible = False + spwmon7.Visible = False + spwmslid7.Visible = False + Labelpwm7.Visible = False + pwmval7.Visible = False + softone7.Visible = False + clcspin.Visible = False + clcfreq.Visible = False + + End + +Public Sub OUT7_Click() + + pinMode(7, PIN_OUTPUT) + port8[7] = PIN_OUTPUT + Draw7.Visible = False + poff7.Visible = False + pup7.Visible = False + pdwn7.Visible = False + zero7.Visible = True + plus7.Visible = True + If (zero7.Value) + LED7.picture = img_ledoff + digitalWrite(7, 0) + Else + LED7.picture = img_ledon + digitalWrite(7, 1) + Endif + spwmon7.Visible = True + spwmslid7.Visible = True + Labelpwm7.Visible = True + pwmval7.Visible = True + softone7.Visible = True + clcspin.Visible = True + clcfreq.Visible = True + +End + +Public Sub poff7_Click() + + pullUpDnControl(7, PUD_OFF) + +End + +Public Sub pup7_Click() + + pullUpDnControl(7, PUD_UP) + +End + +Public Sub pdwn7_Click() + + pullUpDnControl(7, PUD_DOWN) + +End + +Public Sub zero7_Click() + + digitalWrite(7, 0) + +End + +Public Sub plus7_Click() + + digitalWrite(7, 1) + +End + +Public Sub spwmon7_Click() + + softPwmCreate(7, spwmslid7.Value, 100) + spwmon7.Enabled = False + plus7.Enabled = False + zero7.Enabled = False + IN7.enabled = False + softone7.Enabled = False + clcspin.Enabled = False +End + +Public Sub spwmslid7_Change() + + softPwmWrite(7, spwmslid7.Value) + pwmval7.Text = Str$(spwmslid7.Value) + +End + +Public Sub softone7_Click() + + If (softone7.Value = True) + pinMode(7, GPIO_CLOCK) + gpioClockSet(7, clcspin.Value) + Else + pinMode(7, PIN_OUTPUT) + Endif + +End + + +Public Sub SpinBox1_Change() + + Timer1.delay = SpinBox1.Value + +End + +Public Sub Button1_Click() + + Quit + +End + +Public Sub RadioButton1_Click() + + pwmSetMode(PWM_MODE_BAL) + +End + +Public Sub RadioButton2_Click() + + pwmSetMode(PWM_MODE_MS) + +End + +Public Sub rangspin_Change() + + pwmSetRange(rangspin.Value) + spwmslid1.MaxValue = rangspin.Value + +End + +Public Sub divspin_Change() + + pwmSetClock(divspin.Value) + +End + +Public Sub clcspin_Change() + + gpioClockSet(7, clcspin.Value) + +End + +Public Sub CheckBox1_Click() + + Timer1.Enabled = CheckBox1.Value + +End + +Public Sub Button2_Click() + + st = CheckBox1.Value + Timer1.Enabled = False + Shift.Show + CheckBox1.Value = False + +End + +Public Sub Button3_Click() + + st = CheckBox1.Value + Timer1.Enabled = False + I2C.Show + CheckBox1.Value = False + +End + +Public Sub Button4_Click() + + st = CheckBox1.Value + Timer1.Enabled = False + SPI.Show + CheckBox1.Value = False + +End diff --git a/.src/FMain.form b/.src/FMain.form new file mode 100644 index 0000000..7fd97e6 --- /dev/null +++ b/.src/FMain.form @@ -0,0 +1,918 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(17.8571,7.1429,127,80) + Icon = Picture["gpio.png"] + Resizable = False + { Panel1 Panel + MoveScaled(0,1,9,8) + { IN0 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT0 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { !Timer1 #Timer + #MoveScaled(120,73) + #Public = True + Enabled = True + Delay = 100 + } + { Draw0 DrawingArea + MoveScaled(16,1,94.2857,8) + Background = &H000000& + Cached = True + } + { LED0 PictureBox + MoveScaled(11,4,3,3) + Picture = Picture["ledoff.png"] + } + { Panel2 Panel + MoveScaled(112,0,14,10) + { poff0 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup0 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn0 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Panel3 Panel + MoveScaled(16,1,13,8) + { zero0 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus0 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel4 Panel + MoveScaled(32,0,37,9) + { spwmslid0 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon0 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm0 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval0 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel5 Panel + MoveScaled(72,0,40,9) + { stonesl0 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone0 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone0 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval0 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Draw1 DrawingArea + MoveScaled(16,10,94.2857,8) + Background = &H000000& + Cached = True + } + { LED1 PictureBox + MoveScaled(11,13,3,3) + Picture = Picture["ledoff.png"] + } + { Panel6 Panel + MoveScaled(16,10,13,8) + { zero1 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus1 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel7 Panel + MoveScaled(72,9,40,9) + { RadioButton1 RadioButton + MoveScaled(0,2,15,4) + Visible = False + Text = ("Balanced") + } + { RadioButton2 RadioButton + MoveScaled(0,5,15,4) + Visible = False + Text = ("Mark Space") + } + } + { Panel8 Panel + MoveScaled(0,10,9,8) + { IN1 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT1 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel9 Panel + MoveScaled(32,9,38,9) + { spwmslid1 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 1024 + Value = 512 + } + { spwmon1 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm1 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Hard PWM") + } + { pwmval1 TextBox + MoveScaled(32,4,6,3) + Visible = False + Text = ("1024") + ReadOnly = True + } + } + { Panel10 Panel + MoveScaled(112,9,14,10) + { poff1 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup1 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn1 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw2 DrawingArea + MoveScaled(16,19,94.2857,8) + Background = &H000000& + Cached = True + } + { LED2 PictureBox + MoveScaled(11,22,3,3) + Picture = Picture["ledoff.png"] + } + { Panel11 Panel + MoveScaled(16,19,13,8) + { zero2 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus2 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel12 Panel + MoveScaled(72,18,40,9) + { stonesl2 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone2 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone2 Label + MoveScaled(4,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval2 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Panel13 Panel + MoveScaled(0,19,9,8) + { IN2 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT2 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel14 Panel + MoveScaled(32,18,37,9) + { spwmslid2 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon2 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm2 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval2 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel15 Panel + MoveScaled(112,18,14,10) + { poff2 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup2 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn2 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw3 DrawingArea + MoveScaled(16,28,94.2857,8) + Background = &H000000& + Cached = True + } + { LED3 PictureBox + MoveScaled(11,31,3,3) + Picture = Picture["ledoff.png"] + } + { Panel16 Panel + MoveScaled(16,28,13,8) + { zero3 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus3 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel17 Panel + MoveScaled(72,27,40,9) + { stonesl3 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone3 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone3 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval3 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Panel18 Panel + MoveScaled(0,28,9,8) + { IN3 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT3 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel19 Panel + MoveScaled(32,27,37,9) + { spwmslid3 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon3 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm3 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval3 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel20 Panel + MoveScaled(112,27,14,10) + { poff3 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup3 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn3 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw4 DrawingArea + MoveScaled(16,37,94.2857,8) + Background = &H000000& + Cached = True + } + { LED4 PictureBox + MoveScaled(11,40,3,3) + Picture = Picture["ledoff.png"] + } + { Panel21 Panel + MoveScaled(16,37,13,8) + { zero4 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus4 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel22 Panel + MoveScaled(72,36,40,9) + { stonesl4 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone4 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone4 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval4 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Panel23 Panel + MoveScaled(0,37,9,8) + { IN4 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT4 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel24 Panel + MoveScaled(32,36,37,9) + { spwmslid4 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon4 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm4 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval4 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel25 Panel + MoveScaled(112,36,14,10) + { poff4 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup4 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn4 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw5 DrawingArea + MoveScaled(16,46,94.2857,8) + Background = &H000000& + Cached = True + } + { LED5 PictureBox + MoveScaled(11,49,3,3) + Picture = Picture["ledoff.png"] + } + { Panel26 Panel + MoveScaled(16,46,13,8) + { zero5 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus5 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel27 Panel + MoveScaled(72,45,40,9) + { stonesl5 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone5 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone5 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval5 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Panel28 Panel + MoveScaled(0,46,9,8) + { IN5 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT5 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel29 Panel + MoveScaled(32,45,37,9) + { spwmslid5 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon5 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm5 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval5 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel30 Panel + MoveScaled(112,45,14,10) + { poff5 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup5 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn5 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw6 DrawingArea + MoveScaled(16,55,94.2857,8) + Background = &H000000& + Cached = True + } + { LED6 PictureBox + MoveScaled(11,58,3,3) + Picture = Picture["ledoff.png"] + } + { Panel31 Panel + MoveScaled(16,55,13,8) + { zero6 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus6 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel32 Panel + MoveScaled(72,54,40,9) + { stonesl6 Slider + MoveScaled(10,4,20,4) + Visible = False + MaxValue = 5000 + Value = 2500 + } + { softone6 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labeltone6 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software Tone") + } + { stoneval6 TextBox + MoveScaled(32,4,7,3) + Visible = False + Text = ("2500") + ReadOnly = True + } + } + { Panel33 Panel + MoveScaled(0,55,9,8) + { IN6 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT6 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel34 Panel + MoveScaled(32,54,37,9) + { spwmslid6 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon6 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm6 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval6 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel35 Panel + MoveScaled(112,54,14,10) + { poff6 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup6 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn6 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Draw7 DrawingArea + MoveScaled(16,64,94.2857,8) + Background = &H000000& + Cached = True + } + { LED7 PictureBox + MoveScaled(11,67,3,3) + Picture = Picture["ledoff.png"] + } + { Panel36 Panel + MoveScaled(16,64,13,8) + { zero7 RadioButton + MoveScaled(1,1,10,4) + Visible = False + Text = ("Low 0") + Value = True + } + { plus7 RadioButton + MoveScaled(1,4,11,4) + Visible = False + Text = ("High 1") + } + } + { Panel37 Panel + MoveScaled(72,63,40,9) + { softone7 CheckBox + MoveScaled(4,4,14,3) + Visible = False + Text = ("GPIO Clock") + } + } + { Panel38 Panel + MoveScaled(0,64,9,8) + { IN7 RadioButton + MoveScaled(1,1,8,4) + Text = ("IN") + Value = True + } + { OUT7 RadioButton + MoveScaled(1,4,9,4) + Text = ("OUT") + } + } + { Panel39 Panel + MoveScaled(32,63,37,9) + { spwmslid7 Slider + MoveScaled(10,4,20,4) + Visible = False + Value = 50 + } + { spwmon7 CheckBox + MoveScaled(2,4,7,4) + Visible = False + Text = ("On") + } + { Labelpwm7 Label + MoveScaled(2,1,24,3) + Visible = False + Text = ("Software PWM") + } + { pwmval7 TextBox + MoveScaled(32,4,4,3) + Visible = False + Text = ("50") + ReadOnly = True + } + } + { Panel40 Panel + MoveScaled(112,63,14,10) + { poff7 RadioButton + MoveScaled(2,0,24,4) + Text = ("TriState") + } + { pup7 RadioButton + MoveScaled(2,3,24,4) + Text = ("PullUP") + } + { pdwn7 RadioButton + MoveScaled(2,6,24,4) + Text = ("PullDwn") + } + } + { Separator1 Separator + MoveScaled(-4,9,136,1) + } + { Separator2 Separator + MoveScaled(-2,18,138,1) + } + { Separator3 Separator + MoveScaled(-1,27,136,1) + } + { Separator4 Separator + MoveScaled(-1,36,136,1) + } + { Separator5 Separator + MoveScaled(-2,45,136,1) + } + { Separator6 Separator + MoveScaled(-1,54,136,1) + } + { Separator7 Separator + MoveScaled(-3,63,136,1) + } + { Separator8 Separator + MoveScaled(-1,72,136,1) + } + { Separator9 Separator + MoveScaled(0,0,136,1) + } + { SpinBox1 SpinBox + MoveScaled(19,76,8,3) + MinValue = 50 + MaxValue = 500 + Value = 100 + } + { Label1 Label + MoveScaled(12,76,7,3) + Text = ("Speed") + } + { Label2 Label + MoveScaled(12,1,2,3) + Text = ("0") + } + { Label3 Label + MoveScaled(12,10,2,3) + Text = ("1") + } + { Label4 Label + MoveScaled(12,19,2,3) + Text = ("2") + } + { Label5 Label + MoveScaled(12,28,2,3) + Text = ("3") + } + { Label6 Label + MoveScaled(12,37,2,3) + Text = ("4") + } + { Label7 Label + MoveScaled(12,46,2,3) + Text = ("5") + } + { Label8 Label + MoveScaled(12,55,2,3) + Text = ("6") + } + { Label9 Label + MoveScaled(12,64,2,3) + Text = ("7") + } + { Label10 Label + MoveScaled(27,76,4,4) + Text = ("Ms") + } + { Button1 Button + MoveScaled(114,75,10,4) + Text = ("Exit") + } + { range Label + MoveScaled(93,11,7,3) + Visible = False + Text = ("Range") + } + { divisor Label + MoveScaled(93,14,7,3) + Visible = False + Text = ("Divisor") + } + { rangspin SpinBox + MoveScaled(100,11,9,3) + Visible = False + MinValue = 10 + MaxValue = 1024 + Value = 1024 + } + { divspin SpinBox + MoveScaled(100,14,9,3) + Visible = False + MinValue = 1 + MaxValue = 4095 + Value = 1 + } + { clcfreq Label + MoveScaled(91,67,10,3) + Visible = False + Text = ("Frequency") + } + { clcspin SpinBox + MoveScaled(102,67,8,3) + Visible = False + MinValue = 1 + MaxValue = 192 + Value = 100 + } + { !CheckBox1 CheckBox + MoveScaled(1,76,10,3) + #Public = True + Text = ("Enable") + Value = CheckBox.True + } + { Separator10 Separator + MoveScaled(31,72.1429,1,8.5714) + } + { Label11 Label + MoveScaled(2,73,12,2) + Text = ("Analizer") + } + { Separator11 Separator + MoveScaled(110,72.1429,1,8) + } + { Button2 Button + MoveScaled(36,75,16,4) + Text = ("Shift") + } + { Button3 Button + MoveScaled(63,75,16,4) + Text = ("I2C") + } + { Button4 Button + MoveScaled(90,75,16,4) + Text = ("SPI") + } +} diff --git a/.src/I2C.class b/.src/I2C.class new file mode 100644 index 0000000..9bfa30e --- /dev/null +++ b/.src/I2C.class @@ -0,0 +1,769 @@ +' Gambas class file + +Library "/usr/local/lib/libwiringPi" + +Public Extern wiringPiI2CSetup(devId As Integer) As Integer +Public Extern wiringPiI2CRead(fd As Integer) As Integer +Public Extern wiringPiI2CWrite(fd As Integer, data As Integer) As Integer +Public Extern wiringPiI2CWriteReg8(fd As Integer, reg As Integer, data As Integer) As Integer +Public Extern wiringPiI2CWriteReg16(fd As Integer, reg As Integer, data As Integer) As Integer +Public Extern wiringPiI2CReadReg8(fd As Integer, reg As Integer) As Integer +Public Extern wiringPiI2CReadReg16(fd As Integer, reg As Integer) As Integer + +Public fd[4] As Integer +Public data[4] As Integer +Public regdata[4] As Long +Public regnr[4] As Integer + +Public Sub valcheck(data As String, range As String) As Integer + + Select Case range + Case "HEX" + If (Val("&H" & data) = Null) + Return 1 + Endif + Case "Decimal" + If (Val(data) = Null) + Return 1 + Endif + End Select + Return 0 +End + + +Public Sub Button1_Click() + + FMain.Timer1.Enabled = FMain.st + FMain.CheckBox1.Value = FMain.st + Me.Close + +End + +Public Sub Form_Open() + + Shell ("gpio load i2c") + Shell ("gpio i2cdetect") To Result.Text + +End + +Public Sub open0_Click() + + fd[0] = wiringPiI2CSetup(Val("&H" & devnumber0.Text)) + If (fd[0] = -1) + Return + Else + rdd0.Enabled = True + wdd0.Enabled = True + rrr0.Enabled = True + rrw0.Enabled = True + open0.Enabled = False + Endif + +End + +Public Sub choiced0_Click() + Select Case choiced0.Text + Case "HEX" + data0.MaxLength = 2 + data0.Text = Hex$(data[0], 2) + Case "Decimal" + data0.MaxLength = 3 + data0.Text = data[0] + Case "ASCII" + data0.MaxLength = 1 + data0.Text = Chr$(data[0]) + End Select + data0.SetFocus() + +End + +Public Sub data0_KeyRelease() + + If (valcheck(data0.Text, choiced0.Text) = 1) + data0.text = "" + Return + Endif + Select Case choiced0.Text + Case "HEX" + data[0] = Val("&H" & data0.Text) + Case "Decimal" + data[0] = Val(data0.Text) And 255 + Case "ASCII" + data[0] = Asc(data0.Text) + End Select + +End + +Public Sub choicerd0_Click() + + Dim m As Integer = 1 + If (reg160.Value) + m = 2 + Endif + Select Case choicerd0.Text + Case "HEX" + regdata0.MaxLength = 2 * m + regdata0.Text = Hex$(regdata[0], 2 * m) + Case "Decimal" + regdata0.MaxLength = 3 + If (m = 2) Then regdata0.MaxLength = 5 + regdata0.Text = regdata[0] + Case "ASCII" + regdata0.MaxLength = 1 * m + regdata0.Text = Chr$(regdata[0] And 255) + If m = 2 And If regdata[0] > 255 + regdata0.Text = Chr$(regdata[0] / 256) & regdata0.Text + Endif + End Select + regdata0.SetFocus() + +End + +Public Sub regdata0_KeyRelease() + + Dim m As Long = 255 + If (reg160.Value) + m = 65535 + Endif + If (valcheck(regdata0.Text, choicerd0.Text) = 1) + regdata0.text = "" + Return + Endif + Select Case choicerd0.Text + Case "HEX" + regdata[0] = Abs(Val("&H" & regdata0.Text)) + Case "Decimal" + regdata[0] = Val(regdata0.Text) And m + Case "ASCII" + regdata[0] = Asc(regdata0.Text) + If (reg160.Value) And If (Len(regdata0.Text) > 1) + regdata[0] = Asc(Right$(regdata0.Text)) + (regdata[0] * 256) + Endif + + End Select + +End + +Public Sub choicere0_Click() + + Select Case choicere0.Text + Case "HEX" + regnr0.MaxLength = 2 + regnr0.Text = Hex$(regnr[0], 2) + Case "Decimal" + regnr0.MaxLength = 3 + regnr0.Text = regnr[0] + End Select + regdata0.SetFocus() + +End + +Public Sub regnr0_KeyRelease() + + Select Case choicere0.Text + Case "HEX" + regnr[0] = Val("&H" & regnr0.Text) + Case "Decimal" + regnr[0] = Val(regnr0.Text) And 255 + End Select + + +End + +Public Sub reg80_Click() + + regdata[0] = regdata[0] And 255 + choicerd0_Click() + +End + +Public Sub reg160_Click() + + choicerd0_Click() + +End + +Public Sub rdd0_Click() + + Dim inp As Integer + inp = wiringPiI2CRead(fd[0]) + If inp = -1 Then Return + data[0] = inp + choiced0_Click() + +End + +Public Sub wdd0_Click() + + wiringPiI2CWrite(fd[0], data[0]) + +End + + + +Public Sub rrr0_Click() + + Dim inp As Integer + + If (reg160.Value) + inp = wiringPiI2CReadReg16(fd[0], regnr[0]) + Else + inp = wiringPiI2CReadReg8(fd[0], regnr[0]) + Endif + If inp = -1 Then Return + regdata[0] = inp + choicerd0_Click() + +End + +Public Sub rrw0_Click() + + If (reg160.Value) + wiringPiI2CWriteReg16(fd[0], regnr[0], regdata[0]) + Else + wiringPiI2CWriteReg8(fd[0], regnr[0], regdata[0]) + Endif + +End + +Public Sub open1_Click() + + fd[1] = wiringPiI2CSetup(Val("&H" & devnumber1.Text)) + If (fd[1] = -1) + Return + Else + rdd1.Enabled = True + wdd1.Enabled = True + rrr1.Enabled = True + rrw1.Enabled = True + open1.Enabled = False + Endif + +End + +Public Sub choiced1_Click() + Select Case choiced1.Text + Case "HEX" + data1.MaxLength = 2 + data1.Text = Hex$(data[1], 2) + Case "Decimal" + data1.MaxLength = 3 + data1.Text = data[1] + Case "ASCII" + data1.MaxLength = 1 + data1.Text = Chr$(data[1]) + End Select + data1.SetFocus() + +End + +Public Sub data1_KeyRelease() + + If (valcheck(data1.Text, choiced1.Text) = 1) + data1.text = "" + Return + Endif + Select Case choiced1.Text + Case "HEX" + data[1] = Val("&H" & data1.Text) + Case "Decimal" + data[1] = Val(data1.Text) And 255 + Case "ASCII" + data[1] = Asc(data1.Text) + End Select + +End + +Public Sub choicerd1_Click() + + Dim m As Integer = 1 + If (reg161.Value) + m = 2 + Endif + Select Case choicerd1.Text + Case "HEX" + regdata1.MaxLength = 2 * m + regdata1.Text = Hex$(regdata[1], 2 * m) + Case "Decimal" + regdata1.MaxLength = 3 + If (m = 2) Then regdata1.MaxLength = 5 + regdata1.Text = regdata[1] + Case "ASCII" + regdata1.MaxLength = 1 * m + regdata1.Text = Chr$(regdata[1] And 255) + If m = 2 And If regdata[1] > 255 + regdata1.Text = Chr$(regdata[1] / 256) & regdata1.Text + Endif + End Select + regdata1.SetFocus() + +End + +Public Sub regdata1_KeyRelease() + + Dim m As Long = 255 + If (reg161.Value) + m = 65535 + Endif + If (valcheck(regdata1.Text, choicerd1.Text) = 1) + regdata1.text = "" + Return + Endif + Select Case choicerd1.Text + Case "HEX" + regdata[1] = Abs(Val("&H" & regdata1.Text)) + Case "Decimal" + regdata[1] = Val(regdata1.Text) And m + Case "ASCII" + regdata[1] = Asc(regdata1.Text) + If (reg161.Value) And If (Len(regdata1.Text) > 1) + regdata[1] = Asc(Right$(regdata1.Text)) + (regdata[1] * 256) + Endif + + End Select + +End + +Public Sub choicere1_Click() + + Select Case choicere1.Text + Case "HEX" + regnr1.MaxLength = 2 + regnr1.Text = Hex$(regnr[1], 2) + Case "Decimal" + regnr1.MaxLength = 3 + regnr1.Text = regnr[1] + End Select + regdata1.SetFocus() + +End + +Public Sub regnr1_KeyRelease() + + Select Case choicere1.Text + Case "HEX" + regnr[1] = Val("&H" & regnr1.Text) + Case "Decimal" + regnr[1] = Val(regnr1.Text) And 255 + End Select + + +End + +Public Sub reg81_Click() + + regdata[1] = regdata[1] And 255 + choicerd1_Click() + +End + +Public Sub reg161_Click() + + choicerd1_Click() + +End + +Public Sub rdd1_Click() + + Dim inp As Integer + inp = wiringPiI2CRead(fd[1]) + If inp = -1 Then Return + data[1] = inp + choiced1_Click() + +End + +Public Sub wdd1_Click() + + wiringPiI2CWrite(fd[1], data[1]) + +End + + + +Public Sub rrr1_Click() + + Dim inp As Integer + + If (reg161.Value) + inp = wiringPiI2CReadReg16(fd[1], regnr[1]) + Else + inp = wiringPiI2CReadReg8(fd[1], regnr[1]) + Endif + If inp = -1 Then Return + regdata[1] = inp + choicerd1_Click() + +End + +Public Sub rrw1_Click() + + If (reg161.Value) + wiringPiI2CWriteReg16(fd[1], regnr[1], regdata[1]) + Else + wiringPiI2CWriteReg8(fd[1], regnr[1], regdata[1]) + Endif + +End + +Public Sub open2_Click() + + fd[2] = wiringPiI2CSetup(Val("&H" & devnumber2.Text)) + If (fd[2] = -1) + Return + Else + rdd2.Enabled = True + wdd2.Enabled = True + rrr2.Enabled = True + rrw2.Enabled = True + open2.Enabled = False + Endif + +End + +Public Sub choiced2_Click() + Select Case choiced2.Text + Case "HEX" + data2.MaxLength = 2 + data2.Text = Hex$(data[2], 2) + Case "Decimal" + data2.MaxLength = 3 + data2.Text = data[2] + Case "ASCII" + data2.MaxLength = 2 + data2.Text = Chr$(data[2]) + End Select + data2.SetFocus() + +End + +Public Sub data2_KeyRelease() + + If (valcheck(data2.Text, choiced2.Text) = 1) + data2.text = "" + Return + Endif + Select Case choiced2.Text + Case "HEX" + data[2] = Val("&H" & data2.Text) + Case "Decimal" + data[2] = Val(data2.Text) And 255 + Case "ASCII" + data[2] = Asc(data2.Text) + End Select + +End + +Public Sub choicerd2_Click() + + Dim m As Integer = 1 + If (reg162.Value) + m = 2 + Endif + Select Case choicerd2.Text + Case "HEX" + regdata2.MaxLength = 2 * m + regdata2.Text = Hex$(regdata[2], 2 * m) + Case "Decimal" + regdata2.MaxLength = 3 + If (m = 2) Then regdata2.MaxLength = 5 + regdata2.Text = regdata[2] + Case "ASCII" + regdata2.MaxLength = 1 * m + regdata2.Text = Chr$(regdata[2] And 255) + If m = 2 And If regdata[2] > 255 + regdata2.Text = Chr$(regdata[2] / 256) & regdata2.Text + Endif + End Select + regdata2.SetFocus() + +End + +Public Sub regdata2_KeyRelease() + + Dim m As Long = 255 + If (reg162.Value) + m = 65535 + Endif + If (valcheck(regdata2.Text, choicerd2.Text) = 1) + regdata2.text = "" + Return + Endif + Select Case choicerd2.Text + Case "HEX" + regdata[2] = Abs(Val("&H" & regdata2.Text)) + Case "Decimal" + regdata[2] = Val(regdata2.Text) And m + Case "ASCII" + regdata[2] = Asc(regdata2.Text) + If (reg162.Value) And If (Len(regdata2.Text) > 1) + regdata[2] = Asc(Right$(regdata2.Text)) + (regdata[2] * 256) + Endif + + End Select + +End + +Public Sub choicere2_Click() + + Select Case choicere2.Text + Case "HEX" + regnr2.MaxLength = 2 + regnr2.Text = Hex$(regnr[2], 2) + Case "Decimal" + regnr2.MaxLength = 3 + regnr2.Text = regnr[2] + End Select + regdata2.SetFocus() + +End + +Public Sub regnr2_KeyRelease() + + Select Case choicere2.Text + Case "HEX" + regnr[2] = Val("&H" & regnr2.Text) + Case "Decimal" + regnr[2] = Val(regnr2.Text) And 255 + End Select + + +End + +Public Sub reg82_Click() + + regdata[2] = regdata[2] And 255 + choicerd2_Click() + +End + +Public Sub reg162_Click() + + choicerd2_Click() + +End + +Public Sub rdd2_Click() + + Dim inp As Integer + inp = wiringPiI2CRead(fd[2]) + If inp = -1 Then Return + data[2] = inp + choiced2_Click() + +End + +Public Sub wdd2_Click() + + wiringPiI2CWrite(fd[2], data[2]) + +End + + + +Public Sub rrr2_Click() + + Dim inp As Integer + + If (reg162.Value) + inp = wiringPiI2CReadReg16(fd[2], regnr[2]) + Else + inp = wiringPiI2CReadReg8(fd[2], regnr[2]) + Endif + If inp = -1 Then Return + regdata[2] = inp + choicerd2_Click() + +End + +Public Sub rrw2_Click() + + If (reg162.Value) + wiringPiI2CWriteReg16(fd[2], regnr[2], regdata[2]) + Else + wiringPiI2CWriteReg8(fd[2], regnr[2], regdata[2]) + Endif + +End + +Public Sub open3_Click() + + fd[3] = wiringPiI2CSetup(Val("&H" & devnumber3.Text)) + If (fd[3] = -1) + Return + Else + rdd3.Enabled = True + wdd3.Enabled = True + rrr3.Enabled = True + rrw3.Enabled = True + open3.Enabled = False + Endif + +End + +Public Sub choiced3_Click() + Select Case choiced3.Text + Case "HEX" + data3.MaxLength = 2 + data3.Text = Hex$(data[3], 2) + Case "Decimal" + data3.MaxLength = 3 + data3.Text = data[3] + Case "ASCII" + data3.MaxLength = 2 + data3.Text = Chr$(data[3]) + End Select + data3.SetFocus() + +End + +Public Sub data3_KeyRelease() + + If (valcheck(data3.Text, choiced3.Text) = 1) + data3.text = "" + Return + Endif + Select Case choiced3.Text + Case "HEX" + data[3] = Val("&H" & data3.Text) + Case "Decimal" + data[3] = Val(data3.Text) And 255 + Case "ASCII" + data[3] = Asc(data3.Text) + End Select + +End + +Public Sub choicerd3_Click() + + Dim m As Integer = 1 + If (reg163.Value) + m = 2 + Endif + Select Case choicerd3.Text + Case "HEX" + regdata3.MaxLength = 2 * m + regdata3.Text = Hex$(regdata[3], 2 * m) + Case "Decimal" + regdata3.MaxLength = 3 + If (m = 3) Then regdata3.MaxLength = 5 + regdata3.Text = regdata[3] + Case "ASCII" + regdata3.MaxLength = 1 * m + regdata3.Text = Chr$(regdata[3] And 255) + If m = 2 And If regdata[3] > 255 + regdata3.Text = Chr$(regdata[3] / 256) & regdata3.Text + Endif + End Select + regdata3.SetFocus() + +End + +Public Sub regdata3_KeyRelease() + + Dim m As Long = 255 + If (reg163.Value) + m = 65535 + Endif + If (valcheck(regdata3.Text, choicerd3.Text) = 1) + regdata3.text = "" + Return + Endif + Select Case choicerd3.Text + Case "HEX" + regdata[3] = Abs(Val("&H" & regdata3.Text)) + Case "Decimal" + regdata[3] = Val(regdata3.Text) And m + Case "ASCII" + regdata[3] = Asc(regdata3.Text) + If (reg163.Value) And If (Len(regdata3.Text) > 1) + regdata[3] = Asc(Right$(regdata3.Text)) + (regdata[3] * 256) + Endif + + End Select + +End + +Public Sub choicere3_Click() + + Select Case choicere3.Text + Case "HEX" + regnr3.MaxLength = 2 + regnr3.Text = Hex$(regnr[3], 2) + Case "Decimal" + regnr3.MaxLength = 3 + regnr3.Text = regnr[3] + End Select + regdata3.SetFocus() + +End + +Public Sub regnr3_KeyRelease() + + Select Case choicere3.Text + Case "HEX" + regnr[3] = Val("&H" & regnr3.Text) + Case "Decimal" + regnr[3] = Val(regnr3.Text) And 255 + End Select + + +End + +Public Sub reg83_Click() + + regdata[3] = regdata[3] And 255 + choicerd3_Click() + +End + +Public Sub reg163_Click() + + choicerd3_Click() + +End + +Public Sub rdd3_Click() + + Dim inp As Integer + inp = wiringPiI2CRead(fd[3]) + If inp = -1 Then Return + data[3] = inp + choiced3_Click() + +End + +Public Sub wdd3_Click() + + wiringPiI2CWrite(fd[3], data[3]) + +End + + + +Public Sub rrr3_Click() + + Dim inp As Integer + + If (reg163.Value) + inp = wiringPiI2CReadReg16(fd[3], regnr[3]) + Else + inp = wiringPiI2CReadReg8(fd[3], regnr[3]) + Endif + If inp = -1 Then Return + regdata[3] = inp + choicerd3_Click() + +End + +Public Sub rrw3_Click() + + If (reg163.Value) + wiringPiI2CWriteReg16(fd[3], regnr[3], regdata[3]) + Else + wiringPiI2CWriteReg8(fd[3], regnr[3], regdata[3]) + Endif + +End + + diff --git a/.src/I2C.form b/.src/I2C.form new file mode 100644 index 0000000..531c2c6 --- /dev/null +++ b/.src/I2C.form @@ -0,0 +1,427 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(17.8571,15.1429,127,64) + Text = ("I2C Controll") + Icon = Picture["gpio.png"] + { Button1 Button + MoveScaled(109,58,16,4) + Text = ("Close") + } + { Result TextArea + MoveScaled(4,38,63,24) + Font = Font["Monospace"] + ReadOnly = True + } + { open0 Button + MoveScaled(1,5,10,3) + Text = ("Open") + } + { Label1 Label + MoveScaled(12,5,8,3) + Text = ("Device") + } + { devnumber0 TextBox + MoveScaled(19,5,5,3) + Text = ("20") + } + { Label2 Label + MoveScaled(5,35,24,3) + Text = ("Devices Connected ;") + } + { rdd0 Button + MoveScaled(29,3,11,3) + Enabled = False + Text = ("Read") + } + { wdd0 Button + MoveScaled(29,6,11,3) + Enabled = False + Text = ("Write") + } + { Label3 Label + MoveScaled(41,5,7,3) + Text = ("Data") + } + { Label4 Label + MoveScaled(24,5,2,3) + Text = ("H") + } + { choiced0 ComboBox + MoveScaled(53,5,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { data0 TextBox + MoveScaled(46,5,7,3) + Text = ("00") + MaxLength = 2 + } + { rrr0 Button + MoveScaled(70,3,11,3) + Enabled = False + Text = ("Read") + } + { Label5 Label + MoveScaled(82,6,7,3) + Text = ("Data") + } + { choicerd0 ComboBox + MoveScaled(97,6,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { regdata0 TextBox + MoveScaled(90,6,7,3) + Text = ("00") + MaxLength = 2 + } + { regnr0 TextBox + MoveScaled(90,3,7,3) + Text = ("00") + MaxLength = 2 + } + { choicere0 ComboBox + MoveScaled(97,3,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal")] + Text = ("HEX") + } + { Label6 Label + MoveScaled(82,3,8,3) + Text = ("Register") + } + { Label7 Label + MoveScaled(122,6,4,3) + Text = ("Bits") + } + { open1 Button + MoveScaled(1,13,10,3) + Text = ("Open") + } + { Label8 Label + MoveScaled(12,13,8,3) + Text = ("Device") + } + { devnumber1 TextBox + MoveScaled(19,13,5,3) + Text = ("25") + } + { rdd1 Button + MoveScaled(29,11,11,3) + Enabled = False + Text = ("Read") + } + { wdd1 Button + MoveScaled(29,14,11,3) + Enabled = False + Text = ("Write") + } + { Label9 Label + MoveScaled(41,13,7,3) + Text = ("Data") + } + { Label10 Label + MoveScaled(24,13,2,3) + Text = ("H") + } + { choiced1 ComboBox + MoveScaled(53,13,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { data1 TextBox + MoveScaled(46,13,7,3) + Text = ("00") + MaxLength = 2 + } + { rrr1 Button + MoveScaled(70,11,11,3) + Enabled = False + Text = ("Read") + } + { rrw1 Button + MoveScaled(70,14,11,3) + Enabled = False + Text = ("Write") + } + { Label11 Label + MoveScaled(82,14,7,3) + Text = ("Data") + } + { choicerd1 ComboBox + MoveScaled(97,14,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { regdata1 TextBox + MoveScaled(90,14,7,3) + Text = ("00") + MaxLength = 2 + } + { regnr1 TextBox + MoveScaled(90,11,7,3) + Text = ("00") + MaxLength = 2 + } + { choicere1 ComboBox + MoveScaled(97,11,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal")] + Text = ("HEX") + } + { Label12 Label + MoveScaled(82,11,8,3) + Text = ("Register") + } + { Label13 Label + MoveScaled(122,14,4,3) + Text = ("Bits") + } + { open2 Button + MoveScaled(1,21,10,3) + Text = ("Open") + } + { Label14 Label + MoveScaled(12,21,8,3) + Text = ("Device") + } + { devnumber2 TextBox + MoveScaled(19,21,5,3) + Text = ("30") + } + { rdd2 Button + MoveScaled(29,19,11,3) + Enabled = False + Text = ("Read") + } + { wdd2 Button + MoveScaled(29,22,11,3) + Enabled = False + Text = ("Write") + } + { Label15 Label + MoveScaled(41,21,7,3) + Text = ("Data") + } + { Label16 Label + MoveScaled(24,21,2,3) + Text = ("H") + } + { choiced2 ComboBox + MoveScaled(53,21,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { data2 TextBox + MoveScaled(46,21,7,3) + Text = ("00") + MaxLength = 2 + } + { rrr2 Button + MoveScaled(70,19,11,3) + Enabled = False + Text = ("Read") + } + { rrw2 Button + MoveScaled(70,22,11,3) + Enabled = False + Text = ("Write") + } + { Label17 Label + MoveScaled(82,22,7,3) + Text = ("Data") + } + { choicerd2 ComboBox + MoveScaled(97,22,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { regdata2 TextBox + MoveScaled(90,22,7,3) + Text = ("00") + MaxLength = 2 + } + { regnr2 TextBox + MoveScaled(90,19,7,3) + Text = ("00") + MaxLength = 2 + } + { choicere2 ComboBox + MoveScaled(97,19,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal")] + Text = ("HEX") + } + { Label18 Label + MoveScaled(82,19,8,3) + Text = ("Register") + } + { Label19 Label + MoveScaled(122,22,4,3) + Text = ("Bits") + } + { open3 Button + MoveScaled(1,29,10,3) + Text = ("Open") + } + { Label20 Label + MoveScaled(12,29,8,3) + Text = ("Device") + } + { devnumber3 TextBox + MoveScaled(19,29,5,3) + Text = ("35") + } + { rdd3 Button + MoveScaled(29,27,11,3) + Enabled = False + Text = ("Read") + } + { wdd3 Button + MoveScaled(29,30,11,3) + Enabled = False + Text = ("Write") + } + { Label21 Label + MoveScaled(41,29,7,3) + Text = ("Data") + } + { Label22 Label + MoveScaled(24,29,2,3) + Text = ("H") + } + { choiced3 ComboBox + MoveScaled(53,29,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { data3 TextBox + MoveScaled(46,29,7,3) + Text = ("00") + MaxLength = 2 + } + { rrr3 Button + MoveScaled(70,27,11,3) + Enabled = False + Text = ("Read") + } + { rrw3 Button + MoveScaled(70,30,11,3) + Enabled = False + Text = ("Write") + } + { Label23 Label + MoveScaled(82,30,7,3) + Text = ("Data") + } + { choicerd3 ComboBox + MoveScaled(97,30,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { regdata3 TextBox + MoveScaled(90,30,7,3) + Text = ("00") + MaxLength = 2 + } + { regnr3 TextBox + MoveScaled(90,27,7,3) + Text = ("00") + MaxLength = 2 + } + { choicere3 ComboBox + MoveScaled(97,27,13,3) + ReadOnly = True + List = [("HEX"), ("Decimal")] + Text = ("HEX") + } + { Label24 Label + MoveScaled(82,27,8,3) + Text = ("Register") + } + { Label25 Label + MoveScaled(122,30,4,3) + Text = ("Bits") + } + { Panel2 Panel + MoveScaled(111,14,12,4) + { reg161 RadioButton + MoveScaled(5,0,6,3) + Text = ("16") + } + { reg81 RadioButton + MoveScaled(0,0,5,3) + Text = ("8") + Value = True + } + } + { Panel3 Panel + MoveScaled(111,22,12,4) + { reg162 RadioButton + MoveScaled(5,0,6,3) + Text = ("16") + } + { reg82 RadioButton + MoveScaled(0,0,5,3) + Text = ("8") + Value = True + } + } + { Panel4 Panel + MoveScaled(111,30,12,4) + { reg163 RadioButton + MoveScaled(5,0,6,3) + Text = ("16") + } + { reg83 RadioButton + MoveScaled(0,0,5,3) + Text = ("8") + Value = True + } + } + { rrw0 Button + MoveScaled(70,6,11,3) + Enabled = False + Text = ("Write") + } + { Panel1 Panel + MoveScaled(111,6,12,4) + { reg160 RadioButton + MoveScaled(5,0,6,3) + Text = ("16") + } + { reg80 RadioButton + MoveScaled(0,0,5,3) + Text = ("8") + Value = True + } + } + { PictureBox1 PictureBox + MoveScaled(74,36,29,28) + Picture = Picture["i2c.png"] + } + { Separator1 Separator + MoveScaled(-1,32,129,4) + } + { Separator2 Separator + MoveScaled(-1,24,129,4) + } + { Separator3 Separator + MoveScaled(-1,16,129,4) + } + { Separator4 Separator + MoveScaled(-1,8,129,4) + } + { Separator5 Separator + MoveScaled(-1,0,129,4) + } +} diff --git a/.src/SPI.class b/.src/SPI.class new file mode 100644 index 0000000..f05d70d --- /dev/null +++ b/.src/SPI.class @@ -0,0 +1,77 @@ +' Gambas class file + +Library "/usr/local/lib/libwiringPi" + +Public Extern wiringPiSPISetup(channel As Integer, speed As Integer) As Integer +Public Extern wiringPiSPIDataRW(channel As Integer, data As Pointer, leng As Integer) As Integer + +Public buf As Pointer +Public fd As Integer + +Public Sub Button1_Click() + + FMain.Timer1.Enabled = FMain.st + FMain.CheckBox1.Value = FMain.st + Free(buf) + Me.Close + +End + +Public Sub Form_Open() + + Shell ("gpio load spi") + buf = Alloc(4096) + put_hex() + +End + +Public Sub put_hex() + + Dim p As Integer + Dim bb As Stream + output.text = "" + If ish.text = "ASCII" + bb = Memory buf For Read + output.text = Read #bb, leng.Value + Else + For p = 0 To leng.Value + If (p Mod 16) = 0 + output.text = output.text & "\n " + Else + output.text = output.text & "-" + Endif + output.text = output.text & Hex$(Byte@(buf + p), 2) + Next + Endif + +End + +Public Sub Button2_Click() + + fd = wiringPiSPISetup(setupchan.value, speed.value) + +End + +Public Sub Button3_Click() + + wiringPiSPIDataRW(rwchan.value, buf, leng.value) + put_hex() + +End + +Public Sub Button4_Click() + + Dim bb As Stream + If Dialog.OpenFile() Then Return + bb = Memory buf For Write + Write #bb, File.Load(Dialog.Path) + leng.Value = Stat(Dialog.Path).Size + put_hex() + +End + +Public Sub ish_Click() + + put_hex() + +End diff --git a/.src/SPI.form b/.src/SPI.form new file mode 100644 index 0000000..93a7074 --- /dev/null +++ b/.src/SPI.form @@ -0,0 +1,73 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(46.8571,14.1429,69,66) + Text = ("SPI Controll") + Icon = Picture["gpio.png"] + { Button1 Button + MoveScaled(48,59,16,4) + Text = ("Close") + } + { output TextArea + MoveScaled(5,18,59,40) + Font = Font["Monospace"] + } + { Button2 Button + MoveScaled(6,2,11,4) + Text = ("Setup") + } + { Label1 Label + MoveScaled(6,14,13,3) + Text = ("Buffer Size") + } + { leng SpinBox + MoveScaled(19,14,9,3) + MaxValue = 4096 + Value = 255 + } + { Label2 Label + MoveScaled(21,3,9,3) + Text = ("Channel") + } + { setupchan SpinBox + MoveScaled(30,3,5,3) + MaxValue = 1 + } + { Label3 Label + MoveScaled(38,3,6,3) + Text = ("Speed") + } + { speed SpinBox + MoveScaled(46,3,17,3) + MinValue = 500000 + MaxValue = 32000000 + Step = 100000 + Value = 10000000 + } + { Button3 Button + MoveScaled(6,8,16,4) + Text = ("Write / Read") + } + { Label4 Label + MoveScaled(23,9,9,3) + Text = ("Channel") + } + { rwchan SpinBox + MoveScaled(32,9,5,3) + MaxValue = 1 + } + { Button4 Button + MoveScaled(5,59,16,4) + Text = ("Load File") + } + { ish ComboBox + MoveScaled(49,14,14,3) + ReadOnly = True + List = [("HEX"), ("ASCII")] + Text = ("HEX") + } + { Label5 Label + MoveScaled(38,14,10,3) + Text = ("Dsplay as") + } +} diff --git a/.src/Shift.class b/.src/Shift.class new file mode 100644 index 0000000..29bf6df --- /dev/null +++ b/.src/Shift.class @@ -0,0 +1,93 @@ +' Gambas class file + +Library "/usr/local/lib/libwiringPi" + +Public Extern shiftIn(dPin As Integer, cPin As Integer, order As Integer) As Integer +Public Extern shiftOut(dPin As Integer, cPin As Integer, order As Integer, value As Integer) +Public Extern pinMode(pin As Integer, pud As Integer) + +Public Const LSBFIRST As Integer = 0 +Public Const MSBFIRST As Integer = 1 +Public Const PIN_OUTPUT As Integer = 1 +Public Const PIN_INPUT As Integer = 0 + +Public data As Integer = 0 + +Public Sub Button4_Click() + + FMain.Timer1.Enabled = FMain.st + FMain.CheckBox1.Value = FMain.st + Me.Close + +End + +Public Sub Button1_Click() + + Dim i, ord As Integer + Dim fin$ As String + pinMode(datapinin.Value, PIN_INPUT) + pinMode(clockpinin.Value, PIN_OUTPUT) + If (lsbin.Value) + ord = LSBFIRST + Else + ord = MSBFIRST + Endif + i = shiftIn(datapinin.Value, clockpinin.Value, ord) + fin$ = Hex$(i, 2) + fin$ = fin$ & " - " + fin$ = fin$ & Str$(i) + fin$ = fin$ & " - " + fin$ = fin$ & Chr$(i) + result.text = fin$ + pinMode(datapinin.Value, FMain.port8[datapinin.Value]) + pinMode(clockpinin.Value, FMain.port8[clockpinin.Value]) + +End + +Public Sub Button2_Click() + Dim i, ord As Integer + pinMode(datapinout.Value, PIN_OUTPUT) + pinMode(clockpinout.Value, PIN_OUTPUT) + + If (lsbout.Value) + ord = LSBFIRST + Else + ord = MSBFIRST + Endif + shiftOut(datapinout.Value, clockpinout.Value, ord, data) + pinMode(datapinout.Value, FMain.port8[datapinout.Value]) + pinMode(clockpinout.Value, FMain.port8[clockpinout.Value]) + +End + +Public Sub senddata_KeyRelease() + + If (I2C.valcheck(senddata.Text, choice.Text) = 1) + senddata.text = "" + Return + Endif + Select Case choice.Text + Case "HEX" + data = Val("&H" & senddata.Text) + Case "Decimal" + data = Val(senddata.Text) And 255 + Case "ASCII" + data = Asc(senddata.Text) + End Select +End + +Public Sub choice_Click() + + Select Case choice.Text + Case "HEX" + senddata.MaxLength = 2 + senddata.Text = Hex$(data, 2) + Case "Decimal" + senddata.MaxLength = 3 + senddata.Text = data + Case "ASCII" + senddata.MaxLength = 1 + senddata.Text = Chr(data) + End Select + senddata.SetFocus() +End diff --git a/.src/Shift.form b/.src/Shift.form new file mode 100644 index 0000000..21d1b9c --- /dev/null +++ b/.src/Shift.form @@ -0,0 +1,101 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(38.8571,29.1429,83,38) + Text = ("Shift Controll") + Icon = Picture["gpio.png"] + { Panel2 Panel + MoveScaled(1,19,80,11) + } + { Panel1 Panel + MoveScaled(1,5,80,11) + } + { Button1 Button + MoveScaled(4,9,16,4) + Text = ("Shift IN") + } + { clockpinin SpinBox + MoveScaled(32,8,7,3) + MaxValue = 7 + Value = 2 + } + { datapinin SpinBox + MoveScaled(32,11,7,3) + MaxValue = 7 + Value = 3 + } + { Label1 Label + MoveScaled(23,8,9,3) + Text = ("Clock PIN") + } + { Label2 Label + MoveScaled(23,11,9,3) + Text = ("Data PIN") + } + { result TextBox + MoveScaled(59,9,15,4) + Text = ("00 - 0 - ") + ReadOnly = True + } + { Button2 Button + MoveScaled(4,23,16,4) + Text = ("Shift OUT") + } + { clockpinout SpinBox + MoveScaled(32,22,7,3) + MaxValue = 7 + Value = 4 + } + { datapinout SpinBox + MoveScaled(32,25,7,3) + MaxValue = 7 + Value = 5 + } + { Label3 Label + MoveScaled(23,22,9,3) + Text = ("Clock PIN") + } + { Label4 Label + MoveScaled(23,25,9,3) + Text = ("Data PIN") + } + { senddata TextBox + MoveScaled(59,23,7,4) + Text = ("00") + MaxLength = 2 + } + { Panel3 Panel + MoveScaled(44,8,13,7) + { msbin RadioButton + MoveScaled(0,3,12,3) + Text = ("MSB First") + } + { lsbin RadioButton + MoveScaled(0,0,12,3) + Text = ("LSB First") + Value = True + } + } + { Panel4 Panel + MoveScaled(44,22,13,7) + { lsbout RadioButton + MoveScaled(0,0,12,3) + Text = ("LSB First") + Value = True + } + { msbout RadioButton + MoveScaled(0,3,12,3) + Text = ("MSB First") + } + } + { choice ComboBox + MoveScaled(66,23,13,4) + ReadOnly = True + List = [("HEX"), ("Decimal"), ("ASCII")] + Text = ("HEX") + } + { Button4 Button + MoveScaled(64,32,16,4) + Text = ("Close") + } +} diff --git a/.startup b/.startup new file mode 100644 index 0000000..e9bcf27 --- /dev/null +++ b/.startup @@ -0,0 +1,10 @@ +FMain +GPIO Controll +0 +0 +0.0.219 + +gb.image +gb.gui +gb.form + diff --git a/GPIO_Controll b/GPIO_Controll new file mode 100644 index 0000000000000000000000000000000000000000..3192312b620d740a2c047152678c7a55b2e2186a GIT binary patch literal 96010 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 literal 0 HcmV?d00001 diff --git a/gpio.png b/gpio.png new file mode 100644 index 0000000000000000000000000000000000000000..3690cc33d1608df06985da3b6275ec55399d93be GIT binary patch literal 2625 zcmV-H3cmG;P)}yRQBlG@F%9xIz0uioACbz?CXc& zUUMxlJOa2S5m+u#TC#YX2w_SAVF<+h&DDIDUqSY8yys*66PHP0t(fI z7TPcUMx7l!g7AYI(Oa#dUar!V0hLP31sycsnL<1@i|f~{19sdE*!=>I2gTilwwt8z zErnuY<;X4oxVW!`5CSQ0tHt-xDRuIp`%&#q!0I0WYW;{K165@pRuZA1keY-?>t-q- z?HH*S(aQislPP9rVib3N356|NfchGtLJ3dMQ76F#1mcP*=te+iUX6b3%P?0=qfah} zpLU^Sh+>+etE?JiHye2^b5f&Nt1PzXgdKxH9AP< zCNaHhmvSXR!7O35TtK58V%{zSg=!Y6ER0KcdP)9CD8hJ8|CNrI1|S)JAz`vb7MQ+) z#6!1Oh8#T#%Sd1}w5@%wsm{V2YGgbtMDUsST3SLW>Y_5&hfX|(aIOnGwGg`@T&5^# z^Z#)JGn%B-3`4wt^Zmm#s^A(vFmJ$bH)*dI#*9RDp3(Cg@Vg;Imw?`7n#YeTLnwNC zW(tzsaG@0~`g=ZZBWf$me{wVGkNg>{kNykJp6_B{yo)xgy7$>9VLtIotbg=rOm6=s zK^eH=fqM~&2n$V#!p|PU+9T75pZp1|ZQIaJ6WDBPDRbUXNsQ$51dLt=VEoWQc-%N8 z$p}`i6-7u3KyckAEPwbr2!8P>s(wE|qT;}hsS`wAMegF!N6z$ml?g-nVR<$4VXMaN`gs)V#kSPKUK zW+fNZJbU#VdhdG>a>IvFXSHM(mRl)8r3^qZs%6g}qmFtp!0f;P20s5;B!4Uvbqx z|AFY0P zquWBbY6RZu8->M;!AAkn@l80qj@ zen*E@oaXFx?hWqz+R+^R!8-T~g*arDu2U$;UV&Rd zW{#Aq4W$1=4Lv27lv0aOXwW7(#pNa@1+OV=tm<@eYU@q7_OTb3GdEuwE8U9*0_LX8 zjrytoZ|-?m4IMeai8My&Q!UMW`jMK!1TNbslj=-Mlcm44a@rJ3i)j%eA3vk?EbNbc z9rdq#U!;6xF3O3BNR4{2e%W9g`dC=z%%pnv2lu1UorI%A=85(`&V=QXq2m$&2`-O} zBXT)z1xYp`IU_?@_U*?J^js}mmfa#QGB3Rm`deL$Cg1WA2t7AWsPOkMQl2NX2`C#@ z8D?Tx+Vs-PmF8u@Lh3)~Eu^&})K;v4`H`KX!#S~* zfD`Qb`EgY|If`y`5{7M|T&cieCm_x9oewFw=ZR~>ah!}3^cWY-c35}hh^y8jtt{g} z-6tHUqPIlCX=rgO&x9{SljAq}qMH3M%@&3TF0fffod4xQ7ju)dkOg*0v7T+FZ-rdl zB0oX9(SnM6JsOi~dpM9*K-?(VVb-qF;K7C+Lmpg;mW3-_Mo6*X!>hsf%1GG5c25;m zwpXdYkKVdV#il*h0P1cTSuVp4;;xVOY!iY261$HQT}9oeSlOIA$se5HVT=C*Ka1lF3@e{aZ`t@!{&MNgjz}gbPe&FCi%e7lMg{~ZbF5;5fV%iwwVeK($X_kmS@(8 z!i6HZ^1(#E8XHx!ZyaDTE}+aoA|mM|EJA}?E^S-{uz1{m8o@&RQ?A^!Y`?X*5;9Ddy5DHx?H!5zv*=b_GW+ zeWw$p&mQ*HJCODai>1@CK4e;&T^N?Mc~-R!945~@ms=9@ascvu9!?h5>!)McWJ?}f jDfI)l-Nu7%J@ex~lV|q9z?wjE00000NkvXXu0mjf(D&Yo literal 0 HcmV?d00001 diff --git a/i2c.png b/i2c.png new file mode 100644 index 0000000000000000000000000000000000000000..c274aeea46982ccf5c1df6c2aa6cdc19a6315840 GIT binary patch literal 6233 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 ArT_o{ literal 0 HcmV?d00001 diff --git a/ledoff.png b/ledoff.png new file mode 100644 index 0000000000000000000000000000000000000000..258c7e4bcabdc07d4efc8e11f5ccec17127cb483 GIT binary patch literal 956 zcmV;t14I0YP)4000SaNLh0L01FWS01FWTe`H^g00004XF*Lt006O%3;baP0009^NklY!O5PkhIvx|cx3LqdEJp)JbHL(!ACb%<<`O?j?YfuQi5|1)(Gr;LH*{o$byY^I7%6*^6|y{-AdQ( zdE&jVmv`>C9!|%{sQF!ai;C?WH#=)*(L+Vlj%yYRB)`i4Y>fWF`ua1ijB)K5- zT&-<~WX%(O4){PRS|Mf042z(@Tt8&A;ycPqr-wLdMx^OWF{Rp{MommBq1_%NM#Ty0x}YU9<*$ZS>)|Xm`bUL>7`1 zAe18!nda6#!BR`f9&Ud3G?+xGZLx=EMeXRB*mH&mw4g)XGzdzcMT3h-$s*~{xJOhu z%HVYGax{ZL3+M!uswYKD8rqfhI8|E;9WV5d+dyrJJaUbcUDlx_82-Af#S<+i@=B+t z2A&TuU5M?%=s^)T^JC`#)7c6a`|O)=_G?iXQ|-{53|-91ghfH~`gTIUwWOK=BFfr9 zZ6Z2X0^*)V3;ywL{~w>+?3kU0qShyIbIXDwTIMvhv_>jkytq83`K52}Y!e7+TyZQE zUyqrY=BvNdXA|{aprJX1;z1^4($_p4p6dEBFi)f_`1|YErZzS9ILUd08XRWn9QfYm z&L&Cb5c0Jp=241xF+4J}v&`nNqN~a+qJFb(deli*DQYM!Lt(AzMh&$wnERGFV`HCx za@+i}zA54}Zt(6~tE)1gdg_4lM~9?R2y+@9gnyecb|d0nhr{a9`|#(R-|l2-1`DCV zH@&M^AyP}!dFmKNIVR1w^yI!?Vaaa)IXt-hKAeAk+Sm|@0gLJ}7RW9YP3u@;pGs0~ eY!44U+5aES1)5U1-Dr&f0000=r5PyR{6yNk!`Umt) zUo3)PUn+`^N)cPggP}xIO_)rQNhWijbK5u9nV`is;(;}D*n3^RZ>?_~hW~j!s4ZQ^ zD7g`)x)vMUZI}3)w+@b*|K-n4JA7#>sJ!duy1RjbN`|O750#*VkyZF5>LNl8snNLI z?LQXpJ$mr%g=gKqj!;$(Gcu3b+pl7JVGcuP;3Acw~7J7{kn!kRyv74oC+yZw(( zMR;%dlG_l#bUMHjZ(M-{howY0FAqowVF5+OjAn#{p}E_{uNzH#t)s2)_IIDoa)`f^ z-93NFg(jgS1I(_}P#T2rwL;MgP{Kvh+DqNl|;*P?P z8RId+^)t`M``lo%DpBM>AQTE!ANjNM;OCx%TwH{lUjWWjz$H1*aEhZL#IO$=b2!Ve z(#qkU7r#D6ct7YtCoxefK@!S>XOSxxz-G%}%hT{Ep{rEEi~*al)Y)S~8X(^F#;MWM!E7l_1E0irYwWC>XtA}zr77+5<+ zzDIp!3`HyP+S~&8byL035D9X=7;8v62SJVJ{S@Xf1Pfyb)dx%4;JN|05%^#P+oJo> zfTs>VwM(Wzc@)Bng{xU>A8N;vRFnqm#88bUM0FcXS~%GQOA?6fL!>(m=;jef={N}$ z4}~51Y~2ik=QzQ((4;#$jp(OOn%h03M1*|QC3;oJNJH;+VCs9Y2SeDd8*388N^*rj z`S8Bc$?D6V+>Qx)KJZ|uhmL&MNRbnR`?G$G$bZYmdYkXpZdj83zae=BQR6~ZI9#2t-;AI zmrQ^o#xXo7xm4HPFmMuV5zx9A#>WE^F53)@w;{8vP@JJd_V3X1671{;xW2W)9{bvSSS=m(G^XFGETVil zMJ177P9c}eXtFWo5f#c2ZEa!J|!Z)v4CfoJ>)RJ8$VmbSQx mo83(+5Wn|RH~IY0xW54HO!0k^SO9(i0000