# 微算機期末專案報告文檔
## 架構圖

## python flask+ngrok
https://colab.research.google.com/drive/1ilHqHKBFiekiIuFoh0_3OYH1chBUfBZB?usp=sharing
## TX2-上面執行的code
```cpp=
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
#include <map>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <bitset>
using namespace std;
int gpio_export(unsigned int gpio){
int fd,len;
char buf[64];
fd = open("/sys/class/gpio/export",O_WRONLY);
if(fd<0){
perror("gpio/export");
return fd;
}
len = snprintf(buf,sizeof(buf),"%d",gpio);
write(fd,buf,len);
close(fd);
return 0;
}
int gpio_unexport(unsigned int gpio){
int fd,len;
char buf[64];
fd = open("/sys/class/gpio/unexport",O_WRONLY);
if(fd<0){
perror("gpio/export");
return fd;
}
len = snprintf(buf,sizeof(buf),"%d",gpio);
write(fd,buf,len);
close(fd);
return 0;
}
int gpio_set_dir(unsigned int gpio,std::string dirStatus){
int fd;
char buf[64];
snprintf(buf,sizeof(buf),"/sys/class/gpio/gpio%d/direction",gpio);
fd = open(buf,O_WRONLY);
if(fd<0){
perror("gpio/direction");
return fd;
}
if(dirStatus == "out")
write(fd,"out",4);
else
write(fd,"in",3);
}
int gpio_set_value(unsigned int gpio, int value) {
int fd;
char buf[64];
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/set-value");
return fd;
}
if(value == 0)
write(fd,"0",2);
else
write(fd,"1",2);
close(fd);
return 0;
}
void setGPIO(unsigned int gpio, string status)
{
std::cout<<status<<endl;
int io;
gpio_export(gpio);
gpio_set_dir(gpio,"out");
FILE *fp = fopen("/dev/gpio","w+");
if (fp ==NULL) {
perror("gpio error");
return;
}
char buf[1000] = "1234567";
if (status == "on") {
sprintf(buf,"%d %s",gpio,"1");
//strcpy(buf, (to_string(gpio) + "1").c_str());
}
else {
sprintf(buf,"%d %s",gpio,"0");
//strcpy(buf, (to_string(gpio) + "0").c_str());
}
std::cout<<*buf;
fwrite( buf,sizeof(buf), 1,fp);
fclose(fp);
return;
}
int getGPIO(unsigned int gpio)
{
int io;
//gpio_export(gpio);
//gpio_set_dir(gpio,"out");
char buf[64];
char buffer[1024];
snprintf(buf, sizeof(buf), "/sys/class/gpio/gpio%d/value", gpio);
int fd = open(buf,O_RDONLY);
ssize_t bytesRead = read(fd,buffer,sizeof(buffer));
return buffer[0]-'0';
}
#include <curl/curl.h>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response)
{
size_t totalSize = size * nmemb;
response->append(static_cast<char*>(contents), totalSize);
return totalSize;
}
int GetFormApi(){
// Initialize CURL
curl_global_init(CURL_GLOBAL_DEFAULT);
// Create a CURL handle
CURL* curl = curl_easy_init();
if (curl)
{
std::string response;
// Set the URL
curl_easy_setopt(curl, CURLOPT_URL, "https://7a41-35-196-80-75.ngrok-free.app/GetTx2Task");
// Set the write callback function
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
// Set the response data pointer
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
// Perform the request
CURLcode res = curl_easy_perform(curl);
if (res == CURLE_OK)
{
// Print the response
std::cout << "Response: " << response << std::endl;
return stoi(response);
}
else
{
// Print an error message
std::cerr << "Request failed: " << curl_easy_strerror(res) << std::endl;
}
// Clean up
curl_easy_cleanup(curl);
}
// Clean up global resources
curl_global_cleanup();
return 0;
}
#include <unistd.h>
int main(int argc, char *argv[]) {
while(true){
sleep(1);
int number = GetFormApi();
if(number == -1)
continue;
// 將數字轉換為二進制字串
std::string binaryString = std::bitset<32>(number).to_string();
// 只保留後八位
std::string eightBits = binaryString.substr(24, 8);
// 輸出結果
std::cout << "Binary representation: " << eightBits << std::endl;
for(int i=0;i<5;i++){
setGPIO(255, ((eightBits[0]=='1')?"on":"off"));
setGPIO(397, ((eightBits[1]=='1')?"on":"off"));
setGPIO(481, ((eightBits[2]=='1')?"on":"off"));
setGPIO(396, ((eightBits[3]=='1')?"on":"off"));
setGPIO(466, ((eightBits[4]=='1')?"on":"off"));
setGPIO(392, ((eightBits[5]=='1')?"on":"off"));
setGPIO(254, ((eightBits[6]=='1')?"on":"off"));
setGPIO(430, ((eightBits[7]=='1')?"on":"off"));
setGPIO(398, ((eightBits[8]=='1')?"on":"off"));
}
}
}
```
## Makefile
```cpp=
obj-m := gpio.o
kernel_DIR := /usr/src/linux-headers-4.9.201-tegra-ubuntu18.04_aarch64/kernel-4.9
PWD := $(shell pwd)
all:
make -C $(kernel_DIR) SUBDIRS=$(PWD)
clean:
rm *.o *.ko *.mod.c
.PHONY:
clean
```
## gpio.c
```cpp=
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#define MAJOR_NUM 60
#define MODULE_NAME "gpio"
static int iCount = 0;
static char userChar[100];
static ssize_t drv_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
{
printk("device read\n");
return count;
}
static ssize_t drv_write(struct file *flip, const char *buf, size_t count, loff_t *ppos)
{
printk("device write\n");
printk("%d\n", iCount);
printk("W_buf_size: %d\n", (int)count);
copy_from_user(userChar, buf, count);
userChar[count-1] = 0;
int i=0;
char gpio[10] = {0};
char on_off[10]={0};
for(i=0;i<sizeof(userChar);i++){
if(userChar[i]==' ')
break;
gpio[i]=userChar[i];
}
int j=i+1;
for(j=i+1;j<sizeof(userChar);j++){
if(userChar[j]=='\0')
break;
on_off[j-i-1]=userChar[j];
}
printk("\nuserChar:%s",gpio);
printk("\nuserChar:%s",on_off);
printk("\nuserChar: %s\n", userChar);
printk("\nuserChar: %d\n", (int)sizeof(userChar));
struct file *fp;
loff_t pos = 0;
mm_segment_t old_fs;
old_fs=get_fs();
set_fs(get_ds());
// export gpio number
fp = filp_open("/sys/class/gpio/export",O_WRONLY,0);
vfs_write(fp,gpio,strlen(gpio),&pos);
filp_close(fp,NULL);
// write led out/input
char cmd[1000]={0};
snprintf(cmd,sizeof(cmd),"/sys/class/gpio/gpio%s/direction",gpio);
fp = filp_open(cmd,O_WRONLY,0);
vfs_write(fp,"out",4,&pos);
filp_close(fp,NULL);
// write led status
snprintf(cmd,sizeof(cmd),"/sys/class/gpio/gpio%s/value",gpio);
fp = filp_open(cmd,O_WRONLY,0);
if(on_off[0]=='1')
vfs_write(fp,"1",2,&pos);
else
vfs_write(fp,"0",2,&pos);
filp_close(fp,NULL);
//restore envirnment
set_fs(old_fs);
iCount++;
return count;
}
long drv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
printk("device ioctl\n");
return 0;
}
static int drv_open(struct inode *inode, struct file *filp)
{
printk("device open\n");
return 0;
}
static int drv_release(struct inode *inode, struct file *filp)
{
printk("device close\n");
return 0;
}
struct file_operations drv_fops =
{
read: drv_read,
write: drv_write,
unlocked_ioctl: drv_ioctl,
open: drv_open,
release: drv_release,
};
static int demo_init(void)
{
if (register_chrdev(MAJOR_NUM, MODULE_NAME, &drv_fops) < 0)
{
printk("<1>%s: can't get major %d\n", MODULE_NAME, MAJOR_NUM);
return (-EBUSY);
}
printk("<1>%s: started\n", MODULE_NAME);
return 0;
}
static void demo_exit(void)
{
unregister_chrdev(MAJOR_NUM, "gpio");
printk("<1>%s: removed\n", MODULE_NAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
```
## MIT2

