設置 | 登錄 | 註冊

目前共有16篇帖子。

【程序】Powerlog 開機時間及室溫自動記錄程序 V2.4

1樓 巨大八爪鱼 2016-2-10 16:00
2樓 巨大八爪鱼 2016-2-10 16:01
【autorun.sh】
cd /home/octopus/Programs/powerlog
./powerlog2 on
./templog
3樓 巨大八爪鱼 2016-2-10 16:02
【conn.h】
#define SERVER_NAME "localhost"
#define DB_USER "server"
#define DB_PASSWORD "密碼"
#define DB_NAME "server"
4樓 巨大八爪鱼 2016-2-10 16:02
【IP.txt】
192.168.0.4
5樓 巨大八爪鱼 2016-2-10 16:02
【logview.c】
#include <mysql/mysql.h>
#include <stdio.h>
#include "conn.h"

void putstr(char *s, FILE *fp, char display)
{
    fputs(s, fp);
    fputc('\n', fp);
    if (display == 1)
        puts(s);
}

int main(int argc, char *argv[])
{
    char ch;
    char IP[16];
    char line[100];
    char sql[150];
    int i = 0;
    FILE *fp;
    MYSQL conn;
    MYSQL_RES *rs;
    MYSQL_ROW row;
   
    /* Get IP Address */
    if ((fp = fopen("IP.txt", "r")) == NULL)
    {
        printf("Cannot open the file for IP Address.\n");
        return 1;
    }
    while (ch = fgetc(fp), !feof(fp))
    {
        if ((ch >= '0' && ch <= '9') || ch == '.')
            IP[i++] = ch;
        else
            break;
        if (i == sizeof(IP) - 1)
            break;
    }
    IP[i] = '\0';
    fclose(fp);
   
    /* Open Log File */
    if ((fp = fopen("powerlog.txt", "w")) == NULL)
    {
        printf("Cannot open the file.\n");
        return 2;
    }
    printf("Powerlog Version 2.4\n");
    putstr("ID\tTIME", fp, 1);
   
    /* Init MySQL Connection */
    mysql_init(&conn);
    if (!mysql_real_connect(&conn, SERVER_NAME, DB_USER, DB_PASSWORD, DB_NAME, 0, NULL, 0))
    {
        printf("Cannot connect to the database server.\n");
        return 3;
    }
    mysql_set_character_set(&conn, "utf8");
   
    /* Query */
    sprintf(sql, "SELECT LogID, LogTime FROM PowerLog WHERE LogFlag = 'POWER ON' AND ComputerIP = '%s' ORDER BY LogTime DESC", IP);
    mysql_query(&conn, sql);
    rs = mysql_store_result(&conn);
    for (i = 0; row = mysql_fetch_row(rs); i++)
    {
        sprintf(line, "%d\t%s", atoi(row[0]), row[1]);
        putstr(line, fp, (i < 20));
    }
    mysql_free_result(rs);
    fclose(fp);
   
    mysql_close(&conn);
    return 0;
}
6樓 巨大八爪鱼 2016-2-10 16:02
【Makefile】
MYSQL = -lmysqlclient

powerlog2: conn.h temperature.h temperature.c UART.h UART.c powerlog2.c
    gcc temperature.c UART.c powerlog2.c -o powerlog2 $(MYSQL)

logview: conn.h logview.c
    gcc logview.c -o logview $(MYSQL)

templog: conn.h temperature.h temperature.c UART.h UART.c templog.c
    gcc temperature.c UART.c templog.c -o templog $(MYSQL)
7樓 巨大八爪鱼 2016-2-10 16:03
【powerlog2.c】
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>
#include "conn.h"
#include "UART.h"

int main(int argc, char *argv[])
{
    char sql[200];
    char *sql_err;
    char temp_str[10];
    char temp_str_buffer[120] = {0};
    char uart_open = 1;
    float temp;
    int i = 10;
    MYSQL conn;
    MYSQL_RES *rs;
    MYSQL_ROW row;
   
    if (UART_Open() == 0)
        uart_open = 0;
    mysql_init(&conn);
    if (!mysql_real_connect(&conn, SERVER_NAME, DB_USER, DB_PASSWORD, DB_NAME, 0, NULL, 0))
    {
        printf("Cannot connect to the database server.\n");
        return 3;
    }
    mysql_set_character_set(&conn, "utf8");
   
    printf("Powerlog Version 2.4\n");
    printf("Welcome\n");
   
    if (uart_open)
    {
        get_temperature(&temp); // avoid the first possible error value
        while (i--)
        {
            usleep(10000);
            get_temperature(&temp);
            get_temperature_str(&temp, temp_str);
            strcat(temp_str_buffer, temp_str);
        }
    }
    else
        strcpy(temp_str_buffer, "UART Unavailable");
       
    if (argc >= 2 && strcmp(argv[1], "on") == 0)
    {
        sprintf(sql, "INSERT INTO PowerLog (LogTime, LogFlag, Temperature) VALUES (NOW(), 'POWER ON', '%s')", temp_str_buffer);
        sql_err = "INSERT INTO PowerLog (LogTime, LogFlag, Temperature) VALUES (NOW(), 'POWER ON', 'Query Error')";
    }
    else
    {
        // Just for debug
        sprintf(sql, "INSERT INTO PowerLog (LogTime, Temperature) VALUES (NOW(), '%s')", temp_str_buffer);
        sql_err = "INSERT INTO PowerLog (LogTime, Temperature) VALUES (NOW(), 'Query Error')";
    }
   
    i = mysql_query(&conn, sql);
    if (i == 1)
        mysql_query(&conn, sql_err);
   
    mysql_query(&conn, "SELECT NOW()");
    rs = mysql_store_result(&conn);
    row = mysql_fetch_row(rs);
    printf("MySQL Time: %s\n", row[0]);
    mysql_free_result(rs);
    mysql_close(&conn);
    if (uart_open)
        UART_Close();
    return 0;
}
8樓 巨大八爪鱼 2016-2-10 16:03
【temperature.c】
#include <stdio.h>
#include <unistd.h>
#include "UART.h"
#include "temperature.h"

