proculus_display_pulga

Committer:
ruschigo
Date:
Mon Apr 27 17:40:57 2020 +0000
Revision:
1:2e4f9cb1c3e9
testing display with interrupt

Who changed what in which revision?

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