From: wittend99 Date: Fri, 17 Aug 2012 20:42:13 +0000 (+0000) Subject: git-svn-id: https://svn.code.sf.net/p/freetel/code@622 01035d8c-6547-0410-b346-abe4f9... X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=5c379a9be09959339ce95d6f36e60937fb7a0d89;p=freetel-svn-tracking.git git-svn-id: https://svn.code.sf.net/p/freetel/code@622 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/fdmdv2/variants/fdmdv2dll/.cdf b/fdmdv2/variants/fdmdv2dll/.cdf new file mode 100644 index 00000000..4e6600d3 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/.cdf @@ -0,0 +1,7 @@ +[CatalogHeader] +Name=.cat +ResultDir=C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll + +[CatalogFiles] += += diff --git a/fdmdv2/variants/fdmdv2dll/ReadMe.txt b/fdmdv2/variants/fdmdv2dll/ReadMe.txt new file mode 100644 index 00000000..4657c08c --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/ReadMe.txt @@ -0,0 +1,40 @@ +======================================================================== + DYNAMIC LINK LIBRARY : win32-project Project Overview +======================================================================== + +AppWizard has created this win32-project DLL for you. + +This file contains a summary of what you will find in each of the files that +make up your win32-project application. + + +win32-project.vcxproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +win32-project.vcxproj.filters + This is the filters file for VC++ projects generated using an Application Wizard. + It contains information about the association between the files in your project + and the filters. This association is used in the IDE to show grouping of files with + similar extensions under a specific node (for e.g. ".cpp" files are associated with the + "Source Files" filter). + +win32-project.cpp + This is the main DLL source file. + +///////////////////////////////////////////////////////////////////////////// +Other standard files: + +StdAfx.h, StdAfx.cpp + These files are used to build a precompiled header (PCH) file + named win32-project.pch and a precompiled types file named StdAfx.obj. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.dll b/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.dll new file mode 100644 index 00000000..f4baa09f Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.dll differ diff --git a/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.lib b/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.lib new file mode 100644 index 00000000..1bcac2da Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/Release/fdmdv2-dll.lib differ diff --git a/fdmdv2/variants/fdmdv2dll/dllmain.cpp b/fdmdv2/variants/fdmdv2dll/dllmain.cpp new file mode 100644 index 00000000..eaa3831f --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/dllmain.cpp @@ -0,0 +1,20 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "stdafx.h" + +BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + { + //Disable thread notifications + DisableThreadLibraryCalls(hModule); + }; + break; + } + return TRUE; +} + diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.aps b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.aps new file mode 100644 index 00000000..e358da82 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.aps differ diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.cpp b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.cpp new file mode 100644 index 00000000..0d1f8b8e --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.cpp @@ -0,0 +1,1406 @@ +/*---------------------------------------------------------------------------*\ + +FILE........: codec2-dll.cpp +AUTHOR......: David Witten +DATE CREATED: 21 May 2011 + +Wrapper for the Codec2 codec and fdmdv modem APIs. + +\*---------------------------------------------------------------------------*/ + +/* +All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License version 2.1, as +published by the Free Software Foundation. This program is +distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, see . +*/ +#define __USE_MATH_DEFINES + +#include "stdafx.h" +#include +#include +#include +#include +#include +#include + +#include "fdmdv_internal.h" +#include "fdmdv2-dll.h" +#include "rn.h" +#include "test_bits.h" +#include "pilot_coeff.h" +#include "fft.h" +#include "hanning.h" +#include "os.h" +/* +// This is an example of an exported variable +WIN32PROJECT_API int nwin32project=0; + +// This is an example of an exported function. +WIN32PROJECT_API int fnwin32project(void) +{ + return 42; +} + +// This is the constructor of a class that has been exported. +// see win32-project.h for the class definition +Cwin32project::Cwin32project() +{ + return; +} +*/ + +/*---------------------------------------------------------------------------*\ + +FILE........: fdmdv.c +AUTHOR......: David Rowe +DATE CREATED: April 14 2012 + +Functions that implement the FDMDV modem. + +\*---------------------------------------------------------------------------*/ + +/* +Copyright (C) 2012 David Rowe + +All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License version 2.1, as +published by the Free Software Foundation. This program is +distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with this program; if not, see . +*/ + +/*---------------------------------------------------------------------------*\ + +INCLUDES + +\*---------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------*\ + +FUNCTIONS + +\*---------------------------------------------------------------------------*/ + + + +static inline double round(double val) +{ + return floor(val + 0.5); +} + + + +static COMP cneg(COMP a) +{ + COMP res; + + res.real = -a.real; + res.imag = -a.imag; + + return res; +} + +static COMP cconj(COMP a) +{ + COMP res; + + res.real = a.real; + res.imag = -a.imag; + + return res; +} + +static COMP cmult(COMP a, COMP b) +{ + COMP res; + + res.real = a.real*b.real - a.imag*b.imag; + res.imag = a.real*b.imag + a.imag*b.real; + + return res; +} + +static COMP fcmult(float a, COMP b) +{ + COMP res; + + res.real = a*b.real; + res.imag = a*b.imag; + + return res; +} + +static COMP cadd(COMP a, COMP b) +{ + COMP res; + + res.real = a.real + b.real; + res.imag = a.imag + b.imag; + + return res; +} + +static float cabsolute(COMP a) +{ + return sqrt((float)pow((float)a.real, (float)2.0) + (float)pow((float)a.imag, (float)2.0)); +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: fdmdv_create +AUTHOR......: David Rowe +DATE CREATED: 16/4/2012 + +Create and initialise an instance of the modem. Returns a pointer +to the modem states or NULL on failure. One set of states is +sufficient for a full duplex modem. + +\*---------------------------------------------------------------------------*/ + +WIN32PROJECT_API struct FDMDV *fdmdv_create(void) +{ + struct FDMDV *f; + int c, i, k; + float carrier_freq; + + assert(FDMDV_BITS_PER_FRAME == NC*NB); + assert(FDMDV_NOM_SAMPLES_PER_FRAME == M); + assert(FDMDV_MAX_SAMPLES_PER_FRAME == (M+M/P)); + + f = (struct FDMDV*)malloc(sizeof(struct FDMDV)); + if (f == NULL) + return NULL; + + f->current_test_bit = 0; + for(i=0; irx_test_bits_mem[i] = 0; + + f->tx_pilot_bit = 0; + + for(c=0; cprev_tx_symbols[c].real = 1.0; + f->prev_tx_symbols[c].imag = 0.0; + f->prev_rx_symbols[c].real = 1.0; + f->prev_rx_symbols[c].imag = 0.0; + + for(k=0; ktx_filter_memory[c][k].real = 0.0; + f->tx_filter_memory[c][k].imag = 0.0; + f->rx_filter_memory[c][k].real = 0.0; + f->rx_filter_memory[c][k].imag = 0.0; + } + + /* Spread initial FDM carrier phase out as far as possible. + This helped PAPR for a few dB. We don't need to adjust rx + phase as DQPSK takes care of that. */ + + f->phase_tx[c].real = cos(2.0*PI*c/(NC+1)); + f->phase_tx[c].imag = sin(2.0*PI*c/(NC+1)); + + f->phase_rx[c].real = 1.0; + f->phase_rx[c].imag = 0.0; + + for(k=0; krx_filter_mem_timing[c][k].real = 0.0; + f->rx_filter_mem_timing[c][k].imag = 0.0; + } + for(k=0; krx_baseband_mem_timing[c][k].real = 0.0; + f->rx_baseband_mem_timing[c][k].imag = 0.0; + } + } + + /* Set up frequency of each carrier */ + + for(c=0; cfreq[c].real = cos(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sin(2.0*PI*carrier_freq/FS); + } + + for(c=NC/2; cfreq[c].real = cos(2.0*PI*carrier_freq/FS); + f->freq[c].imag = sin(2.0*PI*carrier_freq/FS); + } + + f->freq[NC].real = cos(2.0*PI*FCENTRE/FS); + f->freq[NC].imag = sin(2.0*PI*FCENTRE/FS); + + /* Generate DBPSK pilot Look Up Table (LUT) */ + + generate_pilot_lut(f->pilot_lut, &f->freq[NC]); + + /* freq Offset estimation states */ + + for(i=0; ipilot_baseband1[i].real = f->pilot_baseband2[i].real = 0.0; + f->pilot_baseband1[i].imag = f->pilot_baseband2[i].imag = 0.0; + } + f->pilot_lut_index = 0; + f->prev_pilot_lut_index = 3*M; + + for(i=0; ipilot_lpf1[i].real = f->pilot_lpf2[i].real = 0.0; + f->pilot_lpf1[i].imag = f->pilot_lpf2[i].imag = 0.0; + } + + f->foff = 0.0; + f->foff_rect.real = 1.0; + f->foff_rect.imag = 0.0; + f->foff_phase_rect.real = 1.0; + f->foff_phase_rect.imag = 0.0; + + f->fest_state = 0; + f->coarse_fine = COARSE; + + for(c=0; csig_est[c] = 0.0; + f->noise_est[c] = 0.0; + } + + return f; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: fdmdv_destroy +AUTHOR......: David Rowe +DATE CREATED: 16/4/2012 + +Destroy an instance of the modem. + +\*---------------------------------------------------------------------------*/ + +WIN32PROJECT_API void fdmdv_destroy(struct FDMDV *fdmdv) +{ + assert(fdmdv != NULL); + free(fdmdv); +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: fdmdv_get_test_bits() +AUTHOR......: David Rowe +DATE CREATED: 16/4/2012 + +Generate a frame of bits from a repeating sequence of random data. OK so +it's not very random if it repeats but it makes syncing at the demod easier +for test purposes. + +\*---------------------------------------------------------------------------*/ + +WIN32PROJECT_API void fdmdv_get_test_bits(struct FDMDV *f, int tx_bits[]) +{ + int i; + + for(i=0; icurrent_test_bit]; + f->current_test_bit++; + if (f->current_test_bit > (NTEST_BITS-1)) + f->current_test_bit = 0; + } +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: bits_to_dqpsk_symbols() +AUTHOR......: David Rowe +DATE CREATED: 16/4/2012 + +Maps bits to parallel DQPSK symbols. Generate Nc+1 QPSK symbols from +vector of (1,Nc*Nb) input tx_bits. The Nc+1 symbol is the +1 -1 +1 +.... BPSK sync carrier. + +\*---------------------------------------------------------------------------*/ + +void bits_to_dqpsk_symbols(COMP tx_symbols[], COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit) +{ + int c, msb, lsb; + COMP j = {0.0,1.0}; + + /* map tx_bits to to Nc DQPSK symbols */ + + for(c=0; cprev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit); + memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(NC+1)); + tx_filter(tx_baseband, tx_symbols, fdmdv->tx_filter_memory); + fdm_upconvert(tx_fdm, tx_baseband, fdmdv->phase_tx, fdmdv->freq); + + *sync_bit = fdmdv->tx_pilot_bit; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: generate_pilot_fdm() +AUTHOR......: David Rowe +DATE CREATED: 19/4/2012 + +Generate M samples of DBPSK pilot signal for Freq offset estimation. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, float *filter_mem, COMP *phase, COMP *freq) +{ + int i,j,k; + float tx_baseband[M]; + + /* +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes (roughly) + two spectral lines at +/- RS/2 */ + + if (*bit) + *symbol = -*symbol; + else + *symbol = *symbol; + if (*bit) + *bit = 0; + else + *bit = 1; + + /* filter DPSK symbol to create M baseband samples */ + + filter_mem[NFILTER-1] = (float)(sqrt(2.0)/2) * *symbol; + for(i=0; ireal; + pilot_fdm[i].imag = sqrt(2.0)*2*tx_baseband[i] * phase->imag; + } +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: generate_pilot_lut() +AUTHOR......: David Rowe +DATE CREATED: 19/4/2012 + +Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal +is periodic in 4M samples we can then use this vector as a look up table +for pilot signal generation in the demod. + +\*---------------------------------------------------------------------------*/ + +void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq) +{ + int pilot_rx_bit = 0; + float pilot_symbol = sqrt(2.0); + COMP pilot_phase = {1.0, 0.0}; + float pilot_filter_mem[NFILTER]; + COMP pilot[M]; + int i,f; + + for(i=0; i= 4) + memcpy(&pilot_lut[M*(f-4)], pilot, M*sizeof(COMP)); + } + +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: lpf_peak_pick() +AUTHOR......: David Rowe +DATE CREATED: 20/4/2012 + +LPF and peak pick part of freq est, put in a function as we call it twice. + +\*---------------------------------------------------------------------------*/ + +void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], COMP pilot_lpf[], COMP S[], int nin) +{ + int i,j,k; + int mpilot; + float mag, imax; + int ix; + float r; + + /* LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset */ + + for(i=0; i imax) + { + imax = mag; + ix = i; + } + } + r = 2.0*200.0/MPILOTFFT; /* maps FFT bin to frequency in Hz */ + + if (ix >= MPILOTFFT/2) + *foff = (ix - MPILOTFFT)*r; + else + *foff = (ix)*r; + *max = imax; + +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: rx_est_freq_offset() +AUTHOR......: David Rowe +DATE CREATED: 19/4/2012 + +Estimate frequency offset of FDM signal using BPSK pilot. Note that +this algorithm is quite sensitive to pilot tone level wrt other +carriers, so test variations to the pilot amplitude carefully. + +\*---------------------------------------------------------------------------*/ + +float rx_est_freq_offset(struct FDMDV *f, float rx_fdm[], int nin) +{ + int i,j; + COMP pilot[M+M/P]; + COMP prev_pilot[M+M/P]; + float foff, foff1, foff2; + float max1, max2; + + assert(nin <= M+M/P); + + /* get pilot samples used for correlation/down conversion of rx signal */ + + for (i=0; ipilot_lut[f->pilot_lut_index]; + f->pilot_lut_index++; + if (f->pilot_lut_index >= 4*M) + f->pilot_lut_index = 0; + + prev_pilot[i] = f->pilot_lut[f->prev_pilot_lut_index]; + f->prev_pilot_lut_index++; + if (f->prev_pilot_lut_index >= 4*M) + f->prev_pilot_lut_index = 0; + } + + /* + Down convert latest M samples of pilot by multiplying by ideal + BPSK pilot signal we have generated locally. The peak of the + resulting signal is sensitive to the time shift between the + received and local version of the pilot, so we do it twice at + different time shifts and choose the maximum. + */ + + for(i=0; ipilot_baseband1[i] = f->pilot_baseband1[i+nin]; + f->pilot_baseband2[i] = f->pilot_baseband2[i+nin]; + } + + for(i=0,j=NPILOTBASEBAND-nin; ipilot_baseband1[j] = fcmult(rx_fdm[i], cconj(pilot[i])); + f->pilot_baseband2[j] = fcmult(rx_fdm[i], cconj(prev_pilot[i])); + } + + lpf_peak_pick(&foff1, &max1, f->pilot_baseband1, f->pilot_lpf1, f->S1, nin); + lpf_peak_pick(&foff2, &max2, f->pilot_baseband2, f->pilot_lpf2, f->S2, nin); + + if (max1 > max2) + foff = foff1; + else + foff = foff2; + + return foff; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: freq_shift() +AUTHOR......: David Rowe +DATE CREATED: 26/4/2012 + +Frequency shift modem signal. + +\*---------------------------------------------------------------------------*/ + +void freq_shift(COMP rx_fdm_fcorr[], float rx_fdm[], float foff, COMP *foff_rect, COMP *foff_phase_rect, int nin) +{ + int i; + + foff_rect->real = cos(2.0*PI*foff/FS); + foff_rect->imag = sin(2.0*PI*foff/FS); + for(i=0; i M) + rx_timing -= M; + if (rx_timing < -M) + rx_timing += M; + + /* rx_filt_mem_timing contains M + Nfilter + M samples of the + baseband signal at rate M this enables us to resample the + filtered rx symbol with M sample precision once we have + rx_timing */ + + for(c=0; c= 0) && (d.imag >= 0)) { + msb = 0; lsb = 0; + } + if ((d.real < 0) && (d.imag >= 0)) { + msb = 0; lsb = 1; + } + if ((d.real < 0) && (d.imag < 0)) { + msb = 1; lsb = 0; + } + if ((d.real >= 0) && (d.imag < 0)) { + msb = 1; lsb = 1; + } + rx_bits[2*c] = msb; + rx_bits[2*c+1] = lsb; + } + + /* Extract DBPSK encoded Sync bit and fine freq offset estimate */ + + phase_difference[NC] = cmult(rx_symbols[NC], cconj(prev_rx_symbols[NC])); + if (phase_difference[NC].real < 0) { + *sync_bit = 1; + ferr = phase_difference[NC].imag; + } + else { + *sync_bit = 0; + ferr = -phase_difference[NC].imag; + } + + /* pilot carrier gets an extra pi/4 rotation to make it consistent + with other carriers, as we need it for snr_update and scatter + diagram */ + + phase_difference[NC] = cmult(phase_difference[NC], pi_on_4); + + return ferr; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: snr_update() +AUTHOR......: David Rowe +DATE CREATED: 17 May 2012 + +Given phase differences update estimates of signal and noise levels. + +\*---------------------------------------------------------------------------*/ + +void snr_update(float sig_est[], float noise_est[], COMP phase_difference[]) +{ + float s[NC+1]; + COMP refl_symbols[NC+1]; + float n[NC+1]; + COMP pi_on_4; + int c; + + pi_on_4.real = cos(PI/4.0); + pi_on_4.imag = sin(PI/4.0); + + /* mag of each symbol is distance from origin, this gives us a + vector of mags, one for each carrier. */ + + for(c=0; crx_test_bits_mem[i] = f->rx_test_bits_mem[j]; + for(i=NTEST_BITS-FDMDV_BITS_PER_FRAME,j=0; irx_test_bits_mem[i] = rx_bits[j]; + + /* see how many bit errors we get when checked against test sequence */ + + *bit_errors = 0; + for(i=0; irx_test_bits_mem[i]; + //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]); + } + + /* if less than a thresh we are aligned and in sync with test sequence */ + + ber = (float)*bit_errors/NTEST_BITS; + + *sync = 0; + if (ber < 0.2) + *sync = 1; + + *ntest_bits = NTEST_BITS; + +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: freq_state(() +AUTHOR......: David Rowe +DATE CREATED: 24/4/2012 + +Freq offset state machine. Moves between coarse and fine states +based on BPSK pilot sequence. Freq offset estimator occasionally +makes mistakes when used continuously. So we use it until we have +acquired the BPSK pilot, then switch to a more robust "fine" +tracking algorithm. If we lose sync we switch back to coarse mode +for fast-requisition of large frequency offsets. + +\*---------------------------------------------------------------------------*/ + +int freq_state(int sync_bit, int *state) +{ + int next_state, coarse_fine; + + /* acquire state, look for 6 symbol 010101 sequence from sync bit */ + + next_state = *state; + switch(*state) { + case 0: + if (sync_bit == 0) + next_state = 1; + break; + case 1: + if (sync_bit == 1) + next_state = 2; + else + next_state = 0; + break; + case 2: + if (sync_bit == 0) + next_state = 3; + else + next_state = 0; + break; + case 3: + if (sync_bit == 1) + next_state = 4; + else + next_state = 0; + break; + case 4: + if (sync_bit == 0) + next_state = 5; + else + next_state = 0; + break; + case 5: + if (sync_bit == 1) + next_state = 6; + else + next_state = 0; + break; + + /* states 6 and above are track mode, make sure we keep + getting 0101 sync bit sequence */ + + case 6: + if (sync_bit == 0) + next_state = 7; + else + next_state = 0; + + break; + case 7: + if (sync_bit == 1) + next_state = 6; + else + next_state = 0; + break; + } + + *state = next_state; + if (*state >= 6) + coarse_fine = FINE; + else + coarse_fine = COARSE; + + return coarse_fine; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: fdmdv_demod() +AUTHOR......: David Rowe +DATE CREATED: 26/4/2012 + +FDMDV demodulator, take an array of FDMDV_SAMPLES_PER_FRAME +modulated symbols, returns an array of FDMDV_BITS_PER_FRAME bits, +plus the sync bit. + +The number of input samples nin will normally be M == +FDMDV_SAMPLES_PER_FRAME. However to adjust for differences in +transmit and receive sample clocks nin will occasionally be M-M/P, +or M+M/P. + +\*---------------------------------------------------------------------------*/ + +WIN32PROJECT_API void fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[], int *sync_bit, float rx_fdm[], int *nin) +{ + float foff_coarse, foff_fine; + COMP rx_fdm_fcorr[M+M/P]; + COMP rx_baseband[NC+1][M+M/P]; + COMP rx_filt[NC+1][P+1]; + COMP rx_symbols[NC+1]; + float env[NT*P]; + + /* freq offset estimation and correction */ + + foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm, *nin); + + if (fdmdv->coarse_fine == COARSE) + fdmdv->foff = foff_coarse; + freq_shift(rx_fdm_fcorr, rx_fdm, fdmdv->foff, &fdmdv->foff_rect, &fdmdv->foff_phase_rect, *nin); + + /* baseband processing */ + + fdm_downconvert(rx_baseband, rx_fdm_fcorr, fdmdv->phase_rx, fdmdv->freq, *nin); + rx_filter(rx_filt, rx_baseband, fdmdv->rx_filter_memory, *nin); + fdmdv->rx_timing = rx_est_timing(rx_symbols, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, *nin); + + /* adjust number of input samples to keep timing within bounds */ + + *nin = M; + + if (fdmdv->rx_timing > 2*M/P) + *nin += M/P; + + if (fdmdv->rx_timing < 0) + *nin -= M/P; + + foff_fine = qpsk_to_bits(rx_bits, sync_bit, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols); + memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(NC+1)); + snr_update(fdmdv->sig_est, fdmdv->noise_est, fdmdv->phase_difference); + + /* freq offset estimation state machine */ + + fdmdv->coarse_fine = freq_state(*sync_bit, &fdmdv->fest_state); + fdmdv->foff -= TRACK_COEFF*foff_fine; +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: calc_snr() +AUTHOR......: David Rowe +DATE CREATED: 17 May 2012 + +Calculate current SNR estimate (3000Hz noise BW) + +\*---------------------------------------------------------------------------*/ + +float calc_snr(float sig_est[], float noise_est[]) +{ + float S, SdB; + float mean, N50, N50dB, N3000dB; + float snr_dB; + int c; + + S = 0.0; + for(c=0; csnr_est = calc_snr(fdmdv->sig_est, fdmdv->noise_est); + fdmdv_stats->fest_coarse_fine = fdmdv->coarse_fine; + fdmdv_stats->foff = fdmdv->foff; + fdmdv_stats->rx_timing = fdmdv->rx_timing; + fdmdv_stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */ + + assert((NC+1) == FDMDV_NSYM); + + for(c=0; crx_symbols[c] = fdmdv->phase_difference[c]; + } +} + +/*---------------------------------------------------------------------------*\ + +FUNCTION....: fdmdv_8_to_48() +AUTHOR......: David Rowe +DATE CREATED: 9 May 2012 + +Changes the sample rate of a signal from 8 to 48 kHz. Experience +with PC based modems has shown that PC sound cards have a more +accurate sample clock when set for 48 kHz than 8 kHz. + +n is the number of samples at the 8 kHz rate, there are FDMDV_OS*n samples +at the 48 kHz rate. A memory of FDMDV_OS_TAPS/FDMDV_OS samples is reqd for +in8k[] (see t48_8.c unit test as example). + +This is a classic polyphase upsampler. We take the 8 kHz samples +and insert (FDMDV_OS-1) zeroes between each sample, then +FDMDV_OS_TAPS FIR low pass filter the signal at 4kHz. As most of +the input samples are zeroes, we only need to multiply non-zero +input samples by filter coefficients. The zero insertion and +filtering are combined in the code below and I'm too lazy to explain +it further right now.... + +\*---------------------------------------------------------------------------*/ + +WIN32PROJECT_API void fdmdv_8_to_48(float out48k[], float in8k[], int n) +{ + int i,j,k,l; + + for(i=0; i. +*/ + +// The following ifdef block is the standard way of creating macros which make exporting +// from a DLL simpler. All files within this DLL are compiled with the WIN32PROJECT_EXPORTS +// symbol defined on the command line. This symbol should not be defined on any project +// that uses this DLL. This way any other project whose source files include this file see +// WIN32PROJECT_API functions as being imported from a DLL, whereas this DLL sees symbols +// defined with this macro as being exported. +#ifdef WIN32PROJECT_EXPORTS +#define WIN32PROJECT_API __declspec(dllexport) +#else +#define WIN32PROJECT_API __declspec(dllimport) +#endif + +/* +// This class is exported from the win32-project.dll +class WIN32PROJECT_API Cwin32project +{ +public: + Cwin32project(void); +}; + +extern WIN32PROJECT_API int nwin32project; + +WIN32PROJECT_API int fnwin32project(void); +*/ + +#ifndef __FDMDV__ +#define __FDMDV__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "comp.h" + +WIN32PROJECT_API void fft(float x[], int n, int isign); + + +#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, 1400 bit/s */ +#define FDMDV_NOM_SAMPLES_PER_FRAME 160 /* modulator output samples/frame and nominal demod samples/frame */ + /* at 8000 Hz sample rate */ +#define FDMDV_MAX_SAMPLES_PER_FRAME 200 /* max demod samples/frame, use this to allocate storage */ +#define FDMDV_SCALE 1000 /* suggested scaling for 16 bit shorts */ +#define FDMDV_NSYM 15 + +/* 8 to 48 kHz sample rate conversion */ + +#define FDMDV_OS 6 /* oversampling rate */ +#define FDMDV_OS_TAPS 48 /* number of OS filter taps */ + +/* FDMDV states and stats structures */ + +struct FDMDV; + +struct FDMDV_STATS { + float snr_est; /* estimated SNR of rx signal in dB (3 kHz noise BW) */ + COMP rx_symbols[FDMDV_NSYM]; /* latest received symbols, for scatter plot */ + int fest_coarse_fine; /* freq est state, 0-coarse 1-fine */ + float foff; /* estimated freq offset in Hz */ + float rx_timing; /* estimated optimum timing offset in samples */ + float clock_offset; /* Estimated tx/rx sample clock offset in ppm */ +}; + +WIN32PROJECT_API struct FDMDV *fdmdv_create(void); +WIN32PROJECT_API void fdmdv_destroy(struct FDMDV *fdmdv_state); + +WIN32PROJECT_API void fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[], int *sync_bit); +WIN32PROJECT_API void fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *sync_bit, float rx_fdm[], int *nin); + +WIN32PROJECT_API void fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]); +WIN32PROJECT_API void fdmdv_put_test_bits(struct FDMDV *f, int *sync, int *bit_errors, int *ntest_bits, int rx_bits[]); + +WIN32PROJECT_API void fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct FDMDV_STATS *fdmdv_stats); +WIN32PROJECT_API void fdmdv_get_waterfall_line(struct FDMDV *fdmdv_state, float magnitudes[], int *magnitude_points); + +#endif + +#ifdef __cplusplus +} +#endif diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.rc b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.rc new file mode 100644 index 00000000..0d7c7a75 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.rc differ diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.sln b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.sln new file mode 100644 index 00000000..554e3c07 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/fdmdv2-dll.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fdmdv2-dll", "fdmdv2-project.vcxproj", "{25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vbTest", "vbTest\vbTest.vbproj", "{36C01EFE-7F22-486B-82C4-07DF02101B1A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x86 = Debug|x86 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Debug|Win32.ActiveCfg = Debug|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Debug|Win32.Build.0 = Debug|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Debug|x86.ActiveCfg = Debug|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Release|Mixed Platforms.Build.0 = Release|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Release|Win32.ActiveCfg = Release|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Release|Win32.Build.0 = Release|Win32 + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541}.Release|x86.ActiveCfg = Release|Win32 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Debug|Win32.ActiveCfg = Debug|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Debug|x86.ActiveCfg = Debug|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Debug|x86.Build.0 = Debug|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Release|Mixed Platforms.Build.0 = Release|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Release|Win32.ActiveCfg = Release|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Release|x86.ActiveCfg = Release|x86 + {36C01EFE-7F22-486B-82C4-07DF02101B1A}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-project.sdf b/fdmdv2/variants/fdmdv2dll/fdmdv2-project.sdf new file mode 100644 index 00000000..0057a1c9 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/fdmdv2-project.sdf differ diff --git a/fdmdv2/variants/fdmdv2dll/fdmdv2-project.vcxproj b/fdmdv2/variants/fdmdv2dll/fdmdv2-project.vcxproj new file mode 100644 index 00000000..76e18b34 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/fdmdv2-project.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {25ED31A8-B64D-47A6-A8EA-9B6E3BCDD541} + Win32Proj + win32project + fdmdv2-dll + + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + + + + + + + + + + + true + + + false + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;WIN32PROJECT_EXPORTS;%(PreprocessorDefinitions) + 4244;%(DisableSpecificWarnings) + + + Windows + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;WIN32PROJECT_EXPORTS;%(PreprocessorDefinitions) + ..\..\codec2-dev\src + 4305;4244;%(DisableSpecificWarnings) + false + Sync + + + Windows + true + true + true + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/resource.h b/fdmdv2/variants/fdmdv2dll/resource.h new file mode 100644 index 00000000..013e3a41 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/resource.h @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by fdmdv2-dll.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/fdmdv2/variants/fdmdv2dll/stdafx.cpp b/fdmdv2/variants/fdmdv2dll/stdafx.cpp new file mode 100644 index 00000000..c47a01c2 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : source file that includes just the standard includes +// win32-project.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/fdmdv2/variants/fdmdv2dll/stdafx.h b/fdmdv2/variants/fdmdv2dll/stdafx.h new file mode 100644 index 00000000..3ad2c6d1 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/stdafx.h @@ -0,0 +1,16 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +#include "targetver.h" + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files: +#include + +static inline double round(double val); + +// TODO: reference additional headers your program requires here diff --git a/fdmdv2/variants/fdmdv2dll/targetver.h b/fdmdv2/variants/fdmdv2dll/targetver.h new file mode 100644 index 00000000..90e767bf --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/App.config b/fdmdv2/variants/fdmdv2dll/vbTest/App.config new file mode 100644 index 00000000..b93bf408 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/Form1.Designer.vb b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.Designer.vb new file mode 100644 index 00000000..dc510d07 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.Designer.vb @@ -0,0 +1,125 @@ + _ +'Declare Sub fdmdv2-dll Lib "\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\Release\fdmdv2-dll.dll" (ByVal Client As String, ByVal Dll As String) +Partial Class Form1 + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() +Me.TextBox1 = New System.Windows.Forms.TextBox() +Me.GroupBox1 = New System.Windows.Forms.GroupBox() +Me.Button1 = New System.Windows.Forms.Button() +Me.Button2 = New System.Windows.Forms.Button() +Me.Button3 = New System.Windows.Forms.Button() +Me.Button4 = New System.Windows.Forms.Button() +Me.Button5 = New System.Windows.Forms.Button() +Me.GroupBox1.SuspendLayout() +Me.SuspendLayout() +' +'TextBox1 +' +Me.TextBox1.Location = New System.Drawing.Point(183, 2) +Me.TextBox1.Multiline = True +Me.TextBox1.Name = "TextBox1" +Me.TextBox1.Size = New System.Drawing.Size(384, 395) +Me.TextBox1.TabIndex = 0 +' +'GroupBox1 +' +Me.GroupBox1.Controls.Add(Me.Button4) +Me.GroupBox1.Controls.Add(Me.Button3) +Me.GroupBox1.Controls.Add(Me.Button2) +Me.GroupBox1.Controls.Add(Me.Button1) +Me.GroupBox1.Location = New System.Drawing.Point(10, 10) +Me.GroupBox1.Name = "GroupBox1" +Me.GroupBox1.Size = New System.Drawing.Size(167, 337) +Me.GroupBox1.TabIndex = 1 +Me.GroupBox1.TabStop = False +Me.GroupBox1.Text = "Test FDMDV2" +' +'Button1 +' +Me.Button1.Location = New System.Drawing.Point(17, 31) +Me.Button1.Name = "Button1" +Me.Button1.Size = New System.Drawing.Size(135, 24) +Me.Button1.TabIndex = 0 +Me.Button1.Text = "Load" +Me.Button1.UseVisualStyleBackColor = True +' +'Button2 +' +Me.Button2.Location = New System.Drawing.Point(17, 61) +Me.Button2.Name = "Button2" +Me.Button2.Size = New System.Drawing.Size(135, 27) +Me.Button2.TabIndex = 1 +Me.Button2.Text = "Start" +Me.Button2.UseVisualStyleBackColor = True +' +'Button3 +' +Me.Button3.Location = New System.Drawing.Point(17, 94) +Me.Button3.Name = "Button3" +Me.Button3.Size = New System.Drawing.Size(135, 24) +Me.Button3.TabIndex = 2 +Me.Button3.Text = "Stop" +Me.Button3.UseVisualStyleBackColor = True +' +'Button4 +' +Me.Button4.Location = New System.Drawing.Point(17, 124) +Me.Button4.Name = "Button4" +Me.Button4.Size = New System.Drawing.Size(135, 24) +Me.Button4.TabIndex = 3 +Me.Button4.Text = "Unload" +Me.Button4.UseVisualStyleBackColor = True +' +'Button5 +' +Me.Button5.Location = New System.Drawing.Point(27, 356) +Me.Button5.Name = "Button5" +Me.Button5.Size = New System.Drawing.Size(135, 24) +Me.Button5.TabIndex = 2 +Me.Button5.Text = "Quit" +Me.Button5.UseVisualStyleBackColor = True +' +'Form1 +' +Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!) +Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font +Me.ClientSize = New System.Drawing.Size(568, 392) +Me.Controls.Add(Me.Button5) +Me.Controls.Add(Me.GroupBox1) +Me.Controls.Add(Me.TextBox1) +Me.Name = "Form1" +Me.Text = "Test FDMDV2.dll" +Me.GroupBox1.ResumeLayout(False) +Me.ResumeLayout(False) +Me.PerformLayout() + +End Sub + Friend WithEvents TextBox1 As System.Windows.Forms.TextBox + Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox + Friend WithEvents Button4 As System.Windows.Forms.Button + Friend WithEvents Button3 As System.Windows.Forms.Button + Friend WithEvents Button2 As System.Windows.Forms.Button + Friend WithEvents Button1 As System.Windows.Forms.Button + Friend WithEvents Button5 As System.Windows.Forms.Button + +End Class diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/Form1.resx b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.resx new file mode 100644 index 00000000..5ea0895e --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/Form1.vb b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.vb new file mode 100644 index 00000000..c07edc44 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/Form1.vb @@ -0,0 +1,3 @@ +Public Class Form1 + +End Class diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.Designer.vb b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.Designer.vb new file mode 100644 index 00000000..da97349a --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.Designer.vb @@ -0,0 +1,38 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.269 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + 'NOTE: This file is auto-generated; do not modify it directly. To make changes, + ' or if you encounter build errors in this file, go to the Project Designer + ' (go to Project Properties or double-click the My Project node in + ' Solution Explorer), and make changes on the Application tab. + ' + Partial Friend Class MyApplication + + _ + Public Sub New() + MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) + Me.IsSingleInstance = false + Me.EnableVisualStyles = true + Me.SaveMySettingsOnExit = true + Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses + End Sub + + _ + Protected Overrides Sub OnCreateMainForm() + Me.MainForm = Global.vbTest.Form1 + End Sub + End Class +End Namespace diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.myapp b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.myapp new file mode 100644 index 00000000..7b0c597d --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Application.myapp @@ -0,0 +1,11 @@ + + + true + Form1 + false + 0 + true + 0 + 0 + true + diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/AssemblyInfo.vb b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/AssemblyInfo.vb new file mode 100644 index 00000000..c8fcf7d9 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.Designer.vb b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.Designer.vb new file mode 100644 index 00000000..32308cbe --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.Designer.vb @@ -0,0 +1,62 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.269 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("vbTest.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set(ByVal value As Global.System.Globalization.CultureInfo) + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.resx b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.resx new file mode 100644 index 00000000..ffecec85 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.Designer.vb b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.Designer.vb new file mode 100644 index 00000000..82bd1eb9 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.269 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.vbTest.My.MySettings + Get + Return Global.vbTest.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.settings b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.settings new file mode 100644 index 00000000..377f56d6 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Debug/.gitignore b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Debug/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.exe b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.exe new file mode 100644 index 00000000..aa115821 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.exe differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.pdb b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.pdb new file mode 100644 index 00000000..20d166d1 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.pdb differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe new file mode 100644 index 00000000..58da5217 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe.manifest b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe.manifest new file mode 100644 index 00000000..f96b1d6b --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.xml b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.xml new file mode 100644 index 00000000..38eaa1c7 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/bin/Release/vbTest.xml @@ -0,0 +1,24 @@ + + + + +vbTest + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Debug/.gitignore b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Debug/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 00000000..0699be2a Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.read.1.tlog b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.read.1.tlog new file mode 100644 index 00000000..49b02767 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.read.1.tlog differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.write.1.tlog b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.write.1.tlog new file mode 100644 index 00000000..9793cabe Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/GenerateResource-ResGen.write.1.tlog differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 00000000..7b155551 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Form1.resources b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Form1.resources new file mode 100644 index 00000000..06c24d06 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Form1.resources differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Resources.resources b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Resources.resources new file mode 100644 index 00000000..06c24d06 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.Resources.resources differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.exe b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.exe new file mode 100644 index 00000000..aa115821 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.exe differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.pdb b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.pdb new file mode 100644 index 00000000..20d166d1 Binary files /dev/null and b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.pdb differ diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.vbproj.FileListAbsolute.txt b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.vbproj.FileListAbsolute.txt new file mode 100644 index 00000000..a79bdde5 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.vbproj.FileListAbsolute.txt @@ -0,0 +1,11 @@ +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\bin\Release\vbTest.exe +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\bin\Release\vbTest.pdb +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\bin\Release\vbTest.xml +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\ResolveAssemblyReference.cache +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\vbTest.Form1.resources +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\vbTest.Resources.resources +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\GenerateResource-ResGen.read.1.tlog +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\GenerateResource-ResGen.write.1.tlog +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\vbTest.exe +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\vbTest.xml +C:\Users\wittend\Projects\Radio\fdmdv2\fdmdv2dll\vbTest\obj\x86\Release\vbTest.pdb diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.xml b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.xml new file mode 100644 index 00000000..38eaa1c7 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/obj/x86/Release/vbTest.xml @@ -0,0 +1,24 @@ + + + + +vbTest + + + + + + Returns the cached ResourceManager instance used by this class. + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + \ No newline at end of file diff --git a/fdmdv2/variants/fdmdv2dll/vbTest/vbTest.vbproj b/fdmdv2/variants/fdmdv2dll/vbTest/vbTest.vbproj new file mode 100644 index 00000000..f8e31f05 --- /dev/null +++ b/fdmdv2/variants/fdmdv2dll/vbTest/vbTest.vbproj @@ -0,0 +1,128 @@ + + + + Debug + x86 + + + 2.0 + {36C01EFE-7F22-486B-82C4-07DF02101B1A} + WinExe + vbTest.My.MyApplication + vbTest + vbTest + 512 + WindowsForms + v3.0 + + + x86 + true + full + true + true + bin\Debug\ + vbTest.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + x86 + pdbonly + false + true + true + bin\Release\ + vbTest.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + acrobat70.ico + + + + + + + + + + + + + + + + + + + + + + Form + + + Form1.vb + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + Form1.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + + \ No newline at end of file