added checksum and checksums stats display for txt messages, haven't tested on poor...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 10:50:43 +0000 (10:50 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 10:50:43 +0000 (10:50 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1640 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/fdmdv2_main.h
fdmdv2/src/topFrame.cpp
fdmdv2/src/topFrame.h

index 18f1b0c876ab7d0d1ec4c8917300f74d6d372f60..d1e871012c1eff9b88dc2f40aabb25429fb0d557 100644 (file)
@@ -885,18 +885,23 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
 
     char callsign[MAX_CALLSIGN];
     strncpy(callsign, (const char*) wxGetApp().m_callSign.mb_str(wxConvUTF8), MAX_CALLSIGN-1);
-    char callsigncr[MAX_CALLSIGN+1];
-    strcpy(callsigncr, callsign);
-    callsigncr[strlen(callsign)] = 13;
-    
+
     // buffer 1 txt message to senure tx data fifo doesn't "run dry"
 
-    if ((unsigned)fifo_used(g_txDataInFifo) < strlen(callsigncr)) {
+    if ((unsigned)fifo_used(g_txDataInFifo) < strlen(callsign)) {
 
+        unsigned char checksum = 0;
+        for(unsigned int i=0; i<strlen(callsign); i++)
+            checksum += callsign[i];
+        char callsign_checksum_cr[MAX_CALLSIGN+1];
+        sprintf(callsign_checksum_cr, "%s%2x", callsign, checksum);
+        //printf("callsign_checksum_cr: %s\n", callsign_checksum_cr);
+        callsign_checksum_cr[strlen(callsign)+2] = 13;
         // varicode encode and write to tx data fifo
 
         short varicode[MAX_CALLSIGN*VARICODE_MAX_BITS];
-        int nout = varicode_encode(varicode, callsigncr, MAX_CALLSIGN*VARICODE_MAX_BITS, strlen(callsign)+1, wxGetApp().m_textEncoding);
+        int nout = varicode_encode(varicode, callsign_checksum_cr, MAX_CALLSIGN*VARICODE_MAX_BITS, strlen(callsign)+3, wxGetApp().m_textEncoding);
         //printf("\ntx varicode nout = %d: ", nout);
         //for(int i=0; i<nout; i++)
         //    printf("%d ", varicode[i]);
@@ -912,14 +917,38 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
         if ((ashort == 13) || ((m_pcallsign - m_callsign) > MAX_CALLSIGN-1)) {
             // CR completes line
             *m_pcallsign = 0;
+
+            // lets see if checksum is OK
+            
+            unsigned char checksum_rx = 0;
+            for(unsigned int i=0; i<strlen(m_callsign)-2; i++)
+                checksum_rx += callsign[i];
+            unsigned int checksum_tx;
+            int ret = sscanf(&m_callsign[strlen(m_callsign)-2], "%2x", &checksum_tx);
+            //printf("checksums: %2x %2x\n", checksum_tx, checksum_rx);
+
+            wxString s;
+            if (ret && (checksum_tx == checksum_rx)) {
+                m_callsign[strlen(m_callsign)-2] = 0;
+                s.Printf("%s", m_callsign);
+                m_txtCtrlCallSign->SetValue(s);
+
+                m_checksumGood++;
+                s.Printf("%d", m_checksumGood);
+                m_txtChecksumGood->SetLabel(s);              
+            }
+            else {
+                m_checksumBad++;
+                s.Printf("%d", m_checksumBad);
+                m_txtChecksumBad->SetLabel(s);              
+            }
+
+            // reset ptr to start of string
             m_pcallsign = m_callsign;
         }
         else
         {
             *m_pcallsign++ = (char)ashort;
-            wxString s;
-            s.Printf("%s", m_callsign);
-            m_txtCtrlCallSign->SetValue(s);
         }
     }
 
@@ -1901,6 +1930,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         g_half_duplex = wxGetApp().m_boolHalfDuplex;
 
         m_pcallsign = m_callsign;
+        m_checksumGood = m_checksumBad = 0;
 
         m_maxLevel = 0;
         m_textLevel->SetLabel(wxT(""));
index 460e8e8221c1d9868e46ec60035390460d9eaa3a..d52351ff9146f04b09e8dc3555a4635438b7a2d3 100644 (file)
@@ -472,9 +472,11 @@ class MainFrame : public TopFrame
         int         m_zoom;
         float       m_snrBeta;
         
-        // Callsign
+        // Callsign/text messaging
         char        m_callsign[MAX_CALLSIGN];
         char       *m_pcallsign;
+        unsigned int m_checksumGood;
+        unsigned int m_checksumBad;
 
         // level Gauge
         float       m_maxLevel;
index 3409ac3a23d75ac7c4d4b2b04f76614f77afc046..9174c89f10825516c3e910366d7d5107c877b2ec 100644 (file)
@@ -209,20 +209,20 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
     wxBoxSizer* lowerSizer;
     lowerSizer = new wxBoxSizer(wxHORIZONTAL);
 
-    wxBoxSizer* bSizer15;
-    bSizer15 = new wxBoxSizer(wxVERTICAL);
-
     m_BtnCallSignReset = new wxButton(this, wxID_ANY, _("Clear"), wxDefaultPosition, wxDefaultSize, 0);
     lowerSizer->Add(m_BtnCallSignReset, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
 
+    wxBoxSizer* bSizer15;
+    bSizer15 = new wxBoxSizer(wxVERTICAL);
     m_txtCtrlCallSign = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
     m_txtCtrlCallSign->SetToolTip(_("Call Sign of transmitting station will appear here"));
     bSizer15->Add(m_txtCtrlCallSign, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5);
-
     lowerSizer->Add(bSizer15, 1, wxEXPAND, 5);
 
-    wxBoxSizer* bSizer141;
-    bSizer141 = new wxBoxSizer(wxHORIZONTAL);
+    m_txtChecksumGood = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
+    lowerSizer->Add(m_txtChecksumGood, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
+    m_txtChecksumBad = new wxStaticText(this, wxID_ANY, wxT("0"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
+    lowerSizer->Add(m_txtChecksumBad, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 1);
 
     //=====================================================
     // These are the buttons that autosend the userid (?)
@@ -231,6 +231,9 @@ TopFrame::TopFrame(wxWindow* parent, wxWindowID id, const wxString& title, const
     // DR 4 Dec - taken off for screen for Beta release to avoid questions on their use until
     // we implement this feature
  #ifdef UNIMPLEMENTED
+    wxBoxSizer* bSizer141;
+    bSizer141 = new wxBoxSizer(wxHORIZONTAL);
+
     // TxID
     //---------
     m_togTxID = new wxToggleButton(this, wxID_ANY, _("TxID"), wxDefaultPosition, wxDefaultSize, 0);
index 5e914f8b6256b9cbec5808a05e0a6ad57a5ae81c..bf556d9bdb058631a9048a65c3585ea5eaa3eff1 100644 (file)
@@ -87,8 +87,12 @@ class TopFrame : public wxFrame
         wxCheckBox* m_ckboxSNR;
         wxGauge* m_gaugeLevel;
         wxStaticText* m_textLevel;
-        wxTextCtrl*   m_txtCtrlCallSign;
+
         wxButton*     m_BtnCallSignReset;
+        wxTextCtrl*   m_txtCtrlCallSign;
+        wxStaticText* m_txtChecksumGood;
+        wxStaticText* m_txtChecksumBad;
+
         wxSlider* m_sliderSQ;
         wxCheckBox* m_ckboxSQ;
         wxStaticText* m_textSQ;