找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 12936|回复: 15

[外设交流] 菜鸟谈谈FSX外设程序(一)

  [复制链接]
发表于 2013-9-30 22:23:39 | 显示全部楼层 |阅读模式
本帖最后由 prius0304 于 2013-9-30 22:25 编辑

菜鸟谈谈FSX外设程序(一)

由于特别想做一些外设,于是就误打误撞的开始DIY。

高三真的相当的苦逼,两周放一天假,今天终于放假了,能好好调调FSX读取数据的问题了。



以前一直在看FSUIPC导出FSX数据的方法,但苦于国内网络的问题,用爪机上国外的论坛实在是苦不堪言。好不容易看了几天的FSUIPC手册,大概了解了流程,于是找到了Peter(FSUIPC的开发者。其实我也叫Peter蛤蛤!)下载了一份Sample,又在临睡前扫了一遍,无奈写的实在是太乱,我无从下手修改或者重写。又找到一个台湾朋友,写的C读取NAV数据,直接串口给Arduino,觉得不错,想改,但效果并不理想,于是开始从新搜索。



外国的月亮总比中国的圆?Google搜了一下,就找到了Jim的程序,打开看了一下,豁然开朗。

由于本人是NOIP退役狗,所以面向对象基本还停留在凑活抄抄看看能写水平,所以暂且都用VB.NET做测试。



Jim没有用FSUIPC做管道,而是用了Fsx自带的Microsoft.FlightSimulator.SimConnect作为管道输出数据,这就大大提供了方便,因为杀千刀的微软是有MSDN滴,MSDN的地址是:http://msdn.microsoft.com/zh-cn/library/cc526983.aspx#FacilitiesDataSample


测试了一下,完全没有问题,但这个代码就写的简单多了,很容易理解。后来看了一下SimConnect,其实它的功能一点也不少,简单的外设靠它完全足以使用,譬如做一个MCP,做一个头瞄,都是完全没有问题的。由于原来的UI很丑(大概程序猿们都不怎么会写界面),再加上没有办法手动输入我们的NAV和应答机的值,我就稍稍的修改了一下代码。下面是测试。





这样子我们的读取程序就有了最直接的接口给我们的上位机做串口通信,如果是MCP的话只需要从Arduino发送出字串我们读取一下就可以直接修改textbox的值做到同步了。

当然,我现在没时间做MCP,做MCP东西比较多,高三狗晚上十点多才到家,不可能有时间做这个,所以想试试看做头瞄,开始研究MPU6050陀螺仪,这个比较小,比较好藏蛤蛤。





说实话,因为6050出来时间不长,网上根本找不到比较直接的资料,很头大,但最终还是找到了上面这个用Processing做互动的测试程序,好歹也是能够抄袭一下算法,把姿态给算出来。这几天抽空的话尽量用VB实现姿态的读取,然后给上位机做传输,当然数据的读写也是写完的了。



无标题.jpg


其他的只要把三样整合到一起,头瞄就能做完了。这样算下来,一个头瞄才九十块钱左右,一个MCP的价格么(还是不说的好,毕竟可爱的SINO出售MCP的,但亚克力的面板真的很便宜蛤蛤)……



说了半天,贴源码,这种东西我也不想藏着掖着,好歹我也是开源支持者。。。



读取FSX数据(VB.NET):



Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports Microsoft.FlightSimulator.SimConnect
Imports System.Runtime.InteropServices
Imports System.Net.Sockets
Imports System.Net
'Date 24-11-11 all going fine


