Subversion Repositories public

Rev

Rev 136 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
93 andreas 1
#include "config.h"
2
#include "garmin.h"
3
 
4
 
5
/* 
6
   Check to see whether a command is supported by a Garmin unit based on its
7
   available command protocols.
8
*/
9
 
10
int
11
garmin_command_supported ( garmin_unit *    garmin,
12
			   garmin_command   cmd )
13
{
14
  int ret = 0;
15
 
246 andreas 16
  if (!garmin)
17
     return 0;
18
 
93 andreas 19
  switch ( cmd ) {
20
  case Cmnd_Abort_Transfer:
21
  case Cmnd_Turn_Off_Pwr:
22
    ret = 1;
23
    break;
24
 
25
  case Cmnd_Transfer_Alm:
26
    ret = garmin->protocol.almanac;
27
    break;
28
 
29
  case Cmnd_Transfer_Prx:
30
    ret = garmin->protocol.waypoint.proximity;
31
    break;
32
 
33
  case Cmnd_Transfer_Rte:
34
    ret = garmin->protocol.route;
35
    break;
36
 
37
  case Cmnd_Transfer_Time:
38
    ret = garmin->protocol.date_time;
39
    break;
40
 
41
  case Cmnd_Transfer_Wpt:
42
    ret = garmin->protocol.waypoint.waypoint;
43
    break;
44
 
45
  case Cmnd_Transfer_Posn:
46
    ret = garmin->protocol.position;
47
    break;
48
 
49
  case Cmnd_Transfer_Trk:
50
    ret = garmin->protocol.track;
51
    break;
52
 
53
  case Cmnd_Start_Pvt_Data:
54
  case Cmnd_Stop_Pvt_Data:
55
    ret = garmin->protocol.pvt;
56
    break;
57
 
58
  case Cmnd_FlightBook_Transfer:
59
    ret = garmin->protocol.flightbook;
60
    break;
61
 
62
  case Cmnd_Transfer_Laps:
63
    ret = garmin->protocol.lap;
64
    break;
65
 
66
  case Cmnd_Transfer_Wpt_Cats:
67
    ret = garmin->protocol.waypoint.category;
68
    break;
69
 
70
  case Cmnd_Transfer_Runs:
71
    ret = garmin->protocol.run;
72
    break;
73
 
74
  case Cmnd_Transfer_Workouts:
75
    ret = garmin->protocol.workout.workout;
76
    break;
77
 
78
  case Cmnd_Transfer_Workout_Occurrences:
79
    ret = garmin->protocol.workout.occurrence;
80
    break;
81
 
82
  case Cmnd_Transfer_Fitness_User_Profile:
83
    ret = garmin->protocol.fitness;
84
    break;
85
 
86
  case Cmnd_Transfer_Workout_Limits:
87
    ret = garmin->protocol.workout.limits;
88
    break;
89
 
90
  case Cmnd_Transfer_Courses:
91
    ret = garmin->protocol.course.course;
92
    break;
93
 
94
  case Cmnd_Transfer_Course_Laps:
95
    ret = garmin->protocol.course.lap;
96
    break;
97
 
98
  case Cmnd_Transfer_Course_Points:
99
    ret = garmin->protocol.course.point;
100
    break;
101
 
102
  case Cmnd_Transfer_Course_Tracks:
103
    ret = garmin->protocol.course.track + garmin->protocol.track;
104
    break;
105
 
106
  case Cmnd_Transfer_Course_Limits:
107
    ret = garmin->protocol.course.limits;
108
    break;
109
 
110
  default: 
111
    break;
112
  }
113
 
114
  return ret;
115
}
116
 
117
 
118
/* 
119
   Convert a garmin_command to a command packet, returning 1 if the command
120
   is supported by the unit's command protocol and 0 if it isn't.
121
*/
122
 
123
int
124
garmin_make_command_packet ( garmin_unit *    garmin, 
125
			     garmin_command   cmd,
126
			     garmin_packet *  packet )
