BBC BASIC
« Battery State »

Welcome Guest. Please Login or Register.
Mar 31st, 2018, 10:41pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
We apologize Conforums does not have any export functions to migrate data.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

Thank you Conforums members.
Cross-platform BBC BASIC (Windows, Linux x86, Mac OS-X, Android, iOS, Raspberry Pi)
BBC BASIC Resources
BBC BASIC Help Documentation
BBC BASIC for Windows Home Page
BBC BASIC Programmers' Reference
BBC BASIC Beginners' Tutorial
BBC BASIC for SDL 2.0 Home Page
BBC BASIC Discussion Group

« Previous Topic | Next Topic »
Pages: 1 2  Notify Send Topic Print
 hotthread  Author  Topic: Battery State  (Read 224 times)
roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Battery State
« Thread started on: Mar 17th, 2018, 6:48pm »

Hi All

I've been trying to make an Batter state app. That would tell you if the battery is charging, how full the battery is in present and so on.

As a starting point I looked at this site:

https://wiki.libsdl.org/SDL_GetPowerInfo?highlight=%28battery%29
" target="_blank">
https://wiki.libsdl.org/SDL_GetPowerInfo?highlight=%28battery%29

Please use second link

and tried to convert it.

Needles to say it doesn't work. It's hard to know where to start.

Anyway any ideas would be appreciated

Regards Roy

Code:
   10 mode 6
   20
   30 rem Batter State
   40 secs% = 0 : pct% = 0
   50 if sys "SDL_GetPowerInfo",secs%, pct% = sys "SDL_POWERSTATE_ON_BATTERY" then
   90   print"Battery is draining: "
  100   if (secs% =-1) then
  110     print"unknown time left"
  120   endif
  130 else
  140   print"seconds left", secs%
  150 endif
  160
  170 if (pct% = -1) then
  180   print"unknown percentage left"
  190 else
  200   print" percent left", pct%
  210 endif
  220
  230
  240 rem int secs, pct;
  250 rem if (SDL_GetPowerInfo(&secs, &pct) == SDL_POWERSTATE_ON_BATTERY) {
  260 rem printf("Battery is draining: ");
  270 rem if (secs == -1) {
  280 rem printf("(unknown time left)\n");
  290 rem } else {
  300 rem printf("(%d seconds left)\n", secs);
  310 rem }
  320 rem
  330 rem if (pct == -1) {
  340 rem printf("(unknown percentage left)\n");
  350 rem } else {
  360 rem printf("(%d percent left)\n", pct);
  370 rem }
  380 rem }

 

« Last Edit: Mar 17th, 2018, 6:50pm by roy » User IP Logged

vbi
Guest
xx Re: Battery State
« Reply #1 on: Mar 17th, 2018, 8:54pm »

Hello Roy,

Below is a modified version of your example.

Leave out the CASE statement if you don't care about reporting any other status than running on battery.

My laptop reports percent but not seconds, so depending on the hardware you may not always get both.

Code:

      REM SDL_POWERSTATE Constants
      SDL_POWERSTATE_UNKNOWN = -1
      SDL_POWERSTATE_ON_BATTERY = 1
      SDL_POWERSTATE_NO_BATTERY = 2
      SDL_POWERSTATE_CHARGING = 3
      SDL_POWERSTATE_CHARGED = 4

      MODE 6

      REM Battery State

      SYS "SDL_GetPowerInfo", ^secs%, ^pct% TO status%

      CASE status% OF
        WHEN SDL_POWERSTATE_UNKNOWN    : PRINT "Battery Status Unknown"
        WHEN SDL_POWERSTATE_ON_BATTERY : PRINT "Running On Battery"
        WHEN SDL_POWERSTATE_NO_BATTERY : PRINT "No Battery Present"
        WHEN SDL_POWERSTATE_CHARGING   : PRINT "Battery is Charging"
        WHEN SDL_POWERSTATE_CHARGED    : PRINT "Battery is Charged"
        OTHERWISE PRINT "Battery Status Unrecognised"
      ENDCASE

      IF status% = SDL_POWERSTATE_ON_BATTERY THEN

        PRINT "Battery is draining: "

        IF secs% = -1 THEN
          PRINT "unknown time left"
        ELSE
          PRINT "seconds left: "+STR$secs%
        ENDIF

        IF pct% = -1 THEN
          PRINT "unknown percentage left"
        ELSE
          PRINT "percent left: "+STR$pct%
        ENDIF

      ENDIF

      END

 


« Last Edit: Mar 17th, 2018, 9:03pm by vbi » User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 803
xx Re: Battery State
« Reply #2 on: Mar 17th, 2018, 9:51pm »

on Mar 17th, 2018, 6:48pm, roy wrote:
Needles to say it doesn't work. It's hard to know where to start.

