#!/bin/sh

get_battery_state() {
    LOC=/sys/class/power_supply/BAT1/uevent
    if [ ! -e ${LOC} ]; then
        return
    fi
    result=$(awk \
        '/PRESENT|STATUS|CURRENT_NOW|CAPACITY/ {gsub("POWER_SUPPLY_",""); gsub("=",": "); printf "%s, ", $0;}' \
        ${LOC})
    printf "%s" "${result}"
}

get_ac_adapter_state() {
    LOC=/sys/class/power_supply/ACAD/uevent
    if [ ! -e ${LOC} ]; then
        return
    fi
    result=$(awk \
        '/_TYPE|ONLINE/ {gsub("POWER_SUPPLY_",""); gsub("=",": "); printf "%s, ", $0;}' \
        ${LOC})
    printf "%s" "${result}"
}

get_typec_state() {
    LOC=/sys/class/power_supply/ucsi-source-psy-USBC000\:001/uevent
    if [ ! -e ${LOC} ]; then
        return
    fi
    result=$(awk \
        '/CHARGE_TYPE|ONLINE|USB_TYPE/ {gsub("POWER_SUPPLY_",""); gsub("=",": "); printf "%s, ", $0;}' \
        ${LOC})
    printf "%s" "${result}"
}

get_coretemp_data() {

    BASE=/sys/devices/platform/coretemp.0/hwmon
    FRAGMENT=$(ls -1 ${BASE} | xargs | cut -f 1 -d' ')
    LOC="${BASE}/${FRAGMENT}"
    if [ ! -e ${LOC} ]; then
        return
    fi

    result=""
    for path in $(ls ${LOC}/temp*_label); do
        label=$(cat ${path})
        value=$(cat $(echo "${path%%_label}_input"))
        fmt=$(printf "%s: %s, " "${label}" "${value}")
        result="${result} ${fmt}"

    done

    printf "%s" "${result}"

}

if [ $# -lt 1 ]; then
    SleepCount=60
else
    SleepCount=$1
fi

if [ $# -lt 2 ]; then
    ShowTime="y"
else
    ShowTime="$2"
fi

if [ $# -lt 3 ]; then
    DestFile=/dev/stdout
else
    DestFile="$3"
fi

echo "Stat collection period ${SleepCount}, ShowTime=${ShowTime}, DestFile=${DestFile}"
DestFolder=$(dirname "${DestFile}")
if [ ! -e ${DestFolder} ]; then
    echo "DestFolder does not exists, making: ${DestFolder}"
    mkdir -p ${DestFolder}
fi

while true; do
    if [ "${ShowTime}" = "y" ]; then
        timestamp="$(date "+%Y-%m-%d %T"): "
    fi
    batt_stat=$(get_battery_state)
    ac_stat=$(get_ac_adapter_state)
    typec_stat=$(get_typec_state)
    temp_stat=$(get_coretemp_data)
	cpu_freqs=$(cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq | xargs)
    l='cur boost min max'
	gpu_freqs=$(for f in $l; do cat /sys/class/drm/card0/gt_${f}_freq_mhz; done | xargs)
    printf "${timestamp}CPU: [%s], GPU: [%s], BATT: {%s}, AC: {%s}, TYPEC: {%s}, CORETEMP: {%s}\n" \
        "${cpu_freqs}" "${gpu_freqs}" "${batt_stat}" "${ac_stat}" "${typec_stat}" "${temp_stat}" | \
        sed -e 's/, }/}/g'
    sleep ${SleepCount}
done >> ${DestFile}