Partial Public Class Form1
    Inherits Form
    Dim fsx_simconnect As SimConnect
    Const WM_USER_SIMCONNECT As Integer = &H402


    Public Enum hSimconnect
        group1
    End Enum


    Private Enum EVENT_ID
        EVENT_FLAPSup
        EVENT_FLAPSdn
        EVENT_COM1co
        EVENT_COM1SBset
        EVENT_XPONDer
        EVENT_NAV1OBS
        EVENT_APon
        EVENT_APoff
        EVENT_LIGHTSset
    End Enum


    Private Enum DEFINITIONS
        Struct1
    End Enum


    Private Enum DATA_REQUESTS
        REQUEST_1
    End Enum


    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> _
     Structure Struct1
        Public flapsx As Single
        Public altitudex As Single
        Public IASx As Single
        Public com1x As Single
        Public com1sbx As Single
        Public xponderx As Single
        Public nav1obsx As Single
        Public aponoffx As Single
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=256)> Public Titlex As String
    End Structure


    Public Sub New()
        InitializeComponent()
    End Sub


    Protected Overrides Sub DefWndProc(ByRef m As Message)
        If m.Msg = WM_USER_SIMCONNECT Then
            If fsx_simconnect IsNot Nothing Then
                fsx_simconnect.ReceiveMessage()
            End If
        Else
            MyBase.DefWndProc(m)
        End If
    End Sub


    Dim hr As Long
    Dim flaps As String
    Dim altitude As String
    Dim ias As String
    Dim com1 As String
    Dim com1sb As String
    Dim xponder As String
    Dim nav1obs As String
    Dim freq As String
    Dim aponoff As String
    Dim titleout As String


    Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If fsx_simconnect Is Nothing Then
            Try
                fsx_simconnect = New SimConnect("jims8buttons", Me.Handle, WM_USER_SIMCONNECT, Nothing, 0)


                AddHandler fsx_simconnect.OnRecvOpen, New SimConnect.RecvOpenEventHandler(AddressOf simconnect_OnRecvOpen)
                AddHandler fsx_simconnect.OnRecvQuit, New SimConnect.RecvQuitEventHandler(AddressOf simconnect_OnRecvQuit)


                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_FLAPSup, "FLAPS_UP")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_APon, "AUTOPILOT_ON")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_APoff, "AUTOPILOT_OFF")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_LIGHTSset, "ALL_LIGHTS_TOGGLE")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_FLAPSdn, "FLAPS_DOWN")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_COM1co, "COM_STBY_RADIO_SWAP")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_COM1SBset, "COM_STBY_RADIO_SET")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_XPONDer, "XPNDR_SET")
                fsx_simconnect.MapClientEventToSimEvent(EVENT_ID.EVENT_NAV1OBS, "VOR1_SET")


                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "TRAILING EDGE FLAPS LEFT PERCENT", "degrees", SIMCONNECT_DATATYPE.FLOAT32, 0, 0)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Indicated Altitude", "feet", SIMCONNECT_DATATYPE.FLOAT32, 0, 1)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Airspeed Indicated", "knots", SIMCONNECT_DATATYPE.FLOAT32, 0, 2)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "COM ACTIVE FREQUENCY:1", "MHz", SIMCONNECT_DATATYPE.FLOAT32, 0, 3)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "COM STANDBY FREQUENCY:1", "MHz", SIMCONNECT_DATATYPE.FLOAT32, 0, 4)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "TRANSPONDER CODE:1", "Enum", SIMCONNECT_DATATYPE.FLOAT32, 0, 5)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "NAV OBS:1", "degrees", SIMCONNECT_DATATYPE.FLOAT32, 0, 6)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "AUTOPILOT MASTER", "Bool", SIMCONNECT_DATATYPE.FLOAT32, 0, 7)
                fsx_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Title", "", SIMCONNECT_DATATYPE.STRING256, 0, 8)


                fsx_simconnect.RegisterDataDefineStruct(Of Struct1)(DEFINITIONS.Struct1)


                AddHandler fsx_simconnect.OnRecvSimobjectData, New SimConnect.RecvSimobjectDataEventHandler(AddressOf simconnect_OnRecvSimobjectData)
                fsx_simconnect.RequestDataOnSimObject(DATA_REQUESTS.REQUEST_1, DEFINITIONS.Struct1, SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.VISUAL_FRAME, 0, 0, 0, 0)
                Button1.Text = "Disconnect"


            Catch ex As COMException
                TextBox1.Text = "Unable to Connect"
            End Try
        Else
            Button1.Text = "Connect"
            TextBox1.Text = "Disconnected"
            TextBox2.Text = ""
            TextBox3.Text = ""
            TextBox4.Text = ""
            TextBox5.Text = ""
            TextBox6.Text = ""
            TextBox7.Text = ""
            TextBox8.Text = ""
            TextBox9.Text = ""
            fsx_simconnect.Dispose()
            fsx_simconnect = Nothing
        End If
    End Sub


    Private Sub simconnect_OnRecvSimobjectData(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV_SIMOBJECT_DATA)
        Select Case CType(data.dwRequestID, DATA_REQUESTS)
            Case DATA_REQUESTS.REQUEST_1
                Dim s1 As Struct1 = CType(data.dwData(0), Struct1)
                flaps = [String].Format("{0:000}", s1.flapsx)
                altitude = [String].Format("{0:00000}", s1.altitudex)
                ias = [String].Format("{0:000}", s1.IASx)
                com1 = [String].Format("{0:00.000}", s1.com1x)
                com1sb = [String].Format("{0:00.000}", s1.com1sbx)
                xponder = [String].Format("{0:0000}", s1.xponderx)
                nav1obs = [String].Format("{0:000}", s1.nav1obsx)
                aponoff = [String].Format("{0:0}", s1.aponoffx)
                titleout = s1.Titlex
                TextBox2.Text = flaps
                TextBox3.Text = altitude
                TextBox4.Text = ias
                TextBox5.Text = com1
                TextBox6.Text = com1sb
                TextBox7.Text = xponder
                TextBox8.Text = nav1obs
                TextBox9.Text = titleout
                If aponoff = 1 Then Button3.Text = "Autopilot ON" Else Button3.Text = "Autopilot OFF"
                Exit Select
            Case Else
                TextBox1.Text = "Unknown request ID: " & Convert.ToString(data.dwRequestID)
                Exit Select
        End Select
    End Sub


    Private Sub simconnect_OnRecvException(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV_EXCEPTION)
        TextBox1.Text = "Exception received:"
    End Sub


    Private Sub simconnect_OnRecvQuit(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV)
        TextBox1.Text = "Disconnected from FSX"
        button1.Text = "Connect"
        fsx_simconnect.Dispose()
        fsx_simconnect = Nothing
    End Sub


    Private Sub simconnect_OnRecvOpen(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV_OPEN)
        TextBox1.Text = "Connected to FSX"
        button1.Text = "Disconnect"
    End Sub


    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        On Error Resume Next
        If flaps > 20 Then fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_FLAPSup, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
        If flaps < 20 Then fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_FLAPSdn, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        On Error Resume Next
        If aponoff = 0 Then fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_APon, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
        If aponoff = 1 Then fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_APoff, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        On Error Resume Next
        fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_LIGHTSset, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        On Error Resume Next
        fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_COM1co, 0, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        On Error Resume Next
        Dim tempCom As String
        tempCom = TextBox10.Text
        tempCom = Replace(tempCom, ".", "")
        fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_COM1SBset, "&H" & tempCom, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
        On Error Resume Next
        Dim tempTransMitClientEvent As String
        tempTransMitClientEvent = TextBox11.Text
        fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_XPONDer, "&H" & tempTransMitClientEvent, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)
    End Sub


    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
        On Error Resume Next
        Dim tempTransMit As String
        tempTransMit = TextBox12.Text
        fsx_simconnect.TransmitClientEvent(DEFINITIONS.Struct1, EVENT_ID.EVENT_NAV1OBS, tempTransMit, hSimconnect.group1, SIMCONNECT_EVENT_FLAG.GROUPID_IS_PRIORITY)


    End Sub
    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        If fsx_simconnect IsNot Nothing Then
            fsx_simconnect.Dispose()
            fsx_simconnect = Nothing
            MsgBox("SimConnect has been closed.")
        End If
    End Sub


    Private Sub TextBox10_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox10.MouseClick
        TextBox10.Text = ""
    End Sub
    Private Sub TextBox11_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox11.MouseClick
        TextBox11.Text = ""
    End Sub
    Private Sub TextBox12_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox12.MouseClick
        TextBox12.Text = ""
    End Sub
