public static bool Init()
        {
            if (F1500 == null)
            {
                Flex1500USB.D_ATTACH_DETACH_CALLBACK attach = attachCallback;
                Flex1500USB.D_ATTACH_DETACH_CALLBACK detach = detachCallback;
                F1500 = new Flex1500USB(attach, detach);
                Thread.Sleep(1000);
            }

            foreach (IntPtr key in Flex1500USB.radioArray.Keys)
            {
                string sn = "";
                Flex1500USB.radioArray[key].GetSerialNumber(out sn);

                if (sn == PROD_TEST_SN)
                {
                    if (prod_test == IntPtr.Zero)
                    {
                        prod_test = key;
                        PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK       stub_cb_del   = CallbackStub;
                        PowerSDR.Flex1500USB.D_INTERCHANGE_BUFFER_CALLBACK AudioCallback = AudioCallbackStub;
                        Flex1500USB.radioArray[prod_test].Init(CallbackStub, CallbackStub, CallbackStub, CallbackStub, AudioCallback, true, false, true, (uint)Audio.BlockSize);

                        // set gen to 10MHz
                        Flex1500USB.radioArray[prod_test].WriteOp((uint)USBHID.Opcode.USB_OP_SET_RX1_FREQ_TW, 0x6AAAAAA, 0);
                    }
                }
            }

            return(true);
        }
        /*// cleanup previous active radio
         * if (r != IntPtr.Zero)
         * {
         *  Flex1500USB.radioArray[r].StopAudioListener();
         *  Flex1500USB.radioArray[r].StopListener();
         * }
         *
         * bool found = false;
         * foreach (IntPtr key in Flex1500USB.radioArray.Keys)
         * {
         *  string serial = "";
         *  Flex1500USB.radioArray[key].GetSerialNumber(out serial);
         *  if (sn == serial)
         *  {
         *      found = true;
         *
         *      r = key;
         *      PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK PTT_Callback = MicPTT;
         *      PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK FlexPTT_Callback = FlexPTT;
         *      PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK Dash_Callback = Dash;
         *      PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK Dot_Callback = Dot;
         *      PowerSDR.Flex1500USB.D_INTERCHANGE_BUFFER_CALLBACK AudioCallback = Audio.Callback1500;
         *      Flex1500USB.radioArray[r].Init(MicPTT, FlexPTT, Dash, Dot, AudioCallback, true, false, false, (uint)Audio.BlockSize);
         *      break;
         *  }
         * }
         *
         * return found;
         * }*/

        public static bool SetActiveRadio(IntPtr key)
        {
            if (!Flex1500USB.radioArray.ContainsKey(key))
            {
                return(false);
            }
            r = key;
            PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK       PTT_Callback     = MicPTT;
            PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK       FlexPTT_Callback = FlexPTT;
            PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK       Dash_Callback    = Dash;
            PowerSDR.Flex1500USB.D_STATE_CHANGE_CALLBACK       Dot_Callback     = Dot;
            PowerSDR.Flex1500USB.D_INTERCHANGE_BUFFER_CALLBACK AudioCallback    = Audio.Callback1500;
            Flex1500USB.radioArray[r].Init(MicPTT, FlexPTT, Dash, Dot, AudioCallback, true, false, true, (uint)Audio.BlockSize);
            return(true);
        }