diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 615c9e4a..06c7ae03 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,11 +42,7 @@ before_script:
artifacts:
name: "${CI_PROJECT_NAME}_Supported_Devices_${CI_COMMIT_SHORT_SHA}"
paths:
- - ./*.md
- Supported Devices.csv
- exclude:
- - README.md
- - CONTRIBUTING.md
expire_in: 30 days
rules:
diff --git a/Controllers/A4TechController/BloodyB820RController/RGBController_BloodyB820R.cpp b/Controllers/A4TechController/BloodyB820RController/RGBController_BloodyB820R.cpp
index 75769387..d1796dc1 100644
--- a/Controllers/A4TechController/BloodyB820RController/RGBController_BloodyB820R.cpp
+++ b/Controllers/A4TechController/BloodyB820RController/RGBController_BloodyB820R.cpp
@@ -145,7 +145,7 @@ static const char *led_names[] =
@save :x:
@direct :white_check_mark:
@effects :x:
- @detectors A4TechDetector
+ @detectors DetectBloodyB820R
@comment The A4Tech Bloody B820R keyboard controller currently
supports the full size (ANSI layout).
\*-------------------------------------------------------------------*/
diff --git a/Controllers/CoolerMasterController/CMKeyboardController/RGBController_CMKeyboardController.cpp b/Controllers/CoolerMasterController/CMKeyboardController/RGBController_CMKeyboardController.cpp
index 788ed048..1a2b604c 100644
--- a/Controllers/CoolerMasterController/CMKeyboardController/RGBController_CMKeyboardController.cpp
+++ b/Controllers/CoolerMasterController/CMKeyboardController/RGBController_CMKeyboardController.cpp
@@ -19,7 +19,7 @@
@save :robot:
@direct :white_check_mark:
@effects :white_check_mark:
- @detectors DetectCoolerMasterKeyboards
+ @detectors DetectCoolerMasterV1Keyboards,DetectCoolerMasterV2Keyboards
@comment
In CMKeyboardV1Controller brightness control not supported.
Supported effects differ between CMKeyboardV1Controller and
diff --git a/Controllers/EpomakerController/RGBController_EpomakerController.cpp b/Controllers/EpomakerController/RGBController_EpomakerController.cpp
index 87cf81cf..27e78c90 100644
--- a/Controllers/EpomakerController/RGBController_EpomakerController.cpp
+++ b/Controllers/EpomakerController/RGBController_EpomakerController.cpp
@@ -19,7 +19,7 @@
@save :robot:
@direct :x:
@effects :white_check_mark:
- @detectors EpomakerControllerDetect
+ @detectors DetectEpomakerControllers
@comment
\*-------------------------------------------------------------------*/
diff --git a/Controllers/GigabyteAorusLaptopController/RGBController_GigabyteAorusLaptop.cpp b/Controllers/GigabyteAorusLaptopController/RGBController_GigabyteAorusLaptop.cpp
index 62a557e9..2f2d8406 100644
--- a/Controllers/GigabyteAorusLaptopController/RGBController_GigabyteAorusLaptop.cpp
+++ b/Controllers/GigabyteAorusLaptopController/RGBController_GigabyteAorusLaptop.cpp
@@ -19,7 +19,7 @@
@save :robot:
@direct :white_check_mark:
@effects :white_check_mark:
- @detectors DetectGigabyteAorusLaptopControllers
+ @detectors DetectGigabyteAorusLaptopKeyboardControllers,DetectGigabyteAorusLaptopBacklightControllers
@comment Direct mode will only exposes the whole keyboard as one
big led, only custom mode can do real per key lightning.
This is impossible to determine if it auto saves to flash
diff --git a/pci_ids/pci_ids.h b/pci_ids/pci_ids.h
index a8945edd..f1baa094 100644
--- a/pci_ids/pci_ids.h
+++ b/pci_ids/pci_ids.h
@@ -349,8 +349,8 @@
/*-----------------------------------------------------*\
| Colorful Sub-Device IDs |
\*-----------------------------------------------------*/
-#define COLORFUL_IGAME_RTX_2070_SUPER_ADVANCED_OCV 0X1401
-#define COLORFUL_IGAME_RTX_2070_SUPER_ADVANCED_OCV2 0X140A
+#define COLORFUL_IGAME_RTX_2070_SUPER_ADVANCED_OCV 0x1401
+#define COLORFUL_IGAME_RTX_2070_SUPER_ADVANCED_OCV2 0x140A
#define COLORFUL_IGAME_RTX_3060_ADVANCED_OC_12G_LV 0x140A
#define COLORFUL_IGAME_RTX_3060_ULTRAW_OC_12G 0x150A
#define COLORFUL_IGAME_RTX_3060_ULTRAW_OC_12G_2 0x1501
@@ -614,7 +614,7 @@
#define MSI_RTX2070S_ARMOR_OC_SUB_DEV 0xC730
#define MSI_RTX2070S_GAMING_TRIO_SUB_DEV 0xC727
#define MSI_RTX2070S_GAMING_Z_TRIO_SUB_DEV 0x37B6
-#define MSI_RTX2070S_GAMING_X_SUB_DEV 0x373e
+#define MSI_RTX2070S_GAMING_X_SUB_DEV 0x373E
#define MSI_RTX2070S_GAMING_X_TRIO_SUB_DEV 0xC726
#define MSI_RTX2080_GAMING_TRIO_SUB_DEV 0x372E
#define MSI_RTX2080_GAMING_X_TRIO_SUB_DEV 0x3726
diff --git a/scripts/build-supported-devices-md.sh b/scripts/build-supported-devices-md.sh
index e1d55208..df5f571c 100755
--- a/scripts/build-supported-devices-md.sh
+++ b/scripts/build-supported-devices-md.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/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 #
@@ -11,12 +11,7 @@
## Modular Variables
OPENRGB_PATH=$1
CONTROLLER_PATH=${OPENRGB_PATH}'/Controllers'
-DATA_TABLE_HEAD='| Controller Name | Connection | Save to Flash | Direct | Hardware Effects |\n'
-DATA_TABLE_ALIGN='| :--- | :---: | :---: | :---: | :---: |'
-USB_DEVICE_TABLE_HEAD='| Vendor ID | Product ID | Device Name |\n'
-GPU_DEVICE_TABLE_HEAD='| Vendor &
Device ID | Sub-Vendor &
Product ID | Device Name |\n'
-DEVICE_TABLE_ALIGN='| :---: | :---: | :--- |'
-MAIN_FILE='Supported Devices.md'
+
CSV_TABLE_HEAD='Name,Category,Type,RGBController,VID,PID,SVID,SPID,Save,Direct,Effects,Comments'
CSV_FILE='Supported Devices.csv'
@@ -42,52 +37,18 @@ declare -a UNICODE=($WHITE_CHECK_MARK $ROTATING_LIGHT $ROBOT $TOOLS $NO_ENTRY $C
#make -j$(nproc)
## The HID list is produced from each "REGISTER_DETECTOR" macro replacement.
-DELIMITER=$'\x01'
+DLM=$'\x01'
## | callback_function | VID | PID | Name |
-HID_LIST=$(grep -hR -e "static\ HIDDeviceDetector" . | cut -d '(' -f 2- | awk -F , -v delim="${DELIMITER}" '{ print $2 ":"delim $3 delim $4 delim $1 delim }')
-I2C_LIST=$(grep -hR -e "static\ I2CPCIDeviceDetector" . | cut -d '(' -f 2- | awk -F , -v delim="${DELIMITER}" '{ print $2 ":"delim $3 delim $4 delim $5 delim $6 delim $1 delim }')
+HID_LIST=$(grep -hR -e "static\ HIDDeviceDetector" . | sed -e "s/^.*\(\".*\"\), \(.*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\).*,.*,.*,.*;$/\2${DLM}\3${DLM}\4${DLM}\1/p")
+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/p")
+DUMMY_LIST=$(grep -hR -e DUMMY_DEVICE_DETECTOR\( ${CONTROLLER_PATH} | sed -e "s/^.*\(\".*\"\), \(.*\), \([0-9ABCDEFx]*\), \([0-9ABCDEFx]*\) ).*/\2${DLM}\3${DLM}\4${DLM}\1/p")
-printf %s\n%s "$HID_LIST" "$I2C_LIST" > "device.list"
+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"
-
-## Write the heading to the main file prior to iterating over the controller list
-echo -e "# Supported Devices\n\n" > "$MAIN_FILE"
-
-## Write quick links to each section heading in an unordered list
-echo -e "- [Motherboards](#motherboards)" >> "$MAIN_FILE"
-echo -e "- [RAM](#ram)" >> "$MAIN_FILE"
-echo -e "- [Graphics Cards](#graphics-cards)" >> "$MAIN_FILE"
-echo -e "- [Coolers](#coolers)" >> "$MAIN_FILE"
-echo -e "- [LED Strips](#led-strips)" >> "$MAIN_FILE"
-echo -e "- [Keyboards](#keyboards)" >> "$MAIN_FILE"
-echo -e "- [Microphones](#microphones)" >> "$MAIN_FILE"
-echo -e "- [Mice](#mice)" >> "$MAIN_FILE"
-echo -e "- [Mouse Mats](#mouse-mats)" >> "$MAIN_FILE"
-echo -e "- [Headsets](#headsets)" >> "$MAIN_FILE"
-echo -e "- [Headset Stands](#headset-stands)" >> "$MAIN_FILE"
-echo -e "- [Gamepads](#gamepads)" >> "$MAIN_FILE"
-echo -e "- [Accessories](#Accessories)" >> "$MAIN_FILE"
-echo -e "- [Lights](#lights)" >> "$MAIN_FILE"
-echo -e "- [Speakers](#speakers)" >> "$MAIN_FILE"
-echo -e "- [Virtual Devices](#virtual-devices)" >> "$MAIN_FILE"
-echo -e "- [Storage](#storage)" >> "$MAIN_FILE"
-echo -e "- [Cases](#cases)" >> "$MAIN_FILE"
-echo -e "- [Other Devices](#other-devices)" >> "$MAIN_FILE"
-
-echo -e "\n## Legend\n\n" >> "$MAIN_FILE"
-echo -e "| Symbol | Meaning |" >> "$MAIN_FILE"
-echo -e "| :---: | :--- |" >> "$MAIN_FILE"
-echo -e "| ${WHITE_CHECK_MARK} | Fully supported by OpenRGB |" >> "$MAIN_FILE"
-echo -e "| ${ROTATING_LIGHT} | Support is problematic
See device page for details |" >> "$MAIN_FILE"
-echo -e "| ${ROBOT} | Feature is automatic and can not be turned off |" >> "$MAIN_FILE"
-echo -e "| ${TOOLS} | Partially supported by OpenRGB
See device page for details |" >> "$MAIN_FILE"
-echo -e "| ${NO_ENTRY} | Not currently supported by OpenRGB |" >> "$MAIN_FILE"
-echo -e "| ${CROSS} | Not applicable for this device |" >> "$MAIN_FILE"
-
echo -e "${CSV_TABLE_HEAD}" > "${CSV_FILE}"
while read -r controller
@@ -115,212 +76,57 @@ do
effects=${effects/${STRINGS[$i]}/${UNICODE[$i]}}
done
- if [[ $name = *[![:blank:]]* ]]; then #Check that the name is not blank
- case $save in
- ${CROSS})
- save_title="Not supported by controller"
- ;;
- ${NO_ENTRY})
- save_title="Not currently supported by OpenRGB"
- ;;
- ${ROBOT})
- save_title="Controller saves automatically on every update"
- ;;
- ${WHITE_CHECK_MARK})
- save_title="Saving is supported by this controller"
- ;;
- esac
-
- case $direct in
- ${CROSS})
- direct_title="Not supported by controller"
- ;;
- ${NO_ENTRY})
- direct_title="Not currently supported by OpenRGB"
- ;;
- ${ROTATING_LIGHT})
- direct_title="Direct control is problematic (See device page for details)"
- ;;
- ${WHITE_CHECK_MARK})
- direct_title="Direct control is supported for Software Effects"
- ;;
- esac
-
- case $effects in
- ${CROSS})
- effects_title="Hardware effects are not supported by controller"
- ;;
- ${NO_ENTRY})
- effects_title="Not currently supported by OpenRGB"
- ;;
- ${ROTATING_LIGHT})
- effects_title="Hardware effects implementation is problematic"
- ;;
- ${TOOLS})
- effects_title="Hardware effects are not fully implemented by controller (See device page for details)"
- ;;
- ${WHITE_CHECK_MARK})
- effects_title="Hardware effects are supported"
- ;;
- esac
-
- link=$(echo -e ${name//[[:blank:]]/-} | sed -e 's/(/%28/' -e 's/)/%29/')
- ## Output this controllers entry into the main file's tables
- current_controller='|['${name}']('${link}'.md)|'${type}'|'${save}'|'${direct}'|'${effects}'|\n'
-
- ## Add entry to all relevant categories listed in @category
- while read -r category
- do
- case $category in
- Motherboard)
- motherboard+=$current_controller
- ;;
- RAM)
- ram+=$current_controller
- ;;
- GPU)
- gpu+=$current_controller
- ;;
- Cooler)
- cooler+=$current_controller
- ;;
- LEDStrip)
- ledstrip+=$current_controller
- ;;
- Keyboard)
- keyboard+=$current_controller
- ;;
- Microphone)
- microphone+=$current_controller
- ;;
- Mouse)
- mouse+=$current_controller
- ;;
- Mousemat)
- mousemat+=$current_controller
- ;;
- Headset)
- headset+=$current_controller
- ;;
- HeadsetStand)
- headset_stand+=$current_controller
- ;;
- Gamepad)
- gamepad+=$current_controller
- ;;
- Accessory)
- accessory+=$current_controller
- ;;
- Light)
- light+=$current_controller
- ;;
- Speaker)
- speaker+=$current_controller
- ;;
- Virtual)
- virtual+=$current_controller
- ;;
- Storage)
- storage+=$current_controller
- ;;
- Case)
- case+=$current_controller
- ;;
- Dummy)
- ## Do nothing for the Dummy controller
- ;;
- *)
- unknown+=$current_controller
- ;;
- esac
- done <<< "$categories"
-
- ## Create a controller page and fill it with header details and the start of the device table
- outfile=${name//[[:blank:]]/-}.md
- echo -e "# ${name}\n\n ${comment}\n" >"$outfile"
- echo -e "## Connection Type\n ${type}\n" >> "$outfile"
- echo -e "## Saving\n ${save_title}\n" >> "$outfile"
- echo -e "## Direct Mode\n ${direct_title}\n" >> "$outfile"
- echo -e "## Hardware Effects\n ${effects_title}\n" >> "$outfile"
- if [[ $categories = GPU ]]; then
- echo -e "## Device List\n\n${GPU_DEVICE_TABLE_HEAD}${DEVICE_TABLE_ALIGN}" >> "$outfile"
- else
- echo -e "## Device List\n\n${USB_DEVICE_TABLE_HEAD}${DEVICE_TABLE_ALIGN}" >> "$outfile"
+ ## 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
- ## Iterate over the comma seperated detector function list
- while read -r detector
+ #Replace the detector string with the list of devices
+ detectors=${detectors/${detector}/${text}}
+
+ vid=""
+ pid=""
+ svid=""
+ spid=""
+ device_name=""
+
+ while read -r device
do
- #Filter the list for all devices that use this detector
- text=$(printf "%s\n%s" "$HID_LIST" "$I2C_LIST" | grep ${detector} | cut -d: -f 2- | sed -e 's/"//g')
+ 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")
- #Replace the detector string with the list of devices
- detectors=${detectors/${detector}/${text}}
+ 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")
- vid=""
- pid=""
- svid=""
- spid=""
- device_name=""
+ 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
- while read -r device
- do
- case $type in
- USB)
- IFS="${DELIMITER}" 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}")
- table_row=$(printf '| `%s` | `%s` | %s |' "${vid/ /}" "${pid/ /}" "${device_name//|/\\|}")
- ;;
- I2C | SMBus)
- IFS="${DELIMITER}" 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}")
- table_row=$(printf '| `%s:%s` | `%s:%s` | %s |' "${vid/ /}" "${pid/ /}" "${svid/ /}" "${spid/ /}" "${device_name//|/\\|}")
- ;;
- *)
- table_row=""
- ;;
- esac
-
- if [[ $table_row = *[![:blank:]]* ]]; then
- echo -e "$table_row" >>"$outfile"
- echo -e "$csv_row" >>"$CSV_FILE"
- fi
- done <<< "$text"
- done <<< "$detectors"
- fi
+ if [[ $csv_row = *[![:blank:]]* ]]; then
+ echo -e "$csv_row" >>"$CSV_FILE"
+ fi
+ done <<< "$text"
+ done <<< "$detectors"
done <<< "$FILE_LIST"
-
-printf "\n## Motherboards\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${motherboard}| sort)">> "$MAIN_FILE"
-printf "\n## RAM\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${ram}| sort)">> "$MAIN_FILE"
-printf "\n## Graphics Cards\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${gpu}| sort)" >> "$MAIN_FILE"
-printf "\n## Coolers\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${cooler}| sort)" >> "$MAIN_FILE"
-printf "\n## LED Strips\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${ledstrip}| sort)" >> "$MAIN_FILE"
-printf "\n## Keyboards\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${keyboard}| sort)" >> "$MAIN_FILE"
-printf "\n## Microphones\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${microphone}| sort)" >> "$MAIN_FILE"
-printf "\n## Mice\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${mouse}| sort)" >> "$MAIN_FILE"
-printf "\n## Mouse Mats\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${mousemat}| sort)" >> "$MAIN_FILE"
-printf "\n## Headsets\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${headset}| sort)" >> "$MAIN_FILE"
-printf "\n## Headset Stands\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${headset_stand}| sort)" >> "$MAIN_FILE"
-printf "\n## Gamepads\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${gamepad}| sort)" >> "$MAIN_FILE"
-printf "\n## Accessories\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${accessory}| sort)" >> "$MAIN_FILE"
-printf "\n## Lights\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${light}| sort)" >> "$MAIN_FILE"
-printf "\n## Speakers\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${speaker}| sort)" >> "$MAIN_FILE"
-printf "\n## Virtual Devices\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${virtual}| sort)" >> "$MAIN_FILE"
-printf "\n## Storage\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${storage}| sort)" >> "$MAIN_FILE"
-printf "\n## Cases\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${case}| sort)" >> "$MAIN_FILE"
-printf "\n## Other Devices\n${DATA_TABLE_HEAD}${DATA_TABLE_ALIGN}%s\n" "$(echo -e ${unknown}| sort)" >> "$MAIN_FILE"
-