End Class

UI看视频了,我就不发了。
如果要6050读取姿态的程序,大家可以去网上搜一下弘毅的Processing姿态读取,按照这个理念改一下很好做的,还有问题可以找我,QQ(常年不在,高三狗):631136257


这是菜鸟谈谈上位机程序(一),如果头瞄做完的话,我会贴二给大家看的。


发表于 2013-9-30 22:26:00 | 显示全部楼层
技术贴!{:soso_e179:}

点评

嘿嘿,谢谢大神!好久没和你飞了。。。我就是6833啊、、、  发表于 2013-9-30 22:27
回复

使用道具 举报

发表于 2013-9-30 22:38:41 | 显示全部楼层
面向对象语言编写的?我看见了 “类”。。

点评

蛤蛤,当然,vb.net啊!不怎么会写面向,瞎写写。OI退役狗,手痒痒写点东西玩玩而已。  发表于 2013-9-30 22:41
回复

使用道具 举报

发表于 2013-9-30 22:41:37 | 显示全部楼层
有C#版的吗?

点评

同样的界面功能,剩下的自己开发吧,主要提供了个最简单的模版基础,看看学学蛮好的。C#本来想学的,结果看了些书有点怕了。蛤蛤。  发表于 2013-9-30 22:45
我记得JIM那里是有的,我帮你看一下吧。同样是SimConnect不是FSUIPC,稍等。http://www.jimspage.co.nz/fsxfs9inouts.htm 有的有的,都在这里了,自己去看看吧。  发表于 2013-9-30 22:43
回复

