mirror of
https://github.com/CalcProgrammer1/OpenRGB.git
synced 2025-12-23 23:37:48 -05:00
133 lines
6.1 KiB
Bash
Executable File
133 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#-----------------------------------------------------------------------------#
|
|
# This script relies on the preprocessed *.ii and *.s files from #
|
|
# all "RGBController_" .cpp files and the detectors that call them #
|
|
# so that all #define macros have been replaced and can be text processed #
|
|
# #
|
|
# This script produces a set of markdown documents as defined by the #
|
|
# supported_devs target in the Linux specific section of OpenRGB.pro #
|
|
#-----------------------------------------------------------------------------#
|
|
|
|
## Modular Variables
|
|
OPENRGB_PATH=$1
|
|
CONTROLLER_PATH=${OPENRGB_PATH}'/Controllers'
|
|
|
|
CSV_TABLE_HEAD='Name,Category,Type,RGBController,VID,PID,SVID,SPID,Save,Direct,Effects,Comments'
|
|
CSV_FILE='Supported Devices.csv'
|
|
|
|
## Symbol Declarations
|
|
WHITE_CHECK_MARK_STRING=':white_check_mark:'
|
|
WHITE_CHECK_MARK='✔️'
|
|
ROTATING_LIGHT_STRING=':rotating_light:'
|
|
ROTATING_LIGHT='🚨'
|
|
ROBOT_STRING=':robot:'
|
|
ROBOT='🤖'
|
|
TOOLS_STRING=':tools:'
|
|
TOOLS='⚒️'
|
|
NO_ENTRY_STRING=':o:'
|
|
NO_ENTRY='🚫'
|
|
CROSS_STRING=':x:'
|
|
CROSS='❌'
|
|
|
|
declare -a STRINGS=($WHITE_CHECK_MARK_STRING $ROTATING_LIGHT_STRING $ROBOT_STRING $TOOLS_STRING $NO_ENTRY_STRING $CROSS_STRING)
|
|
declare -a UNICODE=($WHITE_CHECK_MARK $ROTATING_LIGHT $ROBOT $TOOLS $NO_ENTRY $CROSS)
|
|
|
|
## We first need to build OpenRGB with the preprocessed files saved
|
|
#qmake ${OPENRGB_PATH}/OpenRGB.pro "QMAKE_CXXFLAGS+=-save-temps"
|
|
#make -j$(nproc)
|
|
|
|
## The HID list is produced from each "REGISTER_DETECTOR" macro replacement.
|
|
DLM=$'\x01'
|
|
## | callback_function | VID | PID | Name |
|
|
HID_LIST=$(grep -hR -e "static\ HIDDeviceDetector" . | sed -e "s/^.*\(\".*\"\), \(.*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\).*,.*,.*,.*;$/\2${DLM}\3${DLM}\4${DLM}\1/g")
|
|
I2C_LIST=$(grep -hR -e "static\ I2CPCIDeviceDetector" . | sed -e "s/^.*\(\".*\"\), \(.*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\),.*;$/\2${DLM}\3${DLM}\4${DLM}\5${DLM}\6${DLM}\1/")
|
|
DUMMY_LIST=$(grep -hR -e DUMMY_DEVICE_DETECTOR\( ${CONTROLLER_PATH} | sed -e "s/^.*\(\".*\"\), \(.*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\) ).*/\2${DLM}\3${DLM}\4${DLM}\1/")
|
|
|
|
printf "%s\n%s\n%s" "$HID_LIST" "$I2C_LIST" "$DUMMY_LIST" > "device.list"
|
|
|
|
## This is the list of RGBController.cpp classes including path
|
|
FILE_LIST=$(find ${CONTROLLER_PATH} | grep RGBController_ | grep cpp | sort)
|
|
|
|
echo -e $FILE_LIST > "file.list"
|
|
echo -e "${CSV_TABLE_HEAD}" > "${CSV_FILE}"
|
|
|
|
while read -r controller
|
|
do
|
|
## 's/\r$//' - Convert DOS text to Unix text
|
|
DATA=$(sed -e 's/\r$//' ${controller} | awk '/\/\*\*/{flag=1;next}/\\\*/{flag=0}flag')
|
|
|
|
## 's/^ *//g' - Remove all leading whitespace
|
|
## 's/\,/\n/g' - Convert a comma separated list to lines
|
|
name=$(printf %s "$DATA" | grep @name | sed -e 's/@name//g' -e 's/^ *//g')
|
|
categories=$(printf %s "$DATA" | grep @category | sed -e 's/@category//g' -e 's/^ *//g' -e 's/\,/\n/g')
|
|
type=$(printf %s "$DATA" | grep @type | sed -e 's/@type//g' -e 's/^ *//g')
|
|
save=$(printf %s "$DATA" | grep @save | sed -e 's/@save//g' -e 's/^ *//g')
|
|
direct=$(printf %s "$DATA" | grep @direct | sed -e 's/@direct//g' -e 's/^ *//g')
|
|
effects=$(printf %s "$DATA" | grep @effects | sed -e 's/@effects//g' -e 's/^ *//g')
|
|
detectors=$(printf %s "$DATA" | grep @detectors | sed -e 's/@detectors *//g' -e 's/^ *//g' -e 's/\,/\n/g')
|
|
comment=$(printf %s "$DATA" | awk -v RS=' @' '/comment/' | sed -e 's/comment//g' -e 's/^ *//g')
|
|
|
|
# Replace any of the wiki strings with the unicode equivalents
|
|
replace_size=${#STRINGS[@]}
|
|
for (( i=0; i<${replace_size}; i++ ));
|
|
do
|
|
save=${save/${STRINGS[$i]}/${UNICODE[$i]}}
|
|
direct=${direct/${STRINGS[$i]}/${UNICODE[$i]}}
|
|
effects=${effects/${STRINGS[$i]}/${UNICODE[$i]}}
|
|
done
|
|
|
|
## Iterate over the comma seperated detector function list
|
|
while read -r detector
|
|
do
|
|
#Filter the list for all devices that use this detector
|
|
text=$(printf "%s\n%s\n%s" "$HID_LIST" "$I2C_LIST" "$DUMMY_LIST" | grep ${detector} | cut -d: -f 2- | sed -e 's/"//g')
|
|
if [[ -z ${text} ]]; then
|
|
echo "${detector} was not found in the list"
|
|
fi
|
|
|
|
#Replace the detector string with the list of devices
|
|
detectors=${detectors/${detector}/${text}}
|
|
|
|
vid=""
|
|
pid=""
|
|
svid=""
|
|
spid=""
|
|
device_name=""
|
|
|
|
while read -r device
|
|
do
|
|
case $type in
|
|
USB)
|
|
IFS="${DLM}" read null vid pid device_name null <<< "${device}"
|
|
#Remove leading hex signifier from $vid and $pid
|
|
vid=${vid/0x/}
|
|
pid=${pid/0x/}
|
|
device_name=${device_name//[^[:alnum:][:punct:][:blank:]]/}
|
|
escaped_comment=$(LC_ALL=C sed 's/["]/""/g' <<<"$comment")
|
|
|
|
csv_row=$(printf '"%s","%s","%s","%s","%s","%s","","","%s","%s","%s","%s"\n' "${device_name//|/\\|}" "${categories//|/\\|}" "${type//|/\\|}" "${name//|/\\|}" "${vid/ /}" "${pid/ /}" "${save}" "${direct}" "${effects}" "${escaped_comment}")
|
|
;;
|
|
I2C | SMBus)
|
|
IFS="${DLM}" read null vid pid svid spid device_name null <<<"$device"
|
|
#Remove leading hex signifiers
|
|
vid=${vid/0x/}
|
|
pid=${pid/0x/}
|
|
svid=${svid/0x/}
|
|
spid=${spid/0x/}
|
|
device_name=${device_name//[^[:alnum:][:punct:][:blank:]]/}
|
|
escaped_comment=$(LC_ALL=C sed 's/["]/""/g' <<<"$comment")
|
|
|
|
csv_row=$(printf '"%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s"\n' "${device_name//|/\\|}" "${categories//|/\\|}" "${type//|/\\|}" "${name//|/\\|}" "${vid/ /}" "${pid/ /}" "${svid/ /}" "${spid/ /}" "${save}" "${direct}" "${effects}" "${escaped_comment}")
|
|
;;
|
|
*)
|
|
csv_row=""
|
|
;;
|
|
esac
|
|
|
|
if [[ $csv_row = *[![:blank:]]* ]]; then
|
|
echo -e "$csv_row" >>"$CSV_FILE"
|
|
fi
|
|
done <<< "$text"
|
|
done <<< "$detectors"
|
|
done <<< "$FILE_LIST"
|