From 6fe7e5db355c66116791284819c9fedcf73029a8 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Sun, 14 Oct 2018 17:54:49 +0800
Subject: [PATCH] Add APUE folder in program and add File IO sample code

---
 program/apue/1.File_IO/makefile  |   11 +++
 program/apue/1.File_IO/ds18b20.c |  119 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 130 insertions(+), 0 deletions(-)

diff --git a/program/apue/1.File_IO/ds18b20.c b/program/apue/1.File_IO/ds18b20.c
new file mode 100644
index 0000000..d170de1
--- /dev/null
+++ b/program/apue/1.File_IO/ds18b20.c
@@ -0,0 +1,119 @@
+/*********************************************************************************
+ *      Copyright:  (C) 2018 LingYun IoT System Studio
+ *                  All rights reserved.
+ *
+ *       Filename:  ds18b20.c
+ *    Description:  This file is temperature sensor DS18B20 code
+ *                 
+ *        Version:  1.0.0(2018/10/14)
+ *         Author:  Guo Wenxue <guowenxue@gmail.com>
+ *      ChangeLog:  1, Release initial version on "2018/10/14 12:13:26"
+ *                 
+ ********************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+
+int ds18b20_get_temperature(float *temp);
+
+int main(int argc, char *argv[])
+{
+        float       temp;
+
+        if( ds18b20_get_temperature(&temp) < 0 )
+        {
+                printf("ERROR: ds18b20 get temprature failure\n");
+                return 1;
+        }
+
+        printf("DS19B20 get temperature: %f ℃\n", temp);
+        return 0;
+}
+
+
+/* File Content:
+   pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave 
+   3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES
+   3a 01 4b 46 7f ff 0c 10 a5 t=19625
+ */
+
+int ds18b20_get_temperature(float *temp)
+{
+    char            w1_path[50] = "/sys/bus/w1/devices/";
+    char            chip[20];
+    char            buf[128];
+    DIR            *dirp;
+    struct dirent  *direntp;
+    int             fd =-1;
+    char           *ptr;
+    float           value;
+    int             found = 0;
+
+    if( !temp )
+    {
+            return -1;
+    }
+
+    /*+-------------------------------------------------------------------+
+     *|  open dierectory /sys/bus/w1/devices to get chipset Serial Number |
+     *+-------------------------------------------------------------------+*/
+    if((dirp = opendir(w1_path)) == NULL)
+    {
+        printf("opendir error: %s\n", strerror(errno));
+        return -2;
+    }
+
+    while((direntp = readdir(dirp)) != NULL)
+    {
+        if(strstr(direntp->d_name,"28-"))
+        {
+            /* find and get the chipset SN filename */
+            strcpy(chip,direntp->d_name);
+            found = 1;
+        }
+    }
+    closedir(dirp);
+
+    if( !found )
+    {
+            printf("Can not find ds18b20 in %s\n", w1_path);
+            return -3;
+    }
+
+    /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */
+    strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path));
+    strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path));
+
+    /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */
+    if( (fd=open(w1_path, O_RDONLY)) < 0 ) 
+    { 
+            printf("open %s error: %s\n", w1_path, strerror(errno)); 
+            return -4;
+    } 
+    
+    if(read(fd, buf, sizeof(buf)) < 0)
+    {
+            printf("read %s error: %s\n", w1_path, strerror(errno)); 
+            return -5;
+    } 
+    
+    ptr = strstr(buf, "t=");
+    if( !ptr )
+    {
+            printf("ERROR: Can not get temperature\n");
+            return -6;
+    }
+
+    ptr+=2;
+
+    /* convert string value to float value */
+    *temp = atof(ptr)/1000;
+   
+    return 0;
+}
diff --git a/program/apue/1.File_IO/makefile b/program/apue/1.File_IO/makefile
new file mode 100644
index 0000000..cbae8a0
--- /dev/null
+++ b/program/apue/1.File_IO/makefile
@@ -0,0 +1,11 @@
+INST_PATH=/usr/bin
+BIN_NAME=ds18b20
+
+all: 
+	gcc ${BIN_NAME}.c -o ${BIN_NAME}
+
+clean: 
+	rm -f ${BIN_NAME}
+
+install: 
+	@cp ${BIN_NAME} ${INST_PATH}

--
Gitblit v1.9.1