回头看——《智能家居项目小结》2

1.增加platform

在项目需求中需要控制硬件的风扇,马达,蜂鸣器,LED,在驱动编写时,是将其分开编写的,每个部件分别编写了字符设备驱动。

在应用层程序编写过程中,需要获取较多的文件描述符,其实应该使用platform设备平台的思想来编写,在具体实现中在ioctl里对应用层命令switch判断

设备树文件添加
myplatform{
    compatible = "hqyj,myplatform";
    led1 = <&gpioe 10 0>;
    led2 = <&gpiof 10 0>;
    led3 = <&gpioe 8 0>;
    fan = <&gpioe 9 0>;
    motor = <&gpiof 6 0>;
    buzzer = <&gpiob 6 0>;
};

2.应用层程序spi线程显示代码优化

原代码
void *pthread_spi(void *arg)
{
    msg_t *recvmsg = (msg_t *)arg;
    int fd;
    fd = open("/dev/myspi", O_RDWR);
    if (-1 == fd)
    {
        ERR_MSG("open");
        return NULL;
    }

    while (1)
    {
        if (recvmsg->type & SPI_EN)
        {
            if (recvmsg->type & TEMP)
            {
                unsigned char str[8] = {
                    [0] = ledpos[0],
                    [1] = leddata[(int)temp / 10 % 10],
                    [2] = ledpos[1],
                    [3] = leddata[(int)temp % 10] | 0x80,
                    [4] = ledpos[2],
                    [5] = leddata[(int)(temp * 10) % 10],
                    [6] = ledpos[3],
                    [7] = leddata[(int)(temp * 100) % 10],
                };
                ioctl(fd, IO_SPI_WRITE, str);
            }
            else if (recvmsg->type & HUMI)
            {
                unsigned char str[8] = {
                    [0] = ledpos[0],
                    [1] = leddata[(int)humi / 10 % 10],
                    [2] = ledpos[1],
                    [3] = leddata[(int)humi % 10] | 0x80,
                    [4] = ledpos[2],
                    [5] = leddata[(int)(humi * 10) % 10],
                    [6] = ledpos[3],
                    [7] = leddata[(int)(humi * 100) % 10],
                };
                ioctl(fd, IO_SPI_WRITE, str);
            }
            else if (recvmsg->type & SPI_SET)
            {
                unsigned char str[8] = {
                    [0] = ledpos[0],
                    [1] = leddata[recvmsg->spi_set / 1000],
                    [2] = ledpos[1],
                    [3] = leddata[recvmsg->spi_set / 100 % 10],
                    [4] = ledpos[2],
                    [5] = leddata[recvmsg->spi_set / 10 % 10],
                    [6] = ledpos[3],
                    [7] = leddata[recvmsg->spi_set % 10],
                };
                ioctl(fd, IO_SPI_WRITE, str);
            }
        }
        else if (recvmsg->type & SPI_UN)
        {
            ioctl(fd, IO_SPI_ZERO);
        }
    }
}
优化后:
void *pthread_spi(void *arg)
{
    msg_t *recvmsg = (msg_t *)arg;
    unsigned char str[8] = {ledpos[0], 0, ledpos[1], 0, ledpos[2], 0, ledpos[3], 0};
    int fd = open("/dev/myspi", O_RDWR);
    if (-1 == fd)
    {
        ERR_MSG("open");
        return NULL;
    }

    while (1)
    {
        if (recvmsg->type & SPI_EN)
        {
            if (recvmsg->type & TEMP)
            {
                str[1] = leddata[(int)temp / 10 % 10];
                str[3] = leddata[(int)temp % 10] | 0x80;
                str[5] = leddata[(int)(temp * 10) % 10];
                str[7] = leddata[(int)(temp * 100) % 10];
                ioctl(fd, IO_SPI_WRITE, str);
            }
            else if (recvmsg->type & HUMI)
            {
                str[1] = leddata[(int)humi / 10 % 10];
                str[3] = leddata[(int)humi % 10] | 0x80;
                str[5] = leddata[(int)(humi * 10) % 10];
                str[7] = leddata[(int)(humi * 100) % 10];
                ioctl(fd, IO_SPI_WRITE, str);
            }
            else if (recvmsg->type & SPI_SET)
            {
                str[1] = leddata[recvmsg->spi_set / 1000];
                str[3] = leddata[recvmsg->spi_set / 100 % 10];
                str[5] = leddata[recvmsg->spi_set / 10 % 10];
                str[7] = leddata[recvmsg->spi_set % 10];
                ioctl(fd, IO_SPI_WRITE, str);
            }
        }
        else if (recvmsg->type & SPI_UN)
        {
            str[1] = 0x00;
            str[3] = 0x00;
            str[5] = 0x00;
            str[7] = 0x00;
            ioctl(fd, IO_SPI_ZERO,str);
        }
    }
}

在简洁方面,进行优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值