1
/* Hey EMACS -*- linux-c -*- */
2
/* $Id: cmd84p.c 2077 2006-03-31 21:16:19Z roms $ */
4
/* libticalcs - Ti Calculator library, a part of the TiLP project
5
* Copyright (C) 1999-2005 Romain Li�vin
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
This unit handles commands and session management thru DirectLink.
38
/////////////----------------
40
static uint8_t usb_errors[] = {
41
0x04, 0x0a, 0x0f, 0x10, 0x11, 0x14, 0x15,
44
static int err_code(uint8_t code)
48
for(i = 0; i < sizeof(usb_errors) / sizeof(uint16_t); i++)
49
if(usb_errors[i] == code)
52
ticalcs_warning("NSpire error code not found in list. Please report it at <tilp-devel@lists.sf.net>.");
57
/////////////----------------
59
static int put_str(uint8_t *dst, const char *src)
63
for(i = 0; i < (int)strlen(src); i++)
69
for(j = i; j < 9; j++)
78
/////////////----------------
80
int cmd_r_login(CalcHandle *h)
82
VirtualPacket* pkt = nsp_vtl_pkt_new();
84
ticalcs_info(" receiving login:");
86
TRYF(nsp_recv_data(h, pkt));
92
/////////////----------------
94
int cmd_s_status(CalcHandle *h, uint8_t status)
98
ticalcs_info(" sending status (%04x):", status);
100
pkt = nsp_vtl_pkt_new_ex(1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, nsp_dst_port);
101
pkt->cmd = CMD_STATUS;
102
pkt->data[0] = status;
103
TRYF(nsp_send_data(h, pkt));
105
nsp_vtl_pkt_del(pkt);
110
int cmd_r_status(CalcHandle *h, uint8_t *status)
112
VirtualPacket* pkt = nsp_vtl_pkt_new();
115
ticalcs_info(" receiving status:");
117
TRYF(nsp_recv_data(h, pkt));
118
value = pkt->data[0];
120
if(pkt->cmd != CMD_STATUS)
121
return ERR_INVALID_PACKET;
127
return ERR_CALC_ERROR3 + err_code(value);
129
nsp_vtl_pkt_del(pkt);
133
/////////////----------------
135
int cmd_s_dev_infos(CalcHandle *h, uint8_t cmd)
139
ticalcs_info(" requesting device information (cmd = %02x):", cmd);
141
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_DEV_INFOS);
143
TRYF(nsp_send_data(h, pkt));
145
nsp_vtl_pkt_del(pkt);
149
int cmd_r_dev_infos(CalcHandle *h, uint8_t *cmd, uint32_t *size, uint8_t **data)
151
VirtualPacket* pkt = nsp_vtl_pkt_new();
153
ticalcs_info(" receiving device information:");
155
TRYF(nsp_recv_data(h, pkt));
158
*data = g_malloc0(pkt->size);
159
memcpy(*data, pkt->data, pkt->size);
161
nsp_vtl_pkt_del(pkt);
165
/////////////----------------
167
int cmd_s_screen_rle(CalcHandle *h, uint8_t cmd)
171
ticalcs_info(" requesting RLE screenshot (cmd = %02x):", cmd);
173
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_SCREEN_RLE);
175
TRYF(nsp_send_data(h, pkt));
177
nsp_vtl_pkt_del(pkt);
181
int cmd_r_screen_rle(CalcHandle *h, uint8_t *cmd, uint32_t *size, uint8_t **data)
183
VirtualPacket* pkt = nsp_vtl_pkt_new();
185
ticalcs_info(" receiving RLE screenshot:");
188
TRYF(nsp_recv_data(h, pkt));
192
*data = g_malloc0(pkt->size);
193
memcpy(*data, pkt->data, pkt->size);
195
nsp_vtl_pkt_del(pkt);
199
/////////////----------------
201
int cmd_s_dir_attributes(CalcHandle *h, const char *name)
204
uint8_t len = strlen(name) < 8 ? 8 : strlen(name);
206
ticalcs_info(" unknown directory list command in <%s>:", name);
208
pkt = nsp_vtl_pkt_new_ex(1 + len + 1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
209
pkt->cmd = CMD_FM_UNKWOWN;
212
put_str(pkt->data + 1, name);
214
TRYF(nsp_send_data(h, pkt));
216
nsp_vtl_pkt_del(pkt);
220
int cmd_r_dir_attributes(CalcHandle *h, uint32_t *size, uint8_t *type, uint32_t *date)
222
VirtualPacket* pkt = nsp_vtl_pkt_new();
224
ticalcs_info(" unknown directory list command reply received:");
226
TRYF(nsp_recv_data(h, pkt));
228
if(pkt->cmd != CMD_FM_UNKWOWN)
229
return ERR_CALC_ERROR3 + err_code(pkt->data[0]);
232
*size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 0)));
234
*date = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 4)));
236
*type = *(pkt->data + 8);
238
nsp_vtl_pkt_del(pkt);
242
int cmd_s_dir_enum_init(CalcHandle *h, const char *name)
245
uint8_t len = strlen(name) < 8 ? 8 : strlen(name);
247
ticalcs_info(" initiating directory listing in <%s>:", name);
249
pkt = nsp_vtl_pkt_new_ex(len + 1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
250
pkt->cmd = CMD_FM_DIRLIST_INIT;
251
put_str(pkt->data, name);
253
TRYF(nsp_send_data(h, pkt));
255
nsp_vtl_pkt_del(pkt);
259
int cmd_r_dir_enum_init(CalcHandle *h)
261
return cmd_r_status(h, NULL);
264
int cmd_s_dir_enum_next(CalcHandle *h)
268
ticalcs_info(" requesting next directory entry:");
270
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
271
pkt->cmd = CMD_FM_DIRLIST_NEXT;
273
TRYF(nsp_send_data(h, pkt));
275
nsp_vtl_pkt_del(pkt);
279
int cmd_r_dir_enum_next(CalcHandle *h, char* name, uint32_t *size, uint8_t *type)
281
VirtualPacket* pkt = nsp_vtl_pkt_new();
286
ticalcs_info(" next directory entry:");
288
TRYF(nsp_recv_data(h, pkt));
290
if(pkt->cmd != CMD_FM_DIRLIST_ENT)
292
if(pkt->data[0] == ERR_NO_MORE_TO_LIST)
294
nsp_vtl_pkt_del(pkt);
298
return ERR_CALC_ERROR3 + err_code(pkt->data[0]);
301
data_size = pkt->data[1] + 2;
302
strcpy(name, (char *)pkt->data + 2);
306
*size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + o)));
307
date = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + o + 4)));
309
*type = pkt->data[o + 8];
311
nsp_vtl_pkt_del(pkt);
315
int cmd_s_dir_enum_done(CalcHandle *h)
319
ticalcs_info(" closing directory listing:");
321
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
322
pkt->cmd = CMD_FM_DIRLIST_DONE;
324
TRYF(nsp_send_data(h, pkt));
326
nsp_vtl_pkt_del(pkt);
330
int cmd_r_dir_enum_done(CalcHandle *h)
332
return cmd_r_status(h, NULL);
335
/////////////----------------
337
int cmd_s_put_file(CalcHandle *h, const char *name, uint32_t size)
342
ticalcs_info(" sending variable:");
344
pkt = nsp_vtl_pkt_new_ex(6 + strlen(name), NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
345
pkt->cmd = CMD_FM_PUT_FILE;
347
o = put_str(pkt->data + 1, name);
350
pkt->data[o+0] = MSB(MSW(size));
351
pkt->data[o+1] = LSB(MSW(size));
352
pkt->data[o+2] = MSB(LSW(size));
353
pkt->data[o+3] = LSB(LSW(size));
355
TRYF(nsp_send_data(h, pkt));
357
nsp_vtl_pkt_del(pkt);
361
int cmd_r_put_file(CalcHandle *h)
363
return cmd_r_file_ok(h);
366
int cmd_s_get_file(CalcHandle *h, const char *name)
370
ticalcs_info(" requesting variable:");
372
pkt = nsp_vtl_pkt_new_ex(2 + strlen(name), NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
373
pkt->cmd = CMD_FM_GET_FILE;
375
put_str(pkt->data + 1, name);
377
TRYF(nsp_send_data(h, pkt));
379
nsp_vtl_pkt_del(pkt);
383
int cmd_r_get_file(CalcHandle *h, uint32_t *size)
385
VirtualPacket* pkt = nsp_vtl_pkt_new();
387
ticalcs_info(" file size:");
389
TRYF(nsp_recv_data(h, pkt));
391
if(pkt->cmd != CMD_FM_PUT_FILE)
393
nsp_vtl_pkt_del(pkt);
394
return ERR_INVALID_PACKET;
398
*size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 10)));
400
nsp_vtl_pkt_del(pkt);
404
int cmd_s_file_ok(CalcHandle *h)
408
ticalcs_info(" sending file contents:");
410
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
411
pkt->cmd = CMD_FM_OK;
412
TRYF(nsp_send_data(h, pkt));
414
nsp_vtl_pkt_del(pkt);
418
int cmd_r_file_ok(CalcHandle *h)
420
VirtualPacket* pkt = nsp_vtl_pkt_new();
422
ticalcs_info(" file status:");
424
TRYF(nsp_recv_data(h, pkt));
426
if(pkt->cmd != CMD_FM_OK)
428
if(pkt->cmd == CMD_STATUS)
430
uint8_t value = pkt->data[0];
432
nsp_vtl_pkt_del(pkt);
433
return ERR_CALC_ERROR3 + err_code(value);
437
nsp_vtl_pkt_del(pkt);
438
return ERR_INVALID_PACKET;
447
int cmd_s_file_contents(CalcHandle *h, uint32_t size, uint8_t *data)
451
ticalcs_info(" sending file contents:");
453
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_FILE_MGMT);
454
pkt->cmd = CMD_FM_CONTENTS;
455
memcpy(pkt->data, data, size);
456
TRYF(nsp_send_data(h, pkt));
458
nsp_vtl_pkt_del(pkt);
462
int cmd_r_file_contents(CalcHandle *h, uint32_t *size, uint8_t **data)
464
VirtualPacket* pkt = nsp_vtl_pkt_new();
466
ticalcs_info(" receiving file contents:");
469
TRYF(nsp_recv_data(h, pkt));
472
*data = g_malloc0(pkt->size);
473
memcpy(*data, pkt->data, pkt->size);
475
nsp_vtl_pkt_del(pkt);
479
/////////////----------------
481
int cmd_s_os_install(CalcHandle *h, uint32_t size)
485
ticalcs_info(" installing OS:");
487
pkt = nsp_vtl_pkt_new_ex(4, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_OS_INSTALL);
488
pkt->cmd = CMD_OS_INSTALL;
489
pkt->data[0] = MSB(MSW(size));
490
pkt->data[1] = LSB(MSW(size));
491
pkt->data[2] = MSB(LSW(size));
492
pkt->data[3] = LSB(LSW(size));
493
TRYF(nsp_send_data(h, pkt));
495
nsp_vtl_pkt_del(pkt);
499
int cmd_r_os_install(CalcHandle *h)
501
VirtualPacket* pkt = nsp_vtl_pkt_new();
503
ticalcs_info(" receiving OS installation:");
505
TRYF(nsp_recv_data(h, pkt));
507
if(pkt->cmd != CMD_OS_OK)
508
return ERR_INVALID_PACKET;
510
nsp_vtl_pkt_del(pkt);
514
int cmd_s_os_contents(CalcHandle *h, uint32_t size, uint8_t *data)
519
ticalcs_info(" sending OS contents:");
521
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_OS_INSTALL);
522
pkt->cmd = CMD_OS_CONTENTS;
523
memcpy(pkt->data, data, size);
524
TRYF(nsp_send_data(h, pkt));
526
nsp_vtl_pkt_del(pkt);
530
int cmd_r_progress(CalcHandle *h, uint8_t *value)
532
VirtualPacket* pkt = nsp_vtl_pkt_new();
534
ticalcs_info(" OS installation status:");
536
TRYF(nsp_recv_data(h, pkt));
537
*value = pkt->data[0];
541
case CMD_OS_PROGRESS:
542
ticalcs_info(" %i/100", *value);
545
nsp_vtl_pkt_del(pkt);
546
return ERR_CALC_ERROR3 + err_code(*value);
548
nsp_vtl_pkt_del(pkt);
549
return ERR_INVALID_PACKET;
555
/////////////----------------
557
int cmd_s_echo(CalcHandle *h, uint32_t size, uint8_t *data)
561
ticalcs_info(" sending echo:");
563
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, PORT_ECHO);
565
if(data) memcpy(pkt->data, data, size);
566
TRYF(nsp_send_data(h, pkt));
568
nsp_vtl_pkt_del(pkt);
572
int cmd_r_echo(CalcHandle *h, uint32_t *size, uint8_t **data)
574
VirtualPacket* pkt = nsp_vtl_pkt_new();
576
ticalcs_info(" receiving echo:");
578
TRYF(nsp_recv_data(h, pkt));
579
if(size) *size = pkt->size;
580
if(data) *data = g_malloc0(pkt->size);
581
if(size && data) memcpy(*data, pkt->data, pkt->size);
583
nsp_vtl_pkt_del(pkt);
1
/* Hey EMACS -*- linux-c -*- */
2
/* $Id: nsp_cmd.c 2077 2006-03-31 21:16:19Z roms $ */
4
/* libticalcs - Ti Calculator library, a part of the TiLP project
5
* Copyright (C) 1999-2005 Romain Li�vin
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software Foundation,
19
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
This unit handles commands and session management thru DirectLink.
39
/////////////----------------
41
static const uint8_t usb_errors[] = {
42
0x02, 0x04, 0x07, 0x0a, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x20, 0x80
45
static int err_code(uint8_t code)
49
for(i = 0; i < (int)(sizeof(usb_errors) / sizeof(usb_errors[0])); i++)
50
if(usb_errors[i] == code)
53
ticalcs_warning("Nspire error code 0x%02x not found in list. Please report it at <tilp-devel@lists.sf.net>.", (int)code);
58
/////////////----------------
60
static int put_str(uint8_t *dst, const char *src)
63
size_t len = strlen(src);
65
for(i = 0; i < len; i++)
73
for(j = i; j < 9; j++)
84
/////////////----------------
86
TIEXPORT3 int TICALL nsp_cmd_r_login(CalcHandle *h)
88
NSPVirtualPacket* pkt;
93
ticalcs_critical("%s: h is NULL", __FUNCTION__);
94
return ERR_INVALID_HANDLE;
97
pkt = nsp_vtl_pkt_new();
99
ticalcs_info(" receiving login:");
101
retval = nsp_recv_data(h, pkt);
103
nsp_vtl_pkt_del(pkt);
108
/////////////----------------
110
TIEXPORT3 int TICALL nsp_cmd_s_status(CalcHandle *h, uint8_t status)
112
NSPVirtualPacket* pkt;
117
ticalcs_critical("%s: h is NULL", __FUNCTION__);
118
return ERR_INVALID_HANDLE;
121
pkt = nsp_vtl_pkt_new_ex(1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, nsp_dst_port);
123
ticalcs_info(" sending status (%04x):", status);
125
pkt->cmd = CMD_STATUS;
126
pkt->data[0] = status;
127
retval = nsp_send_data(h, pkt);
129
nsp_vtl_pkt_del(pkt);
134
TIEXPORT3 int TICALL nsp_cmd_r_status(CalcHandle *h, uint8_t *status)
136
NSPVirtualPacket* pkt;
142
ticalcs_critical("%s: h is NULL", __FUNCTION__);
143
return ERR_INVALID_HANDLE;
146
pkt = nsp_vtl_pkt_new();
148
ticalcs_info(" receiving status:");
150
retval = nsp_recv_data(h, pkt);
153
value = pkt->data[0];
155
if (pkt->cmd != CMD_STATUS)
157
retval = ERR_INVALID_PACKET;
168
retval = ERR_CALC_ERROR3 + err_code(value);
173
nsp_vtl_pkt_del(pkt);
178
/////////////----------------
180
TIEXPORT3 int TICALL nsp_cmd_s_dev_infos(CalcHandle *h, uint8_t cmd)
182
NSPVirtualPacket* pkt;
187
ticalcs_critical("%s: h is NULL", __FUNCTION__);
188
return ERR_INVALID_HANDLE;
191
ticalcs_info(" requesting device information (cmd = %02x):", cmd);
193
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_DEV_INFOS);
196
retval = nsp_send_data(h, pkt);
198
nsp_vtl_pkt_del(pkt);
203
TIEXPORT3 int TICALL nsp_cmd_r_dev_infos(CalcHandle *h, uint8_t *cmd, uint32_t *size, uint8_t **data)
205
NSPVirtualPacket* pkt;
210
ticalcs_critical("%s: h is NULL", __FUNCTION__);
211
return ERR_INVALID_HANDLE;
214
if (cmd == NULL || size == NULL || data == NULL)
216
ticalcs_critical("%s: an argument is NULL", __FUNCTION__);
217
return ERR_INVALID_PARAMETER;
220
pkt = nsp_vtl_pkt_new();
222
ticalcs_info(" receiving device information:");
224
retval = nsp_recv_data(h, pkt);
228
*data = g_malloc0(pkt->size); // aborts the program if it fails.
229
memcpy(*data, pkt->data, pkt->size);
232
nsp_vtl_pkt_del(pkt);
237
/////////////----------------
239
TIEXPORT3 int TICALL nsp_cmd_s_screen_rle(CalcHandle *h, uint8_t cmd)
241
NSPVirtualPacket* pkt;
246
ticalcs_critical("%s: h is NULL", __FUNCTION__);
247
return ERR_INVALID_HANDLE;
250
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_SCREEN_RLE);
252
ticalcs_info(" requesting RLE screenshot (cmd = %02x):", cmd);
255
retval = nsp_send_data(h, pkt);
257
nsp_vtl_pkt_del(pkt);
262
TIEXPORT3 int TICALL nsp_cmd_r_screen_rle(CalcHandle *h, uint8_t *cmd, uint32_t *size, uint8_t **data)
264
NSPVirtualPacket* pkt;
269
ticalcs_critical("%s: h is NULL", __FUNCTION__);
270
return ERR_INVALID_HANDLE;
272
if (cmd == NULL || size == NULL || data == NULL)
274
ticalcs_critical("%s: an argument is NULL", __FUNCTION__);
275
return ERR_INVALID_PARAMETER;
278
pkt = nsp_vtl_pkt_new();
280
ticalcs_info(" receiving RLE screenshot:");
283
retval = nsp_recv_data(h, pkt);
288
*data = g_malloc0(pkt->size); // aborts the program if it fails.
289
memcpy(*data, pkt->data, pkt->size);
292
nsp_vtl_pkt_del(pkt);
297
/////////////----------------
299
TIEXPORT3 int TICALL nsp_cmd_s_dir_attributes(CalcHandle *h, const char *name)
301
NSPVirtualPacket* pkt;
307
ticalcs_critical("%s: h is NULL", __FUNCTION__);
308
return ERR_INVALID_HANDLE;
312
ticalcs_critical("%s: name is NULL", __FUNCTION__);
313
return ERR_INVALID_PARAMETER;
316
len = strlen(name) < 8 ? 8 : strlen(name);
317
pkt = nsp_vtl_pkt_new_ex(1 + len + 1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
319
ticalcs_info(" unknown directory list command in <%s>:", name);
321
pkt->cmd = CMD_FM_ATTRIBUTES;
324
put_str(pkt->data + 1, name);
326
retval = nsp_send_data(h, pkt);
328
nsp_vtl_pkt_del(pkt);
333
TIEXPORT3 int TICALL nsp_cmd_r_dir_attributes(CalcHandle *h, uint32_t *size, uint8_t *type, uint32_t *date)
335
NSPVirtualPacket* pkt;
340
ticalcs_critical("%s: h is NULL", __FUNCTION__);
341
return ERR_INVALID_HANDLE;
344
pkt = nsp_vtl_pkt_new();
346
ticalcs_info(" unknown directory list command reply received:");
348
retval = nsp_recv_data(h, pkt);
351
if(pkt->cmd != CMD_FM_ATTRIBUTES)
353
retval = ERR_CALC_ERROR3 + err_code(pkt->data[0]);
359
//*size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 0)));
360
*size = ( (((uint32_t)pkt->data[0]) << 24)
361
| (((uint32_t)pkt->data[1]) << 16)
362
| (((uint32_t)pkt->data[2]) << 8)
363
| (((uint32_t)pkt->data[3]) ));
367
//*date = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 4)));
368
*date = ( (((uint32_t)pkt->data[4]) << 24)
369
| (((uint32_t)pkt->data[5]) << 16)
370
| (((uint32_t)pkt->data[6]) << 8)
371
| (((uint32_t)pkt->data[7]) ));
375
*type = *(pkt->data + 8);
380
nsp_vtl_pkt_del(pkt);
385
TIEXPORT3 int TICALL nsp_cmd_s_dir_enum_init(CalcHandle *h, const char *name)
387
NSPVirtualPacket* pkt;
393
ticalcs_critical("%s: h is NULL", __FUNCTION__);
394
return ERR_INVALID_HANDLE;
398
ticalcs_critical("%s: name is NULL", __FUNCTION__);
399
return ERR_INVALID_PARAMETER;
402
len = strlen(name) < 8 ? 8 : strlen(name);
404
pkt = nsp_vtl_pkt_new_ex(len + 1, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
406
ticalcs_info(" initiating directory listing in <%s>:", name);
408
pkt->cmd = CMD_FM_DIRLIST_INIT;
409
put_str(pkt->data, name);
411
retval = nsp_send_data(h, pkt);
413
nsp_vtl_pkt_del(pkt);
418
TIEXPORT3 int TICALL nsp_cmd_r_dir_enum_init(CalcHandle *h)
420
return nsp_cmd_r_status(h, NULL);
423
TIEXPORT3 int TICALL nsp_cmd_s_dir_enum_next(CalcHandle *h)
425
NSPVirtualPacket* pkt;
430
ticalcs_critical("%s: h is NULL", __FUNCTION__);
431
return ERR_INVALID_HANDLE;
434
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
437
ticalcs_info(" requesting next directory entry:");
439
pkt->cmd = CMD_FM_DIRLIST_NEXT;
441
retval = nsp_send_data(h, pkt);
443
nsp_vtl_pkt_del(pkt);
453
TIEXPORT3 int TICALL nsp_cmd_r_dir_enum_next(CalcHandle *h, char* name, uint32_t *size, uint8_t *type)
455
NSPVirtualPacket* pkt;
463
ticalcs_critical("%s: h is NULL", __FUNCTION__);
464
return ERR_INVALID_HANDLE;
468
ticalcs_critical("%s: name is NULL", __FUNCTION__);
469
return ERR_INVALID_PARAMETER;
472
pkt = nsp_vtl_pkt_new();
474
ticalcs_info(" next directory entry:");
476
retval = nsp_recv_data(h, pkt);
479
if(pkt->cmd != CMD_FM_DIRLIST_ENT)
481
if(pkt->data[0] == ERR_NO_MORE_TO_LIST)
488
retval = ERR_CALC_ERROR3 + err_code(pkt->data[0]);
493
data_size = pkt->data[1] + 2;
494
strcpy(name, (char *)pkt->data + 2);
499
// *size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + o)));
500
*size = ( (((uint32_t)pkt->data[o ]) << 24)
501
| (((uint32_t)pkt->data[o + 1]) << 16)
502
| (((uint32_t)pkt->data[o + 2]) << 8)
503
| (((uint32_t)pkt->data[o + 3]) ));
505
//date = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + o + 4)));
508
*type = pkt->data[o + 8];
513
nsp_vtl_pkt_del(pkt);
518
TIEXPORT3 int TICALL nsp_cmd_s_dir_enum_done(CalcHandle *h)
520
NSPVirtualPacket* pkt;
525
ticalcs_critical("%s: h is NULL", __FUNCTION__);
526
return ERR_INVALID_HANDLE;
529
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
531
ticalcs_info(" closing directory listing:");
533
pkt->cmd = CMD_FM_DIRLIST_DONE;
535
retval = nsp_send_data(h, pkt);
537
nsp_vtl_pkt_del(pkt);
542
TIEXPORT3 int TICALL nsp_cmd_r_dir_enum_done(CalcHandle *h)
544
return nsp_cmd_r_status(h, NULL);
547
/////////////----------------
549
TIEXPORT3 int TICALL nsp_cmd_s_put_file(CalcHandle *h, const char *name, uint32_t size)
551
NSPVirtualPacket* pkt;
558
ticalcs_critical("%s: h is NULL", __FUNCTION__);
559
return ERR_INVALID_HANDLE;
563
ticalcs_critical("%s: name is NULL", __FUNCTION__);
564
return ERR_INVALID_PARAMETER;
567
len = strlen(name) < 8 ? 8 : strlen(name);
568
pkt = nsp_vtl_pkt_new_ex(6 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
570
ticalcs_info(" sending variable:");
572
pkt->cmd = CMD_FM_PUT_FILE;
574
o = put_str(pkt->data + 1, name);
577
pkt->data[o+0] = MSB(MSW(size));
578
pkt->data[o+1] = LSB(MSW(size));
579
pkt->data[o+2] = MSB(LSW(size));
580
pkt->data[o+3] = LSB(LSW(size));
582
retval = nsp_send_data(h, pkt);
584
nsp_vtl_pkt_del(pkt);
589
TIEXPORT3 int TICALL nsp_cmd_r_put_file(CalcHandle *h)
591
return nsp_cmd_r_file_ok(h);
594
TIEXPORT3 int TICALL nsp_cmd_s_put_file_eot(CalcHandle *h)
596
NSPVirtualPacket* pkt;
601
ticalcs_critical("%s: h is NULL", __FUNCTION__);
602
return ERR_INVALID_HANDLE;
605
pkt = nsp_vtl_pkt_new_ex(2, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
607
ticalcs_info(" sending EOT:");
609
pkt->cmd = CMD_FM_PUT_FILE_EOT;
612
retval = nsp_send_data(h, pkt);
614
nsp_vtl_pkt_del(pkt);
619
// No nsp_cmd_r_put_file_eot because the calculator doesn't seem to reply to CMD_FM_PUT_FILE_EOT.
621
TIEXPORT3 int TICALL nsp_cmd_s_get_file(CalcHandle *h, const char *name)
623
NSPVirtualPacket* pkt;
629
ticalcs_critical("%s: h is NULL", __FUNCTION__);
630
return ERR_INVALID_HANDLE;
634
ticalcs_critical("%s: name is NULL", __FUNCTION__);
635
return ERR_INVALID_PARAMETER;
638
len = strlen(name) < 8 ? 8 : strlen(name);
640
ticalcs_info(" requesting variable:");
642
pkt = nsp_vtl_pkt_new_ex(2 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
643
pkt->cmd = CMD_FM_GET_FILE;
645
put_str(pkt->data + 1, name);
647
retval = nsp_send_data(h, pkt);
649
nsp_vtl_pkt_del(pkt);
654
TIEXPORT3 int TICALL nsp_cmd_r_get_file(CalcHandle *h, uint32_t *size)
656
NSPVirtualPacket* pkt;
661
ticalcs_critical("%s: h is NULL", __FUNCTION__);
662
return ERR_INVALID_HANDLE;
665
pkt = nsp_vtl_pkt_new();
667
ticalcs_info(" file size:");
669
retval = nsp_recv_data(h, pkt);
674
if(pkt->cmd != CMD_FM_PUT_FILE)
676
retval = ERR_INVALID_PACKET;
682
// *size = GUINT32_FROM_BE(*((uint32_t *)(pkt->data + 10)));
683
*size = ( (((uint32_t)pkt->data[10]) << 24)
684
| (((uint32_t)pkt->data[11]) << 16)
685
| (((uint32_t)pkt->data[12]) << 8)
686
| (((uint32_t)pkt->data[13]) ));
691
nsp_vtl_pkt_del(pkt);
696
TIEXPORT3 int TICALL nsp_cmd_s_del_file(CalcHandle *h, const char *name)
698
NSPVirtualPacket* pkt;
704
ticalcs_critical("%s: h is NULL", __FUNCTION__);
705
return ERR_INVALID_HANDLE;
709
ticalcs_critical("%s: name is NULL", __FUNCTION__);
710
return ERR_INVALID_PARAMETER;
713
len = strlen(name) < 8 ? 8 : strlen(name);
714
pkt = nsp_vtl_pkt_new_ex(2 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
716
ticalcs_info(" deleting variable:");
718
pkt->cmd = CMD_FM_DEL_FILE;
720
put_str(pkt->data + 1, name);
722
retval = nsp_send_data(h, pkt);
724
nsp_vtl_pkt_del(pkt);
729
TIEXPORT3 int TICALL nsp_cmd_r_del_file(CalcHandle *h)
731
return nsp_cmd_r_status(h, NULL);
734
TIEXPORT3 int TICALL nsp_cmd_s_new_folder(CalcHandle *h, const char *name)
736
NSPVirtualPacket* pkt;
742
ticalcs_critical("%s: h is NULL", __FUNCTION__);
743
return ERR_INVALID_HANDLE;
747
ticalcs_critical("%s: name is NULL", __FUNCTION__);
748
return ERR_INVALID_PARAMETER;
751
len = strlen(name) < 8 ? 8 : strlen(name);
753
pkt = nsp_vtl_pkt_new_ex(2 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
755
ticalcs_info(" creating folder:");
757
pkt->cmd = CMD_FM_NEW_FOLDER;
759
put_str(pkt->data + 1, name);
761
retval = nsp_send_data(h, pkt);
763
nsp_vtl_pkt_del(pkt);
768
TIEXPORT3 int TICALL nsp_cmd_r_new_folder(CalcHandle *h)
770
return nsp_cmd_r_status(h, NULL);
773
TIEXPORT3 int TICALL nsp_cmd_s_del_folder(CalcHandle *h, const char *name)
775
NSPVirtualPacket* pkt;
781
ticalcs_critical("%s: h is NULL", __FUNCTION__);
782
return ERR_INVALID_HANDLE;
786
ticalcs_critical("%s: name is NULL", __FUNCTION__);
787
return ERR_INVALID_PARAMETER;
790
len = strlen(name) < 8 ? 8 : strlen(name);
792
pkt = nsp_vtl_pkt_new_ex(2 + len, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
794
ticalcs_info(" deleting folder:");
796
pkt->cmd = CMD_FM_DEL_FOLDER;
798
put_str(pkt->data + 1, name);
800
retval = nsp_send_data(h, pkt);
802
nsp_vtl_pkt_del(pkt);
807
TIEXPORT3 int TICALL nsp_cmd_r_del_folder(CalcHandle *h)
809
return nsp_cmd_r_status(h, NULL);
812
TIEXPORT3 int TICALL nsp_cmd_s_copy_file(CalcHandle *h, const char *name, const char *name2)
814
NSPVirtualPacket* pkt;
821
ticalcs_critical("%s: h is NULL", __FUNCTION__);
822
return ERR_INVALID_HANDLE;
824
if (name == NULL || name2 == NULL)
826
ticalcs_critical("%s: a parameter is NULL", __FUNCTION__);
827
return ERR_INVALID_PARAMETER;
830
len = strlen(name) < 8 ? 8 : strlen(name);
831
len2 = strlen(name2) < 8 ? 8 : strlen(name2);
833
pkt = nsp_vtl_pkt_new_ex(3 + len + len2, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
835
ticalcs_info(" copying file:");
837
pkt->cmd = CMD_FM_COPY_FILE;
839
put_str(pkt->data + 1, name);
840
put_str(pkt->data + 2 + len, name2);
842
retval = nsp_send_data(h, pkt);
844
nsp_vtl_pkt_del(pkt);
849
TIEXPORT3 int TICALL nsp_cmd_r_copy_file(CalcHandle *h)
851
return nsp_cmd_r_status(h, NULL);
854
TIEXPORT3 int TICALL nsp_cmd_s_rename_file(CalcHandle *h, const char *name, const char *name2)
856
NSPVirtualPacket* pkt;
863
ticalcs_critical("%s: h is NULL", __FUNCTION__);
864
return ERR_INVALID_HANDLE;
866
if (name == NULL || name2 == NULL)
868
ticalcs_critical("%s: a parameter is NULL", __FUNCTION__);
869
return ERR_INVALID_PARAMETER;
872
len = strlen(name) < 8 ? 8 : strlen(name);
873
len2 = strlen(name2) < 8 ? 8 : strlen(name2);
875
ticalcs_info(" renaming file:");
877
pkt = nsp_vtl_pkt_new_ex(3 + len + len2, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
878
pkt->cmd = CMD_FM_RENAME_FILE;
880
put_str(pkt->data + 1, name);
881
put_str(pkt->data + 2 + len, name2);
883
retval = nsp_send_data(h, pkt);
885
nsp_vtl_pkt_del(pkt);
890
TIEXPORT3 int TICALL nsp_cmd_r_rename_file(CalcHandle *h)
892
return nsp_cmd_r_status(h, NULL);
895
TIEXPORT3 int TICALL nsp_cmd_s_file_ok(CalcHandle *h)
897
NSPVirtualPacket* pkt;
902
ticalcs_critical("%s: h is NULL", __FUNCTION__);
903
return ERR_INVALID_HANDLE;
906
pkt = nsp_vtl_pkt_new_ex(0, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
908
ticalcs_info(" sending file contents:");
910
pkt->cmd = CMD_FM_OK;
912
retval = nsp_send_data(h, pkt);
914
nsp_vtl_pkt_del(pkt);
919
TIEXPORT3 int TICALL nsp_cmd_r_file_ok(CalcHandle *h)
921
NSPVirtualPacket* pkt;
926
ticalcs_critical("%s: h is NULL", __FUNCTION__);
927
return ERR_INVALID_HANDLE;
930
pkt = nsp_vtl_pkt_new();
932
ticalcs_info(" file status:");
934
retval = nsp_recv_data(h, pkt);
937
if(pkt->cmd != CMD_FM_OK)
939
if(pkt->cmd == CMD_STATUS)
941
retval = ERR_CALC_ERROR3 + err_code(pkt->data[0]);
945
retval = ERR_INVALID_PACKET;
954
nsp_vtl_pkt_del(pkt);
959
TIEXPORT3 int TICALL nsp_cmd_s_file_contents(CalcHandle *h, uint32_t size, uint8_t *data)
961
NSPVirtualPacket* pkt;
966
ticalcs_critical("%s: h is NULL", __FUNCTION__);
967
return ERR_INVALID_HANDLE;
971
ticalcs_critical("%s: data is NULL", __FUNCTION__);
972
return ERR_INVALID_PARAMETER;
975
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_FILE_MGMT);
977
ticalcs_info(" sending file contents:");
979
pkt->cmd = CMD_FM_CONTENTS;
980
memcpy(pkt->data, data, size);
981
retval = nsp_send_data(h, pkt);
983
nsp_vtl_pkt_del(pkt);
988
TIEXPORT3 int TICALL nsp_cmd_r_file_contents(CalcHandle *h, uint32_t *size, uint8_t **data)
990
NSPVirtualPacket* pkt;
995
ticalcs_critical("%s: h is NULL", __FUNCTION__);
996
return ERR_INVALID_HANDLE;
998
if (size == NULL || data == NULL)
1000
ticalcs_critical("%s: an argument is NULL", __FUNCTION__);
1001
return ERR_INVALID_PARAMETER;
1004
pkt = nsp_vtl_pkt_new();
1006
ticalcs_info(" receiving file contents:");
1009
retval = nsp_recv_data(h, pkt);
1014
*data = g_malloc0(pkt->size);
1015
memcpy(*data, pkt->data, pkt->size);
1018
nsp_vtl_pkt_del(pkt);
1023
/////////////----------------
1025
TIEXPORT3 int TICALL nsp_cmd_s_os_install(CalcHandle *h, uint32_t size)
1027
NSPVirtualPacket* pkt;
1032
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1033
return ERR_INVALID_HANDLE;
1036
pkt = nsp_vtl_pkt_new_ex(4, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_OS_INSTALL);
1038
ticalcs_info(" installing OS:");
1040
pkt->cmd = CMD_OS_INSTALL;
1041
pkt->data[0] = MSB(MSW(size));
1042
pkt->data[1] = LSB(MSW(size));
1043
pkt->data[2] = MSB(LSW(size));
1044
pkt->data[3] = LSB(LSW(size));
1045
retval = nsp_send_data(h, pkt);
1047
nsp_vtl_pkt_del(pkt);
1052
TIEXPORT3 int TICALL nsp_cmd_r_os_install(CalcHandle *h)
1054
NSPVirtualPacket* pkt;
1059
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1060
return ERR_INVALID_HANDLE;
1063
pkt = nsp_vtl_pkt_new();
1065
ticalcs_info(" receiving OS installation:");
1067
retval = nsp_recv_data(h, pkt);
1071
if(pkt->cmd != CMD_OS_OK)
1073
retval = ERR_INVALID_PACKET;
1077
nsp_vtl_pkt_del(pkt);
1082
TIEXPORT3 int TICALL nsp_cmd_s_os_contents(CalcHandle *h, uint32_t size, uint8_t *data)
1084
NSPVirtualPacket* pkt;
1089
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1090
return ERR_INVALID_HANDLE;
1094
ticalcs_critical("%s: data is NULL", __FUNCTION__);
1095
return ERR_INVALID_PARAMETER;
1098
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_OS_INSTALL);
1100
ticalcs_info(" sending OS contents:");
1102
pkt->cmd = CMD_OS_CONTENTS;
1103
memcpy(pkt->data, data, size);
1104
retval = nsp_send_data(h, pkt);
1106
nsp_vtl_pkt_del(pkt);
1111
TIEXPORT3 int TICALL nsp_cmd_r_progress(CalcHandle *h, uint8_t *value)
1113
NSPVirtualPacket* pkt;
1118
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1119
return ERR_INVALID_HANDLE;
1123
ticalcs_critical("%s: value is NULL", __FUNCTION__);
1124
return ERR_INVALID_PARAMETER;
1127
pkt = nsp_vtl_pkt_new();
1129
ticalcs_info(" OS installation status:");
1131
retval = nsp_recv_data(h, pkt);
1134
*value = pkt->data[0];
1138
case CMD_OS_PROGRESS:
1139
ticalcs_info(" %i/100", *value);
1142
nsp_vtl_pkt_del(pkt);
1143
retval = ERR_CALC_ERROR3 + err_code(*value);
1145
nsp_vtl_pkt_del(pkt);
1146
retval = ERR_INVALID_PACKET;
1153
/////////////----------------
1155
TIEXPORT3 int TICALL nsp_cmd_s_echo(CalcHandle *h, uint32_t size, uint8_t *data)
1157
NSPVirtualPacket* pkt;
1162
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1163
return ERR_INVALID_HANDLE;
1166
ticalcs_info(" sending echo:");
1168
pkt = nsp_vtl_pkt_new_ex(size, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_ECHO);
1173
memcpy(pkt->data, data, size);
1175
retval = nsp_send_data(h, pkt);
1177
nsp_vtl_pkt_del(pkt);
1182
TIEXPORT3 int TICALL nsp_cmd_r_echo(CalcHandle *h, uint32_t *size, uint8_t **data)
1184
NSPVirtualPacket* pkt;
1189
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1190
return ERR_INVALID_HANDLE;
1193
pkt = nsp_vtl_pkt_new();
1195
ticalcs_info(" receiving echo:");
1197
retval = nsp_recv_data(h, pkt);
1205
*data = g_malloc0(pkt->size);
1208
memcpy(*data, pkt->data, pkt->size);
1212
retval = ERR_MALLOC;
1216
nsp_vtl_pkt_del(pkt);
1221
/////////////----------------
1223
TIEXPORT3 int TICALL nsp_cmd_s_keypress_event(CalcHandle *h, const uint8_t keycode[3])
1225
NSPVirtualPacket * pkt1, * pkt2;
1230
ticalcs_critical("%s: h is NULL", __FUNCTION__);
1231
return ERR_INVALID_HANDLE;
1233
if (keycode == NULL)
1235
ticalcs_critical("%s: keycode is NULL", __FUNCTION__);
1236
return ERR_INVALID_PARAMETER;
1239
ticalcs_info(" sending keypress event:");
1241
retval = nsp_session_open(h, SID_KEYPRESSES);
1244
pkt1 = nsp_vtl_pkt_new_ex(3, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_KEYPRESSES);
1245
pkt2 = nsp_vtl_pkt_new_ex(25, NSP_SRC_ADDR, nsp_src_port, NSP_DEV_ADDR, NSP_PORT_KEYPRESSES);
1248
pkt1->data[2] = 0x80;
1249
retval = nsp_send_data(h, pkt1);
1254
pkt2->data[3] = 0x08;
1255
pkt2->data[4] = 0x02;
1256
pkt2->data[5] = keycode[0];
1257
pkt2->data[7] = keycode[1];
1258
pkt2->data[23] = keycode[2];
1260
retval = nsp_send_data(h, pkt2);
1263
nsp_vtl_pkt_del(pkt2);
1264
nsp_vtl_pkt_del(pkt1);
1268
retval = nsp_session_close(h);
1275
// There doesn't seem to be a need for cmd_r_keypress_event.