8000 Pico 2 and Pico 1 Touch Macropad fixes · Issue #3 · TobiasVanDyk/Pico-MCU-from-Raspberry-Pi · GitHub
[go: up one dir, main page]

Skip to content
Pico 2 and Pico 1 Touch Macropad fixes #3
@TobiasVanDyk

Description

@TobiasVanDyk

PowerAutomateDesktopSendKeys.zip

  • 1 million nKeys macros: This is a very large number of macros to select and configure. At 1000 macros per day (for example for a 10 hour working day it is 100 macros per hour), it will take three years to configure 1 million macros.

  • Caps-Num-Scroll-Lock handling: An interlock was added to this that solves the occasional freezing (note 1), of the TouchPad when booting with a simultaneous change in the state Caps-Num-Scroll-Lock keys. Note 1: Windows 11 does not handle the Caps-Scroll-Lock callback correctly (Linux Debian/Ubuntu/Mint and Windows 10 do), and the freezing referred to is as a result of this. Also see Detect OS using CapsNumScroll Lock.

  • Large Text file processing for nKeys: Can now handle very large text strings strings, preferably stored on SDCard, using nKeys n,o,p,q,r. If nKeys = m,s,t then large strings also enabled for M S T keys 01 - 96. Large strings tested up to 64kB. Keys MST 01-24 are best used for text<200 char and MST 25-96 for large text or use all NKeys NOPQR etc 01-96 for large text. For example copy two large (>10kB) files L1 and S12 on SDCard. Then program nKey n01 with content L1. Use KeyBrd editor with n01 as source in brown not white and add L1[Sav]. Test by pressing key nKey [n01]. Change nKey letter to S with [Cfg][Opt]PadKey[o] then press nKey [S12] - tested both keys both with notepad as the focus.

/////////////////////////////////////
int DoLargeFile(const char *STRf)
/////////////////////////////////////
{ int n, s, dTime = 5, nStrLen = 0;
  File f;

  if (LayerAxD)  if (SDFS.exists(STRf))     f = SDFS.open(STRf, "r");     else return 0;
  if (!LayerAxD) if (LittleFS.exists(STRf)) f = LittleFS.open(STRf, "r"); else return 0;
  
  nStrLen = f.size(); if (nStrLen<ByteSize) dTime = 10; 
  
  while( f.position() < f.size() ) { s = f.readBytes((char *)MacroBuff, sizeof(MacroBuff)); delay(dTime);
                                     n = 0; while (MacroBuff[n]!=0) { usb_hid.keyboardPress(HIDKbrd, MacroBuff[n]); delay(dTime);
                                                                      usb_hid.keyboardRelease(HIDKbrd);             delay(dTime); 
                                                                      n++; if (n>=s) break; } 
                                   } 
  f.close();
  return nStrLen;
}
  • Added *Code processing for nKeys: For example with Source p01 construct *bb*7 in the KeyBrd Editor and press [Sav] (not [EXE] that will execute the star command) A file p01 will be saved with a length of 6 - press [Lst] to list the contents which is 2A 62 62 2A 37 00. Press the key [p01] which will set the normal LCD rightness to level 7.

  • nKeys are similar to a combination of symbolic links in Linux and shortcuts in Windows - as both are redirected files the latter is the term that is used to describe nKeys. As the 24 K1-K24 Link keys used to chain macros, textfiles, nKeys, and *codes in a sequence, are also referred to as "links", using the term (symbolic) links for the nKeys, could be confusing.

Add the code below to void DoNKeys(int Button):

  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // Check for special commands Start with * eg *ab*n n = 0-9 - ignore * codes if double **
  // For example with Source p01 construct *bb*7 in the KeyBrd Editor and press [Sav] (not [EXE] that will execute the star command)
  // A file p01 will be saved with a length of 6 - press [Lst] to list the contents which is 2A 62 62 2A 37 00. Press the key [p01]
  // which will set the normal LCD rightness to level 7
  /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if ((nFile[0]==0x2A)&&(nFile[1]!=0x2A)) 
     {for (n = 0; n < StrLen-1; n++) KeyBrdByte[n] = nFile[n]; KeyBrdByteNum = StrLen;
      if (SendBytesStarCodes()) return; else status("*Code incorrect"); return; }   
  if ((nFile[0]==0x2A)&&(nFile[1]==0x2A)) { for (n = 0; n < StrLen; n++) nFile[n] = nFile[n+1]; StrLen--; }