127
{
128
  int    r = 1;
129
  uint16 c = 0;
130
  uint16 p = 0;
131
  uint8  b[2];
132
 
246 andreas 133
  if (!garmin)
134
     return 0;
135
 
93 andreas 136
  /* Determine the packet ID based on the link protocol. */
137
 
138
  switch ( garmin->protocol.link ) {
139
  case link_L001:           p = L001_Pid_Command_Data;                   break;
140
  case link_L002:           p = L002_Pid_Command_Data;                   break;
141
  default:                  r = 0;                                       break;
142
  }
143
 
144
  /* 
145
     Although it's obvious from the spec that L001 implies A010 and L002
146
     implies A011, this relationship is not explicit.  We have to determine
147
     the command ID based on the unit's stated command protocol.
148
  */
149
 
150
#define CMD_CASE(x,y) case Cmnd_##y: c = x##_Cmnd_##y; break
151
#define A010_CASE(x)  CMD_CASE(A010,x)
152
#define A011_CASE(x)  CMD_CASE(A011,x)
153
#define CMD_DEFAULT   default: r = 0; break
154
 
155
  switch ( garmin->protocol.command ) {
156
  case appl_A010:
157
    switch ( cmd ) {
158
      A010_CASE(Abort_Transfer);
159
      A010_CASE(Turn_Off_Pwr);
160
      A010_CASE(Start_Pvt_Data);
161
      A010_CASE(Stop_Pvt_Data);
162
      A010_CASE(Transfer_Alm);
163
      A010_CASE(Transfer_Posn);
164
      A010_CASE(Transfer_Prx);
165
      A010_CASE(Transfer_Rte);
166
      A010_CASE(Transfer_Time);
167
      A010_CASE(Transfer_Trk);
168
      A010_CASE(Transfer_Wpt);
169
      A010_CASE(FlightBook_Transfer);
170
      A010_CASE(Transfer_Laps);
171
      A010_CASE(Transfer_Wpt_Cats);
172
      A010_CASE(Transfer_Runs);
173
      A010_CASE(Transfer_Workouts);
174
      A010_CASE(Transfer_Workout_Occurrences);
175
      A010_CASE(Transfer_Fitness_User_Profile);
176
      A010_CASE(Transfer_Workout_Limits);
177
      A010_CASE(Transfer_Courses);
178
      A010_CASE(Transfer_Course_Laps);
179
      A010_CASE(Transfer_Course_Points);
180
      A010_CASE(Transfer_Course_Tracks);
181
      A010_CASE(Transfer_Course_Limits);
182
      CMD_DEFAULT;
183
    }
184
    break;
185
  case appl_A011:
186
    switch ( cmd ) {
187
      A011_CASE(Abort_Transfer);
188
      A011_CASE(Turn_Off_Pwr);
189
      A011_CASE(Transfer_Alm);
190
      A011_CASE(Transfer_Prx);
191
      A011_CASE(Transfer_Rte);
192
      A011_CASE(Transfer_Time);
193
      A011_CASE(Transfer_Wpt);
194
      CMD_DEFAULT;
195
    }
196
    break;
197
    CMD_DEFAULT;
198
  }
199
 
200
  /* 
201
     If the command is supported by the unit's command protocol, build the
202
     packet.
203
  */
204
 
205
  if ( r != 0 ) {
206
    put_uint16(b,c);
207
    garmin_packetize(packet,p,2,b);
208
  }
209
 
210
  return r;
211
}
212
 
213
 
214
/* Send a command */
215
 
216
int
217
garmin_send_command ( garmin_unit * garmin, garmin_command cmd )
218
{
219
  garmin_packet packet;
220
  int ret = 0;
221
 
246 andreas 222
  if (!garmin)
223
     return 0;
224
 
93 andreas 225
  if ( garmin_command_supported(garmin,cmd) &&
226
       garmin_make_command_packet(garmin,cmd,&packet) ) {
227
    ret = garmin_write(garmin,&packet);
228
  } else {
136 andreas 229
    char hv0[256];
93 andreas 230
    /* Error: command not supported */
136 andreas 231
    sprintf(&hv0[0], "Error: command %d not supported!",cmd);
232
    garmin_queue_error(hv0, err_error);
93 andreas 233
  }
234
 
235
  return ret;
236
}
237
 
238