From 8392daa9ac3c5da144876295a0b50305ec2c42da Mon Sep 17 00:00:00 2001 From: lexcibien Date: Thu, 5 Mar 2026 23:29:46 -0300 Subject: [PATCH 01/24] implement translation on savvyCAN --- .gitignore | 3 +++ main.cpp | 13 +++++++++++++ scripts/build_translations.sh | 12 ++++++++++++ scripts/edit_translations.sh | 6 ++++++ scripts/update_translations.sh | 11 +++++++++++ 5 files changed, 45 insertions(+) create mode 100755 scripts/build_translations.sh create mode 100755 scripts/edit_translations.sh create mode 100755 scripts/update_translations.sh diff --git a/.gitignore b/.gitignore index 13068cd..d976787 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ build/ *.o *.obj +# Compiled translations +*.qm + # Precompiled Headers *.gch *.pch diff --git a/main.cpp b/main.cpp index df2f4a4..be139e6 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,7 @@ #include "mainwindow.h" #include +#include +#include class SavvyCANApplication : public QApplication { @@ -32,6 +34,17 @@ int main(int argc, char *argv[]) SavvyCANApplication a(argc, argv); + QTranslator translator; + QLocale locale = QLocale::system(); + QString lang = locale.name(); + QString shortLang = locale.name().left(2); // pt + + if (!translator.load("savvycan_" + lang, "translations")) + { + translator.load("savvycan_" + lang, "translations"); + } + a.installTranslator(&translator); + //Add a local path for Qt extensions, to allow for per-application extensions. a.addLibraryPath("plugins"); diff --git a/scripts/build_translations.sh b/scripts/build_translations.sh new file mode 100755 index 0000000..fa05d08 --- /dev/null +++ b/scripts/build_translations.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" +TRANSLATIONS_DIR="$PROJECT_ROOT/translations" + +echo "Gerando arquivos .qm..." + +for file in "$TRANSLATIONS_DIR"/*.ts; do + lrelease "$file" +done + +echo "Arquivos .qm gerados." \ No newline at end of file diff --git a/scripts/edit_translations.sh b/scripts/edit_translations.sh new file mode 100755 index 0000000..8347bf2 --- /dev/null +++ b/scripts/edit_translations.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" +TRANSLATIONS_DIR="$PROJECT_ROOT/translations" + +linguist "$TRANSLATIONS_DIR"/savvycan_*.ts \ No newline at end of file diff --git a/scripts/update_translations.sh b/scripts/update_translations.sh new file mode 100755 index 0000000..ac32455 --- /dev/null +++ b/scripts/update_translations.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" +TRANSLATIONS_DIR="$PROJECT_ROOT/translations" + +echo "Atualizando arquivos de tradução..." + +lupdate "$PROJECT_ROOT" \ +-ts "$TRANSLATIONS_DIR"/savvycan_*.ts + +echo "Traduções atualizadas." \ No newline at end of file From f4468163bae4c6f760fee9b69af481474ec5e4a5 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Thu, 5 Mar 2026 23:30:03 -0300 Subject: [PATCH 02/24] adding portuguese brazilian translation to app --- SavvyCAN.desktop | 4 + translations/pt_BR.qph | 47 + translations/savvycan_en.ts | 4158 +++++++++++++++++++++++++++++++ translations/savvycan_pt_BR.ts | 4161 ++++++++++++++++++++++++++++++++ 4 files changed, 8370 insertions(+) create mode 100644 translations/pt_BR.qph create mode 100644 translations/savvycan_en.ts create mode 100644 translations/savvycan_pt_BR.ts diff --git a/SavvyCAN.desktop b/SavvyCAN.desktop index 076ee6a..76585ed 100644 --- a/SavvyCAN.desktop +++ b/SavvyCAN.desktop @@ -1,11 +1,15 @@ [Desktop Entry] Type=Application Name=SavvyCAN +Name[pt_BR]=SavvyCAN GenericName=CANBus reverse engineering tool +GenericName[pt_BR]=Ferramenta Rede CAN de engenharia reversa Comment=Facilitates reverse engineering of canbus captures +Comment[pt_BR]=Facilitar engenharia reversa de capturas de Rede CAN Exec=SavvyCAN Icon=SavvyCAN Terminal=false Categories=Development;Electronics;IDE; MimeType=text/x-application; Keywords=embedded electronics;electronics;canbus;reverse engineering; +Keywords[pt_BR]=eletronica embarcada;eletronicos;canbus;engenharia reversa; diff --git a/translations/pt_BR.qph b/translations/pt_BR.qph new file mode 100644 index 0000000..cb6f173 --- /dev/null +++ b/translations/pt_BR.qph @@ -0,0 +1,47 @@ + + + + New + Novo + + + Save + Salvar + + + Cancel + Cancelar + + + Connect + Conectar + + + Disconnect + Desconectar + + + Yes + Sim + + + No + Não + + + Bus + Barramento + + + Frame + Frame + + + Frames + Frames + + + Scan + Varredura + + diff --git a/translations/savvycan_en.ts b/translations/savvycan_en.ts new file mode 100644 index 0000000..7129952 --- /dev/null +++ b/translations/savvycan_en.ts @@ -0,0 +1,4158 @@ + + + + + BisectWindow + + + + Bisector Window + + + + + + Splitting Strategy: + + + + + + ID Range + + + + + + TO + + + + + + Frame Number + + + + + + Percentage + + + + + + Bus Number + + + + + + Save Which Side: + + + + + + Lower Section + + + + + + Upper Section + + + + + + Number of Frames in Main List: + + + + + + + + 0 + + + + + + Saved Frames after split: + + + + + + Calculate Split + + + + + + Save split frames to a new file + + + + + + Replace main list with split frames + + + + + Successfully saved file + + + + + Error while attempting to save. + + + + + CANBridgeWindow + + + + CAN Bridger + + + + + + Side 1 + + + + + + + + Enable forwarding + + + + + + IDs to forward to side 2 + + + + + + Side 2 + + + + + + IDs to forward to side 1 + + + + + CANConnectionModel + + + Type + + + + + Subtype + + + + + Port + + + + + Buses + + + + + Status + + + + + CANDataGrid + + + + Form + + + + + CANFrameModel + + + Rx + + + + + Tx + + + + + Time Delta + + + + + Timestamp + + + + + ID + + + + + Ext + + + + + RTR + + + + + Cnt + + + + + Dir + + + + + Bus + + + + + Len + + + + + ASCII + + + + + Data + + + + + ConnectionWindow + + + + Connection Settings + + + + + + Disconnect Selected Device + + + + + + Reset Selected Device + + + + + + Bus Details: + + + + + + Speed: + + + + + + Listen Only: + + + + + + Enable Bus: + + + + + + Save Bus Settings + + + + + + Enable CAN FD: + + + + + + CAN FD Data Rate + + + + + + Connected Devices: + + + + + + Add New Device Connection + + + + + + Enable Console + + + + + + Device Console: + + + + + + Send: + + + + + + Send Hex + + + + + + Send Text + + + + + + Clear + + + + + DBCComparatorWindow + + + + DBC Comparator + + + + + + Side 1 + + + + + + + + TextLabel + + + + + + Load New File + + + + + + Side 2 + + + + + + Load A File + + + + + + Save Details to File + + + + + DBC Files (*.dbc *.DBC) + + + + + Text File (*.txt) + + + + + DBCHandler + + + + DBC File (*.dbc) + + + + + DBCLoadSaveWindow + + + + DBC File Manager + + + + + + Create new DBC + + + + + + Load + + + + + + Remove + + + + + + Move Up + + + + + + Save + + + + + + Edit + + + + + + Move Down + + + + + DBC File (*.dbc) + + + + + Tesla JSON File (*.json) + + + + + Secret CSV Signal Defs (*.csv) + + + + + DBCMainEditor + + + + DBC Editing Window + + + + + + New Node + + + + + + New Message + + + + + + New Signal + + + + + + Delete + + + + + + Find: + + + + + + Search + + + + + + Search Results: 0 of 0 + + + + + + Next + + + + + + Previous + + + + + Delete currently selected message + + + + + Rebase all messages + + + + + Rebase all messages in node + + + + + Duplicate node + + + + + Duplicate node and messages + + + + + DBCMessageEditor + + + + Message Editor + + + + + + Frame ID: + + + + + + Message Name: + + + + + + Frame Length: + + + + + + Text Color: + + + + + + Background Color: + + + + + + Comments: + + + + + + Sending Node: + + + + + + + + Set + + + + + + Sample Colored Output: + + + + + DBCNodeDuplicateEditor + + + + + + Duplicate Node + + + + + + New Node Name: + + + + + + Current Base ID: + + + + + + New Base ID: + + + + + + Cancel + + + + + DBCNodeEditor + + + + Node Editor + + + + + + Node Name: + + + + + + Comments: + + + + + DBCNodeRebaseEditor + + + + Rebase All Node Messages + + + + + + Node Name: + + + + + + Current Base ID: + + + + + + New Base ID: + + + + + + Rebase All Messages in Node + + + + + + Cancel + + + + + DBCSignalEditor + + + + Signal Editor + + + + + + Name: + + + + + + Bit Length: + + + + + + Byte Order + + + + + + LSB First (Little Endian) + + + + + + Type: + + + + + + Scale: + + + + + + Bias: + + + + + + Min Value: + + + + + + Max Value: + + + + + + Units Name: + + + + + + Receiving Node: + + + + + + Multiplexing + + + + + + None + + + + + + Multiplexed + + + + + + Multiplexor + + + + + + Extended + + + + + + Multiplex value + + + + + + Multiplex Parent + + + + + + Comment: + + + + + + Single values has to be separated by semicolons +and the value ranges by hypens +(e.g.: 1;2;5-7) + + + + + + Value Table: + + + + + Error + + + + + The multiplex values field contains errors: +%1 + + + + + Delete currently selected value + + + + + DiscreteStateWindow + + + + Single/Multi State WIndow + + + + + + Candidate Matches: + + + + + + Number of States: + + + + + + Realtime + + + + + + From logged data + + + + + + Toggle Frequency (Seconds) + + + + + + Iterations + + + + + + WAIT + + + + + + Min Bits + + + + + + Max Bits + + + + + + IDs to Scan + + + + + + All + + + + + + None + + + + + + Go for it + + + + + FileComparatorWindow + + + + File Comparator + + + + + + SIDE 1 + + + + + + Single file to compare to side 2: + + + + + + + + TextLabel + + + + + + Load New File + + + + + + Side 2 + + + + + + One or more files to compare with the single file on side1: + + + + + + Load A File + + + + + + Clear Frames + + + + + + Show only data unique to Side 1 + + + + + + Save Details to File + + + + + Text File (*.txt) + + + + + FirmwareUploaderWindow + + + + Firmware Updater + + + + + + Loaded File: + + + + + + Load File + + + + + + Device Token: + + + + + + CAN Bus: + + + + + + Base Address: + + + + + + X of Y bytes + + + + + + Start Upload + + + + + Raw firmware binary (*.bin) + + + + + FlowViewWindow + + + + Flow View + + + + + + Playback Control + + + + + + Playback Speed: + + + + + + Loop Playback + + + + + + Current Frame: + + + + + + X of Y + + + + + + Live Mode (No Playback) + + + + + + Synchronize windows + + + + + + Graph by timestamp + + + + + + Auto Reference + + + + + + Reference Values (Hex) + + + + + + + + + + + + 0 + + + + + + + + + + + + 1 + + + + + + + + + + + + 2 + + + + + + + + + + + + 3 + + + + + + + + + + + + 4 + + + + + + + + + + + + 5 + + + + + + + + + + + + 6 + + + + + + + + + + + + 7 + + + + + + Current Values (Hex) + + + + + + Data Seek Values + + + + + + + + + + + + + + + + + + + + -1 + + + + + + Chart range + + + + + + 50 + + + + + + Timeline: + + + + + + Frame IDs Found: + + + + + + Save image to file + + + + + PDF Files (*.pdf) + + + + + + PNG Files (*.png) + + + + + + JPEG Files (*.jpg) + + + + + of + + + + + FrameFileIO + + + + + GVRET Logs (*.csv *.CSV) + + + + + + CRTD Logs (*.crt *.crtd *.CRT *.CRTD) + + + + + + Generic ID/Data CSV (*.csv *.CSV) + + + + + + BusMaster Log (*.log *.LOG) + + + + + + Microchip Log (*.can *.CAN *.log *.LOG) + + + + + Vector Trace Files (*.trace *.TRACE) + + + + + + IXXAT MiniLog (*.csv *.CSV) + + + + + CAN-DO Log (*.can *.avc *.evc *.qcc *.CAN *.AVC *.EVC *.QCC) + + + + + + Vehicle Spy (*.csv *.CSV) + + + + + Candump/Kayak (*.log) + + + + + + Cabana Log (*.csv *.CSV) + + + + + + CANalyzer Ascii Log (*.asc *.ASC) + + + + + CARBUS Analyzer (*.trc *.TRC) + + + + + Autodetect File Type (*.*) + + + + + Vector trace files (*.trace *.TRACE) + + + + + CAN-DO Log (*.avc *.can *.evc *.qcc *.AVC *.CAN *.EVC *.QCC) + + + + + Candump/Kayak (*.log *.LOG) + + + + + CANDump Lawicel (*.txt *.TXT *.LOG *.log) + + + + + PCAN Viewer (*.trc *.TRC) + + + + + Kvaser Log Decimal (*.txt *.TXT) + + + + + Kvaser Log Hex (*.txt *.TXT) + + + + + CANalyzer Binary Log Files (*.blf *.BLF) + + + + + CARBUS Analyzer Trace Files (*.trc *.TRC) + + + + + CANHacker Trace Files (*.trc *.TRC) + + + + + CANOpen Magic (*.csv *.CSV) + + + + + Tesla Autopilot Snapshot (*.CAN *.can) + + + + + CLX000 (*.txt *.TXT) + + + + + CANServer Binary Log (*.log *.LOG) + + + + + Wireshark (*.pcap *.PCAP *.pcapng *.PCAPNG) + + + + + Wireshark SocketCAN (*.pcap *.PCAP + + + + + CXX GVRET-PC Reverse Engineering Tool Output V + + + + + FrameInfoWindow + + + + Detailed Frame Information + + + + + + Frame IDs: + + + + + + Unique IDs + + + + + + Details: + + + + + + Save details to file + + + + + + Interval Histogram + + + + + + Bytes Graph + + + + + + unique ids) + + + + + J1939 decoding + + + + + Broadcast Frame + + + + + Destination ID: + + + + + Destination ID: Global (ALL) + + + + + Priority: + + + + + SRC: + + + + + EDP: + + + + + DP: + + + + + PGN: + + + + + PF: + + + + + PS: + + + + + GMLAN 29bit decoding + + + + + Priority bits: + + + + + Arbitration Id: + + + + + Sender Id: + + + + + # of frames: + + + + + + Data Length: + + + + + + to + + + + + Average inter-frame interval: + + + + + Minimum inter-frame interval: + + + + + Maximum inter-frame interval: + + + + + Inter-frame interval variation: + + + + + Interval standard deviation: + + + + + Minimum range to fit 90% of inter-frame intervals: + + + + + Data Byte + + + + + Changed bits: 0x + + + + + Range: + + + + + Histogram + + + + + Bitfield Histogram + + + + + Bitchange Heatmap + + + + + Text File (*.txt) + + + + + FramePlaybackWindow + + + + Playback + + + + + + Use original frame timing from captured frames + + + + + + Wait for traffic before starting playback + + + + + + Playback speed (ms): + + + + + + Burst Rate: + + + + + + Current Playback Item: + + + + + + TextLabel + + + + + + Current frame: + + + + + + x of y + + + + + + Loop Sequence + + + + + + Send to CANBus + + + + + + <html><head/><body><p>Playback Sequence:</p></body></html> + + + + + + Load File + + + + + + Load Captured Data + + + + + + Delete Selected + + + + + + ID Filtering: + + + + + + Select all IDs + + + + + + Deselect all IDs + + + + + + Load Filters + + + + + + Save Filters + + + + + + All + + + + + + From File + + + + + Save filter definition to file + + + + + Load filter definition from file + + + + + Filter list (*.ftl) + + + + + Filter List (*.ftl) + + + + + + of + + + + + FrameSenderWindow + + + + Frame Sender + + + + + + Enable All + + + + + + Disable All + + + + + + Clear Grid + + + + + + Load to Grid + + + + + + Save Grid + + + + + + Frame Sender Definition (*.fsd) + + + + + FuzzingWindow + + + + Fuzzing Window + + + + + + Interframe Timing (ms) + + + + + + Number of data bytes + + + + + + Burst Rate + + + + + + Bus or Buses to Send On + + + + + + ID Scanning + + + + + + Seqential + + + + + + + + Random + + + + + + ID Selection + + + + + + Range of IDs + + + + + + Filter List + + + + + + Bit Scanning + + + + + + Sequential + + + + + + Sweep + + + + + + IDs + + + + + + Start ID: + + + + + + End ID: + + + + + + + All + + + + + + None + + + + + + Byte Values (Always in hexadecimal) + + + + + + 0 + + + + + + 1 + + + + + + 2 + + + + + + 3 + + + + + + 4 + + + + + + 5 + + + + + + 6 + + + + + + 7 + + + + + + 8 + + + + + + 9 + + + + + + 10 + + + + + + 11 + + + + + + 12 + + + + + + 13 + + + + + + 14 + + + + + + 15 + + + + + + White = Bit always 0, Green = Fuzz Bit, Black = Bit always set, Gray = Past end of data bytes + + + + + + All High + + + + + + All Low + + + + + + All Auto + + + + + + Start Fuzzing + + + + + + # of sent frames: + + + + + GraphingWindow + + + + Data Graphing + + + + + Move to top left + + + + + Move to top center + + + + + Move to top right + + + + + Move to bottom right + + + + + Move to bottom left + + + + + Save graph image to file + + + + + Save graph definitions to file + + + + + Load graph definitions from file + + + + + Save spreadsheet of data + + + + + Follow end of graph + + + + + Add new graph + + + + + Edit selected graph + + + + + Remove selected graph + + + + + Remove all graphs + + + + + Reset View + + + + + Rescale to data + + + + + Zoom In + + + + + Zoom Out + + + + + PDF Files (*.pdf) + + + + + PNG Files (*.png) + + + + + JPEG Files (*.jpg) + + + + + Spreadsheet (*.csv) + + + + + + Graph definition (*.gdf) + + + + + HelpWindow + + + + SavvyCAN Help + + + + + ISOTP_InterpreterWindow + + + + ISO-TP Decoder + + + + + + Interpreted Messages Overview + + + + + + Interpret Previously Captured Frames + + + + + + Clear Messages List + + + + + + Save List + + + + + + Show incomplete and/or corrupted messages + + + + + + Use extended addressing + + + + + + Data Details of Selected Message + + + + + + IDs to Decode + + + + + + All + + + + + + None + + + + + Text File (*.txt) + + + + + Raw Payload: + + + + + MainSettingsDialog + + + + Main Settings + + + + + + Main Form Settings: + + + + + + Autoscroll main frame window by default + + + + + + Maximum data bytes per line + + + + + + General Settings: + + + + + + Save/Restore window positions and sizes + + + + + + Save/Restore CAN bus connections + + + + + + Display values as hexadecimal + + + + + + Require validation of GVRET connection + + + + + + Use filtered frames in sub-windows + + + + + + OpenGL Accelerated AntiAliased Graphing + + + + + + CAN Frame Pre-allocation Size + + + + + + Time Keeping + + + + + + Seconds/Milli/Micro are dongle based + + + + + + Seconds + + + + + + Microseconds + + + + + + Milliseconds + + + + + + System Clock + + + + + + Time Format String: + + + + + + Use absolute time in decoded CSV output + + + + + + Font + + + + + + Use fixed-width font in tables + + + + + + Size + + + + + + Flowview Settings: + + + + + + Use timestamp mode by default + + + + + + Set Auto Reference by default + + + + + + + + Hexadecimal Graph Y Axis + + + + + + Playback Window Settings: + + + + + + Loop by default + + + + + + Default playback speed (ms) + + + + + + Default Sending Bus + + + + + + DBC Settings + + + + + + Label DBC messages by default + + + + + + Ignore DBC message colors + + + + + + File Info and Comparator Settings: + + + + + + Auto expand all nodes + + + + + + MQTT Remote CAN Settings: + + + + + + Host: + + + + + + Port: + + + + + + User Name: + + + + + + Password + + + + + + Some settings will not take effect until the application is restarted + + + + + None + + + + + 0 + + + + + 1 + + + + + All + + + + + From File + + + + + MainWindow + + + + SavvyCAN + + + + + + Remote Connection Active: + + + + + + Total Frames Captured: + + + + + + Frames Per Second: + + + + + + Suspend Capturing + + + + + + Normalize Frame Timing + + + + + + Clear Frames + + + + + + Keep Filters When Clearing + + + + + + Auto Scroll Window + + + + + + Overwrite Mode + + + + + + Interpret Frames + + + + + + Expand All Rows + + + + + + Collapse All Rows + + + + + + Bus Filtering: + + + + + + Frame Filtering: + + + + + + All + + + + + + None + + + + + + RE Tools + + + + + + Send Frames + + + + + + File + + + + + + Connection + + + + + + Playback + + + + + + Custom + + + + + + Flow View + + + + + + Fuzzy Scope + + + + + + New Graphing Window + + + + + + Load Log File + + + + + + Ctrl+O + + + + + + Save Log File + + + + + + Frame Data Analysis + + + + + + Load DBC File + + + + + + Edit Messages/Signals + + + + + + Save DBC File + + + + + + Save Decoded Frames + + + + + + Exit Application + + + + + + File Comparison + + + + + + Preferences + + + + + + Save Filtered Log File + + + + + + Load Filter Definition + + + + + + Save Filter Definition + + + + + + Firmware Uploader + + + + + + Open Connection Window + + + + + + Connect + + + + + + Scripting Interface + + + + + + Range State + + + + + + Single/Multi State + + + + + + DBC File Manager + + + + + + Fuzzing + + + + + + UDS Scanner + + + + + + ISO-TP Decoder + + + + + + Sniffer + + + + + + Firmware Update + + + + + + MotorControlConfig + + + + + + Capture Bisector + + + + + + Signal Viewer + + + + + + + Start Continuous Logging + + + + + + Temporal Graph + + + + + + DBC Comparison + + + + + + Save Decoded Frames CSV + + + + + + CAN Bridge + + + + + Connected to 0 buses + + + + + Press F1 on any screen for help + + + + + Add to a new graphing window + + + + + Add to latest graphing window + + + + + Cease Continuous Logging + + + + + Filter list (*.ftl) + + + + + Filter List (*.ftl) + + + + + Text File (*.txt *.TXT) + + + + + CSV File (*.csv *.CSV) + + + + + Year + + + + + Month + + + + + Day + + + + + Hour + + + + + Minute + + + + + Second + + + + + Ms + + + + + Time + + + + + ID + + + + + Bus + + + + + DataLen + + + + + Time: + + + + + ID: + + + + + Ext + + + + + Std + + + + + Bus: + + + + + Data Bytes: + + + + + Connected to + + + + + buses + + + + + No packets loaded + + + + + No file loaded + + + + + MotorControllerConfigWindow + + + + Controller Configuration + + + + + + Load Definition File + + + + + + Refresh + + + + + + Save + + + + + RMS Definition File (*.txt *.TXT) + + + + + NewConnectionDialog + + + + New Connection + + + + + + Connection Type + + + + + + socketcand (SocketCAN over Ethernet) + + + + + + QT SerialBus Devices (SocketCAN, PeakCAN, etc) + + + + + + MQTT Connection + + + + + + Serial Connection (GVRET) + + + + + + Network connection (GVRET) + + + + + + LAWICEL / SLCAN Serial + + + + + + CANserver + + + + + + CANlogserver + + + + + + SerialBus Device Type: + + + + + + Serial Port: + + + + + + Serial Port Speed: + + + + + + CAN Bus Speed: + + + + + + CAN-FD + + + + + + CAN-FD data rate + + + + + + Create New Connection + + + + + NewGraphDialog + + + + Graph Settings + + + + + + <html><head/><body><p>Name:</p></body></html> + + + + + + ID: + + + + + + Start Bit: + + + + + + Graph a DBC Signal: + + + + + + Node: + + + + + + Message: + + + + + + Signal: + + + + + + Copy Signal Parameters + + + + + + Bit Len: + + + + + + Little Endian + + + + + + (LSB First) + + + + + + Signed: + + + + + + Mask: + + + + + + Bias: + + + + + + Scale + + + + + + Stride + + + + + + Associated Bus + + + + + + -1 + + + + + + Only Points + + + + + + Point Style + + + + + + Line Thickness + + + + + + Line Color + + + + + + + + CHANGE + + + + + + Fill Color + + + + + + Add this graph + + + + + QObject + + + The %1 part contains more than one '-' sign + + + + + + + Unable to parse the %1 part to integer + + + + + RangeStateWindow + + + + Range State Window + + + + + + Candidate Signals: + + + + + + Graphical Representation of Selected Signal: + + + + + + Sensitivity + + + + + + Min Signal Size: + + + + + + Max Signal Size: + + + + + + Granularity: + + + + + + Signal Mode: + + + + + + Signed Mode: + + + + + + ID Filter: + + + + + + All + + + + + + None + + + + + + Recalculate Candidate Signals + + + + + Big Endian + + + + + Little Endian + + + + + + Try Both + + + + + Signed Value + + + + + Unsigned Value + + + + + ScriptingWindow + + + + Scripting Interface + + + + + + Public Variables + + + + + + Loaded Scripts + + + + + + &New + + + + + + &Del + + + + + + &Load + + + + + + Script Editing Window + + + + + + &Save + + + + + + Sa&ve As + + + + + + &Revert + + + + + + R&eload + + + + + + Re&compile + + + + + + Log Window + + + + + + &Auto Scroll Log Window + + + + + + Clear Log &Window + + + + + + Save L&og + + + + + + Javascript File (*.js) + + + + + Log File (*.log) + + + + + SignalViewerWindow + + + + Signal Viewer + + + + + + Remove Selected Signal + + + + + + Node + + + + + + Message + + + + + + Signal + + + + + + Add To Viewer + + + + + + Save View + + + + + + Load View + + + + + + Append to View + + + + + + Clear View + + + + + + SignalViewer definition (*.sdf) + + + + + TemporalGraphWindow + + + + Temporal Graph + + + + + TriggerDialog + + + + Trigger Builder + + + + + + Add New + + + + + + Delete + + + + + + Bus + + + + + + Msg ID + + + + + + Signal + + + + + + MS Delay + + + + + + Max Count + + + + + + Signal Value + + + + + + Save And Update + + + + + UDSScanWindow + + + + UDS Scanner + + + + + + Scans To Run + + + + + + Add + + + + + + Delete + + + + + + Load + + + + + + Save + + + + + + Starting ID + + + + + + + + + + + + + + + + + + 0x + + + + + + Ending ID + + + + + + Show "No Reply" + + + + + + Allow adaptive reply offset + + + + + + Bus to scan + + + + + + Maximum reply delay (ms) + + + + + + Reply Offset: + + + + + + Scan Type: + + + + + + Run test in session type: + + + + + + Subfunct Len: + + + + + + Lower Bound: + + + + + + Upper Bound: + + + + + + Increment + + + + + + Lower Service: + + + + + + Upper Service: + + + + + + Results + + + + + + Run All Scans + + + + + + Run Selected Scan + + + + + + Save Scan Results + + + + + + UDS Test Specification (*.uds *.UDS) + + + + + Text File (*.txt) + + + + + snifferWindow + + + + Sniffer + + + + + + Notch + + + + + + Unnotch + + + + + + Mute notched bits + + + + + + Notch Interval + + + + + + + + ms + + + + + + Expire Interval + + + + + + Never Expire IDs + + + + + + Fade inactive bytes + + + + + + View Bits + + + + + + Filters: + + + + + + All + + + + + + None + + + + diff --git a/translations/savvycan_pt_BR.ts b/translations/savvycan_pt_BR.ts new file mode 100644 index 0000000..13ec980 --- /dev/null +++ b/translations/savvycan_pt_BR.ts @@ -0,0 +1,4161 @@ + + + + + BisectWindow + + + + Bisector Window + Janela Bissetriz + + + + + Splitting Strategy: + Estratégia de divisão: + + + + + ID Range + Intervalo de IDs + + + + + TO + PARA + + + + + Frame Number + Número do frame + + + + + Percentage + Percentagem + + + + + Bus Number + Número do Barramento + + + + + Save Which Side: + Salvar qual lado: + + + + + Lower Section + Seção Inferior + + + + + Upper Section + Seção Superior + + + + + Number of Frames in Main List: + Número de Frames na lista principal: + + + + + + + 0 + 0 + + + + + Saved Frames after split: + Frames salvos após divisão: + + + + + Calculate Split + Calcular divisão + + + + + Save split frames to a new file + Salve os frames divididos em um novo arquivo + + + + + Replace main list with split frames + Substitua a lista principal por frames divididos + + + + Successfully saved file + Arquivo salvo com sucesso + + + + Error while attempting to save. + Erro ao tentar salvar. + + + + CANBridgeWindow + + + + CAN Bridger + Ponte CAN + + + + + Side 1 + Lado 1 + + + + + + + Enable forwarding + Ativar encaminhamento + + + + + IDs to forward to side 2 + IDs para encaminhar para o lado 2 + + + + + Side 2 + Lado 2 + + + + + IDs to forward to side 1 + IDs para encaminhar para o lado 1 + + + + CANConnectionModel + + + Type + Tipo + + + + Subtype + Subtipo + + + + Port + Porta + + + + Buses + Barramento + + + + Status + Status + + + + CANDataGrid + + + + Form + Forma + + + + CANFrameModel + + + Rx + Rx + + + + Tx + Tx + + + + Time Delta + Time Delta + + + + Timestamp + Timestamp + + + + ID + ID + + + + Ext + Ext + + + + RTR + RTR + + + + Cnt + Cnt + + + + Dir + Dir + + + + Bus + Bus + + + + Len + Len + + + + ASCII + ASCII + + + + Data + Data + + + + ConnectionWindow + + + + Connection Settings + Configurações de conexão + + + + + Disconnect Selected Device + Desconectar dispositivo selecionado + + + + + Reset Selected Device + Redefinir dispositivo selecionado + + + + + Bus Details: + Detalhes do Barramento: + + + + + Speed: + Velocidade: + + + + + Listen Only: + Escutar apenas: + + + + + Enable Bus: + Habilitar barramento: + + + + + Save Bus Settings + Salvar configurações do barramento + + + + + Enable CAN FD: + Ativar CAN FD: + + + + + CAN FD Data Rate + Taxa de dados CAN FD + + + + + Connected Devices: + Dispositivos conectados: + + + + + Add New Device Connection + Adicionar nova conexão de dispositivo + + + + + Enable Console + Habilitar console + + + + + Device Console: + Console do dispositivo: + + + + + Send: + Enviar: + + + + + Send Hex + Enviar hexadecimal + + + + + Send Text + Enviar texto + + + + + Clear + Limpar + + + + DBCComparatorWindow + + + + DBC Comparator + Comparador DBC + + + + + Side 1 + Lado 1 + + + + + + + TextLabel + TextLabel + + + + + Load New File + Carregar novo arquivo + + + + + Side 2 + Lado 2 + + + + + Load A File + Carregar um arquivo + + + + + Save Details to File + Salvar detalhes no arquivo + + + + DBC Files (*.dbc *.DBC) + Arquivos DBC (*.dbc *.DBC) + + + + Text File (*.txt) + Arquivo de texto (*.txt) + + + + DBCHandler + + + + DBC File (*.dbc) + Arquivo DBC (*.dbc) + + + + DBCLoadSaveWindow + + + + DBC File Manager + Gerenciador de arquivos DBC + + + + + Create new DBC + Criar novo DBC + + + + + Load + Carregar + + + + + Remove + Remover + + + + + Move Up + Subir + + + + + Save + Salvar + + + + + Edit + Editar + + + + + Move Down + Descer + + + + DBC File (*.dbc) + Arquivo DBC (*.dbc) + + + + Tesla JSON File (*.json) + Arquivo JSON Tesla (*.json) + + + + Secret CSV Signal Defs (*.csv) + Defs de sinal CSV secreto (*.csv) + + + + DBCMainEditor + + + + DBC Editing Window + Janela de edição DBC + + + + + New Node + Novo nó + + + + + New Message + Nova mensagem + + + + + New Signal + Novo sinal + + + + + Delete + Excluir + + + + + Find: + Encontrar: + + + + + Search + Procurar + + + + + Search Results: 0 of 0 + Resultados da pesquisa: 0 de 0 + + + + + Next + Próximo + + + + + Previous + Anterior + + + + Delete currently selected message + Excluir mensagem atualmente selecionada + + + + Rebase all messages + Rebase todas as mensagens + + + + Rebase all messages in node + Rebase todas as mensagens no nó + + + + Duplicate node + Nó duplicado + + + + Duplicate node and messages + Nó e mensagens duplicados + + + + DBCMessageEditor + + + + Message Editor + Editor de mensagens + + + + + Frame ID: + ID do Frame: + + + + + Message Name: + Nome da mensagem: + + + + + Frame Length: + Comprimento do Frame: + + + + + Text Color: + Cor do texto: + + + + + Background Color: + Cor de fundo: + + + + + Comments: + Comentários: + + + + + Sending Node: + Nó de envio: + + + + + + + Set + Definir + + + + + Sample Colored Output: + Exemplo de saída colorida: + + + + DBCNodeDuplicateEditor + + + + + + Duplicate Node + Nó duplicado + + + + + New Node Name: + Novo nome do nó: + + + + + Current Base ID: + ID base atual: + + + + + New Base ID: + Nova ID base: + + + + + Cancel + Cancelar + + + + DBCNodeEditor + + + + Node Editor + Editor de nós + + + + + Node Name: + Nome do nó: + + + + + Comments: + Comentários: + + + + DBCNodeRebaseEditor + + + + Rebase All Node Messages + Rebase todas mensagens de nó + + + + + Node Name: + Nome do nó: + + + + + Current Base ID: + ID base atual: + + + + + New Base ID: + Novo ID base: + + + + + Rebase All Messages in Node + Rebase todas mensagens do nó + + + + + Cancel + Cancelar + + + + DBCSignalEditor + + + + Signal Editor + Editor de sinais + + + + + Name: + Nome: + + + + + Bit Length: + Comprimento do bit: + + + + + Byte Order + Ordem de bytes + + + + + LSB First (Little Endian) + LSB Primeiro (Little Endian) + + + + + Type: + Tipo: + + + + + Scale: + Escala: + + + + + Bias: + Deslocamento: + + + + + Min Value: + Valor mínimo: + + + + + Max Value: + Valor máximo: + + + + + Units Name: + Nome das unidades: + + + + + Receiving Node: + Nó de recepção: + + + + + Multiplexing + Multiplexação + + + + + None + Nenhum + + + + + Multiplexed + Multiplexado + + + + + Multiplexor + Multiplexador + + + + + Extended + Estendido + + + + + Multiplex value + Valor multiplexado + + + + + Multiplex Parent + Parente multiplexado + + + + + Comment: + Comentário: + + + + + Single values has to be separated by semicolons +and the value ranges by hypens +(e.g.: 1;2;5-7) + Valores únicos devem ser separados por ponto e vírgula +e os intervalos de valores por hífens +(ex.: 1;2;5-7) + + + + + Value Table: + Tabela de valores: + + + + Error + Erro + + + + The multiplex values field contains errors: +%1 + O campo de valores multiplex contém erros: +%1 + + + + Delete currently selected value + Excluir o valor atualmente selecionado + + + + DiscreteStateWindow + + + + Single/Multi State WIndow + Janela de estado único/multiplo + + + + + Candidate Matches: + Partidas de candidatos: + + + + + Number of States: + Número de estados: + + + + + Realtime + Em tempo real + + + + + From logged data + Dos dados do log + + + + + Toggle Frequency (Seconds) + Alternar frequência (segundos) + + + + + Iterations + Iterações + + + + + WAIT + ESPERE + + + + + Min Bits + Bits mínimos + + + + + Max Bits + Máximo de bits + + + + + IDs to Scan + IDs para digitalizar + + + + + All + Todos + + + + + None + Nenhum + + + + + Go for it + Vá em frente + + + + FileComparatorWindow + + + + File Comparator + Comparador de arquivos + + + + + SIDE 1 + LADO 1 + + + + + Single file to compare to side 2: + Arquivo único para comparar com o lado 2: + + + + + + + TextLabel + TextLabel + + + + + Load New File + Carregar novo arquivo + + + + + Side 2 + Lado 2 + + + + + One or more files to compare with the single file on side1: + Um ou mais arquivos para comparar com o arquivo único no lado 1: + + + + + Load A File + Carregar um arquivo + + + + + Clear Frames + Limpar Frames + + + + + Show only data unique to Side 1 + Mostrar apenas dados exclusivos do Lado 1 + + + + + Save Details to File + Salvar detalhes em arquivo + + + + Text File (*.txt) + Arquivo de texto (*.txt) + + + + FirmwareUploaderWindow + + + + Firmware Updater + Atualizador de firmware + + + + + Loaded File: + Arquivo carregado: + + + + + Load File + Carregar arquivo + + + + + Device Token: + Token do dispositivo: + + + + + CAN Bus: + Barramento CAN: + + + + + Base Address: + Endereço básico: + + + + + X of Y bytes + X de Y bytes + + + + + Start Upload + Iniciar upload + + + + Raw firmware binary (*.bin) + Arquivo binário de firmware (*.bin) + + + + FlowViewWindow + + + + Flow View + Visualização de fluxo + + + + + Playback Control + Controle de reprodução + + + + + Playback Speed: + Velocidade de reprodução: + + + + + Loop Playback + Reprodução em loop + + + + + Current Frame: + Frame Atual: + + + + + X of Y + X de Y + + + + + Live Mode (No Playback) + Modo ao vivo (sem reprodução) + + + + + Synchronize windows + Sincronizar janelas + + + + + Graph by timestamp + Gráfico por carimbo de data/hora + + + + + Auto Reference + Referência automática + + + + + Reference Values (Hex) + Valores de referência (Hex) + + + + + + + + + + + 0 + 0 + + + + + + + + + + + 1 + 1 + + + + + + + + + + + 2 + 2 + + + + + + + + + + + 3 + 3 + + + + + + + + + + + 4 + 4 + + + + + + + + + + + 5 + 5 + + + + + + + + + + + 6 + 6 + + + + + + + + + + + 7 + 7 + + + + + Current Values (Hex) + Valores Atuais (Hex) + + + + + Data Seek Values + Valores de busca de dados + + + + + + + + + + + + + + + + + + + -1 + -1 + + + + + Chart range + Intervalo do gráfico + + + + + 50 + 50 + + + + + Timeline: + Linha do tempo: + + + + + Frame IDs Found: + IDs de Frame encontrados: + + + + + Save image to file + Salvar imagem em arquivo + + + + PDF Files (*.pdf) + Arquivos PDF (*.pdf) + + + + + PNG Files (*.png) + Arquivos PNG (*.png) + + + + + JPEG Files (*.jpg) + Arquivos JPEG (*.jpg) + + + + of + de + + + + FrameFileIO + + + + + GVRET Logs (*.csv *.CSV) + Logs do GVRET (*.csv *.CSV) + + + + + CRTD Logs (*.crt *.crtd *.CRT *.CRTD) + Logs do CRTD (*.crt *.crtd *.CRT *.CRTD) + + + + + Generic ID/Data CSV (*.csv *.CSV) + ID genérico/CSV de dados (*.csv *.CSV) + + + + + BusMaster Log (*.log *.LOG) + Log do BusMaster (*.log *.LOG) + + + + + Microchip Log (*.can *.CAN *.log *.LOG) + Logs do Microchip (*.can *.CAN *.log *.LOG) + + + + Vector Trace Files (*.trace *.TRACE) + Arquivos de rastreamento Vector (*.trace *.TRACE) + + + + + IXXAT MiniLog (*.csv *.CSV) + MiniLog IXXAT (*.csv *.CSV) + + + + CAN-DO Log (*.can *.avc *.evc *.qcc *.CAN *.AVC *.EVC *.QCC) + Logs do CAN-DO (*.can *.avc *.evc *.qcc *.CAN *.AVC *.EVC *.QCC) + + + + + Vehicle Spy (*.csv *.CSV) + Vehicle Spy (*.csv *.CSV) + + + + Candump/Kayak (*.log) + Candump/Kayak (*.log) + + + + + Cabana Log (*.csv *.CSV) + Logs do Cabana (*.csv *.CSV) + + + + + CANalyzer Ascii Log (*.asc *.ASC) + Logs Ascii do CANalyzer (*.asc *.ASC) + + + + CARBUS Analyzer (*.trc *.TRC) + Analisador CARBUS (*.trc *.TRC) + + + + Autodetect File Type (*.*) + Detecção automática do tipo de arquivo (*.*) + + + + Vector trace files (*.trace *.TRACE) + Arquivos de rastreamento Vector (*.trace *.TRACE) + + + + CAN-DO Log (*.avc *.can *.evc *.qcc *.AVC *.CAN *.EVC *.QCC) + Log CAN-DO (*.avc *.can *.evc *.qcc *.AVC *.CAN *.EVC *.QCC) + + + + Candump/Kayak (*.log *.LOG) + Candump/Kayak (*.log *.LOG) + + + + CANDump Lawicel (*.txt *.TXT *.LOG *.log) + CANDump Lawicel (*.txt *.TXT *.LOG *.log) + + + + PCAN Viewer (*.trc *.TRC) + Visualizador PCAN (*.trc *.TRC) + + + + Kvaser Log Decimal (*.txt *.TXT) + Logs Decimal Kvaser (*.txt *.TXT) + + + + Kvaser Log Hex (*.txt *.TXT) + Logs Hexadecimal Kvaser (*.txt *.TXT) + + + + CANalyzer Binary Log Files (*.blf *.BLF) + Logs binários CANalyzer (*.blf *.BLF) + + + + CARBUS Analyzer Trace Files (*.trc *.TRC) + Logs do analisador CARBUS (*.trc *.TRC) + + + + CANHacker Trace Files (*.trc *.TRC) + Logs de rastreamento CANHacker (*.trc *.TRC) + + + + CANOpen Magic (*.csv *.CSV) + CANOpen Magic (*.csv *.CSV) + + + + Tesla Autopilot Snapshot (*.CAN *.can) + Snapshot do piloto automático Tesla (*.CAN *.can) + + + + CLX000 (*.txt *.TXT) + CLX000 (*.txt *.TXT) + + + + CANServer Binary Log (*.log *.LOG) + Log binário CANServer (*.log *.LOG) + + + + Wireshark (*.pcap *.PCAP *.pcapng *.PCAPNG) + Wireshark (*.pcap *.PCAP *.pcapng *.PCAPNG) + + + + Wireshark SocketCAN (*.pcap *.PCAP + Wireshark SocketCAN (*.pcap *.PCAP + + + + CXX GVRET-PC Reverse Engineering Tool Output V + Saída V da ferramenta de engenharia reversa CXX GVRET-PC + + + + FrameInfoWindow + + + + Detailed Frame Information + Informações detalhadas do frame + + + + + Frame IDs: + IDs de frame: + + + + + Unique IDs + IDs únicos + + + + + Details: + Detalhes: + + + + + Save details to file + Salvar detalhes em arquivo + + + + + Interval Histogram + Histograma de intervalo + + + + + Bytes Graph + Gráfico de Bytes + + + + + unique ids) + ids únicos) + + + + J1939 decoding + Decodificação J1939 + + + + Broadcast Frame + Frame de transmissão + + + + Destination ID: + ID de destino: + + + + Destination ID: Global (ALL) + ID de destino: Global (TODOS) + + + + Priority: + Prioridade: + + + + SRC: + SRC: + + + + EDP: + EDP: + + + + DP: + DP: + + + + PGN: + PGN: + + + + PF: + FP: + + + + PS: + PS: + + + + GMLAN 29bit decoding + Decodificação GMLAN de 29 bits + + + + Priority bits: + Bits prioritários: + + + + Arbitration Id: + ID de Arbitragem: + + + + Sender Id: + ID do remetente: + + + + # of frames: + # de quadros: + + + + + Data Length: + Comprimento dos dados: + + + + + to + para + + + + Average inter-frame interval: + Intervalo médio entre frames: + + + + Minimum inter-frame interval: + Intervalo mínimo entre frames: + + + + Maximum inter-frame interval: + Intervalo máximo entre frames: + + + + Inter-frame interval variation: + Variação do intervalo entre frames: + + + + Interval standard deviation: + Desvio padrão do intervalo: + + + + Minimum range to fit 90% of inter-frame intervals: + Faixa mínima para ajustar 90% dos intervalos entre quadros: + + + + Data Byte + Byte de dados + + + + Changed bits: 0x + Bits alterados: 0x + + + + Range: + Faixa: + + + + Histogram + Histograma + + + + Bitfield Histogram + Histograma de campo de bits + + + + Bitchange Heatmap + Mapa de calor do Bitchange + + + + Text File (*.txt) + Arquivo de texto (*.txt) + + + + FramePlaybackWindow + + + + Playback + Reprodução + + + + + Use original frame timing from captured frames + Use o tempo de frame original dos frames capturados + + + + + Wait for traffic before starting playback + Aguarde o tráfego antes de iniciar a reprodução + + + + + Playback speed (ms): + Velocidade de reprodução (ms): + + + + + Burst Rate: + Taxa de burst: + + + + + Current Playback Item: + Item de reprodução atual: + + + + + TextLabel + TextLabel + + + + + Current frame: + Quadro atual: + + + + + x of y + x de y + + + + + Loop Sequence + Sequência de Loop + + + + + Send to CANBus + Enviar para CANBus + + + + + <html><head/><body><p>Playback Sequence:</p></body></html> + <html><head/><body><p>Sequência de reprodução:</p></body></html> + + + + + Load File + Carregar arquivo + + + + + Load Captured Data + Carregar dados capturados + + + + + Delete Selected + Excluir selecionado + + + + + ID Filtering: + Filtragem de ID: + + + + + Select all IDs + Selecione todos os IDs + + + + + Deselect all IDs + Desmarcar todos os IDs + + + + + Load Filters + Carregar filtros + + + + + Save Filters + Salvar filtros + + + + + All + Todos + + + + + From File + Do arquivo + + + + Save filter definition to file + Salvar definição de filtro em arquivo + + + + Load filter definition from file + Carregar definição de filtro do arquivo + + + + Filter list (*.ftl) + Lista de filtros (*.ftl) + + + + Filter List (*.ftl) + Lista de filtros (*.ftl) + + + + + of + de + + + + FrameSenderWindow + + + + Frame Sender + Envio de Frame + + + + + Enable All + Ativar tudo + + + + + Disable All + Desativar tudo + + + + + Clear Grid + Limpar grade + + + + + Load to Grid + Carregar na grade + + + + + Save Grid + Salvar grade + + + + + Frame Sender Definition (*.fsd) + Definição do remetente do quadro (*.fsd) + + + + FuzzingWindow + + + + Fuzzing Window + Janela Difusão + + + + + Interframe Timing (ms) + Tempo entre frames (ms) + + + + + Number of data bytes + Número de bytes de dados + + + + + Burst Rate + Taxa de burst + + + + + Bus or Buses to Send On + Barramento ou Barramentos para enviar + + + + + ID Scanning + Digitalização de ID + + + + + Seqential + Sequencial + + + + + + + Random + Aleatório + + + + + ID Selection + Seleção de ID + + + + + Range of IDs + Faixa de IDs + + + + + Filter List + Lista de filtros + + + + + Bit Scanning + Varredura de bits + + + + + Sequential + Sequencial + + + + + Sweep + Varrer + + + + + IDs + IDs + + + + + Start ID: + ID inicial: + + + + + End ID: + ID final: + + + + + + All + Todos + + + + + None + Nenhum + + + + + Byte Values (Always in hexadecimal) + Valores de bytes (sempre em hexadecimal) + + + + + 0 + 0 + + + + + 1 + 1 + + + + + 2 + 2 + + + + + 3 + 3 + + + + + 4 + 4 + + + + + 5 + 5 + + + + + 6 + 6 + + + + + 7 + 7 + + + + + 8 + 8 + + + + + 9 + 9 + + + + + 10 + 10 + + + + + 11 + 11 + + + + + 12 + 12 + + + + + 13 + 13 + + + + + 14 + 14 + + + + + 15 + 15 + + + + + White = Bit always 0, Green = Fuzz Bit, Black = Bit always set, Gray = Past end of data bytes + Branco = Bit sempre 0, Verde = Bit Difuso, Preto = Bit sempre definido, Cinza = Passado o fim dos bytes de dados + + + + + All High + Todos Alto + + + + + All Low + Todos Baixo + + + + + All Auto + Tudo Automático + + + + + Start Fuzzing + Comece a difusão + + + + + # of sent frames: + # de frames enviados: + + + + GraphingWindow + + + + Data Graphing + Gráficos de dados + + + + Move to top left + Mover para o canto superior esquerdo + + + + Move to top center + Mover para o centro superior + + + + Move to top right + Mover para o canto superior direito + + + + Move to bottom right + Mover para o canto inferior direito + + + + Move to bottom left + Mover para o canto inferior esquerdo + + + + Save graph image to file + Salvar imagem do gráfico em arquivo + + + + Save graph definitions to file + Salvar definições de gráfico em arquivo + + + + Load graph definitions from file + Carregar definições de gráfico do arquivo + + + + Save spreadsheet of data + Salvar planilha de dados + + + + Follow end of graph + Acompanhe o final do gráfico + + + + Add new graph + Adicionar novo gráfico + + + + Edit selected graph + Editar gráfico selecionado + + + + Remove selected graph + Remover gráfico selecionado + + + + Remove all graphs + Remover todos os gráficos + + + + Reset View + Redefinir visualização + + + + Rescale to data + Redimensionar para dados + + + + Zoom In + Ampliar + + + + Zoom Out + Diminuir zoom + + + + PDF Files (*.pdf) + Arquivos PDF (*.pdf) + + + + PNG Files (*.png) + Arquivos PNG (*.png) + + + + JPEG Files (*.jpg) + Arquivos JPEG (*.jpg) + + + + Spreadsheet (*.csv) + Planilha (*.csv) + + + + + Graph definition (*.gdf) + Definição de gráfico (*.gdf) + + + + HelpWindow + + + + SavvyCAN Help + Ajuda do SavvyCAN + + + + ISOTP_InterpreterWindow + + + + ISO-TP Decoder + Decodificador ISO-TP + + + + + Interpreted Messages Overview + Visão geral das mensagens interpretadas + + + + + Interpret Previously Captured Frames + Interpretar frames capturados anteriormente + + + + + Clear Messages List + Limpar lista de mensagens + + + + + Save List + Salvar lista + + + + + Show incomplete and/or corrupted messages + Mostrar mensagens incompletas e/ou corrompidas + + + + + Use extended addressing + Use endereçamento estendido + + + + + Data Details of Selected Message + Detalhes dos dados da mensagem selecionada + + + + + IDs to Decode + IDs para decodificar + + + + + All + Todos + + + + + None + Nenhum + + + + Text File (*.txt) + Arquivo de texto (*.txt) + + + + Raw Payload: + Raw Payload: + + + + MainSettingsDialog + + + + Main Settings + Configurações principais + + + + + Main Form Settings: + Configurações principais do formulário: + + + + + Autoscroll main frame window by default + Janela do quadro principal de rolagem automática por padrão + + + + + Maximum data bytes per line + Máximo de bytes de dados por linha + + + + + General Settings: + Configurações Gerais: + + + + + Save/Restore window positions and sizes + Salvar/restaurar posições e tamanhos de janelas + + + + + Save/Restore CAN bus connections + Salvar/restaurar conexões de barramento CAN + + + + + Display values as hexadecimal + Exibir valores como hexadecimal + + + + + Require validation of GVRET connection + Exigir validação da conexão GVRET + + + + + Use filtered frames in sub-windows + Use frames filtrados em subjanelas + + + + + OpenGL Accelerated AntiAliased Graphing + Gráficos AntiAliased acelerados por OpenGL + + + + + CAN Frame Pre-allocation Size + Tamanho de pré-alocação do frame CAN + + + + + Time Keeping + Cronometragem + + + + + Seconds/Milli/Micro are dongle based + Segundos/Milli/Micro são baseados em dongle + + + + + Seconds + Segundos + + + + + Microseconds + Microssegundos + + + + + Milliseconds + Milissegundos + + + + + System Clock + Relógio do sistema + + + + + Time Format String: + Sequência de formato de hora: + + + + + Use absolute time in decoded CSV output + Use tempo absoluto na saída CSV decodificada + + + + + Font + Fonte + + + + + Use fixed-width font in tables + Use fonte de largura fixa em tabelas + + + + + Size + Tamanho + + + + + Flowview Settings: + Configurações de visualização de fluxo: + + + + + Use timestamp mode by default + Use o modo timestamp por padrão + + + + + Set Auto Reference by default + Definir referência automática por padrão + + + + + + + Hexadecimal Graph Y Axis + Eixo Y do gráfico hexadecimal + + + + + Playback Window Settings: + Configurações da janela de reprodução: + + + + + Loop by default + Loop por padrão + + + + + Default playback speed (ms) + Velocidade de reprodução padrão (ms) + + + + + Default Sending Bus + Barramento de envio padrão + + + + + DBC Settings + Configurações DBC + + + + + Label DBC messages by default + Mostrar mensagens DBC por padrão + + + + + Ignore DBC message colors + Ignorar cores de mensagens DBC + + + + + File Info and Comparator Settings: + Informações do arquivo e configurações do comparador: + + + + + Auto expand all nodes + Expandir automaticamente todos os nós + + + + + MQTT Remote CAN Settings: + Configurações CAN remotas MQTT: + + + + + Host: + Host: + + + + + Port: + Porta: + + + + + User Name: + Nome de usuário: + + + + + Password + Senha: + + + + + Some settings will not take effect until the application is restarted + Algumas configurações não terão efeito até que o aplicativo seja reiniciado + + + + None + Nenhum + + + + 0 + 0 + + + + 1 + 1 + + + + All + Todos + + + + From File + Do arquivo + + + + MainWindow + + + + SavvyCAN + SavvyCAN + + + + + Remote Connection Active: + Conexão remota ativa: + + + + + Total Frames Captured: + Total de frames capturados: + + + + + Frames Per Second: + Frames por segundo: + + + + + Suspend Capturing + Suspender captura + + + + + Normalize Frame Timing + Normalizar o tempo do frame + + + + + Clear Frames + Limpar Frames + + + + + Keep Filters When Clearing + Mantenha os filtros ao limpar + + + + + Auto Scroll Window + Janela de rolagem automática + + + + + Overwrite Mode + Modo de substituição + + + + + Interpret Frames + Interpretar frames + + + + + Expand All Rows + Expandir todas as linhas + + + + + Collapse All Rows + Recolher todas as linhas + + + + + Bus Filtering: + Filtragem de barramento: + + + + + Frame Filtering: + Filtragem de frames: + + + + + All + Todos + + + + + None + Nenhum + + + + + RE Tools + Ferramentas RE + + + + + Send Frames + Enviar frames + + + + + File + Arquivo + + + + + Connection + Conexão + + + + + Playback + Reprodução + + + + + Custom + Personalizado + + + + + Flow View + Visualização de fluxo + + + + + Fuzzy Scope + Escopo difuso + + + + + New Graphing Window + Nova janela gráfica + + + + + Load Log File + Carregar arquivo de log + + + + + Ctrl+O + Ctrl+O + + + + + Save Log File + Salvar arquivo de registro + + + + + Frame Data Analysis + Análise de dados de frames + + + + + Load DBC File + Carregar arquivo DBC + + + + + Edit Messages/Signals + Editar mensagens/sinais + + + + + Save DBC File + Salvar arquivo DBC + + + + + Save Decoded Frames + Salvar Frames decodificados + + + + + Exit Application + Sair do aplicativo + + + + + File Comparison + Comparação de arquivos + + + + + Preferences + Preferências + + + + + Save Filtered Log File + Salvar arquivo de log filtrado + + + + + Load Filter Definition + Definição de filtro de carga + + + + + Save Filter Definition + Salvar definição de filtro + + + + + Firmware Uploader + Carregador de firmware + + + + + Open Connection Window + Abrir janela de conexão + + + + + Connect + Conectar + + + + + Scripting Interface + Interface de script + + + + + Range State + Estado do intervalo + + + + + Single/Multi State + Estado único/múltiplo + + + + + DBC File Manager + Gerenciador de arquivos DBC + + + + + Fuzzing + Difusão + + + + + UDS Scanner + Scanner UDS + + + + + ISO-TP Decoder + Decodificador ISO-TP + + + + + Sniffer + Sniffer + + + + + Firmware Update + Atualização de Firmware + + + + + MotorControlConfig + MotorControlConfig + + + + + Capture Bisector + Capturar Bissetriz + + + + + Signal Viewer + Visualizador de sinal + + + + + + Start Continuous Logging + Iniciar Log contínuo + + + + + Temporal Graph + Gráfico Temporal + + + + + DBC Comparison + Comparação DBC + + + + + Save Decoded Frames CSV + Salvar quadros decodificados CSV + + + + + CAN Bridge + Ponte CAN + + + + Connected to 0 buses + Conectado a 0 barramentos + + + + Press F1 on any screen for help + Pressione F1 em qualquer tela para obter ajuda + + + + Add to a new graphing window + Adicionar a uma nova janela gráfica + + + + Add to latest graphing window + Adicionar à janela gráfica mais recente + + + + Cease Continuous Logging + Cessar Log contínuo + + + + Filter list (*.ftl) + Lista de filtros (*.ftl) + + + + Filter List (*.ftl) + Lista de filtros (*.ftl) + + + + Text File (*.txt *.TXT) + Arquivo de texto (*.txt *.TXT) + + + + CSV File (*.csv *.CSV) + Arquivo CSV (*.csv *.CSV) + + + + Year + Ano + + + + Month + Mês + + + + Day + Dia + + + + Hour + Hora + + + + Minute + Minuto + + + + Second + Segundo + + + + Ms + EM + + + + Time + Tempo + + + + ID + ID + + + + Bus + Barramento + + + + DataLen + DataLen + + + + Time: + Time: + + + + ID: + ID: + + + + Ext + Ext + + + + Std + Std + + + + Bus: + Bus: + + + + Data Bytes: + Data Bytes: + + + + Connected to + Conectado a + + + + buses + barramentos + + + + No packets loaded + Nenhum pacote carregado + + + + No file loaded + Nenhum arquivo carregado + + + + MotorControllerConfigWindow + + + + Controller Configuration + Configuração do controlador + + + + + Load Definition File + Carregar arquivo de definição + + + + + Refresh + Atualizar + + + + + Save + Salvar + + + + RMS Definition File (*.txt *.TXT) + Arquivo de definição RMS (*.txt *.TXT) + + + + NewConnectionDialog + + + + New Connection + Nova conexão + + + + + Connection Type + Tipo de conexão + + + + + socketcand (SocketCAN over Ethernet) + socketcand (SocketCAN sobre Ethernet) + + + + + QT SerialBus Devices (SocketCAN, PeakCAN, etc) + Dispositivos QT SerialBus (SocketCAN, PeakCAN, etc.) + + + + + MQTT Connection + Conexão MQTT + + + + + Serial Connection (GVRET) + Conexão serial (GVRET) + + + + + Network connection (GVRET) + Conexão de rede (GVRET) + + + + + LAWICEL / SLCAN Serial + LAWICEL/SLCAN Serial + + + + + CANserver + CANserver + + + + + CANlogserver + CANlogserver + + + + + SerialBus Device Type: + Tipo de dispositivo SerialBus: + + + + + Serial Port: + Porta serial: + + + + + Serial Port Speed: + Velocidade da porta serial: + + + + + CAN Bus Speed: + Velocidade do barramento CAN: + + + + + CAN-FD + CAN-FD + + + + + CAN-FD data rate + Taxa de dados CAN-FD + + + + + Create New Connection + Criar nova conexão + + + + NewGraphDialog + + + + Graph Settings + Configurações de gráfico + + + + + <html><head/><body><p>Name:</p></body></html> + <html><head/><body><p>Nome:</p></body></html> + + + + + ID: + ID: + + + + + Start Bit: + Bit inicial: + + + + + Graph a DBC Signal: + Representar graficamente um sinal DBC: + + + + + Node: + Nó: + + + + + Message: + Mensagem: + + + + + Signal: + Sinal: + + + + + Copy Signal Parameters + Copiar parâmetros de sinal + + + + + Bit Len: + Largura do Bit: + + + + + Little Endian + Little Endian + + + + + (LSB First) + (LSB Primeiro) + + + + + Signed: + Signed: + + + + + Mask: + Máscara: + + + + + Bias: + Deslocamento: + + + + + Scale + Escala + + + + + Stride + Passo + + + + + Associated Bus + Barramento Associado + + + + + -1 + -1 + + + + + Only Points + Apenas pontos + + + + + Point Style + Estilo de ponto + + + + + Line Thickness + Espessura da linha + + + + + Line Color + Cor da linha + + + + + + + CHANGE + MUDAR + + + + + Fill Color + Cor de preenchimento + + + + + Add this graph + Adicione este gráfico + + + + QObject + + + The %1 part contains more than one '-' sign + A parte %1 contém mais de um sinal '-' + + + + + + Unable to parse the %1 part to integer + Não foi possível analisar a parte %1 em número inteiro + + + + RangeStateWindow + + + + Range State Window + Janela de estado de intervalo + + + + + Candidate Signals: + Sinais de Candidato: + + + + + Graphical Representation of Selected Signal: + Representação gráfica do sinal selecionado: + + + + + Sensitivity + Sensibilidade + + + + + Min Signal Size: + Tamanho mínimo do sinal: + + + + + Max Signal Size: + Tamanho máximo do sinal: + + + + + Granularity: + Granularidade: + + + + + Signal Mode: + Modo de sinal: + + + + + Signed Mode: + Modo Signed: + + + + + ID Filter: + Filtro de ID: + + + + + All + Todos + + + + + None + Nenhum + + + + + Recalculate Candidate Signals + Recalcular Sinais Candidatos + + + + Big Endian + Big Endian + + + + Little Endian + Little Endian + + + + + Try Both + Experimentar ambos + + + + Signed Value + Valor Signed + + + + Unsigned Value + Valor Unsigned + + + + ScriptingWindow + + + + Scripting Interface + Interface de script + + + + + Public Variables + Variáveis ​​Públicas + + + + + Loaded Scripts + Scripts carregados + + + + + &New + &Novo + + + + + &Del + &Excluir + + + + + &Load + &Carregar + + + + + Script Editing Window + Janela de edição de script + + + + + &Save + &Salvar + + + + + Sa&ve As + Sal&var como + + + + + &Revert + &Reverter + + + + + R&eload + R&ecarregar + + + + + Re&compile + Re&compilar + + + + + Log Window + Janela de Log + + + + + &Auto Scroll Log Window + &Janela de registro de rolagem automática + + + + + Clear Log &Window + &Limpar Log e janela + + + + + Save L&og + Salvar L&og + + + + + Javascript File (*.js) + Arquivo Javascript (*.js) + + + + Log File (*.log) + Arquivo de registro (*.log) + + + + SignalViewerWindow + + + + Signal Viewer + Visualizador de sinal + + + + + Remove Selected Signal + Remover sinal selecionado + + + + + Node + Nó + + + + + Message + Mensagem + + + + + Signal + Sinal + + + + + Add To Viewer + Adicionar ao visualizador + + + + + Save View + Salvar visualização + + + + + Load View + Carregar visualização + + + + + Append to View + Anexar à visualização + + + + + Clear View + Limpar Visão + + + + + SignalViewer definition (*.sdf) + Definição do SignalViewer (*.sdf) + + + + TemporalGraphWindow + + + + Temporal Graph + Gráfico Temporal + + + + TriggerDialog + + + + Trigger Builder + Construtor de Triggers + + + + + Add New + Adicionar novo + + + + + Delete + Excluir + + + + + Bus + Barramento + + + + + Msg ID + ID da mensagem + + + + + Signal + Signed + + + + + MS Delay + Atraso MS + + + + + Max Count + Contagem máxima + + + + + Signal Value + Valor do sinal + + + + + Save And Update + Salvar e atualizar + + + + UDSScanWindow + + + + UDS Scanner + Scanner UDS + + + + + Scans To Run + Varreduras para executar + + + + + Add + Adicionar + + + + + Delete + Excluir + + + + + Load + Carregar + + + + + Save + Salvar + + + + + Starting ID + ID inicial + + + + + + + + + + + + + + + + + 0x + 0x + + + + + Ending ID + ID final + + + + + Show "No Reply" + Mostrar "Sem resposta" + + + + + Allow adaptive reply offset + Permitir deslocamento de resposta adaptável + + + + + Bus to scan + Barramento para escanear + + + + + Maximum reply delay (ms) + Atraso máximo de resposta (ms) + + + + + Reply Offset: + Compensação de resposta: + + + + + Scan Type: + Tipo de varredura: + + + + + Run test in session type: + Execute o teste no tipo de sessão: + + + + + Subfunct Len: + Len subfunção: + + + + + Lower Bound: + Limite inferior: + + + + + Upper Bound: + Limite superior: + + + + + Increment + Incremento + + + + + Lower Service: + Serviço inferior: + + + + + Upper Service: + Serviço Superior: + + + + + Results + Resultados + + + + + Run All Scans + Execute todas as varreduras + + + + + Run Selected Scan + Executar varredura selecionada + + + + + Save Scan Results + Salvar resultados da varredura + + + + + UDS Test Specification (*.uds *.UDS) + Especificação de teste UDS (*.uds *.UDS) + + + + Text File (*.txt) + Arquivo de texto (*.txt) + + + + snifferWindow + + + + Sniffer + Sniffer + + + + + Notch + Encaixar + + + + + Unnotch + Desencaixar + + + + + Mute notched bits + Silenciar bits enganchados + + + + + Notch Interval + Intervalo de encaixe + + + + + + + ms + ms + + + + + Expire Interval + Intervalo de expiração + + + + + Never Expire IDs + Nunca expire IDs + + + + + Fade inactive bytes + Desaparecer bytes inativos + + + + + View Bits + Ver bits + + + + + Filters: + Filtros: + + + + + All + Todos + + + + + None + Nenhum + + + From 2b8d88ef951f3a7286ccf44052080b25a672ea36 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 17:17:58 -0300 Subject: [PATCH 03/24] fix Main/Language not saving on ini file --- main.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/main.cpp b/main.cpp index be139e6..4f0a317 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include class SavvyCANApplication : public QApplication { @@ -34,17 +35,6 @@ int main(int argc, char *argv[]) SavvyCANApplication a(argc, argv); - QTranslator translator; - QLocale locale = QLocale::system(); - QString lang = locale.name(); - QString shortLang = locale.name().left(2); // pt - - if (!translator.load("savvycan_" + lang, "translations")) - { - translator.load("savvycan_" + lang, "translations"); - } - a.installTranslator(&translator); - //Add a local path for Qt extensions, to allow for per-application extensions. a.addLibraryPath("plugins"); @@ -52,11 +42,20 @@ int main(int argc, char *argv[]) a.setOrganizationName("EVTV"); a.setApplicationName("SavvyCAN"); a.setOrganizationDomain("evtv.me"); + QSettings::setDefaultFormat(QSettings::IniFormat); + QSettings settings; + + QString localeString = settings.value("Main/Language").toString(); + if (localeString.isEmpty()) { + QLocale sysLocale = QLocale::system(); + localeString = sysLocale.name(); + settings.setValue("Main/Language", localeString); + } + a.mainWindow = new MainWindow(); - QSettings settings; int fontSize = settings.value("Main/FontSize", 9).toUInt(); QFont sysFont = QFont(); //get default font sysFont.setPointSize(fontSize); @@ -65,8 +64,8 @@ int main(int argc, char *argv[]) a.mainWindow->show(); int retCode = a.exec(); - + delete a.mainWindow; a.mainWindow = NULL; - + return retCode; } From 41775695c072787ce7ada36be078a0d699aa210d Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 17:18:51 -0300 Subject: [PATCH 04/24] fix not getting the translations folder on main app dir --- main.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/main.cpp b/main.cpp index 4f0a317..5fe4e1e 100644 --- a/main.cpp +++ b/main.cpp @@ -53,6 +53,17 @@ int main(int argc, char *argv[]) settings.setValue("Main/Language", localeString); } + QTranslator translator; + QLocale locale(localeString); + QString lang = locale.name(); + QString shortLang = locale.name().left(2); + + if (QString translationDir = QCoreApplication::applicationDirPath() + "/translations"; !translator.load("SavvyCAN_" + lang, translationDir)) { + translator.load("SavvyCAN_" + shortLang, translationDir); + } + a.installTranslator(&translator); + + qInfo() << "Locale Value is:" << locale.name(); a.mainWindow = new MainWindow(); From f7c2a6b4b696a6dc1928cbc040b0a9f16e096e47 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 17:19:11 -0300 Subject: [PATCH 05/24] updating minor typo on translations --- translations/savvycan_pt_BR.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/translations/savvycan_pt_BR.ts b/translations/savvycan_pt_BR.ts index 13ec980..3fb588b 100644 --- a/translations/savvycan_pt_BR.ts +++ b/translations/savvycan_pt_BR.ts @@ -187,7 +187,7 @@ Form - Forma + Formulário @@ -1370,7 +1370,7 @@ e os intervalos de valores por hífens of - de + de @@ -2674,7 +2674,7 @@ e os intervalos de valores por hífens Password - Senha: + Senha From 28927f3f4fba2b4cae9c626e6e576b48c9b08c96 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 20:52:22 -0300 Subject: [PATCH 06/24] adding cache clangd to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d976787..c98440f 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ SavvyCAN **/moc_* **/ui_*.h **/qrc_*.cpp +.qtc_clangd SavvyCAN.pro.user.* .qmake.stash Makefile From 06a7bc555b2ae5379bc04fb0dfb9ce5193576317 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 20:55:34 -0300 Subject: [PATCH 07/24] renaming and working with qt creator --- SavvyCAN.pro | 6 + scripts/edit_translations.sh | 2 +- scripts/update_translations.sh | 2 +- .../{savvycan_en.ts => SavvyCAN_en.ts} | 544 ------------------ .../{savvycan_pt_BR.ts => SavvyCAN_pt_BR.ts} | 544 ------------------ 5 files changed, 8 insertions(+), 1090 deletions(-) rename translations/{savvycan_en.ts => SavvyCAN_en.ts} (79%) rename translations/{savvycan_pt_BR.ts => SavvyCAN_pt_BR.ts} (79%) diff --git a/SavvyCAN.pro b/SavvyCAN.pro index d608800..2da76c4 100644 --- a/SavvyCAN.pro +++ b/SavvyCAN.pro @@ -279,3 +279,9 @@ INSTALLS += helpfiles INSTALLS += target +TRANSLATIONS += \ + translations/SavvyCAN_en.ts \ + translations/SavvyCAN_pt_BR.ts + +DISTFILES += \ + translations/pt_BR.qph diff --git a/scripts/edit_translations.sh b/scripts/edit_translations.sh index 8347bf2..96dc0c1 100755 --- a/scripts/edit_translations.sh +++ b/scripts/edit_translations.sh @@ -3,4 +3,4 @@ PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" TRANSLATIONS_DIR="$PROJECT_ROOT/translations" -linguist "$TRANSLATIONS_DIR"/savvycan_*.ts \ No newline at end of file +linguist "$TRANSLATIONS_DIR"/SavvyCAN_*.ts \ No newline at end of file diff --git a/scripts/update_translations.sh b/scripts/update_translations.sh index ac32455..361105b 100755 --- a/scripts/update_translations.sh +++ b/scripts/update_translations.sh @@ -6,6 +6,6 @@ TRANSLATIONS_DIR="$PROJECT_ROOT/translations" echo "Atualizando arquivos de tradução..." lupdate "$PROJECT_ROOT" \ --ts "$TRANSLATIONS_DIR"/savvycan_*.ts +-ts "$TRANSLATIONS_DIR"/SavvyCAN_*.ts echo "Traduções atualizadas." \ No newline at end of file diff --git a/translations/savvycan_en.ts b/translations/SavvyCAN_en.ts similarity index 79% rename from translations/savvycan_en.ts rename to translations/SavvyCAN_en.ts index 7129952..001a6d7 100644 --- a/translations/savvycan_en.ts +++ b/translations/SavvyCAN_en.ts @@ -5,99 +5,82 @@ BisectWindow - Bisector Window - Splitting Strategy: - ID Range - TO - Frame Number - Percentage - Bus Number - Save Which Side: - Lower Section - Upper Section - Number of Frames in Main List: - - 0 - Saved Frames after split: - Calculate Split - Save split frames to a new file - Replace main list with split frames @@ -116,39 +99,32 @@ CANBridgeWindow - CAN Bridger - Side 1 - - Enable forwarding - IDs to forward to side 2 - Side 2 - IDs to forward to side 1 @@ -185,7 +161,6 @@ CANDataGrid - Form @@ -262,109 +237,91 @@ ConnectionWindow - Connection Settings - Disconnect Selected Device - Reset Selected Device - Bus Details: - Speed: - Listen Only: - Enable Bus: - Save Bus Settings - Enable CAN FD: - CAN FD Data Rate - Connected Devices: - Add New Device Connection - Enable Console - Device Console: - Send: - Send Hex - Send Text - Clear @@ -373,45 +330,37 @@ DBCComparatorWindow - DBC Comparator - Side 1 - - TextLabel - Load New File - Side 2 - Load A File - Save Details to File @@ -439,49 +388,41 @@ DBCLoadSaveWindow - DBC File Manager - Create new DBC - Load - Remove - Move Up - Save - Edit - Move Down @@ -505,61 +446,51 @@ DBCMainEditor - DBC Editing Window - New Node - New Message - New Signal - Delete - Find: - Search - Search Results: 0 of 0 - Next - Previous @@ -593,63 +524,52 @@ DBCMessageEditor - Message Editor - Frame ID: - Message Name: - Frame Length: - Text Color: - Background Color: - Comments: - Sending Node: - - Set - Sample Colored Output: @@ -659,32 +579,26 @@ - - Duplicate Node - New Node Name: - Current Base ID: - New Base ID: - Cancel @@ -693,19 +607,16 @@ DBCNodeEditor - Node Editor - Node Name: - Comments: @@ -714,37 +625,31 @@ DBCNodeRebaseEditor - Rebase All Node Messages - Node Name: - Current Base ID: - New Base ID: - Rebase All Messages in Node - Cancel @@ -753,127 +658,106 @@ DBCSignalEditor - Signal Editor - Name: - Bit Length: - Byte Order - LSB First (Little Endian) - Type: - Scale: - Bias: - Min Value: - Max Value: - Units Name: - Receiving Node: - Multiplexing - None - Multiplexed - Multiplexor - Extended - Multiplex value - Multiplex Parent - Comment: - Single values has to be separated by semicolons and the value ranges by hypens (e.g.: 1;2;5-7) @@ -881,7 +765,6 @@ and the value ranges by hypens - Value Table: @@ -906,85 +789,71 @@ and the value ranges by hypens DiscreteStateWindow - Single/Multi State WIndow - Candidate Matches: - Number of States: - Realtime - From logged data - Toggle Frequency (Seconds) - Iterations - WAIT - Min Bits - Max Bits - IDs to Scan - All - None - Go for it @@ -993,69 +862,57 @@ and the value ranges by hypens FileComparatorWindow - File Comparator - SIDE 1 - Single file to compare to side 2: - - TextLabel - Load New File - Side 2 - One or more files to compare with the single file on side1: - Load A File - Clear Frames - Show only data unique to Side 1 - Save Details to File @@ -1069,49 +926,41 @@ and the value ranges by hypens FirmwareUploaderWindow - Firmware Updater - Loaded File: - Load File - Device Token: - CAN Bus: - Base Address: - X of Y bytes - Start Upload @@ -1125,67 +974,56 @@ and the value ranges by hypens FlowViewWindow - Flow View - Playback Control - Playback Speed: - Loop Playback - Current Frame: - X of Y - Live Mode (No Playback) - Synchronize windows - Graph by timestamp - Auto Reference - Reference Values (Hex) @@ -1194,10 +1032,6 @@ and the value ranges by hypens - - - - 0 @@ -1206,10 +1040,6 @@ and the value ranges by hypens - - - - 1 @@ -1218,10 +1048,6 @@ and the value ranges by hypens - - - - 2 @@ -1230,10 +1056,6 @@ and the value ranges by hypens - - - - 3 @@ -1242,10 +1064,6 @@ and the value ranges by hypens - - - - 4 @@ -1254,10 +1072,6 @@ and the value ranges by hypens - - - - 5 @@ -1266,10 +1080,6 @@ and the value ranges by hypens - - - - 6 @@ -1278,22 +1088,16 @@ and the value ranges by hypens - - - - 7 - Current Values (Hex) - Data Seek Values @@ -1306,38 +1110,26 @@ and the value ranges by hypens - - - - - - - - -1 - Chart range - 50 - Timeline: - Frame IDs Found: @@ -1542,43 +1334,36 @@ and the value ranges by hypens FrameInfoWindow - Detailed Frame Information - Frame IDs: - Unique IDs - Details: - Save details to file - Interval Histogram - Bytes Graph @@ -1750,121 +1535,101 @@ and the value ranges by hypens FramePlaybackWindow - Playback - Use original frame timing from captured frames - Wait for traffic before starting playback - Playback speed (ms): - Burst Rate: - Current Playback Item: - TextLabel - Current frame: - x of y - Loop Sequence - Send to CANBus - <html><head/><body><p>Playback Sequence:</p></body></html> - Load File - Load Captured Data - Delete Selected - ID Filtering: - Select all IDs - Deselect all IDs - Load Filters - Save Filters @@ -1911,37 +1676,31 @@ and the value ranges by hypens FrameSenderWindow - Frame Sender - Enable All - Disable All - Clear Grid - Load to Grid - Save Grid @@ -1956,256 +1715,213 @@ and the value ranges by hypens FuzzingWindow - Fuzzing Window - Interframe Timing (ms) - Number of data bytes - Burst Rate - Bus or Buses to Send On - ID Scanning - Seqential - - Random - ID Selection - Range of IDs - Filter List - Bit Scanning - Sequential - Sweep - IDs - Start ID: - End ID: - All - None - Byte Values (Always in hexadecimal) - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - White = Bit always 0, Green = Fuzz Bit, Black = Bit always set, Gray = Past end of data bytes - All High - All Low - All Auto - Start Fuzzing - # of sent frames: @@ -2214,7 +1930,6 @@ and the value ranges by hypens GraphingWindow - Data Graphing @@ -2339,7 +2054,6 @@ and the value ranges by hypens HelpWindow - SavvyCAN Help @@ -2348,67 +2062,56 @@ and the value ranges by hypens ISOTP_InterpreterWindow - ISO-TP Decoder - Interpreted Messages Overview - Interpret Previously Captured Frames - Clear Messages List - Save List - Show incomplete and/or corrupted messages - Use extended addressing - Data Details of Selected Message - IDs to Decode - All - None @@ -2427,255 +2130,212 @@ and the value ranges by hypens MainSettingsDialog - Main Settings - Main Form Settings: - Autoscroll main frame window by default - Maximum data bytes per line - General Settings: - Save/Restore window positions and sizes - Save/Restore CAN bus connections - Display values as hexadecimal - Require validation of GVRET connection - Use filtered frames in sub-windows - OpenGL Accelerated AntiAliased Graphing - CAN Frame Pre-allocation Size - Time Keeping - Seconds/Milli/Micro are dongle based - Seconds - Microseconds - Milliseconds - System Clock - Time Format String: - Use absolute time in decoded CSV output - Font - Use fixed-width font in tables - Size - Flowview Settings: - Use timestamp mode by default - Set Auto Reference by default - - Hexadecimal Graph Y Axis - Playback Window Settings: - Loop by default - Default playback speed (ms) - Default Sending Bus - DBC Settings - Label DBC messages by default - Ignore DBC message colors - File Info and Comparator Settings: - Auto expand all nodes - MQTT Remote CAN Settings: - Host: - Port: - User Name: - Password - Some settings will not take effect until the application is restarted @@ -2709,362 +2369,302 @@ and the value ranges by hypens MainWindow - SavvyCAN - Remote Connection Active: - Total Frames Captured: - Frames Per Second: - Suspend Capturing - Normalize Frame Timing - Clear Frames - Keep Filters When Clearing - Auto Scroll Window - Overwrite Mode - Interpret Frames - Expand All Rows - Collapse All Rows - Bus Filtering: - Frame Filtering: - All - None - RE Tools - Send Frames - File - Connection - Playback - Custom - Flow View - Fuzzy Scope - New Graphing Window - Load Log File - Ctrl+O - Save Log File - Frame Data Analysis - Load DBC File - Edit Messages/Signals - Save DBC File - Save Decoded Frames - Exit Application - File Comparison - Preferences - Save Filtered Log File - Load Filter Definition - Save Filter Definition - Firmware Uploader - Open Connection Window - Connect - Scripting Interface - Range State - Single/Multi State - DBC File Manager - Fuzzing - UDS Scanner - ISO-TP Decoder - Sniffer - Firmware Update - MotorControlConfig - Capture Bisector - Signal Viewer - Start Continuous Logging - Temporal Graph - DBC Comparison - Save Decoded Frames CSV - CAN Bridge @@ -3223,25 +2823,21 @@ and the value ranges by hypens MotorControllerConfigWindow - Controller Configuration - Load Definition File - Refresh - Save @@ -3255,103 +2851,86 @@ and the value ranges by hypens NewConnectionDialog - New Connection - Connection Type - socketcand (SocketCAN over Ethernet) - QT SerialBus Devices (SocketCAN, PeakCAN, etc) - MQTT Connection - Serial Connection (GVRET) - Network connection (GVRET) - LAWICEL / SLCAN Serial - CANserver - CANlogserver - SerialBus Device Type: - Serial Port: - Serial Port Speed: - CAN Bus Speed: - CAN-FD - CAN-FD data rate - Create New Connection @@ -3360,159 +2939,132 @@ and the value ranges by hypens NewGraphDialog - Graph Settings - <html><head/><body><p>Name:</p></body></html> - ID: - Start Bit: - Graph a DBC Signal: - Node: - Message: - Signal: - Copy Signal Parameters - Bit Len: - Little Endian - (LSB First) - Signed: - Mask: - Bias: - Scale - Stride - Associated Bus - -1 - Only Points - Point Style - Line Thickness - Line Color - - CHANGE - Fill Color - Add this graph @@ -3536,79 +3088,66 @@ and the value ranges by hypens RangeStateWindow - Range State Window - Candidate Signals: - Graphical Representation of Selected Signal: - Sensitivity - Min Signal Size: - Max Signal Size: - Granularity: - Signal Mode: - Signed Mode: - ID Filter: - All - None - Recalculate Candidate Signals @@ -3643,97 +3182,81 @@ and the value ranges by hypens ScriptingWindow - Scripting Interface - Public Variables - Loaded Scripts - &New - &Del - &Load - Script Editing Window - &Save - Sa&ve As - &Revert - R&eload - Re&compile - Log Window - &Auto Scroll Log Window - Clear Log &Window - Save L&og @@ -3753,61 +3276,51 @@ and the value ranges by hypens SignalViewerWindow - Signal Viewer - Remove Selected Signal - Node - Message - Signal - Add To Viewer - Save View - Load View - Append to View - Clear View @@ -3822,7 +3335,6 @@ and the value ranges by hypens TemporalGraphWindow - Temporal Graph @@ -3831,61 +3343,51 @@ and the value ranges by hypens TriggerDialog - Trigger Builder - Add New - Delete - Bus - Msg ID - Signal - MS Delay - Max Count - Signal Value - Save And Update @@ -3894,43 +3396,36 @@ and the value ranges by hypens UDSScanWindow - UDS Scanner - Scans To Run - Add - Delete - Load - Save - Starting ID @@ -3942,121 +3437,96 @@ and the value ranges by hypens - - - - - - - 0x - Ending ID - Show "No Reply" - Allow adaptive reply offset - Bus to scan - Maximum reply delay (ms) - Reply Offset: - Scan Type: - Run test in session type: - Subfunct Len: - Lower Bound: - Upper Bound: - Increment - Lower Service: - Upper Service: - Results - Run All Scans - Run Selected Scan - Save Scan Results @@ -4076,81 +3546,67 @@ and the value ranges by hypens snifferWindow - Sniffer - Notch - Unnotch - Mute notched bits - Notch Interval - - ms - Expire Interval - Never Expire IDs - Fade inactive bytes - View Bits - Filters: - All - None diff --git a/translations/savvycan_pt_BR.ts b/translations/SavvyCAN_pt_BR.ts similarity index 79% rename from translations/savvycan_pt_BR.ts rename to translations/SavvyCAN_pt_BR.ts index 3fb588b..521b253 100644 --- a/translations/savvycan_pt_BR.ts +++ b/translations/SavvyCAN_pt_BR.ts @@ -5,99 +5,82 @@ BisectWindow - Bisector Window Janela Bissetriz - Splitting Strategy: Estratégia de divisão: - ID Range Intervalo de IDs - TO PARA - Frame Number Número do frame - Percentage Percentagem - Bus Number Número do Barramento - Save Which Side: Salvar qual lado: - Lower Section Seção Inferior - Upper Section Seção Superior - Number of Frames in Main List: Número de Frames na lista principal: - - 0 0 - Saved Frames after split: Frames salvos após divisão: - Calculate Split Calcular divisão - Save split frames to a new file Salve os frames divididos em um novo arquivo - Replace main list with split frames Substitua a lista principal por frames divididos @@ -116,39 +99,32 @@ CANBridgeWindow - CAN Bridger Ponte CAN - Side 1 Lado 1 - - Enable forwarding Ativar encaminhamento - IDs to forward to side 2 IDs para encaminhar para o lado 2 - Side 2 Lado 2 - IDs to forward to side 1 IDs para encaminhar para o lado 1 @@ -185,7 +161,6 @@ CANDataGrid - Form Formulário @@ -262,109 +237,91 @@ ConnectionWindow - Connection Settings Configurações de conexão - Disconnect Selected Device Desconectar dispositivo selecionado - Reset Selected Device Redefinir dispositivo selecionado - Bus Details: Detalhes do Barramento: - Speed: Velocidade: - Listen Only: Escutar apenas: - Enable Bus: Habilitar barramento: - Save Bus Settings Salvar configurações do barramento - Enable CAN FD: Ativar CAN FD: - CAN FD Data Rate Taxa de dados CAN FD - Connected Devices: Dispositivos conectados: - Add New Device Connection Adicionar nova conexão de dispositivo - Enable Console Habilitar console - Device Console: Console do dispositivo: - Send: Enviar: - Send Hex Enviar hexadecimal - Send Text Enviar texto - Clear Limpar @@ -373,45 +330,37 @@ DBCComparatorWindow - DBC Comparator Comparador DBC - Side 1 Lado 1 - - TextLabel TextLabel - Load New File Carregar novo arquivo - Side 2 Lado 2 - Load A File Carregar um arquivo - Save Details to File Salvar detalhes no arquivo @@ -439,49 +388,41 @@ DBCLoadSaveWindow - DBC File Manager Gerenciador de arquivos DBC - Create new DBC Criar novo DBC - Load Carregar - Remove Remover - Move Up Subir - Save Salvar - Edit Editar - Move Down Descer @@ -505,61 +446,51 @@ DBCMainEditor - DBC Editing Window Janela de edição DBC - New Node Novo nó - New Message Nova mensagem - New Signal Novo sinal - Delete Excluir - Find: Encontrar: - Search Procurar - Search Results: 0 of 0 Resultados da pesquisa: 0 de 0 - Next Próximo - Previous Anterior @@ -593,63 +524,52 @@ DBCMessageEditor - Message Editor Editor de mensagens - Frame ID: ID do Frame: - Message Name: Nome da mensagem: - Frame Length: Comprimento do Frame: - Text Color: Cor do texto: - Background Color: Cor de fundo: - Comments: Comentários: - Sending Node: Nó de envio: - - Set Definir - Sample Colored Output: Exemplo de saída colorida: @@ -659,32 +579,26 @@ - - Duplicate Node Nó duplicado - New Node Name: Novo nome do nó: - Current Base ID: ID base atual: - New Base ID: Nova ID base: - Cancel Cancelar @@ -693,19 +607,16 @@ DBCNodeEditor - Node Editor Editor de nós - Node Name: Nome do nó: - Comments: Comentários: @@ -714,37 +625,31 @@ DBCNodeRebaseEditor - Rebase All Node Messages Rebase todas mensagens de nó - Node Name: Nome do nó: - Current Base ID: ID base atual: - New Base ID: Novo ID base: - Rebase All Messages in Node Rebase todas mensagens do nó - Cancel Cancelar @@ -753,127 +658,106 @@ DBCSignalEditor - Signal Editor Editor de sinais - Name: Nome: - Bit Length: Comprimento do bit: - Byte Order Ordem de bytes - LSB First (Little Endian) LSB Primeiro (Little Endian) - Type: Tipo: - Scale: Escala: - Bias: Deslocamento: - Min Value: Valor mínimo: - Max Value: Valor máximo: - Units Name: Nome das unidades: - Receiving Node: Nó de recepção: - Multiplexing Multiplexação - None Nenhum - Multiplexed Multiplexado - Multiplexor Multiplexador - Extended Estendido - Multiplex value Valor multiplexado - Multiplex Parent Parente multiplexado - Comment: Comentário: - Single values has to be separated by semicolons and the value ranges by hypens (e.g.: 1;2;5-7) @@ -883,7 +767,6 @@ e os intervalos de valores por hífens - Value Table: Tabela de valores: @@ -909,85 +792,71 @@ e os intervalos de valores por hífens DiscreteStateWindow - Single/Multi State WIndow Janela de estado único/multiplo - Candidate Matches: Partidas de candidatos: - Number of States: Número de estados: - Realtime Em tempo real - From logged data Dos dados do log - Toggle Frequency (Seconds) Alternar frequência (segundos) - Iterations Iterações - WAIT ESPERE - Min Bits Bits mínimos - Max Bits Máximo de bits - IDs to Scan IDs para digitalizar - All Todos - None Nenhum - Go for it Vá em frente @@ -996,69 +865,57 @@ e os intervalos de valores por hífens FileComparatorWindow - File Comparator Comparador de arquivos - SIDE 1 LADO 1 - Single file to compare to side 2: Arquivo único para comparar com o lado 2: - - TextLabel TextLabel - Load New File Carregar novo arquivo - Side 2 Lado 2 - One or more files to compare with the single file on side1: Um ou mais arquivos para comparar com o arquivo único no lado 1: - Load A File Carregar um arquivo - Clear Frames Limpar Frames - Show only data unique to Side 1 Mostrar apenas dados exclusivos do Lado 1 - Save Details to File Salvar detalhes em arquivo @@ -1072,49 +929,41 @@ e os intervalos de valores por hífens FirmwareUploaderWindow - Firmware Updater Atualizador de firmware - Loaded File: Arquivo carregado: - Load File Carregar arquivo - Device Token: Token do dispositivo: - CAN Bus: Barramento CAN: - Base Address: Endereço básico: - X of Y bytes X de Y bytes - Start Upload Iniciar upload @@ -1128,67 +977,56 @@ e os intervalos de valores por hífens FlowViewWindow - Flow View Visualização de fluxo - Playback Control Controle de reprodução - Playback Speed: Velocidade de reprodução: - Loop Playback Reprodução em loop - Current Frame: Frame Atual: - X of Y X de Y - Live Mode (No Playback) Modo ao vivo (sem reprodução) - Synchronize windows Sincronizar janelas - Graph by timestamp Gráfico por carimbo de data/hora - Auto Reference Referência automática - Reference Values (Hex) Valores de referência (Hex) @@ -1197,10 +1035,6 @@ e os intervalos de valores por hífens - - - - 0 0 @@ -1209,10 +1043,6 @@ e os intervalos de valores por hífens - - - - 1 1 @@ -1221,10 +1051,6 @@ e os intervalos de valores por hífens - - - - 2 2 @@ -1233,10 +1059,6 @@ e os intervalos de valores por hífens - - - - 3 3 @@ -1245,10 +1067,6 @@ e os intervalos de valores por hífens - - - - 4 4 @@ -1257,10 +1075,6 @@ e os intervalos de valores por hífens - - - - 5 5 @@ -1269,10 +1083,6 @@ e os intervalos de valores por hífens - - - - 6 6 @@ -1281,22 +1091,16 @@ e os intervalos de valores por hífens - - - - 7 7 - Current Values (Hex) Valores Atuais (Hex) - Data Seek Values Valores de busca de dados @@ -1309,38 +1113,26 @@ e os intervalos de valores por hífens - - - - - - - - -1 -1 - Chart range Intervalo do gráfico - 50 50 - Timeline: Linha do tempo: - Frame IDs Found: IDs de Frame encontrados: @@ -1545,43 +1337,36 @@ e os intervalos de valores por hífens FrameInfoWindow - Detailed Frame Information Informações detalhadas do frame - Frame IDs: IDs de frame: - Unique IDs IDs únicos - Details: Detalhes: - Save details to file Salvar detalhes em arquivo - Interval Histogram Histograma de intervalo - Bytes Graph Gráfico de Bytes @@ -1753,121 +1538,101 @@ e os intervalos de valores por hífens FramePlaybackWindow - Playback Reprodução - Use original frame timing from captured frames Use o tempo de frame original dos frames capturados - Wait for traffic before starting playback Aguarde o tráfego antes de iniciar a reprodução - Playback speed (ms): Velocidade de reprodução (ms): - Burst Rate: Taxa de burst: - Current Playback Item: Item de reprodução atual: - TextLabel TextLabel - Current frame: Quadro atual: - x of y x de y - Loop Sequence Sequência de Loop - Send to CANBus Enviar para CANBus - <html><head/><body><p>Playback Sequence:</p></body></html> <html><head/><body><p>Sequência de reprodução:</p></body></html> - Load File Carregar arquivo - Load Captured Data Carregar dados capturados - Delete Selected Excluir selecionado - ID Filtering: Filtragem de ID: - Select all IDs Selecione todos os IDs - Deselect all IDs Desmarcar todos os IDs - Load Filters Carregar filtros - Save Filters Salvar filtros @@ -1914,37 +1679,31 @@ e os intervalos de valores por hífens FrameSenderWindow - Frame Sender Envio de Frame - Enable All Ativar tudo - Disable All Desativar tudo - Clear Grid Limpar grade - Load to Grid Carregar na grade - Save Grid Salvar grade @@ -1959,256 +1718,213 @@ e os intervalos de valores por hífens FuzzingWindow - Fuzzing Window Janela Difusão - Interframe Timing (ms) Tempo entre frames (ms) - Number of data bytes Número de bytes de dados - Burst Rate Taxa de burst - Bus or Buses to Send On Barramento ou Barramentos para enviar - ID Scanning Digitalização de ID - Seqential Sequencial - - Random Aleatório - ID Selection Seleção de ID - Range of IDs Faixa de IDs - Filter List Lista de filtros - Bit Scanning Varredura de bits - Sequential Sequencial - Sweep Varrer - IDs IDs - Start ID: ID inicial: - End ID: ID final: - All Todos - None Nenhum - Byte Values (Always in hexadecimal) Valores de bytes (sempre em hexadecimal) - 0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9 - 10 10 - 11 11 - 12 12 - 13 13 - 14 14 - 15 15 - White = Bit always 0, Green = Fuzz Bit, Black = Bit always set, Gray = Past end of data bytes Branco = Bit sempre 0, Verde = Bit Difuso, Preto = Bit sempre definido, Cinza = Passado o fim dos bytes de dados - All High Todos Alto - All Low Todos Baixo - All Auto Tudo Automático - Start Fuzzing Comece a difusão - # of sent frames: # de frames enviados: @@ -2217,7 +1933,6 @@ e os intervalos de valores por hífens GraphingWindow - Data Graphing Gráficos de dados @@ -2342,7 +2057,6 @@ e os intervalos de valores por hífens HelpWindow - SavvyCAN Help Ajuda do SavvyCAN @@ -2351,67 +2065,56 @@ e os intervalos de valores por hífens ISOTP_InterpreterWindow - ISO-TP Decoder Decodificador ISO-TP - Interpreted Messages Overview Visão geral das mensagens interpretadas - Interpret Previously Captured Frames Interpretar frames capturados anteriormente - Clear Messages List Limpar lista de mensagens - Save List Salvar lista - Show incomplete and/or corrupted messages Mostrar mensagens incompletas e/ou corrompidas - Use extended addressing Use endereçamento estendido - Data Details of Selected Message Detalhes dos dados da mensagem selecionada - IDs to Decode IDs para decodificar - All Todos - None Nenhum @@ -2430,255 +2133,212 @@ e os intervalos de valores por hífens MainSettingsDialog - Main Settings Configurações principais - Main Form Settings: Configurações principais do formulário: - Autoscroll main frame window by default Janela do quadro principal de rolagem automática por padrão - Maximum data bytes per line Máximo de bytes de dados por linha - General Settings: Configurações Gerais: - Save/Restore window positions and sizes Salvar/restaurar posições e tamanhos de janelas - Save/Restore CAN bus connections Salvar/restaurar conexões de barramento CAN - Display values as hexadecimal Exibir valores como hexadecimal - Require validation of GVRET connection Exigir validação da conexão GVRET - Use filtered frames in sub-windows Use frames filtrados em subjanelas - OpenGL Accelerated AntiAliased Graphing Gráficos AntiAliased acelerados por OpenGL - CAN Frame Pre-allocation Size Tamanho de pré-alocação do frame CAN - Time Keeping Cronometragem - Seconds/Milli/Micro are dongle based Segundos/Milli/Micro são baseados em dongle - Seconds Segundos - Microseconds Microssegundos - Milliseconds Milissegundos - System Clock Relógio do sistema - Time Format String: Sequência de formato de hora: - Use absolute time in decoded CSV output Use tempo absoluto na saída CSV decodificada - Font Fonte - Use fixed-width font in tables Use fonte de largura fixa em tabelas - Size Tamanho - Flowview Settings: Configurações de visualização de fluxo: - Use timestamp mode by default Use o modo timestamp por padrão - Set Auto Reference by default Definir referência automática por padrão - - Hexadecimal Graph Y Axis Eixo Y do gráfico hexadecimal - Playback Window Settings: Configurações da janela de reprodução: - Loop by default Loop por padrão - Default playback speed (ms) Velocidade de reprodução padrão (ms) - Default Sending Bus Barramento de envio padrão - DBC Settings Configurações DBC - Label DBC messages by default Mostrar mensagens DBC por padrão - Ignore DBC message colors Ignorar cores de mensagens DBC - File Info and Comparator Settings: Informações do arquivo e configurações do comparador: - Auto expand all nodes Expandir automaticamente todos os nós - MQTT Remote CAN Settings: Configurações CAN remotas MQTT: - Host: Host: - Port: Porta: - User Name: Nome de usuário: - Password Senha - Some settings will not take effect until the application is restarted Algumas configurações não terão efeito até que o aplicativo seja reiniciado @@ -2712,362 +2372,302 @@ e os intervalos de valores por hífens MainWindow - SavvyCAN SavvyCAN - Remote Connection Active: Conexão remota ativa: - Total Frames Captured: Total de frames capturados: - Frames Per Second: Frames por segundo: - Suspend Capturing Suspender captura - Normalize Frame Timing Normalizar o tempo do frame - Clear Frames Limpar Frames - Keep Filters When Clearing Mantenha os filtros ao limpar - Auto Scroll Window Janela de rolagem automática - Overwrite Mode Modo de substituição - Interpret Frames Interpretar frames - Expand All Rows Expandir todas as linhas - Collapse All Rows Recolher todas as linhas - Bus Filtering: Filtragem de barramento: - Frame Filtering: Filtragem de frames: - All Todos - None Nenhum - RE Tools Ferramentas RE - Send Frames Enviar frames - File Arquivo - Connection Conexão - Playback Reprodução - Custom Personalizado - Flow View Visualização de fluxo - Fuzzy Scope Escopo difuso - New Graphing Window Nova janela gráfica - Load Log File Carregar arquivo de log - Ctrl+O Ctrl+O - Save Log File Salvar arquivo de registro - Frame Data Analysis Análise de dados de frames - Load DBC File Carregar arquivo DBC - Edit Messages/Signals Editar mensagens/sinais - Save DBC File Salvar arquivo DBC - Save Decoded Frames Salvar Frames decodificados - Exit Application Sair do aplicativo - File Comparison Comparação de arquivos - Preferences Preferências - Save Filtered Log File Salvar arquivo de log filtrado - Load Filter Definition Definição de filtro de carga - Save Filter Definition Salvar definição de filtro - Firmware Uploader Carregador de firmware - Open Connection Window Abrir janela de conexão - Connect Conectar - Scripting Interface Interface de script - Range State Estado do intervalo - Single/Multi State Estado único/múltiplo - DBC File Manager Gerenciador de arquivos DBC - Fuzzing Difusão - UDS Scanner Scanner UDS - ISO-TP Decoder Decodificador ISO-TP - Sniffer Sniffer - Firmware Update Atualização de Firmware - MotorControlConfig MotorControlConfig - Capture Bisector Capturar Bissetriz - Signal Viewer Visualizador de sinal - Start Continuous Logging Iniciar Log contínuo - Temporal Graph Gráfico Temporal - DBC Comparison Comparação DBC - Save Decoded Frames CSV Salvar quadros decodificados CSV - CAN Bridge Ponte CAN @@ -3226,25 +2826,21 @@ e os intervalos de valores por hífens MotorControllerConfigWindow - Controller Configuration Configuração do controlador - Load Definition File Carregar arquivo de definição - Refresh Atualizar - Save Salvar @@ -3258,103 +2854,86 @@ e os intervalos de valores por hífens NewConnectionDialog - New Connection Nova conexão - Connection Type Tipo de conexão - socketcand (SocketCAN over Ethernet) socketcand (SocketCAN sobre Ethernet) - QT SerialBus Devices (SocketCAN, PeakCAN, etc) Dispositivos QT SerialBus (SocketCAN, PeakCAN, etc.) - MQTT Connection Conexão MQTT - Serial Connection (GVRET) Conexão serial (GVRET) - Network connection (GVRET) Conexão de rede (GVRET) - LAWICEL / SLCAN Serial LAWICEL/SLCAN Serial - CANserver CANserver - CANlogserver CANlogserver - SerialBus Device Type: Tipo de dispositivo SerialBus: - Serial Port: Porta serial: - Serial Port Speed: Velocidade da porta serial: - CAN Bus Speed: Velocidade do barramento CAN: - CAN-FD CAN-FD - CAN-FD data rate Taxa de dados CAN-FD - Create New Connection Criar nova conexão @@ -3363,159 +2942,132 @@ e os intervalos de valores por hífens NewGraphDialog - Graph Settings Configurações de gráfico - <html><head/><body><p>Name:</p></body></html> <html><head/><body><p>Nome:</p></body></html> - ID: ID: - Start Bit: Bit inicial: - Graph a DBC Signal: Representar graficamente um sinal DBC: - Node: Nó: - Message: Mensagem: - Signal: Sinal: - Copy Signal Parameters Copiar parâmetros de sinal - Bit Len: Largura do Bit: - Little Endian Little Endian - (LSB First) (LSB Primeiro) - Signed: Signed: - Mask: Máscara: - Bias: Deslocamento: - Scale Escala - Stride Passo - Associated Bus Barramento Associado - -1 -1 - Only Points Apenas pontos - Point Style Estilo de ponto - Line Thickness Espessura da linha - Line Color Cor da linha - - CHANGE MUDAR - Fill Color Cor de preenchimento - Add this graph Adicione este gráfico @@ -3539,79 +3091,66 @@ e os intervalos de valores por hífens RangeStateWindow - Range State Window Janela de estado de intervalo - Candidate Signals: Sinais de Candidato: - Graphical Representation of Selected Signal: Representação gráfica do sinal selecionado: - Sensitivity Sensibilidade - Min Signal Size: Tamanho mínimo do sinal: - Max Signal Size: Tamanho máximo do sinal: - Granularity: Granularidade: - Signal Mode: Modo de sinal: - Signed Mode: Modo Signed: - ID Filter: Filtro de ID: - All Todos - None Nenhum - Recalculate Candidate Signals Recalcular Sinais Candidatos @@ -3646,97 +3185,81 @@ e os intervalos de valores por hífens ScriptingWindow - Scripting Interface Interface de script - Public Variables Variáveis ​​Públicas - Loaded Scripts Scripts carregados - &New &Novo - &Del &Excluir - &Load &Carregar - Script Editing Window Janela de edição de script - &Save &Salvar - Sa&ve As Sal&var como - &Revert &Reverter - R&eload R&ecarregar - Re&compile Re&compilar - Log Window Janela de Log - &Auto Scroll Log Window &Janela de registro de rolagem automática - Clear Log &Window &Limpar Log e janela - Save L&og Salvar L&og @@ -3756,61 +3279,51 @@ e os intervalos de valores por hífens SignalViewerWindow - Signal Viewer Visualizador de sinal - Remove Selected Signal Remover sinal selecionado - Node Nó - Message Mensagem - Signal Sinal - Add To Viewer Adicionar ao visualizador - Save View Salvar visualização - Load View Carregar visualização - Append to View Anexar à visualização - Clear View Limpar Visão @@ -3825,7 +3338,6 @@ e os intervalos de valores por hífens TemporalGraphWindow - Temporal Graph Gráfico Temporal @@ -3834,61 +3346,51 @@ e os intervalos de valores por hífens TriggerDialog - Trigger Builder Construtor de Triggers - Add New Adicionar novo - Delete Excluir - Bus Barramento - Msg ID ID da mensagem - Signal Signed - MS Delay Atraso MS - Max Count Contagem máxima - Signal Value Valor do sinal - Save And Update Salvar e atualizar @@ -3897,43 +3399,36 @@ e os intervalos de valores por hífens UDSScanWindow - UDS Scanner Scanner UDS - Scans To Run Varreduras para executar - Add Adicionar - Delete Excluir - Load Carregar - Save Salvar - Starting ID ID inicial @@ -3945,121 +3440,96 @@ e os intervalos de valores por hífens - - - - - - - 0x 0x - Ending ID ID final - Show "No Reply" Mostrar "Sem resposta" - Allow adaptive reply offset Permitir deslocamento de resposta adaptável - Bus to scan Barramento para escanear - Maximum reply delay (ms) Atraso máximo de resposta (ms) - Reply Offset: Compensação de resposta: - Scan Type: Tipo de varredura: - Run test in session type: Execute o teste no tipo de sessão: - Subfunct Len: Len subfunção: - Lower Bound: Limite inferior: - Upper Bound: Limite superior: - Increment Incremento - Lower Service: Serviço inferior: - Upper Service: Serviço Superior: - Results Resultados - Run All Scans Execute todas as varreduras - Run Selected Scan Executar varredura selecionada - Save Scan Results Salvar resultados da varredura @@ -4079,81 +3549,67 @@ e os intervalos de valores por hífens snifferWindow - Sniffer Sniffer - Notch Encaixar - Unnotch Desencaixar - Mute notched bits Silenciar bits enganchados - Notch Interval Intervalo de encaixe - - ms ms - Expire Interval Intervalo de expiração - Never Expire IDs Nunca expire IDs - Fade inactive bytes Desaparecer bytes inativos - View Bits Ver bits - Filters: Filtros: - All Todos - None Nenhum From 316cb90b1fef5c680f3de35a655752c02f33fd24 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 20:56:00 -0300 Subject: [PATCH 08/24] translations must be shipped with the app (don't know if i did the right way) --- .github/workflows/build.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6e4d322..d19133d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -57,7 +57,9 @@ jobs: - name: Package run: | + mkdir -p SavvyCAN.app/Contents/MacOS/translations mkdir -p SavvyCAN.app/Contents/MacOS/help + cp -R translations/*.qm SavvyCAN.app/Contents/MacOS/translations cp -R help/* SavvyCAN.app/Contents/MacOS/help macdeployqt SavvyCAN.app -dmg mv SavvyCAN.dmg SavvyCAN_x64.dmg @@ -87,7 +89,9 @@ jobs: - name: Package run: | + mkdir -p SavvyCAN.app/Contents/MacOS/translations mkdir -p SavvyCAN.app/Contents/MacOS/help + cp -R translations/*.qm SavvyCAN.app/Contents/MacOS/translations cp -R help/* SavvyCAN.app/Contents/MacOS/help macdeployqt SavvyCAN.app -dmg mv SavvyCAN.dmg SavvyCAN_arm64.dmg @@ -120,6 +124,7 @@ jobs: mkdir package copy "release/SavvyCAN.exe" package/ mkdir package/help + copy translations/*.qm package/translations/ copy help/*.md package/help/ mkdir package/help/images copy help/images/*.* package/help/images/ From f72db3e03abdff5a904e86d1e6e6460f915110aa Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 21:30:08 -0300 Subject: [PATCH 09/24] adding guidelines to run script and configure tools in qt creator --- scripts/README.md | 13 +++++++++++++ scripts/build_translations.sh | 18 +++++++++++------- scripts/edit_translations.sh | 6 ------ scripts/update_translations.sh | 17 +++++++++++------ 4 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 scripts/README.md delete mode 100755 scripts/edit_translations.sh diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..d2d6f6a --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,13 @@ +# Scripts + +To run this scripts, first you must authorize your terminal to run: + +```bash +chmod +x script/*.sh +``` + +Then you can run by using this command: + +```bash +./scripts/the/script/you/want/to/run +``` diff --git a/scripts/build_translations.sh b/scripts/build_translations.sh index fa05d08..a620c65 100755 --- a/scripts/build_translations.sh +++ b/scripts/build_translations.sh @@ -1,12 +1,16 @@ #!/bin/bash -PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" -TRANSLATIONS_DIR="$PROJECT_ROOT/translations" +PROJECT_ROOT="$(pwd)" -echo "Gerando arquivos .qm..." +# To add this tool in Qt Creator: +# Category: Linguist +# Name: Release Translations (lrelease) +# Executable: lrelease +# Arguments: SavvyCAN.pro +# Working Directory: %{ActiveProject:Path} -for file in "$TRANSLATIONS_DIR"/*.ts; do - lrelease "$file" -done +echo "Generating .qm files..." -echo "Arquivos .qm gerados." \ No newline at end of file +lrelease "$PROJECT_ROOT"/SavvyCAN.pro + +echo ".qm files generated." diff --git a/scripts/edit_translations.sh b/scripts/edit_translations.sh deleted file mode 100755 index 96dc0c1..0000000 --- a/scripts/edit_translations.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" -TRANSLATIONS_DIR="$PROJECT_ROOT/translations" - -linguist "$TRANSLATIONS_DIR"/SavvyCAN_*.ts \ No newline at end of file diff --git a/scripts/update_translations.sh b/scripts/update_translations.sh index 361105b..0fb05cb 100755 --- a/scripts/update_translations.sh +++ b/scripts/update_translations.sh @@ -1,11 +1,16 @@ #!/bin/bash -PROJECT_ROOT="$(dirname "$(dirname "$(realpath "$0")")")" -TRANSLATIONS_DIR="$PROJECT_ROOT/translations" +PROJECT_ROOT="$(pwd)" -echo "Atualizando arquivos de tradução..." +# To add this tool in Qt Creator: +# Category: Linguist +# Name: Update Translations (lupdate) +# Executable: lupdate +# Arguments: -project SavvyCAN.pro +# Working Directory: %{ActiveProject:Path} -lupdate "$PROJECT_ROOT" \ --ts "$TRANSLATIONS_DIR"/SavvyCAN_*.ts +echo "Updating translation files..." -echo "Traduções atualizadas." \ No newline at end of file +lupdate -project "$PROJECT_ROOT"/SavvyCAN.pro + +echo "Translation files updated." From b86e0369c8ca1a09d5d370e2402024ac804d23d1 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 22:57:11 -0300 Subject: [PATCH 10/24] adding a dynamic list for language available and the language list --- mainsettingsdialog.cpp | 50 ++++++++++++++++++++++++++++++++++++++++ mainsettingsdialog.h | 1 + ui/mainsettingsdialog.ui | 14 +++++++++++ 3 files changed, 65 insertions(+) diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index eae6272..8ca4715 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -3,6 +3,10 @@ #include "helpwindow.h" #include #include +#include +#include +#include +#include #include "simplecrypt.h" //using this simple encryption library to obfuscate stored password a bit. It's not super secure but better than @@ -10,6 +14,42 @@ //whatever key, you'd see it. Just behave yourselves SimpleCrypt crypto(Q_UINT64_C(0xdeadbeefface6285)); +static QStringList availableLanguageCodes() +{ + QStringList codes; + QDir transDir(QCoreApplication::applicationDirPath() + "/translations"); + QStringList list = transDir.entryList(QStringList() << "SavvyCAN_*.qm"); + //* just for test purposes + if (list.isEmpty()) { + // maybe only ts files exist during development + list = transDir.entryList(QStringList() << "SavvyCAN_*.ts"); + } + for (QString file : list) { + QRegExp re("SavvyCAN_(.*)\\.(qm|ts)"); + if (re.indexIn(file) != -1) { + codes << re.cap(1); + } + } + return codes; +} + +void MainSettingsDialog::populateLanguageCombo() +{ + ui->comboLanguage->clear(); + QStringList codes = availableLanguageCodes(); + if (codes.isEmpty()) { + codes << "en"; // fallback + } + for (const QString &code : codes) { + QLocale locale(code); + QString name = locale.nativeLanguageName(); + qInfo() << code; + if (name.isEmpty()) + name = code; + ui->comboLanguage->addItem(name, code); + } +} + MainSettingsDialog::MainSettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::MainSettingsDialog) @@ -17,6 +57,8 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : QSettings settings; ui->setupUi(this); + populateLanguageCombo(); + //TODO: This is still hard coded to support only two buses. Sometimes there is none, sometimes 1, sometimes much more than 2. Fix this. ui->comboSendingBus->addItem(tr("None")); ui->comboSendingBus->addItem(tr("0")); @@ -92,6 +134,12 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", true).toBool()); ui->cbIgnoreDBCColors->setChecked(settings.value("Main/IgnoreDBCColors", false).toBool()); + if (QString savedLang = settings.value("Main/Language").toString(); !savedLang.isEmpty()) { + int idx = ui->comboLanguage->findData(savedLang); + if (idx >= 0) + ui->comboLanguage->setCurrentIndex(idx); + } + int maxFramesDefault; if (QSysInfo::WordSize > 32) { @@ -108,6 +156,7 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->spinBytesPerLine->setValue(settings.value("Main/BytesPerLine", 8).toInt()); //just for simplicity they all call the same function and that function updates all settings at once + connect(ui->comboLanguage, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSettings())); connect(ui->cbDisplayHex, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbFlowAutoRef, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); connect(ui->cbFlowUseTimestamp, SIGNAL(toggled(bool)), this, SLOT(updateSettings())); @@ -177,6 +226,7 @@ void MainSettingsDialog::updateSettings() { QSettings settings; + settings.setValue("Main/Language", ui->comboLanguage->currentData().toString()); settings.setValue("Main/UseHex", ui->cbDisplayHex->isChecked()); settings.setValue("FlowView/AutoRef", ui->cbFlowAutoRef->isChecked()); settings.setValue("FlowView/UseTimestamp", ui->cbFlowUseTimestamp->isChecked()); diff --git a/mainsettingsdialog.h b/mainsettingsdialog.h index 0ffb0ec..392581d 100644 --- a/mainsettingsdialog.h +++ b/mainsettingsdialog.h @@ -25,6 +25,7 @@ public slots: private: Ui::MainSettingsDialog *ui; + void populateLanguageCombo(); void closeEvent(QCloseEvent *event); bool eventFilter(QObject *obj, QEvent *event); }; diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index e65e91c..e636682 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -53,6 +53,20 @@ + + + + + + Language + + + + + + + + From 35e0ae0e93379d3bc7860ff00ce88734b038a770 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 23:10:26 -0300 Subject: [PATCH 11/24] updating scripts to fix run error --- scripts/build_translations.sh | 2 +- scripts/update_translations.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build_translations.sh b/scripts/build_translations.sh index a620c65..47e6ea5 100755 --- a/scripts/build_translations.sh +++ b/scripts/build_translations.sh @@ -11,6 +11,6 @@ PROJECT_ROOT="$(pwd)" echo "Generating .qm files..." -lrelease "$PROJECT_ROOT"/SavvyCAN.pro +lrelease -verbose "$PROJECT_ROOT"/SavvyCAN.pro echo ".qm files generated." diff --git a/scripts/update_translations.sh b/scripts/update_translations.sh index 0fb05cb..8f2260d 100755 --- a/scripts/update_translations.sh +++ b/scripts/update_translations.sh @@ -11,6 +11,6 @@ PROJECT_ROOT="$(pwd)" echo "Updating translation files..." -lupdate -project "$PROJECT_ROOT"/SavvyCAN.pro +lupdate -verbose "$PROJECT_ROOT"/SavvyCAN.pro echo "Translation files updated." From 0fd2e7d583b5ea645cbd1536cb6d98afe6e927e1 Mon Sep 17 00:00:00 2001 From: lexcibien Date: Fri, 6 Mar 2026 23:10:53 -0300 Subject: [PATCH 12/24] updating after finish menu to add translation --- translations/SavvyCAN_en.ts | 93 ++++++++++++++++++---------------- translations/SavvyCAN_pt_BR.ts | 93 ++++++++++++++++++---------------- 2 files changed, 98 insertions(+), 88 deletions(-) diff --git a/translations/SavvyCAN_en.ts b/translations/SavvyCAN_en.ts index 001a6d7..7fe0280 100644 --- a/translations/SavvyCAN_en.ts +++ b/translations/SavvyCAN_en.ts @@ -2149,218 +2149,223 @@ and the value ranges by hypens - + + Language + + + + General Settings: - + Save/Restore window positions and sizes - + Save/Restore CAN bus connections - + Display values as hexadecimal - + Require validation of GVRET connection - + Use filtered frames in sub-windows - + OpenGL Accelerated AntiAliased Graphing - + CAN Frame Pre-allocation Size - + Time Keeping - + Seconds/Milli/Micro are dongle based - + Seconds - + Microseconds - + Milliseconds - + System Clock - + Time Format String: - + Use absolute time in decoded CSV output - + Font - + Use fixed-width font in tables - + Size - + Flowview Settings: - + Use timestamp mode by default - + Set Auto Reference by default - - + + Hexadecimal Graph Y Axis - + Playback Window Settings: - + Loop by default - + Default playback speed (ms) - + Default Sending Bus - + DBC Settings - + Label DBC messages by default - + Ignore DBC message colors - + File Info and Comparator Settings: - + Auto expand all nodes - + MQTT Remote CAN Settings: - + Host: - + Port: - + User Name: - + Password - + Some settings will not take effect until the application is restarted - + None - + 0 - + 1 - + All - + From File diff --git a/translations/SavvyCAN_pt_BR.ts b/translations/SavvyCAN_pt_BR.ts index 521b253..e062b9a 100644 --- a/translations/SavvyCAN_pt_BR.ts +++ b/translations/SavvyCAN_pt_BR.ts @@ -2152,218 +2152,223 @@ e os intervalos de valores por hífens Máximo de bytes de dados por linha - + + Language + Idioma + + + General Settings: Configurações Gerais: - + Save/Restore window positions and sizes Salvar/restaurar posições e tamanhos de janelas - + Save/Restore CAN bus connections Salvar/restaurar conexões de barramento CAN - + Display values as hexadecimal Exibir valores como hexadecimal - + Require validation of GVRET connection Exigir validação da conexão GVRET - + Use filtered frames in sub-windows Use frames filtrados em subjanelas - + OpenGL Accelerated AntiAliased Graphing Gráficos AntiAliased acelerados por OpenGL - + CAN Frame Pre-allocation Size Tamanho de pré-alocação do frame CAN - + Time Keeping Cronometragem - + Seconds/Milli/Micro are dongle based Segundos/Milli/Micro são baseados em dongle - + Seconds Segundos - + Microseconds Microssegundos - + Milliseconds Milissegundos - + System Clock Relógio do sistema - + Time Format String: Sequência de formato de hora: - + Use absolute time in decoded CSV output Use tempo absoluto na saída CSV decodificada - + Font Fonte - + Use fixed-width font in tables Use fonte de largura fixa em tabelas - + Size Tamanho - + Flowview Settings: Configurações de visualização de fluxo: - + Use timestamp mode by default Use o modo timestamp por padrão - + Set Auto Reference by default Definir referência automática por padrão - - + + Hexadecimal Graph Y Axis Eixo Y do gráfico hexadecimal - + Playback Window Settings: Configurações da janela de reprodução: - + Loop by default Loop por padrão - + Default playback speed (ms) Velocidade de reprodução padrão (ms) - + Default Sending Bus Barramento de envio padrão - + DBC Settings Configurações DBC - + Label DBC messages by default Mostrar mensagens DBC por padrão - + Ignore DBC message colors Ignorar cores de mensagens DBC - + File Info and Comparator Settings: Informações do arquivo e configurações do comparador: - + Auto expand all nodes Expandir automaticamente todos os nós - + MQTT Remote CAN Settings: Configurações CAN remotas MQTT: - + Host: Host: - + Port: Porta: - + User Name: Nome de usuário: - + Password Senha - + Some settings will not take effect until the application is restarted Algumas configurações não terão efeito até que o aplicativo seja reiniciado - + None Nenhum - + 0 0 - + 1 1 - + All Todos - + From File Do arquivo From 5e5977f8619a0f3610afa4d8fa13f68d2094d2b2 Mon Sep 17 00:00:00 2001 From: ondrasy Date: Wed, 11 Mar 2026 18:37:35 +0100 Subject: [PATCH 13/24] Modify the Note to point users to QT6 buildable source more easily. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6f6aa1..54905d2 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ to download it separately. This project requires 5.14.0 or higher because of a dependency on QtSerialBus and other new additions to Qt. -NOTE: As the code in this master branch sits, it does compile with QT6. Support for QT6 is approximately "beta" quality. Most all functions should work, please send issues if found. +NOTE: There is a work-in-progress branch QT6WIP that can compile with QT6 (Tested with Qt 6.9 on 2026-03-11). Support for QT6 is approximately "beta" quality. Most all functions should work, please send issues if found. It appears that the current binary build for MacOS requires at least MacOS 10.15 From 0c793397a406c8b53db7a35be213db9bf36617bc Mon Sep 17 00:00:00 2001 From: Daniele Baggio Date: Fri, 13 Mar 2026 14:51:57 +0100 Subject: [PATCH 14/24] add copy content from table selection (main window table) --- mainwindow.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++++------ mainwindow.h | 3 ++ 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 9e6fea3..1466608 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -10,6 +10,7 @@ #include "utility.h" #include "filterutility.h" +#include /* Some notes on things I'd like to put into the program but haven't put on github (yet) @@ -143,6 +144,11 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->canFramesView, &QAbstractItemView::clicked, this, &MainWindow::gridClicked); connect(ui->canFramesView, &QAbstractItemView::doubleClicked, this, &MainWindow::gridDoubleClicked); ui->canFramesView->setContextMenuPolicy(Qt::CustomContextMenu); + + copyAct = new QAction(tr("Copy"), this); + copyAct->setShortcut(QKeySequence::Copy); + connect(copyAct, &QAction::triggered, this, &MainWindow::copyFromTable); + ui->canFramesView->addAction(copyAct); connect(ui->canFramesView, &QAbstractItemView::customContextMenuRequested, this, &MainWindow::gridContextMenuRequest); connect(model, &CANFrameModel::updatedFiltersList, this, &MainWindow::updateFilterList); @@ -741,20 +747,75 @@ void MainWindow::gridContextMenuRequest(QPoint pos) { QModelIndex idx = ui->canFramesView->indexAt(pos); //figure out where in the view we clicked (row, column) qDebug() << "Pos: " << pos << " Row :" << idx.row() << " Col: " << idx.column(); - qDebug() << "Data: " << idx.data(); + + if (!idx.isValid()) return; + + QMenu *menu = new QMenu(this); + menu->setAttribute(Qt::WA_DeleteOnClose); + + menu->addAction(copyAct); + if (idx.column() == 8) //we're over the DATA column { contextMenuPosition = pos; - - QMenu *menu = new QMenu(this); - menu->setAttribute(Qt::WA_DeleteOnClose); - - menu->addAction(tr("Add to a new graphing window"), this, SLOT(setupAddToNewGraph())); menu->addSeparator(); + menu->addAction(tr("Add to a new graphing window"), this, SLOT(setupAddToNewGraph())); menu->addAction(tr("Add to latest graphing window"), this, SLOT(setupSendToLatestGraphWindow())); - - menu->popup(ui->canFramesView->mapToGlobal(pos)); } + + menu->popup(ui->canFramesView->viewport()->mapToGlobal(pos)); +} + +void MainWindow::copyFromTable() +{ + copySelection(); +} + +void MainWindow::copySelection() +{ + QItemSelectionModel *selectionModel = ui->canFramesView->selectionModel(); + QModelIndexList selectedIndexes = selectionModel->selectedIndexes(); + + if(selectedIndexes.isEmpty()) + return; + + // QModelIndex::operator< sorts by row and then by column. + std::sort(selectedIndexes.begin(), selectedIndexes.end()); + + QString selectedText; + int currentRow = -1; + int lastRow = selectedIndexes.last().row(); + + for(const QModelIndex ¤t : selectedIndexes) + { + if (currentRow != -1 && current.row() != currentRow) + { + // remove last tab + if (selectedText.endsWith(QLatin1Char('\t'))) + selectedText.chop(1); + selectedText.append(QLatin1Char('\n')); + } + currentRow = current.row(); + + QString cellText = current.data(Qt::DisplayRole).toString(); + + // Replace newlines within a cell to avoid breaking the table structure in Excel + cellText.replace(QLatin1Char('\n'), QLatin1String(" ")); + + selectedText.append(cellText); + + if (current.row() != lastRow || current != selectedIndexes.last()) + { + selectedText.append(QLatin1Char('\t')); + } + } + + // remove last tab if it exists + if (selectedText.endsWith(QLatin1Char('\t'))) + selectedText.chop(1); + + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(selectedText); } QString MainWindow::getSignalNameFromPosition(QPoint pos) diff --git a/mainwindow.h b/mainwindow.h index 31df02c..f78082e 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -110,6 +110,7 @@ private slots: void gridClicked(QModelIndex); void gridDoubleClicked(QModelIndex); void gridContextMenuRequest(QPoint pos); + void copyFromTable(); void setupAddToNewGraph(); void setupSendToLatestGraphWindow(); void interpretToggled(bool); @@ -147,6 +148,7 @@ signals: private: Ui::MainWindow *ui; + QAction *copyAct; static MainWindow *selfRef; //canbus related data @@ -213,6 +215,7 @@ private: //private methods QString getSignalNameFromPosition(QPoint pos); uint32_t getMessageIDFromPosition(QPoint pos); + void copySelection(); void handleSaveDecodedMethod(bool csv); void saveDecodedTextFile(QString); void saveDecodedTextFileAsColumns(QString); From fb6881eeaaebcb873c3fa97099d2a7b74f5ad12c Mon Sep 17 00:00:00 2001 From: Daniele Baggio Date: Wed, 18 Mar 2026 10:31:22 +0100 Subject: [PATCH 15/24] settings and render for setUseColorsByCanId --- canframemodel.cpp | 55 ++++++++++++++++++++++---------- canframemodel.h | 2 ++ mainsettingsdialog.cpp | 3 ++ mainwindow.cpp | 5 ++- mainwindow.h | 1 + ui/mainsettingsdialog.ui | 7 ++++ utility.h | 69 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 124 insertions(+), 18 deletions(-) diff --git a/canframemodel.cpp b/canframemodel.cpp index ef2ccf8..a778796 100644 --- a/canframemodel.cpp +++ b/canframemodel.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include "utility.h" @@ -76,6 +78,7 @@ CANFrameModel::CANFrameModel(QObject *parent) overwriteDups = false; filtersPersistDuringClear = false; useHexMode = true; + useColorsByCanId = false; timeStyle = TS_MICROS; timeOffset = 0; needFilterRefresh = false; @@ -101,6 +104,16 @@ void CANFrameModel::setHexMode(bool mode) } } +void CANFrameModel::setUseColorsByCanId(bool mode) +{ + if (useColorsByCanId != mode) + { + this->beginResetModel(); + useColorsByCanId = mode; + this->endResetModel(); + } +} + void CANFrameModel::setTimeStyle(TimeStyle newStyle) { if (timeStyle != newStyle) @@ -401,7 +414,6 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const { QString tempString; CANFrame thisFrame; - static bool rowFlip = false; QVariant ts; if (!index.isValid()) @@ -425,9 +437,31 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const return msg->bgColor; } } - rowFlip = (index.row() % 2); - if (rowFlip) return QApplication::palette().color(QPalette::Base); - else return QApplication::palette().color(QPalette::AlternateBase); + + if (useColorsByCanId) + { + QString frameStr = Utility::formatCANID(thisFrame.frameId(), thisFrame.hasExtendedFrameFormat()); + // Color rows by the value in the "category" column + return QBrush(Utility::colorForString(frameStr)); + } + + return (index.row() % 2) ? + QApplication::palette().color(QPalette::Base) : + QApplication::palette().color(QPalette::AlternateBase); + } + + if (role == Qt::ForegroundRole) + { + if (dbcHandler != nullptr && interpretFrames && !ignoreDBCColors) + { + DBC_MESSAGE *msg = dbcHandler->findMessage(thisFrame); + if (msg != nullptr) + { + return msg->fgColor; + } + } + + return QApplication::palette().color(QPalette::WindowText); } if (role == Qt::TextAlignmentRole) @@ -448,19 +482,6 @@ QVariant CANFrameModel::data(const QModelIndex &index, int role) const } } - if (role == Qt::ForegroundRole) - { - if (dbcHandler != nullptr && interpretFrames && !ignoreDBCColors) - { - DBC_MESSAGE *msg = dbcHandler->findMessage(thisFrame); - if (msg != nullptr) - { - return msg->fgColor; - } - } - return QApplication::palette().color(QPalette::WindowText); - } - if (role == Qt::DisplayRole) { switch (Column(index.column())) { diff --git a/canframemodel.h b/canframemodel.h index 6a6bc54..6f58257 100644 --- a/canframemodel.h +++ b/canframemodel.h @@ -47,6 +47,7 @@ public: bool getInterpretMode(); void setOverwriteMode(bool); void setHexMode(bool); + void setUseColorsByCanId(bool); void setClearMode(bool mode); void setTimeStyle(TimeStyle newStyle); void setIgnoreDBCColors(bool mode); @@ -94,6 +95,7 @@ private: QString timeFormat; TimeStyle timeStyle; bool useHexMode; + bool useColorsByCanId; bool needFilterRefresh; bool ignoreDBCColors; int64_t timeOffset; diff --git a/mainsettingsdialog.cpp b/mainsettingsdialog.cpp index eae6272..9012943 100644 --- a/mainsettingsdialog.cpp +++ b/mainsettingsdialog.cpp @@ -90,7 +90,9 @@ MainSettingsDialog::MainSettingsDialog(QWidget *parent) : ui->cbUseFiltered->setChecked(settings.value("Main/UseFiltered", false).toBool()); ui->cbUseOpenGL->setChecked(settings.value("Main/UseOpenGL", false).toBool()); ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", true).toBool()); + ui->cbFilterLabeling->setChecked(settings.value("Main/FilterLabeling", true).toBool()); ui->cbIgnoreDBCColors->setChecked(settings.value("Main/IgnoreDBCColors", false).toBool()); + ui->cbColorsByCanId->setChecked(settings.value("Main/ColorsByCanId", false).toBool()); int maxFramesDefault; if (QSysInfo::WordSize > 32) @@ -208,6 +210,7 @@ void MainSettingsDialog::updateSettings() settings.setValue("Main/MaximumFrames", ui->spinMaximumFrames->value()); settings.setValue("Main/BytesPerLine", ui->spinBytesPerLine->value()); settings.setValue("Main/FontFixedWidth", ui->cbFontFixedWidth->isChecked()); + settings.setValue("Main/ColorsByCanId", ui->cbColorsByCanId->isChecked()); settings.sync(); emit updatedSettings(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 9e6fea3..7b0bb63 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -36,7 +36,7 @@ MainWindow::MainWindow(QWidget *parent) : #endif useHex = true; - + useColorsByCanId = false; selfRef = this; this->setWindowTitle("Savvy CAN V" + QString::number(VERSION) + " [Built " + QString(__DATE__) +"]"); @@ -415,6 +415,9 @@ void MainWindow::readUpdateableSettings() model->setHexMode(useHex); Utility::decimalMode = !useHex; + useColorsByCanId = settings.value("Main/ColorsByCanId", false).toBool(); + model->setUseColorsByCanId(useColorsByCanId); + bool tempBool; TimeStyle ts = TS_MICROS; tempBool = settings.value("Main/TimeSeconds", false).toBool(); diff --git a/mainwindow.h b/mainwindow.h index 31df02c..c44ed2f 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -160,6 +160,7 @@ private: int rxFrames; bool inhibitFilterUpdate; bool useHex; + bool useColorsByCanId; bool allowCapture; bool ignoreDBCColors; bool CSVAbsTime; diff --git a/ui/mainsettingsdialog.ui b/ui/mainsettingsdialog.ui index e65e91c..0cb6047 100644 --- a/ui/mainsettingsdialog.ui +++ b/ui/mainsettingsdialog.ui @@ -97,6 +97,13 @@ + + + + Color rows by CAN ID + + + diff --git a/utility.h b/utility.h index 66bd539..1941d83 100644 --- a/utility.h +++ b/utility.h @@ -10,6 +10,8 @@ #include #include #include +#include +#include //#include enum TimeStyle @@ -20,6 +22,44 @@ enum TimeStyle TS_CLOCK }; + +// 32 dark, saturated colors — all designed for readability on white backgrounds. +// Minimum contrast ratio ≥ 4.5:1 against white (WCAG AA). +static constexpr std::array kRowPalette = {{ + 0xFFC62828, // 0 Red 800 + 0xFFE53935, // 1 Red 600 + 0xFFD84315, // 2 Deep Orange 800 + 0xFFEF6C00, // 3 Orange 800 + 0xFFF9A825, // 4 Amber 800 + 0xFF558B2F, // 5 Green 800 + 0xFF2E7D32, // 6 Green 900 + 0xFF00695C, // 7 Teal 800 + 0xFF00838F, // 8 Cyan 800 + 0xFF0277BD, // 9 Blue 800 + 0xFF1565C0, // 10 Blue 900 + 0xFF283593, // 11 Indigo 900 + 0xFF4527A0, // 12 Deep Purple 800 + 0xFF6A1B9A, // 13 Purple 900 + 0xFF880E4F, // 14 Pink 900 + 0xFFAD1457, // 15 Pink 800 + 0xFF37474F, // 16 Blue Grey 800 + 0xFF4E342E, // 17 Brown 800 + 0xFF827717, // 18 Lime 900 + 0xFF1B5E20, // 19 Green 900 alt + 0xFF006064, // 20 Cyan 900 + 0xFF01579B, // 21 Light Blue 900 + 0xFF0D47A1, // 22 Blue 900 alt + 0xFF311B92, // 23 Deep Purple 900 + 0xFF4A148C, // 24 Purple 900 alt + 0xFFB71C1C, // 25 Red 900 + 0xFFBF360C, // 26 Deep Orange 900 + 0xFFE65100, // 27 Orange 900 + 0xFF33691E, // 28 Light Green 900 + 0xFF004D40, // 29 Teal 900 + 0xFF263238, // 30 Blue Grey 900 + 0xFF5D4037, // 31 Brown 700 +}}; + class Utility { public: @@ -344,6 +384,35 @@ public: return result; } + + // FNV-1a 32-bit hash — fast, good distribution, no dependencies. + static quint32 hashString(const QString &s) + { + quint32 hash = 2166136261u; + for (const QChar ch : s) { + hash ^= static_cast(ch.unicode()); + hash *= 16777619u; + } + return hash; + } + + // Returns a background QColor deterministically chosen from the palette. + // The same string always maps to the same color. + static QColor colorForString(const QString &s) + { + const quint32 idx = hashString(s) % static_cast(kRowPalette.size()); + // Use a light tint (alpha ~18%) as the row background so text stays readable. + QColor base(kRowPalette[idx]); + base.setAlpha(46); // ~18% — comfortable on white, still clearly tinted + return base; + } + + // Opaque variant — useful for badges, tags, or legend swatches. + static QColor solidColorForString(const QString &s) + { + const quint32 idx = hashString(s) % static_cast(kRowPalette.size()); + return QColor(kRowPalette[idx]); + } }; #endif // UTILITY_H From 5313faff69221b367f25373c39046b22d17e175d Mon Sep 17 00:00:00 2001 From: Tomasz Dobrowolski Date: Wed, 18 Mar 2026 11:32:11 +0100 Subject: [PATCH 16/24] Fix LAWICELL timestamping bug --- connections/lawicel_serial.cpp | 34 +++++++++++++++++++++------------- connections/lawicel_serial.h | 2 -- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/connections/lawicel_serial.cpp b/connections/lawicel_serial.cpp index 1be4eb3..320f4d9 100644 --- a/connections/lawicel_serial.cpp +++ b/connections/lawicel_serial.cpp @@ -474,8 +474,6 @@ void LAWICELSerial::readSerialData() QByteArray data; unsigned char c; QString debugBuild; - CANFrame buildFrame; - QByteArray buildData; if (serial) data = serial->readAll(); @@ -491,40 +489,50 @@ void LAWICELSerial::readSerialData() { qDebug() << "Got CR!"; + CANFrame buildFrame; + QByteArray buildData; + if (useSystemTime) { buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(QDateTime::currentMSecsSinceEpoch() * 1000ul)); } else { + bool isFD = false; char offset; char len_index; switch(mBuildLine[0].toLatin1()) { - case 't': + case 'b': case 'd': + isFD = true; + [[fallthrough]]; + case 't': offset = 5; len_index = 4; - break; - case 'T': + break; + case 'B': case 'D': + isFD = true; + [[fallthrough]]; + case 'T': offset = 10; len_index = 9; - break; + break; default: offset = 5; len_index = 4; - break; + break; } - //If total length is greater than command, header and data, timestamps must be enabled. - if (data.length() > (offset + mBuildLine.mid(len_index, 1).toInt() * 2 + 1)) + int dlc = mBuildLine.mid(len_index, 1).toInt(); + int byteCount = isFD ? (int)dlc_code_to_bytes(dlc) : dlc; + int frameStringLen = offset + byteCount * 2; + bool hasTimestamp = mBuildLine.length() > frameStringLen + 1; + if (hasTimestamp) { - //Four bytes after the end of the data bytes. - buildTimestamp = mBuildLine.mid(offset + mBuildLine.mid(len_index, 1).toInt() * 2, 4).toInt(nullptr, 16); - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, buildTimestamp)); + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16) * 1000l)); } else { - //Default to system time if timestamps are disabled. buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(QDateTime::currentMSecsSinceEpoch() * 1000ul)); } } diff --git a/connections/lawicel_serial.h b/connections/lawicel_serial.h index cfee96d..d16e1f6 100644 --- a/connections/lawicel_serial.h +++ b/connections/lawicel_serial.h @@ -60,8 +60,6 @@ protected: bool isAutoRestart; QSerialPort *serial; int framesRapid; - CANFrame buildFrame; - qint64 buildTimestamp; bool can0Enabled; bool can0ListenOnly; bool canFd; From 1483aab2a7ec1c6a7d8889887c686fbca7ada0ed Mon Sep 17 00:00:00 2001 From: Tomasz Dobrowolski Date: Wed, 18 Mar 2026 12:36:22 +0100 Subject: [PATCH 17/24] fix timestamp rollover --- connections/lawicel_serial.cpp | 24 +++++++++++++++++++++++- connections/lawicel_serial.h | 4 ++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/connections/lawicel_serial.cpp b/connections/lawicel_serial.cpp index 320f4d9..bcb4a48 100644 --- a/connections/lawicel_serial.cpp +++ b/connections/lawicel_serial.cpp @@ -17,6 +17,7 @@ LAWICELSerial::LAWICELSerial(QString portName, int serialSpeed, int lawicelSpeed serial = nullptr; isAutoRestart = false; + rebuildLocalTimeBasis(); readSettings(); } @@ -203,6 +204,14 @@ bool LAWICELSerial::piSendFrame(const CANFrame& frame) /****************************************************************/ +void LAWICELSerial::rebuildLocalTimeBasis() +{ + timeBasis = 0; + lastHWTimestamp = -1; + wrapAdder = 0; + lastSysMs = 0; +} + void LAWICELSerial::readSettings() { QSettings settings; @@ -254,6 +263,8 @@ void LAWICELSerial::deviceConnected() { sendDebug("Connecting to LAWICEL Device!"); + rebuildLocalTimeBasis(); + QByteArray output; output.clear(); @@ -529,7 +540,18 @@ void LAWICELSerial::readSerialData() bool hasTimestamp = mBuildLine.length() > frameStringLen + 1; if (hasTimestamp) { - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16) * 1000l)); + qint64 hwTs = mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16); + qint64 sysMs = QDateTime::currentMSecsSinceEpoch(); + if (lastHWTimestamp >= 0 && hwTs < lastHWTimestamp) { + qint64 sysDelta = sysMs - lastSysMs; + wrapAdder += lastHWTimestamp + sysDelta - hwTs; + } + lastHWTimestamp = hwTs; + lastSysMs = sysMs; + qint64 unwrappedMs = wrapAdder + hwTs; + if (timeBasis == 0) + timeBasis = sysMs - unwrappedMs; + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds((timeBasis + unwrappedMs) * 1000)); } else { diff --git a/connections/lawicel_serial.h b/connections/lawicel_serial.h index d16e1f6..d137fcc 100644 --- a/connections/lawicel_serial.h +++ b/connections/lawicel_serial.h @@ -60,6 +60,10 @@ protected: bool isAutoRestart; QSerialPort *serial; int framesRapid; + qint64 timeBasis; + qint64 lastHWTimestamp; + qint64 wrapAdder; + qint64 lastSysMs; bool can0Enabled; bool can0ListenOnly; bool canFd; From 5e3d6a305d75266fbd0a9db3142e3f63eee42dcb Mon Sep 17 00:00:00 2001 From: Tomasz Dobrowolski Date: Wed, 18 Mar 2026 13:08:26 +0100 Subject: [PATCH 18/24] another fix --- connections/lawicel_serial.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/connections/lawicel_serial.cpp b/connections/lawicel_serial.cpp index bcb4a48..4ed6c35 100644 --- a/connections/lawicel_serial.cpp +++ b/connections/lawicel_serial.cpp @@ -505,7 +505,7 @@ void LAWICELSerial::readSerialData() if (useSystemTime) { - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(QDateTime::currentMSecsSinceEpoch() * 1000ul)); + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, QDateTime::currentMSecsSinceEpoch() * 1000ll)); } else { @@ -551,11 +551,11 @@ void LAWICELSerial::readSerialData() qint64 unwrappedMs = wrapAdder + hwTs; if (timeBasis == 0) timeBasis = sysMs - unwrappedMs; - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds((timeBasis + unwrappedMs) * 1000)); + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (timeBasis + unwrappedMs) * 1000ll)); } else { - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp::fromMicroSeconds(QDateTime::currentMSecsSinceEpoch() * 1000ul)); + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, QDateTime::currentMSecsSinceEpoch() * 1000ll)); } } From ee3e2e27123e799c66f3078b0135f3e81b47ab41 Mon Sep 17 00:00:00 2001 From: Tomasz Dobrowolski Date: Wed, 18 Mar 2026 13:21:54 +0100 Subject: [PATCH 19/24] cleanup --- connections/lawicel_serial.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/connections/lawicel_serial.cpp b/connections/lawicel_serial.cpp index 4ed6c35..89cd27f 100644 --- a/connections/lawicel_serial.cpp +++ b/connections/lawicel_serial.cpp @@ -503,11 +503,8 @@ void LAWICELSerial::readSerialData() CANFrame buildFrame; QByteArray buildData; - if (useSystemTime) - { - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, QDateTime::currentMSecsSinceEpoch() * 1000ll)); - } - else + buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, QDateTime::currentMSecsSinceEpoch() * 1000ll)); + if (!useSystemTime) { bool isFD = false; char offset; @@ -537,8 +534,7 @@ void LAWICELSerial::readSerialData() int dlc = mBuildLine.mid(len_index, 1).toInt(); int byteCount = isFD ? (int)dlc_code_to_bytes(dlc) : dlc; int frameStringLen = offset + byteCount * 2; - bool hasTimestamp = mBuildLine.length() > frameStringLen + 1; - if (hasTimestamp) + if (mBuildLine.length() > frameStringLen + 1) { qint64 hwTs = mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16); qint64 sysMs = QDateTime::currentMSecsSinceEpoch(); @@ -553,10 +549,6 @@ void LAWICELSerial::readSerialData() timeBasis = sysMs - unwrappedMs; buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (timeBasis + unwrappedMs) * 1000ll)); } - else - { - buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, QDateTime::currentMSecsSinceEpoch() * 1000ll)); - } } switch (mBuildLine[0].toLatin1()) From 5fa1bb43ef290640418c7d247fa1b430f785d83f Mon Sep 17 00:00:00 2001 From: Tomasz Dobrowolski Date: Thu, 19 Mar 2026 11:59:31 +0100 Subject: [PATCH 20/24] simplify --- connections/lawicel_serial.cpp | 18 ++++++------------ connections/lawicel_serial.h | 1 - 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/connections/lawicel_serial.cpp b/connections/lawicel_serial.cpp index 89cd27f..cfd7d5a 100644 --- a/connections/lawicel_serial.cpp +++ b/connections/lawicel_serial.cpp @@ -209,7 +209,6 @@ void LAWICELSerial::rebuildLocalTimeBasis() timeBasis = 0; lastHWTimestamp = -1; wrapAdder = 0; - lastSysMs = 0; } void LAWICELSerial::readSettings() @@ -531,22 +530,17 @@ void LAWICELSerial::readSerialData() len_index = 4; break; } + int dlc = mBuildLine.mid(len_index, 1).toInt(); int byteCount = isFD ? (int)dlc_code_to_bytes(dlc) : dlc; int frameStringLen = offset + byteCount * 2; if (mBuildLine.length() > frameStringLen + 1) { - qint64 hwTs = mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16); - qint64 sysMs = QDateTime::currentMSecsSinceEpoch(); - if (lastHWTimestamp >= 0 && hwTs < lastHWTimestamp) { - qint64 sysDelta = sysMs - lastSysMs; - wrapAdder += lastHWTimestamp + sysDelta - hwTs; - } - lastHWTimestamp = hwTs; - lastSysMs = sysMs; - qint64 unwrappedMs = wrapAdder + hwTs; - if (timeBasis == 0) - timeBasis = sysMs - unwrappedMs; + qint64 hardwareMs = mBuildLine.mid(frameStringLen, 4).toInt(nullptr, 16); + if (lastHWTimestamp >= 0 && hardwareMs < lastHWTimestamp) { wrapAdder += 60000; } + lastHWTimestamp = hardwareMs; + qint64 unwrappedMs = wrapAdder + hardwareMs; + if (timeBasis == 0) { timeBasis = QDateTime::currentMSecsSinceEpoch() - unwrappedMs; } buildFrame.setTimeStamp(QCanBusFrame::TimeStamp(0, (timeBasis + unwrappedMs) * 1000ll)); } } diff --git a/connections/lawicel_serial.h b/connections/lawicel_serial.h index d137fcc..77c52c1 100644 --- a/connections/lawicel_serial.h +++ b/connections/lawicel_serial.h @@ -63,7 +63,6 @@ protected: qint64 timeBasis; qint64 lastHWTimestamp; qint64 wrapAdder; - qint64 lastSysMs; bool can0Enabled; bool can0ListenOnly; bool canFd; From 7d5faae09f07d83e47f6d8e38e501258db65a69a Mon Sep 17 00:00:00 2001 From: Jason Gill Date: Fri, 20 Mar 2026 10:34:34 -0400 Subject: [PATCH 21/24] Properly output SIG_VALTYPE_ for float/double entries in DBC files --- dbc/dbchandler.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/dbc/dbchandler.cpp b/dbc/dbchandler.cpp index 3ea91cd..6b2796b 100644 --- a/dbc/dbchandler.cpp +++ b/dbc/dbchandler.cpp @@ -1348,7 +1348,7 @@ bool DBCFile::saveFile(QString fileName) int sigNumber = 1; QFile *outFile = new QFile(fileName); QString nodesOutput, msgOutput, commentsOutput, valuesOutput, extMultiplexOutput; - QString defaultsOutput, attrValOutput; + QString defaultsOutput, attrValOutput, sigValTypeOutput; bool hasExtendedMultiplexing = false; if (!outFile->open(QIODevice::WriteOnly | QIODevice::Text)) @@ -1512,17 +1512,11 @@ bool DBCFile::saveFile(QString fileName) else msgOutput.append("0+"); break; case SIGNED_INT: + case SP_FLOAT: + case DP_FLOAT: if (sig->intelByteOrder) msgOutput.append("1-"); else msgOutput.append("0-"); break; - case SP_FLOAT: - if (sig->intelByteOrder) msgOutput.append("5-"); - else msgOutput.append("2-"); - break; - case DP_FLOAT: - if (sig->intelByteOrder) msgOutput.append("6-"); - else msgOutput.append("3-"); - break; case STRING: msgOutput.append("4-"); break; @@ -1533,6 +1527,8 @@ bool DBCFile::saveFile(QString fileName) msgOutput.append(" (" + QString::number(sig->factor) + "," + QString::number(sig->bias) + ") [" + QString::number(sig->min) + "|" + QString::number(sig->max) + "] \"" + sig->unitName + "\" " + sig->receiver->name + "\n"); + if (sig->valType == SP_FLOAT || sig->valType == DP_FLOAT) + sigValTypeOutput.append("SIG_VALTYPE_ " + QString::number(ID) + " " + sig->name + " : " + QString::number(sig->valType == SP_FLOAT ? 1 : 2) + ";\n"); if (sig->comment.length() > 0) { commentsOutput.append("CM_ SG_ " + QString::number(ID) + " " + sig->name + " \"" + sig->comment + "\";\n"); @@ -1685,11 +1681,14 @@ bool DBCFile::saveFile(QString fileName) outFile->write(attrValOutput.toUtf8()); outFile->write(valuesOutput.toUtf8()); outFile->write(extMultiplexOutput.toUtf8()); + if (!sigValTypeOutput.isEmpty()) + outFile->write(sigValTypeOutput.toUtf8()); attrValOutput.clear(); defaultsOutput.clear(); valuesOutput.clear(); extMultiplexOutput.clear(); + sigValTypeOutput.clear(); outFile->close(); delete outFile; From b4de4dfdf0a0adf28db3ceef000919c448ff8494 Mon Sep 17 00:00:00 2001 From: Michele Tesser Date: Mon, 13 Apr 2026 18:49:18 +0200 Subject: [PATCH 22/24] VAL_TABLE_ support --- dbc/dbc_classes.h | 8 ++- dbc/dbchandler.cpp | 136 +++++++++++++++++++++++++++++++++++++++------ dbc/dbchandler.h | 3 + 3 files changed, 128 insertions(+), 19 deletions(-) diff --git a/dbc/dbc_classes.h b/dbc/dbc_classes.h index 96f0839..1109451 100644 --- a/dbc/dbc_classes.h +++ b/dbc/dbc_classes.h @@ -66,6 +66,13 @@ public: QString descript; }; +class DBC_VAL_TABLE +{ +public: + QString name; + QList valList; +}; + class DBC_NODE { public: @@ -176,4 +183,3 @@ public: #endif // DBC_CLASSES_H - diff --git a/dbc/dbchandler.cpp b/dbc/dbchandler.cpp index 6b2796b..f80dabd 100644 --- a/dbc/dbchandler.cpp +++ b/dbc/dbchandler.cpp @@ -16,6 +16,28 @@ DBCHandler* DBCHandler::instance = nullptr; +static bool parseValueDescriptions(QString tokenString, QList &values) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + DBC_VAL_ENUM_ENTRY val; + + values.clear(); + tokenString = tokenString.trimmed(); + while (tokenString.length() > 2) + { + regex.setPattern("^([+-]?\\d+) \\\"(.*?)\\\"(.*)"); + match = regex.match(tokenString); + if (!match.hasMatch()) return false; + + val.value = match.captured(1).toInt(); + val.descript = match.captured(2); + values.append(val); + tokenString = match.captured(3).trimmed(); + } + return values.count() > 0; +} + DBC_SIGNAL* DBCSignalHandler::findSignalByIdx(int idx) { if (sigs.count() == 0) return nullptr; @@ -316,6 +338,8 @@ DBCFile::DBCFile(const DBCFile& cpy) : QObject() assocBuses = cpy.assocBuses; dbc_nodes.clear(); dbc_nodes.append(cpy.dbc_nodes); + dbc_value_tables.clear(); + dbc_value_tables.append(cpy.dbc_value_tables); dbc_attributes.clear(); dbc_attributes.append(cpy.dbc_attributes); isDirty = cpy.isDirty; @@ -331,6 +355,8 @@ DBCFile& DBCFile::operator=(const DBCFile& cpy) assocBuses = cpy.assocBuses; dbc_nodes.clear(); dbc_nodes.append(cpy.dbc_nodes); + dbc_value_tables.clear(); + dbc_value_tables.append(cpy.dbc_value_tables); dbc_attributes.clear(); dbc_attributes.append(cpy.dbc_attributes); } @@ -382,6 +408,19 @@ DBC_NODE* DBCFile::findNodeByNameAndComment(QString fullname) return nullptr; } +DBC_VAL_TABLE* DBCFile::findValueTableByName(QString name) +{ + if (dbc_value_tables.length() == 0) return nullptr; + for (int i = 0; i < dbc_value_tables.length(); i++) + { + if (name.compare(dbc_value_tables[i].name, Qt::CaseInsensitive) == 0) + { + return &dbc_value_tables[i]; + } + } + return nullptr; +} + QString DBCFile::getFullFilename() { return filePath + fileName; @@ -712,6 +751,29 @@ bool DBCFile::parseSignalValueTypeLine(QString line) } +bool DBCFile::parseValueTableLine(QString line) +{ + QRegularExpression regex; + QRegularExpressionMatch match; + + regex.setPattern("^VAL\\_TABLE\\_ ([-\\w]+) (.*);"); + match = regex.match(line); + //captured 1 is the table name + //captured 2 is a series of values in the form (number "text") + if (match.hasMatch()) + { + DBC_VAL_TABLE table; + table.name = match.captured(1); + if (!parseValueDescriptions(match.captured(2), table.valList)) return false; + + DBC_VAL_TABLE *existingTable = findValueTableByName(table.name); + if (existingTable) existingTable->valList = table.valList; + else dbc_value_tables.append(table); + return true; + } + return false; +} + bool DBCFile::parseValueLine(QString line) { QRegularExpression regex; @@ -733,25 +795,18 @@ bool DBCFile::parseValueLine(QString line) if (sig != nullptr) { QString tokenString = match.captured(3); - DBC_VAL_ENUM_ENTRY val; - while (tokenString.length() > 2) + QList values; + DBC_VAL_TABLE *valueTable = findValueTableByName(tokenString.trimmed()); + if (valueTable) { - regex.setPattern("(\\d+) \\\"(.*?)\\\"(.*)"); - match = regex.match(tokenString); - if (match.hasMatch()) - { - val.value = match.captured(1).toULong() & 0x1FFFFFFFul; - val.descript = match.captured(2); - //qDebug() << "sig val " << val.value << " desc " <valList.append(val); - int rightSize = tokenString.length() - match.captured(1).length() - match.captured(2).length() - 4; - if (rightSize > 0) tokenString = tokenString.right(rightSize); - else tokenString = ""; - //qDebug() << "New token string: " << tokenString; - } - else tokenString = ""; + sig->valList = valueTable->valList; + return true; + } + if (parseValueDescriptions(tokenString, values)) + { + sig->valList.append(values); + return true; } - return true; } } } @@ -919,6 +974,8 @@ bool DBCFile::loadFile(QString fileName) QString fileBaseName = QFileInfo(fileName).baseName(); bool inMultilineBU = false; + bool inMultilineValTable = false; + QString multilineValTable; qDebug() << "DBC File: " << fileName; @@ -931,6 +988,7 @@ bool DBCFile::loadFile(QString fileName) qDebug() << "Starting DBC load"; dbc_nodes.clear(); + dbc_value_tables.clear(); messageHandler->removeAllMessages(); messageHandler->setMatchingCriteria(EXACT); messageHandler->setFilterLabeling(false); @@ -962,6 +1020,18 @@ bool DBCFile::loadFile(QString fileName) else inMultilineBU = false; } + if (inMultilineValTable) + { + multilineValTable.append(" " + line); + if (line.endsWith(";")) + { + parseValueTableLine(multilineValTable); + multilineValTable.clear(); + inMultilineValTable = false; + } + continue; + } + if (!inMultilineBU) { if (line.startsWith("BO_ ")) //defines a message @@ -1064,6 +1134,19 @@ bool DBCFile::loadFile(QString fileName) } } } + if (line.startsWith("VAL_TABLE_ ")) + { + if (line.endsWith(";")) + { + parseValueTableLine(line); + } + else + { + multilineValTable = line; + inMultilineValTable = true; + } + } + //VAL_ (1090) (VCUPresentParkLightOC) (1 "Error present" 0 "Error not present") ; if (line.startsWith("VAL_ ")) { @@ -1347,7 +1430,7 @@ bool DBCFile::saveFile(QString fileName) int msgNumber = 1; int sigNumber = 1; QFile *outFile = new QFile(fileName); - QString nodesOutput, msgOutput, commentsOutput, valuesOutput, extMultiplexOutput; + QString nodesOutput, msgOutput, commentsOutput, valuesOutput, valueTableOutput, extMultiplexOutput; QString defaultsOutput, attrValOutput, sigValTypeOutput; bool hasExtendedMultiplexing = false; @@ -1433,6 +1516,23 @@ bool DBCFile::saveFile(QString fileName) nodesOutput.append("\n"); outFile->write(nodesOutput.toUtf8()); + for (int x = 0; x < dbc_value_tables.count(); x++) + { + DBC_VAL_TABLE table = dbc_value_tables[x]; + valueTableOutput.append("VAL_TABLE_ " + table.name); + for (int v = 0; v < table.valList.count(); v++) + { + DBC_VAL_ENUM_ENTRY val = table.valList[v]; + valueTableOutput.append(" " + QString::number(val.value) + " \"" + val.descript + "\""); + } + valueTableOutput.append(";\n"); + } + if (!valueTableOutput.isEmpty()) + { + outFile->write(valueTableOutput.toUtf8()); + valueTableOutput.clear(); + } + //Go through all messages one at at time issuing the message line then all signals in there too. for (int x = 0; x < messageHandler->getCount(); x++) { diff --git a/dbc/dbchandler.h b/dbc/dbchandler.h index 14f19f8..66f9b53 100644 --- a/dbc/dbchandler.h +++ b/dbc/dbchandler.h @@ -75,6 +75,7 @@ public: DBC_NODE *findNodeByName(QString name); DBC_NODE *findNodeByNameAndComment(QString fullname); DBC_NODE *findNodeByIdx(int idx); + DBC_VAL_TABLE *findValueTableByName(QString name); DBC_ATTRIBUTE *findAttributeByName(QString name, DBC_ATTRIBUTE_TYPE type = ATTR_TYPE_ANY); DBC_ATTRIBUTE *findAttributeByIdx(int idx); void findAttributesByType(DBC_ATTRIBUTE_TYPE typ, QList *list); @@ -93,6 +94,7 @@ public: DBCMessageHandler *messageHandler; QList dbc_nodes; + QList dbc_value_tables; QList dbc_attributes; private: QString fileName; @@ -105,6 +107,7 @@ private: DBC_SIGNAL* parseSignalLine(QString line, DBC_MESSAGE *msg); bool parseSignalMultiplexValueLine(QString line); DBC_MESSAGE* parseMessageLine(QString line); + bool parseValueTableLine(QString line); bool parseValueLine(QString line); bool parseSignalValueTypeLine(QString line); bool parseAttributeLine(QString line); From c7515bbdd5687b3180ffc8c9635cffe15e5f1c29 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Wed, 15 Apr 2026 20:57:45 -0400 Subject: [PATCH 23/24] Add array include to utility.h --- utility.h | 1 + 1 file changed, 1 insertion(+) diff --git a/utility.h b/utility.h index 1941d83..e92c39e 100644 --- a/utility.h +++ b/utility.h @@ -12,6 +12,7 @@ #include #include #include +#include //#include enum TimeStyle From fd1d2055a82a2d0d7cf88b2bc986e74954504bc6 Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 16 Apr 2026 21:14:37 -0400 Subject: [PATCH 24/24] Add lrelease command for translation files For some reason, this is not automatically done on MacOS but seems to be on Linux and Windows. Why? I'm not sure... --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d19133d..4a19752 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -54,6 +54,7 @@ jobs: run: | qmake CONFIG+=release CONFIG+=sdk_no_version_check SavvyCAN.pro make -j`sysctl kern.aioprocmax | awk '{print $2}'` + lrelease translations/*.ts - name: Package run: | @@ -86,7 +87,8 @@ jobs: run: | qmake CONFIG+=release CONFIG+=sdk_no_version_check SavvyCAN.pro make -j`sysctl kern.aioprocmax | awk '{print $2}'` - + lrelease translations/*.ts + - name: Package run: | mkdir -p SavvyCAN.app/Contents/MacOS/translations