summaryrefslogtreecommitdiff
path: root/src/mm-port-serial.h
blob: 59daadd4a2a2e448c4d87732c8f66f98502b8f57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details:
 *
 * Copyright (C) 2008 - 2009 Novell, Inc.
 * Copyright (C) 2009 - 2010 Red Hat, Inc.
 */

#ifndef MM_PORT_SERIAL_H
#define MM_PORT_SERIAL_H

#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>

#include "mm-modem-helpers.h"
#include "mm-port.h"

#define MM_TYPE_PORT_SERIAL            (mm_port_serial_get_type ())
#define MM_PORT_SERIAL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_PORT_SERIAL, MMPortSerial))
#define MM_PORT_SERIAL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  MM_TYPE_PORT_SERIAL, MMPortSerialClass))
#define MM_IS_PORT_SERIAL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_PORT_SERIAL))
#define MM_IS_PORT_SERIAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  MM_TYPE_PORT_SERIAL))
#define MM_PORT_SERIAL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  MM_TYPE_PORT_SERIAL, MMPortSerialClass))

#define MM_PORT_SERIAL_BAUD         "baud"
#define MM_PORT_SERIAL_BITS         "bits"
#define MM_PORT_SERIAL_PARITY       "parity"
#define MM_PORT_SERIAL_STOPBITS     "stopbits"
#define MM_PORT_SERIAL_FLOW_CONTROL "flowcontrol"
#define MM_PORT_SERIAL_SEND_DELAY   "send-delay"
#define MM_PORT_SERIAL_FD           "fd" /* Construct-only */
#define MM_PORT_SERIAL_SPEW_CONTROL "spew-control"
#define MM_PORT_SERIAL_FLASH_OK     "flash-ok"

typedef enum {
    MM_PORT_SERIAL_RESPONSE_NONE,
    MM_PORT_SERIAL_RESPONSE_BUFFER,
    MM_PORT_SERIAL_RESPONSE_ERROR,
} MMPortSerialResponseType;

typedef struct _MMPortSerial MMPortSerial;
typedef struct _MMPortSerialClass MMPortSerialClass;
typedef struct _MMPortSerialPrivate MMPortSerialPrivate;

struct _MMPortSerial {
    MMPort parent;
    MMPortSerialPrivate *priv;
};

struct _MMPortSerialClass {
    MMPortClass parent;

    /* Called for subclasses to parse unsolicited responses.  If any recognized
     * unsolicited response is found, it should be removed from the 'response'
     * byte array before returning.
     */
    void     (*parse_unsolicited) (MMPortSerial *self, GByteArray *response);

    /*
     * Called to parse the device's response to a command or determine if the
     * response was an error response.
     *
     * If the response indicates an error, @MM_PORT_SERIAL_RESPONSE_ERROR will
     * be returned and an appropriate GError set in @error.
     *
     * If the response indicates a valid response, @MM_PORT_SERIAL_RESPONSE_BUFFER
     * will be returned, and a newly allocated GByteArray set in @parsed_response.
     *
     * If there is no response, @MM_PORT_SERIAL_RESPONSE_NONE will be returned,
     * and neither @error nor @parsed_response will be set.
     *
     * The implementation is allowed to cleanup the @response byte array, e.g. to
     * just remove 1 single response if more than one found.
     */
    MMPortSerialResponseType (*parse_response) (MMPortSerial *self,
                                                GByteArray *response,
                                                GByteArray **parsed_response,
                                                GError **error);

    /* Called to configure the serial port fd after it's opened.  On error, should
     * return FALSE and set 'error' as appropriate.
     */
    gboolean (*config_fd)         (MMPortSerial *self, int fd, GError **error);

    /* Called to configure the serial port after it's opened. Errors, if any,
     * should get ignored. */
    void (*config)                (MMPortSerial *self);

    void (*debug_log)             (MMPortSerial *self,
                                   const gchar  *prefix,
                                   const gchar  *buf,
                                   gsize         len);

    /* Signals */
    void (*buffer_full)           (MMPortSerial *port, const GByteArray *buffer);
    void (*forced_close)          (MMPortSerial *port);
};

GType mm_port_serial_get_type (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSerial, g_object_unref)

MMPortSerial *mm_port_serial_new (const char *name, MMPortType ptype);

/* Keep in mind that port open/close is refcounted, so ensure that
 * open/close calls are properly balanced.
 */

gboolean mm_port_serial_is_open           (MMPortSerial *self);

gboolean mm_port_serial_open              (MMPortSerial *self,
                                           GError  **error);

void     mm_port_serial_close             (MMPortSerial *self);

/* Reopen(), async */
void     mm_port_serial_reopen            (MMPortSerial *self,
                                           guint32 reopen_time,
                                           GAsyncReadyCallback callback,
                                           gpointer user_data);
gboolean mm_port_serial_reopen_finish     (MMPortSerial *port,
                                           GAsyncResult *res,
                                           GError **error);

void     mm_port_serial_flash             (MMPortSerial *self,
                                           guint32 flash_time,
                                           gboolean ignore_errors,
                                           GAsyncReadyCallback callback,
                                           gpointer user_data);
gboolean mm_port_serial_flash_finish      (MMPortSerial *self,
                                           GAsyncResult *res,
                                           GError **error);
void     mm_port_serial_flash_cancel      (MMPortSerial *self);

void        mm_port_serial_command        (MMPortSerial *self,
                                           GByteArray *command,
                                           guint32 timeout_seconds,
                                           gboolean allow_cached,
                                           gboolean run_next,
                                           GCancellable *cancellable,
                                           GAsyncReadyCallback callback,
                                           gpointer user_data);
GByteArray *mm_port_serial_command_finish (MMPortSerial *self,
                                           GAsyncResult *res,
                                           GError **error);

gboolean mm_port_serial_set_flow_control (MMPortSerial   *self,
                                          MMFlowControl   flow_control,
                                          GError        **error);

MMFlowControl mm_port_serial_get_flow_control (MMPortSerial *self);
#endif /* MM_PORT_SERIAL_H */