char buffer[513];

void get_temperature(float *temp)
{
    UART_Send(0x83);
    usleep(100000);
    UART_Receive(buffer);
    if (buffer[1] & TEMP_ERROR)
    {
        *temp = -999.99;
        return;
    }
    *temp = buffer[2] * 1.00 + buffer[3] * 0.01;
    if (buffer[1] & TEMP_NEGATIVE)
        *temp = -*temp;
}

void get_temperature_str(float *temp, char *s)
{
    sprintf(s, "%.2f℃\t", *temp);
}
9樓 巨大八爪鱼 2016-2-10 16:03
【temperature.h】
#define _BV(n) (1 << n)
#define TEMP_NEGATIVE _BV(4)
#define TEMP_ERROR _BV(6)

void get_temperature(float *temp);
void get_temperature_str(float *temp, char *s);
10樓 巨大八爪鱼 2016-2-10 16:04
【templog.c】
#include <fcntl.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "conn.h"
#include "temperature.h"
#include "UART.h"

#define EXIT_FLAG _BV(7)
#define COUNTER (flags & (~EXIT_FLAG))
#define COUNTER_CLEAR (flags &= EXIT_FLAG)
int flags = 23;

void record(void)
{
    char sql[300] = "INSERT INTO TemperatureLog (TemperatureA, TemperatureB, TemperatureC, TemperatureD, TemperatureE, TemperatureF, TemperatureG, TemperatureH, TemperatureI, TemperatureJ) VALUES (";
    char *pStr;
    float temp;
    int i;
    MYSQL conn;
    MYSQL_RES *rs;
   
    flags++;
    if (COUNTER >= 24)
        COUNTER_CLEAR;
   
    if (COUNTER == 0)
    {
        if (UART_Open() == 0)
            return;
        for (i = 0; i < 5; i++)
            get_temperature(&temp); // avoid the first possible error value
    }
   
    mysql_init(&conn);
    if (!mysql_real_connect(&conn, SERVER_NAME, DB_USER, DB_PASSWORD, DB_NAME, 0, NULL, 0))
    {
        if (COUNTER == 0)
            UART_Close();
        return;
    }
    mysql_set_character_set(&conn, "utf8");
   
    if (COUNTER == 0)
    {
        pStr = sql + strlen(sql);
        for (i = 0; i < 10; i++)
        {
            get_temperature(&temp);
            pStr += sprintf(pStr, "%.2f", temp);
            if (i < 9)
                *pStr++ = ',';
            sleep(1);
        }
        *pStr++ = ')';
        *pStr++ = '\0';
        mysql_query(&conn, sql);
    }
   
    mysql_query(&conn, "SELECT FlagValue FROM Flags WHERE FlagName = 'TEMPLOG_EXIT' AND FlagValue = 'EXIT'");
    rs = mysql_store_result(&conn);
    i = mysql_num_rows(rs);
    mysql_free_result(rs);
    if (i == 1)
    {
        mysql_query(&conn, "UPDATE Flags SET FlagValue = NOW() WHERE FlagName = 'TEMPLOG_EXIT'");
        flags |= EXIT_FLAG;
    }
   
    mysql_close(&conn);
    if (COUNTER == 0)
        UART_Close();
}

int main(void)
{
    int fd;
    pid_t pid;
    printf("Powerlog Version 2.4\n");
    pid = fork();
    if (pid < 0)
        exit(1);
    if (pid > 0)
        exit(0);
   
    pid = setsid();
    fd = open("/dev/null", O_RDWR);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    close(fd);
   
    for (;;)
    {
        sleep(100);
        record();
        if (flags & EXIT_FLAG)
            break;
    }
    return 0;
}

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。