aboutsummaryrefslogtreecommitdiff
path: root/casio-get.c
blob: 9beb87fdf6fdc111521615c2142da689e2c35c6b (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
#include "casio-get.h"

#define SMALL_PACKET_WAIT 100

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void print_checksum_msg(unsigned char expected, unsigned short actual)
{
	fprintf(stderr, "Checksum\t: %s (needed 0x%x, found 0x%x)\n", expected==actual? "OK" : "BAD", expected, actual);
}

int main()
{
	unsigned int read;
	unsigned char temp_buffer[1024];
	unsigned char rx_buffer[65536];

	setbuf(stdout, NULL);
	memset(rx_buffer, 0, sizeof(rx_buffer));

	long expected;
	unsigned int x,y;
	
	unsigned char colours = 3;
	unsigned char colour;
	unsigned int i;
	struct sp_port *port;
	port = port_init("/dev/ttyUSB0");

	// Wait for calculator and ACK
	wait_calc(port);
	send_calc_byte(port, ATTENTION_ACK);
	fprintf(stderr,"Sent 0x%x (ACK)\n",ATTENTION_ACK);



	/*******************************************
	 * Receive header packet
	 *******************************************/
	read = calc_read(port, rx_buffer, PKT_HEADER_MAX_SIZE);
	fprintf(stderr, "\n== HEADER ========================================\n");
	fprintf(stderr, "Size (bytes)\t: %d\n", read);
	
	unsigned char sum_expected = rx_buffer[read-1];
	unsigned char sum = calculate_checksum((const char*)rx_buffer+1, (const char*)rx_buffer+read-1);

	print_checksum_msg(sum_expected, sum);

	for(i = 0; i < read; i++)
		printf("%c", (unsigned char)rx_buffer[i]);

	colours = 3;

	switch (get_packet_type(rx_buffer))
	{
		/* Screenshot (F<->D button) */
		case PKT_SCREEN_HEADER_BW:
			colours = 1;
		case PKT_SCREEN_HEADER_COL:
			send_calc_byte(port, MISC_ACK);
			x = rx_buffer[4];
			y = rx_buffer[3];
			expected = (x*y)/8 + 2;
			
			/* multi-colour images have an extra byte per colour frame for colour identification */
			if (colours > 1)
				expected++;
			fprintf(stderr,
					"Data type\t: Screen dump\n"
					"Dimensions\t: %d x %d\n", x,y);

			fprintf(stderr, "\n== DATA ==========================================\n");
			
			for (colour = 0; colour < colours; colour++)
			{
				read = calc_read(port, rx_buffer, expected);
				fprintf(stderr,"Colour %d/%d read\t: %d bytes\n", colour+1, colours, read);
				for(i = 0; i < read; i++)
					printf("%c", rx_buffer[i]);
				
				sum_expected = rx_buffer[read-1];
				sum = calculate_checksum((const char*)rx_buffer+1+(colours > 1), (const char*)rx_buffer+read-1);
				print_checksum_msg(sum_expected, sum);
				
				send_calc_byte(port, MISC_ACK);
			
			}
			break;
		
		/* Full memory backup */
		case PKT_BACKUP_HEADER:
			/* Get firmware name (starts at byte 27 and is hival-terminated */
			i = 27;
			while((rx_buffer[i] != 0xff) && i < sizeof(temp_buffer))
			{
				temp_buffer[i-27] = rx_buffer[i];
				i++;
			}
			temp_buffer[i-27] = '\0';

			fprintf(stderr, "Memory backup coming (firmware %s)...\n", temp_buffer);
			break;
		case PKT_FUNCTION_HEADER:
			fprintf(stderr, "Function(s) coming...\nNOT IMPLEMENTED\n");
			break;
		case PKT_VALUE_HEADER:
			fprintf(stderr, "Value coming...\nNOT IMPLEMENTED\n");
			//break;
		case PKT_PROGRAM_HEADER:
			fprintf(stderr, "Program coming...\nNOT IMPLEMENTED\n");
			//break;
		default:
			fprintf(stderr, "List(s) coming...\n");
			fprintf(stderr, "Matrix/Matrices coming...\n");
			fprintf(stderr, "NOT IMPLEMENTEEEED, NOT ANNYYYY OF THIIIIIIS!!!\n");
			break;
	}




	sp_close(port);


	return 0;
}