使用道具 举报

发表于 2013-9-30 22:47:18 | 显示全部楼层
我看见枚举,看见类了,不过你这个都集成在一个方法里了

点评

微机老师叫我学,我一看啥COM+立马软掉。。。对象还刚学,我和老师一说算法他就软,嘿嘿。  发表于 2013-9-30 22:54
C#不难学,挺简单的  发表于 2013-9-30 22:50
这个大部分都是抄过来的,我基本都没动,找这个的原因主要是知道到底怎么和FSX取得互动,不然下面东西都不好做嘿嘿。C Sharp在上面注意抄收。  发表于 2013-9-30 22:49
回复

使用道具 举报

发表于 2013-10-1 16:17:18 | 显示全部楼层
本帖最后由 abccsss 于 2013-10-1 16:20 编辑

看上去很简洁方便的样子!
原来用 Microsoft.Office.Interop 里面的东西写过关于 Office 的程序,
这个看上去不错!只不过不知道改的了界面不。
如果可以的话,一定得整个 Win8 风格的界面。    /* 特别是 Shift+Z 里面的东西,早就看不惯了 */

点评

嘿嘿!对的,现在已经把仪表写了,在1602液晶上显示了。下来赶紧做头瞄,开学前搞定,开源,让大家都用上。  发表于 2013-10-1 23:06
回复

使用道具 举报

发表于 2013-10-1 17:12:06 | 显示全部楼层
高三能有这水平 很牛了 赞一个

点评

玩玩而已,只打算做兴趣爱好。想读机务,啦啦啦!  发表于 2013-10-1 23:07
回复

使用道具 举报

发表于 2013-10-1 23:25:25 | 显示全部楼层
完全不懂啊,楼主是人才!

点评

学习下,很快就懂得。做出来了可以教你们自己做,很简单的东西。  发表于 2013-10-1 23:53
回复

使用道具 举报

发表于 2013-10-31 14:44:46 | 显示全部楼层
看不懂 楼主果然厉害
回复

使用道具 举报

发表于 2015-2-14 20:48:49 | 显示全部楼层
很专业啊,看起来代码比较费劲
回复

使用道具 举报

 楼主| 发表于 2015-2-15 20:53:26 | 显示全部楼层
myfeier 发表于 2015-2-14 20:48
很专业啊,看起来代码比较费劲

FUSIPC要比Simconnect方便的多。
回复

使用道具 举报

发表于 2015-3-20 08:47:47 | 显示全部楼层
楼主应该上大学了吧,进展怎么样?
回复

使用道具 举报

 楼主| 发表于 2015-3-22 10:51:49 | 显示全部楼层
luvefly 发表于 2015-3-20 08:47
楼主应该上大学了吧,进展怎么样?

可以进群 90997275。已经到了PCB打样的程度了。
回复

使用道具 举报

发表于 2015-4-12 11:46:11 | 显示全部楼层
楼主继续发点资料吧~我很想自己diy~
回复

使用道具 举报

 楼主| 发表于 2015-4-27 12:51:38 | 显示全部楼层
cxy188003 发表于 2015-4-12 11:46
楼主继续发点资料吧~我很想自己diy~

可以进群 90997275。已经到了PCB打样的程度了。
回复

使用道具 举报

发表于 2015-4-29 22:15:11 | 显示全部楼层
绝对是超级大手级别的了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表