Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Javier/dma transfer - #4

Open
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer
Open

Javier/dma transfer#4
Byte-Entropy wants to merge 5 commits into
masterfrom
Javier/DmaTransfer

Conversation

@Byte-Entropy

Copy link
Copy Markdown

Added QSPI and SPI simplex transfers

CopilotAI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds QSPI and SPI simplex (unidirectional) transfer support to the DMA Transfer Driver, expanding beyond the existing full-duplex SPI implementation. The driver now supports transmit-only and receive-only operations for both SPI and QSPI peripherals.

Changes:

  • Added SPI simplex transfer support (transmit-only and receive-only modes) alongside existing full-duplex mode
  • Added QSPI peripheral support with transmit and receive DMA operations
  • Updated documentation to include QSPI in the unified interface feature list and added usage examples for SPI simplex and QSPI transfers
  • Fixed UART comment indentation for consistency

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 6 comments.

FileDescription
Drivers/Inc/DMATransfer.hppAdded SPI simplex logic with separate transmit/receive paths, implemented QSPI support with transmit/receive operations, added debug error message for unsupported handle types, fixed UART comment indentation
Drivers/DMATransfer_README.mdUpdated Features section to list QSPI_HandleTypeDef, added SPI simplex usage examples, added complete QSPI usage section with transmit/receive examples

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 38 to +51
if constexpr (std::is_same_v<HandleType, SPI_HandleTypeDef>) {
// SPI Transfer (Full-Duplex)
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);

// Transmit Only (Simplex)
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
return HAL_SPI_TransmitReceive_DMA(handle, txData, rxData, size);
}

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The function does not handle the edge case where both txData and rxData are nullptr. In this scenario, the function will fall through all condition checks and return HAL_ERROR (line 99), but this invalid call pattern should be caught and potentially logged or asserted in debug builds before the handle type checks are performed.

Consider adding an early validation check after the cache management section (line 35) to handle this case explicitly, similar to how the debug message is printed for unsupported handle types.

Copilot uses AI. Check for mistakes.
}
}


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 78-79) before the QSPI logic section. For consistency with the rest of the code, there should be only one blank line between sections (as seen between I2C and UART sections at line 67).

Suggested change

Copilot uses AI. Check for mistakes.
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are unnecessary blank lines (lines 97-98) at the end of the function. For consistency with coding style, there should be at most one blank line before the return statement.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +41 to +49
if (txData != nullptr && rxData == nullptr){
return HAL_SPI_Transmit_DMA(handle, txData, size);
}
// Receive Only (Simplex)
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after the closing parenthesis before the opening brace. The code style should have a space between ) and { for consistency. This occurs on lines 41, 45, and 49. The codebase appears to follow this convention based on other conditional statements in the file (e.g., lines 58, 63, 70, 74, 83, 87).

Copilot uses AI. Check for mistakes.
Comment on lines +93 to +98
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif


CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The #ifdef directive has incorrect syntax. The opening brace { should not be on the same line as #ifdef. The preprocessor directive should be on its own line, and the code block should follow on subsequent lines. Additionally, the closing brace } on line 95 should not be inside the #endif block.

The correct syntax should be:

#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Without the braces, or if braces are needed for scoping:

#ifdef SOAR_DEBUG
{
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
Suggested change
#ifdef SOAR_DEBUG {
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
}
#endif
#ifdef SOAR_DEBUG
SOAR_PRINT("DMAControl::Transfer - Unsupported handle type\n");
#endif

Copilot uses AI. Check for mistakes.
Comment on lines +45 to +49
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){

CopilotAIJan 31, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SPI logic uses sequential if statements instead of else if, which is inconsistent with the patterns used for I2C (lines 58-65) and UART (lines 70-76). While functionally equivalent in this case due to the early returns, using else if would be more consistent with the rest of the codebase, more efficient (avoiding unnecessary condition checks), and clearer in intent.

Consider changing lines 45 and 49 to use else if instead of if to match the established pattern in the I2C and UART sections.

Suggested change
if (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
if (txData != nullptr && rxData != nullptr){
elseif (txData == nullptr && rxData != nullptr){
return HAL_SPI_Receive_DMA(handle, rxData, size);
}
// Full Duplex
elseif (txData != nullptr && rxData != nullptr){

Copilot uses AI. Check for mistakes.
This reverts commit 4ac704e, reversing
changes made to 6235aa9.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Byte-Entropy