netlhx 发表于 2016-12-23 14:42:17

【UP BOARD试用】点灯(WINDOWS版)

本帖最后由 netlhx 于 2016-12-23 15:12 编辑

WINDOWS下点灯的程序,在WINDOWS IOT系统里面比较常见,因为提供了相应的SDK。

UP上的GPIO分布图



WINDOWS 10下准备来尝试点个灯,翻遍了论坛,只找到一个例程叫DIO,而且代码也没有,只有一个DLL,好在提供了例程,参考着做了个非常丑陋的通用点灯程序。



程序界面,用的是C#写的,因为大家都是X86架构,所以也就没有什么交叉编译的说法了,直接在自用的电脑上面写,写好了复制到UP上就可以使用了。



亮灯



灭灯

由于没有提供完整的源代码,只好参考例程代码,凑合着写,界面用的是WPF,网格布局,一个网格里放一个控件。

上点关键代码       public MainWindow()
      {
            InitializeComponent();

            UInt32 err = EApiLibInitialize();

            if (err != EAPI.EAPI_STATUS_INITIALIZED)
            {
                MessageBox.Show("Error Initializing Device!");
                return;
            }

            for (int k = 0; k < 40; k++)
            {
                EApiGPIOGetCaps(EAPI.EAPI_GPIO_GPIO_ID((UInt32)k), ref nPinCount, ref bDioDisable);
                if (bDioDisable != 0x01)
                {
                  gpioPinCombo.Items.Add("GPIO-" + k);
                  EApiGPIOSetDirection((uint)k, 0xFFFFFFFF, EAPI.EAPI_GPIO_OUTPUT);
                }
            }

            gpioPinCombo.SelectedIndex = 0;




      }

      ~MainWindow()
      {

            EApiLibUnInitialize();
      }

      private void gpioPinCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
      {

            

            string pinName = (((ComboBox)sender).SelectedItem.ToString()).Split('-');
            uint p = Convert.ToUInt32(pinName);
            UpdateStatus(p);

      }

      private void UpdateStatus(uint p)
      {
            UInt32 err = EAPI.EAPI_STATUS_SUCCESS;
            UInt32 bInput = 0x00;
            UInt32 bHigh = 0x00;

            err = EApiGPIOGetDirection(p, 0xFFFFFFFF, ref bInput);

            if (err != EAPI.EAPI_STATUS_SUCCESS)
            {
                MessageBox.Show("Read GPIO Failure!");
                return;
            }

            if (bInput == 1)
                gpioDirLabel.Content = "Dir: INPUT";
            else
                gpioDirLabel.Content = "Dir: OUTPUT";

            //LEVEL UPDATE

            err = EApiGPIOGetLevel(p, 0xFFFFFFFF, ref bHigh);

            if (err != EAPI.EAPI_STATUS_SUCCESS)
            {
                MessageBox.Show("Read GPIO Failure!");
                return;
            }

            if (bHigh == 1)
                gpioStatusLabel.Content = "LEVEL: HIGH";
            else
                gpioStatusLabel.Content = "LEVEL: LOW";
      }

      private void toggleButton_Click(object sender, RoutedEventArgs e)
      {

            string pinName = (gpioPinCombo.SelectedItem.ToString()).Split('-');
            uint p = Convert.ToUInt32(pinName);
            uint level = 0;
            EApiGPIOGetLevel(p, 0xFFFFFFFF, ref level);
            if (level == 0)
                EApiGPIOSetLevel(p, 0xFFFFFFFF, EAPI.EAPI_GPIO_HIGH);
            else
                EApiGPIOSetLevel(p, 0xFFFFFFFF, EAPI.EAPI_GPIO_LOW);
            UpdateStatus(p);
      }
    }
}凑合着看吧。

附可用的执行文件包:



还有论坛上面的讨论,大家去看看,有什么好的资源再大家一起研究吧。

https://up-community.org/forum/ms-windows/827-gpio-drivers-for-windows-10


jackten 发表于 2016-12-23 14:58:47

谢谢分享                     

michael_llh 发表于 2016-12-23 15:52:37

恩,可以,确实没有尝试过在windows底下控制硬件

zhujiefeng 发表于 2019-8-27 15:24:55

请问最前面的EAPI是什么意思

zhujiefeng 发表于 2019-8-27 15:25:58

jackten 发表于 2016-12-23 14:58
谢谢分享

请问最前面的EAPI是什么意思
页: [1]
查看完整版本: 【UP BOARD试用】点灯(WINDOWS版)