diff --git a/DSP_API/DOCS/ThumbDV.cfg b/DSP_API/DOCS/ThumbDV.cfg index 881b270..bde480b 100644 --- a/DSP_API/DOCS/ThumbDV.cfg +++ b/DSP_API/DOCS/ThumbDV.cfg @@ -1,6 +1,6 @@ [header] Name: ThumbDV -Version: 0.0.2 +Version: "0.0.4" Minimum-SmartSDR-Version: 1.4.2.0 Author: FlexRadio Systems Support-email: support@flexradio.com @@ -9,7 +9,7 @@ License: GPL7.3 Executable: "thumbdv" [setup] -waveform create name=ThumbDV mode=DSTR underlying_mode=DFM +waveform create name=ThumbDV mode=DSTR underlying_mode=DFM version=0.0.4 waveform set ThumbDV tx=1 waveform set ThumbDV rx_filter low_cut=-8000 waveform set ThumbDV rx_filter high_cut=8000 diff --git a/DSP_API/SmartSDR_Interface/sched_waveform.c b/DSP_API/SmartSDR_Interface/sched_waveform.c index 485529c..273d644 100644 --- a/DSP_API/SmartSDR_Interface/sched_waveform.c +++ b/DSP_API/SmartSDR_Interface/sched_waveform.c @@ -350,7 +350,7 @@ void sched_waveform_setMessage( uint32 slice, const char * message) strncpy(_dstar->slow_encoder->message, string, copy_len); } - output( "TX Message: '%s'\n", _dstar->slow_encoder->message ); + output( "TX Message: '%s' : strlen() = %d \n", _dstar->slow_encoder->message , strlen(_dstar->slow_encoder->message)); } void sched_waveform_setFD( int fd ) { @@ -485,6 +485,7 @@ static void * _sched_waveform_thread( void * param ) { memset( float_in_24k, 0, MEM_24 * sizeof( float ) ); memset( float_in_8k, 0, MEM_8 * sizeof( float ) ); + thumbDV_flushLists(); /* Requires us to set initial_rx to FALSE which we do at the end of * the first loop */ @@ -522,12 +523,6 @@ static void * _sched_waveform_thread( void * param ) { cbWriteShort( RX3_cb, speech_out[j] ); } - if (_dstar->rx_state == END_PATTERN) - { - char msg[64]; - sprintf( msg, "waveform status slice=%d RX=END", _dstar->slice); - tc_sendSmartSDRcommand( msg, FALSE, NULL ); - } } @@ -588,6 +583,8 @@ static void * _sched_waveform_thread( void * param ) { memset( tx_float_in_24k, 0, MEM_24 * sizeof( float ) ); memset( tx_float_in_8k, 0, MEM_8 * sizeof( float ) ); + thumbDV_flushLists(); + /* Requires us to set initial_rx to FALSE which we do at the end of * the first loop */ diff --git a/DSP_API/SmartSDR_Interface/status_processor.c b/DSP_API/SmartSDR_Interface/status_processor.c index c072849..705ad95 100644 --- a/DSP_API/SmartSDR_Interface/status_processor.c +++ b/DSP_API/SmartSDR_Interface/status_processor.c @@ -80,7 +80,7 @@ static void _handle_status(char* string) // we are now in DSTR mode output(ANSI_MAGENTA "slice %d is now in DSTR mode\n",slc); char cmd[512] = {0}; - sprintf(cmd, "slice s %d fm_deviation=1250 post_demod_low=0 post_demod_high=6000 dfm_pre_de_emphasis=0 post_demod_bypass=1 squelch=0", slc); + sprintf(cmd, "slice s %d fm_deviation=1200 post_demod_low=0 post_demod_high=6000 dfm_pre_de_emphasis=0 post_demod_bypass=1 squelch=0", slc); tc_sendSmartSDRcommand(cmd,FALSE, NULL); sched_waveform_setDSTARSlice(slc); diff --git a/DSP_API/ThumbDV/dstar.c b/DSP_API/ThumbDV/dstar.c index 300e619..b2a2ff7 100644 --- a/DSP_API/ThumbDV/dstar.c +++ b/DSP_API/ThumbDV/dstar.c @@ -518,9 +518,6 @@ DSTAR_MACHINE dstar_createMachine( void ) { machine->slow_decoder = safe_malloc(sizeof(slow_data_decoder)); machine->slow_encoder = safe_malloc(sizeof(slow_data_encoder)); - /* Temporary */ - strcpy(machine->slow_encoder->message, "12345678901234567890"); - machine->slice = 0; return machine; @@ -661,6 +658,14 @@ void dstar_updateStatus( DSTAR_MACHINE machine, uint32 slice, enum STATUS_TYPE sprintf( status, "waveform status slice=%d message=%s", slice, message_string); tc_sendSmartSDRcommand( status, FALSE, NULL ); break; + case STATUS_END_RX: + { + char msg[64]; + sprintf( msg, "waveform status slice=%d RX=END", machine->slice); + tc_sendSmartSDRcommand( msg, FALSE, NULL ); + } + break; + } } @@ -670,21 +675,34 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl uint32 j = 0; float buf[DSTAR_RADIO_BIT_LENGTH]; dstar_pfcs pfcs; +#ifdef DUMP_GMSK_MOD + static FILE * dump_file = NULL; + + if ( dump_file == NULL ) { + dump_file = fopen("/tmp/gmsk_encoding.dat", "w"); + } +#endif switch ( machine->tx_state ) { case BIT_FRAME_SYNC: /* Create Sync */ - for ( i = 0 ; i < 64 * 7; i += 2 ) { + for ( i = 0 ; i < 64 * 5; i += 2 ) { gmsk_encode( gmsk_mod, TRUE, buf, DSTAR_RADIO_BIT_LENGTH ); for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } gmsk_encode( gmsk_mod, FALSE, buf, DSTAR_RADIO_BIT_LENGTH ); for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } } @@ -693,6 +711,9 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } } break; @@ -722,13 +743,16 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl uint32 count = 0; dstar_scramble( interleaved, scrambled, outLen, &count ); - output( "Count = %d\n", count ); + //output( "Count = %d\n", count ); for ( i = 0 ; i < count ; i++ ) { gmsk_encode( gmsk_mod, scrambled[i], buf, DSTAR_RADIO_BIT_LENGTH ); for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } } break; @@ -745,6 +769,9 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl for ( k = 0 ; k < DSTAR_RADIO_BIT_LENGTH ; k++ ) { cbWriteFloat( tx_cb, buf[k] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[k]); +#endif } } } @@ -767,12 +794,16 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl dstar_scramble(encode_bits, encode_bits_scrambled, DATA_FRAME_LENGTH_BITS, &count); + gmsk_bitsToBytes(encode_bits_scrambled, encode_bytes_scrambled, DATA_FRAME_LENGTH_BITS); gmsk_encodeBuffer(gmsk_mod, encode_bytes_scrambled, DATA_FRAME_LENGTH_BITS, data_buf, DATA_FRAME_LENGTH_BITS * DSTAR_RADIO_BIT_LENGTH); for ( i = 0 ; i < DATA_FRAME_LENGTH_BITS * DSTAR_RADIO_BIT_LENGTH ; i++ ) { cbWriteFloat(tx_cb, data_buf[i]); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", data_buf[i]); +#endif } break; @@ -787,7 +818,11 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl for ( i = 0 ; i < DATA_FRAME_LENGTH_BITS * DSTAR_RADIO_BIT_LENGTH ; i++ ) { cbWriteFloat( tx_cb, sync_buf[i] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", sync_buf[i]); +#endif } + break; } case END_PATTERN: @@ -799,22 +834,38 @@ void dstar_txStateMachine( DSTAR_MACHINE machine, GMSK_MOD gmsk_mod, Circular_Fl for ( i = 0 ; i < END_PATTERN_LENGTH_BITS * DSTAR_RADIO_BIT_LENGTH ; i++ ) { cbWriteFloat( tx_cb, end_buf[i] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", end_buf[i]); +#endif } - for ( i = 0 ; i < 100 ; i += 2 ) { + for ( i = 0 ; i < 22 ; i += 2 ) { gmsk_encode( gmsk_mod, TRUE, buf, DSTAR_RADIO_BIT_LENGTH ); for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } gmsk_encode( gmsk_mod, FALSE, buf, DSTAR_RADIO_BIT_LENGTH ); for ( j = 0 ; j < DSTAR_RADIO_BIT_LENGTH ; j++ ) { cbWriteFloat( tx_cb, buf[j] ); +#ifdef DUMP_GMSK_MOD + fprintf(dump_file, "%6.6f\n", buf[j]); +#endif } } +#ifdef DUMP_GMSK_MOD + fclose(dump_file); + dump_file = NULL; +#endif + + slow_data_resetEncoder(machine); + break; } } @@ -1004,6 +1055,7 @@ BOOL dstar_rxStateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * a bitPM_reset( machine->data_sync_pm ); + dstar_updateStatus(machine, machine->slice, STATUS_END_RX); /* STATE CHANGE */ machine->rx_state = BIT_FRAME_SYNC; machine->bit_count = 0; @@ -1016,7 +1068,10 @@ BOOL dstar_rxStateMachine( DSTAR_MACHINE machine, BOOL in_bit, unsigned char * a case END_PATTERN: - output( "Found end pattern bits\n" ); + output( "Found end pattern bits -- sending status update\n" ); + + dstar_updateStatus(machine, machine->slice, STATUS_END_RX); + bitPM_reset( machine->end_pm ); bitPM_reset( machine->syn_pm ); diff --git a/DSP_API/ThumbDV/dstar.h b/DSP_API/ThumbDV/dstar.h index 416fc8d..d27c272 100644 --- a/DSP_API/ThumbDV/dstar.h +++ b/DSP_API/ThumbDV/dstar.h @@ -78,7 +78,8 @@ enum DSTAR_RX_STATE { enum STATUS_TYPE { STATUS_RX = 0, STATUS_TX, - STATUS_SLOW_DATA_MESSAGE + STATUS_SLOW_DATA_MESSAGE, + STATUS_END_RX }; typedef struct _dstar_header { diff --git a/DSP_API/ThumbDV/gmsk_modem.c b/DSP_API/ThumbDV/gmsk_modem.c index f28e14d..827c8fc 100644 --- a/DSP_API/ThumbDV/gmsk_modem.c +++ b/DSP_API/ThumbDV/gmsk_modem.c @@ -269,6 +269,40 @@ const float MOD_COEFFS_TABLE[] = { #define MOD_COEFFS_LENGTH 41U +#define eiline(n) (iir->in_line[(n)]) +#define eoline(n) (iir->out_line[(n)]) + +static float _process_iir_filter(IIR_FILTER iir, float sample) +{ + + float * a = iir->a; + float * b = iir->b; + float N = 16.0f; // Scaling value for IIR Filter Realization + float N_IV = 1.0f / N; + float N_2 = N / 2.0f; + + float local_out; + //Shift Input Line + eiline( 2) = eiline( 1); + eiline( 1) = eiline( 0); + + eiline( 0) = sample; + + eoline( 2) = eoline( 1); + eoline( 1) = eoline( 0); + + local_out = 0.0f; + + + local_out = 2.0f * ((-a[1]*0.5f * eoline( + 1)) - (a[2]*0.5f * eoline( 2)) + + N_2 * ((b[0]*N_IV * eiline( 0)) + (b[1]*N_IV + * eiline( 1)) + (b[2]*N_IV * eiline( 2)))); + + eoline(0) = local_out; + return local_out; +} + uint32 gmsk_encode( GMSK_MOD mod, BOOL bit, float * buffer, unsigned int length ) { if ( length != DSTAR_RADIO_BIT_LENGTH ) { @@ -286,6 +320,9 @@ uint32 gmsk_encode( GMSK_MOD mod, BOOL bit, float * buffer, unsigned int length } else { buffer[i] = gmsk_FilterProcessSingle( mod->filter, 0.75f ); } + + buffer[i] = _process_iir_filter(mod->iir, buffer[i]); + } return DSTAR_RADIO_BIT_LENGTH; @@ -355,12 +392,78 @@ GMSK_DEMOD gmsk_createDemodulator( void ) { return demod; } + +float convertVITAdbToFloat(VITAdb vita) +{ + int32 db = (int32)((int16)(vita & 0xFFFF)); + return (float)db / 128.0; +} +// always assume the float is in dB (see the parameter name) +VITAdb convertFloatToVITAdb(float db) +{ + return ((int32)(db * 128) & 0xFFFF); +} + GMSK_MOD gmsk_createModulator( void ) { GMSK_MOD mod = ( GMSK_MOD ) safe_malloc( sizeof( gmsk_mod ) ); mod->m_invert = FALSE; mod->filter = gmsk_createFilter( MOD_COEFFS_TABLE, MOD_COEFFS_LENGTH ); + + mod->iir = safe_malloc(sizeof(iir_filter)); + + IIR_FILTER filter = mod->iir; + + float * a = filter->a; + float * b = filter->b; + uint32 freq_hz = 4800; + uint32 sample_rate_hz = 24000; + uint32 level = 10; + float q_level = 0.2; + float w0 = 2.0 * M_PI * freq_hz/ + (float)sample_rate_hz; + VITAdb db_gain = convertFloatToVITAdb(level); + float q_factor; + if ( level > 0 ) { + q_factor = q_level; + } else { + q_factor = 4.0f * q_level; + } + float A = pow(10, convertVITAdbToFloat(db_gain) / 40); + float alpha = sin(w0) / (2 * A * q_factor); + //flex_printf(LOG_ALWAYS, "w0 = %lf, A = %lf, alpha = %lf", w0, A, alpha); + + //float linearGain = pow(10, convertVITAdbToFloat(db_gain) / 20); + + if (level != 0 ) { + // Peaking EQ from AUDIO COOKBOOK + b[0] = 1 + alpha * A; + b[1] = -2 * cos(w0); + b[2] = 1 - alpha * A; + + a[0] = 1 + alpha/A; + a[1] = -2 * cos(w0); + a[2] = 1 - alpha / A; + } else { + b[0] = 0; + b[1] = 0; + b[2] = 0; + a[0] = 1; + a[1] = 0; + a[2] = 0; + } + + // Normalize by a[0] so that a[0] = 1 + b[0] = b[0] / a[0]; + b[1] = b[1] / a[0]; + b[2] = b[2] / a[0]; + + a[1] = a[1] / a[0]; + a[2] = a[2] / a[0]; + a[0] = a[0] / a[0]; + + return mod; } @@ -381,6 +484,7 @@ void gmsk_destroyModulator( GMSK_MOD mod ) { } gmsk_destroyFilter( mod->filter ); + safe_free(mod->iir); safe_free( mod ); } diff --git a/DSP_API/ThumbDV/gmsk_modem.h b/DSP_API/ThumbDV/gmsk_modem.h index 3e1b78f..b23baae 100644 --- a/DSP_API/ThumbDV/gmsk_modem.h +++ b/DSP_API/ThumbDV/gmsk_modem.h @@ -27,12 +27,25 @@ #ifndef THUMBDV_GMSK_MODEM_H_ #define THUMBDV_GMSK_MODEM_H_ +#include "common.h" + enum DEMOD_STATE { DEMOD_FALSE, DEMOD_TRUE, DEMOD_UNKNOWN }; +#define SC_EQ_MAX_DEPTH 3 +#define SC_EQ_FILTER_LEN 3 + +typedef struct _iir_filter +{ + float in_line[SC_EQ_FILTER_LEN]; + float out_line[SC_EQ_FILTER_LEN]; + float a[SC_EQ_FILTER_LEN]; + float b[SC_EQ_FILTER_LEN]; +} iir_filter, * IIR_FILTER; + typedef struct _fir_filter { float * taps; uint32 length; @@ -52,6 +65,7 @@ typedef struct _gmsk_mod { BOOL m_invert; FIR_FILTER filter; + IIR_FILTER iir; } gmsk_mod, * GMSK_MOD; void gmsk_testBitsAndEncodeDecode( void ); diff --git a/DSP_API/ThumbDV/slow_data.c b/DSP_API/ThumbDV/slow_data.c index 99b21f1..18acc9a 100644 --- a/DSP_API/ThumbDV/slow_data.c +++ b/DSP_API/ThumbDV/slow_data.c @@ -258,8 +258,8 @@ void slow_data_addDecodeData(DSTAR_MACHINE dstar, unsigned char * data, uint32 d uint32 message_index = data[0] & SLOW_DATA_LENGTH_MASK; if ( message_index != slow_decoder->message_index ) { - output("Out of order SLOW DATA MESSAGE SKIPPING\n"); - slow_decoder->message_index = 0; + output("Out of order SLOW DATA MESSAGE setting to new index\n"); + slow_decoder->message_index = message_index; break; } diff --git a/DSP_API/ThumbDV/thumbDV.c b/DSP_API/ThumbDV/thumbDV.c index 0ce1b3a..173ea18 100644 --- a/DSP_API/ThumbDV/thumbDV.c +++ b/DSP_API/ThumbDV/thumbDV.c @@ -76,7 +76,7 @@ static pthread_t _read_thread; BOOL _readThreadAbort = FALSE; -static uint32 _buffering_target = 4; +static uint32 _buffering_target = 1; static pthread_rwlock_t _encoded_list_lock; static BufferDescriptor _encoded_root; @@ -218,6 +218,26 @@ static void delay( unsigned int delay ) { nanosleep( &tim, &tim2 ); }; +void thumbDV_flushLists(void) +{ + BufferDescriptor buf_desc = NULL; + + do + { + buf_desc = _thumbDVEncodedList_UnlinkHead(); + if ( buf_desc != NULL ) + hal_BufferRelease(&buf_desc); + } while (buf_desc != NULL ); + + + do + { + buf_desc = _thumbDVDecodedList_UnlinkHead(); + if ( buf_desc != NULL ) + hal_BufferRelease(&buf_desc); + } while (buf_desc != NULL ); +} + void thumbDV_dump( char * text, unsigned char * data, unsigned int length ) { unsigned int offset = 0U; unsigned int i; @@ -555,7 +575,8 @@ int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out if ( samples_returned != 160 ) output( "Rate Mismatch expected %d got %d\n", 160, samples_returned ); - safe_free( desc ); +// safe_free( desc ); + hal_BufferRelease(&desc); } else { /* Do nothing for now */ } @@ -622,7 +643,8 @@ int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out if ( desc != NULL ) { memcpy( packet_out, desc->buf_ptr + 6, desc->sample_size * ( desc->num_samples - 6 ) ); samples_returned = desc->num_samples - 6; - safe_free( desc ); + //safe_free( desc ); + hal_BufferRelease(&desc); //thumbDV_dump(ANSI_BLUE "Coded Packet" ANSI_WHITE, packet_out, desc->num_samples - 6); } else { diff --git a/DSP_API/ThumbDV/thumbDV.h b/DSP_API/ThumbDV/thumbDV.h index aa19dd4..6241e78 100644 --- a/DSP_API/ThumbDV/thumbDV.h +++ b/DSP_API/ThumbDV/thumbDV.h @@ -44,4 +44,5 @@ int thumbDV_encode( int serial_fd, short * speech_in, unsigned char * packet_out int thumbDV_decode( int serial_fd, unsigned char * packet_in, short * speech_out, uint8 bytes_in_packet ); void thumbDV_dump( char * text, unsigned char * data, unsigned int length ); +void thumbDV_flushLists(void); #endif /* THUMBDV_THUMBDV_ */ diff --git a/DSP_API/Waveform/ThumbDV.cfg b/DSP_API/Waveform/ThumbDV.cfg new file mode 100644 index 0000000..f93b45c --- /dev/null +++ b/DSP_API/Waveform/ThumbDV.cfg @@ -0,0 +1,23 @@ +[header] +Name: ThumbDV +Version: "0.0.4" +Minimum-SmartSDR-Version: 1.4.2.0 +Author: FlexRadio Systems +Support-email: support@flexradio.com +Support-phone: 512-535-4713 +License: GPL7.3 +Executable: "thumbdv" + +[setup] +waveform create name=ThumbDV mode=DSTR underlying_mode=DFM version=0.0.4 +waveform set ThumbDV tx=1 +waveform set ThumbDV rx_filter low_cut=-4800 +waveform set ThumbDV rx_filter high_cut=4800 +waveform set ThumbDV rx_filter depth=2 +waveform set ThumbDV tx_filter low_cut=0 +waveform set ThumbDV tx_filter high_cut=4800 +waveform set ThumbDV tx_filter depth=2 +waveform set ThumbDV udpport=5000 + +[end] + diff --git a/DSP_API/Waveform/ThumbDV.ssdr_waveform b/DSP_API/Waveform/ThumbDV.ssdr_waveform new file mode 100644 index 0000000..6ea81d1 Binary files /dev/null and b/DSP_API/Waveform/ThumbDV.ssdr_waveform differ diff --git a/pc/CODEC2 GUI/CODEC2 GUI.sln b/pc/CODEC2 GUI/CODEC2 GUI.sln index df6e4a6..1cc7086 100644 --- a/pc/CODEC2 GUI/CODEC2 GUI.sln +++ b/pc/CODEC2 GUI/CODEC2 GUI.sln @@ -10,6 +10,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Vita", "..\..\..\smartsdr-win\Vita\Vita.csproj", "{6ED364FB-7444-44DA-9196-1D8679425B3E}" EndProject Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "CODEC2_GUI_INSTALLER", "CODEC2_GUI_INSTALLER\CODEC2_GUI_INSTALLER.vdproj", "{AABE6A3C-F038-4448-981F-F68A6D5069C3}" + ProjectSection(ProjectDependencies) = postProject + {19634B34-7569-4D1D-8182-B10AC27E13FF} = {19634B34-7569-4D1D-8182-B10AC27E13FF} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CODEC2 GUI", "CODEC2 GUI\CODEC2 GUI.csproj", "{19634B34-7569-4D1D-8182-B10AC27E13FF}" EndProject @@ -62,6 +65,7 @@ Global {19634B34-7569-4D1D-8182-B10AC27E13FF}.Debug|x86.ActiveCfg = Debug|x86 {19634B34-7569-4D1D-8182-B10AC27E13FF}.Debug|x86.Build.0 = Debug|x86 {19634B34-7569-4D1D-8182-B10AC27E13FF}.Release|Any CPU.ActiveCfg = Release|x86 + {19634B34-7569-4D1D-8182-B10AC27E13FF}.Release|Any CPU.Build.0 = Release|x86 {19634B34-7569-4D1D-8182-B10AC27E13FF}.Release|x86.ActiveCfg = Release|x86 {19634B34-7569-4D1D-8182-B10AC27E13FF}.Release|x86.Build.0 = Release|x86 EndGlobalSection diff --git a/pc/CODEC2 GUI/CODEC2 GUI/DstarInfo.cs b/pc/CODEC2 GUI/CODEC2 GUI/DstarInfo.cs index 8b18fd7..1d4d7a7 100644 --- a/pc/CODEC2 GUI/CODEC2 GUI/DstarInfo.cs +++ b/pc/CODEC2 GUI/CODEC2 GUI/DstarInfo.cs @@ -509,7 +509,7 @@ namespace CODEC2_GUI AssemblyInfo ai = new AssemblyInfo(Assembly.GetAssembly(typeof(MainForm))); - string mybasepath = System.IO.Path.Combine(basepath, ai.Company.Replace(' ', '_'), ai.ProductTitle.Replace(' ', '_')); + string mybasepath = System.IO.Path.Combine(basepath, ai.Company, ai.ProductTitle); if (!System.IO.Directory.Exists(mybasepath)) System.IO.Directory.CreateDirectory(mybasepath); diff --git a/pc/CODEC2 GUI/CODEC2 GUI/MainForm.cs b/pc/CODEC2 GUI/CODEC2 GUI/MainForm.cs index f12abf5..7766630 100644 --- a/pc/CODEC2 GUI/CODEC2 GUI/MainForm.cs +++ b/pc/CODEC2 GUI/CODEC2 GUI/MainForm.cs @@ -122,6 +122,13 @@ namespace CODEC2_GUI void API_RadioRemoved(Radio radio) { + _radio.SliceAdded -= _radio_SliceAdded; + _radio.SliceRemoved -= _radio_SliceRemoved; + + _radio.Disconnect(); + + _radio = null; + _radioConnected = false; } //************************************* diff --git a/pc/CODEC2 GUI/CODEC2 GUI/Properties/AssemblyInfo.cs b/pc/CODEC2 GUI/CODEC2 GUI/Properties/AssemblyInfo.cs index 67c211a..614bc16 100644 --- a/pc/CODEC2 GUI/CODEC2 GUI/Properties/AssemblyInfo.cs +++ b/pc/CODEC2 GUI/CODEC2 GUI/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("ThumbDV VODEC GUI")] +[assembly: AssemblyTitle("ThumbDV DSTAR GUI")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("FlexRadio Systems")] diff --git a/pc/CODEC2 GUI/CODEC2 GUI/dstarlistitem.cs b/pc/CODEC2 GUI/CODEC2 GUI/dstarlistitem.cs index db6571b..07d918d 100644 --- a/pc/CODEC2 GUI/CODEC2 GUI/dstarlistitem.cs +++ b/pc/CODEC2 GUI/CODEC2 GUI/dstarlistitem.cs @@ -255,7 +255,7 @@ namespace CODEC2_GUI StringBuilder sb = new StringBuilder(); bool msg2snd = (messageInfo != null && messageSent == false); // log info if we get header for third time or finally got message - bool hdr2snd = (headerInfo != null && headerSent == false && (headerCount > 3 || msg2snd)); + bool hdr2snd = (headerInfo != null && headerSent == false && (headerCount > 0 || msg2snd)); if (hdr2snd || msg2snd) sb.Append(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss")); if (hdr2snd) diff --git a/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/CODEC2_GUI_INSTALLER.vdproj b/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/CODEC2_GUI_INSTALLER.vdproj index 96bc826..b2f582a 100644 --- a/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/CODEC2_GUI_INSTALLER.vdproj +++ b/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/CODEC2_GUI_INSTALLER.vdproj @@ -13,6 +13,24 @@ "SccProvider" = "8:" "Hierarchy" { + "Entry" + { + "MsmKey" = "8:_0766D6B5F67085FA6951B8F3A110AC52" + "OwnerKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0766D6B5F67085FA6951B8F3A110AC52" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_37A07FD6839A484AB728FA94B1083955" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } "Entry" { "MsmKey" = "8:_44FE594CB4324BE091F300EB9369B6CC" @@ -21,14 +39,62 @@ } "Entry" { + "MsmKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_5841366F13AC47E5B678DCF7F7152F4E" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { - "MsmKey" = "8:_88C1D5A632F74D7EBC8A5FDC131505EE" - "OwnerKey" = "8:_UNDEFINED" + "MsmKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BF7C891FD48893917AC2212F0D71946D" + "OwnerKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BF7C891FD48893917AC2212F0D71946D" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BF7C891FD48893917AC2212F0D71946D" + "OwnerKey" = "8:_E01867FA37CD77344818571B20736D3B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DCE4F5BEF3314462167194E11CDFA3C0" + "OwnerKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DCE4F5BEF3314462167194E11CDFA3C0" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E01867FA37CD77344818571B20736D3B" + "OwnerKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E01867FA37CD77344818571B20736D3B" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -37,6 +103,42 @@ "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_52F2E5C82F5A468DB0A14958DABC010C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_6B67ECD422687C0C1F634130CF5E98FB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_0766D6B5F67085FA6951B8F3A110AC52" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E01867FA37CD77344818571B20736D3B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_BF7C891FD48893917AC2212F0D71946D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DCE4F5BEF3314462167194E11CDFA3C0" + "MsmSig" = "8:_UNDEFINED" + } } "Configurations" { @@ -62,6 +164,19 @@ "PrerequisitesLocation" = "2:1" "Url" = "8:" "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0,Profile=Client" + { + "Name" = "8:Microsoft .NET Framework 4 Client Profile (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.0,Profile=Client" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } } } "Release" @@ -69,7 +184,7 @@ "DisplayName" = "8:Release" "IsDebugOnly" = "11:FALSE" "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\FreeDV.msi" + "OutputFilename" = "8:Release\\ThumbDV_DSTAR.msi" "PackageFilesAs" = "3:2" "PackageFileSize" = "3:-2147483648" "CabType" = "3:1" @@ -86,6 +201,19 @@ "PrerequisitesLocation" = "2:1" "Url" = "8:" "ComponentsUrl" = "8:" + "Items" + { + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0,Profile=Client" + { + "Name" = "8:Microsoft .NET Framework 4 Client Profile (x86 and x64)" + "ProductCode" = "8:.NETFramework,Version=v4.0,Profile=Client" + } + "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" + { + "Name" = "8:Windows Installer 3.1" + "ProductCode" = "8:Microsoft.Windows.Installer.3.1" + } + } } } } @@ -116,6 +244,57 @@ } "File" { + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0766D6B5F67085FA6951B8F3A110AC52" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Flex.UiWpfFramework, Version=1.0.1.24789, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_0766D6B5F67085FA6951B8F3A110AC52" + { + "Name" = "8:Flex.UiWpfFramework.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Flex.UiWpfFramework.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_37A07FD6839A484AB728FA94B1083955" + { + "SourcePath" = "8:..\\..\\..\\..\\..\\ThumbDV.ssdr_waveform" + "TargetName" = "8:ThumbDV.ssdr_waveform" + "Tag" = "8:" + "Folder" = "8:_377DE1BBED84443D8A1631B8496FDC4E" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_44FE594CB4324BE091F300EB9369B6CC" { "SourcePath" = "8:..\\CODEC2 GUI\\Images\\FDVLogo.ico" @@ -156,12 +335,23 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_88C1D5A632F74D7EBC8A5FDC131505EE" + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6B67ECD422687C0C1F634130CF5E98FB" { - "SourcePath" = "8:FreeDV_Release.ssdr_waveform" - "TargetName" = "8:FreeDV_Release.ssdr_waveform" + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:FlexLib, Version=1.4.23.24790, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_6B67ECD422687C0C1F634130CF5E98FB" + { + "Name" = "8:FlexLib.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:FlexLib.dll" + "TargetName" = "8:" "Tag" = "8:" - "Folder" = "8:_377DE1BBED84443D8A1631B8496FDC4E" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" "Condition" = "8:" "Transitive" = "11:FALSE" "Vital" = "11:TRUE" @@ -173,7 +363,100 @@ "PackageAs" = "3:1" "Register" = "3:1" "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_BF7C891FD48893917AC2212F0D71946D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Util, Version=1.0.1.24789, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_BF7C891FD48893917AC2212F0D71946D" + { + "Name" = "8:Util.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Util.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DCE4F5BEF3314462167194E11CDFA3C0" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_DCE4F5BEF3314462167194E11CDFA3C0" + { + "Name" = "8:Ionic.Zip.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Ionic.Zip.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E01867FA37CD77344818571B20736D3B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Vita, Version=1.0.1.24789, Culture=neutral, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_E01867FA37CD77344818571B20736D3B" + { + "Name" = "8:Vita.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Vita.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F5493E84A58F4E0D993B24BAD4694555" @@ -284,20 +567,20 @@ "Product" { "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:FreeDV" - "ProductCode" = "8:{31966E85-47C4-49D4-80B5-3051D960ADC0}" - "PackageCode" = "8:{4151C606-CE2E-419B-B8A3-5EA149790371}" - "UpgradeCode" = "8:{BA448748-24DA-43CE-BAA7-FC4F549589E8}" + "ProductName" = "8:ThumbDV DSTAR" + "ProductCode" = "8:{0A72FD89-CF75-4368-8DCF-20719A4EF565}" + "PackageCode" = "8:{7B138403-B258-48E4-9991-7DDD5FFDFC50}" + "UpgradeCode" = "8:{A727F8A2-D15B-45F4-9728-19541BB04667}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.0.0" + "ProductVersion" = "8:1.0.4" "Manufacturer" = "8:FlexRadio Systems" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" - "Title" = "8:FreeDV" + "Title" = "8:ThumbDV DSTAR" "Subject" = "8:" "ARPCONTACT" = "8:" "Keywords" = "8:" @@ -406,32 +689,18 @@ } "Shortcut" { - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_1AA7F5078E9B42FB8E16D82998B06E10" + "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_0CB4C29272694A3C8B3AD5BF0F25047C" { - "Name" = "8:FreeDV" + "Name" = "8:ThumbDV DSTAR" "Arguments" = "8:" "Description" = "8:" "ShowCmd" = "3:1" "IconIndex" = "3:0" "Transitive" = "11:FALSE" - "Target" = "8:" - "Folder" = "8:_28A6D54432764B34ABC7E36F336A6762" - "WorkingFolder" = "8:_40196D409E904F29B144A3CC2149E747" - "Icon" = "8:_44FE594CB4324BE091F300EB9369B6CC" - "Feature" = "8:" - } - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_A4D147B0B4B04223B55728F898826A49" - { - "Name" = "8:CODEC2 GUI" - "Arguments" = "8:" - "Description" = "8:" - "ShowCmd" = "3:1" - "IconIndex" = "3:0" - "Transitive" = "11:FALSE" - "Target" = "8:" + "Target" = "8:_52F2E5C82F5A468DB0A14958DABC010C" "Folder" = "8:_01E98CA335E74C1385F704CA49E431C5" "WorkingFolder" = "8:_40196D409E904F29B144A3CC2149E747" - "Icon" = "8:_44FE594CB4324BE091F300EB9369B6CC" + "Icon" = "8:" "Feature" = "8:" } } @@ -833,6 +1102,34 @@ } "ProjectOutput" { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_52F2E5C82F5A468DB0A14958DABC010C" + { + "SourcePath" = "8:..\\CODEC2 GUI\\obj\\x86\\Release\\ThumbDV_DSTAR_GUI.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_40196D409E904F29B144A3CC2149E747" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{19634B34-7569-4D1D-8182-B10AC27E13FF}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } } } } diff --git a/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/Flex_ThumbDV_Waveform_Inno_Install_Script.iss b/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/Flex_ThumbDV_Waveform_Inno_Install_Script.iss index 70b44b4..a2d74c3 100644 --- a/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/Flex_ThumbDV_Waveform_Inno_Install_Script.iss +++ b/pc/CODEC2 GUI/CODEC2_GUI_INSTALLER/Flex_ThumbDV_Waveform_Inno_Install_Script.iss @@ -1,6 +1,6 @@ ; -#define MyAppName "Flex DSTAR Waveform" +#define MyAppName "FlexRadio DSTAR Waveform" #define MyAppVersion "1.4.0.3" #define MyAppPublisher "FlexRadio Systems, LLC" #define MyAppURL "http://www.flexradio.com/" @@ -18,9 +18,9 @@ AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName=FlexRadio Systems\ThumbDV DSTAR DisableDirPage=yes -DefaultGroupName=Flex DSTAR Waveform +DefaultGroupName=FlexRadio DSTAR Waveform DisableProgramGroupPage=yes -OutputBaseFilename=FlexDSTARWaveform +OutputBaseFilename=FlexRadioDSTARWaveform SetupIconFile=..\CODEC2 GUI\Images\dstar.ico Compression=lzma SolidCompression=yes @@ -39,7 +39,7 @@ Source: "..\CODEC2 GUI\bin\x86\Release\FlexLib.dll"; DestDir: "{app}"; Flags: ig Source: "..\CODEC2 GUI\bin\x86\Release\Ionic.Zip.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\CODEC2 GUI\bin\x86\Release\Util.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "..\CODEC2 GUI\bin\x86\Release\Vita.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "..\..\..\DSP_API\ThumbDV_Release\ThumbDV.ssdr_waveform"; DestDir: {userappdata}\FlexRadio Systems\Waveforms; Flags: ignoreversion +Source: "..\..\..\DSP_API\Waveform\ThumbDV.ssdr_waveform"; DestDir: "{userappdata}\FlexRadio Systems\Waveforms\"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons]