423 lines
9.5 KiB
Go
423 lines
9.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"bufio"
|
|
"fmt"
|
|
"time"
|
|
"os/exec"
|
|
"io/ioutil"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const cpu_temp1_path string = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input"
|
|
//const cpu_temp2_path string = "/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp3_input"
|
|
|
|
const mu_play string = ""
|
|
const mu_pause string = ""
|
|
const cmusWidth uint8 = 24
|
|
const aVolMed int = 35
|
|
const aVolMax int = 75
|
|
|
|
const audioMut string = ""
|
|
const audioMin string = ""
|
|
const audioMed string = ""
|
|
const audioMax string = ""
|
|
|
|
const termo100 string = ""
|
|
const termo075 string = ""
|
|
const termo050 string = ""
|
|
const termo025 string = ""
|
|
const termo000 string = ""
|
|
|
|
const temp_crit int = 60
|
|
const temp_high int = 50
|
|
const temp_norm int = 40
|
|
const temp_cool int = 30
|
|
|
|
const bat100 string = ""
|
|
const bat075 string = ""
|
|
const bat050 string = ""
|
|
const bat025 string = ""
|
|
const bat000 string = ""
|
|
|
|
const usblogo string = ""
|
|
|
|
const task_done string = ""
|
|
const task_todo string = ""
|
|
|
|
const time_track string = ""
|
|
const time_loose string = ""
|
|
//const time_wip string = ""
|
|
|
|
var cmusQ []byte
|
|
var amixQ []byte
|
|
var cmusLine []byte
|
|
var alsaLine []byte
|
|
var cpu_temp1 []byte
|
|
var cpu_temp1i int
|
|
var cpu_fmt string
|
|
var err error
|
|
var cmd *exec.Cmd
|
|
var sec uint8 = 0
|
|
var t bytes.Buffer
|
|
var batlevel bytes.Buffer
|
|
var cput bytes.Buffer
|
|
var cpuse bytes.Buffer
|
|
var status bytes.Buffer
|
|
var cmustat bytes.Buffer
|
|
var cmusAT bytes.Buffer
|
|
var alstat bytes.Buffer
|
|
var usbstat bytes.Buffer
|
|
var ttcheck bytes.Buffer
|
|
var item bytes.Buffer
|
|
|
|
var amixQf [][]byte
|
|
var alsabVol []byte
|
|
var alsaVol int
|
|
|
|
var no_time_track []byte = []byte("There is no active time tracking.")
|
|
var overdue []byte
|
|
var usb []byte
|
|
var timew []byte
|
|
var timewtrack []byte
|
|
|
|
var cpupercent []byte
|
|
var cpufloat float64
|
|
|
|
var batcmd []byte
|
|
var batint int
|
|
|
|
type cmusInfo struct {
|
|
artist []byte
|
|
title []byte
|
|
full bytes.Buffer
|
|
size uint8
|
|
a uint8
|
|
b uint8
|
|
}
|
|
|
|
var nowPlaying cmusInfo
|
|
|
|
func check(e error) {
|
|
if e != nil {
|
|
fmt.Println(e)
|
|
}
|
|
}
|
|
|
|
func xsetroot(name string) {
|
|
cmd = exec.Command("xsetroot","-name", name)
|
|
err = cmd.Run()
|
|
check(err)
|
|
}
|
|
|
|
func statusMkr(buff bytes.Buffer, items...bytes.Buffer) bytes.Buffer{
|
|
buff.Reset()
|
|
for _, item = range (items){
|
|
buff.WriteString(" ")
|
|
buff.WriteString(item.String())
|
|
}
|
|
return buff
|
|
}
|
|
|
|
func getTime(t bytes.Buffer) bytes.Buffer {
|
|
// to format the time string, you can use thoses codes:
|
|
// 15 : hour
|
|
// 03 : hour in am/pm format
|
|
// (you can add pm or PM at the end)
|
|
// 04 : minutes
|
|
// 05 : seconds
|
|
// 01 : month number
|
|
// 02 : day number
|
|
// 06 : two last digit of year number
|
|
// 2006 : full year number
|
|
t.Reset()
|
|
t.WriteString(time.Now().Format("Mon 02/01/06 15:04:05"))
|
|
return t
|
|
}
|
|
|
|
func getCpuTemp(cput bytes.Buffer) bytes.Buffer {
|
|
cpu_temp1, err = ioutil.ReadFile(cpu_temp1_path)
|
|
check(err)
|
|
cpu_temp1i, err = strconv.Atoi(strings.Replace(string(cpu_temp1), "\n","",-1))
|
|
cpu_temp1i = cpu_temp1i / 1000
|
|
check(err)
|
|
cput.Reset()
|
|
switch {
|
|
case cpu_temp1i > temp_crit:
|
|
cput.WriteString(termo100)
|
|
case cpu_temp1i > temp_high:
|
|
cput.WriteString(termo075)
|
|
case cpu_temp1i > temp_norm:
|
|
cput.WriteString(termo050)
|
|
case cpu_temp1i > temp_cool:
|
|
cput.WriteString(termo025)
|
|
case cpu_temp1i <= temp_cool:
|
|
cput.WriteString(termo000)
|
|
|
|
}
|
|
return cput
|
|
}
|
|
|
|
func bContain(b []byte, s string) bool {
|
|
return bytes.Contains(b,[]byte(s))
|
|
}
|
|
|
|
func bDel(b []byte, o string) []byte {
|
|
return bytes.Replace(b, []byte(o), []byte(""), 1)
|
|
}
|
|
|
|
|
|
func defil(cmusAT bytes.Buffer) bytes.Buffer {
|
|
cmusAT.Reset()
|
|
nowPlaying.full.Reset()
|
|
nowPlaying.full.Write(nowPlaying.artist)
|
|
nowPlaying.full.WriteString(" - ")
|
|
nowPlaying.full.Write(nowPlaying.title)
|
|
nowPlaying.size = uint8(len(nowPlaying.full.String()))
|
|
if nowPlaying.size > cmusWidth {
|
|
nowPlaying.full.WriteString(" - ")
|
|
nowPlaying.size = uint8(len(nowPlaying.full.String()))
|
|
nowPlaying.a = sec % nowPlaying.size
|
|
nowPlaying.b = (sec + cmusWidth) % nowPlaying.size
|
|
if nowPlaying.b > nowPlaying.a {
|
|
cmusAT.Write(nowPlaying.full.Bytes()[nowPlaying.a:nowPlaying.b])
|
|
} else {
|
|
cmusAT.Write(nowPlaying.full.Bytes()[nowPlaying.a:nowPlaying.size])
|
|
cmusAT.Write(nowPlaying.full.Bytes()[0:nowPlaying.b])
|
|
}
|
|
return cmusAT
|
|
} else {
|
|
cmusAT.Write(nowPlaying.full.Bytes())
|
|
return cmusAT
|
|
}
|
|
}
|
|
|
|
func cmusParse(cmusQ []byte, cmustat, cmusAT bytes.Buffer) (bytes.Buffer, bytes.Buffer){
|
|
cmusReader := bytes.NewReader(cmusQ)
|
|
cmusScanner := bufio.NewScanner(cmusReader)
|
|
cmusScanner.Split(bufio.ScanLines)
|
|
for cmusScanner.Scan() {
|
|
cmusLine = cmusScanner.Bytes()
|
|
switch {
|
|
case bContain(cmusLine,"status"):
|
|
switch {
|
|
case bContain(cmusLine,"playing"):
|
|
cmustat.WriteString(mu_play)
|
|
case bContain(cmusLine,"paused"):
|
|
cmustat.WriteString(mu_pause)
|
|
}
|
|
case bContain(cmusLine,"tag artist "):
|
|
nowPlaying.artist = bDel(cmusLine,"tag artist ")
|
|
case bContain(cmusLine,"tag title "):
|
|
nowPlaying.title = bDel(cmusLine,"tag title ")
|
|
}
|
|
}
|
|
cmusAT = defil(cmusAT)
|
|
cmustat.WriteString(" ")
|
|
cmustat.Write(cmusAT.Bytes())
|
|
return cmustat, cmusAT
|
|
}
|
|
|
|
func getCmus(cmustat, cmusAT bytes.Buffer) (bytes.Buffer, bytes.Buffer) {
|
|
cmusQ, err = exec.Command("cmus-remote","-Q").Output()
|
|
if err != nil {
|
|
cmustat.Reset()
|
|
return cmustat, cmusAT
|
|
}
|
|
cmustat.Reset()
|
|
cmustat, cmusAT = cmusParse(cmusQ, cmustat, cmusAT)
|
|
return cmustat, cmusAT
|
|
}
|
|
|
|
func getUSB(usbstat bytes.Buffer) (bytes.Buffer) {
|
|
usb, _ = exec.Command("getsdbz").Output()
|
|
usbstat.Reset()
|
|
if len(usb) != 0 {
|
|
usbstat.WriteString(usblogo)
|
|
return usbstat
|
|
} else {
|
|
return usbstat
|
|
}
|
|
}
|
|
|
|
func alsaParse(amixQ []byte, alstat bytes.Buffer) bytes.Buffer {
|
|
alsaReader := bytes.NewReader(amixQ)
|
|
alsaScanner := bufio.NewScanner(alsaReader)
|
|
alsaScanner.Split(bufio.ScanLines)
|
|
for alsaScanner.Scan() {
|
|
alsaLine = alsaScanner.Bytes()
|
|
if bContain(alsaLine,"Mono: Playback"){
|
|
if bContain(alsaLine,"[off]") {
|
|
alstat.WriteString(audioMut)
|
|
} else {
|
|
amixQf = bytes.Split(alsaLine,[]byte(" "))
|
|
alsabVol = bDel(amixQf[5],"[")
|
|
alsabVol = bDel(alsabVol,"%]")
|
|
alsaVol, _ = strconv.Atoi(string(alsabVol))
|
|
switch {
|
|
case alsaVol < aVolMed:
|
|
alstat.WriteString(audioMin)
|
|
case alsaVol >= aVolMed && alsaVol < aVolMax:
|
|
alstat.WriteString(audioMed)
|
|
case alsaVol >= aVolMax:
|
|
alstat.WriteString(audioMax)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return alstat
|
|
}
|
|
|
|
func getAlsa(alstat bytes.Buffer) bytes.Buffer {
|
|
amixQ, _ = exec.Command("amixer","get","Master","volume").Output()
|
|
alstat.Reset()
|
|
alstat = alsaParse(amixQ, alstat)
|
|
return alstat
|
|
}
|
|
|
|
func getCpuUse(cpuse bytes.Buffer) bytes.Buffer {
|
|
cpuse.Reset()
|
|
cpupercent, _ = exec.Command("cpu_percent").Output()
|
|
cpufloat, _ = strconv.ParseFloat(strings.Replace(string(cpupercent),"\n","",1), 32)
|
|
switch {
|
|
case cpufloat >= 75:
|
|
cpuse.WriteByte(8)
|
|
cpuse.WriteString("")
|
|
cpuse.WriteByte(1)
|
|
case cpufloat < 75:
|
|
cpuse.WriteString("")
|
|
}
|
|
return cpuse
|
|
}
|
|
|
|
func getBattery(batlevel bytes.Buffer) bytes.Buffer {
|
|
batlevel.Reset()
|
|
batcmd, _ = exec.Command("battery_level").Output()
|
|
batint, _ = strconv.Atoi(strings.Replace(string(batcmd),"\n","",1))
|
|
switch {
|
|
case batint >= 85:
|
|
batlevel.WriteString(bat100)
|
|
case batint >= 68:
|
|
batlevel.WriteString(bat075)
|
|
case batint >= 45:
|
|
batlevel.WriteString(bat050)
|
|
case batint >= 20:
|
|
batlevel.WriteString(bat025)
|
|
}
|
|
return batlevel
|
|
}
|
|
|
|
func getTtcheck(ttcheck bytes.Buffer) bytes.Buffer {
|
|
ttcheck.Reset()
|
|
timew, _ = exec.Command("timew").Output()
|
|
if bytes.Contains(timew, no_time_track){
|
|
ttcheck.WriteByte(7)
|
|
ttcheck.WriteString(time_loose)
|
|
ttcheck.WriteByte(1)
|
|
} else {
|
|
ttcheck.WriteString(time_track)
|
|
timewtrack, _ = exec.Command("timetrackwhat").Output()
|
|
ttcheck.WriteString(" ")
|
|
ttcheck.Write(timewtrack)
|
|
}
|
|
|
|
ttcheck.WriteString(" ")
|
|
|
|
overdue, _ = exec.Command("task","overdue").Output()
|
|
if len(overdue) == 0 {
|
|
ttcheck.WriteString(task_done)
|
|
} else {
|
|
ttcheck.WriteByte(7)
|
|
ttcheck.WriteString(task_todo)
|
|
ttcheck.WriteByte(1)
|
|
}
|
|
return ttcheck
|
|
}
|
|
|
|
func checkCmus(){
|
|
|
|
go func(){
|
|
for ;; {
|
|
cmustat, cmusAT = getCmus(cmustat, cmusAT)
|
|
time.Sleep(time.Second)
|
|
sec ++
|
|
}
|
|
}()
|
|
|
|
}
|
|
|
|
func checkUSB(){
|
|
go func () {
|
|
for ;; {
|
|
usbstat = getUSB(usbstat)
|
|
time.Sleep(1* time.Second)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func checkTTM(){
|
|
go func () {
|
|
for ;; {
|
|
ttcheck = getTtcheck(ttcheck)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func main() {
|
|
/*
|
|
for ;; {
|
|
if (sec % 3) == 0 {
|
|
cput = getCpuTemp(cput)
|
|
cpuse = getCpuUse(cpuse)
|
|
batlevel = getBattery(batlevel)
|
|
}
|
|
if (sec % 10) == 0 {
|
|
ttcheck = getTtcheck(ttcheck)
|
|
}
|
|
alstat = getAlsa(alstat)
|
|
}*/
|
|
|
|
checkCmus()
|
|
|
|
go func () {
|
|
for ;; {
|
|
cput = getCpuTemp(cput)
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
}()
|
|
|
|
go func () {
|
|
for ;; {
|
|
cpuse = getCpuUse(cpuse)
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
}()
|
|
|
|
go func () {
|
|
for ;; {
|
|
batlevel = getBattery(batlevel)
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
}()
|
|
|
|
go func () {
|
|
for ;; {
|
|
alstat = getAlsa(alstat)
|
|
time.Sleep(2 * time.Second)
|
|
}
|
|
}()
|
|
|
|
for ;; {
|
|
t = getTime(t)
|
|
//status = statusMkr(status, cmustat, t)
|
|
status = statusMkr(status, cmustat, usbstat, alstat, t, cput, cpuse, batlevel)
|
|
xsetroot(status.String())
|
|
time.Sleep(time.Second)
|
|
}
|
|
|
|
}
|
|
|