-
Notifications
You must be signed in to change notification settings - Fork 2
/
application-twi.c
94 lines (71 loc) · 2.61 KB
/
application-twi.c
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
#include "application.h"
#include "application-twi.h"
#include "twi_master.h"
#include <avr/pgmspace.h>
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static uint8_t twi_address = 0;
uint8_t application_function_twiaddress(uint8_t nargs, uint8_t args[application_num_args][application_length_args], uint16_t size, uint8_t *dst)
{
static const __flash char fmt[] = "> TWI slave address set to 0x%02x\n";
twi_address = (uint8_t)strtoul((const char *)args[1], 0, 16);
snprintf_P((char *)dst, (size_t)size, fmt, twi_address);
return(1);
}
uint8_t application_function_twiread(uint8_t nargs, uint8_t args[application_num_args][application_length_args], uint16_t size, uint8_t *dst)
{
static const __flash char header[] = "> TWI read %d bytes from %02x:";
static const __flash char entry[] = " %02x";
static const __flash char footer[] = "\n";
static const __flash char error[] = "> TWI read error, read max %d bytes: %d\n";
uint8_t src_current, rv, offset, amount;
uint8_t bytes[8];
amount = (uint8_t)strtoul((const char *)args[1], 0, 0);
if(amount > sizeof(bytes))
{
snprintf_P((char *)dst, (size_t)size, error, sizeof(bytes), amount);
return(1);
}
if((rv = twi_master_receive(twi_address, sizeof(bytes), bytes)) != tme_ok)
twi_master_error(dst, size, rv);
else
{
offset = snprintf_P((char *)dst, (size_t)size, header, amount, twi_address);
dst += offset;
size -= offset;
for(src_current = 0; (src_current < amount) && (size > 0); src_current++)
{
offset = snprintf_P((char *)dst, (size_t)size, entry, bytes[src_current]);
dst += offset;
size -= offset;
}
strlcpy_P((char *)dst, footer, (size_t)size);
}
return(1);
}
uint8_t application_function_twireset(uint8_t nargs, uint8_t args[application_num_args][application_length_args], uint16_t size, uint8_t *dst)
{
static const __flash char ok[] = "> TWI reset ok\n";
twi_master_recover();
strlcpy_P((char *)dst, ok, size);
return(1);
}
uint8_t application_function_twiwrite(uint8_t nargs, uint8_t args[application_num_args][application_length_args], uint16_t size, uint8_t *dst)
{
static const __flash char fmt[] = "> TWI written %d bytes to %02x\n";
uint8_t src_current, dst_current, rv;
uint8_t bytes[8];
for(src_current = 1, dst_current = 0;
(src_current < nargs) && (dst_current < sizeof(bytes));
src_current++, dst_current++)
{
bytes[dst_current] = (uint8_t)strtoul((const char *)args[src_current], 0, 16);
}
if((rv = twi_master_send(twi_address, dst_current, bytes)) != tme_ok)
twi_master_error(dst, size, rv);
else
snprintf_P((char *)dst, (size_t)size, fmt, dst_current, twi_address);
return(1);
}