1/*
2 * Copyright (c) 2007-2008 by Michael Lotz
3 * Heavily based on the original usb_serial driver which is:
4 *
5 * Copyright (c) 2003 by Siarzhuk Zharski <imker@gmx.li>
6 * Distributed under the terms of the MIT License.
7 */
8#include "Tracing.h"
9#include "Driver.h"
10
11#include <stdio.h> //sprintf
12#include <unistd.h> //posix file i/o - create, write, close
13#include <Drivers.h>
14#include <directories.h>
15#include <driver_settings.h>
16
17
18#if DEBUG
19bool gLogEnabled = true;
20#else
21bool gLogEnabled = false;
22#endif
23
24bool gLogToFile = false;
25bool gLogAppend = false;
26bool gLogFunctionCalls = false;
27bool gLogFunctionReturns = false;
28bool gLogFunctionResults = false;
29
30static const char *sLogFilePath = kSystemLogDirectory "/" DRIVER_NAME ".log";
31static sem_id sLogLock;
32
33
34void
35load_settings()
36{
37	void *settingsHandle;
38	settingsHandle = load_driver_settings(DRIVER_NAME);
39
40#if !DEBUG
41	gLogEnabled = get_driver_boolean_parameter(settingsHandle,
42		"debug_output", gLogEnabled, true);
43#endif
44
45	gLogToFile = get_driver_boolean_parameter(settingsHandle,
46		"debug_output_in_file", gLogToFile, true);
47	gLogAppend = !get_driver_boolean_parameter(settingsHandle,
48		"debug_output_file_rewrite", !gLogAppend, true);
49	gLogFunctionCalls = get_driver_boolean_parameter(settingsHandle,
50		"debug_trace_func_calls", gLogFunctionCalls, false);
51	gLogFunctionReturns = get_driver_boolean_parameter(settingsHandle,
52		"debug_trace_func_returns", gLogFunctionReturns, false);
53	gLogFunctionResults = get_driver_boolean_parameter(settingsHandle,
54		"debug_trace_func_results", gLogFunctionResults, false);
55
56	unload_driver_settings(settingsHandle);
57}
58
59
60void
61create_log_file()
62{
63	if(!gLogToFile)
64		return;
65
66	int flags = O_WRONLY | O_CREAT | (!gLogAppend ? O_TRUNC : 0);
67	close(open(sLogFilePath, flags, 0666));
68	sLogLock = create_sem(1, DRIVER_NAME"-logging");
69}
70
71
72void
73pc_serial_trace(bool force, const char *format, ...)
74{
75	if (!gLogEnabled && !force)
76		return;
77
78	static char buffer[1024];
79	char *bufferPointer = buffer;
80	if (!gLogToFile) {
81		const char *prefix = "\033[32m" DRIVER_NAME ":\033[0m ";
82		strcpy(bufferPointer, prefix);
83		bufferPointer += strlen(prefix);
84	}
85
86	va_list argumentList;
87	va_start(argumentList, format);
88	vsprintf(bufferPointer, format, argumentList);
89	va_end(argumentList);
90
91	if (gLogToFile) {
92		acquire_sem(sLogLock);
93		int fd = open(sLogFilePath, O_WRONLY | O_APPEND);
94		write(fd, buffer, strlen(buffer));
95		close(fd);
96		release_sem(sLogLock);
97	} else
98		dprintf("%s", buffer);
99}
100
101
102void
103trace_termios(struct termios *tios)
104{
105	TRACE("struct termios:\n"
106		"\tc_iflag:  0x%08x\n"
107		"\tc_oflag:  0x%08x\n"
108		"\tc_cflag:  0x%08x\n"
109		"\tc_lflag:  0x%08x\n"
110		"\tc_line:   0x%08x\n"
111//		"\tc_ixxxxx: 0x%08x\n"
112//		"\tc_oxxxxx: 0x%08x\n"
113		"\tc_cc[0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x]\n",
114		tios->c_iflag, tios->c_oflag, tios->c_cflag, tios->c_lflag,
115		tios->c_line,
116//		tios->c_ixxxxx, tios->c_oxxxxx,
117		tios->c_cc[0], tios->c_cc[1], tios->c_cc[2], tios->c_cc[3],
118		tios->c_cc[4], tios->c_cc[5], tios->c_cc[6], tios->c_cc[7],
119		tios->c_cc[8], tios->c_cc[9], tios->c_cc[10]);
120}
121
122