I think you mis-read the API documentation. SDL_GetPowerInfo takes two parameters, each of which is an 'int*' (i.e. a pointer to an int); but in your listing you pass a value, not a pointer! It should hopefully be obvious that if an API function is to return a value to you, you must pass a pointer to where that value should be stored.

So your:

Code:
      SYS "SDL_GetPowerInfo", secs%, pct% 

should be:

Code:
      SYS "SDL_GetPowerInfo", ^secs%, ^pct% 

Richard.
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 803
xx Re: Battery State
« Reply #3 on: Mar 17th, 2018, 10:03pm »

on Mar 17th, 2018, 8:54pm, vbi wrote:
Below is a modified version of your example.

In your code you seem to be assuming that SDL_GetPowerInfo will return valid information only when the battery is discharging, but that's not (necessarily) the case. On my laptop, for example, it returns a 'percentage charged' value also when the battery is charging.

Therefore to be more generally useful I would recommend that you change this line:

Code:
      IF status% = SDL_POWERSTATE_ON_BATTERY THEN 

to:

Code:
      IF status% = SDL_POWERSTATE_ON_BATTERY OR status% = SDL_POWERSTATE_CHARGING THEN 

Richard.
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #4 on: Mar 18th, 2018, 1:18pm »

Thanks Richard and vbi

Pointer, yes I think I've got that nowsmiley

Some Constants have been set up ie SDL_POWERSTATE_ON_BATTERY = 1. How do you know what value to give them?

Some apps when you touch the screen vibrate under your finger and some apps have popups with a short message. I have searched on how to do this but can fined anything. Any body any ideas.

Thanks Roy
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 803
xx Re: Battery State
« Reply #5 on: Mar 18th, 2018, 3:01pm »

on Mar 18th, 2018, 1:18pm, roy wrote:
Some Constants have been set up ie SDL_POWERSTATE_ON_BATTERY = 1. How do you know what value to give them?

In this particular case the constants come from the SDL_PowerState enumeration. Unless otherwise stated, the first item in an enumeration has the value zero and the others correspond to consecutively increasing integers. Note that vbi has an incorrect value for SDL_POWERSTATE_UNKNOWN in his listing, it should be zero, not -1:

Code:
      REM SDL_PowerState Constants
      SDL_POWERSTATE_UNKNOWN = 0 

Quote:
some apps have popups with a short message. I have searched on how to do this but can fined anything. Any body any ideas.

Message popups are easily created using SDL_ShowSimpleMessageBox:

Code:
      SDL_MESSAGEBOX_INFORMATION  = 2
      SYS "SDL_ShowSimpleMessageBox", SDL_MESSAGEBOX_INFORMATION, "My popup", "My message", @hwnd% 

Richard.
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #6 on: Mar 18th, 2018, 3:24pm »


Thanks for that, Richard
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #7 on: Mar 18th, 2018, 3:35pm »

I was wounding if a popup box could popup without the OK button and show the message for a few second and then disappear.

Regards Roy
User IP Logged

vbi
Guest
xx Re: Battery State
« Reply #8 on: Mar 18th, 2018, 7:00pm »

on Mar 18th, 2018, 3:01pm, Richard Russell wrote:
Note that vbi has an incorrect value for SDL_POWERSTATE_UNKNOWN in his listing, it should be zero, not -1

Whoops, thanks for the correction. That will teach me to pontificate on things that are above my pay grade.
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #9 on: Mar 18th, 2018, 8:14pm »

Hi All

Here is the app.
There doesn't seem to be a way to include a zip file or a screen shot so posted code

Thanks for help

Regards roy

