more compact varicode option working
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 03:57:44 +0000 (03:57 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 5 Jun 2014 03:57:44 +0000 (03:57 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1636 01035d8c-6547-0410-b346-abe4f91aad63

fdmdv2/src/fdmdv2_main.cpp
fdmdv2/src/varicode.c

index b7c11979b384bc396dc114ed2c74158acf9f8f5f..29e2e0078afce7223ac0938806fb491369c58a96 100644 (file)
@@ -889,17 +889,24 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
 
     // send Callsign ----------------------------------------------------
 
-    if (fifo_used(g_txDataInFifo) == 0) {
-        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;
+    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)) {
 
         // 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);
+        //printf("\ntx varicode nout = %d: ", nout);
+        //for(int i=0; i<nout; i++)
+        //    printf("%d ", varicode[i]);
+        //printf("\n");
         fifo_write(g_txDataInFifo, varicode, nout);
         //printf("Callsign sending: %s nout: %d\n", callsign, nout);
     }
@@ -952,8 +959,8 @@ void MainFrame::OnTimer(wxTimerEvent &evt)
 
         // update stats on main page
 
-        sprintf(bits, "Bits: %d", g_total_bits); wxString bits_string(bits); m_textBits->SetLabel(bits_string);
-        sprintf(errors, "Errs: %d", g_total_bit_errors); wxString errors_string(errors); m_textErrors->SetLabel(errors_string);
+        sprintf(bits, "Bits: %d", (int)g_total_bits); wxString bits_string(bits); m_textBits->SetLabel(bits_string);
+        sprintf(errors, "Errs: %d", (int)g_total_bit_errors); wxString errors_string(errors); m_textErrors->SetLabel(errors_string);
         float b = (float)g_total_bit_errors/(1E-6+g_total_bits);
         sprintf(ber, "BER: %4.3f", b); wxString ber_string(ber); m_textBER->SetLabel(ber_string);
 
@@ -1908,7 +1915,7 @@ void MainFrame::OnTogBtnOnOff(wxCommandEvent& event)
         // Init text msg decoding
 
         varicode_decode_init(&g_varicode_dec_states, wxGetApp().m_textEncoding);      
-        printf("m_textEncoding = %d\n", wxGetApp().m_textEncoding);
+        //printf("m_textEncoding = %d\n", wxGetApp().m_textEncoding);
         //printf("g_stats.snr: %f\n", g_stats.snr_est);
 
         // attempt to start PTT ......
@@ -3265,8 +3272,10 @@ void per_frame_tx_processing(
 
     if (fifo_read(g_txDataInFifo, &abit, 1) == 0)
         bits[data_flag_index] = abit;
-    else
+    else {
         bits[data_flag_index] = 0;
+        //printf("tx fifle empty - sending a 0!");
+    }
 
     /* add FEC  ---------------------------------------*/
 
index 6e0dfa4c1d63b02b80452dadef84a563f15c61b3..540680bebd43c38e595c599f52fd84eb31e18323 100644 (file)
@@ -317,7 +317,7 @@ int varicode_decode2(struct VARICODE_DEC *dec_states, char ascii_out[], short va
     n_out = 0;
 
     //printf("varicode_decode2: n_in: %d varicode_in[0] %d dec_states->n_in: %d\n", n_in, varicode_in[0], dec_states->n_in);
-
+    //printf("%d ", varicode_in[0]);
     while(n_in && (n_out < max_out)) {
 
         // keep two bit buffer so we can process two at a time
@@ -334,7 +334,7 @@ int varicode_decode2(struct VARICODE_DEC *dec_states, char ascii_out[], short va
             dec_states->n_in = 0;
  
             if (output) {
-                printf("  output: %d single_ascii: 0x%x %c\n", output, (int)single_ascii, single_ascii);
+                //printf("  output: %d single_ascii: 0x%x %c\n", output, (int)single_ascii, single_ascii);
                 *ascii_out++ = single_ascii;
                 n_out++;
             }            
@@ -357,7 +357,7 @@ int varicode_decode(struct VARICODE_DEC *dec_states, char ascii_out[], short var
 void test_varicode(int code_num) {
     char *ascii_in;
     short *varicode;
-    int  i, n_varicode_bits_out, n_ascii_chars_out, length, half;
+    int  i, n_varicode_bits_out, n_ascii_chars_out, length, half, n_out, j, len;
     char *ascii_out;
     struct VARICODE_DEC dec_states;
 
@@ -438,6 +438,37 @@ void test_varicode(int code_num) {
         assert(n_ascii_chars_out == 0);
     }
 
+    // 3. Test receiving one bit at a time -----------------------------------------------------
+
+    sprintf(ascii_in, "s=vk5dgr qth=adelaide");
+    len = strlen(ascii_in);
+    ascii_in[len] = 13;
+    ascii_in[len+1] = 0;
+
+    assert(strlen(ascii_in) < length);
+    if (code_num == 2)
+        for(i=0; i<strlen(ascii_in); i++)
+            ascii_in[i] = tolower(ascii_in[i]);
+
+    for(i=0; i<3; i++) {
+        n_varicode_bits_out = varicode_encode(varicode, ascii_in, VARICODE_MAX_BITS*length, strlen(ascii_in), code_num);
+        printf("n_varicode_bits_out: %d\n", n_varicode_bits_out);
+
+        n_ascii_chars_out = 0;
+        for(j=0; j<n_varicode_bits_out; j++) {
+            n_out = varicode_decode(&dec_states, &ascii_out[n_ascii_chars_out], &varicode[j], 1, 1);
+            if (n_out) 
+                n_ascii_chars_out++;
+        }
+        ascii_out[n_ascii_chars_out] = 0;
+
+        printf("  ascii_out: %s\n", ascii_out);
+        if (strcmp(ascii_in, ascii_out) == 0)
+            printf("  Test 3 Pass\n");
+        else
+            printf("  Test 3 Fail\n");
+    }
+
     free(ascii_in);
     free(ascii_out);
     free(varicode);