Initial Commit
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
[auto_generated]
|
||||
boost/numeric/odeint/external/mpi/mpi_vector_state.hpp
|
||||
|
||||
[begin_description]
|
||||
Copying a container from/to an mpi_state splits/joins it.
|
||||
[end_description]
|
||||
|
||||
Copyright 2013 Karsten Ahnert
|
||||
Copyright 2013 Mario Mulansky
|
||||
Copyright 2013 Pascal Germroth
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(See accompanying file LICENSE_1_0.txt or
|
||||
copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
|
||||
|
||||
#ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_VECTOR_STATE_HPP_INCLUDED
|
||||
#define BOOST_NUMERIC_ODEINT_EXTERNAL_MPI_MPI_VECTOR_STATE_HPP_INCLUDED
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <boost/mpi.hpp>
|
||||
#include <boost/numeric/odeint/util/copy.hpp>
|
||||
#include <boost/numeric/odeint/util/split_adaptor.hpp>
|
||||
#include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
|
||||
#include <boost/numeric/odeint/external/mpi/mpi_state.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace numeric {
|
||||
namespace odeint {
|
||||
|
||||
|
||||
/** \brief Split data from some container on node 0 to the slaves.
|
||||
* Source must be a model of Random Access Range. */
|
||||
template< class Source , class InnerState >
|
||||
struct split_impl< Source, mpi_state< InnerState >,
|
||||
typename boost::enable_if< boost::has_range_const_iterator<Source> >::type >
|
||||
{
|
||||
typedef typename boost::range_iterator<const Source>::type iterator;
|
||||
|
||||
static void split( const Source &from, mpi_state< InnerState > &to )
|
||||
{
|
||||
std::vector< InnerState > pieces;
|
||||
if(to.world.rank() == 0) {
|
||||
const size_t num = static_cast<size_t>(to.world.size());
|
||||
pieces.resize(num);
|
||||
for(size_t i = 0 ; i < num ; i++) {
|
||||
iterator_range<iterator> part = detail::make_split_range(from, i, num);
|
||||
boost::numeric::odeint::resize(pieces[i], part);
|
||||
boost::numeric::odeint::copy(part, pieces[i]);
|
||||
}
|
||||
}
|
||||
// send to nodes
|
||||
boost::mpi::scatter(to.world, pieces, to(), 0);
|
||||
}
|
||||
};
|
||||
|
||||
/** \brief Merge data from an mpi_state to some container on node 0.
|
||||
* Target must be a model Single Pass Range. */
|
||||
template< class Target, class InnerState >
|
||||
struct unsplit_impl< mpi_state< InnerState >, Target,
|
||||
typename boost::enable_if< boost::has_range_iterator<Target> >::type >
|
||||
{
|
||||
typedef typename boost::range_iterator<Target>::type iterator;
|
||||
|
||||
static void unsplit( const mpi_state< InnerState > &from , Target &to )
|
||||
{
|
||||
std::vector< InnerState > pieces;
|
||||
// send data to root
|
||||
boost::mpi::gather(from.world, from(), pieces, 0);
|
||||
if(from.world.rank() == 0) {
|
||||
// check target size
|
||||
size_t total_size = 0;
|
||||
for(size_t i = 0 ; i < pieces.size() ; i++)
|
||||
total_size += boost::size(pieces[i]);
|
||||
BOOST_ASSERT( total_size <= boost::size(to) );
|
||||
// copy parts
|
||||
iterator out = boost::begin(to);
|
||||
for(size_t i = 0 ; i < pieces.size() ; i++)
|
||||
out = boost::copy(pieces[i], out);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,291 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright David Abrahams 2002, Joel de Guzman, 2002.
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
#if !defined(BOOST_PP_IS_ITERATING)
|
||||
|
||||
#ifndef DEFAULTS_DEF_JDG20020811_HPP
|
||||
#define DEFAULTS_DEF_JDG20020811_HPP
|
||||
|
||||
#include <boost/python/detail/defaults_gen.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/mpl/front.hpp>
|
||||
#include <boost/mpl/size.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/preprocessor/iterate.hpp>
|
||||
#include <boost/python/class_fwd.hpp>
|
||||
#include <boost/python/scope.hpp>
|
||||
#include <boost/preprocessor/debug/line.hpp>
|
||||
#include <boost/python/detail/scope.hpp>
|
||||
#include <boost/python/detail/make_keyword_range_fn.hpp>
|
||||
#include <boost/python/object/add_to_namespace.hpp>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
namespace boost { namespace python {
|
||||
|
||||
struct module;
|
||||
|
||||
namespace objects
|
||||
{
|
||||
struct class_base;
|
||||
}
|
||||
|
||||
namespace detail
|
||||
{
|
||||
// Called as::
|
||||
//
|
||||
// name_space_def(ns, "func", func, kw, policies, docstring, &ns)
|
||||
//
|
||||
// Dispatch to properly add f to namespace ns.
|
||||
//
|
||||
// @group define_stub_function helpers {
|
||||
template <class Func, class CallPolicies, class NameSpaceT>
|
||||
static void name_space_def(
|
||||
NameSpaceT& name_space
|
||||
, char const* name
|
||||
, Func f
|
||||
, keyword_range const& kw
|
||||
, CallPolicies const& policies
|
||||
, char const* doc
|
||||
, objects::class_base*
|
||||
)
|
||||
{
|
||||
typedef typename NameSpaceT::wrapped_type wrapped_type;
|
||||
|
||||
objects::add_to_namespace(
|
||||
name_space, name,
|
||||
detail::make_keyword_range_function(
|
||||
f, policies, kw, get_signature(f, (wrapped_type*)0))
|
||||
, doc
|
||||
);
|
||||
}
|
||||
|
||||
template <class Func, class CallPolicies>
|
||||
static void name_space_def(
|
||||
object& name_space
|
||||
, char const* name
|
||||
, Func f
|
||||
, keyword_range const& kw
|
||||
, CallPolicies const& policies
|
||||
, char const* doc
|
||||
, ...
|
||||
)
|
||||
{
|
||||
scope within(name_space);
|
||||
|
||||
detail::scope_setattr_doc(
|
||||
name
|
||||
, detail::make_keyword_range_function(f, policies, kw)
|
||||
, doc);
|
||||
}
|
||||
|
||||
// For backward compatibility -- is this obsolete?
|
||||
template <class Func, class CallPolicies, class NameSpaceT>
|
||||
static void name_space_def(
|
||||
NameSpaceT& name_space
|
||||
, char const* name
|
||||
, Func f
|
||||
, keyword_range const& kw // ignored
|
||||
, CallPolicies const& policies
|
||||
, char const* doc
|
||||
, module*
|
||||
)
|
||||
{
|
||||
name_space.def(name, f, policies, doc);
|
||||
}
|
||||
// }
|
||||
|
||||
|
||||
// Expansions of ::
|
||||
//
|
||||
// template <typename OverloadsT, typename NameSpaceT>
|
||||
// inline void
|
||||
// define_stub_function(
|
||||
// char const* name, OverloadsT s, NameSpaceT& name_space, mpl::int_<N>)
|
||||
// {
|
||||
// name_space.def(name, &OverloadsT::func_N);
|
||||
// }
|
||||
//
|
||||
// where N runs from 0 to BOOST_PYTHON_MAX_ARITY.
|
||||
//
|
||||
// The set of overloaded functions (define_stub_function) expects:
|
||||
//
|
||||
// 1. char const* name: function name that will be visible to python
|
||||
// 2. OverloadsT: a function overloads struct (see defaults_gen.hpp)
|
||||
// 3. NameSpaceT& name_space: a python::class_ or python::module instance
|
||||
// 4. int_t<N>: the Nth overloaded function (OverloadsT::func_N)
|
||||
// (see defaults_gen.hpp)
|
||||
// 5. char const* name: doc string
|
||||
//
|
||||
// @group define_stub_function<N> {
|
||||
template <int N>
|
||||
struct define_stub_function {};
|
||||
|
||||
#define BOOST_PP_ITERATION_PARAMS_1 \
|
||||
(3, (0, BOOST_PYTHON_MAX_ARITY, <boost/python/detail/defaults_def.hpp>))
|
||||
|
||||
#include BOOST_PP_ITERATE()
|
||||
|
||||
// }
|
||||
|
||||
// This helper template struct does the actual recursive
|
||||
// definition. There's a generic version
|
||||
// define_with_defaults_helper<N> and a terminal case
|
||||
// define_with_defaults_helper<0>. The struct and its
|
||||
// specialization has a sole static member function def that
|
||||
// expects:
|
||||
//
|
||||
// 1. char const* name: function name that will be
|
||||
// visible to python
|
||||
//
|
||||
// 2. OverloadsT: a function overloads struct
|
||||
// (see defaults_gen.hpp)
|
||||
//
|
||||
// 3. NameSpaceT& name_space: a python::class_ or
|
||||
// python::module instance
|
||||
//
|
||||
// 4. char const* name: doc string
|
||||
//
|
||||
// The def static member function calls a corresponding
|
||||
// define_stub_function<N>. The general case recursively calls
|
||||
// define_with_defaults_helper<N-1>::def until it reaches the
|
||||
// terminal case case define_with_defaults_helper<0>.
|
||||
template <int N>
|
||||
struct define_with_defaults_helper {
|
||||
|
||||
template <class StubsT, class CallPolicies, class NameSpaceT>
|
||||
static void
|
||||
def(
|
||||
char const* name,
|
||||
StubsT stubs,
|
||||
keyword_range kw,
|
||||
CallPolicies const& policies,
|
||||
NameSpaceT& name_space,
|
||||
char const* doc)
|
||||
{
|
||||
// define the NTH stub function of stubs
|
||||
define_stub_function<N>::define(name, stubs, kw, policies, name_space, doc);
|
||||
|
||||
if (kw.second > kw.first)
|
||||
--kw.second;
|
||||
|
||||
// call the next define_with_defaults_helper
|
||||
define_with_defaults_helper<N-1>::def(name, stubs, kw, policies, name_space, doc);
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct define_with_defaults_helper<0> {
|
||||
|
||||
template <class StubsT, class CallPolicies, class NameSpaceT>
|
||||
static void
|
||||
def(
|
||||
char const* name,
|
||||
StubsT stubs,
|
||||
keyword_range const& kw,
|
||||
CallPolicies const& policies,
|
||||
NameSpaceT& name_space,
|
||||
char const* doc)
|
||||
{
|
||||
// define the Oth stub function of stubs
|
||||
define_stub_function<0>::define(name, stubs, kw, policies, name_space, doc);
|
||||
// return
|
||||
}
|
||||
};
|
||||
|
||||
// define_with_defaults
|
||||
//
|
||||
// 1. char const* name: function name that will be
|
||||
// visible to python
|
||||
//
|
||||
// 2. OverloadsT: a function overloads struct
|
||||
// (see defaults_gen.hpp)
|
||||
//
|
||||
// 3. CallPolicies& policies: Call policies
|
||||
// 4. NameSpaceT& name_space: a python::class_ or
|
||||
// python::module instance
|
||||
//
|
||||
// 5. SigT sig: Function signature typelist
|
||||
// (see defaults_gen.hpp)
|
||||
//
|
||||
// 6. char const* name: doc string
|
||||
//
|
||||
// This is the main entry point. This function recursively
|
||||
// defines all stub functions of StubT (see defaults_gen.hpp) in
|
||||
// NameSpaceT name_space which can be either a python::class_ or
|
||||
// a python::module. The sig argument is a typelist that
|
||||
// specifies the return type, the class (for member functions,
|
||||
// and the arguments. Here are some SigT examples:
|
||||
//
|
||||
// int foo(int) mpl::vector<int, int>
|
||||
// void bar(int, int) mpl::vector<void, int, int>
|
||||
// void C::foo(int) mpl::vector<void, C, int>
|
||||
//
|
||||
template <class OverloadsT, class NameSpaceT, class SigT>
|
||||
inline void
|
||||
define_with_defaults(
|
||||
char const* name,
|
||||
OverloadsT const& overloads,
|
||||
NameSpaceT& name_space,
|
||||
SigT const&)
|
||||
{
|
||||
typedef typename mpl::front<SigT>::type return_type;
|
||||
typedef typename OverloadsT::void_return_type void_return_type;
|
||||
typedef typename OverloadsT::non_void_return_type non_void_return_type;
|
||||
|
||||
typedef typename mpl::if_c<
|
||||
boost::is_same<void, return_type>::value
|
||||
, void_return_type
|
||||
, non_void_return_type
|
||||
>::type stubs_type;
|
||||
|
||||
BOOST_STATIC_ASSERT(
|
||||
(stubs_type::max_args) <= mpl::size<SigT>::value);
|
||||
|
||||
typedef typename stubs_type::template gen<SigT> gen_type;
|
||||
define_with_defaults_helper<stubs_type::n_funcs-1>::def(
|
||||
name
|
||||
, gen_type()
|
||||
, overloads.keywords()
|
||||
, overloads.call_policies()
|
||||
, name_space
|
||||
, overloads.doc_string());
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
}} // namespace boost::python
|
||||
|
||||
#endif // DEFAULTS_DEF_JDG20020811_HPP
|
||||
|
||||
#else // defined(BOOST_PP_IS_ITERATING)
|
||||
// PP vertical iteration code
|
||||
|
||||
|
||||
template <>
|
||||
struct define_stub_function<BOOST_PP_ITERATION()> {
|
||||
template <class StubsT, class CallPolicies, class NameSpaceT>
|
||||
static void define(
|
||||
char const* name
|
||||
, StubsT const&
|
||||
, keyword_range const& kw
|
||||
, CallPolicies const& policies
|
||||
, NameSpaceT& name_space
|
||||
, char const* doc)
|
||||
{
|
||||
detail::name_space_def(
|
||||
name_space
|
||||
, name
|
||||
, &StubsT::BOOST_PP_CAT(func_, BOOST_PP_ITERATION())
|
||||
, kw
|
||||
, policies
|
||||
, doc
|
||||
, &name_space);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // !defined(BOOST_PP_IS_ITERATING)
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
#ifndef BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
|
||||
#define BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2003-2004
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#include <boost/mpl/aux_/static_cast.hpp>
|
||||
#include <boost/mpl/aux_/config/msvc.hpp>
|
||||
#include <boost/mpl/aux_/config/workaround.hpp>
|
||||
|
||||
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
|
||||
|| ( BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \
|
||||
&& !(defined(__STD_STRICT_ANSI) \
|
||||
|| defined(__STD_STRICT_ANSI_ERRORS)) )
|
||||
|
||||
# define BOOST_MPL_AUX_PTR_TO_REF(X) \
|
||||
*BOOST_MPL_AUX_STATIC_CAST(X*, 0) \
|
||||
/**/
|
||||
|
||||
#else
|
||||
|
||||
# define BOOST_MPL_AUX_PTR_TO_REF(X) \
|
||||
aux::ptr_to_ref(BOOST_MPL_AUX_STATIC_CAST(X*, 0)) \
|
||||
/**/
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
namespace boost { namespace mpl { namespace aux {
|
||||
|
||||
template< typename T > static T const& ptr_to_ref(T*);
|
||||
|
||||
}}}
|
||||
|
||||
#endif // BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED
|
||||
@@ -0,0 +1,26 @@
|
||||
#include "config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "tstrig.h"
|
||||
|
||||
int set_conf(RIG *my_rig, char *conf_parms);
|
||||
|
||||
int rig_control(rig_model_t my_model, int verbose);
|
||||
|
||||
int main (int argc, char *argv[])
|
||||
{
|
||||
rig_model_t my_model = RIG_MODEL_DUMMY;
|
||||
int verbose=0;
|
||||
|
||||
my_model=214;
|
||||
rig_control(my_model,verbose);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
gcc -c -Wall -I../include rig_control.c
|
||||
gcc -c -Wall -I../include tstrig.c
|
||||
gcc -o tstrig.exe -Wl,--enable-auto-import tstrig.o rig_control.o libhamlib.dll.a
|
||||
strip tstrig.exe
|
||||
*/
|
||||
@@ -0,0 +1,34 @@
|
||||
|
||||
#ifndef BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
|
||||
#define BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2003-2004
|
||||
// Copyright David Abrahams 2003-2004
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#include <boost/mpl/key_type_fwd.hpp>
|
||||
#include <boost/mpl/set/aux_/tag.hpp>
|
||||
|
||||
namespace boost { namespace mpl {
|
||||
|
||||
template<>
|
||||
struct key_type_impl< aux::set_tag >
|
||||
{
|
||||
template< typename Set, typename T > struct apply
|
||||
{
|
||||
typedef T type;
|
||||
};
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif // BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED
|
||||
@@ -0,0 +1,169 @@
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2000-2004
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
// Preprocessed version of "boost/mpl/apply.hpp" header
|
||||
// -- DO NOT modify by hand!
|
||||
|
||||
namespace boost { namespace mpl {
|
||||
|
||||
template<
|
||||
typename F
|
||||
>
|
||||
struct apply0
|
||||
|
||||
: apply_wrap0<
|
||||
typename lambda<F>::type
|
||||
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
1
|
||||
, apply0
|
||||
, (F )
|
||||
)
|
||||
};
|
||||
|
||||
template<
|
||||
typename F
|
||||
>
|
||||
struct apply< F,na,na,na,na,na >
|
||||
: apply0<F>
|
||||
{
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1
|
||||
>
|
||||
struct apply1
|
||||
|
||||
: apply_wrap1<
|
||||
typename lambda<F>::type
|
||||
, T1
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
2
|
||||
, apply1
|
||||
, (F, T1)
|
||||
)
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1
|
||||
>
|
||||
struct apply< F,T1,na,na,na,na >
|
||||
: apply1< F,T1 >
|
||||
{
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2
|
||||
>
|
||||
struct apply2
|
||||
|
||||
: apply_wrap2<
|
||||
typename lambda<F>::type
|
||||
, T1, T2
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
3
|
||||
, apply2
|
||||
, (F, T1, T2)
|
||||
)
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2
|
||||
>
|
||||
struct apply< F,T1,T2,na,na,na >
|
||||
: apply2< F,T1,T2 >
|
||||
{
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3
|
||||
>
|
||||
struct apply3
|
||||
|
||||
: apply_wrap3<
|
||||
typename lambda<F>::type
|
||||
, T1, T2, T3
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
4
|
||||
, apply3
|
||||
, (F, T1, T2, T3)
|
||||
)
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3
|
||||
>
|
||||
struct apply< F,T1,T2,T3,na,na >
|
||||
: apply3< F,T1,T2,T3 >
|
||||
{
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3, typename T4
|
||||
>
|
||||
struct apply4
|
||||
|
||||
: apply_wrap4<
|
||||
typename lambda<F>::type
|
||||
, T1, T2, T3, T4
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
5
|
||||
, apply4
|
||||
, (F, T1, T2, T3, T4)
|
||||
)
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3, typename T4
|
||||
>
|
||||
struct apply< F,T1,T2,T3,T4,na >
|
||||
: apply4< F,T1,T2,T3,T4 >
|
||||
{
|
||||
};
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3, typename T4
|
||||
, typename T5
|
||||
>
|
||||
struct apply5
|
||||
|
||||
: apply_wrap5<
|
||||
typename lambda<F>::type
|
||||
, T1, T2, T3, T4, T5
|
||||
>
|
||||
{
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(
|
||||
6
|
||||
, apply5
|
||||
, (F, T1, T2, T3, T4, T5)
|
||||
)
|
||||
};
|
||||
|
||||
/// primary template (not a specialization!)
|
||||
|
||||
template<
|
||||
typename F, typename T1, typename T2, typename T3, typename T4
|
||||
, typename T5
|
||||
>
|
||||
struct apply
|
||||
: apply5< F,T1,T2,T3,T4,T5 >
|
||||
{
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2003 Jonathan de Halleux (dehalleux@pelikhan.com)
|
||||
http://spirit.sourceforge.net/
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
=============================================================================*/
|
||||
#ifndef BOOST_SPIRIT_ACTOR_CLEAR_ACTOR_HPP
|
||||
#define BOOST_SPIRIT_ACTOR_CLEAR_ACTOR_HPP
|
||||
|
||||
#include <boost/spirit/home/classic/namespace.hpp>
|
||||
#include <boost/spirit/home/classic/actor/ref_actor.hpp>
|
||||
|
||||
namespace boost { namespace spirit {
|
||||
|
||||
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// Summary:
|
||||
// A semantic action policy that calls clear method.
|
||||
// (This doc uses convention available in actors.hpp)
|
||||
//
|
||||
// Actions (what it does):
|
||||
// ref.clear();
|
||||
//
|
||||
// Policy name:
|
||||
// clear_action
|
||||
//
|
||||
// Policy holder, corresponding helper method:
|
||||
// ref_actor, clear_a( ref );
|
||||
//
|
||||
// () operators: both.
|
||||
//
|
||||
// See also ref_actor for more details.
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
struct clear_action
|
||||
{
|
||||
template<
|
||||
typename T
|
||||
>
|
||||
void act(T& ref_) const
|
||||
{
|
||||
ref_.clear();
|
||||
}
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// helper method that creates a and_assign_actor.
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
template<typename T>
|
||||
inline ref_actor<T,clear_action> clear_a(T& ref_)
|
||||
{
|
||||
return ref_actor<T,clear_action>(ref_);
|
||||
}
|
||||
|
||||
BOOST_SPIRIT_CLASSIC_NAMESPACE_END
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# /* **************************************************************************
|
||||
# * *
|
||||
# * (C) Copyright Paul Mensonides 2011. *
|
||||
# * Distributed under the Boost Software License, Version 1.0. (See *
|
||||
# * accompanying file LICENSE_1_0.txt or copy at *
|
||||
# * http://www.boost.org/LICENSE_1_0.txt) *
|
||||
# * *
|
||||
# ************************************************************************** */
|
||||
#
|
||||
# /* See http://www.boost.org for most recent version. */
|
||||
#
|
||||
# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP
|
||||
# define BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP
|
||||
#
|
||||
# include <boost/preprocessor/cat.hpp>
|
||||
# include <boost/preprocessor/config/config.hpp>
|
||||
# include <boost/preprocessor/tuple/eat.hpp>
|
||||
# include <boost/preprocessor/tuple/rem.hpp>
|
||||
# include <boost/preprocessor/variadic/detail/is_single_return.hpp>
|
||||
#
|
||||
# /* BOOST_PP_SEQ_BINARY_TRANSFORM */
|
||||
#
|
||||
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_I(, seq)
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_I(p, seq) BOOST_PP_SEQ_BINARY_TRANSFORM_II(p ## seq)
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_II(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq)
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
|
||||
# else
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
|
||||
# endif
|
||||
# if BOOST_PP_VARIADICS
|
||||
# if BOOST_PP_VARIADICS_MSVC
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(...) \
|
||||
BOOST_PP_VARIADIC_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,__VA_ARGS__) \
|
||||
/**/
|
||||
# else
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(...) BOOST_PP_REM
|
||||
# endif
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(__VA_ARGS__), __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(__VA_ARGS__), __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
|
||||
# else
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_B(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
|
||||
# endif
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_A0 (BOOST_PP_EAT, ?)
|
||||
# define BOOST_PP_SEQ_BINARY_TRANSFORM_B0 (BOOST_PP_EAT, ?)
|
||||
#
|
||||
# endif
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,48 @@
|
||||
#ifndef GREGORIAN_GREGORIAN_CALENDAR_HPP__
|
||||
#define GREGORIAN_GREGORIAN_CALENDAR_HPP__
|
||||
|
||||
/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
|
||||
* Use, modification and distribution is subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying
|
||||
* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
|
||||
* Author: Jeff Garland
|
||||
* $Date$
|
||||
*/
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/date_time/gregorian/greg_weekday.hpp>
|
||||
#include <boost/date_time/gregorian/greg_day_of_year.hpp>
|
||||
#include <boost/date_time/gregorian_calendar.hpp>
|
||||
#include <boost/date_time/gregorian/greg_ymd.hpp>
|
||||
#include <boost/date_time/int_adapter.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace gregorian {
|
||||
|
||||
//!An internal date representation that includes infinities, not a date
|
||||
typedef date_time::int_adapter<uint32_t> fancy_date_rep;
|
||||
|
||||
//! Gregorian calendar for this implementation, hard work in the base
|
||||
class gregorian_calendar :
|
||||
public date_time::gregorian_calendar_base<greg_year_month_day, fancy_date_rep::int_type> {
|
||||
public:
|
||||
//! Type to hold a weekday (eg: Sunday, Monday,...)
|
||||
typedef greg_weekday day_of_week_type;
|
||||
//! Counter type from 1 to 366 for gregorian dates.
|
||||
typedef greg_day_of_year_rep day_of_year_type;
|
||||
//! Internal date representation that handles infinity, not a date
|
||||
typedef fancy_date_rep date_rep_type;
|
||||
//! Date rep implements the traits stuff as well
|
||||
typedef fancy_date_rep date_traits_type;
|
||||
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
} } //namespace gregorian
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
/* Initialize a RS codec
|
||||
*
|
||||
* Copyright 2002 Phil Karn, KA9Q
|
||||
* May be used under the terms of the GNU General Public License (GPL)
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef CCSDS
|
||||
#include "ccsds.h"
|
||||
#elif defined(BIGSYM)
|
||||
#include "int.h"
|
||||
#else
|
||||
#include "char.h"
|
||||
#endif
|
||||
|
||||
void FREE_RS(void *p){
|
||||
struct rs *rs = (struct rs *)p;
|
||||
|
||||
free(rs->alpha_to);
|
||||
free(rs->index_of);
|
||||
free(rs->genpoly);
|
||||
free(rs);
|
||||
}
|
||||
|
||||
/* Initialize a Reed-Solomon codec
|
||||
* symsize = symbol size, bits (1-8)
|
||||
* gfpoly = Field generator polynomial coefficients
|
||||
* fcr = first root of RS code generator polynomial, index form
|
||||
* prim = primitive element to generate polynomial roots
|
||||
* nroots = RS code generator polynomial degree (number of roots)
|
||||
*/
|
||||
void *INIT_RS(unsigned int symsize,unsigned int gfpoly,unsigned fcr,unsigned prim,
|
||||
unsigned int nroots){
|
||||
struct rs *rs;
|
||||
int i, j, sr,root,iprim;
|
||||
|
||||
if(symsize > 8*sizeof(DTYPE))
|
||||
return NULL; /* Need version with ints rather than chars */
|
||||
|
||||
if(fcr >= (1<<symsize))
|
||||
return NULL;
|
||||
if(prim == 0 || prim >= (1<<symsize))
|
||||
return NULL;
|
||||
if(nroots >= (1<<symsize))
|
||||
return NULL; /* Can't have more roots than symbol values! */
|
||||
|
||||
rs = (struct rs *)calloc(1,sizeof(struct rs));
|
||||
rs->mm = symsize;
|
||||
rs->nn = (1<<symsize)-1;
|
||||
|
||||
rs->alpha_to = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1));
|
||||
if(rs->alpha_to == NULL){
|
||||
free(rs);
|
||||
return NULL;
|
||||
}
|
||||
rs->index_of = (DTYPE *)malloc(sizeof(DTYPE)*(rs->nn+1));
|
||||
if(rs->index_of == NULL){
|
||||
free(rs->alpha_to);
|
||||
free(rs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Generate Galois field lookup tables */
|
||||
rs->index_of[0] = A0; /* log(zero) = -inf */
|
||||
rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */
|
||||
sr = 1;
|
||||
for(i=0;i<rs->nn;i++){
|
||||
rs->index_of[sr] = i;
|
||||
rs->alpha_to[i] = sr;
|
||||
sr <<= 1;
|
||||
if(sr & (1<<symsize))
|
||||
sr ^= gfpoly;
|
||||
sr &= rs->nn;
|
||||
}
|
||||
if(sr != 1){
|
||||
/* field generator polynomial is not primitive! */
|
||||
free(rs->alpha_to);
|
||||
free(rs->index_of);
|
||||
free(rs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Form RS code generator polynomial from its roots */
|
||||
rs->genpoly = (DTYPE *)malloc(sizeof(DTYPE)*(nroots+1));
|
||||
if(rs->genpoly == NULL){
|
||||
free(rs->alpha_to);
|
||||
free(rs->index_of);
|
||||
free(rs);
|
||||
return NULL;
|
||||
}
|
||||
rs->fcr = fcr;
|
||||
rs->prim = prim;
|
||||
rs->nroots = nroots;
|
||||
|
||||
/* Find prim-th root of 1, used in decoding */
|
||||
for(iprim=1;(iprim % prim) != 0;iprim += rs->nn)
|
||||
;
|
||||
rs->iprim = iprim / prim;
|
||||
|
||||
rs->genpoly[0] = 1;
|
||||
for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) {
|
||||
rs->genpoly[i+1] = 1;
|
||||
|
||||
/* Multiply rs->genpoly[] by @**(root + x) */
|
||||
for (j = i; j > 0; j--){
|
||||
if (rs->genpoly[j] != 0)
|
||||
rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)];
|
||||
else
|
||||
rs->genpoly[j] = rs->genpoly[j-1];
|
||||
}
|
||||
/* rs->genpoly[0] can never be zero */
|
||||
rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)];
|
||||
}
|
||||
/* convert rs->genpoly[] to index form for quicker encoding */
|
||||
for (i = 0; i <= nroots; i++)
|
||||
rs->genpoly[i] = rs->index_of[rs->genpoly[i]];
|
||||
|
||||
return rs;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
//---------------------------------------------------------------------------//
|
||||
// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0
|
||||
// See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt
|
||||
//
|
||||
// See http://boostorg.github.com/compute for more information.
|
||||
//---------------------------------------------------------------------------//
|
||||
|
||||
#ifndef BOOST_COMPUTE_ALGORITHM_IOTA_HPP
|
||||
#define BOOST_COMPUTE_ALGORITHM_IOTA_HPP
|
||||
|
||||
#include <boost/compute/system.hpp>
|
||||
#include <boost/compute/command_queue.hpp>
|
||||
#include <boost/compute/algorithm/copy.hpp>
|
||||
#include <boost/compute/iterator/counting_iterator.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace compute {
|
||||
|
||||
/// Fills the range [\p first, \p last) with sequential values starting at
|
||||
/// \p value.
|
||||
///
|
||||
/// For example, the following code:
|
||||
/// \snippet test/test_iota.cpp iota
|
||||
///
|
||||
/// Will fill \c vec with the values (\c 0, \c 1, \c 2, \c ...).
|
||||
template<class BufferIterator, class T>
|
||||
inline void iota(BufferIterator first,
|
||||
BufferIterator last,
|
||||
const T &value,
|
||||
command_queue &queue = system::default_queue())
|
||||
{
|
||||
T count = static_cast<T>(detail::iterator_range_size(first, last));
|
||||
|
||||
copy(
|
||||
::boost::compute::make_counting_iterator(value),
|
||||
::boost::compute::make_counting_iterator(value + count),
|
||||
first,
|
||||
queue
|
||||
);
|
||||
}
|
||||
|
||||
} // end compute namespace
|
||||
} // end boost namespace
|
||||
|
||||
#endif // BOOST_COMPUTE_ALGORITHM_IOTA_HPP
|
||||
@@ -0,0 +1,5 @@
|
||||
real function db(x)
|
||||
db=-99.0
|
||||
if(x.gt.1.259e-10) db=10.0*log10(x)
|
||||
return
|
||||
end function db
|
||||
@@ -0,0 +1,791 @@
|
||||
WSJT-X ChangeLog
|
||||
------------------------------------------------------------------
|
||||
|
||||
May 30, 2013: Version 1.0, r3323
|
||||
--------------------------------
|
||||
|
||||
With this release of WSJT-X Version 1.0 we include a few (relatively
|
||||
minor) enhancements in response to user requests, as well as some
|
||||
program polishing and cleanup. Active program development will
|
||||
continue, but new releases will become less frequent.
|
||||
|
||||
1. New option on the Setup menu: "Tx freq locked to Rx freq".
|
||||
|
||||
2. Double-click on a decoded "73" message now sets Tx5, rather than Tx6.
|
||||
|
||||
3. New keyboard shortcuts: Alt+1 through Alt+6 set the next Tx message
|
||||
at the corresponding number.
|
||||
|
||||
4. PTT control via Ham Radio Deluxe has been imnplemented and tested.
|
||||
|
||||
5. "Tool Tips" are now provided for most on-screen controls.
|
||||
|
||||
6. Under Linux and OS X, listings of available audio devices and APIs
|
||||
have been corrected.
|
||||
|
||||
7. Tab order among GUI controls has been cleaned up.
|
||||
|
||||
8. Updates to the WSJT-X User's Guide.
|
||||
|
||||
|
||||
May 22, 2013: v0.99, r3297
|
||||
--------------------------
|
||||
|
||||
1. CAT control via Ham Radio Deluxe is now available. For setup
|
||||
details see item #5 at the top of page 6 of the updated WSJT-X
|
||||
User's Guide.
|
||||
|
||||
2. Submodes JT9-5, JT8-10, JT9-30 have been de-activated. (As far as I
|
||||
know, nobody was using them.) This action makes the program smaller
|
||||
by some 150 MB and able to run effectively on some older computers.
|
||||
|
||||
3. Bizarre ordering of COM port numbers on the drop-down list has been
|
||||
corrected, and suitable serial ports added to the list displayed in
|
||||
Linux.
|
||||
|
||||
4. Gray bar between decoding periods now contains a dashed line.
|
||||
|
||||
5. Corrected a bug that prevented use of Setup | Configuration with
|
||||
no existing wsjtx.ini file.
|
||||
|
||||
May 17, 2013: v0.95, r3278
|
||||
--------------------------
|
||||
1. Double-clicking on a decoded text line in "Band Activity" window
|
||||
now copies the line into the "QSO Frequency" window if it was not
|
||||
already there.
|
||||
|
||||
2. Option "Color highlighting in left window" removed from Setup
|
||||
menu. Highlighting is now always done.
|
||||
|
||||
3. Positions of "QSO Frequency" and "Band Activity" windows have been
|
||||
swapped.
|
||||
|
||||
4. F4 was restored to its previous use; F5 is now used to display
|
||||
Special Mouse Commands
|
||||
|
||||
5. Small square between Band selector and Frequency readout was made
|
||||
a control button. Orange indicates one-way CAT control from
|
||||
program to radio, red indicates bi-directional control. Clicking
|
||||
the orange button causes a one-time readout of dial frequency.
|
||||
|
||||
6. If Save=None, the last recorded file is deleted on program exit.
|
||||
This prevents unwanted accumulation of files in the Save
|
||||
directory.
|
||||
|
||||
7. Status-bar messages were re-arranged in a more logical order.
|
||||
|
||||
8. Tx signal report was added to wsjtx_status.txt (for JT-Alert)
|
||||
|
||||
9. More informative labels were placed on the "Tab 2" GUI controls.
|
||||
|
||||
10. Better default scaling for the "Cumulative" spectrum.
|
||||
|
||||
11. New algorithm for identifying JT9 signals to send to decoder,
|
||||
resulting major improvements in decoder speed.
|
||||
|
||||
12. Bug fixes:
|
||||
- Incorrect displayed frequencies for JT9-2 signals
|
||||
- Infinitely repeated "Error rigOpen -1" messages
|
||||
- User tries to open CAT control using busy or nonexistent serial port
|
||||
|
||||
13. Many updates to the User's Guide
|
||||
|
||||
|
||||
May 2, 2013: v0.95, r3251
|
||||
-------------------------
|
||||
|
||||
1. The "band change" function is executed whenever the Band combobox
|
||||
is activated, even if the selected band has not changed.
|
||||
|
||||
2. The program does not set rig mode. That task is left to the user.
|
||||
|
||||
3. Time interval for polling rig frequency is now a user parameter on
|
||||
the setup screen. I set mine to 1 second, which works fine with
|
||||
the Kenwood TS-2000. Set it to 0 if you want no polling for
|
||||
frequency (which means unidirectional CAT control from program to
|
||||
radio). Choose something like 10 s for the K3.
|
||||
|
||||
4. Much new work on the WSJT-X User's Guide, which is approaching its
|
||||
final form for Version 1.0. Please read it and tell us about
|
||||
anything you find unclear or missing!
|
||||
|
||||
These changes address nearly all of the CAT issues found by a few
|
||||
users -- those with K3, IC-746, IC-706, in particular.
|
||||
|
||||
One additional piece of advice when running WSJT-X in Windows: connect
|
||||
and turn on the radio and any interface equipment before starting
|
||||
WSJT-X, and exit the program before turning such equipment off.
|
||||
|
||||
April 29, 2013: v0.95, r3243
|
||||
----------------------------
|
||||
|
||||
1. Now has bi-directionsl CAT control using direct calls to hamlib
|
||||
functions. Highlights displayed dial frequency with red background
|
||||
if frequency differs from nominal for the selected band by more
|
||||
than 100 kHz. (Is there a more useful or logical condition to
|
||||
flag?) Small red square between Band selector and Dial Frequency
|
||||
display to indicate that CAT control is active. Mode is set to USB
|
||||
on startup. (Note: CAT control diagnostics are presently rather
|
||||
rudimentary, we're still working on this. Feedback is welcome!)
|
||||
|
||||
2. New controls on Setup | Configuration screen:
|
||||
- RTS/DTR OFF -- needed by K2 and maybe other radios
|
||||
- Data / Mic -- select CAT-control PTT type
|
||||
- Test CAT Control -- try settings before returning to main screen
|
||||
- Test PTT -- try settings for toggling PTT On/Off
|
||||
|
||||
3. Help menu now provides displays of Keyboard Shortcuts (quick access
|
||||
via F3) and Special Mouse Commands (F4).
|
||||
|
||||
4. Option "Setup | Advanced | Allow multiple instances" enables the
|
||||
use of more than one instance of WSJT-X for special applications.
|
||||
(The program must be copied into and run from different
|
||||
directories.)
|
||||
|
||||
5. No posts to PSK Reporter if band was changed during the reception
|
||||
period.
|
||||
|
||||
6. Improved behavior of Tune button.
|
||||
|
||||
7. Improved inter-process communication between WSJT-X and JT-Alert-X.
|
||||
|
||||
8. Better interaction between "Report" spinner control and Tx messages.
|
||||
|
||||
9. Removed the NB checkbox and slider. (Has anyone found these useful?)
|
||||
|
||||
10. New buttons on main window: "Tx=Rx" sets Tx frequency to current
|
||||
Rx frequency; "Rx=Tx" does the opposite.
|
||||
|
||||
11. Log QSO confirmation window is now "non-modal": you can keep it
|
||||
open and still access controls on the main window.
|
||||
|
||||
12. Tab-order has been rationalized on most screens.
|
||||
|
||||
13. Dial frequency and mode written to file ALL.TXT.
|
||||
|
||||
14. Double-click on decoded line sets Tx message #3 if message has
|
||||
the form "MyCall Call2 rpt".
|
||||
|
||||
15. Bug causing occasional, seemingly unpredictable program crashes
|
||||
has been fixed.
|
||||
|
||||
16. The WSJT-X User's Guide is somewhat closer to being complete. User
|
||||
feedback on the Guide will be most welcome. What is unclear? What
|
||||
is missing?
|
||||
|
||||
April 17, 2013: v0.9, r3195
|
||||
---------------------------
|
||||
1. Sorry, the CAT control changes in r3187/3188 were a dismal failure
|
||||
in many stations, and they introduced other bugs as well. This revision
|
||||
goes back to uni-directional CAT control: the program can set the
|
||||
radio's dial frequency and do T/R switching, but that's all. The band
|
||||
setting is not reset on program startup.
|
||||
|
||||
2. Logic for the Tune button has been corrected.
|
||||
|
||||
3. For Linux compile-it-yourself enthusiasts: the interface to
|
||||
PSK Reporter is now working undel Linux.
|
||||
|
||||
April 16, 2013: v0.9, r3188
|
||||
---------------------------
|
||||
|
||||
1. CAT control now reads and follows changes in radio's dial
|
||||
frequency. Readout gets red highlighting if radio is on wrong band.
|
||||
On program restart, band is reset to the last selected band.
|
||||
|
||||
2. New "Tune" button generates an unmodulated carrier. Toggle button
|
||||
a second time to turn Tx off.
|
||||
|
||||
3. Added labels at top of "Tab 2" and enlarged the text entry fields.
|
||||
|
||||
4. Fixed the broken logic for "Runaway Tx watchdog".
|
||||
|
||||
5. Fixed "Prompt me to log QSO" so that it no longer requires also
|
||||
setting "ID after 73".
|
||||
|
||||
6. Additional changes of (eventual) interest to Linux users. Code for
|
||||
sending spots to PSK Reporter now in place.
|
||||
|
||||
April 13, 2013: v0.9, r3166
|
||||
---------------------------
|
||||
1. Option to send Tx messages (highlighted in yellow) to the QSO window.
|
||||
|
||||
2. Prevent starting a transmission more than 24 sec into a Tx period.
|
||||
|
||||
3. "Setup | Options" changed to "Setup | Configuration".
|
||||
|
||||
4. Type Alt-V to save the most recently completed Rx file.
|
||||
|
||||
5. Fixed bug that truncated Rx messages to 16 characters.
|
||||
|
||||
6. Internal program changes that should provide better user diagnostics
|
||||
when necessary at program startup.
|
||||
|
||||
April 11, 2013: v0.9, r3157
|
||||
---------------------------
|
||||
1. Maximum size of several window areas increased to accommodate system
|
||||
fonts set larger than default.
|
||||
|
||||
2. New behavior of Erase button: click once to erase the left (QSO) window,
|
||||
twice to erase both decoded text windows.
|
||||
|
||||
3. Keyboard shortcuts:
|
||||
Alt-D: decode again at QSO frequency (same as clicking the Decode() button)
|
||||
Shift-D: do another full decode in both windows
|
||||
Alt-E: Erase()
|
||||
Ctrl-F: Edit the free text message box
|
||||
Alt-H: Halt Tx()
|
||||
Alt M: Monitor()
|
||||
Alt-N: Enable Tx()
|
||||
Alt-Q: Log QSO()
|
||||
Alt-S: Stop()
|
||||
|
||||
4. New Setup options: "Tx disabled after sending 73" and "Runaway Tx
|
||||
watchdog".
|
||||
|
||||
5. Fixed bug in saving the "report received" for logging purposes.
|
||||
|
||||
6. Corrected the logic for "Runaway Tx watchdog".
|
||||
|
||||
7. Fixed bug that truncated characters 17 and 18 of decoded messages.
|
||||
|
||||
April 10, 2013: v0.9, r3151
|
||||
---------------------------
|
||||
1. Blank line between decoding periods is now in the right-hand
|
||||
text window, where it should be.
|
||||
2. Decoding range defined by fMin and fMax is now enforced.
|
||||
|
||||
April 9, 2013: v0.9, r3143
|
||||
--------------------------
|
||||
This minor release restores the decoding speed of earlier revisions
|
||||
and corrects a bug that prevented sending CW ID.
|
||||
|
||||
April 9, 2013: v0.9, r3142
|
||||
--------------------------
|
||||
|
||||
This version of WSJT-X has a number of significant changes. Please
|
||||
read the following notes carefully. Also -- even if you are already
|
||||
familiar with WSJT-X -- be sure to read the updated WSJT-X User's
|
||||
Guide at
|
||||
http://www.physics.princeton.edu/pulsar/K1JT/WSJT-X_Users_Guide.pdf ,
|
||||
especially pages 3 and 4.
|
||||
|
||||
Changes since v0.8 r3118 include the following:
|
||||
|
||||
1. There are now two scrolling windows for decoded text. The left
|
||||
window contains decodes only from close to the designated QSO
|
||||
frequency. The right window includes signals over the full decoding
|
||||
range.
|
||||
|
||||
2. An alternative set of controls is now available for generating and
|
||||
selecting Tx messages. Some may find these more convenient to use
|
||||
than the Tx1 through Tx6 message boxes.
|
||||
|
||||
3. A number of new user options are available on the Setup menu:
|
||||
- Blank line between decoding periods (right window only)
|
||||
- Clear DX Call and DX Grid after logging QSO
|
||||
- Display distances in miles
|
||||
- Runaway Tx watchdog
|
||||
- Background colors for left window
|
||||
- Double-click on decoded message sets Tx Enable
|
||||
|
||||
4. New or changed on-screen features
|
||||
- "Tol" replaced by fMin and fMax on waterfall screen (see User's Guide)
|
||||
- Spinner control for signal report
|
||||
- On waterfall scale: green marker for Rx freq, red for Tx. blue
|
||||
for decoding range
|
||||
|
||||
5. New behavior
|
||||
- "CQ DX" is now treated properly when decoded line is double-clicked
|
||||
- Message formate for compound callsigns (e.g., PJ4/K1ABC, G4XYZ/P)
|
||||
are now handled correctly. (Some restrictions apply, and will
|
||||
be spelled out in the completed User's Guide.)
|
||||
- Decode button now causes a decode only at the specified Rx frequency.
|
||||
- Click on waterfall spectrum sets Rx freq; double-click also invokes
|
||||
decoder (as though Decode button had been clicked). CTRL-click moves
|
||||
both Rx and Tx freqs.
|
||||
- Amplitude at end of transmission is ramped down to prevent a final
|
||||
key click.
|
||||
|
||||
6. The following bugs have been fixed:
|
||||
- Logic error in decoder
|
||||
- Certain non-standard Tx messages could cause a program crash.
|
||||
- Certain (rarely used) messages did not pack/unpack correctly
|
||||
|
||||
April 2, 2013: v0.8, r3118
|
||||
--------------------------
|
||||
1. Improved interface to program JT-Alert, by VK3AMA.
|
||||
|
||||
2. The LogQSO confirmation dialog no longer blocks the GUI updating
|
||||
process.
|
||||
|
||||
3. A blank line with gray background separates the decoded text lines for
|
||||
each new invocation of the decoder.
|
||||
|
||||
4. New suggested default frequencies: 5.357, 18.104, and 24.918 MHz.
|
||||
Be sure to edit these entries on the 'Default Frequencies' tab of the
|
||||
Setup screen. (When you have done this once, the new values will be
|
||||
remembered.)
|
||||
|
||||
5. The LogQSO button now does nothing is the 'DX call' entry field is
|
||||
blank.
|
||||
|
||||
6. Several minor bugs were fixed.
|
||||
|
||||
|
||||
March 27, 2013: v0.8, r3113
|
||||
---------------------------
|
||||
1. Bug fix: VOX control of T/R switching now works.
|
||||
|
||||
2. Potentially useful error messages now appear when CAT control
|
||||
has failed.
|
||||
|
||||
3. Added an instruction on the Log QSO confirmation screen.
|
||||
|
||||
4. Clear the DXcall and DXgrid entries after logging a QSO.
|
||||
|
||||
March 26, 2013: v0.8, r3112
|
||||
---------------------------
|
||||
|
||||
Edson Pereira, PY2SDR, recently became an active contributor to this
|
||||
open-source project. Edson and I have been very busy over the past
|
||||
few days! WSJT-X revision 3112 has many changes and new features.
|
||||
|
||||
1. The GUI layout has been adjusted and optimized.
|
||||
|
||||
2. CAT control is now operational, offering optional control of your
|
||||
radio's dial frequency and T/R status. Go to the Setup | Options
|
||||
window to select the necessary parameters.
|
||||
|
||||
3. CW ID has been implemented. You can have your ID sent after a fixed
|
||||
time interval, or automatically when you transmit a "73" or free
|
||||
text message.
|
||||
|
||||
4. Default dial frequencies are available for each band on a new tab
|
||||
on the Setup | Options window. Please note: some of these
|
||||
frequencies are probably wrong! You can edit them as needed.
|
||||
(Please let us know if the original values are inconsistent with
|
||||
actual practice on any band.)
|
||||
|
||||
5. Several new options appear on the Setup menu. Try them!
|
||||
|
||||
6. Azimuth and Distance information is displayed whenever a valid grid
|
||||
locator appears in the "Dx Grid" box.
|
||||
|
||||
7. The decoder has again been adjusted for better compromise between
|
||||
sensitivity and decoding time.
|
||||
|
||||
8. The User's Guide is out of date, and needs work. We hope to get to
|
||||
that task soon.
|
||||
|
||||
9. Very important for some would-be users: WSJT-X now runs properly
|
||||
under Linux. We haven't made a package yet, so for now you must
|
||||
compile your own. If you don't know how, we hope to be set up
|
||||
to make packages before too long.
|
||||
|
||||
10. If you know someone who might be interested in contributing to the
|
||||
development of WSJT-X and related projects, please send him/her
|
||||
our way! We're especially looking for someone interested in
|
||||
producing packaged Linux distributions -- for example, *.deb or
|
||||
*.rpm packages, but other programming help is also wanted.
|
||||
|
||||
As always: please report bugs, and don't be bashful about sending us
|
||||
your feature requests!
|
||||
|
||||
March 22, 2013: v0.7, r3071
|
||||
---------------------------
|
||||
1. Correct a bug that (still) allowed display of previous decodes
|
||||
when nothing new was decoded.
|
||||
|
||||
2. Add a user confirmation screen activated when you click Log QSO.
|
||||
This lets you edit or add information before it is written to the
|
||||
ADIF file.
|
||||
|
||||
3. Tx message macros and now available. Configure them on the Setup
|
||||
window. They are invoked as a pop-up menu by right-clicking on the
|
||||
Tx5 message window; then select the desired message by left-clicking
|
||||
on the desired message.
|
||||
|
||||
March 20, 2013: v0.7, r3063
|
||||
---------------------------
|
||||
1. Add Frequency to the generated ADIF records.
|
||||
|
||||
2. Correct a decoder bug that led to duplication of previous output
|
||||
when nothing new was decoded.
|
||||
|
||||
March 19, 2013: v0.7, r3061
|
||||
---------------------------
|
||||
1. Allow Windows COM port numbers up to 99.
|
||||
|
||||
2. Replace status files wsjtx_qrg.txt and wsjtx_txcall.txt with
|
||||
a single file, wsjtx_status.txt.
|
||||
|
||||
3. Combine wsjtx_rx.log and wsjtx_tx.log into a single file ALL.TXT.
|
||||
|
||||
4. "Log QSO" now writes a file in ADIF format.
|
||||
|
||||
5. Starting to implement popup macros for Tx message #5.
|
||||
|
||||
6. Big improvement in decoding speed.
|
||||
|
||||
*** More changes to come! Please report any problems, especially
|
||||
*** with the ADIF-format log.
|
||||
|
||||
March 12, 2013: v0.6, r3046
|
||||
---------------------------
|
||||
1. Decoded calls can now be uploaded to the PSK Reporter web site.
|
||||
Check the box "Enable PSK Reporter" on the Setup screen, and go to
|
||||
http://pskreporter.info/pskmap.html to see the spots. Be sure to
|
||||
enter your "Dial Frequency (MHz)" at lower right of the Wide Graph
|
||||
window. (Rig control features are yet to come...)
|
||||
|
||||
2. Added some interfaces to permit use with the program JT-Alert,
|
||||
by VK3AMA. Look for this capability in the near future.
|
||||
|
||||
March 6, 2013: v0.5, r3038
|
||||
--------------------------
|
||||
1. Selection of Current/Cumulative/JT9Sync for the 2d spectral display
|
||||
changed to a combobox.
|
||||
|
||||
2. Double-click on decoded text does not change frequency settings
|
||||
if first decoded call is MyCall.
|
||||
|
||||
March 1, 2013: v0.5, r3026
|
||||
--------------------------
|
||||
1. The horizontal scale of 2d spectra (e.g., the "red curve") is now
|
||||
correct when the user has selected FFT Bins/Pixel > 1.
|
||||
|
||||
2. Double-clicking on a decoded text line now selects the second
|
||||
callsign independent of exactly where one has clicked on the line.
|
||||
In addition, it sets the selected frequencies (both Tx and Rx) to
|
||||
the frequency of the decoded transmission.
|
||||
|
||||
December 11, 2012: v0.5, r2791
|
||||
------------------------------
|
||||
1. Messages of the form "CQ DX K1ABC" are now supported.
|
||||
|
||||
November 30, 2012: v0.5, r2788
|
||||
------------------------------
|
||||
1. A bug was introduced when support for positive signal reports was
|
||||
added. It could cause a program crash when certain free-text messages
|
||||
were composed for transmission. The bug has been fixed.
|
||||
|
||||
2. In the slower JT9 sub-modes, the UTC listed on decoded text lines
|
||||
has been changed to the start time of the Rx sequence, rather than the
|
||||
time of the final minute.
|
||||
|
||||
3. The waterfall's "Auto Zero" button had no function, and has been
|
||||
removed.
|
||||
|
||||
4. In previous revisions the installer put a number of DLLs into
|
||||
the Windows system directory, normally C:\Windows\System32. This
|
||||
revision installs the DLLs to the WSJT-X installation directory.
|
||||
|
||||
|
||||
November 29, 2012: v0.5, r2786
|
||||
------------------------------
|
||||
1. In r2783, the companion program jt9.exe (started automatically when
|
||||
you start WSJT-X) was a CPU hog for no good reason. This was an
|
||||
oversight on my part, and the bug has been corrected.
|
||||
|
||||
2. The program should now run correctly if installed in a directory
|
||||
whose name contains embedded spaces. (Under Vista and Win7, however,
|
||||
it's still not a good idea to install WSJT-X into C:\Program Files,
|
||||
because of restricted write permissions there.)
|
||||
|
||||
3. In r2783 and earlier, stopping a transmission by toggling to "Auto
|
||||
OFF" would terminate Tx audio and release PTT almost simultaneously,
|
||||
possibly hot-switching your T/R relay(s). This has been corrected so
|
||||
that proper sequencing takes place.
|
||||
|
||||
|
||||
November 28, 2012: v0.5, r2783
|
||||
------------------------------
|
||||
This revision has an unusually large number of changes relative to the
|
||||
previous release, v0.4 r2746. These changes include:
|
||||
|
||||
1. PTT control via COM ports COM10 and higher is enabled.
|
||||
|
||||
2. Improved decoder performance: higher speed as well as better
|
||||
chances of success. Moderate amounts of frequency drift are detected
|
||||
and compensated. Computed S/N values are more reliable. Time offsets
|
||||
from -2.5 to +5 s are now supported, which makes JT9 usable for EME.
|
||||
(EME tests on 144 MHz have been successful, and performance on that
|
||||
propagation mode appears to be good.)
|
||||
|
||||
3. Tx Frequency now tracks the selected QSO Frequency (unless you hold
|
||||
down the CTRL key when setting QSO Frequency via mouse-clicks or the
|
||||
F11/F12 keys).
|
||||
|
||||
4. Decoded text containing "CQ " is highlighted with green background;
|
||||
text including "MyCall" is highlighted in red.
|
||||
|
||||
5. In previous versions, signal reports were required to be in the
|
||||
range -30 to -01 dB. In v0.5 r2782 the range has been extended to -50
|
||||
to +49 dB. There is backward compatibility for the range -30 to -01,
|
||||
but reports in the range -50 to -31 and 0 to +49 will NOT be decoded
|
||||
correctly by previous program versions. It is important to upgrade!
|
||||
|
||||
6. Items "Save Synced" and "Save Decoded" are now implemented.
|
||||
|
||||
7. UTC Date, JT9 submode, and a parameter related to the decoding
|
||||
procedure are now included in file wsjtx_rx.log.
|
||||
|
||||
8. Editing of Tx messages (in any of the six Tx message boxes) is
|
||||
complete when you hit "Tab" or "Return". The message is then parsed
|
||||
and converted to the form in which it will be displayed if decoding is
|
||||
successful. Free-text messages are trimmed to 13 characters and
|
||||
highlighted with a pink background.
|
||||
|
||||
9. The most recent transmitted message is displayed in the right-most
|
||||
label on the status bar. This can be useful if you have lost track of
|
||||
where you were in a QSO.
|
||||
|
||||
10. By default, the program now starts with Monitor ON. An option on
|
||||
the Setup menu allows you to select "Monitor OFF at startup".
|
||||
|
||||
11. Better scaling is provided for the red "JT9 Sync" curve. Note
|
||||
that JT9 signals in the active sub-mode should appear in this plot as
|
||||
a bump of width equal to the total signal bandwidth, with a narrow and
|
||||
slightly higher bump at the left edge. The narrow bump is the
|
||||
frequency of the Sync tone, which is defined as the nominal frequency
|
||||
of the JT9 signal.
|
||||
|
||||
12. Basic QSO information is now written to file wsjt.log when you
|
||||
click the "Log QSO" button.
|
||||
|
||||
13. The WSJT-X User's Guide has been updated.
|
||||
|
||||
14. Other known bugs have been fixed. There will probably be new
|
||||
ones! When you find one, or if you know of any old ones that have NOT
|
||||
been fixed, please send me email.
|
||||
|
||||
Summary of Present Status
|
||||
----------------------------------------------------------------------
|
||||
I believe that WSJT-X is now a stable and very usable program. Many
|
||||
thousands of QSOs have been made with JT9-1, mostly at HF -- I have
|
||||
made nearly 100, myself. Also a number of QSOs have also been
|
||||
completed at MF, and successful tests have been made on 2m EME, etc.
|
||||
A number of QSOs have also been made with JT9-2.
|
||||
|
||||
As far as I know the slower modes (JT9-5, JT9-10, and JT9-30) also
|
||||
work correctly. (Certainly they do in my laboratory test setup.)
|
||||
Most people will find these modes too slow for "everyday" use, and
|
||||
they require high frequency stability. It remains to be seen whether
|
||||
they will be widely used.
|
||||
|
||||
An alternative approach to obtaining improved sensitivity would be to
|
||||
give the decoder an ability to average over several successive
|
||||
transmissions. For example, the average of five JT9-1 transmissions
|
||||
could reach a decoding threshold around -32 dB, only 2 dB worse than a
|
||||
single JT9-5 transmission. Because of QSB, the shorter transmissions
|
||||
may actually succeed in less total time. Stability requirements would
|
||||
be those of JT9-1, much less stringent than those of JT9-5.
|
||||
|
||||
Program development is not finished, by any means. I will be grateful
|
||||
for your feedback on performance issues, as well as your "wish-list"
|
||||
of features to be added. As always, example recordings of files that
|
||||
you think should have decoded, but did not, will be much appreciated.
|
||||
|
||||
November 16, 2012: v0.4, r2746
|
||||
------------------------------
|
||||
|
||||
Changes from v0.4 r2731 include the following:
|
||||
|
||||
1. Valid signal reports are now generated by double-clicking on a
|
||||
callsign in the decoded text window.
|
||||
|
||||
2. Consecutive spaces in a Tx message are now collapsed into a single
|
||||
space.
|
||||
|
||||
3. Decoding speed is much improved, especially when strong (possibly
|
||||
non-JT9) signals are present and "Tol" is set to a relatively large
|
||||
value.
|
||||
|
||||
4. Scaling of the "JT9 Sync" plot (red curve) is more reasonable.
|
||||
|
||||
5. Layout of widgets on the main window has been improved.
|
||||
|
||||
6. Several minor bug fixes.
|
||||
|
||||
November 14, 2012: v0.4, r2731
|
||||
------------------------------
|
||||
|
||||
A number of known bugs have been fixed, and the JT9 decoder is
|
||||
significantly improved. Among other improvements, the program is now
|
||||
much less fussy about timing issues.
|
||||
|
||||
November 6, 2012: v0.3, r2717
|
||||
------------------------------
|
||||
|
||||
Changes from r2713 include the following:
|
||||
|
||||
1. A bug in the decoder that led to erratic behavior (failed decodes)
|
||||
under certain conditions has been corrected. Decoding is now much
|
||||
more reliable.
|
||||
|
||||
2. A valid algorithm is now used to calculate S/N values for received
|
||||
JT9 signals.
|
||||
|
||||
3. The header format of recorded *.wav files has been corrected.
|
||||
These files will now play correctly in Windows programs that expect
|
||||
the standard header.
|
||||
|
||||
November 6, 2012: v0.2, r2713
|
||||
------------------------------
|
||||
|
||||
Changes from r2711 include the following:
|
||||
|
||||
1. Updates to the Quick-Start User's Guide,
|
||||
http://www.physics.princeton.edu/pulsar/K1JT/WSJT-X_Users_Guide.pdf
|
||||
|
||||
2. Double-click on waterfall now sets Tol to a reduced
|
||||
(mode-dependent) value.
|
||||
|
||||
3. Tol is saved and restored on program restart.
|
||||
|
||||
4. A "digital gain" slider was added next to the green-bar audio level
|
||||
indicator. With the slider at mid-range, the scale reads correctly in
|
||||
dB above the least significant bit of 16-bit audio data.
|
||||
|
||||
5. There is now a test that rejects at least one type of data that is
|
||||
sufficiently corrupt to cause Eddie's best friend, the message
|
||||
"15P6715P67WCV".
|
||||
|
||||
6. Several minor tweaks to improve decoder performance.
|
||||
|
||||
7. The program now starts with Monitor OFF. You must click Monitor to
|
||||
start accepting audio. For some types of testing, this may be an
|
||||
advantage. This startup condition may be changed again, in the
|
||||
future.
|
||||
|
||||
October 31, 2012: v0.2, r2711
|
||||
-----------------------------
|
||||
|
||||
Three significant changes since r2706:
|
||||
|
||||
1. Three options are now provided on the "Decode" menu, controlling
|
||||
the "depth" of the decoding process. For most purposes I suggest you
|
||||
should use "Normal", but feel free to experiment with the others.
|
||||
|
||||
2. Decoding of multiple signals in one Rx interval has been improved.
|
||||
|
||||
3. Handling of strong signals has been improved.
|
||||
|
||||
October 309, 2012: v0.2, r2706
|
||||
------------------------------
|
||||
|
||||
Changes since r2702 include the following:
|
||||
|
||||
1. The problem with "ghost" signals is fixed.
|
||||
|
||||
2. A problem causing very long decode times under certain
|
||||
circumstances has been fixed. Please note: decode times on any recent
|
||||
PC should no more than a few seconds!
|
||||
|
||||
3. I have re-directed the program's fatal error messages so they will
|
||||
be sent to the command-prompt window from which you started the
|
||||
program. Please send me full reports on any such messages you observe,
|
||||
preferably with details on how to reproduce the problem.
|
||||
|
||||
#########################################################################
|
||||
|
||||
Some additional information ...
|
||||
|
||||
1. Yes, the JT9 modes require good stability in all system
|
||||
oscillators. The present JT9 bdecoder does not attempt to track
|
||||
frequency drifts. Such capability will be added, however. We have
|
||||
been using digital modes for EME for nearly ten years now, at 144 MHz
|
||||
and higher. There are more than 1000 WSJT users on EME, using all
|
||||
kinds of rige. We have learned how to deal with reasonable rates of
|
||||
drift. Surely if we can do these things at VHF, we can do them much
|
||||
more easily at MF and LF.
|
||||
|
||||
2. If you're sure that you have seen degraded JT9 performance because
|
||||
of frequency stability issues, don't just complain on the LF
|
||||
reflector. Document your case and send me an example file with a
|
||||
drifting JT9 signal. Making WSJT-X and JT9 better is partly YOUR
|
||||
responsibility!
|
||||
|
||||
3. In other ways as well, test files are needed. I can make many
|
||||
tests myself, but I can't foresee all the problems others will have.
|
||||
That's what the "Save All" function is for! In these early tests,
|
||||
always run with "Save All" checked, just in case you will want to
|
||||
refer back to something that happened. You may want to send me the
|
||||
file in question. You can always clean out your "Save" directory by
|
||||
using "File | Delete all *.wav files in SaveDir". I need good
|
||||
examples of signals that fail to decode for any unknown reason. Also
|
||||
some good examples of atmospheric or other impulsive noise, for
|
||||
testing the noise blanker.
|
||||
|
||||
4. I have added a page of "Hints for New Users" to the online WSJT-X
|
||||
User's Guide,
|
||||
http://www.physics.princeton.edu/pulsar/K1JT/WSJT-X_Users_Guide.pdf .
|
||||
Please read it! ... and let me know if you find other operational
|
||||
details of WSJT-X that need explanation. This will likely be
|
||||
especially true for those not already familiar with older versions of
|
||||
WSJT.
|
||||
|
||||
5. An operational suggestion: In many ways the different JT9 submodes
|
||||
are treated as distinct modes. If you receive a JT9-x signal in a
|
||||
different submode than the one you have selected, you won't decode
|
||||
it. For this reason, if JT9 is to become popular we'll probably need
|
||||
to choose one or two of the submodes for general use, and perhaps
|
||||
assign a narrow slice of the band to each one. Note that "message
|
||||
averaging" in the Rx software can make two or three JT9-2
|
||||
transmissions as good as one JT9-5 transmission, with the advantage
|
||||
that you will copy sooner if signals are better than required for
|
||||
JT9-5. Message averaging is not yet present in the JT9 decoder... but
|
||||
in future it can be. Again, we have dealt with such issues very
|
||||
effectively on EME -- and can do so at MF/LF, for sure.
|
||||
|
||||
6. On the topic of CW, Beacons, WSPR, JT9, etc. I really don't
|
||||
understand what all the fuss is about. Surely there is room for
|
||||
everybody? Maybe I'm just too new here to understand? (Mal, is this
|
||||
mostly just a matter of "Mal being Mal"???)
|
||||
|
||||
On the HF bands, the WSPR sub-band is just 200 Hz wide. If we did the
|
||||
same on 630 m, the WSPR sub-band would take up less than 3% of the 7
|
||||
kHz band. If that's too much, we could cut it in half, or even less,
|
||||
and still have enough WSPR space. Moreover, a "slow WSPR", if
|
||||
warranted, would require even less bandwidth. Similar comments apply
|
||||
to JT9. The bandwidth of JT9 signals is significantly less than that
|
||||
of CW, for comparable information rates. There should be enough
|
||||
spectrum for both, even in our narrow MF and LF bands.
|
||||
|
||||
7. As for performance comparisons between JT9 and WSPR: WSPR is a
|
||||
mature program, and its decoder has been optimized and tweaked over a
|
||||
period approaching five years. You are playing with JT9 in infancy.
|
||||
With help (as opposed to simple complaints) from users, it will
|
||||
improve rapidly.
|
||||
|
||||
October 29, 2012: v0.2, r2702
|
||||
-----------------------------
|
||||
Changes since version 0.1, r2696 include the following:
|
||||
|
||||
1. Sample rate for audio output has been changed from 12000 to 48000
|
||||
Hz. Tx audio may now be generated at any frequency from 500 to 20000
|
||||
Hz.
|
||||
|
||||
2. The Decoder now tries to decode all synchronizable signals in the
|
||||
"green zone", that is, within "Tol" Hz of the selected QSO
|
||||
frequency. (Before, by default it decoded only the signal producing
|
||||
the highest "sync" value. Other signals could be decoded by manually
|
||||
setting the QSO frequency and reducing Tol as needed.)
|
||||
|
||||
3. The user's selected QSO Frequency is now saved and restored on
|
||||
program restart.
|
||||
|
||||
4. The problem with re-initialization after changing sub-modes has
|
||||
been fixed.
|
||||
|
||||
5. The problem (for some users) of not releasing PTT after end of a
|
||||
transmission has been fixed.
|
||||
|
||||
6. The program now writes a log of all decodes to a file wsjtx_rx.log
|
||||
in the wsjtx directory.
|
||||
|
||||
|
||||
October 25, 2012: v0.1, r2695
|
||||
-----------------------------
|
||||
Initial version of WSJT-X (experimental WSJT) released for testing.
|
||||
@@ -0,0 +1,202 @@
|
||||
// (C) Copyright Gennadiy Rozental 2001.
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org/libs/test for the library home page.
|
||||
//
|
||||
// File : $RCSfile$
|
||||
//
|
||||
// Version : $Revision$
|
||||
//
|
||||
// Description : unit test decorators implementation
|
||||
// ***************************************************************************
|
||||
|
||||
#ifndef BOOST_TEST_TREE_DECORATOR_IPP_091911GER
|
||||
#define BOOST_TEST_TREE_DECORATOR_IPP_091911GER
|
||||
|
||||
// Boost.Test
|
||||
#include <boost/test/tree/decorator.hpp>
|
||||
#include <boost/test/tree/test_unit.hpp>
|
||||
|
||||
#include <boost/test/framework.hpp>
|
||||
#if BOOST_TEST_SUPPORT_TOKEN_ITERATOR
|
||||
#include <boost/test/utils/iterator/token_iterator.hpp>
|
||||
#endif
|
||||
|
||||
#include <boost/test/detail/throw_exception.hpp>
|
||||
|
||||
#include <boost/test/detail/suppress_warnings.hpp>
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
namespace boost {
|
||||
namespace unit_test {
|
||||
namespace decorator {
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::collector ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
collector&
|
||||
collector::operator*( base const& d )
|
||||
{
|
||||
m_tu_decorators.push_back( d.clone() );
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
void
|
||||
collector::store_in( test_unit& tu )
|
||||
{
|
||||
tu.p_decorators.value.insert( tu.p_decorators.value.end(), m_tu_decorators.begin(), m_tu_decorators.end() );
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
void
|
||||
collector::reset()
|
||||
{
|
||||
m_tu_decorators.clear();
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::base ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
collector&
|
||||
base::operator*() const
|
||||
{
|
||||
return collector::instance() * *this;
|
||||
}
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::label ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
label::apply( test_unit& tu )
|
||||
{
|
||||
tu.add_label( m_label );
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::expected_failures ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
expected_failures::apply( test_unit& tu )
|
||||
{
|
||||
tu.increase_exp_fail( m_exp_fail );
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::timeout ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
timeout::apply( test_unit& tu )
|
||||
{
|
||||
tu.p_timeout.value = m_timeout;
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::description ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
description::apply( test_unit& tu )
|
||||
{
|
||||
tu.p_description.value += m_description;
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::depends_on ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
depends_on::apply( test_unit& tu )
|
||||
{
|
||||
#if !BOOST_TEST_SUPPORT_TOKEN_ITERATOR
|
||||
BOOST_TEST_SETUP_ASSERT( false, "depends_on decorator is not supported on this platform" );
|
||||
#else
|
||||
utils::string_token_iterator tit( m_dependency, (utils::dropped_delimeters = "/", utils::kept_delimeters = utils::dt_none) );
|
||||
|
||||
test_unit* dep = &framework::master_test_suite();
|
||||
while( tit != utils::string_token_iterator() ) {
|
||||
BOOST_TEST_SETUP_ASSERT( dep->p_type == TUT_SUITE, std::string( "incorrect dependency specification " ) + m_dependency );
|
||||
|
||||
test_unit_id next_id = static_cast<test_suite*>(dep)->get( *tit );
|
||||
|
||||
BOOST_TEST_SETUP_ASSERT( next_id != INV_TEST_UNIT_ID,
|
||||
std::string( "incorrect dependency specification " ) + m_dependency );
|
||||
|
||||
dep = &framework::get( next_id, TUT_ANY );
|
||||
++tit;
|
||||
}
|
||||
|
||||
tu.depends_on( dep );
|
||||
#endif
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::enable_if/enabled/disabled ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
enable_if_impl::apply_impl( test_unit& tu, bool condition )
|
||||
{
|
||||
BOOST_TEST_SETUP_ASSERT(tu.p_default_status == test_unit::RS_INHERIT,
|
||||
"Can't apply multiple enabled/disabled decorators "
|
||||
"to the same test unit " + tu.full_name());
|
||||
|
||||
tu.p_default_status.value = condition ? test_unit::RS_ENABLED : test_unit::RS_DISABLED;
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::fixture ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
fixture_t::apply( test_unit& tu )
|
||||
{
|
||||
tu.p_fixtures.value.push_back( m_impl );
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
// ************************************************************************** //
|
||||
// ************** decorator::depends_on ************** //
|
||||
// ************************************************************************** //
|
||||
|
||||
void
|
||||
precondition::apply( test_unit& tu )
|
||||
{
|
||||
tu.add_precondition( m_precondition );
|
||||
}
|
||||
|
||||
//____________________________________________________________________________//
|
||||
|
||||
} // namespace decorator
|
||||
} // namespace unit_test
|
||||
} // namespace boost
|
||||
|
||||
#include <boost/test/detail/enable_warnings.hpp>
|
||||
|
||||
#endif // BOOST_TEST_TREE_DECORATOR_IPP_091911GER
|
||||
@@ -0,0 +1,193 @@
|
||||
|
||||
#if !defined(BOOST_PP_IS_ITERATING)
|
||||
|
||||
///// header body
|
||||
|
||||
#ifndef BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
|
||||
#define BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
|
||||
|
||||
// Copyright Aleksey Gurtovoy 2000-2004
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#if !defined(BOOST_MPL_PREPROCESSING_MODE)
|
||||
# include <boost/mpl/lambda_fwd.hpp>
|
||||
# include <boost/mpl/bind_fwd.hpp>
|
||||
# include <boost/mpl/protect.hpp>
|
||||
# include <boost/mpl/is_placeholder.hpp>
|
||||
# include <boost/mpl/if.hpp>
|
||||
# include <boost/mpl/identity.hpp>
|
||||
# include <boost/mpl/bool.hpp>
|
||||
# include <boost/mpl/aux_/na_spec.hpp>
|
||||
# include <boost/mpl/aux_/lambda_support.hpp>
|
||||
# include <boost/mpl/aux_/template_arity.hpp>
|
||||
# include <boost/mpl/aux_/value_wknd.hpp>
|
||||
#endif
|
||||
|
||||
#include <boost/mpl/aux_/config/use_preprocessed.hpp>
|
||||
|
||||
#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
|
||||
&& !defined(BOOST_MPL_PREPROCESSING_MODE)
|
||||
|
||||
# define BOOST_MPL_PREPROCESSED_HEADER lambda_no_ctps.hpp
|
||||
# include <boost/mpl/aux_/include_preprocessed.hpp>
|
||||
|
||||
#else
|
||||
|
||||
# include <boost/mpl/limits/arity.hpp>
|
||||
# include <boost/mpl/aux_/preprocessor/params.hpp>
|
||||
# include <boost/mpl/aux_/preprocessor/default_params.hpp>
|
||||
# include <boost/mpl/aux_/preprocessor/repeat.hpp>
|
||||
# include <boost/mpl/aux_/preprocessor/enum.hpp>
|
||||
# include <boost/mpl/aux_/config/msvc.hpp>
|
||||
# include <boost/mpl/aux_/config/workaround.hpp>
|
||||
|
||||
# include <boost/preprocessor/comma_if.hpp>
|
||||
# include <boost/preprocessor/iterate.hpp>
|
||||
# include <boost/preprocessor/inc.hpp>
|
||||
# include <boost/preprocessor/cat.hpp>
|
||||
|
||||
namespace boost { namespace mpl {
|
||||
|
||||
# define AUX778076_LAMBDA_PARAMS(i_, param) \
|
||||
BOOST_MPL_PP_PARAMS(i_, param) \
|
||||
/**/
|
||||
|
||||
namespace aux {
|
||||
|
||||
#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY
|
||||
template<
|
||||
BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)
|
||||
>
|
||||
struct lambda_or
|
||||
: true_
|
||||
{
|
||||
};
|
||||
|
||||
template<>
|
||||
struct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >
|
||||
: false_
|
||||
{
|
||||
};
|
||||
#undef n_
|
||||
|
||||
template< typename Arity > struct lambda_impl
|
||||
{
|
||||
template< typename T, typename Tag, typename Protect > struct result_
|
||||
{
|
||||
typedef T type;
|
||||
typedef is_placeholder<T> is_le;
|
||||
};
|
||||
};
|
||||
|
||||
#define BOOST_PP_ITERATION_PARAMS_1 \
|
||||
(3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/lambda_no_ctps.hpp>))
|
||||
#include BOOST_PP_ITERATE()
|
||||
|
||||
} // namespace aux
|
||||
|
||||
template<
|
||||
typename T
|
||||
, typename Tag
|
||||
, typename Protect
|
||||
>
|
||||
struct lambda
|
||||
{
|
||||
/// Metafunction forwarding confuses MSVC 6.x
|
||||
typedef typename aux::template_arity<T>::type arity_;
|
||||
typedef typename aux::lambda_impl<arity_>
|
||||
::template result_< T,Tag,Protect > l_;
|
||||
|
||||
typedef typename l_::type type;
|
||||
typedef typename l_::is_le is_le;
|
||||
|
||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))
|
||||
};
|
||||
|
||||
BOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)
|
||||
|
||||
template<
|
||||
typename T
|
||||
>
|
||||
struct is_lambda_expression
|
||||
: lambda<T>::is_le
|
||||
{
|
||||
};
|
||||
|
||||
# undef AUX778076_LAMBDA_PARAMS
|
||||
|
||||
}}
|
||||
|
||||
#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
|
||||
#endif // BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED
|
||||
|
||||
///// iteration, depth == 1
|
||||
|
||||
#else
|
||||
|
||||
#define i_ BOOST_PP_FRAME_ITERATION(1)
|
||||
|
||||
# define AUX778076_LAMBDA_TYPEDEF(unused, i_, F) \
|
||||
typedef lambda< \
|
||||
typename F::BOOST_PP_CAT(arg,BOOST_PP_INC(i_)) \
|
||||
, Tag \
|
||||
, false_ \
|
||||
> BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \
|
||||
/**/
|
||||
|
||||
# define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \
|
||||
typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \
|
||||
BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \
|
||||
/**/
|
||||
|
||||
# define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \
|
||||
BOOST_PP_COMMA_IF(i_) \
|
||||
BOOST_MPL_AUX_MSVC_VALUE_WKND(BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)))::value \
|
||||
/**/
|
||||
|
||||
# define AUX778076_LAMBDA_RESULT(unused, i_, unused2) \
|
||||
, typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::type \
|
||||
/**/
|
||||
|
||||
template<> struct lambda_impl< int_<i_> >
|
||||
{
|
||||
template< typename F, typename Tag, typename Protect > struct result_
|
||||
{
|
||||
BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, F)
|
||||
BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)
|
||||
|
||||
typedef aux::lambda_or<
|
||||
BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)
|
||||
> is_le;
|
||||
|
||||
typedef BOOST_PP_CAT(bind,i_)<
|
||||
typename F::rebind
|
||||
BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_RESULT, unused)
|
||||
> bind_;
|
||||
|
||||
typedef typename if_<
|
||||
is_le
|
||||
, if_< Protect, mpl::protect<bind_>, bind_ >
|
||||
, identity<F>
|
||||
>::type type_;
|
||||
|
||||
typedef typename type_::type type;
|
||||
};
|
||||
};
|
||||
|
||||
# undef AUX778076_LAMBDA_RESULT
|
||||
# undef AUX778076_IS_LAMBDA_EXPR
|
||||
# undef AUX778076_IS_LE_TYPEDEF
|
||||
# undef AUX778076_LAMBDA_TYPEDEF
|
||||
|
||||
#undef i_
|
||||
|
||||
#endif // BOOST_PP_IS_ITERATING
|
||||
@@ -0,0 +1,29 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
==============================================================================*/
|
||||
#if !defined(FUSION_ADAPT_VALUE_TRAITS_05062005_0859)
|
||||
#define FUSION_ADAPT_VALUE_TRAITS_05062005_0859
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/fusion/iterator/value_of.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
{
|
||||
struct adapt_value_traits
|
||||
{
|
||||
template <typename Iterator>
|
||||
struct apply
|
||||
{
|
||||
typedef typename
|
||||
result_of::value_of<typename Iterator::first_type>::type
|
||||
type;
|
||||
};
|
||||
};
|
||||
}}}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_CATEGORY_OF_IMPL_09272006_0726)
|
||||
#define BOOST_FUSION_CATEGORY_OF_IMPL_09272006_0726
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
struct boost_tuple_tag;
|
||||
struct forward_traversal_tag;
|
||||
|
||||
namespace extension
|
||||
{
|
||||
template<typename T>
|
||||
struct category_of_impl;
|
||||
|
||||
template<>
|
||||
struct category_of_impl<boost_tuple_tag>
|
||||
{
|
||||
template<typename T>
|
||||
struct apply
|
||||
{
|
||||
typedef forward_traversal_tag type;
|
||||
};
|
||||
};
|
||||
}
|
||||
}}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,100 @@
|
||||
#ifndef BOOST_SERIALIZATION_FACTORY_HPP
|
||||
#define BOOST_SERIALIZATION_FACTORY_HPP
|
||||
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// MS compatible compilers support #pragma once
|
||||
#if defined(_MSC_VER)
|
||||
# pragma once
|
||||
#endif
|
||||
|
||||
// factory.hpp: create an instance from an extended_type_info instance.
|
||||
|
||||
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#include <cstdarg> // valist
|
||||
#include <cstddef> // NULL
|
||||
|
||||
#include <boost/preprocessor/control/if.hpp>
|
||||
#include <boost/preprocessor/comparison/greater.hpp>
|
||||
|
||||
namespace std{
|
||||
#if defined(__LIBCOMO__)
|
||||
using ::va_list;
|
||||
#endif
|
||||
} // namespace std
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
// default implementation does nothing.
|
||||
template<class T, int N>
|
||||
T * factory(std::va_list){
|
||||
BOOST_ASSERT(false);
|
||||
// throw exception here?
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} // namespace serialization
|
||||
} // namespace boost
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY(N, T, A0, A1, A2, A3) \
|
||||
namespace boost { \
|
||||
namespace serialization { \
|
||||
template<> \
|
||||
T * factory<T, N>(std::va_list ap){ \
|
||||
BOOST_PP_IF(BOOST_PP_GREATER(N,0) \
|
||||
,A0 a0 = va_arg(ap, A0); \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,1) \
|
||||
,A1 a1 = va_arg(ap, A1); \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,2) \
|
||||
,A2 a2 = va_arg(ap, A2); \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,3) \
|
||||
,A3 a3 = va_arg(ap, A3); \
|
||||
,BOOST_PP_EMPTY() \
|
||||
)))) \
|
||||
return new T( \
|
||||
BOOST_PP_IF(BOOST_PP_GREATER(N,0) \
|
||||
,a0 \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,1) \
|
||||
,a1 \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,2) \
|
||||
,a2 \
|
||||
,BOOST_PP_IF(BOOST_PP_GREATER(N,3) \
|
||||
,a3 \
|
||||
,BOOST_PP_EMPTY() \
|
||||
)))) \
|
||||
); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
/**/
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY_4(T, A0, A1, A2, A3) \
|
||||
BOOST_SERIALIZATION_FACTORY(4, T, A0, A1, A2, A3)
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY_3(T, A0, A1, A2) \
|
||||
BOOST_SERIALIZATION_FACTORY(3, T, A0, A1, A2, 0)
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY_2(T, A0, A1) \
|
||||
BOOST_SERIALIZATION_FACTORY(2, T, A0, A1, 0, 0)
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY_1(T, A0) \
|
||||
BOOST_SERIALIZATION_FACTORY(1, T, A0, 0, 0, 0)
|
||||
|
||||
#define BOOST_SERIALIZATION_FACTORY_0(T) \
|
||||
namespace boost { \
|
||||
namespace serialization { \
|
||||
template<> \
|
||||
T * factory<T, 0>(std::va_list){ \
|
||||
return new T(); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
/**/
|
||||
|
||||
#endif // BOOST_SERIALIZATION_FACTORY_HPP
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,64 @@
|
||||
#ifndef BOOST_PP_IS_ITERATING
|
||||
/*=============================================================================
|
||||
Copyright (c) 2011 Eric Niebler
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
==============================================================================*/
|
||||
#if !defined(BOOST_FUSION_VECTOR10_FWD_HPP_INCLUDED)
|
||||
#define BOOST_FUSION_VECTOR10_FWD_HPP_INCLUDED
|
||||
|
||||
#include <boost/fusion/support/config.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/iteration/iterate.hpp>
|
||||
#include <boost/preprocessor/repetition/enum_params.hpp>
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
template <typename Dummy = void>
|
||||
struct vector0;
|
||||
}}
|
||||
|
||||
#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
|
||||
#include <boost/fusion/container/vector/detail/cpp03/preprocessed/vector10_fwd.hpp>
|
||||
#else
|
||||
#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 2, line: 0, output: "preprocessed/vector10_fwd.hpp")
|
||||
#endif
|
||||
|
||||
/*=============================================================================
|
||||
Copyright (c) 2011 Eric Niebler
|
||||
Copyright (c) 2001-2011 Joel de Guzman
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
This is an auto-generated file. Do not edit!
|
||||
==============================================================================*/
|
||||
#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(preserve: 1)
|
||||
#endif
|
||||
|
||||
namespace boost { namespace fusion
|
||||
{
|
||||
// expand vector1 to vector10
|
||||
#define BOOST_PP_FILENAME_1 <boost/fusion/container/vector/detail/cpp03/vector10_fwd.hpp>
|
||||
#define BOOST_PP_ITERATION_LIMITS (1, 10)
|
||||
#include BOOST_PP_ITERATE()
|
||||
}}
|
||||
|
||||
#if defined(__WAVE__) && defined(BOOST_FUSION_CREATE_PREPROCESSED_FILES)
|
||||
#pragma wave option(output: null)
|
||||
#endif
|
||||
|
||||
#endif // BOOST_FUSION_DONT_USE_PREPROCESSED_FILES
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
template <BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), typename T)>
|
||||
struct BOOST_PP_CAT(vector, BOOST_PP_ITERATION());
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,210 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1998-2002
|
||||
* John Maddock
|
||||
*
|
||||
* Use, modification and distribution are subject to the
|
||||
* Boost Software License, Version 1.0. (See accompanying file
|
||||
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* LOCATION: see http://www.boost.org for most recent version.
|
||||
* FILE regex_raw_buffer.hpp
|
||||
* VERSION see <boost/version.hpp>
|
||||
* DESCRIPTION: Raw character buffer for regex code.
|
||||
* Note this is an internal header file included
|
||||
* by regex.hpp, do not include on its own.
|
||||
*/
|
||||
|
||||
#ifndef BOOST_REGEX_RAW_BUFFER_HPP
|
||||
#define BOOST_REGEX_RAW_BUFFER_HPP
|
||||
|
||||
#ifndef BOOST_REGEX_CONFIG_HPP
|
||||
#include <boost/regex/config.hpp>
|
||||
#endif
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
|
||||
namespace boost{
|
||||
namespace BOOST_REGEX_DETAIL_NS{
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_PREFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
struct empty_padding{};
|
||||
|
||||
union padding
|
||||
{
|
||||
void* p;
|
||||
unsigned int i;
|
||||
};
|
||||
|
||||
template <int N>
|
||||
struct padding3
|
||||
{
|
||||
enum{
|
||||
padding_size = 8,
|
||||
padding_mask = 7
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct padding3<2>
|
||||
{
|
||||
enum{
|
||||
padding_size = 2,
|
||||
padding_mask = 1
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct padding3<4>
|
||||
{
|
||||
enum{
|
||||
padding_size = 4,
|
||||
padding_mask = 3
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct padding3<8>
|
||||
{
|
||||
enum{
|
||||
padding_size = 8,
|
||||
padding_mask = 7
|
||||
};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct padding3<16>
|
||||
{
|
||||
enum{
|
||||
padding_size = 16,
|
||||
padding_mask = 15
|
||||
};
|
||||
};
|
||||
|
||||
enum{
|
||||
padding_size = padding3<sizeof(padding)>::padding_size,
|
||||
padding_mask = padding3<sizeof(padding)>::padding_mask
|
||||
};
|
||||
|
||||
//
|
||||
// class raw_storage
|
||||
// basically this is a simplified vector<unsigned char>
|
||||
// this is used by basic_regex for expression storage
|
||||
//
|
||||
|
||||
class BOOST_REGEX_DECL raw_storage
|
||||
{
|
||||
public:
|
||||
typedef std::size_t size_type;
|
||||
typedef unsigned char* pointer;
|
||||
private:
|
||||
pointer last, start, end;
|
||||
public:
|
||||
|
||||
raw_storage();
|
||||
raw_storage(size_type n);
|
||||
|
||||
~raw_storage()
|
||||
{
|
||||
::operator delete(start);
|
||||
}
|
||||
|
||||
void BOOST_REGEX_CALL resize(size_type n);
|
||||
|
||||
void* BOOST_REGEX_CALL extend(size_type n)
|
||||
{
|
||||
if(size_type(last - end) < n)
|
||||
resize(n + (end - start));
|
||||
pointer result = end;
|
||||
end += n;
|
||||
return result;
|
||||
}
|
||||
|
||||
void* BOOST_REGEX_CALL insert(size_type pos, size_type n);
|
||||
|
||||
size_type BOOST_REGEX_CALL size()
|
||||
{
|
||||
return end - start;
|
||||
}
|
||||
|
||||
size_type BOOST_REGEX_CALL capacity()
|
||||
{
|
||||
return last - start;
|
||||
}
|
||||
|
||||
void* BOOST_REGEX_CALL data()const
|
||||
{
|
||||
return start;
|
||||
}
|
||||
|
||||
size_type BOOST_REGEX_CALL index(void* ptr)
|
||||
{
|
||||
return static_cast<pointer>(ptr) - static_cast<pointer>(data());
|
||||
}
|
||||
|
||||
void BOOST_REGEX_CALL clear()
|
||||
{
|
||||
end = start;
|
||||
}
|
||||
|
||||
void BOOST_REGEX_CALL align()
|
||||
{
|
||||
// move end up to a boundary:
|
||||
end = start + (((end - start) + padding_mask) & ~padding_mask);
|
||||
}
|
||||
void swap(raw_storage& that)
|
||||
{
|
||||
std::swap(start, that.start);
|
||||
std::swap(end, that.end);
|
||||
std::swap(last, that.last);
|
||||
}
|
||||
};
|
||||
|
||||
inline raw_storage::raw_storage()
|
||||
{
|
||||
last = start = end = 0;
|
||||
}
|
||||
|
||||
inline raw_storage::raw_storage(size_type n)
|
||||
{
|
||||
start = end = static_cast<pointer>(::operator new(n));
|
||||
BOOST_REGEX_NOEH_ASSERT(start)
|
||||
last = start + n;
|
||||
}
|
||||
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4103)
|
||||
#endif
|
||||
#ifdef BOOST_HAS_ABI_HEADERS
|
||||
# include BOOST_ABI_SUFFIX
|
||||
#endif
|
||||
#ifdef BOOST_MSVC
|
||||
#pragma warning(pop)
|
||||
#endif
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
} // namespace boost
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
subroutine osd174(llr,norder,decoded,cw,nhardmin,dmin)
|
||||
!
|
||||
! An ordered-statistics decoder for the (174,87) code.
|
||||
!
|
||||
include "ldpc_174_87_params.f90"
|
||||
|
||||
integer*1 gen(K,N)
|
||||
integer*1 genmrb(K,N),g2(N,K)
|
||||
integer*1 temp(K),m0(K),me(K),mi(K)
|
||||
integer indices(N),nxor(N)
|
||||
integer*1 cw(N),ce(N),c0(N),hdec(N)
|
||||
integer*1 decoded(K)
|
||||
integer indx(N)
|
||||
real llr(N),rx(N),absrx(N)
|
||||
logical first
|
||||
data first/.true./
|
||||
|
||||
save first,gen
|
||||
|
||||
if( first ) then ! fill the generator matrix
|
||||
gen=0
|
||||
do i=1,M
|
||||
do j=1,22
|
||||
read(g(i)(j:j),"(Z1)") istr
|
||||
do jj=1, 4
|
||||
irow=(j-1)*4+jj
|
||||
if( btest(istr,4-jj) ) gen(irow,i)=1
|
||||
enddo
|
||||
enddo
|
||||
enddo
|
||||
do irow=1,K
|
||||
gen(irow,M+irow)=1
|
||||
enddo
|
||||
first=.false.
|
||||
endif
|
||||
|
||||
! re-order received vector to place systematic msg bits at the end
|
||||
rx=llr(colorder+1)
|
||||
|
||||
! hard decode the received word
|
||||
hdec=0
|
||||
where(rx .ge. 0) hdec=1
|
||||
|
||||
! use magnitude of received symbols as a measure of reliability.
|
||||
absrx=abs(rx)
|
||||
call indexx(absrx,N,indx)
|
||||
|
||||
! re-order the columns of the generator matrix in order of decreasing reliability.
|
||||
do i=1,N
|
||||
genmrb(1:K,i)=gen(1:K,indx(N+1-i))
|
||||
indices(i)=indx(N+1-i)
|
||||
enddo
|
||||
|
||||
! do gaussian elimination to create a generator matrix with the most reliable
|
||||
! received bits in positions 1:K in order of decreasing reliability (more or less).
|
||||
! reliability will not be strictly decreasing because column re-ordering is needed
|
||||
! to put the generator matrix in systematic form. the "indices" array tracks
|
||||
! column permutations caused by reliability sorting and gaussian elimination.
|
||||
do id=1,K ! diagonal element indices
|
||||
do icol=id,K+20 ! The 20 is ad hoc - beware
|
||||
iflag=0
|
||||
if( genmrb(id,icol) .eq. 1 ) then
|
||||
iflag=1
|
||||
if( icol .ne. id ) then ! reorder column
|
||||
temp(1:K)=genmrb(1:K,id)
|
||||
genmrb(1:K,id)=genmrb(1:K,icol)
|
||||
genmrb(1:K,icol)=temp(1:K)
|
||||
itmp=indices(id)
|
||||
indices(id)=indices(icol)
|
||||
indices(icol)=itmp
|
||||
endif
|
||||
do ii=1,K
|
||||
if( ii .ne. id .and. genmrb(ii,id) .eq. 1 ) then
|
||||
genmrb(ii,1:N)=mod(genmrb(ii,1:N)+genmrb(id,1:N),2)
|
||||
endif
|
||||
enddo
|
||||
exit
|
||||
endif
|
||||
enddo
|
||||
enddo
|
||||
|
||||
g2=transpose(genmrb)
|
||||
|
||||
! The hard decisions for the K MRB bits define the order 0 message, m0.
|
||||
! Encode m0 using the modified generator matrix to find the "order 0" codeword.
|
||||
! Flip various combinations of bits in m0 and re-encode to generate a list of
|
||||
! codewords. Test all such codewords against the received word to decide which
|
||||
! codeword is most likely to be correct.
|
||||
|
||||
hdec=hdec(indices) ! hard decisions from received symbols
|
||||
m0=hdec(1:K) ! zero'th order message
|
||||
absrx=absrx(indices)
|
||||
rx=rx(indices)
|
||||
|
||||
s1=sum(absrx(1:K))
|
||||
s2=sum(absrx(K+1:N))
|
||||
xlam=7.0 ! larger values reject more error patterns
|
||||
rho=s1/(s1+xlam*s2)
|
||||
call mrbencode(m0,c0,g2,N,K)
|
||||
nxor=ieor(c0,hdec)
|
||||
nhardmin=sum(nxor)
|
||||
dmin=sum(nxor*absrx)
|
||||
thresh=rho*dmin
|
||||
|
||||
cw=c0
|
||||
nt=0
|
||||
nrejected=0
|
||||
do iorder=1,norder
|
||||
mi(1:K-iorder)=0
|
||||
mi(K-iorder+1:K)=1
|
||||
iflag=0
|
||||
do while(iflag .ge. 0 )
|
||||
dpat=sum(mi*absrx(1:K))
|
||||
nt=nt+1
|
||||
if( dpat .lt. thresh ) then ! reject unlikely error patterns
|
||||
me=ieor(m0,mi)
|
||||
call mrbencode(me,ce,g2,N,K)
|
||||
nxor=ieor(ce,hdec)
|
||||
dd=sum(nxor*absrx)
|
||||
if( dd .lt. dmin ) then
|
||||
dmin=dd
|
||||
cw=ce
|
||||
nhardmin=sum(nxor)
|
||||
thresh=rho*dmin
|
||||
endif
|
||||
else
|
||||
nrejected=nrejected+1
|
||||
endif
|
||||
! get the next test error pattern, iflag will go negative
|
||||
! when the last pattern with weight iorder has been generated
|
||||
call nextpat(mi,k,iorder,iflag)
|
||||
enddo
|
||||
enddo
|
||||
|
||||
!write(*,*) 'nhardmin ',nhardmin
|
||||
!write(*,*) 'total patterns ',nt,' number rejected ',nrejected
|
||||
|
||||
! re-order the codeword to place message bits at the end
|
||||
cw(indices)=cw
|
||||
hdec(indices)=hdec
|
||||
decoded=cw(M+1:N)
|
||||
cw(colorder+1)=cw ! put the codeword back into received-word order
|
||||
return
|
||||
end subroutine osd174
|
||||
|
||||
subroutine mrbencode(me,codeword,g2,N,K)
|
||||
integer*1 me(K),codeword(N),g2(N,K)
|
||||
! fast encoding for low-weight test patterns
|
||||
codeword=0
|
||||
do i=1,K
|
||||
if( me(i) .eq. 1 ) then
|
||||
codeword=ieor(codeword,g2(1:N,i))
|
||||
endif
|
||||
enddo
|
||||
return
|
||||
end subroutine mrbencode
|
||||
|
||||
subroutine nextpat(mi,k,iorder,iflag)
|
||||
integer*1 mi(k),ms(k)
|
||||
! generate the next test error pattern
|
||||
ind=-1
|
||||
do i=1,k-1
|
||||
if( mi(i).eq.0 .and. mi(i+1).eq.1) ind=i
|
||||
enddo
|
||||
if( ind .lt. 0 ) then ! no more patterns of this order
|
||||
iflag=ind
|
||||
return
|
||||
endif
|
||||
ms=0
|
||||
ms(1:ind-1)=mi(1:ind-1)
|
||||
ms(ind)=1
|
||||
ms(ind+1)=0
|
||||
if( ind+1 .lt. k ) then
|
||||
nz=iorder-sum(ms)
|
||||
ms(k-nz+1:k)=1
|
||||
endif
|
||||
mi=ms
|
||||
iflag=ind
|
||||
return
|
||||
end subroutine nextpat
|
||||
@@ -0,0 +1,22 @@
|
||||
/*=============================================================================
|
||||
Copyright (c) 2015 Kohei Takahashi
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
==============================================================================*/
|
||||
|
||||
#ifndef BOOST_FUSION_SUPPORT_DETAIL_ENABLER_12102015_0346
|
||||
#define BOOST_FUSION_SUPPORT_DETAIL_ENABLER_12102015_0346
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
namespace boost { namespace fusion { namespace detail
|
||||
{
|
||||
|
||||
struct enabler_ {};
|
||||
BOOST_STATIC_CONSTEXPR enabler_ enabler = {};
|
||||
|
||||
}}}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
|
||||
#ifndef BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
|
||||
#define BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
|
||||
|
||||
// Copyright Paul Mensonides 2003
|
||||
// Copyright Aleksey Gurtovoy 2003-2004
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/mpl for documentation.
|
||||
|
||||
// $Id$
|
||||
// $Date$
|
||||
// $Revision$
|
||||
|
||||
#include <boost/preprocessor/seq/size.hpp>
|
||||
#include <boost/preprocessor/arithmetic/dec.hpp>
|
||||
#include <boost/preprocessor/punctuation/paren.hpp>
|
||||
#include <boost/preprocessor/cat.hpp>
|
||||
#include <boost/preprocessor/config/config.hpp>
|
||||
|
||||
// returns 1 if 'seq' is a PP-sequence, 0 otherwise:
|
||||
//
|
||||
// BOOST_PP_ASSERT( BOOST_PP_NOT( BOOST_MPL_PP_IS_SEQ( int ) ) )
|
||||
// BOOST_PP_ASSERT( BOOST_MPL_PP_IS_SEQ( (int) ) )
|
||||
// BOOST_PP_ASSERT( BOOST_MPL_PP_IS_SEQ( (1)(2) ) )
|
||||
|
||||
#if (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()) || defined(_MSC_VER) && defined(__INTEL_COMPILER) && __INTEL_COMPILER == 1010
|
||||
|
||||
# define BOOST_MPL_PP_IS_SEQ(seq) BOOST_PP_DEC( BOOST_PP_SEQ_SIZE( BOOST_MPL_PP_IS_SEQ_(seq) ) )
|
||||
# define BOOST_MPL_PP_IS_SEQ_(seq) BOOST_MPL_PP_IS_SEQ_SEQ_( BOOST_MPL_PP_IS_SEQ_SPLIT_ seq )
|
||||
# define BOOST_MPL_PP_IS_SEQ_SEQ_(x) (x)
|
||||
# define BOOST_MPL_PP_IS_SEQ_SPLIT_(unused) unused)((unused)
|
||||
|
||||
#else
|
||||
|
||||
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
|
||||
# define BOOST_MPL_PP_IS_SEQ(seq) BOOST_MPL_PP_IS_SEQ_MWCC_((seq))
|
||||
# define BOOST_MPL_PP_IS_SEQ_MWCC_(args) BOOST_MPL_PP_IS_SEQ_ ## args
|
||||
# else
|
||||
# define BOOST_MPL_PP_IS_SEQ(seq) BOOST_MPL_PP_IS_SEQ_(seq)
|
||||
# endif
|
||||
|
||||
# define BOOST_MPL_PP_IS_SEQ_(seq) BOOST_PP_CAT(BOOST_MPL_PP_IS_SEQ_, BOOST_MPL_PP_IS_SEQ_0 seq BOOST_PP_RPAREN())
|
||||
# define BOOST_MPL_PP_IS_SEQ_0(x) BOOST_MPL_PP_IS_SEQ_1(x
|
||||
# define BOOST_MPL_PP_IS_SEQ_ALWAYS_0(unused) 0
|
||||
# define BOOST_MPL_PP_IS_SEQ_BOOST_MPL_PP_IS_SEQ_0 BOOST_MPL_PP_IS_SEQ_ALWAYS_0(
|
||||
# define BOOST_MPL_PP_IS_SEQ_BOOST_MPL_PP_IS_SEQ_1(unused) 1
|
||||
|
||||
#endif
|
||||
|
||||
#endif // BOOST_MPL_AUX_PREPROCESSOR_IS_SEQ_HPP_INCLUDED
|
||||
Reference in New Issue
Block a user