serial teste pulga to pulga

Committer:
ruschigo
Date:
Sun May 03 15:22:29 2020 +0000
Revision:
2:b39f5ce4d5bd
Parent:
1:10de89ea1f70
a

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ruschigo 1:10de89ea1f70 1
ruschigo 1:10de89ea1f70 2 /*
ruschigo 1:10de89ea1f70 3 @File name: proculus_display.h
ruschigo 1:10de89ea1f70 4 @Author Igor Ruschi Andrade E Lima <igor.lima@lsitec.org.br>
ruschigo 1:10de89ea1f70 5 @LSITEC
ruschigo 1:10de89ea1f70 6 */
ruschigo 1:10de89ea1f70 7
ruschigo 1:10de89ea1f70 8 //Insert Lincense Here
ruschigo 1:10de89ea1f70 9
ruschigo 1:10de89ea1f70 10 #include "platform/platform.h"
ruschigo 1:10de89ea1f70 11
ruschigo 1:10de89ea1f70 12 /******************************************************************************
ruschigo 1:10de89ea1f70 13 * Device SETUP
ruschigo 1:10de89ea1f70 14 ******************************************************************************/
ruschigo 1:10de89ea1f70 15
ruschigo 1:10de89ea1f70 16 //Time in ms to wait between the packet request and the display response
ruschigo 1:10de89ea1f70 17 #define SERIAL_DELAY 100 //100ms
ruschigo 1:10de89ea1f70 18
ruschigo 1:10de89ea1f70 19 /*expected size of rx buffer, used only by irq. If baud rate is too high
ruschigo 1:10de89ea1f70 20 *consider increase the buffer size*/
ruschigo 1:10de89ea1f70 21 #define RX_BUFFER_SIZE 255
ruschigo 1:10de89ea1f70 22
ruschigo 1:10de89ea1f70 23 //operation cycle period
ruschigo 1:10de89ea1f70 24 #define PROCULUS_OP_CYCLE_PERIOD 200
ruschigo 1:10de89ea1f70 25
ruschigo 1:10de89ea1f70 26
ruschigo 1:10de89ea1f70 27 /******************************************************************************
ruschigo 1:10de89ea1f70 28 * Proculus control register definitions
ruschigo 1:10de89ea1f70 29 ******************************************************************************/
ruschigo 1:10de89ea1f70 30 #define VERSION_INFO 0x00
ruschigo 1:10de89ea1f70 31 #define CURRENT_BACKLIGHT 0x01
ruschigo 1:10de89ea1f70 32 #define ACTIVE_BUZZER 0x02
ruschigo 1:10de89ea1f70 33 #define PIC_ID_H 0x3
ruschigo 1:10de89ea1f70 34 #define PIC_ID_L 0x4
ruschigo 1:10de89ea1f70 35 #define TP_FLAG 0x5
ruschigo 1:10de89ea1f70 36 #define TP_STATUS 0x06
ruschigo 1:10de89ea1f70 37 #define TP_COORDINATES_H1 0x7
ruschigo 1:10de89ea1f70 38 #define TP_COORDINATES_H2 0x8
ruschigo 1:10de89ea1f70 39 #define TP_COORDINATES_H3 0x9
ruschigo 1:10de89ea1f70 40 #define TP_COORDINATES_L 0xA
ruschigo 1:10de89ea1f70 41 #define TP_ENABLE 0xB
ruschigo 1:10de89ea1f70 42 #define RUN_TIME_H1 0xC
ruschigo 1:10de89ea1f70 43 #define RUN_TIME_H2 0xD
ruschigo 1:10de89ea1f70 44 #define RUN_TIME_H3 0xE
ruschigo 1:10de89ea1f70 45 #define RUN_TIME_L 0xF
ruschigo 1:10de89ea1f70 46 #define OVERWRITE_CONFIG 0x1D
ruschigo 1:10de89ea1f70 47 #define READ_BACKLIGHT 0x1E
ruschigo 1:10de89ea1f70 48 #define OVERWRITE_RTC 0x1F
ruschigo 1:10de89ea1f70 49 #define RTC_VALUE_H1 0x20
ruschigo 1:10de89ea1f70 50 #define RTC_VALUE_H2 0x21
ruschigo 1:10de89ea1f70 51 #define RTC_VALUE_H3 0x22
ruschigo 1:10de89ea1f70 52 #define RTC_VALUE_H4 0x23
ruschigo 1:10de89ea1f70 53 #define RTC_VALUE_H5 0x24
ruschigo 1:10de89ea1f70 54 #define RTC_VALUE_H6 0x25
ruschigo 1:10de89ea1f70 55 #define RTC_VALUE_L 0x26
ruschigo 1:10de89ea1f70 56 #define TIMER_0_H 0x4A
ruschigo 1:10de89ea1f70 57 #define TIMER_0_L 0x4B
ruschigo 1:10de89ea1f70 58 #define TIMER_1 0x4C
ruschigo 1:10de89ea1f70 59 #define TIMER_2 0x4D
ruschigo 1:10de89ea1f70 60 #define TIMER_3 0x4E
ruschigo 1:10de89ea1f70 61 #define ACTIVATE_SOFT_CTRL 0x4F
ruschigo 1:10de89ea1f70 62 #define AUDIO_PLAY_STOP 0x50
ruschigo 1:10de89ea1f70 63 #define AUDIO_ID_H 0x51
ruschigo 1:10de89ea1f70 64 #define AUDIO_ID_L 0x52
ruschigo 1:10de89ea1f70 65 #define OVERWRITE_AUDIO_VOLUME 0X53
ruschigo 1:10de89ea1f70 66 #define AUDIO_VOLUME 0X54
ruschigo 1:10de89ea1f70 67 #define AUDIO_STATUS 0X55
ruschigo 1:10de89ea1f70 68 #define OVERWRITE_VIDEO 0X60
ruschigo 1:10de89ea1f70 69 #define VIDEO_MODE 0X61
ruschigo 1:10de89ea1f70 70 #define VIDEO_POSITION_H1 0X62
ruschigo 1:10de89ea1f70 71 #define VIDEO_POSITION_H2 0X63
ruschigo 1:10de89ea1f70 72 #define VIDEO_POSITION_H3 0X64
ruschigo 1:10de89ea1f70 73 #define VIDEO_POSITION_L 0X65
ruschigo 1:10de89ea1f70 74 #define VIDEO_ID_H 0X66
ruschigo 1:10de89ea1f70 75 #define VIDEO_ID_L 0X67
ruschigo 1:10de89ea1f70 76 #define OVERWRITE_VIDEO_VOLUME 0X68
ruschigo 1:10de89ea1f70 77 #define VIDEO_VOLUME 0X69
ruschigo 1:10de89ea1f70 78 #define VIDEO_PLAY_PAUSE 0X6A
ruschigo 1:10de89ea1f70 79 #define VIDEO_STOP 0X6B
ruschigo 1:10de89ea1f70 80 #define VIDEO_NEXT 0X6C
ruschigo 1:10de89ea1f70 81 #define VIDEO_PREVIOUS 0X6D
ruschigo 1:10de89ea1f70 82 #define VIDEO_STATUS 0X6E
ruschigo 1:10de89ea1f70 83 #define KEYBOARD_STATUS 0XE9
ruschigo 1:10de89ea1f70 84 #define ACTIVATE_CALIBRATION 0XEA
ruschigo 1:10de89ea1f70 85 #define CLEAN_TREND_CURVE 0XEB
ruschigo 1:10de89ea1f70 86 #define ACTIVE_RESET_H 0XEE
ruschigo 1:10de89ea1f70 87 #define ACTIVE_RESET_H 0XEF
ruschigo 1:10de89ea1f70 88
ruschigo 1:10de89ea1f70 89 /******************************************************************************
ruschigo 1:10de89ea1f70 90 * Proculus Operation Modes/CMD Definitions
ruschigo 1:10de89ea1f70 91 ******************************************************************************/
ruschigo 1:10de89ea1f70 92 #define W_CTRL_REG 0x80
ruschigo 1:10de89ea1f70 93 #define R_CTRL_REG 0x81
ruschigo 1:10de89ea1f70 94 #define W_VP 0x82
ruschigo 1:10de89ea1f70 95 #define R_VP 0x83
ruschigo 1:10de89ea1f70 96 #define W_TREND_CURVE_BUFFER 0x84
ruschigo 1:10de89ea1f70 97
ruschigo 1:10de89ea1f70 98 /******************************************************************************
ruschigo 1:10de89ea1f70 99 * Proculus CHANNELs definitions
ruschigo 1:10de89ea1f70 100 ******************************************************************************/
ruschigo 1:10de89ea1f70 101 #define CHANNEL_0 0x1
ruschigo 1:10de89ea1f70 102 #define CHANNEL_1 0x2
ruschigo 1:10de89ea1f70 103 #define CHANNEL_2 0x4
ruschigo 1:10de89ea1f70 104 #define CHANNEL_3 0x8
ruschigo 1:10de89ea1f70 105 #define CHANNEL_4 0x10
ruschigo 1:10de89ea1f70 106 #define CHANNEL_5 0x20
ruschigo 1:10de89ea1f70 107 #define CHANNEL_6 0x40
ruschigo 1:10de89ea1f70 108 #define CHANNEL_7 0x80
ruschigo 1:10de89ea1f70 109
ruschigo 1:10de89ea1f70 110
ruschigo 1:10de89ea1f70 111 struct proculus_pkt {
ruschigo 1:10de89ea1f70 112 uint8_t header_h;
ruschigo 1:10de89ea1f70 113 uint8_t header_l;
ruschigo 1:10de89ea1f70 114 uint8_t count;
ruschigo 1:10de89ea1f70 115 uint8_t cmd;
ruschigo 1:10de89ea1f70 116 uint16_t address;
ruschigo 1:10de89ea1f70 117 uint8_t lenght; //only for read operations
ruschigo 1:10de89ea1f70 118 uint8_t channel;//only for write trend curv
ruschigo 1:10de89ea1f70 119 uint16_t *buffer;
ruschigo 1:10de89ea1f70 120 uint8_t word_to_come;//it is not documented
ruschigo 1:10de89ea1f70 121 };
ruschigo 1:10de89ea1f70 122 /*
ruschigo 1:10de89ea1f70 123 #ifdef DEBUG_SERIAL
ruschigo 1:10de89ea1f70 124 int raw_to_string(char *raw, char *str, int size);
ruschigo 1:10de89ea1f70 125 int debug_puts(const char *str, int size);
ruschigo 1:10de89ea1f70 126 #endif
ruschigo 1:10de89ea1f70 127
ruschigo 1:10de89ea1f70 128 int proculus_send_write_pkt(struct proculus_pkt pkt);
ruschigo 1:10de89ea1f70 129 int proculus_set_vp(uint8_t bc, uint16_t vp, uint16_t *data);
ruschigo 1:10de89ea1f70 130 int proculus_set_ctrl(uint8_t bc, uint16_t reg_addr, uint16_t *data);
ruschigo 1:10de89ea1f70 131 int proculus_get_ctrl(uint8_t bc, uint16_t vp, uint8_t lenght);
ruschigo 1:10de89ea1f70 132 int proculus_get_vp(uint8_t bc, uint16_t vp, uint8_t lenght);
ruschigo 1:10de89ea1f70 133 int serial_to_proculus_pkt(struct proculus_pkt *pkt);
ruschigo 1:10de89ea1f70 134 int get_vp_data(uint16_t vp, uint8_t lenght, uint16_t *data);
ruschigo 1:10de89ea1f70 135 int get_ctrl_data(uint16_t vp, uint8_t lenght, uint16_t *data);
ruschigo 1:10de89ea1f70 136 int start_touch_painel_calibration(void);
ruschigo 1:10de89ea1f70 137 int clear_trend_curve_buffer(uint8_t channel);
ruschigo 1:10de89ea1f70 138 int soft_control_activation(uint16_t control_code);
ruschigo 1:10de89ea1f70 139 int audio_ctrl(bool play, uint16_t id, uint16_t volume);
ruschigo 1:10de89ea1f70 140 int write_trend_buffer(uint8_t bc, const uint8_t channels, uint16_t *data);
ruschigo 1:10de89ea1f70 141
ruschigo 1:10de89ea1f70 142 */
ruschigo 1:10de89ea1f70 143
ruschigo 1:10de89ea1f70 144
ruschigo 1:10de89ea1f70 145 //define DEBUG_SERIAL for debug
ruschigo 1:10de89ea1f70 146 //#define DEBUG_SERIAL
ruschigo 1:10de89ea1f70 147
ruschigo 1:10de89ea1f70 148 /*never define both DEBUG_RAW and DEBUG_ASCII at same time*/
ruschigo 1:10de89ea1f70 149 /*define DEBUG_RAW_SERIAL for raw data debug, only send and receive data between
ruschigo 1:10de89ea1f70 150 *display and MCU*/
ruschigo 1:10de89ea1f70 151 //#define DEBUG_RAW
ruschigo 1:10de89ea1f70 152 //define DEBUG_ASCII for ascii console debug
ruschigo 1:10de89ea1f70 153 //#define DEBUG_ASCII
ruschigo 1:10de89ea1f70 154
ruschigo 1:10de89ea1f70 155 #ifdef DEBUG_SERIAL
ruschigo 1:10de89ea1f70 156 //RawSerial *debug_serial = new RawSerial(P0_25,P0_6);
ruschigo 1:10de89ea1f70 157 char temp_str[255] = "init";
ruschigo 1:10de89ea1f70 158
ruschigo 1:10de89ea1f70 159 int raw_to_string(char *raw, char *str, int size){
ruschigo 1:10de89ea1f70 160 int i = 0;
ruschigo 1:10de89ea1f70 161 char buffer[4];
ruschigo 1:10de89ea1f70 162 strcpy(str, "_");
ruschigo 1:10de89ea1f70 163 while(i < size){
ruschigo 1:10de89ea1f70 164 sprintf(buffer, "x%x", raw[i]);
ruschigo 1:10de89ea1f70 165 strcat(str,buffer);
ruschigo 1:10de89ea1f70 166 //str[i] = buffer[0];
ruschigo 1:10de89ea1f70 167 //str[i+1] = buffer[1];
ruschigo 1:10de89ea1f70 168 i++;
ruschigo 1:10de89ea1f70 169 }
ruschigo 1:10de89ea1f70 170 return 0;
ruschigo 1:10de89ea1f70 171 }
ruschigo 1:10de89ea1f70 172
ruschigo 1:10de89ea1f70 173 int debug_puts(const char *str, int size){
ruschigo 1:10de89ea1f70 174 int i = 0;
ruschigo 1:10de89ea1f70 175 while(i < size){
ruschigo 1:10de89ea1f70 176 debug_serial->putc(str[i]);
ruschigo 1:10de89ea1f70 177 i++;
ruschigo 1:10de89ea1f70 178 }
ruschigo 1:10de89ea1f70 179 return 0;
ruschigo 1:10de89ea1f70 180 }
ruschigo 1:10de89ea1f70 181 #endif //DEBUG_SERIAL
ruschigo 1:10de89ea1f70 182
ruschigo 1:10de89ea1f70 183 /*****************************************************************************
ruschigo 1:10de89ea1f70 184 * GLOBAL SCOPE
ruschigo 1:10de89ea1f70 185 *****************************************************************************/
ruschigo 1:10de89ea1f70 186 RawSerial serial1(P0_25,P0_2);
ruschigo 1:10de89ea1f70 187 char serial_rx_buffer[RX_BUFFER_SIZE] = "init";
ruschigo 1:10de89ea1f70 188 int rx_to_rcv = 0;
ruschigo 1:10de89ea1f70 189 /*
ruschigo 1:10de89ea1f70 190 *serial_puts: just send a string by serial serial1
ruschigo 1:10de89ea1f70 191 *Description: The original mbed puts function will not work, it can't send 0x00
ruschigo 1:10de89ea1f70 192 */
ruschigo 1:10de89ea1f70 193 int serial_puts(const char *str, int size){
ruschigo 1:10de89ea1f70 194 int i = 0;
ruschigo 1:10de89ea1f70 195 while(i < size){
ruschigo 1:10de89ea1f70 196 serial1.putc(str[i]);
ruschigo 1:10de89ea1f70 197 i++;
ruschigo 1:10de89ea1f70 198 }
ruschigo 1:10de89ea1f70 199 return 0;
ruschigo 1:10de89ea1f70 200 }
ruschigo 1:10de89ea1f70 201
ruschigo 1:10de89ea1f70 202 /*****************************************************************************
ruschigo 1:10de89ea1f70 203 * BASIC PROCULUS PROTOCOL ROUTINEs
ruschigo 1:10de89ea1f70 204 *****************************************************************************/
ruschigo 1:10de89ea1f70 205
ruschigo 1:10de89ea1f70 206 int pkt_is_valid(proculus_pkt pkt){
ruschigo 1:10de89ea1f70 207 if(pkt.header_h != 0x5A) return -1;
ruschigo 1:10de89ea1f70 208 if(pkt.header_l != 0xA5) return -1;
ruschigo 1:10de89ea1f70 209 if(pkt.count > 0xff) return -2;
ruschigo 1:10de89ea1f70 210 if(pkt.cmd < 0x80 && pkt.cmd > 0x84) return -3;
ruschigo 1:10de89ea1f70 211 if((pkt.cmd == 0x80 || pkt.cmd == 0x81) && pkt.address > 0xff) return -4;
ruschigo 1:10de89ea1f70 212 if((pkt.cmd == 0x82 || pkt.cmd == 0x83) && pkt.address > 0xffff) return -5;
ruschigo 1:10de89ea1f70 213 return 0;
ruschigo 1:10de89ea1f70 214 }
ruschigo 1:10de89ea1f70 215
ruschigo 1:10de89ea1f70 216
ruschigo 1:10de89ea1f70 217 int proculus_send_write_pkt(struct proculus_pkt pkt)
ruschigo 1:10de89ea1f70 218 {
ruschigo 1:10de89ea1f70 219 char msg[4 + pkt.count];//count already take in a count cmd, address and buffer size
ruschigo 1:10de89ea1f70 220 int i = 0, j = 0;
ruschigo 1:10de89ea1f70 221 int ret;
ruschigo 1:10de89ea1f70 222 //ret = pkt_is_valid(pkt);
ruschigo 1:10de89ea1f70 223 //if(ret != 0)
ruschigo 1:10de89ea1f70 224 // return ret;
ruschigo 1:10de89ea1f70 225 msg[0] = pkt.header_h;
ruschigo 1:10de89ea1f70 226 msg[1] = pkt.header_l;
ruschigo 1:10de89ea1f70 227 msg[2] = pkt.count;
ruschigo 1:10de89ea1f70 228 msg[3] = pkt.cmd;
ruschigo 1:10de89ea1f70 229 switch(pkt.cmd) {
ruschigo 1:10de89ea1f70 230 case W_CTRL_REG:
ruschigo 1:10de89ea1f70 231 msg[4] = (char)pkt.address;
ruschigo 1:10de89ea1f70 232 i = 0;
ruschigo 1:10de89ea1f70 233 while(i < pkt.count - 2) { //the address and cmd byte already gone
ruschigo 1:10de89ea1f70 234 msg[i+5] = (char)pkt.buffer[i];
ruschigo 1:10de89ea1f70 235 i++;
ruschigo 1:10de89ea1f70 236 }
ruschigo 1:10de89ea1f70 237 //rx_to_rcv = (5 + (pkt.count - 2));
ruschigo 1:10de89ea1f70 238 break;
ruschigo 1:10de89ea1f70 239 case W_VP:
ruschigo 1:10de89ea1f70 240 msg[4] = (char)((pkt.address & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 241 msg[5] = (char)(pkt.address & 0x00FF);
ruschigo 1:10de89ea1f70 242 i = 0;
ruschigo 1:10de89ea1f70 243 while(i < pkt.count - 3) { //the address and cmd byte already gone
ruschigo 1:10de89ea1f70 244 if(i>0) {
ruschigo 1:10de89ea1f70 245 msg[i+6] = (char)((pkt.buffer[j] & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 246 msg[i+7] = (char)(pkt.buffer[j] & 0x00FF);
ruschigo 1:10de89ea1f70 247 } else {
ruschigo 1:10de89ea1f70 248 msg[i+6] = (char)((pkt.buffer[i] & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 249 msg[i+7] = (char)(pkt.buffer[i] & 0x00FF);
ruschigo 1:10de89ea1f70 250 }
ruschigo 1:10de89ea1f70 251 i = i + 2;
ruschigo 1:10de89ea1f70 252 j++;
ruschigo 1:10de89ea1f70 253 }
ruschigo 1:10de89ea1f70 254 break;
ruschigo 1:10de89ea1f70 255 case W_TREND_CURVE_BUFFER:
ruschigo 1:10de89ea1f70 256 msg[4] = pkt.channel;
ruschigo 1:10de89ea1f70 257 i = 0;
ruschigo 1:10de89ea1f70 258 while(i < pkt.count - 2) { //the address and cmd byte already gone
ruschigo 1:10de89ea1f70 259 if(i>0) {
ruschigo 1:10de89ea1f70 260 msg[i+6] = (char)((pkt.buffer[j] & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 261 msg[i+7] = (char)(pkt.buffer[j] & 0x00FF);
ruschigo 1:10de89ea1f70 262 } else {
ruschigo 1:10de89ea1f70 263 msg[i+6] = (char)((pkt.buffer[i] & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 264 msg[i+7] = (char)(pkt.buffer[i] & 0x00FF);
ruschigo 1:10de89ea1f70 265 }
ruschigo 1:10de89ea1f70 266 i = i + 2;
ruschigo 1:10de89ea1f70 267 j++;
ruschigo 1:10de89ea1f70 268 }
ruschigo 1:10de89ea1f70 269 break;
ruschigo 1:10de89ea1f70 270 case R_CTRL_REG:
ruschigo 1:10de89ea1f70 271 msg[4] = (char)pkt.address;
ruschigo 1:10de89ea1f70 272 msg[5] = (char)pkt.lenght;
ruschigo 1:10de89ea1f70 273 //rx_to_rcv = 0x6 + pkt.lenght;
ruschigo 1:10de89ea1f70 274 break;
ruschigo 1:10de89ea1f70 275 case R_VP:
ruschigo 1:10de89ea1f70 276 msg[4] = (char)((pkt.address & 0xFF00) >> 8);
ruschigo 1:10de89ea1f70 277 msg[5] = (char)(pkt.address & 0x00FF);
ruschigo 1:10de89ea1f70 278 msg[6] = (char)pkt.lenght;
ruschigo 1:10de89ea1f70 279 rx_to_rcv = 0x7 + (pkt.lenght * 0x2);
ruschigo 1:10de89ea1f70 280 break;
ruschigo 1:10de89ea1f70 281 default:
ruschigo 1:10de89ea1f70 282 #ifdef DEBUG_ASCII
ruschigo 1:10de89ea1f70 283 debug_serial->puts("Proculus CMD not supported");
ruschigo 1:10de89ea1f70 284 #endif
ruschigo 1:10de89ea1f70 285 return -1;
ruschigo 1:10de89ea1f70 286 break;
ruschigo 1:10de89ea1f70 287 }
ruschigo 1:10de89ea1f70 288 serial_puts(msg, (0x3 + pkt.count));
ruschigo 1:10de89ea1f70 289 #ifdef DEBUG_ASCII
ruschigo 1:10de89ea1f70 290 char debug_msg[100];
ruschigo 1:10de89ea1f70 291 raw_to_string(msg, debug_msg, 3 + pkt.count);
ruschigo 1:10de89ea1f70 292 debug_serial->puts("send:");
ruschigo 1:10de89ea1f70 293 debug_serial->puts(debug_msg);
ruschigo 1:10de89ea1f70 294 debug_serial->puts("_|_");
ruschigo 1:10de89ea1f70 295 #endif
ruschigo 1:10de89ea1f70 296
ruschigo 1:10de89ea1f70 297 #ifdef DEBUG_RAW
ruschigo 1:10de89ea1f70 298 //wait(SERIAL_DELAY/1000);
ruschigo 1:10de89ea1f70 299 debug_puts(msg, 3 + pkt.count);
ruschigo 1:10de89ea1f70 300 #endif
ruschigo 1:10de89ea1f70 301 return 0;
ruschigo 1:10de89ea1f70 302 }
ruschigo 1:10de89ea1f70 303
ruschigo 1:10de89ea1f70 304
ruschigo 1:10de89ea1f70 305 int proculus_set_vp(uint8_t bc, uint16_t vp, uint16_t *data){
ruschigo 1:10de89ea1f70 306 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 307 pkt.header_h = 0x5A;
ruschigo 1:10de89ea1f70 308 pkt.header_l = 0xA5;
ruschigo 1:10de89ea1f70 309 pkt.cmd = W_VP;
ruschigo 1:10de89ea1f70 310 pkt.count = bc;
ruschigo 1:10de89ea1f70 311 pkt.address = vp;
ruschigo 1:10de89ea1f70 312 pkt.buffer = data;
ruschigo 1:10de89ea1f70 313 proculus_send_write_pkt(pkt);
ruschigo 1:10de89ea1f70 314 return 0;
ruschigo 1:10de89ea1f70 315 }
ruschigo 1:10de89ea1f70 316
ruschigo 1:10de89ea1f70 317 int proculus_set_ctrl(uint8_t bc, uint16_t reg_addr, uint16_t *data){
ruschigo 1:10de89ea1f70 318 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 319 pkt.header_h = 0x5A;
ruschigo 1:10de89ea1f70 320 pkt.header_l = 0xA5;
ruschigo 1:10de89ea1f70 321 pkt.cmd = W_CTRL_REG;
ruschigo 1:10de89ea1f70 322 pkt.count = bc;
ruschigo 1:10de89ea1f70 323 pkt.address = reg_addr;
ruschigo 1:10de89ea1f70 324 pkt.buffer = data;
ruschigo 1:10de89ea1f70 325 proculus_send_write_pkt(pkt);
ruschigo 1:10de89ea1f70 326 return 0;
ruschigo 1:10de89ea1f70 327 }
ruschigo 1:10de89ea1f70 328
ruschigo 1:10de89ea1f70 329 int proculus_get_ctrl(uint8_t bc, uint16_t vp, uint8_t lenght){
ruschigo 1:10de89ea1f70 330 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 331 pkt.header_h = 0x5A;
ruschigo 1:10de89ea1f70 332 pkt.header_l = 0xA5;
ruschigo 1:10de89ea1f70 333 pkt.cmd = R_CTRL_REG;
ruschigo 1:10de89ea1f70 334 pkt.count = bc;
ruschigo 1:10de89ea1f70 335 pkt.address = vp;
ruschigo 1:10de89ea1f70 336 pkt.lenght = lenght;
ruschigo 1:10de89ea1f70 337 proculus_send_write_pkt(pkt);
ruschigo 1:10de89ea1f70 338 return 0;
ruschigo 1:10de89ea1f70 339 }
ruschigo 1:10de89ea1f70 340
ruschigo 1:10de89ea1f70 341 /*proculus_get_vp
ruschigo 1:10de89ea1f70 342 *Description: send to proculus display the packet to request data in especific
ruschigo 1:10de89ea1f70 343 vp, it can read consecultives vps, stating from vp given.
ruschigo 1:10de89ea1f70 344 */
ruschigo 1:10de89ea1f70 345 int proculus_get_vp(uint8_t bc, uint16_t vp, uint8_t lenght){
ruschigo 1:10de89ea1f70 346 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 347 pkt.header_h = 0x5A;
ruschigo 1:10de89ea1f70 348 pkt.header_l = 0xA5;
ruschigo 1:10de89ea1f70 349 pkt.cmd = R_VP;
ruschigo 1:10de89ea1f70 350 pkt.count = bc;
ruschigo 1:10de89ea1f70 351 pkt.address = vp;
ruschigo 1:10de89ea1f70 352 pkt.lenght = lenght;
ruschigo 1:10de89ea1f70 353 proculus_send_write_pkt(pkt);
ruschigo 1:10de89ea1f70 354 return 0;
ruschigo 1:10de89ea1f70 355 }
ruschigo 1:10de89ea1f70 356
ruschigo 1:10de89ea1f70 357 /*
ruschigo 1:10de89ea1f70 358 *serial_to_proculus_pkt: get the data received in serial rx and translate
ruschigo 1:10de89ea1f70 359 *to proculus_pkt
ruschigo 1:10de89ea1f70 360 *@pkt is pointer to the struct to store datas
ruschigo 1:10de89ea1f70 361 */
ruschigo 1:10de89ea1f70 362 int serial_to_proculus_pkt(char *serial_data, struct proculus_pkt *pkt){
ruschigo 1:10de89ea1f70 363
ruschigo 1:10de89ea1f70 364 int i = 0, j = 0;
ruschigo 1:10de89ea1f70 365
ruschigo 1:10de89ea1f70 366 pkt->header_h = serial_data[0];
ruschigo 1:10de89ea1f70 367 pkt->header_l = serial_data[1];
ruschigo 1:10de89ea1f70 368 pkt->count = serial_data[2];
ruschigo 1:10de89ea1f70 369 pkt->cmd = serial_data[3];
ruschigo 1:10de89ea1f70 370 if(pkt->cmd == R_CTRL_REG){
ruschigo 1:10de89ea1f70 371 pkt->address = serial_data[4];
ruschigo 1:10de89ea1f70 372 pkt->lenght = serial_data[5];
ruschigo 1:10de89ea1f70 373 while(i < pkt->lenght){
ruschigo 1:10de89ea1f70 374 pkt->buffer[i] = serial_data[6 + i];
ruschigo 1:10de89ea1f70 375 i++;
ruschigo 1:10de89ea1f70 376 }
ruschigo 1:10de89ea1f70 377 }
ruschigo 1:10de89ea1f70 378 else{
ruschigo 1:10de89ea1f70 379 pkt->address = serial_data[4] << 8;
ruschigo 1:10de89ea1f70 380 pkt->address |= serial_data[5];
ruschigo 1:10de89ea1f70 381 pkt->lenght = serial_data[6];
ruschigo 1:10de89ea1f70 382 while(i < pkt->lenght){
ruschigo 1:10de89ea1f70 383 pkt->buffer[i] = serial_data[7 + j] << 8;
ruschigo 1:10de89ea1f70 384 pkt->buffer[i] |= serial_data[8 + j];
ruschigo 1:10de89ea1f70 385 i++;
ruschigo 1:10de89ea1f70 386 j += 2;
ruschigo 1:10de89ea1f70 387 }
ruschigo 1:10de89ea1f70 388 }
ruschigo 1:10de89ea1f70 389 return 0;
ruschigo 1:10de89ea1f70 390 }
ruschigo 1:10de89ea1f70 391
ruschigo 1:10de89ea1f70 392 /*
ruschigo 1:10de89ea1f70 393 *serial_to_proculus_pkt: get the data received in serial rx and translate
ruschigo 1:10de89ea1f70 394 *to proculus_pkt
ruschigo 1:10de89ea1f70 395 *@pkt is pointer to the struct to store datas
ruschigo 1:10de89ea1f70 396 */
ruschigo 1:10de89ea1f70 397 int serial_to_proculus_pkt_2(char *serial_data, struct proculus_pkt *pkt){
ruschigo 1:10de89ea1f70 398
ruschigo 1:10de89ea1f70 399 int i = 0, j = 0;
ruschigo 1:10de89ea1f70 400
ruschigo 1:10de89ea1f70 401 pkt->header_h = 0x5a;
ruschigo 1:10de89ea1f70 402 pkt->header_l = serial_data[0];
ruschigo 1:10de89ea1f70 403 pkt->count = serial_data[1];
ruschigo 1:10de89ea1f70 404 pkt->cmd = serial_data[2];
ruschigo 1:10de89ea1f70 405 if(pkt->cmd == R_CTRL_REG){
ruschigo 1:10de89ea1f70 406 pkt->address = serial_data[3];
ruschigo 1:10de89ea1f70 407 pkt->lenght = serial_data[4];
ruschigo 1:10de89ea1f70 408 while(i < pkt->lenght){
ruschigo 1:10de89ea1f70 409 pkt->buffer[i] = serial_data[5 + i];
ruschigo 1:10de89ea1f70 410 i++;
ruschigo 1:10de89ea1f70 411 }
ruschigo 1:10de89ea1f70 412 }
ruschigo 1:10de89ea1f70 413 else{
ruschigo 1:10de89ea1f70 414 pkt->address = serial_data[3] << 8;
ruschigo 1:10de89ea1f70 415 pkt->address |= serial_data[4];
ruschigo 1:10de89ea1f70 416 pkt->lenght = serial_data[5];
ruschigo 1:10de89ea1f70 417 while(i < pkt->lenght){
ruschigo 1:10de89ea1f70 418 pkt->buffer[i] = serial_data[6 + j] << 8;
ruschigo 1:10de89ea1f70 419 pkt->buffer[i] |= serial_data[7 + j];
ruschigo 1:10de89ea1f70 420 i++;
ruschigo 1:10de89ea1f70 421 j += 2;
ruschigo 1:10de89ea1f70 422 }
ruschigo 1:10de89ea1f70 423 }
ruschigo 1:10de89ea1f70 424 return 0;
ruschigo 1:10de89ea1f70 425 }
ruschigo 1:10de89ea1f70 426
ruschigo 1:10de89ea1f70 427 /*get_vp_data
ruschigo 1:10de89ea1f70 428 *Description: vp values without interrupt routine, if you are using interrupt
ruschigo 1:10de89ea1f70 429 do not use this function
ruschigo 1:10de89ea1f70 430 */
ruschigo 1:10de89ea1f70 431 int get_vp_data(uint16_t vp, uint8_t lenght, uint16_t *data){
ruschigo 1:10de89ea1f70 432 int i = 0;
ruschigo 1:10de89ea1f70 433 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 434 pkt.buffer = data; //output data
ruschigo 1:10de89ea1f70 435 proculus_get_vp(0x04, vp, lenght);
ruschigo 1:10de89ea1f70 436 wait(SERIAL_DELAY/1000);
ruschigo 1:10de89ea1f70 437 while(serial1.readable()){
ruschigo 1:10de89ea1f70 438 serial_rx_buffer[i] = serial1.getc();
ruschigo 1:10de89ea1f70 439 i++;
ruschigo 1:10de89ea1f70 440 }
ruschigo 1:10de89ea1f70 441 serial_to_proculus_pkt(serial_rx_buffer,&pkt);
ruschigo 1:10de89ea1f70 442 return 0;
ruschigo 1:10de89ea1f70 443 }
ruschigo 1:10de89ea1f70 444
ruschigo 1:10de89ea1f70 445 /*get_crtl_data
ruschigo 1:10de89ea1f70 446 *Description: vp values without interrupt routine, if you are using interrupt
ruschigo 1:10de89ea1f70 447 do not use this function
ruschigo 1:10de89ea1f70 448 */
ruschigo 1:10de89ea1f70 449 int get_ctrl_data(uint16_t vp, uint8_t lenght, uint16_t *data){
ruschigo 1:10de89ea1f70 450 int i = 0;
ruschigo 1:10de89ea1f70 451 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 452 pkt.buffer = data; //output data
ruschigo 1:10de89ea1f70 453 proculus_get_ctrl(0x03, vp, lenght);
ruschigo 1:10de89ea1f70 454 wait(SERIAL_DELAY/1000);
ruschigo 1:10de89ea1f70 455 while(serial1.readable()){
ruschigo 1:10de89ea1f70 456 serial_rx_buffer[i] = serial1.getc();
ruschigo 1:10de89ea1f70 457 i++;
ruschigo 1:10de89ea1f70 458 }
ruschigo 1:10de89ea1f70 459 serial_to_proculus_pkt(serial_rx_buffer, &pkt);
ruschigo 1:10de89ea1f70 460 return 0;
ruschigo 1:10de89ea1f70 461 }
ruschigo 1:10de89ea1f70 462
ruschigo 1:10de89ea1f70 463 /*****************************************************************************
ruschigo 1:10de89ea1f70 464 * SUPORT FUNCTIONS
ruschigo 1:10de89ea1f70 465 *****************************************************************************/
ruschigo 1:10de89ea1f70 466
ruschigo 1:10de89ea1f70 467
ruschigo 1:10de89ea1f70 468 /*start_touch_painel_calibration
ruschigo 1:10de89ea1f70 469 *Description: to start the touchscreen calibration routine
ruschigo 1:10de89ea1f70 470 */
ruschigo 1:10de89ea1f70 471 int start_touch_painel_calibration(){
ruschigo 1:10de89ea1f70 472 uint16_t data[1];
ruschigo 1:10de89ea1f70 473 data[0] = 0x5A;
ruschigo 1:10de89ea1f70 474 proculus_set_ctrl(0x3, ACTIVATE_CALIBRATION, data);
ruschigo 1:10de89ea1f70 475 return 0;
ruschigo 1:10de89ea1f70 476 }
ruschigo 1:10de89ea1f70 477
ruschigo 1:10de89ea1f70 478 /*clear_trend_curve_buffer
ruschigo 1:10de89ea1f70 479 *Description: use to clean especific trend curve buffers
ruschigo 1:10de89ea1f70 480 @channel: channel to clean the trend curve buffer, 0 < channel <= 7 clean the especific
ruschigo 1:10de89ea1f70 481 channel. channel > 7 clean all channels
ruschigo 1:10de89ea1f70 482 */
ruschigo 1:10de89ea1f70 483 int clear_trend_curve_buffer(uint8_t channel){
ruschigo 1:10de89ea1f70 484 uint16_t data[1];
ruschigo 1:10de89ea1f70 485 if(channel > 7)
ruschigo 1:10de89ea1f70 486 data[0] = 0x55;
ruschigo 1:10de89ea1f70 487 else
ruschigo 1:10de89ea1f70 488 data[0] = 0x56 + channel;
ruschigo 1:10de89ea1f70 489 proculus_set_ctrl(0x3, CLEAN_TREND_CURVE, data);
ruschigo 1:10de89ea1f70 490 return 0;
ruschigo 1:10de89ea1f70 491 }
ruschigo 1:10de89ea1f70 492
ruschigo 1:10de89ea1f70 493 /*soft_control_activation
ruschigo 1:10de89ea1f70 494 *Description: active software control to given control_code, you must to be in
ruschigo 1:10de89ea1f70 495 *same screen of software control are.
ruschigo 1:10de89ea1f70 496 @control_code: the software control code to be active0x00-0xFF
ruschigo 1:10de89ea1f70 497 */
ruschigo 1:10de89ea1f70 498 int soft_control_activation(uint16_t control_code){
ruschigo 1:10de89ea1f70 499 uint16_t data[1];
ruschigo 1:10de89ea1f70 500 data[0] = control_code;
ruschigo 1:10de89ea1f70 501 proculus_set_ctrl(0x3, ACTIVATE_SOFT_CTRL, data);
ruschigo 1:10de89ea1f70 502 return 0;
ruschigo 1:10de89ea1f70 503 }
ruschigo 1:10de89ea1f70 504
ruschigo 1:10de89ea1f70 505 /*audio_ctrl
ruschigo 1:10de89ea1f70 506 *Description, routine to full control the audio play, always update the volume
ruschigo 1:10de89ea1f70 507 @play: true will play the id audio, false will pause the audio
ruschigo 1:10de89ea1f70 508 @id: the audio id range[0x0000 - 0x0FFF)
ruschigo 1:10de89ea1f70 509 @volume: volume control, 0x40 = 100%, 0x00 = 0%
ruschigo 1:10de89ea1f70 510 */
ruschigo 1:10de89ea1f70 511 int audio_ctrl(bool play, uint16_t id, uint16_t volume){
ruschigo 1:10de89ea1f70 512 uint16_t data[4];
ruschigo 1:10de89ea1f70 513 if(play)
ruschigo 1:10de89ea1f70 514 data[0] = 0x5B;
ruschigo 1:10de89ea1f70 515 else
ruschigo 1:10de89ea1f70 516 data[0] = 0x5C;
ruschigo 1:10de89ea1f70 517 data[1] = (id & 0xFF00) >> 8;
ruschigo 1:10de89ea1f70 518 data[2] = id & 0x00FF;
ruschigo 1:10de89ea1f70 519 data[3] = 0x5A;//always update volume
ruschigo 1:10de89ea1f70 520 data[4] = volume;
ruschigo 1:10de89ea1f70 521 proculus_set_ctrl(0x7, AUDIO_PLAY_STOP, data);
ruschigo 1:10de89ea1f70 522 return 0;
ruschigo 1:10de89ea1f70 523 }
ruschigo 1:10de89ea1f70 524
ruschigo 1:10de89ea1f70 525 /*write_trend_buffer
ruschigo 1:10de89ea1f70 526 *Description: Write trend curve buffer, writes data into one or more trend curve
ruschigo 1:10de89ea1f70 527 *buffer channels.
ruschigo 1:10de89ea1f70 528 *@bc: byte counter = (CMD size = 1byte + ch size = 1byte + data size = nbytes),
ruschigo 1:10de89ea1f70 529 *to send 5bytes in data, the bc will be 0x7
ruschigo 1:10de89ea1f70 530 *@channels, you choose the channel to write combining flags CHANNEL_X,
ruschigo 1:10de89ea1f70 531 *for example, to write in channel 3 and 4 at same command, just use
ruschigo 1:10de89ea1f70 532 *channels = CHANNEL_3 | CHANNEL4
ruschigo 1:10de89ea1f70 533 *@*data: pointer to the buffer where the datas are. If you are writing in
ruschigo 1:10de89ea1f70 534 *multiple channels, the data is alternated between channels. Example:
ruschigo 1:10de89ea1f70 535 *if channels are (CHANNEL_1 | CHANNEL2), data should be like data[0] -> ch1
ruschigo 1:10de89ea1f70 536 *data[1] -> ch2, data[2] ->ch1 and so on...
ruschigo 1:10de89ea1f70 537 */
ruschigo 1:10de89ea1f70 538 int write_trend_buffer(uint8_t bc, const uint8_t channels, uint16_t *data){
ruschigo 1:10de89ea1f70 539 struct proculus_pkt pkt;
ruschigo 1:10de89ea1f70 540 pkt.header_h = 0x5A;
ruschigo 1:10de89ea1f70 541 pkt.header_l = 0xA5;
ruschigo 1:10de89ea1f70 542 pkt.cmd = W_TREND_CURVE_BUFFER;
ruschigo 1:10de89ea1f70 543 pkt.count = bc;
ruschigo 1:10de89ea1f70 544 pkt.channel = channels;
ruschigo 1:10de89ea1f70 545 pkt.buffer = data;
ruschigo 1:10de89ea1f70 546 proculus_send_write_pkt(pkt);
ruschigo 1:10de89ea1f70 547 return 0;
ruschigo 1:10de89ea1f70 548 }
ruschigo 1:10de89ea1f70 549
ruschigo 1:10de89ea1f70 550
ruschigo 1:10de89ea1f70 551 int jump_to_screen(uint16_t screen_num){
ruschigo 1:10de89ea1f70 552 uint16_t data[1];
ruschigo 1:10de89ea1f70 553 data[0] = (screen_num & 0xFF00) >> 8;
ruschigo 1:10de89ea1f70 554 data[1] = (screen_num & 0x00FF);
ruschigo 1:10de89ea1f70 555 wait(PROCULUS_OP_CYCLE_PERIOD/1000);
ruschigo 1:10de89ea1f70 556 proculus_set_ctrl(0x4, PIC_ID_H, data);
ruschigo 1:10de89ea1f70 557 return 0;
ruschigo 1:10de89ea1f70 558 }
ruschigo 1:10de89ea1f70 559
ruschigo 1:10de89ea1f70 560 int get_screen(uint16_t *data){
ruschigo 1:10de89ea1f70 561 get_ctrl_data(PIC_ID_H, 0x2, data);
ruschigo 1:10de89ea1f70 562 return 0;
ruschigo 1:10de89ea1f70 563 }
ruschigo 1:10de89ea1f70 564
ruschigo 1:10de89ea1f70 565
ruschigo 1:10de89ea1f70 566 /*specific routine to get the screen at rx irq routine*/
ruschigo 1:10de89ea1f70 567 /*int get_screen_at_irq(){
ruschigo 1:10de89ea1f70 568 int i = 0;
ruschigo 1:10de89ea1f70 569 //strcpy(serial_rx_buffer, "");
ruschigo 1:10de89ea1f70 570 //while(serial1.readable()){//clean anything in buffer before send cmd
ruschigo 1:10de89ea1f70 571 // serial_rx_buffer[i] = serial1.getc();
ruschigo 1:10de89ea1f70 572 // i++;
ruschigo 1:10de89ea1f70 573 //}
ruschigo 1:10de89ea1f70 574 //serial1.attach(0);
ruschigo 1:10de89ea1f70 575 //while(rx_to_rcv);
ruschigo 1:10de89ea1f70 576 //wait(0.500);
ruschigo 1:10de89ea1f70 577 proculus_get_ctrl(0x3, PIC_ID_H, 0x2);
ruschigo 1:10de89ea1f70 578 //serial1.attach(&serial_rx_irq);
ruschigo 1:10de89ea1f70 579 return 0;
ruschigo 1:10de89ea1f70 580 }*/
ruschigo 1:10de89ea1f70 581