diff --git a/OpenAuraSDK/AuraController.cpp b/OpenAuraSDK/AuraController.cpp index ffcce34d..c6abcfcd 100644 --- a/OpenAuraSDK/AuraController.cpp +++ b/OpenAuraSDK/AuraController.cpp @@ -17,49 +17,57 @@ AuraController::AuraController(i2c_smbus_interface* bus, aura_dev_id dev) AuraUpdateDeviceName(); + // Read the device configuration table + for (int i = 0; i < 64; i++) + { + config_table[i] = AuraRegisterRead(AURA_REG_CONFIG_TABLE + i); + } + + // Read LED count from configuration table + led_count = config_table[AURA_CONFIG_LED_COUNT]; + // LED-0116 - First generation motherboard controller if (strcmp(device_name, "LED-0116") == 0) { - direct_reg = AURA_REG_COLORS_DIRECT; - effect_reg = AURA_REG_COLORS_EFFECT; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT; + effect_reg = AURA_REG_COLORS_EFFECT; + channel_cfg = AURA_CONFIG_CHANNEL_V1; } // DIMM_LED-0102 - First generation DRAM controller (Trident Z RGB) else if (strcmp(device_name, "DIMM_LED-0102") == 0) { - direct_reg = AURA_REG_COLORS_DIRECT; - effect_reg = AURA_REG_COLORS_EFFECT; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT; + effect_reg = AURA_REG_COLORS_EFFECT; + channel_cfg = AURA_CONFIG_CHANNEL_V1; } // AUDA0-E6K5-0101 - Second generation DRAM controller (Geil Super Luce) else if (strcmp(device_name, "AUDA0-E6K5-0101") == 0) { - direct_reg = AURA_REG_COLORS_DIRECT_V2; - effect_reg = AURA_REG_COLORS_EFFECT_V2; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT_V2; + effect_reg = AURA_REG_COLORS_EFFECT_V2; + channel_cfg = AURA_CONFIG_CHANNEL_V2; } // AUMA0-E6K5-0106 - Second generation motherboard controller else if (strcmp(device_name, "AUMA0-E6K5-0106") == 0) { - direct_reg = AURA_REG_COLORS_DIRECT_V2; - effect_reg = AURA_REG_COLORS_EFFECT_V2; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT_V2; + effect_reg = AURA_REG_COLORS_EFFECT_V2; + channel_cfg = AURA_CONFIG_CHANNEL_V2; } // AUMA0-E6K5-0105 - Second generation motherboard controller else if (strcmp(device_name, "AUMA0-E6K5-0105") == 0) { - direct_reg = AURA_REG_COLORS_DIRECT_V2; - effect_reg = AURA_REG_COLORS_EFFECT_V2; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT_V2; + effect_reg = AURA_REG_COLORS_EFFECT_V2; + channel_cfg = AURA_CONFIG_CHANNEL_V2; } // Assume first generation controller if string does not match else { - direct_reg = AURA_REG_COLORS_DIRECT; - effect_reg = AURA_REG_COLORS_EFFECT; - led_count = 5; + direct_reg = AURA_REG_COLORS_DIRECT; + effect_reg = AURA_REG_COLORS_EFFECT; + channel_cfg = AURA_CONFIG_CHANNEL_V1; } - } AuraController::~AuraController() @@ -72,6 +80,57 @@ char * AuraController::GetDeviceName() return(device_name); } +unsigned char AuraController::GetChannel(unsigned int led) +{ + return(config_table[channel_cfg + led]); +} + +const char * AuraController::GetChannelName(unsigned int led) +{ + switch (config_table[channel_cfg + led]) + { + case (unsigned char)AURA_LED_CHANNEL_AUDIO: + return(aura_channels[0]); + break; + + case (unsigned char)AURA_LED_CHANNEL_BACKPLATE: + return(aura_channels[1]); + break; + + case (unsigned char)AURA_LED_CHANNEL_BACK_IO: + return(aura_channels[2]); + break; + + case (unsigned char)AURA_LED_CHANNEL_CENTER: + return(aura_channels[3]); + break; + + case (unsigned char)AURA_LED_CHANNEL_CENTER_START: + return(aura_channels[4]); + break; + + case (unsigned char)AURA_LED_CHANNEL_DRAM: + return(aura_channels[5]); + break; + + case (unsigned char)AURA_LED_CHANNEL_PCIE: + return(aura_channels[6]); + break; + + case (unsigned char)AURA_LED_CHANNEL_RGB_HEADER: + return(aura_channels[7]); + break; + + case (unsigned char)AURA_LED_CHANNEL_RGB_HEADER_2: + return(aura_channels[8]); + break; + + default: + return(aura_channels[9]); + break; + } +} + unsigned int AuraController::GetLEDCount() { return(led_count); diff --git a/OpenAuraSDK/AuraController.h b/OpenAuraSDK/AuraController.h index f97c0fe4..3774954b 100644 --- a/OpenAuraSDK/AuraController.h +++ b/OpenAuraSDK/AuraController.h @@ -20,6 +20,7 @@ typedef unsigned short aura_register; enum { AURA_REG_DEVICE_NAME = 0x1000, /* Device String 16 bytes */ + AURA_REG_CONFIG_TABLE = 0x1C00, /* Start of LED configuration bytes */ AURA_REG_COLORS_DIRECT = 0x8000, /* Colors for Direct Mode 15 bytes */ AURA_REG_COLORS_EFFECT = 0x8010, /* Colors for Internal Effects 15 bytes */ AURA_REG_DIRECT = 0x8020, /* "Direct Access" Selection Register */ @@ -50,6 +51,41 @@ enum AURA_NUMBER_MODES /* Number of Aura modes */ }; +enum +{ + AURA_LED_CHANNEL_DRAM_2 = 0x05, /* DRAM LED channel */ + AURA_LED_CHANNEL_CENTER_START = 0x82, /* Center zone first LED channel */ + AURA_LED_CHANNEL_CENTER = 0x83, /* Center zone LED channel */ + AURA_LED_CHANNEL_AUDIO = 0x84, /* Audio zone LED channel */ + AURA_LED_CHANNEL_BACK_IO = 0x85, /* Back I/O zone LED channel */ + AURA_LED_CHANNEL_RGB_HEADER = 0x86, /* RGB Header LED channel */ + AURA_LED_CHANNEL_RGB_HEADER_2 = 0x87, /* RGB Header 2 LED channel */ + AURA_LED_CHANNEL_BACKPLATE = 0x88, /* Backplate zone LED channel */ + AURA_LED_CHANNEL_DRAM = 0x8A, /* DRAM LED channel */ + AURA_LED_CHANNEL_PCIE = 0x8B, /* PCIe zone LED channel */ +}; + +static const char* aura_channels[] = /* Aura channel strings */ +{ + "Audio", + "Backplate", + "Back I/O", + "Center", + "Center", + "DRAM", + "PCIe", + "RGB Header", + "RGB Header 2", + "Unknown", +}; + +enum +{ + AURA_CONFIG_LED_COUNT = 0x02, /* LED Count configuration offset */ + AURA_CONFIG_CHANNEL_V1 = 0x13, /* LED Channel configuration offset */ + AURA_CONFIG_CHANNEL_V2 = 0x1B, /* LED Channel V2 configuration offset */ +}; + class AuraController { public: @@ -57,6 +93,8 @@ public: ~AuraController(); char* GetDeviceName(); + unsigned char GetChannel(unsigned int led); + const char* GetChannelName(unsigned int led); unsigned int GetLEDCount(); void SetAllColorsDirect(unsigned char red, unsigned char green, unsigned char blue); void SetAllColorsEffect(unsigned char red, unsigned char green, unsigned char blue); @@ -73,9 +111,11 @@ public: private: char device_name[16]; + unsigned char config_table[64]; unsigned int led_count; aura_register direct_reg; aura_register effect_reg; + unsigned char channel_cfg; i2c_smbus_interface * bus; aura_dev_id dev; diff --git a/OpenAuraSDK/OpenAuraSDKDialog.cpp b/OpenAuraSDK/OpenAuraSDKDialog.cpp index 98098a5d..2e1274a3 100644 --- a/OpenAuraSDK/OpenAuraSDKDialog.cpp +++ b/OpenAuraSDK/OpenAuraSDKDialog.cpp @@ -24,7 +24,6 @@ BEGIN_MESSAGE_MAP(OpenAuraSDKDialog, CDialogEx) ON_BN_CLICKED(IDC_BUTTON_OPENAURASDK_I2CDETECT, &OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkI2cdetect) ON_CBN_CLOSEUP(IDC_COMBO_OPENAURASDK_DEVICE, &OpenAuraSDKDialog::OnCbnCloseupComboOpenaurasdkDevice) ON_BN_CLICKED(IDC_BUTTON_OPENAURASDK_SET_COLORS_ALL, &OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkSetColorsAll) - ON_BN_CLICKED(IDC_BUTTON_OPENAURASDK_DUMP, &OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkDump) ON_CBN_CLOSEUP(IDC_COMBO_OPENAURASDK_MODE, &OpenAuraSDKDialog::OnCbnCloseupComboOpenaurasdkMode) ON_BN_CLICKED(IDC_BUTTON_OPENAURASDK_SET_ZONE, &OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkSetZone) END_MESSAGE_MAP() @@ -34,6 +33,7 @@ BOOL OpenAuraSDKDialog::OnInitDialog() CComboBox* controller_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_DEVICE); CComboBox* mode_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_MODE); CComboBox* zone_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_ZONE); + CComboBox* led_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_LED); for (int i = 0; i < controllers.size(); i++) { @@ -51,11 +51,18 @@ BOOL OpenAuraSDKDialog::OnInitDialog() for (int i = 0; i < controllers[0]->zones.size(); i++) { - mode_box->AddString(controllers[0]->zones[i].name.c_str()); + zone_box->AddString(controllers[0]->zones[i].name.c_str()); } zone_box->SetCurSel(0); + for (int i = 0; i < controllers[0]->leds.size(); i++) + { + led_box->AddString(controllers[0]->leds[i].name.c_str()); + } + + led_box->SetCurSel(0); + return TRUE; } @@ -86,6 +93,7 @@ void OpenAuraSDKDialog::OnCbnCloseupComboOpenaurasdkDevice() CComboBox* controller_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_DEVICE); CComboBox* mode_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_MODE); CComboBox* zone_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_ZONE); + CComboBox* led_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_LED); mode_box->ResetContent(); @@ -98,20 +106,23 @@ void OpenAuraSDKDialog::OnCbnCloseupComboOpenaurasdkDevice() zone_box->ResetContent(); - for (int i = 0; i < controllers[0]->zones.size(); i++) + for (int i = 0; i < controllers[controller_box->GetCurSel()]->zones.size(); i++) { - mode_box->AddString(controllers[0]->zones[i].name.c_str()); + zone_box->AddString(controllers[controller_box->GetCurSel()]->zones[i].name.c_str()); } zone_box->SetCurSel(0); + + led_box->ResetContent(); + + for (int i = 0; i < controllers[controller_box->GetCurSel()]->leds.size(); i++) + { + led_box->AddString(controllers[controller_box->GetCurSel()]->leds[i].name.c_str()); + } + + led_box->SetCurSel(0); } -void OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkDump() -{ - -} - - void OpenAuraSDKDialog::OnCbnCloseupComboOpenaurasdkMode() { CComboBox* controller_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_DEVICE); @@ -134,3 +145,18 @@ void OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkSetZone() controllers[controller_box->GetCurSel()]->SetAllZoneLEDs(zone_box->GetCurSel(), color); } + + +void OpenAuraSDKDialog::OnBnClickedButtonOpenaurasdkSetColorsLed() +{ + CComboBox* controller_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_DEVICE); + CComboBox* led_box = (CComboBox*)GetDlgItem(IDC_COMBO_OPENAURASDK_LED); + + RGBColor color = ToRGBColor( + GetDlgItemInt(IDC_EDIT_OPENAURASDK_LED_0_R), + GetDlgItemInt(IDC_EDIT_OPENAURASDK_LED_0_G), + GetDlgItemInt(IDC_EDIT_OPENAURASDK_LED_0_B) + ); + + controllers[controller_box->GetCurSel()]->SetLED(led_box->GetCurSel(), color); +} diff --git a/OpenAuraSDK/OpenAuraSDKDialog.h b/OpenAuraSDK/OpenAuraSDKDialog.h index d8c3901d..72c969a1 100644 --- a/OpenAuraSDK/OpenAuraSDKDialog.h +++ b/OpenAuraSDK/OpenAuraSDKDialog.h @@ -27,12 +27,11 @@ protected: public: afx_msg void OnBnClickedButtonOpenaurasdkI2cdetect(); - afx_msg void OnBnClickedButtonOpenaurasdkSetColors(); afx_msg void OnCbnCloseupComboOpenaurasdkDevice(); afx_msg void OnBnClickedButtonOpenaurasdkSetColorsAll(); - afx_msg void OnBnClickedButtonOpenaurasdkDump(); afx_msg void OnCbnCloseupComboOpenaurasdkMode(); afx_msg void OnBnClickedButtonOpenaurasdkSetZone(); + afx_msg void OnBnClickedButtonOpenaurasdkSetColorsLed(); }; #endif diff --git a/OpenAuraSDK/RGBController_Aura.cpp b/OpenAuraSDK/RGBController_Aura.cpp index 70666cb9..7243921b 100644 --- a/OpenAuraSDK/RGBController_Aura.cpp +++ b/OpenAuraSDK/RGBController_Aura.cpp @@ -90,6 +90,8 @@ void RGBController_Aura::SetLED(int led, RGBColor color) RGBController_Aura::RGBController_Aura(AuraController * aura_ptr) { + std::vector aura_channels; + aura = aura_ptr; name = aura->GetDeviceName(); @@ -119,26 +121,58 @@ RGBController_Aura::RGBController_Aura(AuraController * aura_ptr) for (int i = 0; i < aura->GetLEDCount(); i++) { + aura_channels.push_back(aura->GetChannel(i)); + led* new_led = new led(); - new_led->name = "Aura LED"; + new_led->name = aura->GetChannelName(i); leds.push_back(*new_led); } - zone new_zone; + std::vector aura_zones; - new_zone.name = "Aura Zone"; - new_zone.type = ZONE_TYPE_LINEAR; - - std::vector zone_row; - - for (int i = 0; i < aura->GetLEDCount(); i++) + // Search through all LEDs and create zones for each channel type + for (int i = 0; i < aura_channels.size(); i++) { - zone_row.push_back(i); + bool matched = false; + + // Search through existing zones to make sure we don't create a duplicate zone + for (int j = 0; j < aura_zones.size(); j++) + { + if (aura_channels[i] == aura_zones[j]) + { + matched = true; + } + } + + // If zone does not already exist, create it + if (matched == false) + { + zone* new_zone = new zone(); + std::vector* zone_row = new std::vector(); + + // Set zone name to channel name + new_zone->name = aura->GetChannelName(i); + + // Find all LEDs with this channel type and add them to zone + for (int j = 0; j < aura->GetLEDCount(); j++) + { + if (aura->GetChannel(j) == aura_channels[i]) + { + zone_row->push_back(j); + } + } + + // Aura devices can be either single or linear, never matrix + // That means only one row is needed + new_zone->map.push_back(*zone_row); + + // Save channel to aura_zones so we know not to create another zone with this channel + aura_zones.push_back(aura_channels[i]); + + // Push new zone to zones vector + zones.push_back(*new_zone); + } } - - new_zone.map.push_back(zone_row); - - zones.push_back(new_zone); } \ No newline at end of file diff --git a/OpenAuraSDK/Resource.rc b/OpenAuraSDK/Resource.rc index e3913908..61333b89 100644 Binary files a/OpenAuraSDK/Resource.rc and b/OpenAuraSDK/Resource.rc differ diff --git a/OpenAuraSDK/resource.h b/OpenAuraSDK/resource.h index 67fd5715..e5a296b4 100644 --- a/OpenAuraSDK/resource.h +++ b/OpenAuraSDK/resource.h @@ -24,6 +24,8 @@ #define IDC_BUTTON_OPENAURASDK_SET_COLORS_ALL 1019 #define IDC_COMBO_OPENAURASDK_DEVICE 1020 #define IDC_EDIT_OPENAURASDK_LED_1_R 1021 +#define IDC_BUTTON_OPENAURASDK_SET_COLORS_ALL2 1021 +#define IDC_BUTTON_OPENAURASDK_SET_COLORS_LED 1021 #define IDC_EDIT_OPENAURASDK_LED_1_G 1022 #define IDC_EDIT_OPENAURASDK_LED_1_B 1023 #define IDC_EDIT_OPENAURASDK_LED_2_R 1024 @@ -43,6 +45,7 @@ #define IDC_COMBO_OPENAURASDK_DEVICE2 1035 #define IDC_COMBO_OPENAURASDK_MODE 1035 #define IDC_COMBO_OPENAURASDK_ZONE 1036 +#define IDC_COMBO_OPENAURASDK_LED 1037 // Next default values for new objects //