User Tools

Site Tools

한국어

comfilepi:controlling_the_lcd_backlight:index

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
comfilepi:controlling_the_lcd_backlight:index [2023/03/13 11:57]
COMFILE Technology [CPi-C]
comfilepi:controlling_the_lcd_backlight:index [2023/12/06 10:00] (current)
COMFILE Technology [Controlling the LCD Backlight]
Line 1: Line 1:
 ====== Controlling the LCD Backlight ====== ====== Controlling the LCD Backlight ======
  
-The ComfilePi'​s LCD backlight is connected to GPIO 34.  The backlight can be turned on or off via the command line or via a programming language.+The ComfilePi'​s LCD backlight is connected to one of the panel PC's internal ​GPIO pins.  The backlight can be turned on or off via the command line or via a programming language. 
  
 ===== Command Line Interface ===== ===== Command Line Interface =====
  
-==== CPi-A & CPi-B ====+==== CPi-A/B/F/S ====
  
 To turn off the backlight: To turn off the backlight:
Line 60: Line 61:
 #include <​pigpiod_if2.h>​ #include <​pigpiod_if2.h>​
  
-#define PIN 34  // CPi-A & CPi-B+#define PIN 34  // CPi-A/B/F/S
 // #define PIN 44  // CPi-C // #define PIN 44  // CPi-C
  
Line 95: Line 96:
 #include <​chrono>​ #include <​chrono>​
 #include <​thread>​ #include <​thread>​
 +#include <​sys/​syslog.h>​ 
 +#include <​pigpiod_if2.h>​ 
 + 
 using namespace std; using namespace std;
 using namespace std::​chrono;​ using namespace std::​chrono;​
 + 
 +#define PIN 34  // CPi-A/B/F/S
 +// #define PIN 44 // CPi-C
  
-#include <​pigpiod_if2.h>​ +void log_info(const char *const message) 
- +{ 
-#define PIN 34  // CPi-A & CPi-B +    ​printf("​%s\n",​ message); 
-// #define PIN 44  // CPi-C+    ​syslog(LOG_INFO,​ "​%s",​ message); 
 +}
  
 +void log_err(const char *const message)
 +{
 +    printf("​%s\n",​ message);
 +    syslog(LOG_ERR,​ "​%s",​ message);
 +}
 + 
 void backlight_on() void backlight_on()
 { {
     auto instance = pigpio_start(NULL,​ NULL);     auto instance = pigpio_start(NULL,​ NULL);
 +    if (instance != 0)
 +    {
 +        log_err("​pigpio_start did not return success"​);​
 +        return;
 +    }
 + 
 +    auto result = set_mode(instance,​ PIN, PI_OUTPUT);
 +    if (instance != 0)
 +    {
 +        log_err("​set_mode did not return success"​);​
 +        return;
 +    }
  
-    ​set_mode(instance, PIN, PI_OUTPUT); +    ​result = gpio_write(instance, PIN, 1); 
-    ​gpio_write(instance, PIN, 1); +    ​if (instance ​!= 0) 
 +    { 
 +        log_err("​gpio_write did not return success"​); 
 +        return; 
 +    } 
 + 
     pigpio_stop(instance);​     pigpio_stop(instance);​
 } }
 + 
 void backlight_off() void backlight_off()
 { {
     auto instance = pigpio_start(NULL,​ NULL);     auto instance = pigpio_start(NULL,​ NULL);
 +    if (instance != 0)
 +    {
 +        log_err("​pigpio_start did not return success"​);​
 +        return;
 +    }
 + 
 +    auto result = set_mode(instance,​ PIN, PI_OUTPUT);
 +    if (instance != 0)
 +    {
 +        log_err("​set_mode did not return success"​);​
 +        return;
 +    }
  
-    ​set_mode(instance, PIN, PI_OUTPUT); +    ​result = gpio_write(instance, PIN, 0); 
-    ​gpio_write(instance, PIN, 0); +    ​if (instance ​!= 0
 +    { 
 +        log_err("​gpio_write did not return success"​); 
 +        return; 
 +    } 
 + 
     pigpio_stop(instance);​     pigpio_stop(instance);​
 } }
  
 +void set_backlight(CARD16 state)
 +{
 +    switch (state)
 +    {
 +        case DPMSModeOn:
 +            log_info("​Turning backlight on");
 +            backlight_on();​
 +            break;
 +        case DPMSModeOff:​
 +            log_info("​Turning backlight off");
 +            backlight_off();​
 +            break;
 +        default:
 +            log_info("​Invalid state"​);​
 +            break;
 +    }
 +}
 + 
 int main(int argc, char *argv[]) int main(int argc, char *argv[])
 { {
 +    openlog("​backlight_service",​ LOG_NDELAY, LOG_USER);
 +
 +    log_info("​Starting"​);​
 +
     Display *dpy;     Display *dpy;
     dpy = XOpenDisplay(NULL);​     dpy = XOpenDisplay(NULL);​
     if (dpy == NULL)     if (dpy == NULL)
     {     {
-        ​fprintf(stderr, ​"%s:  unable ​to open display\n", argv[0]);+        ​log_err("Unable ​to open display"​);​
         exit(EXIT_FAILURE);​         exit(EXIT_FAILURE);​
     }     }
 + 
     BOOL onoff;     BOOL onoff;
 +    CARD16 last_state;
     CARD16 state;     CARD16 state;
 +
 +    // Initialize last_state
 +    if (!DPMSInfo(dpy,​ &state, &​onoff))
 +    {
 +        log_err("​DPMSInfo returned FALSE"​);​
 +    }
 +    set_backlight(state);​
 +    last_state = state;
 +
     while(true)     while(true)
     {     {
-        DPMSInfo(dpy,​ &state, &onoff)+        ​if (!DPMSInfo(dpy,​ &state, &​onoff))
-        if (onoff)+
         {         {
-            ​switch ​(state+            ​log_err("​DPMSInfo returned FALSE"); 
-            ​+            ​this_thread::sleep_for(seconds(2)); 
-                case DPMSModeOn: +            ​continue
-                    backlight_on(); +        } 
-                    break+ 
-                case DPMSModeOff:​ +        // If DPMS is not enabled, then display a message 
-                    ​backlight_off(); +        ​if ​(!onoff
-                    break+        { 
-                ​default: +            log_err("​DPMSInfo is not enabled"​)
-                    break+            ​this_thread::​sleep_for(seconds(2))
-            }+            ​continue; 
 +        ​} 
 + 
 +        if (last_state != state) 
 +        { 
 +            set_backlight(state);​ 
 + 
 +            last_state = state;
         }         }
         this_thread::​sleep_for(milliseconds(200));​         this_thread::​sleep_for(milliseconds(200));​
     }     }
 + 
     XCloseDisplay(dpy);​     XCloseDisplay(dpy);​
  
 +    log_info("​Exiting"​);​
 + 
     return 0;     return 0;
 } }
 </​code>​ </​code>​
 +
  
 ==== Compile ==== ==== Compile ====
Line 178: Line 264:
 #!/bin/bash #!/bin/bash
  
-export DISPLAY=":​0.0"​ +PWM_PIN=31 
- +PIN=34
-PIN=34 ​  # CPi-A & CPi-B +
-#​PIN=44 ​ # CPi-C+
  
 +# Set pins as output
 +raspi-gpio set $PWM_PIN op
 raspi-gpio set $PIN op raspi-gpio set $PIN op
 +
 +# Start with both pins HIGH.  If either of the
 +# pins go LOW, the backlight will turn off.
 +raspi-gpio set $PWM_PIN dh
 +raspi-gpio set $PIN dh
 +
 +# Get the current state
 +CURRENT_STATUS=$(xset q | grep "​Monitor is" | awk '​{print $3}')
 +LAST_STATUS=$CURRENT_STATUS
 +
 +logger -p info -t "​backlight_service"​ -s "​Monitor is $CURRENT_STATUS"​
  
 # Loop indefinitely updating backlight in sync with monitor status # Loop indefinitely updating backlight in sync with monitor status
Line 189: Line 286:
  
   # Check the current monitor status   # Check the current monitor status
-  ​current_status=$(xset q | grep "​Monitor is" | awk '​{print $3}')+  ​CURRENT_STATUS=$(xset q | grep "​Monitor is" | awk '​{print $3}')
  
-  # Control backlight pin according to the monitor status +  ​# Only turn the backlight on/off if the Monitor state has changed 
-  if [ "$current_status" = "​On"​ ]; then +  if [ "​$CURRENT_STATUS"​ != "​$LAST_STATUS"​ ]; then 
-    raspi-gpio set $PIN dh +    logger -p info -t "​backlight_service"​ -s "​Monitor is $CURRENT_STATUS"​ 
-  else + 
-    raspi-gpio set $PIN dl+    ​# Control backlight pin according to the monitor status 
 +    if [ "$CURRENT_STATUS" = "​On"​ ]; then 
 +      ​logger -p info -t "​backlight_service"​ -s "​Turning Backlight On" 
 +      ​raspi-gpio set $PIN dh 
 +    else 
 +      ​logger -p info -t "​backlight_service"​ -s "​Turning Backlight Off" 
 +      ​raspi-gpio set $PIN dl 
 +    fi 
 +    LAST_STATUS=$CURRENT_STATUS
   fi   fi
  
Line 209: Line 314:
  
 Add the line ''​@xset dpms 0 0 {timeout_in_seconds}''​ to the //​autostart//​ file to set the timeout each time the desktop loads. Add the line ''​@xset dpms 0 0 {timeout_in_seconds}''​ to the //​autostart//​ file to set the timeout each time the desktop loads.
 +
 +Run ''​journalctl -t backlight_service -r''​ to view the log entries.
  
  
Line 353: Line 460:
 using namespace std; using namespace std;
  
-#define PIN 31  // CPi-A & CPi-B+#define PIN 31  // CPi-A/B/F/S
 // #define PIN 26  // CPi-C // #define PIN 26  // CPi-C
  
comfilepi/controlling_the_lcd_backlight/index.1678676232.txt.gz · Last modified: 2023/03/13 11:57 by COMFILE Technology