Also corrected position of check for m s t a k in DoNKeys().

  ////////////////////////////////////////////////////////// Test if 1sr char is m,s,t,a,k or M,S,T,A,K then handle as macro/text file
  // For example with Source m01 construct GUIx in the KeyBrd Editor and press [EXE] then [Up] key to save. A file m01 will be saved 
  // with a length of 3 - press [Lst] to list the contents which is E3 1B 00. Exit the KeyBrd and then press [Cfg][ and then press [Opt]
  // until the nKeys character choice shows - press the option Pad [o] until m shows as the nKey character press [L2][L3][L4] and then 
  // key [M01] and the Windows Menu will open. Press [L1] thn press Pad [n] and then press nKey [m01] and the Windows Menu will also
  // open.
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  // which will set the normal LCD rightness to level 7 
  a = NKeysX[Button][0];  strcpy(MSTAName, NKeysX[Button]); 
  for (n=0; n<10; n++) if (a==MacroChar[n]) { if (MacroKeys(c, 3)) return; }   // mstak-MSTAK files is macro/string 
  • Pico 2's have now been acquired from the local Pishop.co.za

Note that the Touch Macro Pad code presented below works fine for a Pico 2 provided the touch frequency is set to below 2.5MHz and setting it to 1 MHz or even 250kHz works fine. Translating the Pico 1 RTC code into TimeLib.h code has been completed.

  • ST7789 LCD Macropad and TFT_eSP V2.5.43 fix:
    Recommended fix: Replace line 52 in the file Processors/TFT_eSPI_RP2040.h with the line as below:
  // Processor specific code used by SPI bus transaction begin/end_tft_write functions
  #define SET_BUS_WRITE_MODE spi_set_format(SPI_X,  8, (spi_cpol_t)(TFT_SPI_MODE >> 1), (spi_cpha_t)(TFT_SPI_MODE & 0x1), SPI_MSB_FIRST)
  // Old line
  //#define SET_BUS_READ_MODE  spi_set_format(SPI_X,  8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST)
  // New line see https://github.com/Bodmer/TFT_eSPI/discussions/3561
  #define SET_BUS_READ_MODE  spi_set_format(SPI_X,  8, (spi_cpol_t)(TFT_SPI_MODE >> 1), (spi_cpha_t)(TFT_SPI_MODE & 0x1), SPI_MSB_FIRST)

Also see: https://github.com/Bodmer/TFT_eSPI/issues/3684

So I checked the differences between the two versions of the code.
And I found in TFT_eSPI_RP2040.h

// version 2.5.34
#define SET_BUS_READ_MODE  // spi_set_format(SPI_X,  8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST)

// version  version 2.5.43
#define SET_BUS_READ_MODE  spi_set_format(SPI_X,  8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST)

So I change this macro to version 2.5.34, that is commenting out spi_set_format, the code works fine now.
I found using #define RP2040_PIO_SPI macro in User_setup.h also works fine without changing this macro.

Also try adding: #define TFT_SPI_MODE SPI_MODE0 to TFT_eSPI.h refer to:

https://github.com/Bodmer/TFT_eSPI/issues/3564
It seems that the problem with the black screen depends on this op
861B
tion:
// Some ST7789 boards do not work with Mode 0
#ifndef TFT_SPI_MODE
  #if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER)
    #define TFT_SPI_MODE SPI_MODE3
  #else
    #define TFT_SPI_MODE SPI_MODE0
  #endif
#endif
The display works only if SPI_MODE0 mode is selected

Newer fixes: Use the 3files or 2files fix when using TFT_eSPI-Bodmer version 2.5.43 and also read this

Working2Files.zip
WorkingFiles3Files.zip

Old fix: To obtain a working Touch-Macropad for the the Waveshare IPS ST7789 LCD Pico Board 320x240 2.8 inch using Bodmer TFT_eSPI version 2.5.43 replace the file Processors/TFT_eSPI_RP2040.h with the same file from the previous version V2.5.34.

Also see the comment Bodmer/TFT_eSPI/issues/3476: For file TFT_eSPI_RP2040.h

Replace:
2.5.43 #define SET_BUS_READ_MODE  spi_set_format(SPI_X,  8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST)
With:
2.5.34 #define SET_BUS_READ_MODE  // spi_set_format(SPI_X,  8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST)
  • Choosing an LCD Touch Display: Of the 5 different LCD displays tested here, with the firmware as attached below, my favourite is the fast Waveshare 3.5 inch Type C 125MHz LCD display (even though it is not an IPS screen). It is available here.

  • Win11 24H2 new icon-bar with labels is good! - but you do not need icons here - they could have used buttons labelled Cut-Copy-Rename-Delete.

Old Win11 22H2:
Win11Icons

New Win11 24H2:
Win11-not-obtuse-icons

These were the really good old days when Windows usability still included user personalization and task studies

Image

  • Elgato Stream Deck XL: Whilst a picture may paint a thousand words it is also true that a thousand pictures may need a thousand words - when choosing between many icons you do need labels - try to guess what pressing the keys in the picture below will do - the 6th top row launches a SpaceX rocket and the 6th bottom row aborts the launch? (Dijkstra: A picture may be worth a thousand words, a formula is worth a thousand pictures.)

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentation

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0