Counter reader
This commit is contained in:
parent
0e7e0d9bcc
commit
8c4c31b686
10
counter.c
10
counter.c
|
@ -10,7 +10,7 @@
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Inex Code");
|
MODULE_AUTHOR("Inex Code");
|
||||||
MODULE_DESCRIPTION("A counter device");
|
MODULE_DESCRIPTION("A counter_reader device");
|
||||||
MODULE_VERSION("0.0.3");
|
MODULE_VERSION("0.0.3");
|
||||||
|
|
||||||
#define DEVICE_NAME "inex_counter"
|
#define DEVICE_NAME "inex_counter"
|
||||||
|
@ -53,7 +53,7 @@ static int counter_thread(void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init counter_init(void) {
|
static int __init counter_init(void) {
|
||||||
printk(KERN_INFO "Counter: Initializing the counter device.\n");
|
printk(KERN_INFO "Counter: Initializing the counter_reader device.\n");
|
||||||
Major = register_chrdev(0, DEVICE_NAME, &counter_fops);
|
Major = register_chrdev(0, DEVICE_NAME, &counter_fops);
|
||||||
if (Major < 0) {
|
if (Major < 0) {
|
||||||
printk(KERN_ALERT "Registering char device failed with %d\n", Major);
|
printk(KERN_ALERT "Registering char device failed with %d\n", Major);
|
||||||
|
@ -93,7 +93,7 @@ static int device_release(struct inode *inode, struct file *file) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset) {
|
static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset) {
|
||||||
// Output the counter value to the user.
|
// Output the counter_reader value to the user.
|
||||||
int bytes_read = 0;
|
int bytes_read = 0;
|
||||||
char buf[32];
|
char buf[32];
|
||||||
int len = sprintf(buf, "%d\n", counter);
|
int len = sprintf(buf, "%d\n", counter);
|
||||||
|
@ -107,13 +107,13 @@ static ssize_t device_read(struct file *filp, char __user *buffer, size_t length
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
bytes_read = len;
|
bytes_read = len;
|
||||||
printk("Counter: Read %d bytes, counter = %d", bytes_read, counter);
|
printk("Counter: Read %d bytes, counter_reader = %d", bytes_read, counter);
|
||||||
is_read = 1;
|
is_read = 1;
|
||||||
return bytes_read;
|
return bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t device_write(struct file *filp, const char __user *buffer, size_t length, loff_t *offset) {
|
static ssize_t device_write(struct file *filp, const char __user *buffer, size_t length, loff_t *offset) {
|
||||||
// Input the counter value from the user.
|
// Input the counter_reader value from the user.
|
||||||
char buf[32];
|
char buf[32];
|
||||||
int len = length;
|
int len = length;
|
||||||
if (len > sizeof(buf)) {
|
if (len > sizeof(buf)) {
|
||||||
|
|
16
counter_reader/counter_reader.py
Normal file
16
counter_reader/counter_reader.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
"""
|
||||||
|
This file is used to read the counter_reader value from the /dev/inex_counter device.
|
||||||
|
The value is then send as a notification.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from subprocess import run
|
||||||
|
|
||||||
|
|
||||||
|
def __main__():
|
||||||
|
"""
|
||||||
|
This function is called when the script is executed.
|
||||||
|
"""
|
||||||
|
# Read the counter_reader value from the device.
|
||||||
|
counter_value = run(["cat", "/dev/inex_counter"], capture_output=True).stdout.decode("utf-8")
|
||||||
|
# Send the counter_reader value as a notification.
|
||||||
|
run(["notify-send", "Counter value", counter_value])
|
14
counter_reader/counter_reader.service
Normal file
14
counter_reader/counter_reader.service
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[Unit]
|
||||||
|
# A short human readable title of the unit
|
||||||
|
Description=Counter Reader
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
# Configures the process start-up type for this service unit, one of:
|
||||||
|
# simple - The process defined in ExecStart= will stay in the foreground while the unit is activated.
|
||||||
|
# forking - The process defined in ExecStart= will fork a background process and exit right away.
|
||||||
|
# oneshot - The process will exit right away, use with RemainAfterExit= to ensure the serice is marked as active.
|
||||||
|
# Consult the documentantion for types (https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=) other options.
|
||||||
|
Type=oneshot
|
||||||
|
# Command with arguments to invoke when the unit is activated.
|
||||||
|
# This runs a python script that reads the counter
|
||||||
|
ExecStart=/usr/bin/python3 /home/inex/dev/Linux/counter_reader/counter_reader.py
|
21
counter_reader/counter_reader.timer
Normal file
21
counter_reader/counter_reader.timer
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[Unit]
|
||||||
|
# A short human readable title of the unit
|
||||||
|
Description=Counter Reader launcher
|
||||||
|
# A list of units whose activations will occur before this unit starts.
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
# The syntax for timers is described in (https://www.freedesktop.org/software/systemd/man/systemd.time.html#)
|
||||||
|
# A shorthand version is that you can specify timers by specifying values using (us, ms, s, m, h, days, weeks, months, years)
|
||||||
|
# e.g., 2 weeks 1 hours or 1 year 6 months or 5 m 30 s
|
||||||
|
|
||||||
|
# Defines a timer relative to the moment the timer unit itself is activated.
|
||||||
|
OnActiveSec=30s
|
||||||
|
|
||||||
|
# In addition to the above, OnCalendar takes a cron like syntax or values such as (minutely, hourly, daily, monthly, weekly,...)
|
||||||
|
# Defines realtime (i.e. wallclock) timers with calendar event expressions
|
||||||
|
OnCalendar=daily
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
# A list of units who when activated will try and activate this unit
|
||||||
|
WantedBy=multi-user.target
|
Loading…
Reference in a new issue