Code:
   20 on error if err=17 then proc_CleanUp else mode 3 : print report$; " At line " erl : wait 100 : end
   30 on close proc_CleanUp
   40
   50 rem Battery State
   60 rem Using BBC Basic for Android
   70 rem Virsion 0.01
   80 rem March 2018
   90 rem Author: Roy Shepherd
  100 rem Thanks to Richard and vbi for help
  110
  120 mode 6
  130
  140 proc_Init
  150 repeat
  160   *refresh off
  170   cls
  180   proc_GetBatteryState
  190   proc_DrawBattery
  200   *refresh on
  210   wait 100
  220   mouse mx%, my%, b%
  230 until b%
  240 proc_CleanUp
  250 end
  260
  270 !------------------------------------------------
  280 rem Do once at first run of app
  290 !------------------------------------------------
  300 defproc_Init
  310 rem SDL_POWERSTATE Constants
  320 SDL_POWERSTATE_UNKNOWN = 0
  330 SDL_POWERSTATE_ON_BATTERY = 1
  340 SDL_POWERSTATE_NO_BATTERY = 2
  350 SDL_POWERSTATE_CHARGING = 3
  360 SDL_POWERSTATE_CHARGED = 4
  370 VERSION$ = "0.01 (SDL)"
  380 sys "SDL_SetWindowTitle", @hwnd%, "Battey State v"+VERSION$
  390 proc_GetScreenWidthHeight(screenW%, screenH%)
  400 off : colour 0, 50, 50, 50 : cls
  410 endproc
  420
  430 !------------------------------------------------
  440 rem Get batter state and print it
  450 !------------------------------------------------
  460 defproc_GetBatteryState
  470 sys "SDL_GetPowerInfo", ^secs%, ^pct% to status%
  480 print tab(13,0)"Battery State"
  490 case status% of
  500   when SDL_POWERSTATE_UNKNOWN    : print "Battery Status Unknown"
  510   when SDL_POWERSTATE_ON_BATTERY : print "Running On Battery"
  520   when SDL_POWERSTATE_NO_BATTERY : print "No Battery Present"
  530   when SDL_POWERSTATE_CHARGING   : print "Battery is Charging"
  540   when SDL_POWERSTATE_CHARGED    : print "Battery is Charged"
  550   otherwise print "Battery Status Unrecognised"
  560 endcase
  570
  580 if status% = SDL_POWERSTATE_ON_BATTERY or status% = SDL_POWERSTATE_CHARGING then
  590   print "Battery is draining: "
  600 endif
  610 if secs% = -1 then
  620   print "unknown time left"
  630 else
  640   print "Minutes left: ";secs% div 60
  650 endif
  660
  670 if pct% = -1 then
  680   print "unknown percentage left"
  690 else
  700   print "percent left: "+str$pct%
  710 endif
  720 endproc
  730
  740 !------------------------------------------------
  750 rem Draw the battery and showing how full it is
  760 !------------------------------------------------
  770 defproc_DrawBattery
  780 gcol 7 : rectangle screenW%, 50, 400, 800
  790 gcol 3 : rectangle fill screenW% + 150, 850, 100, 50
  800 if pct% < 10 then gcol 1 else gcol 2
  810 rectangle fill screenW% + 2, 52, 396, pct% * 8
  820 endproc
  830
  840 !------------------------------------------------
  850 rem Get the screen width and height
  860 !------------------------------------------------
  870 defproc_GetScreenWidthHeight(return sx%, return sy%)
  880 vdu 26
  890 if pos rem SDL thread sync
  900 sx% = @vdu%!208 : sy% = @vdu%!212
  910 endproc
  920
  930 !------------------------------------------------
  940 rem Set things back to default and close
  950 !------------------------------------------------
  960 defproc_CleanUp
  970 *refresh on
  980 on
  990 quit
 1000 endproc
 1010
 1020

 


User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 803
xx Re: Battery State
« Reply #10 on: Mar 18th, 2018, 10:30pm »

on Mar 18th, 2018, 8:14pm, roy wrote:
There doesn't seem to be a way to include a zip file or a screen shot so posted code

Zip file: include a hyperlink in your post (it's the button with a picture of the earth, second from the left in the second row of buttons when posting).

Screen shot: insert an image into your post (it's the button showing a framed picture, fourth from the left in the second row of buttons when posting).

Of course for both you need somewhere with public access to host the files, but these days with free cloud services like Dropbox this isn't the issue it once was.

Richard.
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #11 on: Mar 19th, 2018, 07:33am »

Thanks for the info Richard. Dropbox I'll look into that

Regards Roy
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #12 on: Mar 19th, 2018, 08:41am »

Hi Richard

I've installed Dropbox and put the BatteryState.bbc and the screen shot in it.
https://www.dropbox.com/s/jetorcxjc9rand2/BatterState.PNG?dl=0" alt="User Image" border="0">

https://www.dropbox.com/s/f0eble3utd71svu/BatterState.bbc?dl=0
" target="_blank">
https://www.dropbox.com/s/f0eble3utd71svu/BatterState.bbc?dl=0


The link under target blank works. I don't why there is two links with the first one not working

I couldn't get the image link to work, and the link look a mess.

Help !!
Regards Roy
User IP Logged

Richard Russell
Administrator
ImageImageImageImageImage


member is offline

Avatar




Homepage PM


Posts: 803
xx Re: Battery State
« Reply #13 on: Mar 19th, 2018, 1:29pm »

on Mar 19th, 2018, 08:41am, roy wrote:
I couldn't get the image link to work... Help !!

I don't really know, but I wonder if it's because Dropbox public URLs are secure (https://) whereas Conforums' aren't.

Richard.
User IP Logged

roy
New Member
Image


member is offline

Avatar




PM


Posts: 44
xx Re: Battery State
« Reply #14 on: Mar 19th, 2018, 6:22pm »

Thanks Richard

I'll keep trying smiley

Regards Roy

User IP Logged

Pages: 1 2  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls